"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createIPABuilder; function _lodash() { const data = _interopRequireDefault(require("lodash")); _lodash = function () { return data; }; return data; } function _os() { const data = _interopRequireDefault(require("os")); _os = function () { return data; }; return data; } function _path() { const data = _interopRequireDefault(require("path")); _path = function () { return data; }; return data; } function _fsExtra() { const data = _interopRequireDefault(require("fs-extra")); _fsExtra = function () { return data; }; return data; } function _plist() { const data = _interopRequireDefault(require("plist")); _plist = function () { return data; }; return data; } function _Logger() { const data = _interopRequireDefault(require("./Logger")); _Logger = function () { return data; }; return data; } function _ExponentTools() { const data = require("./ExponentTools"); _ExponentTools = function () { return data; }; return data; } function IosCodeSigning() { const data = _interopRequireWildcard(require("./IosCodeSigning")); IosCodeSigning = function () { return data; }; return data; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const logger = _Logger().default.withFields({ buildPhase: 'building and signing IPA' }); function createIPABuilder(buildParams) { const { appUUID, keychainPath, bundleIdentifier, teamID, manifest, workspacePath } = buildParams; const appDir = _path().default.join('/private/tmp/turtle', appUUID); const buildDir = _path().default.join(appDir, 'build'); const provisionDir = _path().default.join(appDir, 'provisioning'); const outputPath = _path().default.join(appDir, 'archive.xcarchive'); const uploadPath = _path().default.join(buildDir, 'archive.ipa'); async function build() { const { provisioningProfilePath, clientBuild } = buildParams; await copyProvisioningProfileToHomedir(provisioningProfilePath, appUUID); logger.info('provisioning profile copied to home directory'); try { const plistData = await readCMSMessage(provisioningProfilePath); logger.info('done retrieving provisioning profile data'); logger.info('checking if teamID is present in keychain and that certificate is valid...'); const codeSignIdentity = await IosCodeSigning().ensureCertificateValid(buildParams); logger.info('ensured certificate is valid'); logger.info('validating provisioning profile...'); IosCodeSigning().validateProvisioningProfile(plistData, { distCertFingerprint: codeSignIdentity, teamID, bundleIdentifier }); logger.info('provisioning profile is valid'); logger.info('writing export-options.plist file...'); const exportMethod = IosCodeSigning().resolveExportMethod(plistData); const exportOptionsPlistPath = _path().default.join(provisionDir, 'export-options.plist'); const exportOptionsData = { bundleIdentifier, provisioningProfileUUID: plistData.UUID, exportMethod, teamID }; await IosCodeSigning().writeExportOptionsPlistFile(exportOptionsPlistPath, exportOptionsData); logger.info('created export-options.plist file'); logger.info('generating IPA...'); const unsignedIpaPath = _path().default.join(buildDir, `${appUUID}-unsigned.ipa`); const ipaBuilderArgs = { ipaPath: unsignedIpaPath, workspacePath, archivePath: outputPath, codeSignIdentity, exportOptionsPlistPath, plistData, keychainPath, exportMethod }; await IosCodeSigning().buildIPA(ipaBuilderArgs, buildParams, clientBuild); logger.info('generated IPA'); logger.info('creating entitlements file...'); const generatedEntitlementsPath = _path().default.join(appDir, 'generatedEntitlements.entitlements'); await IosCodeSigning().createEntitlementsFile({ generatedEntitlementsPath, plistData, archivePath: outputPath, manifest }); logger.info('created entitlements file'); logger.info('resigning IPA...'); await IosCodeSigning().resignIPA({ codeSignIdentity, entitlementsPath: generatedEntitlementsPath, provisioningProfilePath, sourceIpaPath: unsignedIpaPath, destIpaPath: uploadPath, keychainPath }, buildParams); logger.info('resigned IPA'); } finally { await removeProvisioningProfileFromHomedir(appUUID); logger.info('removed provisioning profile from the home directory'); } } async function cleanup() { try { await _fsExtra().default.remove(getProvisioningProfilePath(appUUID)); } catch (err) { logger.error('failed to perform cleanup, error:', err); } } async function copyProvisioningProfileToHomedir(provisioningProfilePath, appUUID) { await _fsExtra().default.mkdirp(getProvisioningProfileDirPath()); const newProvisioningProfilePath = getProvisioningProfilePath(appUUID); await _fsExtra().default.copy(provisioningProfilePath, newProvisioningProfilePath); } async function removeProvisioningProfileFromHomedir(appUUID) { const provisioningProfilePath = getProvisioningProfilePath(appUUID); await _fsExtra().default.remove(provisioningProfilePath); } async function readCMSMessage(provisioningProfilePath) { const { output } = await (0, _ExponentTools().spawnAsyncThrowError)('security', ['cms', '-D', '-i', provisioningProfilePath], { stdio: 'pipe' }); const plistRaw = output.join(''); const plistData = _lodash().default.attempt(_plist().default.parse, plistRaw); if (_lodash().default.isError(plistData)) { throw new Error(`Error when parsing plist: ${plistData.message}`); } return plistData; } const getProvisioningProfileDirPath = () => _path().default.join(_os().default.homedir(), 'Library/MobileDevice/Provisioning Profiles'); const getProvisioningProfilePath = appUUID => _path().default.join(getProvisioningProfileDirPath(), `${appUUID}.mobileprovision`); return { build, cleanup }; } //# sourceMappingURL=../__sourcemaps__/detach/IosIPABuilder.js.map