This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.

233 lines
6.2 KiB
JavaScript
Raw Normal View History

2021-04-02 02:24:13 +03:00
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.promptCocoaPodsInstallationQuestion = promptCocoaPodsInstallationQuestion;
exports.runSudo = runSudo;
exports.installCocoaPods = installCocoaPods;
exports.default = void 0;
function _fs() {
const data = _interopRequireDefault(require("fs"));
_fs = function () {
return data;
};
return data;
}
function _execa() {
const data = _interopRequireDefault(require("execa"));
_execa = function () {
return data;
};
return data;
}
function _chalk() {
const data = _interopRequireDefault(require("chalk"));
_chalk = function () {
return data;
};
return data;
}
function _inquirer() {
const data = _interopRequireDefault(require("inquirer"));
_inquirer = function () {
return data;
};
return data;
}
function _cliTools() {
const data = require("@react-native-community/cli-tools");
_cliTools = function () {
return data;
};
return data;
}
var _loader = require("./loader");
function _sudoPrompt() {
const data = _interopRequireDefault(require("sudo-prompt"));
_sudoPrompt = function () {
return data;
};
return data;
}
var _brewInstall = require("./brewInstall");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// @ts-ignore untyped
// @ts-ignore untyped
async function runPodInstall(loader, projectName, shouldHandleRepoUpdate = true) {
try {
loader.start(`Installing CocoaPods dependencies ${_chalk().default.dim('(this may take a few minutes)')}`);
await (0, _execa().default)('pod', ['install']);
} catch (error) {
// "pod" command outputs errors to stdout (at least some of them)
const stderr = error.stderr || error.stdout;
/**
* If CocoaPods failed due to repo being out of date, it will
* include the update command in the error message.
*
* `shouldHandleRepoUpdate` will be set to `false` to
* prevent infinite loop (unlikely scenario)
*/
if (stderr.includes('pod repo update') && shouldHandleRepoUpdate) {
await runPodUpdate(loader);
await runPodInstall(loader, projectName, false);
} else {
loader.fail();
throw new Error(`Failed to install CocoaPods dependencies for iOS project, which is required by this template.\nPlease try again manually: "cd ./${projectName}/ios && pod install".\nCocoaPods documentation: ${_chalk().default.dim.underline('https://cocoapods.org/')}`);
}
}
}
async function runPodUpdate(loader) {
try {
loader.start(`Updating CocoaPods repositories ${_chalk().default.dim('(this may take a few minutes)')}`);
await (0, _execa().default)('pod', ['repo', 'update']);
} catch (error) {
// "pod" command outputs errors to stdout (at least some of them)
_cliTools().logger.log(error.stderr || error.stdout);
loader.fail();
throw new Error(`Failed to update CocoaPods repositories for iOS project.\nPlease try again manually: "pod repo update".\nCocoaPods documentation: ${_chalk().default.dim.underline('https://cocoapods.org/')}`);
}
}
function runSudo(command) {
return new Promise((resolve, reject) => {
_sudoPrompt().default.exec(command, {
name: 'React Native CLI'
}, error => {
if (error) {
reject(error);
}
resolve();
});
});
}
async function promptCocoaPodsInstallationQuestion() {
const promptQuestion = `CocoaPods ${_chalk().default.dim.underline('(https://cocoapods.org/)')} ${_chalk().default.reset.bold('is not installed. CocoaPods is necessary for the iOS project to run correctly. Do you want to install it?')}`;
const installWithGem = 'Yes, with gem (may require sudo)';
const installWithHomebrew = 'Yes, with Homebrew';
const {
shouldInstallCocoaPods
} = await _inquirer().default.prompt([{
type: 'list',
name: 'shouldInstallCocoaPods',
message: promptQuestion,
choices: [installWithGem, installWithHomebrew]
}]);
const shouldInstallWithGem = shouldInstallCocoaPods === installWithGem;
return {
installMethod: shouldInstallWithGem ? 'gem' : 'homebrew',
// This is used for removing the message in `doctor` after it's answered
promptQuestion: `? ${promptQuestion} ${shouldInstallWithGem ? installWithGem : installWithHomebrew}`
};
}
async function installCocoaPodsWithGem() {
const options = ['install', 'cocoapods', '--no-document'];
try {
// First attempt to install `cocoapods`
await (0, _execa().default)('gem', options);
} catch (_error) {
// If that doesn't work then try with sudo
await runSudo(`gem ${options.join(' ')}`);
}
}
async function installCocoaPods(loader) {
loader.stop();
const {
installMethod
} = await promptCocoaPodsInstallationQuestion();
if (installMethod === 'gem') {
loader.start('Installing CocoaPods');
try {
await installCocoaPodsWithGem();
return loader.succeed();
} catch (error) {
loader.fail();
_cliTools().logger.error(error.stderr);
throw new Error(`An error occured while trying to install CocoaPods, which is required by this template.\nPlease try again manually: sudo gem install cocoapods.\nCocoaPods documentation: ${_chalk().default.dim.underline('https://cocoapods.org/')}`);
}
}
if (installMethod === 'homebrew') {
return await (0, _brewInstall.brewInstall)({
pkg: 'cocoapods',
label: 'Installing CocoaPods',
loader
});
}
}
async function installPods({
projectName,
loader
}) {
loader = loader || new _loader.NoopLoader();
try {
if (!_fs().default.existsSync('ios')) {
return;
}
process.chdir('ios');
const hasPods = _fs().default.existsSync('Podfile');
if (!hasPods) {
return;
}
try {
// Check if "pod" is available and usable. It happens that there are
// multiple versions of "pod" command and even though it's there, it exits
// with a failure
await (0, _execa().default)('pod', ['--version']);
} catch (e) {
loader.info();
await installCocoaPods(loader);
}
await runPodInstall(loader, projectName);
} catch (error) {
throw error;
} finally {
process.chdir('..');
}
}
var _default = installPods;
exports.default = _default;
//# sourceMappingURL=installPods.js.map