"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.LANGUAGES = void 0; function _has() { const data = _interopRequireDefault(require("lodash/has")); _has = function () { return data; }; return data; } function _pick() { const data = _interopRequireDefault(require("lodash/pick")); _pick = function () { return data; }; return data; } function _intersection() { const data = _interopRequireDefault(require("lodash/intersection")); _intersection = function () { return data; }; return data; } function _chalk() { const data = _interopRequireDefault(require("chalk")); _chalk = function () { return data; }; return data; } function _xdl() { const data = require("@expo/xdl"); _xdl = function () { return data; }; return data; } function _BaseUploader() { const data = _interopRequireDefault(require("./BaseUploader")); _BaseUploader = function () { return data; }; return data; } function _log() { const data = _interopRequireDefault(require("../../log")); _log = function () { return data; }; return data; } function _prompt() { const data = _interopRequireDefault(require("../../prompt")); _prompt = function () { return data; }; return data; } function _utils() { const data = require("./utils"); _utils = function () { return data; }; return data; } function _CommandError() { const data = _interopRequireDefault(require("../../CommandError")); _CommandError = function () { return data; }; return data; } function _validators() { const data = require("../../validators"); _validators = function () { return data; }; return data; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const PLATFORM = 'ios'; const APPLE_CREDS_QUESTIONS = [{ type: 'input', name: 'appleId', message: `What's your Apple ID?`, validate: _validators().nonEmptyInput }, { type: 'password', name: 'appleIdPassword', message: 'Password?', validate: _validators().nonEmptyInput }]; const APP_NAME_TOO_LONG_MSG = `An app name can't be longer than 30 characters.`; const APP_NAME_QUESTION = { type: 'input', name: 'appName', message: 'How would you like to name your app?', validate: appName => { if (!appName) { return 'Empty app name is not valid.'; } else if (appName.length > 30) { return APP_NAME_TOO_LONG_MSG; } else { return true; } } }; const LANGUAGES = ['Brazilian Portuguese', 'Danish', 'Dutch', 'English', 'English_Australian', 'English_CA', 'English_UK', 'Finnish', 'French', 'French_CA', 'German', 'Greek', 'Indonesian', 'Italian', 'Japanese', 'Korean', 'Malay', 'Norwegian', 'Portuguese', 'Russian', 'Simplified Chinese', 'Spanish', 'Spanish_MX', 'Swedish', 'Thai', 'Traditional Chinese', 'Turkish', 'Vietnamese']; exports.LANGUAGES = LANGUAGES; class IOSUploader extends _BaseUploader().default { static validateOptions(options) { if (!LANGUAGES.includes(options.language)) { throw new Error(`You must specify a supported language. Run expo upload:ios --help to see the list of supported languages.`); } if (options.publicUrl && !_xdl().UrlUtils.isHttps(options.publicUrl)) { throw new (_CommandError().default)('INVALID_PUBLIC_URL', '--public-url must be a valid HTTPS URL.'); } } constructor(projectDir, options) { super(PLATFORM, projectDir, options); } _ensureExperienceIsValid(exp) { if (!(0, _has().default)(exp, 'ios.bundleIdentifier')) { throw new Error(`You must specify an iOS bundle identifier in app.json.`); } } async _getPlatformSpecificOptions() { const appleIdCrentials = await this._getAppleIdCredentials(); const appleTeamId = await this._getAppleTeamId(); const appName = await this._getAppName(); const otherOptions = (0, _pick().default)(this.options, ['language', 'sku']); return { ...appleIdCrentials, appName, ...otherOptions, appleTeamId }; } async _getAppleTeamId() { const credentialMetadata = await _xdl().Credentials.getCredentialMetadataAsync(this.projectDir, 'ios'); const { teamId } = await _xdl().Credentials.getCredentialsForPlatform(credentialMetadata); return teamId; } async _getAppleIdCredentials() { const appleCredsKeys = ['appleId', 'appleIdPassword']; const result = (0, _pick().default)(this.options, appleCredsKeys); if (process.env.EXPO_APPLE_ID) { result.appleId = process.env.EXPO_APPLE_ID; } if (process.env.EXPO_APPLE_ID_PASSWORD) { result.appleIdPassword = process.env.EXPO_APPLE_ID_PASSWORD; } const credsPresent = (0, _intersection().default)(Object.keys(result), appleCredsKeys); if (credsPresent.length !== appleCredsKeys.length) { const questions = APPLE_CREDS_QUESTIONS.filter(({ name }) => !credsPresent.includes(name)); const answers = await (0, _prompt().default)(questions); return { ...result, ...answers }; } else { return result; } } async _getAppName() { const appName = this.options.appName || this._exp.name; if (!appName || appName.length > 30) { if (appName && appName.length > 30) { _log().default.error(APP_NAME_TOO_LONG_MSG); } return await this._askForAppName(); } else { return appName; } } async _askForAppName() { const { appName } = await (0, _prompt().default)(APP_NAME_QUESTION); return appName; } async _uploadToTheStore(platformData, buildPath) { const { fastlane } = this; const { appleId, appleIdPassword, appName, language, appleTeamId } = platformData; const { bundleIdentifier } = this._exp.ios; const appleCreds = { appleId, appleIdPassword, appleTeamId, itcTeamId: this.options.itcTeamId }; (0, _log().default)('Ensuring the app exists on App Store Connect, this may take a while...'); await (0, _utils().runFastlaneAsync)(fastlane.appProduce, [bundleIdentifier, appName, appleId, language], appleCreds); (0, _log().default)('Uploading the app to Testflight, hold tight...'); await (0, _utils().runFastlaneAsync)(fastlane.pilotUpload, [buildPath, appleId], appleCreds); (0, _log().default)(`All done! You may want to go to App Store Connect (${_chalk().default.underline('https://appstoreconnect.apple.com')}) and share your build with your testers.`); } } exports.default = IOSUploader; //# sourceMappingURL=../../__sourcemaps__/commands/upload/IOSUploader.js.map