ignite-cli
Version:
Infinite Red's hottest boilerplate for React Native.
819 lines • 49.3 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
var os_1 = require("os");
var react_native_1 = require("../tools/react-native");
var packager_1 = require("../tools/packager");
var pretty_1 = require("../tools/pretty");
var flag_1 = require("../tools/flag");
var cache_1 = require("../tools/cache");
var expoGoCompatibility_1 = require("../tools/expoGoCompatibility");
var demo_1 = require("../tools/demo");
module.exports = {
run: function (toolbox) { return __awaiter(void 0, void 0, void 0, function () {
var print, filesystem, system, meta, parameters, strings, prompt, kebabCase, exists, path, removeAsync, copy, read, write, homedir, info, colors, warning, gray, cyan, yellow, white, red, underline, options, yname, noTimeout, useDefault, CMD_INDENT, p2, command, MAX_APP_CREATION_TIME, timeoutExit, debug, log, validateProjectName, projectName, projectNameKebab, bname, defaultBundleIdentifier, bundleIdentifier, bundleIdentifierResponse, validateBundleIdentifier, defaultTargetPath, targetPath, targetPathResponse, handleHomePrefix, defaultOverwrite, overwrite, overwriteResponse, alreadyExists, defaultWorkflow, workflow, useExpoResponse, useExpo, expoWorkflowTypeResponse, needsPrebuild, defaultGit, git, gitResponse, defaultRemoveDemo, removeDemo, removeDemoResponse, availablePackagers, defaultPackagerName, packagerName, validatePackagerName, initial_1, NOT_FOUND, packagerNameResponse, packagerOptions, isWindows, ignitePath, boilerplatePath, boilerplate, defaultInstallDeps, installDeps, installDepsResponse, newArch, expoVersion, experimentalFlags, defaultNewArch, experimentalNewArch, newArchResponse, perfStart, timeout, terminalWidth, logo, pkg, igniteVersion, msg, boilerplateIgnorePath, targetIgnorePath, gitIgnoreContents, cwd, packageJsonRaw, expoDistTagOutput, tagVersion, packageJson, npmrcPath, npmrcContents, boilerplatePackageJsonHash, cachePath, cacheExists, defaultUseCache, useCache, shouldUseCache, msg, renameSpinnerMsg, boilerplateBundleIdentifier, shouldFreshInstallDeps, unboxingMessage, msg, appJsonRaw, appJson, prebuildMessage, removeDemoPart, IGNITE, CMD, e_1, warnAboutEOL, templates, e_2, perfDuration, cliCommand, prettyCliCommand, isMac, e_3, IGNITE, doctorResults, e_4;
var _a, _b, _c, _d;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
print = toolbox.print, filesystem = toolbox.filesystem, system = toolbox.system, meta = toolbox.meta, parameters = toolbox.parameters, strings = toolbox.strings, prompt = toolbox.prompt;
kebabCase = strings.kebabCase;
exists = filesystem.exists, path = filesystem.path, removeAsync = filesystem.removeAsync, copy = filesystem.copy, read = filesystem.read, write = filesystem.write, homedir = filesystem.homedir;
info = print.info, colors = print.colors, warning = print.warning;
gray = colors.gray, cyan = colors.cyan, yellow = colors.yellow, white = colors.white, red = colors.red, underline = colors.underline;
options = parameters.options;
yname = (0, flag_1.boolFlag)(options.y) || (0, flag_1.boolFlag)(options.yes);
noTimeout = (_a = options.noTimeout) !== null && _a !== void 0 ? _a : false;
useDefault = function (option) { return yname && option === undefined; };
CMD_INDENT = " ";
p2 = function (m) {
if (m === void 0) { m = ""; }
return (0, pretty_1.p)(" ".concat(m));
};
command = function (cmd) { return p2(white(CMD_INDENT + cmd)); };
MAX_APP_CREATION_TIME = 10 * 60 * 1000;
timeoutExit = function () {
(0, pretty_1.p)();
(0, pretty_1.p)(yellow("Error: App creation timed out."));
if (!debug)
(0, pretty_1.p)(gray("Run again with --debug to see what's going on."));
process.exit(1);
};
debug = (0, flag_1.boolFlag)(options.debug);
log = function (m) {
debug && info(" ".concat(m));
return m;
};
// log raw parameters for debugging
log("ignite command: ".concat(parameters.argv.join(" ")));
// #endregion
// #region Project Name
// retrieve project name from toolbox
(0, pretty_1.p)();
validateProjectName = require("../tools/validations").validateProjectName;
return [4 /*yield*/, validateProjectName(toolbox)];
case 1:
projectName = _e.sent();
projectNameKebab = kebabCase(projectName);
bname = options.b || options.boilerplate;
if (bname) {
(0, pretty_1.p)();
(0, pretty_1.p)(yellow("Different boilerplates are no longer supported in Ignite v4+."));
(0, pretty_1.p)(gray("To use the old CLI to support different boilerplates, try:"));
(0, pretty_1.p)(cyan("npx ignite-cli@3 new ".concat(projectName, " --boilerplate ").concat(bname)));
process.exit(1);
}
defaultBundleIdentifier = "com.".concat(strings.pascalCase(projectName).toLowerCase());
bundleIdentifier = useDefault(options.bundle) ? defaultBundleIdentifier : options.bundle;
if (!(bundleIdentifier === undefined)) return [3 /*break*/, 3];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "input",
name: "bundleIdentifier",
message: "What bundle identifier?",
initial: defaultBundleIdentifier,
prefix: pretty_1.prefix,
}); })];
case 2:
bundleIdentifierResponse = _e.sent();
bundleIdentifier = bundleIdentifierResponse.bundleIdentifier;
_e.label = 3;
case 3:
validateBundleIdentifier = require("../tools/validations").validateBundleIdentifier;
validateBundleIdentifier(toolbox, bundleIdentifier);
defaultTargetPath = path(projectName);
targetPath = useDefault(options.targetPath) ? defaultTargetPath : options.targetPath;
if (!(targetPath === undefined)) return [3 /*break*/, 5];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "input",
name: "targetPath",
message: "Where do you want to start your project?",
initial: defaultTargetPath,
prefix: pretty_1.prefix,
}); })];
case 4:
targetPathResponse = _e.sent();
targetPath = targetPathResponse.targetPath;
_e.label = 5;
case 5:
handleHomePrefix = function (p) {
return (p === null || p === void 0 ? void 0 : p.startsWith("~")) ? p.replace("~", homedir()) : p;
};
targetPath = path(handleHomePrefix(targetPath));
defaultOverwrite = false;
overwrite = useDefault(options.overwrite) ? defaultOverwrite : (0, flag_1.boolFlag)(options.overwrite);
if (!(exists(targetPath) && overwrite === undefined)) return [3 /*break*/, 7];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "confirm",
name: "overwrite",
message: "Directory ".concat(targetPath, " already exists. Do you want to overwrite it?"),
initial: defaultOverwrite,
format: pretty_1.prettyPrompt.format.boolean,
prefix: pretty_1.prefix,
}); })];
case 6:
overwriteResponse = _e.sent();
overwrite = overwriteResponse.overwrite;
_e.label = 7;
case 7:
if (exists(targetPath) && overwrite === false) {
alreadyExists = "Error: There's already a folder at ".concat(targetPath, ". To force overwriting that folder, run with --overwrite or say yes.");
(0, pretty_1.p)();
(0, pretty_1.p)(yellow(alreadyExists));
process.exit(1);
}
defaultWorkflow = "expo";
workflow = useDefault(options.workflow) ? defaultWorkflow : options.workflow;
if (!(workflow === undefined)) return [3 /*break*/, 11];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "select",
name: "useExpo",
message: "Do you want to use Expo?",
choices: [
{
name: "Expo",
message: "Expo - Recommended for almost all apps [Default]",
},
{
name: "Bare",
message: "Bare - For advanced usage (still contains some Expo libraries)",
},
],
initial: "Expo",
prefix: pretty_1.prefix,
}); })];
case 8:
useExpoResponse = _e.sent();
useExpo = useExpoResponse.useExpo === "Expo";
if (!useExpo) return [3 /*break*/, 10];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "select",
name: "workflow",
message: "Which Expo workflow? (You can switch between them later with a little work -- here's how: https://ignitecookbook.com/docs/recipes/SwitchBetweenExpoGoCNG)",
choices: [
{
name: "Expo Go",
message: "Expo Go - For simple apps that don't need custom native code [Default]",
value: "expo",
},
{
name: "Expo CNG",
message: "Expo CNG - For more involved apps -- allows you to integrate custom native code via config plugins",
value: "cng",
},
],
result: function (name) {
// Some magical enquirer map function here that returns an object of { [name]: value]}
// and we only need the value underneath (using name for the cli display to the user)
// @ts-expect-error
return this.map(name)[name];
},
initial: "expo",
prefix: pretty_1.prefix,
}); })];
case 9:
expoWorkflowTypeResponse = _e.sent();
workflow = expoWorkflowTypeResponse.workflow;
return [3 /*break*/, 11];
case 10:
workflow = "manual";
_e.label = 11;
case 11:
needsPrebuild = workflow === "prebuild" || workflow === "cng" || workflow === "manual";
log("workflow: ".concat(workflow));
log("needs prebuild: ".concat(needsPrebuild));
defaultGit = true;
git = useDefault(options.git) ? defaultGit : (0, flag_1.boolFlag)(options.git);
if (!(git === undefined)) return [3 /*break*/, 13];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "confirm",
name: "git",
message: "Do you want to initialize a git repository?",
initial: defaultGit,
format: pretty_1.prettyPrompt.format.boolean,
prefix: pretty_1.prefix,
}); })];
case 12:
gitResponse = _e.sent();
git = gitResponse.git;
_e.label = 13;
case 13:
defaultRemoveDemo = false;
removeDemo = useDefault(options.removeDemo)
? defaultRemoveDemo
: (0, flag_1.boolFlag)(options.removeDemo);
if (!(removeDemo === undefined)) return [3 /*break*/, 15];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "confirm",
name: "removeDemo",
message: "Remove demo code? We recommend leaving it in if it's your first time using Ignite",
initial: defaultRemoveDemo,
format: pretty_1.prettyPrompt.format.boolean,
prefix: pretty_1.prefix,
}); })];
case 14:
removeDemoResponse = _e.sent();
removeDemo = removeDemoResponse.removeDemo;
_e.label = 15;
case 15:
availablePackagers = packager_1.packager.availablePackagers();
log("availablePackagers: ".concat(availablePackagers));
defaultPackagerName = availablePackagers.includes("yarn") ? "yarn" : "npm";
packagerName = useDefault(options.packager) ? defaultPackagerName : options.packager;
validatePackagerName = function (input) {
return typeof input === "string" && ["npm", "yarn", "pnpm", "bun"].includes(input);
};
if (packagerName !== undefined && validatePackagerName(packagerName) === false) {
(0, pretty_1.p)();
(0, pretty_1.p)(yellow("Error: Invalid packager: \"".concat(packagerName, "\". Valid packagers are npm, yarn, pnpm, bun.")));
process.exit(1);
}
if (packagerName !== undefined && availablePackagers.includes(packagerName) === false) {
(0, pretty_1.p)();
(0, pretty_1.p)(yellow("Error: selected \"".concat(packagerName, "\" but packager was not available on system")));
process.exit(1);
}
if (!(packagerName === undefined)) return [3 /*break*/, 17];
initial_1 = availablePackagers.findIndex(function (p) { return p === defaultPackagerName; });
NOT_FOUND = -1;
if (initial_1 === NOT_FOUND) {
(0, pretty_1.p)();
(0, pretty_1.p)(yellow("Error: Default packager \"".concat(defaultPackagerName, "\" was not available on system")));
process.exit(1);
}
return [4 /*yield*/, prompt.ask(function () { return ({
type: "select",
name: "packagerName",
message: "Which package manager do you want to use?",
choices: availablePackagers,
initial: initial_1,
prefix: pretty_1.prefix,
}); })];
case 16:
packagerNameResponse = _e.sent();
packagerName = packagerNameResponse.packagerName;
_e.label = 17;
case 17:
packagerOptions = { packagerName: packagerName };
isWindows = process.platform === "win32";
ignitePath = path("".concat(meta.src), "..");
boilerplatePath = path(ignitePath, "boilerplate");
boilerplate = function () {
var pathParts = [];
for (var _i = 0; _i < arguments.length; _i++) {
pathParts[_i] = arguments[_i];
}
return path.apply(void 0, __spreadArray([boilerplatePath], pathParts, false));
};
log("ignitePath: ".concat(ignitePath));
log("boilerplatePath: ".concat(boilerplatePath));
defaultInstallDeps = true;
installDeps = useDefault(options.installDeps)
? defaultInstallDeps
: (0, flag_1.boolFlag)(options.installDeps);
if (!(installDeps === undefined)) return [3 /*break*/, 19];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "confirm",
name: "installDeps",
message: "Do you want to install dependencies?",
initial: defaultInstallDeps,
format: pretty_1.prettyPrompt.format.boolean,
prefix: pretty_1.prefix,
}); })];
case 18:
installDepsResponse = _e.sent();
installDeps = installDepsResponse.installDeps;
_e.label = 19;
case 19:
experimentalFlags = (_c = (_b = options.experimental) === null || _b === void 0 ? void 0 : _b.split(",")) !== null && _c !== void 0 ? _c : [];
log("experimentalFlags: ".concat(experimentalFlags));
experimentalFlags.forEach(function (flag) {
if (flag === "new-arch") {
newArch = true;
}
else if (flag.indexOf("expo-") > -1) {
expoVersion = flag.substring(5);
}
});
defaultNewArch = false;
experimentalNewArch = useDefault(newArch) ? defaultNewArch : (0, flag_1.boolFlag)(newArch);
if (!(experimentalNewArch === undefined && workflow !== "expo")) return [3 /*break*/, 21];
return [4 /*yield*/, prompt.ask(function () { return ({
type: "confirm",
name: "experimentalNewArch",
message: "❗EXPERIMENTAL❗Would you like to enable the New Architecture?",
initial: defaultNewArch,
format: pretty_1.prettyPrompt.format.boolean,
prefix: pretty_1.prefix,
}); })];
case 20:
newArchResponse = _e.sent();
experimentalNewArch = newArchResponse.experimentalNewArch;
return [3 /*break*/, 22];
case 21:
if (workflow === "expo") {
// Don't ask this for Expo Go flow since it isn't supported atm due to expo-updates
experimentalNewArch = false;
}
_e.label = 22;
case 22:
perfStart = new Date().getTime();
timeout = noTimeout ? undefined : setTimeout(timeoutExit, MAX_APP_CREATION_TIME);
_e.label = 23;
case 23:
_e.trys.push([23, 60, , 65]);
terminalWidth = (_d = process.stdout.columns) !== null && _d !== void 0 ? _d : 80;
logo = terminalWidth > 80 ? function () { return (0, pretty_1.ascii)("logo.ascii.txt"); } : function () { return (0, pretty_1.ascii)("logo-sm.ascii.txt"); };
(0, pretty_1.p)();
(0, pretty_1.p)();
(0, pretty_1.p)();
(0, pretty_1.p)();
logo();
(0, pretty_1.p)();
(0, pretty_1.p)();
pkg = (0, pretty_1.pkgColor)(packagerName);
igniteVersion = meta.version();
(0, pretty_1.p)(" \u2588 Creating ".concat((0, pretty_1.em)(projectName), " using ").concat((0, pretty_1.em)("Ignite ".concat(igniteVersion))));
(0, pretty_1.p)(" \u2588 Powered by ".concat((0, pretty_1.ir)(" ∞ Infinite Red "), " (").concat((0, pretty_1.link)("https://infinite.red"), ")"));
(0, pretty_1.p)(" \u2588 Package Manager: ".concat(pkg(print.colors.bold(packagerName))));
(0, pretty_1.p)(" \u2588 Bundle identifier: ".concat((0, pretty_1.em)(bundleIdentifier)));
(0, pretty_1.p)(" \u2588 Path: ".concat(underline(targetPath)));
(0, pretty_1.hr)();
(0, pretty_1.p)();
if (!(exists(targetPath) === "dir" && overwrite === true)) return [3 /*break*/, 25];
msg = " Tossing that old app like it's hot";
(0, pretty_1.startSpinner)(msg);
return [4 /*yield*/, removeAsync(targetPath)];
case 24:
_e.sent();
(0, pretty_1.stopSpinner)(msg, "🗑️");
_e.label = 25;
case 25:
// #endregion
// #region Copy Boilerplate Files
(0, pretty_1.startSpinner)(" 3D-printing a new React Native app");
return [4 /*yield*/, (0, react_native_1.copyBoilerplate)(toolbox, {
boilerplatePath: boilerplatePath,
targetPath: targetPath,
excluded: [".vscode", "node_modules", "yarn.lock", "bun.lockb", "package-lock.json"],
overwrite: overwrite,
})];
case 26:
_e.sent();
(0, pretty_1.stopSpinner)(" 3D-printing a new React Native app", "🖨");
boilerplateIgnorePath = exists(boilerplate(".gitignore.template"))
? boilerplate(".gitignore.template")
: boilerplate(".gitignore");
targetIgnorePath = log(path(targetPath, ".gitignore"));
copy(log(boilerplateIgnorePath), targetIgnorePath, { overwrite: true });
if (exists(targetIgnorePath) === false) {
warning(" Unable to copy ".concat(boilerplateIgnorePath, " to ").concat(targetIgnorePath));
}
else if (workflow === "manual") {
gitIgnoreContents = read(targetIgnorePath);
gitIgnoreContents = gitIgnoreContents.replace("/android", "").replace("/ios", "");
write(targetIgnorePath, gitIgnoreContents);
}
cwd = log(process.cwd());
// jump into the project to do additional tasks
process.chdir(targetPath);
packageJsonRaw = read("package.json");
packageJsonRaw = packageJsonRaw
.replace(/HelloWorld/g, projectName)
.replace(/hello-world/g, projectNameKebab);
if (!needsPrebuild) return [3 /*break*/, 29];
packageJsonRaw = packageJsonRaw
.replace(/start --android/g, "run:android")
.replace(/start --ios/g, "run:ios");
if (!expoVersion) return [3 /*break*/, 28];
return [4 /*yield*/, system.run("npm view expo dist-tags --json")
// filter for canary/beta and get last item in array
];
case 27:
expoDistTagOutput = _e.sent();
tagVersion = JSON.parse(expoDistTagOutput)[expoVersion];
log("overriding expo version to: ".concat(tagVersion));
// find line with "expo": and replace entire line with tagVersion
packageJsonRaw = packageJsonRaw.replace(/"expo": ".*"/g, "\"expo\": \"".concat(tagVersion, "\""));
_e.label = 28;
case 28: return [3 /*break*/, 30];
case 29:
// Expo Go workflow, swap back to compatible Expo Go versions of modules
log("Changing some dependencies for Expo Go compatibility...");
log(JSON.stringify(expoGoCompatibility_1.expoGoCompatExpectedVersions));
packageJsonRaw = (0, expoGoCompatibility_1.findAndUpdateDependencyVersions)(packageJsonRaw, expoGoCompatibility_1.expoGoCompatExpectedVersions);
_e.label = 30;
case 30:
// - If we're removing the demo code, clean up some dependencies that are no longer needed
if (removeDemo) {
log("Removing demo dependencies... ".concat(demo_1.demoDependenciesToRemove.join(", ")));
packageJsonRaw = (0, demo_1.findAndRemoveDemoDependencies)(packageJsonRaw);
}
packageJson = JSON.parse(packageJsonRaw);
write("./package.json", packageJson);
// #endregion
// #region Run Packager Install
// pnpm/yarn/npm/bun install it
// fix .npmrc if using pnpm
if (packagerName === "pnpm") {
npmrcPath = path(targetPath, ".npmrc");
npmrcContents = read(npmrcPath);
write(npmrcPath, "".concat(npmrcContents).concat(os_1.EOL, "node-linker=hoisted").concat(os_1.EOL));
}
boilerplatePackageJsonHash = cache_1.cache.hash(read(path(boilerplatePath, "package.json")));
cachePath = path(cache_1.cache.rootdir(), boilerplatePackageJsonHash, packagerName);
cacheExists = exists(cachePath) === "dir";
log("".concat(!cacheExists ? "expected " : "", "cachePath: ").concat(cachePath));
log("cacheExists: ".concat(cacheExists));
defaultUseCache = false;
useCache = options.useCache === undefined ? defaultUseCache : (0, flag_1.boolFlag)(options.useCache);
shouldUseCache = installDeps && cacheExists && useCache;
if (!shouldUseCache) return [3 /*break*/, 32];
msg = "Grabbing those ".concat(packagerName, " dependencies from the back");
(0, pretty_1.startSpinner)(msg);
return [4 /*yield*/, cache_1.cache.copy({
fromRootDir: cachePath,
toRootDir: targetPath,
packagerName: packagerName,
})];
case 31:
_e.sent();
(0, pretty_1.stopSpinner)(msg, "📦");
_e.label = 32;
case 32:
renameSpinnerMsg = "Getting those last few details perfect";
(0, pretty_1.startSpinner)(renameSpinnerMsg);
boilerplateBundleIdentifier = "com.helloworld";
return [4 /*yield*/, (0, react_native_1.renameReactNativeApp)(toolbox, "HelloWorld", projectName, boilerplateBundleIdentifier, bundleIdentifier)];
case 33:
_e.sent();
return [4 /*yield*/, (0, react_native_1.replaceMaestroBundleIds)(toolbox, boilerplateBundleIdentifier, bundleIdentifier)];
case 34:
_e.sent();
(0, pretty_1.stopSpinner)(renameSpinnerMsg, "🎨");
shouldFreshInstallDeps = installDeps && shouldUseCache === false;
if (!shouldFreshInstallDeps) return [3 /*break*/, 38];
unboxingMessage = "Installing ".concat(packagerName, " dependencies (wow these are heavy)");
(0, pretty_1.startSpinner)(unboxingMessage);
return [4 /*yield*/, packager_1.packager.install(__assign(__assign({}, packagerOptions), { onProgress: log }))
// if we're using the canary build, we need to install the canary versions of supporting Expo packages
];
case 35:
_e.sent();
if (!expoVersion) return [3 /*break*/, 37];
return [4 /*yield*/, system.run("npx expo install --fix", { onProgress: log })];
case 36:
_e.sent();
_e.label = 37;
case 37:
(0, pretty_1.stopSpinner)(unboxingMessage, "🧶");
_e.label = 38;
case 38:
// remove the gitignore template
return [4 /*yield*/, removeAsync(".gitignore.template")
// #endregion
// #region Cache dependencies
];
case 39:
// remove the gitignore template
_e.sent();
if (!(shouldFreshInstallDeps && cacheExists === false && useCache)) return [3 /*break*/, 41];
msg = "Saving ".concat(packagerName, " dependencies for next time");
(0, pretty_1.startSpinner)(msg);
log(targetPath);
return [4 /*yield*/, cache_1.cache.copy({
fromRootDir: targetPath,
toRootDir: cachePath,
packagerName: packagerName,
})];
case 40:
_e.sent();
(0, pretty_1.stopSpinner)(msg, "📦");
_e.label = 41;
case 41:
// #endregion
// #region Configure app.json
// Enable New Architecture if requested (must happen before prebuild)
(0, pretty_1.startSpinner)(" Configuring app.json");
try {
appJsonRaw = read("app.json");
appJson = JSON.parse(appJsonRaw);
// Inject ignite version to app.json
appJson.ignite.version = igniteVersion;
if (experimentalNewArch === true) {
appJson.expo.plugins[1][1].ios.newArchEnabled = true;
appJson.expo.plugins[1][1].android.newArchEnabled = true;
// Adding the "deploymentTarget" key is required for
// @react-native-async-storage/async-storage to work in the new architecture
appJson.expo.plugins[1][1].ios.deploymentTarget = "13.4";
}
// this can go away once we're at SDK 50 since expo-font needs to be added here
if (expoVersion) {
appJson.expo.plugins.push("expo-font");
}
write("./app.json", appJson);
}
catch (e) {
log(e);
(0, pretty_1.p)(yellow("Unable to configure app.json."));
}
(0, pretty_1.stopSpinner)(" Configuring app.json", "");
if (!(installDeps === true)) return [3 /*break*/, 45];
if (!needsPrebuild) return [3 /*break*/, 43];
prebuildMessage = " Generating native template via Expo Prebuild";
(0, pretty_1.startSpinner)(prebuildMessage);
return [4 /*yield*/, packager_1.packager.run("prebuild:clean", __assign(__assign({}, packagerOptions), { onProgress: log }))];
case 42:
_e.sent();
(0, pretty_1.stopSpinner)(prebuildMessage, "🛠️");
_e.label = 43;
case 43:
// Make sure all our modifications are formatted nicely
return [4 /*yield*/, packager_1.packager.run("format", __assign(__assign({}, packagerOptions), { silent: !debug }))];
case 44:
// Make sure all our modifications are formatted nicely
_e.sent();
_e.label = 45;
case 45:
removeDemoPart = removeDemo === true ? "code" : "markup";
(0, pretty_1.startSpinner)(" Removing fancy demo ".concat(removeDemoPart));
_e.label = 46;
case 46:
_e.trys.push([46, 48, , 49]);
IGNITE = "node " + filesystem.path(__dirname, "..", "..", "bin", "ignite");
CMD = removeDemo === true ? "remove-demo" : "remove-demo-markup";
log("Ignite bin path: ".concat(IGNITE));
return [4 /*yield*/, system.run("".concat(IGNITE, " ").concat(CMD, " \"").concat(targetPath, "\""), {
onProgress: log,
})];
case 47:
_e.sent();
return [3 /*break*/, 49];
case 48:
e_1 = _e.sent();
log(e_1);
(0, pretty_1.p)(yellow("Unable to remove demo ".concat(removeDemoPart, ".")));
return [3 /*break*/, 49];
case 49:
(0, pretty_1.stopSpinner)(" Removing fancy demo ".concat(removeDemoPart), "🛠️");
warnAboutEOL = false;
if (isWindows) {
try {
templates = filesystem.find("".concat(targetPath, "/ignite/templates"), {
directories: false,
files: true,
matching: "*.ejs",
});
log("templates to change EOL: ".concat(templates));
templates.map(function (file) { return __awaiter(void 0, void 0, void 0, function () {
var template;
return __generator(this, function (_a) {
log("Converting EOL for ".concat(file));
template = read(file);
template = template.replace(/\n/g, "\r\n");
write(file, template);
return [2 /*return*/];
});
}); });
}
catch (_f) {
warnAboutEOL = true;
}
}
if (!(git === true)) return [3 /*break*/, 59];
(0, pretty_1.startSpinner)(" Backing everything up in source control");
_e.label = 50;
case 50:
_e.trys.push([50, 57, , 58]);
if (!isWindows) return [3 /*break*/, 54];
return [4 /*yield*/, system.run(log("git init"))];
case 51:
_e.sent();
return [4 /*yield*/, system.run(log("git add -A"))];
case 52:
_e.sent();
return [4 /*yield*/, system.run(log("git commit -m \"New Ignite ".concat(meta.version(), " app")))];
case 53:
_e.sent();
return [3 /*break*/, 56];
case 54: return [4 /*yield*/, system.run(log("\n \\rm -rf ./.git\n git init;\n git add -A;\n git commit -m \"New Ignite ".concat(meta.version(), " app\";\n ")))];
case 55:
_e.sent();
_e.label = 56;
case 56: return [3 /*break*/, 58];
case 57:
e_2 = _e.sent();
(0, pretty_1.p)(yellow("Unable to commit the initial changes. Please check your git username and email."));
return [3 /*break*/, 58];
case 58:
(0, pretty_1.stopSpinner)(" Backing everything up in source control", "🗄");
_e.label = 59;
case 59:
// back to the original directory
process.chdir(log(cwd));
// #endregion
// #region Print Finish
// clean up any spinners we forgot to clear
(0, pretty_1.p)();
(0, pretty_1.hr)();
(0, pretty_1.p)();
(0, pretty_1.clearSpinners)();
perfDuration = Math.round((new Date().getTime() - perfStart) / 10) / 100;
// no need to timeout, we're done!
clearTimeout(timeout);
p2("Ignited ".concat((0, pretty_1.em)("".concat(projectName)), " in ").concat(gray("".concat(perfDuration, "s")), " \uD83D\uDE80 "));
p2();
cliCommand = buildCliCommand({
flags: {
b: bname,
boilerplate: bname,
bundle: bundleIdentifier,
debug: debug,
git: git,
installDeps: installDeps,
overwrite: overwrite,
packager: packagerName,
targetPath: targetPath,
removeDemo: removeDemo,
experimental: experimentalFlags.length > 0 ? experimentalFlags.join(",") : undefined,
workflow: workflow,
useCache: useCache,
y: yname,
yes: yname,
noTimeout: noTimeout,
},
projectName: projectName,
toolbox: toolbox,
});
p2("For next time: here are the Ignite options you picked!");
prettyCliCommand = cliCommand
.split(" ")
.map(function (c) { return (c === projectName || (c === null || c === void 0 ? void 0 : c.startsWith("--")) ? "".concat(c, " \\").concat(os_1.EOL) : c); }) // add a line break after the project name and each flag
.map(function (c, i, a) { return (i === a.length - 1 ? c.replace("\\".concat(os_1.EOL), "") : c); }) // remove the line break after the last flag
.map(function (c) { return (c.startsWith("--") ? pretty_1.INDENT + CMD_INDENT + CMD_INDENT + c : c); }) // add whitespace to the flags so it looks nice
.join(" ");
command("".concat(prettyCliCommand));
p2();
if (!(0, react_native_1.isAndroidInstalled)(toolbox)) {
(0, pretty_1.hr)();
p2();
p2("To run in Android, make sure you've followed the latest");
p2("react-native setup instructions. You reference them at:");
p2("".concat((0, pretty_1.link)("https://reactnative.dev/docs/environment-setup")));
p2();
}
if (warnAboutEOL) {
(0, pretty_1.hr)();
p2();
p2(yellow("Generator templates could not be converted to Windows EOL."));
p2(yellow("You may want to update these manually with your code editor, more info at:"));
p2("".concat((0, pretty_1.link)("https://github.com/infinitered/ignite/blob/master/docs/Generators.md")));
p2();
}
(0, pretty_1.hr)();
p2();
p2("Need additional help?");
p2();
p2("Join our Slack community at ".concat((0, pretty_1.link)("http://community.infinite.red.")));
p2();
(0, pretty_1.hr)();
p2();
p2("Now get cooking! 🍽");
command("cd ".concat(targetPath));
if (!installDeps)
command(packager_1.packager.installCmd({ packagerName: packagerName }));
isMac = process.platform === "darwin";
if (isMac) {
command("".concat(packager_1.packager.runCmd("ios", packagerOptions)));
p2("Or Android via");
command("".concat(packager_1.packager.runCmd("android", packagerOptions)));
}
else {
command("".concat(packager_1.packager.runCmd("android", packagerOptions)));
}
p2();
p2();
// #endregion
// this is a hack to prevent the process from hanging
// if there are any tasks left in the event loop
// like I/O operations to process.stdout and process.stderr
// see https://github.com/infinitered/ignite/issues/2084
process.exit(0);
return [3 /*break*/, 65];
case 60:
e_3 = _e.sent();
(0, pretty_1.stopLastSpinner)("❌");
p2(red("\nThe following error occurred:"));
p2();
p2(red(e_3.toString()));
p2();
p2("Consider opening an issue with the following information at:");
p2("".concat((0, pretty_1.link)("https://github.com/infinitered/ignite/issues/new?template=bug_report.yml&labels=bug")));
p2();
(0, pretty_1.startSpinner)(" Gathering system and project details");
_e.label = 61;
case 61:
_e.trys.push([61, 63, , 64]);
IGNITE = "node " + filesystem.path(__dirname, "..", "..", "bin", "ignite");
return [4 /*yield*/, system.run("".concat(IGNITE, " doctor"))];
case 62:
doctorResults = _e.sent();
(0, pretty_1.p)("\n\n".concat(doctorResults));
return [3 /*break*/, 64];
case 63:
e_4 = _e.sent();
(0, pretty_1.p)(yellow("Unable to gather system and project details."));
return [3 /*break*/, 64];
case 64:
(0, pretty_1.clearSpinners)();
process.exit(1);
return [3 /*break*/, 65];
case 65: return [2 /*return*/];
}
});
}); },
};
function buildCliCommand(args) {
var flags = args.flags, toolbox = args.toolbox, projectName = args.projectName;
var strings = toolbox.strings;
var kebabCase = strings.kebabCase;
var privateFlags = ["b", "boilerplate", "debug", "useCache", "y", "yes"];
var stringFlag = function (_a) {
var key = _a[0], value = _a[1];
return "--".concat(kebabCase(key), "=").concat(value);
};
var booleanFlag = function (_a) {
var key = _a[0], value = _a[1];
return value ? "--".concat(kebabCase(key)) : "--".concat(kebabCase(key), "=").concat(value);
};
var cliCommand = "npx ignite-cli new ".concat(projectName, " ").concat(Object.entries(flags)
.filter(function (_a) {
var key = _a[0];
return privateFlags.includes(key) === false;
})
.filter(function (_a) {
var value = _a[1];
return value !== undefined;
})
.map(function (_a) {
var key = _a[0], value = _a[1];
return typeof value === "boolean" ? booleanFlag([key, value]) : stringFlag([key, value]);
})
.join(" "));
return cliCommand;
}
//# sourceMappingURL=new.js.map