UNPKG

6.66 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const cli_framework_1 = require("@ionic/cli-framework");
5const node_1 = require("@ionic/cli-framework/utils/node");
6const utils_process_1 = require("@ionic/utils-process");
7const Debug = require("debug");
8const path = require("path");
9const commands_1 = require("./commands");
10const guards_1 = require("./guards");
11const lib_1 = require("./lib");
12const color_1 = require("./lib/color");
13const executor_1 = require("./lib/executor");
14tslib_1.__exportStar(require("./constants"), exports);
15tslib_1.__exportStar(require("./guards"), exports);
16const debug = Debug('ionic');
17const PACKAGE_ROOT_PATH = __dirname;
18const PACKAGE_JSON_PATH = path.resolve(PACKAGE_ROOT_PATH, 'package.json');
19let _pkg;
20let _executor;
21async function loadPackageJson() {
22 if (!_pkg) {
23 _pkg = await node_1.readPackageJsonFile(PACKAGE_JSON_PATH);
24 }
25 return _pkg;
26}
27async function generateContext() {
28 const pkg = await loadPackageJson();
29 if (!pkg.bin || !pkg.bin.ionic) {
30 throw new Error(`Missing "${color_1.strong('bin.ionic')}" in Ionic CLI package.json`);
31 }
32 if (!pkg.main) {
33 throw new Error(`Missing "${color_1.strong('main')}" in Ionic CLI package.json`);
34 }
35 return {
36 binPath: path.resolve(PACKAGE_ROOT_PATH, pkg.bin.ionic),
37 libPath: PACKAGE_ROOT_PATH,
38 execPath: process.cwd(),
39 version: pkg.version,
40 };
41}
42exports.generateContext = generateContext;
43async function loadExecutor(ctx, pargv) {
44 if (!_executor) {
45 const deps = await lib_1.generateIonicEnvironment(ctx, pargv);
46 const namespace = new commands_1.IonicNamespace(deps);
47 _executor = new executor_1.Executor({ namespace });
48 }
49 return _executor;
50}
51exports.loadExecutor = loadExecutor;
52async function run(pargv) {
53 let err;
54 let executor;
55 try {
56 executor = await loadExecutor(await generateContext(), pargv);
57 }
58 catch (e) {
59 process.stderr.write(`${e.message ? e.message : (e.stack ? e.stack : e)}\n`);
60 process.exitCode = 1;
61 return;
62 }
63 const ienv = executor.namespace.env;
64 if (pargv[0] !== '_') {
65 try {
66 debug('Context: %o', ienv.ctx);
67 ienv.config.set('version', ienv.ctx.version);
68 const token = process.env['IONIC_TOKEN'];
69 const email = process.env['IONIC_EMAIL'];
70 const password = process.env['IONIC_PASSWORD'];
71 if (token) {
72 const wasLoggedIn = ienv.session.isLoggedIn();
73 debug(`${color_1.strong('IONIC_TOKEN')} environment variable detected`);
74 if (ienv.config.get('tokens.user') !== token) {
75 debug(`${color_1.strong('IONIC_TOKEN')} mismatch with current session--attempting login`);
76 await ienv.session.tokenLogin(token);
77 if (wasLoggedIn) {
78 ienv.log.info(`You have been logged out--using ${color_1.strong('IONIC_TOKEN')} environment variable`);
79 }
80 }
81 }
82 else if (email && password) {
83 debug(`${color_1.strong('IONIC_EMAIL')} / ${color_1.strong('IONIC_PASSWORD')} environment variables detected`);
84 if (ienv.config.get('user.email') !== email) {
85 debug(`${color_1.strong('IONIC_EMAIL')} mismatch with current session--attempting login`);
86 try {
87 await ienv.session.login(email, password);
88 }
89 catch (e) {
90 ienv.log.error(`Error occurred during automatic login via ${color_1.strong('IONIC_EMAIL')} / ${color_1.strong('IONIC_PASSWORD')} environment variables.`);
91 throw e;
92 }
93 }
94 }
95 await executor.execute(pargv, process.env);
96 if (ienv.flags.interactive) {
97 const { runUpdateNotify } = await Promise.resolve().then(() => require('./lib/updates'));
98 await runUpdateNotify(ienv, await loadPackageJson());
99 }
100 }
101 catch (e) {
102 err = e;
103 }
104 }
105 if (err) {
106 process.exitCode = 1;
107 if (err instanceof cli_framework_1.InputValidationError) {
108 for (const e of err.errors) {
109 ienv.log.error(e.message);
110 }
111 ienv.log.msg(`Use the ${color_1.input('--help')} flag for more details.`);
112 }
113 else if (guards_1.isSuperAgentError(err)) {
114 const { formatSuperAgentError } = await Promise.resolve().then(() => require('./lib/http'));
115 ienv.log.rawmsg(formatSuperAgentError(err));
116 }
117 else if (err.code && err.code === 'ENOTFOUND' || err.code === 'ECONNREFUSED') {
118 ienv.log.error(`Network connectivity error occurred, are you offline?\n` +
119 `If you are behind a firewall and need to configure proxy settings, see: ${color_1.strong('https://ion.link/cli-proxy-docs')}\n\n` +
120 color_1.failure(String(err.stack ? err.stack : err)));
121 }
122 else if (guards_1.isExitCodeException(err)) {
123 if (err.message) {
124 if (err.exitCode > 0) {
125 ienv.log.error(err.message);
126 }
127 else {
128 ienv.log.msg(err.message);
129 }
130 }
131 await utils_process_1.processExit(err.exitCode);
132 }
133 else if (err instanceof cli_framework_1.BaseError) {
134 ienv.log.error(err.message);
135 }
136 else {
137 ienv.log.msg(color_1.failure(String(err.stack ? err.stack : err)));
138 if (err.stack) {
139 debug(color_1.failure(String(err.stack)));
140 }
141 }
142 }
143}
144exports.run = run;
145async function receive(msg) {
146 if (!_executor) {
147 throw new Error('Executor not initialized.');
148 }
149 const { env, project } = _executor.namespace;
150 if (msg.type === 'telemetry') {
151 const { sendCommand } = await Promise.resolve().then(() => require('./lib/telemetry'));
152 await sendCommand({
153 getInfo: env.getInfo,
154 client: env.client,
155 config: env.config,
156 ctx: env.ctx,
157 project,
158 session: env.session,
159 }, msg.data.command, msg.data.args);
160 }
161 else if (msg.type === 'update-check') {
162 const { runUpdateCheck } = await Promise.resolve().then(() => require('./lib/updates'));
163 await runUpdateCheck(env);
164 }
165}
166exports.receive = receive;