"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildiOS = void 0;
const fs_extra_1 = require("fs-extra");
const path_1 = require("path");
const rimraf_1 = require("rimraf");
const common_1 = require("../common");
const definitions_1 = require("../definitions");
const log_1 = require("../log");
const spm_1 = require("../util/spm");
const subprocess_1 = require("../util/subprocess");
async function buildiOS(config, buildOptions) {
var _a, _b, _c, _d;
const theScheme = (_a = buildOptions.scheme) !== null && _a !== void 0 ? _a : 'App';
const packageManager = await (0, spm_1.checkPackageManager)(config);
let typeOfBuild;
let projectName;
if (packageManager == 'Cocoapods') {
typeOfBuild = '-workspace';
projectName = (0, path_1.basename)(await config.ios.nativeXcodeWorkspaceDirAbs);
}
else {
typeOfBuild = '-project';
projectName = (0, path_1.basename)(await config.ios.nativeXcodeProjDirAbs);
}
if (buildOptions.xcodeSigningType == 'manual' &&
(!buildOptions.xcodeSigningCertificate || !buildOptions.xcodeProvisioningProfile)) {
throw 'Manually signed Xcode builds require a signing certificate and provisioning profile.';
}
const buildArgs = [
typeOfBuild,
projectName,
'-scheme',
`${theScheme}`,
'-destination',
`generic/platform=iOS`,
'-archivePath',
`${theScheme}.xcarchive`,
'archive',
'-configuration',
buildOptions.configuration,
];
if (buildOptions.xcodeTeamId) {
buildArgs.push(`DEVELOPMENT_TEAM=${buildOptions.xcodeTeamId}`);
}
if (buildOptions.xcodeSigningType == 'manual') {
buildArgs.push(`PROVISIONING_PROFILE_SPECIFIER=${buildOptions.xcodeProvisioningProfile}`);
}
await (0, common_1.runTask)('Building xArchive', async () => (0, subprocess_1.runCommand)('xcodebuild', buildArgs, {
cwd: config.ios.nativeProjectDirAbs,
}));
const manualSigningContents = `provisioningProfiles
${config.app.appId}
${(_b = buildOptions.xcodeProvisioningProfile) !== null && _b !== void 0 ? _b : ''}
signingCertificate
${(_c = buildOptions.xcodeSigningCertificate) !== null && _c !== void 0 ? _c : ''}`;
const archivePlistContents = `
method
${(_d = buildOptions.xcodeExportMethod) !== null && _d !== void 0 ? _d : definitions_1.XcodeExportMethod.AppStoreConnect}
signingStyle
${buildOptions.xcodeSigningType}
${buildOptions.xcodeSigningType == 'manual' ? manualSigningContents : ''}
`;
const archivePlistPath = (0, path_1.join)(`${config.ios.nativeProjectDirAbs}`, 'archive.plist');
(0, fs_extra_1.writeFileSync)(archivePlistPath, archivePlistContents);
const archiveArgs = [
'archive',
'-archivePath',
`${theScheme}.xcarchive`,
'-exportArchive',
'-exportOptionsPlist',
'archive.plist',
'-exportPath',
'output',
'-configuration',
buildOptions.configuration,
];
if (buildOptions.xcodeSigningType == 'automatic') {
archiveArgs.push('-allowProvisioningUpdates');
}
await (0, common_1.runTask)('Building IPA', async () => (0, subprocess_1.runCommand)('xcodebuild', archiveArgs, {
cwd: config.ios.nativeProjectDirAbs,
}));
await (0, common_1.runTask)('Cleaning up', async () => {
(0, fs_extra_1.unlinkSync)(archivePlistPath);
rimraf_1.rimraf.sync((0, path_1.join)(config.ios.nativeProjectDirAbs, `${theScheme}.xcarchive`));
});
(0, log_1.logSuccess)(`Successfully generated an IPA at: ${(0, path_1.join)(config.ios.nativeProjectDirAbs, 'output')}`);
}
exports.buildiOS = buildiOS;