"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.action = action;
exports.default = void 0;
function _fs() {
const data = _interopRequireDefault(require("fs"));
_fs = function () {
return data;
};
return data;
}
function _path() {
const data = _interopRequireDefault(require("path"));
_path = function () {
return data;
};
return data;
}
function _chalk() {
const data = _interopRequireDefault(require("chalk"));
_chalk = function () {
return data;
};
return data;
}
function _simpleSpinner() {
const data = _interopRequireDefault(require("@expo/simple-spinner"));
_simpleSpinner = function () {
return data;
};
return data;
}
function _xdl() {
const data = require("@expo/xdl");
_xdl = function () {
return data;
};
return data;
}
function _log() {
const data = _interopRequireDefault(require("../log"));
_log = function () {
return data;
};
return data;
}
function _sendTo() {
const data = _interopRequireDefault(require("../sendTo"));
_sendTo = function () {
return data;
};
return data;
}
function _exit() {
const data = require("../exit");
_exit = function () {
return data;
};
return data;
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
async function action(projectDir, options = {}) {
let channelRe = new RegExp(/^[a-z\d][a-z\d._-]*$/);
if (options.releaseChannel && !channelRe.test(options.releaseChannel)) {
_log().default.error('Release channel name can only contain lowercase letters, numbers and special characters . _ and -');
process.exit(1);
}
const hasOptimized = _fs().default.existsSync(_path().default.join(projectDir, '/.expo-shared/assets.json'));
const nonInteractive = options.parent && options.parent.nonInteractive;
if (!hasOptimized && !nonInteractive) {
_log().default.warn('Warning: Your project may contain unoptimized image assets. Smaller image sizes can improve app performance.');
_log().default.warn(`To compress the images in your project, abort publishing and run ${_chalk().default.bold('expo optimize')}.`);
}
const status = await _xdl().Project.currentStatus(projectDir);
let startedOurOwn = false;
if (status !== 'running') {
(0, _log().default)('Unable to find an existing Expo CLI instance for this directory, starting a new one...');
(0, _exit().installExitHooks)(projectDir);
const startOpts = {
reset: options.clear,
nonPersistent: true
};
if (options.maxWorkers) {
startOpts.maxWorkers = options.maxWorkers;
}
await _xdl().Project.startAsync(projectDir, startOpts, !options.quiet);
startedOurOwn = true;
}
let recipient = await _sendTo().default.getRecipient(options.sendTo);
(0, _log().default)(`Publishing to channel '${options.releaseChannel}'...`);
const {
args: {
sdkVersion
}
} = await _xdl().Exp.getPublishInfoAsync(projectDir);
const buildStatus = await _xdl().Project.buildAsync(projectDir, {
mode: 'status',
platform: 'all',
current: true,
releaseChannel: options.releaseChannel,
sdkVersion
});
const {
exp
} = await _xdl().ProjectUtils.readConfigJsonAsync(projectDir);
if (buildStatus.userHasBuiltExperienceBefore && !buildStatus.userHasBuiltAppBefore && !options.duringBuild && !exp.isDetached) {
_log().default.warn('We noticed that you have not built a standalone app with this SDK version and release channel before. ' + 'Remember that OTA updates will only work for builds with matching SDK versions and release channels. ' + 'Read more here: https://docs.expo.io/versions/latest/workflow/publishing/#limitations');
}
if (options.quiet) {
_simpleSpinner().default.start();
}
let result;
try {
result = await _xdl().Project.publishAsync(projectDir, {
releaseChannel: options.releaseChannel
});
let url = result.url;
if (options.quiet) {
_simpleSpinner().default.stop();
}
(0, _log().default)('Published');
(0, _log().default)('Your URL is\n\n' + _chalk().default.underline(url) + '\n');
_log().default.raw(url);
if (recipient) {
await _sendTo().default.sendUrlAsync(url, recipient);
}
} finally {
if (startedOurOwn) {
await _xdl().Project.stopAsync(projectDir);
}
}
return result;
}
var _default = program => {
program.command('publish [project-dir]').alias('p').description('Publishes your project to exp.host').option('-q, --quiet', 'Suppress verbose output from the React Native packager.').option('-s, --send-to [dest]', 'A phone number or email address to send a link to').option('-c, --clear', 'Clear the React Native packager cache') // TODO(anp) set a default for this dynamically based on whether we're inside a container?
.option('--max-workers [num]', 'Maximum number of tasks to allow Metro to spawn.').option('--release-channel <release channel>', "The release channel to publish to. Default is 'default'.", 'default').asyncActionProjectDir(action, true);
};
exports.default = _default;
//# sourceMappingURL=../__sourcemaps__/commands/publish.js.map