@ms-cloudpack/cli 0.72.67 → 0.72.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/utilities/CommandExecutor.d.ts.map +1 -1
- package/lib/utilities/CommandExecutor.js +31 -62
- package/lib/utilities/CommandExecutor.js.map +1 -1
- package/lib/utilities/discoverRemoteAppPaths.d.ts.map +1 -1
- package/lib/utilities/discoverRemoteAppPaths.js +8 -3
- package/lib/utilities/discoverRemoteAppPaths.js.map +1 -1
- package/lib/utilities/readLocalConfigs.d.ts +7 -0
- package/lib/utilities/readLocalConfigs.d.ts.map +1 -0
- package/lib/utilities/readLocalConfigs.js +22 -0
- package/lib/utilities/readLocalConfigs.js.map +1 -0
- package/lib/utilities/readRemoteConfigs.d.ts +4 -0
- package/lib/utilities/readRemoteConfigs.d.ts.map +1 -0
- package/lib/utilities/readRemoteConfigs.js +14 -0
- package/lib/utilities/readRemoteConfigs.js.map +1 -0
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandExecutor.d.ts","sourceRoot":"","sources":["../../src/utilities/CommandExecutor.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,2BAA2B,CAAC;AACrG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"CommandExecutor.d.ts","sourceRoot":"","sources":["../../src/utilities/CommandExecutor.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,2BAA2B,CAAC;AACrG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAQ7E,MAAM,MAAM,0BAA0B,GAAG,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AAEpF,MAAM,WAAW,qBAAqB,CAAC,QAAQ,SAAS,0BAA0B,GAAG,0BAA0B;IAC7G,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,2CAA2C;IAC3C,OAAO,EAAE,QAAQ,CAAC;IAElB,uCAAuC;IACvC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEjC,0CAA0C;IAC1C,cAAc,EAAE,cAAc,CAAC;IAE/B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED;;GAEG;AAEH,qBAAa,eAAe,CAAC,QAAQ,SAAS,0BAA0B;IACtE,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,sBAAsB,CAAC,CAAe;IAE9C,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAmC;WAE9C,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;gBASzD,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC;IAWnD,uBAAuB;IAEV,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsErC;;;OAGG;YACW,mBAAmB;IAsGjC,qEAAqE;IACrE,OAAO,CAAC,+BAA+B;YAYzB,cAAc;IAkD5B,SAAS,CAAC,cAAc,QAAO,IAAI,CAgBjC;IAEF;;;OAGG;cACa,KAAK,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;CAgCjE"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { readConfig } from '@ms-cloudpack/config';
|
|
2
1
|
import { readJson } from '@ms-cloudpack/json-utilities';
|
|
3
2
|
import { TaskReporter, bold, debugLoggingConfig, defaultLoggingConfig, noLoggingConfig, red, verboseLoggingConfig, yellow, } from '@ms-cloudpack/task-reporter';
|
|
4
|
-
import {
|
|
3
|
+
import { startTelemetry } from '@ms-cloudpack/telemetry';
|
|
5
4
|
import path from 'path';
|
|
6
5
|
import { AutoDisposableList } from './AutoDisposableList.js';
|
|
7
6
|
import { getVersion } from '@ms-cloudpack/package-utilities';
|
|
8
7
|
import { environmentInfo } from '@ms-cloudpack/environment';
|
|
9
|
-
import { getCliStartTime } from './getCliStartTime.js';
|
|
10
8
|
import { discoverRemoteAppPaths } from './discoverRemoteAppPaths.js';
|
|
11
9
|
import { discoverLocalAppPaths } from './discoverLocalAppPaths.js';
|
|
12
10
|
import { TaskRunner } from '@ms-cloudpack/api-server';
|
|
11
|
+
import { readLocalConfigs } from './readLocalConfigs.js';
|
|
12
|
+
import { readRemoteConfigs } from './readRemoteConfigs.js';
|
|
13
|
+
import { getCliStartTime } from './getCliStartTime.js';
|
|
13
14
|
/**
|
|
14
15
|
* This class manages orchestration and shared state while executing a command.
|
|
15
16
|
*/
|
|
@@ -151,30 +152,14 @@ export class CommandExecutor {
|
|
|
151
152
|
const configOptions = this._getConfigOptionsFromCliOptions();
|
|
152
153
|
// The task runner is shared between all apps so that task results can potentially be reused.
|
|
153
154
|
const taskRunner = new TaskRunner();
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
extraFeatures: this._options.features,
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
catch (err) {
|
|
166
|
-
await this._exit({
|
|
167
|
-
message: `Invalid cloudpack config: ${err.message || err}`,
|
|
168
|
-
hasErrors: true,
|
|
169
|
-
});
|
|
170
|
-
// eslint-disable-next-line no-restricted-properties -- this will never be reached, but TypeScript doesn't know that
|
|
171
|
-
process.exit(1);
|
|
172
|
-
}
|
|
173
|
-
if (config.helpMessage) {
|
|
174
|
-
helpMessages.add(config.helpMessage);
|
|
175
|
-
}
|
|
176
|
-
configs[appPath] = config;
|
|
177
|
-
}
|
|
155
|
+
const readConfig = this._discoverAppPaths === 'remote' ? readRemoteConfigs : readLocalConfigs;
|
|
156
|
+
const configs = await readConfig(appPaths, {
|
|
157
|
+
...configOptions,
|
|
158
|
+
extraFeatures: this._options.features,
|
|
159
|
+
});
|
|
160
|
+
const helpMessages = new Set(Object.values(configs)
|
|
161
|
+
.filter((c) => c.helpMessage)
|
|
162
|
+
.map((c) => c.helpMessage));
|
|
178
163
|
// Set reporter options and print the product info header
|
|
179
164
|
this._reporter.setOptions({
|
|
180
165
|
productName: 'Cloudpack',
|
|
@@ -190,15 +175,24 @@ export class CommandExecutor {
|
|
|
190
175
|
? noLoggingConfig
|
|
191
176
|
: defaultLoggingConfig),
|
|
192
177
|
});
|
|
193
|
-
|
|
178
|
+
const contexts = [];
|
|
179
|
+
const logLevel = this._options.verbose ? 'VERBOSE' : this._options.debug ? 'DEBUG' : undefined;
|
|
180
|
+
if (!this._options.debug) {
|
|
181
|
+
this._reporter.ignoreLogMessage('ApplicationInsights:');
|
|
182
|
+
}
|
|
183
|
+
const telemetryApi = startTelemetry({
|
|
184
|
+
productVersion: getVersion(import.meta.url),
|
|
185
|
+
logLevel,
|
|
186
|
+
serviceName: 'cli',
|
|
187
|
+
});
|
|
188
|
+
this._autoDisposableList.add({
|
|
189
|
+
dispose: () => telemetryApi.shutdown(),
|
|
190
|
+
});
|
|
191
|
+
for (const appPath of Object.keys(configs)) {
|
|
194
192
|
const config = configs[appPath];
|
|
195
193
|
const definition = await readJson(path.join(appPath, 'package.json'));
|
|
196
194
|
const { name = path.basename(appPath) } = definition || {};
|
|
197
|
-
const telemetryClient = await this._initTelemetry(name, config);
|
|
198
|
-
// Dispose the telemetry client when the app is closing
|
|
199
|
-
this._autoDisposableList.add({
|
|
200
|
-
dispose: () => telemetryClient.shutdown(),
|
|
201
|
-
});
|
|
195
|
+
const telemetryClient = await this._initTelemetry(name, config, telemetryApi);
|
|
202
196
|
contexts.push({
|
|
203
197
|
appPath,
|
|
204
198
|
cachePath: this._options.cachePath,
|
|
@@ -222,40 +216,15 @@ export class CommandExecutor {
|
|
|
222
216
|
extraPackageSettings: options.bundler ? [{ match: '*', bundler: options.bundler }] : undefined,
|
|
223
217
|
};
|
|
224
218
|
}
|
|
225
|
-
async _initTelemetry(appName, config) {
|
|
219
|
+
async _initTelemetry(appName, config, telemetryApi) {
|
|
226
220
|
// Mark the start time for telemetry.
|
|
227
221
|
const startTime = performance.now();
|
|
228
222
|
const programOptions = this._programOptions;
|
|
229
|
-
const
|
|
230
|
-
const connectionString = programOptions.disableTelemetry || environmentInfo.isJest
|
|
223
|
+
const connectionString = this._programOptions.disableTelemetry || environmentInfo.isJest
|
|
231
224
|
? undefined
|
|
232
225
|
: config.telemetry?.connectionString || environmentInfo.cloudpack.telemetryConnectionString;
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
this._reporter.ignoreLogMessage('ApplicationInsights:');
|
|
236
|
-
}
|
|
237
|
-
const telemetryClient = await createTelemetryClient({
|
|
238
|
-
productVersion: getVersion(import.meta.url),
|
|
239
|
-
connectionString,
|
|
240
|
-
logLevel,
|
|
241
|
-
serviceNamespace: 'cloudpack',
|
|
242
|
-
serviceName: 'cli',
|
|
243
|
-
});
|
|
244
|
-
void telemetryClient.tracer.startActiveSpan('CLI_ENTRY', { startTime: getCliStartTime() }, () => {
|
|
245
|
-
// Retrieve the current telemetry context
|
|
246
|
-
const activeContext = telemetryClient.context.active();
|
|
247
|
-
/**
|
|
248
|
-
* Sets the current context as the root context. This ensures that all spans created during this CLI execution
|
|
249
|
-
* will be children of this root span, even though the root span is closed immediately. This helps group all
|
|
250
|
-
* spans under a single root span for better traceability.
|
|
251
|
-
*
|
|
252
|
-
* Typically, the root span should remain open until the CLI exits. However, in environments like Codespaces,
|
|
253
|
-
* the CLI might run indefinitely, which could leave the root span open indefinitely.
|
|
254
|
-
*
|
|
255
|
-
* To prevent this, the root span is closed immediately after it is set as the root context.
|
|
256
|
-
*/
|
|
257
|
-
telemetryClient.setRootContext(activeContext);
|
|
258
|
-
});
|
|
226
|
+
const telemetryClient = await telemetryApi.createClient(connectionString);
|
|
227
|
+
telemetryClient.tracer.startSpan('CLI_ENTRY', { startTime: getCliStartTime() }).end();
|
|
259
228
|
await telemetryClient.tracer.startActiveSpan('INIT_TELEMETRY', { startTime }, (span) => {
|
|
260
229
|
const enabledFeatureNames = Object.entries(config.features || {})
|
|
261
230
|
.filter(([, value]) => value)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandExecutor.js","sourceRoot":"","sources":["../../src/utilities/CommandExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["import { readConfig, type ReadConfigOptions } from '@ms-cloudpack/config';\nimport type { CloudpackConfig, PackageJson } from '@ms-cloudpack/common-types';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport {\n TaskReporter,\n bold,\n debugLoggingConfig,\n defaultLoggingConfig,\n noLoggingConfig,\n red,\n verboseLoggingConfig,\n yellow,\n} from '@ms-cloudpack/task-reporter';\nimport { createTelemetryClient, type TelemetryClient } from '@ms-cloudpack/telemetry';\nimport path from 'path';\nimport type { CommandAction, CommandExitParams, AppCommandContext } from '../types/CommandAction.js';\nimport type { ProgramOptions } from '../types/ProgramOptions.js';\nimport type { SharedOptions } from '../types/SharedOptions.js';\nimport { AutoDisposableList } from './AutoDisposableList.js';\nimport { getVersion } from '@ms-cloudpack/package-utilities';\nimport { environmentInfo } from '@ms-cloudpack/environment';\nimport { getCliStartTime } from './getCliStartTime.js';\nimport type { ReusedOptions } from '../types/ReusedOptions.js';\nimport type { AppPathDiscoveryMode } from '../types/AppPathDiscoveryMode.js';\nimport { discoverRemoteAppPaths } from './discoverRemoteAppPaths.js';\nimport { discoverLocalAppPaths } from './discoverLocalAppPaths.js';\nimport { TaskRunner } from '@ms-cloudpack/api-server';\n\nexport type BaseCommandExecutorOptions = SharedOptions & Pick<ReusedOptions, 'app'>;\n\nexport interface CommandExecutorParams<TOptions extends BaseCommandExecutorOptions = BaseCommandExecutorOptions> {\n /** Command-specific arguments */\n args: string[];\n\n /** Command-specific and shared options. */\n options: TOptions;\n\n /** Function to execute the command. */\n execute: CommandAction<TOptions>;\n\n /** Shared program-level configuration. */\n programOptions: ProgramOptions;\n\n /** Verb being run, e.g. `bundle` or `cache clean`. */\n verb: string;\n\n /**\n * By default, the command will run against `cwd` (usually `process.cwd()`).\n * If this option is set, attempt to discover app path(s) instead.\n * (`cwd` will still be preferred if it has a `cloudpack.config.json`.)\n * See {@link AppPathDiscoveryMode} for details.\n */\n discoverAppPaths?: AppPathDiscoveryMode;\n}\n\n/**\n * This class manages orchestration and shared state while executing a command.\n */\n// 'app' is an optional reused option\nexport class CommandExecutor<TOptions extends BaseCommandExecutorOptions> {\n private _options: TOptions;\n private _execute: CommandAction<TOptions>;\n private _programOptions: ProgramOptions;\n private _verb: string;\n private _discoverAppPaths: AppPathDiscoveryMode | undefined;\n private _reporter: TaskReporter;\n private _autoDisposableList: AutoDisposableList;\n private _hasCalledExit = false;\n private _args: string[];\n private _sigintCount = 0;\n private _onInterrupt?: () => void;\n private _getMessageOnInterrupt?: () => string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- options type isn't used\n private static _activeInstances = new Set<CommandExecutor<any>>();\n\n public static async exitAll(params: CommandExitParams): Promise<void> {\n // There should only be one instance at a time, but we assume multiple instances for safety.\n for (const instance of CommandExecutor._activeInstances) {\n await instance._exit(params);\n process.off('SIGINT', instance._sigintHandler);\n }\n CommandExecutor._activeInstances = new Set();\n }\n\n constructor(params: CommandExecutorParams<TOptions>) {\n this._args = params.args;\n this._options = params.options;\n this._execute = params.execute;\n this._programOptions = params.programOptions;\n this._verb = params.verb;\n this._discoverAppPaths = params.discoverAppPaths;\n this._reporter = new TaskReporter();\n this._autoDisposableList = new AutoDisposableList();\n }\n\n /** Run the command. */\n // This has to be a separate method because constructors can't be async.\n public async execute(): Promise<void> {\n CommandExecutor._activeInstances.add(this);\n try {\n // Handle SIGINT (Ctrl+C) gracefully.\n if (!environmentInfo.isJest) {\n process.on('SIGINT', this._sigintHandler);\n }\n\n const contexts = await this._initializeContexts();\n\n if (!Array.isArray(contexts)) {\n await this._exit(contexts);\n return;\n }\n\n const spanName = `${this._verb.toUpperCase().replace(/ /g, '_')}_EXECUTE`;\n const results: CommandExitParams[] = [];\n\n for (const context of contexts) {\n // Call the execute function which is the real command logic\n // (ie: real init command logic, real start command logic, etc.)\n const result = await context.telemetryClient.tracer.startActiveSpan(spanName, async (span) => {\n this._onInterrupt = () => {\n span.setAttribute('isInterrupted', true);\n span.end();\n };\n\n return this._execute({\n ...context,\n span,\n isMultiApp: contexts.length > 1,\n args: this._args,\n options: this._options,\n autoDispose: (disposable) => this._autoDisposableList.add(disposable),\n setInterruptMessageHandler: (getMessage) => {\n this._getMessageOnInterrupt = getMessage;\n },\n });\n });\n if (result?.isInterrupted) {\n return await this._exit(result);\n }\n if (result) {\n results.push(result);\n } else if ((result as unknown) !== null) {\n // If the command returned null, this means it should keep running (e.g. start).\n // We disallow returning undefined to avoid accidents.\n throw new Error('Command executor must return exit options or null');\n }\n this._onInterrupt = undefined;\n }\n\n if (results.length) {\n // If one or more apps returned a result, exit.\n await this._exit({\n message: results.map((r) => r.message).join('\\n'),\n hasErrors: results.some((r) => r.hasErrors),\n // If any app returned a non-zero exit code, use that.\n exitCode: results.find(({ exitCode }) => !!exitCode)?.exitCode,\n });\n }\n } catch (error) {\n // If an error occurs, exit the process with a non-zero exit code.\n await this._exit({\n hasErrors: true,\n message: (error as Error).stack || (error as Error).message || String(error),\n });\n }\n }\n\n /**\n * Determine the app paths and initialize the context for each app.\n * @returns Context(s), or an exit options object if there was an error. (might also throw on error)\n */\n private async _initializeContexts(): Promise<AppCommandContext[] | CommandExitParams> {\n let appPaths: string[];\n\n if (this._discoverAppPaths) {\n // Search for cloudpack configs to determine the app path(s)\n const appPathsResult =\n this._discoverAppPaths === 'remote'\n ? await discoverRemoteAppPaths({\n options: {\n login: (this._options as unknown as Pick<ReusedOptions, 'login'>).login,\n cachePath: this._options.cachePath,\n desiredApp: this._options.app,\n },\n context: {\n reporter: this._reporter,\n },\n })\n : await discoverLocalAppPaths({\n cwd: this._programOptions.cwd,\n discover: this._discoverAppPaths,\n desiredApp: this._options.app,\n });\n if (!Array.isArray(appPathsResult)) {\n // This means there was an error (or the user cancelled) while getting app paths.\n return appPathsResult;\n }\n appPaths = appPathsResult;\n } else {\n // Just use the cwd\n appPaths = [this._programOptions.cwd];\n }\n\n const configOptions = this._getConfigOptionsFromCliOptions();\n\n // The task runner is shared between all apps so that task results can potentially be reused.\n const taskRunner = new TaskRunner();\n\n const contexts: AppCommandContext[] = [];\n\n const helpMessages = new Set<string>();\n\n const configs: Record<string, CloudpackConfig> = {};\n for (const appPath of appPaths) {\n let config: CloudpackConfig;\n\n try {\n config = await readConfig(appPath, {\n ...configOptions,\n extraFeatures: this._options.features,\n });\n } catch (err) {\n await this._exit({\n message: `Invalid cloudpack config: ${(err as Error).message || err}`,\n hasErrors: true,\n });\n // eslint-disable-next-line no-restricted-properties -- this will never be reached, but TypeScript doesn't know that\n process.exit(1);\n }\n if (config.helpMessage) {\n helpMessages.add(config.helpMessage);\n }\n\n configs[appPath] = config;\n }\n\n // Set reporter options and print the product info header\n this._reporter.setOptions({\n productName: 'Cloudpack',\n version: this._programOptions.version,\n description: () => `Running \"${bold(this._programOptions.argv.slice(2).join(' '))}\"`,\n helpMessage: [...helpMessages].join('\\n'),\n plainTextMode: !this._options.color,\n ...(this._options.debug\n ? debugLoggingConfig\n : this._options.verbose\n ? verboseLoggingConfig\n : this._options.quiet\n ? noLoggingConfig\n : defaultLoggingConfig),\n });\n\n for (const appPath of appPaths) {\n const config = configs[appPath];\n const definition = await readJson<PackageJson>(path.join(appPath, 'package.json'));\n const { name = path.basename(appPath) } = definition || {};\n\n const telemetryClient = await this._initTelemetry(name, config);\n // Dispose the telemetry client when the app is closing\n this._autoDisposableList.add({\n dispose: () => telemetryClient.shutdown(),\n });\n\n contexts.push({\n appPath,\n cachePath: this._options.cachePath,\n config,\n reporter: this._reporter,\n telemetryClient,\n taskRunner,\n });\n }\n\n return contexts;\n }\n\n /** Translate certain CLI options into options for `readConfig()`. */\n private _getConfigOptionsFromCliOptions(): ReadConfigOptions {\n // These options don't exist for all commands, but that's fine.\n const options = this._options as Partial<ReusedOptions & SharedOptions>;\n return {\n mode: options.mode,\n logBundleInfo: options.logBundleInfo,\n // Handle --bundler by passing it as a universal package override, which will be appended\n // to any user-provided packageSettings so that it takes precedence.\n extraPackageSettings: options.bundler ? [{ match: '*', bundler: options.bundler }] : undefined,\n };\n }\n\n private async _initTelemetry(appName: string | undefined, config: CloudpackConfig): Promise<TelemetryClient> {\n // Mark the start time for telemetry.\n const startTime = performance.now();\n\n const programOptions = this._programOptions;\n const options = this._options;\n\n const connectionString =\n programOptions.disableTelemetry || environmentInfo.isJest\n ? undefined\n : config.telemetry?.connectionString || environmentInfo.cloudpack.telemetryConnectionString;\n\n const logLevel = options.verbose ? 'VERBOSE' : options.debug ? 'DEBUG' : undefined;\n if (!options.debug) {\n this._reporter.ignoreLogMessage('ApplicationInsights:');\n }\n\n const telemetryClient = await createTelemetryClient({\n productVersion: getVersion(import.meta.url),\n connectionString,\n logLevel,\n serviceNamespace: 'cloudpack',\n serviceName: 'cli',\n });\n\n void telemetryClient.tracer.startActiveSpan('CLI_ENTRY', { startTime: getCliStartTime() }, () => {\n // Retrieve the current telemetry context\n const activeContext = telemetryClient.context.active();\n\n /**\n * Sets the current context as the root context. This ensures that all spans created during this CLI execution\n * will be children of this root span, even though the root span is closed immediately. This helps group all\n * spans under a single root span for better traceability.\n *\n * Typically, the root span should remain open until the CLI exits. However, in environments like Codespaces,\n * the CLI might run indefinitely, which could leave the root span open indefinitely.\n *\n * To prevent this, the root span is closed immediately after it is set as the root context.\n */\n telemetryClient.setRootContext(activeContext);\n });\n\n await telemetryClient.tracer.startActiveSpan('INIT_TELEMETRY', { startTime }, (span) => {\n const enabledFeatureNames = Object.entries(config.features || {})\n .filter(([, value]) => value)\n .map(([key]) => key);\n\n if (enabledFeatureNames.length) {\n console.log(`Enabled features: ${enabledFeatureNames.map((f) => yellow(f)).join(', ')}`);\n }\n\n const telemetryAttributes = {\n verb: this._verb,\n arguments: programOptions.argv.slice(3).join(' '),\n environment: environmentInfo.isCI ? 'ci' : environmentInfo.isCodespaces ? 'codespaces' : 'local',\n appName: appName || '<unknown>',\n mode: config.mode,\n features: enabledFeatureNames,\n externalCorrelationId: environmentInfo.cloudpack.telemetryExternalCorrelationId,\n // Azure DevOps build attributes\n ...environmentInfo.ado,\n };\n\n for (const [key, value] of Object.entries(telemetryAttributes)) {\n if (value) {\n span.setAttribute(key, value);\n }\n }\n });\n\n return telemetryClient;\n }\n\n protected _sigintHandler = (): void => {\n this._sigintCount++;\n\n if (this._sigintCount > 1) {\n console.debug('Forcing exit');\n\n // We are forcing the process to exit.\n // No clean-up is needed because user pressed Ctrl+C twice.\n // eslint-disable-next-line no-restricted-properties -- top-level cleanup\n process.exit(1);\n }\n\n this._onInterrupt?.();\n\n // We are trying to exit gracefully.\n void this._exit({ isInterrupted: true, message: '' });\n };\n\n /**\n * Exit function called with the result returned by the command's execute function,\n * or manually via `CommandExecutor.exitAll()` in tests.\n */\n protected async _exit(params: CommandExitParams): Promise<never> {\n const { hasErrors = this._reporter.hasErrors(), exitCode = hasErrors ? 1 : 0 } = params;\n const message = params.isInterrupted ? this._getMessageOnInterrupt?.() || 'Interrupted by user' : params.message;\n\n if (this._hasCalledExit) {\n // Skip most of the operations if exit() was called multiple times.\n // But only use the error message if not in a test, due to the way we're mocking process.exit.\n if (!environmentInfo.isJest) {\n const prettyParams = Object.entries(params)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(', ');\n console.warn(`exit() was called multiple times. This call's options: ${prettyParams}.`);\n }\n } else {\n this._hasCalledExit = true;\n\n // Dispose all registered disposables.\n await this._autoDisposableList.dispose();\n\n // Show the summary message (this will throw if called twice).\n this._reporter.complete({\n summary: hasErrors ? red(message) : message,\n showHelp: exitCode !== 0,\n });\n }\n\n CommandExecutor._activeInstances.delete(this);\n process.off('SIGINT', this._sigintHandler);\n\n // eslint-disable-next-line no-restricted-properties -- top-level cleanup\n process.exit(exitCode);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CommandExecutor.js","sourceRoot":"","sources":["../../src/utilities/CommandExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,GAAG,EACH,oBAAoB,EACpB,MAAM,GACP,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAA2C,MAAM,yBAAyB,CAAC;AAClG,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AA6BvD;;GAEG;AACH,qCAAqC;AACrC,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAW;IACnB,QAAQ,CAA0B;IAClC,eAAe,CAAiB;IAChC,KAAK,CAAS;IACd,iBAAiB,CAAmC;IACpD,SAAS,CAAe;IACxB,mBAAmB,CAAqB;IACxC,cAAc,GAAG,KAAK,CAAC;IACvB,KAAK,CAAW;IAChB,YAAY,GAAG,CAAC,CAAC;IACjB,YAAY,CAAc;IAC1B,sBAAsB,CAAgB;IAC9C,yFAAyF;IACjF,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE3D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAyB;QACnD,4FAA4F;QAC5F,KAAK,MAAM,QAAQ,IAAI,eAAe,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;QACjD,CAAC;QACD,eAAe,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;IAC/C,CAAC;IAED,YAAY,MAAuC;QACjD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,EAAE,CAAC;QACpC,IAAI,CAAC,mBAAmB,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACtD,CAAC;IAED,uBAAuB;IACvB,wEAAwE;IACjE,KAAK,CAAC,OAAO;QAClB,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,qCAAqC;YACrC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAElD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;YAC1E,MAAM,OAAO,GAAwB,EAAE,CAAC;YAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,4DAA4D;gBAC5D,gEAAgE;gBAChE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC3F,IAAI,CAAC,YAAY,GAAG,GAAG,EAAE;wBACvB,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;wBACzC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACb,CAAC,CAAC;oBAEF,OAAO,IAAI,CAAC,QAAQ,CAAC;wBACnB,GAAG,OAAO;wBACV,IAAI;wBACJ,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;wBAC/B,IAAI,EAAE,IAAI,CAAC,KAAK;wBAChB,OAAO,EAAE,IAAI,CAAC,QAAQ;wBACtB,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;wBACrE,0BAA0B,EAAE,CAAC,UAAU,EAAE,EAAE;4BACzC,IAAI,CAAC,sBAAsB,GAAG,UAAU,CAAC;wBAC3C,CAAC;qBACF,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,IAAI,MAAM,EAAE,aAAa,EAAE,CAAC;oBAC1B,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;qBAAM,IAAK,MAAkB,KAAK,IAAI,EAAE,CAAC;oBACxC,gFAAgF;oBAChF,sDAAsD;oBACtD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;gBACD,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAChC,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,+CAA+C;gBAC/C,MAAM,IAAI,CAAC,KAAK,CAAC;oBACf,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBACjD,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC3C,sDAAsD;oBACtD,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ;iBAC/D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kEAAkE;YAClE,MAAM,IAAI,CAAC,KAAK,CAAC;gBACf,SAAS,EAAE,IAAI;gBACf,OAAO,EAAG,KAAe,CAAC,KAAK,IAAK,KAAe,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;aAC7E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,mBAAmB;QAC/B,IAAI,QAAkB,CAAC;QAEvB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,4DAA4D;YAC5D,MAAM,cAAc,GAClB,IAAI,CAAC,iBAAiB,KAAK,QAAQ;gBACjC,CAAC,CAAC,MAAM,sBAAsB,CAAC;oBAC3B,OAAO,EAAE;wBACP,KAAK,EAAG,IAAI,CAAC,QAAoD,CAAC,KAAK;wBACvE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;wBAClC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;qBAC9B;oBACD,OAAO,EAAE;wBACP,QAAQ,EAAE,IAAI,CAAC,SAAS;qBACzB;iBACF,CAAC;gBACJ,CAAC,CAAC,MAAM,qBAAqB,CAAC;oBAC1B,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG;oBAC7B,QAAQ,EAAE,IAAI,CAAC,iBAAiB;oBAChC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;iBAC9B,CAAC,CAAC;YACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACnC,iFAAiF;gBACjF,OAAO,cAAc,CAAC;YACxB,CAAC;YACD,QAAQ,GAAG,cAAc,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,mBAAmB;YACnB,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAE7D,6FAA6F;QAC7F,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE;YACzC,GAAG,aAAa;YAChB,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;SACtC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;aAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAa,CACzC,CAAC;QAEF,yDAAyD;QACzD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;YACxB,WAAW,EAAE,WAAW;YACxB,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO;YACrC,WAAW,EAAE,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG;YACpF,WAAW,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;YACnC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;gBACrB,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO;oBACrB,CAAC,CAAC,oBAAoB;oBACtB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;wBACnB,CAAC,CAAC,eAAe;wBACjB,CAAC,CAAC,oBAAoB,CAAC;SAC9B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,YAAY,GAAG,cAAc,CAAC;YAClC,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAC3C,QAAQ;YACR,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE;SACvC,CAAC,CAAC;QAEH,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAc,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;YACnF,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,IAAI,EAAE,CAAC;YAE3D,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YAE9E,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO;gBACP,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;gBAClC,MAAM;gBACN,QAAQ,EAAE,IAAI,CAAC,SAAS;gBACxB,eAAe;gBACf,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qEAAqE;IAC7D,+BAA+B;QACrC,+DAA+D;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAkD,CAAC;QACxE,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,yFAAyF;YACzF,oEAAoE;YACpE,oBAAoB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SAC/F,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,OAA2B,EAC3B,MAAuB,EACvB,YAA0B;QAE1B,qCAAqC;QACrC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;QAE5C,MAAM,gBAAgB,GACpB,IAAI,CAAC,eAAe,CAAC,gBAAgB,IAAI,eAAe,CAAC,MAAM;YAC7D,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,IAAI,eAAe,CAAC,SAAS,CAAC,yBAAyB,CAAC;QAEhG,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAE1E,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAEtF,MAAM,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;YACrF,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;iBAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;iBAC5B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAEvB,IAAI,mBAAmB,CAAC,MAAM,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,qBAAqB,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;YAED,MAAM,mBAAmB,GAAG;gBAC1B,IAAI,EAAE,IAAI,CAAC,KAAK;gBAChB,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjD,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO;gBAChG,OAAO,EAAE,OAAO,IAAI,WAAW;gBAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,mBAAmB;gBAC7B,qBAAqB,EAAE,eAAe,CAAC,SAAS,CAAC,8BAA8B;gBAC/E,gCAAgC;gBAChC,GAAG,eAAe,CAAC,GAAG;aACvB,CAAC;YAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC/D,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,eAAe,CAAC;IACzB,CAAC;IAES,cAAc,GAAG,GAAS,EAAE;QACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAE9B,sCAAsC;YACtC,2DAA2D;YAC3D,yEAAyE;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QAEtB,oCAAoC;QACpC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF;;;OAGG;IACO,KAAK,CAAC,KAAK,CAAC,MAAyB;QAC7C,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAEjH,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,mEAAmE;YACnE,8FAA8F;YAC9F,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;qBACxC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;qBAC1C,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,0DAA0D,YAAY,GAAG,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAE3B,sCAAsC;YACtC,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YAEzC,8DAA8D;YAC9D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACtB,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;gBAC3C,QAAQ,EAAE,QAAQ,KAAK,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;QAED,eAAe,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3C,yEAAyE;QACzE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC","sourcesContent":["import type { ReadConfigOptions } from '@ms-cloudpack/config';\nimport type { CloudpackConfig, PackageJson } from '@ms-cloudpack/common-types';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport {\n TaskReporter,\n bold,\n debugLoggingConfig,\n defaultLoggingConfig,\n noLoggingConfig,\n red,\n verboseLoggingConfig,\n yellow,\n} from '@ms-cloudpack/task-reporter';\nimport { startTelemetry, type TelemetryApi, type TelemetryClient } from '@ms-cloudpack/telemetry';\nimport path from 'path';\nimport type { CommandAction, CommandExitParams, AppCommandContext } from '../types/CommandAction.js';\nimport type { ProgramOptions } from '../types/ProgramOptions.js';\nimport type { SharedOptions } from '../types/SharedOptions.js';\nimport { AutoDisposableList } from './AutoDisposableList.js';\nimport { getVersion } from '@ms-cloudpack/package-utilities';\nimport { environmentInfo } from '@ms-cloudpack/environment';\nimport type { ReusedOptions } from '../types/ReusedOptions.js';\nimport type { AppPathDiscoveryMode } from '../types/AppPathDiscoveryMode.js';\nimport { discoverRemoteAppPaths } from './discoverRemoteAppPaths.js';\nimport { discoverLocalAppPaths } from './discoverLocalAppPaths.js';\nimport { TaskRunner } from '@ms-cloudpack/api-server';\nimport { readLocalConfigs } from './readLocalConfigs.js';\nimport { readRemoteConfigs } from './readRemoteConfigs.js';\nimport { getCliStartTime } from './getCliStartTime.js';\n\nexport type BaseCommandExecutorOptions = SharedOptions & Pick<ReusedOptions, 'app'>;\n\nexport interface CommandExecutorParams<TOptions extends BaseCommandExecutorOptions = BaseCommandExecutorOptions> {\n /** Command-specific arguments */\n args: string[];\n\n /** Command-specific and shared options. */\n options: TOptions;\n\n /** Function to execute the command. */\n execute: CommandAction<TOptions>;\n\n /** Shared program-level configuration. */\n programOptions: ProgramOptions;\n\n /** Verb being run, e.g. `bundle` or `cache clean`. */\n verb: string;\n\n /**\n * By default, the command will run against `cwd` (usually `process.cwd()`).\n * If this option is set, attempt to discover app path(s) instead.\n * (`cwd` will still be preferred if it has a `cloudpack.config.json`.)\n * See {@link AppPathDiscoveryMode} for details.\n */\n discoverAppPaths?: AppPathDiscoveryMode;\n}\n\n/**\n * This class manages orchestration and shared state while executing a command.\n */\n// 'app' is an optional reused option\nexport class CommandExecutor<TOptions extends BaseCommandExecutorOptions> {\n private _options: TOptions;\n private _execute: CommandAction<TOptions>;\n private _programOptions: ProgramOptions;\n private _verb: string;\n private _discoverAppPaths: AppPathDiscoveryMode | undefined;\n private _reporter: TaskReporter;\n private _autoDisposableList: AutoDisposableList;\n private _hasCalledExit = false;\n private _args: string[];\n private _sigintCount = 0;\n private _onInterrupt?: () => void;\n private _getMessageOnInterrupt?: () => string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- options type isn't used\n private static _activeInstances = new Set<CommandExecutor<any>>();\n\n public static async exitAll(params: CommandExitParams): Promise<void> {\n // There should only be one instance at a time, but we assume multiple instances for safety.\n for (const instance of CommandExecutor._activeInstances) {\n await instance._exit(params);\n process.off('SIGINT', instance._sigintHandler);\n }\n CommandExecutor._activeInstances = new Set();\n }\n\n constructor(params: CommandExecutorParams<TOptions>) {\n this._args = params.args;\n this._options = params.options;\n this._execute = params.execute;\n this._programOptions = params.programOptions;\n this._verb = params.verb;\n this._discoverAppPaths = params.discoverAppPaths;\n this._reporter = new TaskReporter();\n this._autoDisposableList = new AutoDisposableList();\n }\n\n /** Run the command. */\n // This has to be a separate method because constructors can't be async.\n public async execute(): Promise<void> {\n CommandExecutor._activeInstances.add(this);\n try {\n // Handle SIGINT (Ctrl+C) gracefully.\n if (!environmentInfo.isJest) {\n process.on('SIGINT', this._sigintHandler);\n }\n\n const contexts = await this._initializeContexts();\n\n if (!Array.isArray(contexts)) {\n await this._exit(contexts);\n return;\n }\n\n const spanName = `${this._verb.toUpperCase().replace(/ /g, '_')}_EXECUTE`;\n const results: CommandExitParams[] = [];\n\n for (const context of contexts) {\n // Call the execute function which is the real command logic\n // (ie: real init command logic, real start command logic, etc.)\n const result = await context.telemetryClient.tracer.startActiveSpan(spanName, async (span) => {\n this._onInterrupt = () => {\n span.setAttribute('isInterrupted', true);\n span.end();\n };\n\n return this._execute({\n ...context,\n span,\n isMultiApp: contexts.length > 1,\n args: this._args,\n options: this._options,\n autoDispose: (disposable) => this._autoDisposableList.add(disposable),\n setInterruptMessageHandler: (getMessage) => {\n this._getMessageOnInterrupt = getMessage;\n },\n });\n });\n if (result?.isInterrupted) {\n return await this._exit(result);\n }\n if (result) {\n results.push(result);\n } else if ((result as unknown) !== null) {\n // If the command returned null, this means it should keep running (e.g. start).\n // We disallow returning undefined to avoid accidents.\n throw new Error('Command executor must return exit options or null');\n }\n this._onInterrupt = undefined;\n }\n\n if (results.length) {\n // If one or more apps returned a result, exit.\n await this._exit({\n message: results.map((r) => r.message).join('\\n'),\n hasErrors: results.some((r) => r.hasErrors),\n // If any app returned a non-zero exit code, use that.\n exitCode: results.find(({ exitCode }) => !!exitCode)?.exitCode,\n });\n }\n } catch (error) {\n // If an error occurs, exit the process with a non-zero exit code.\n await this._exit({\n hasErrors: true,\n message: (error as Error).stack || (error as Error).message || String(error),\n });\n }\n }\n\n /**\n * Determine the app paths and initialize the context for each app.\n * @returns Context(s), or an exit options object if there was an error. (might also throw on error)\n */\n private async _initializeContexts(): Promise<AppCommandContext[] | CommandExitParams> {\n let appPaths: string[];\n\n if (this._discoverAppPaths) {\n // Search for cloudpack configs to determine the app path(s)\n const appPathsResult =\n this._discoverAppPaths === 'remote'\n ? await discoverRemoteAppPaths({\n options: {\n login: (this._options as unknown as Pick<ReusedOptions, 'login'>).login,\n cachePath: this._options.cachePath,\n desiredApp: this._options.app,\n },\n context: {\n reporter: this._reporter,\n },\n })\n : await discoverLocalAppPaths({\n cwd: this._programOptions.cwd,\n discover: this._discoverAppPaths,\n desiredApp: this._options.app,\n });\n if (!Array.isArray(appPathsResult)) {\n // This means there was an error (or the user cancelled) while getting app paths.\n return appPathsResult;\n }\n appPaths = appPathsResult;\n } else {\n // Just use the cwd\n appPaths = [this._programOptions.cwd];\n }\n\n const configOptions = this._getConfigOptionsFromCliOptions();\n\n // The task runner is shared between all apps so that task results can potentially be reused.\n const taskRunner = new TaskRunner();\n\n const readConfig = this._discoverAppPaths === 'remote' ? readRemoteConfigs : readLocalConfigs;\n const configs = await readConfig(appPaths, {\n ...configOptions,\n extraFeatures: this._options.features,\n });\n\n const helpMessages = new Set<string>(\n Object.values(configs)\n .filter((c) => c.helpMessage)\n .map((c) => c.helpMessage) as string[],\n );\n\n // Set reporter options and print the product info header\n this._reporter.setOptions({\n productName: 'Cloudpack',\n version: this._programOptions.version,\n description: () => `Running \"${bold(this._programOptions.argv.slice(2).join(' '))}\"`,\n helpMessage: [...helpMessages].join('\\n'),\n plainTextMode: !this._options.color,\n ...(this._options.debug\n ? debugLoggingConfig\n : this._options.verbose\n ? verboseLoggingConfig\n : this._options.quiet\n ? noLoggingConfig\n : defaultLoggingConfig),\n });\n\n const contexts: AppCommandContext[] = [];\n\n const logLevel = this._options.verbose ? 'VERBOSE' : this._options.debug ? 'DEBUG' : undefined;\n if (!this._options.debug) {\n this._reporter.ignoreLogMessage('ApplicationInsights:');\n }\n\n const telemetryApi = startTelemetry({\n productVersion: getVersion(import.meta.url),\n logLevel,\n serviceName: 'cli',\n });\n\n this._autoDisposableList.add({\n dispose: () => telemetryApi.shutdown(),\n });\n\n for (const appPath of Object.keys(configs)) {\n const config = configs[appPath];\n const definition = await readJson<PackageJson>(path.join(appPath, 'package.json'));\n const { name = path.basename(appPath) } = definition || {};\n\n const telemetryClient = await this._initTelemetry(name, config, telemetryApi);\n\n contexts.push({\n appPath,\n cachePath: this._options.cachePath,\n config,\n reporter: this._reporter,\n telemetryClient,\n taskRunner,\n });\n }\n\n return contexts;\n }\n\n /** Translate certain CLI options into options for `readConfig()`. */\n private _getConfigOptionsFromCliOptions(): ReadConfigOptions {\n // These options don't exist for all commands, but that's fine.\n const options = this._options as Partial<ReusedOptions & SharedOptions>;\n return {\n mode: options.mode,\n logBundleInfo: options.logBundleInfo,\n // Handle --bundler by passing it as a universal package override, which will be appended\n // to any user-provided packageSettings so that it takes precedence.\n extraPackageSettings: options.bundler ? [{ match: '*', bundler: options.bundler }] : undefined,\n };\n }\n\n private async _initTelemetry(\n appName: string | undefined,\n config: CloudpackConfig,\n telemetryApi: TelemetryApi,\n ): Promise<TelemetryClient> {\n // Mark the start time for telemetry.\n const startTime = performance.now();\n\n const programOptions = this._programOptions;\n\n const connectionString =\n this._programOptions.disableTelemetry || environmentInfo.isJest\n ? undefined\n : config.telemetry?.connectionString || environmentInfo.cloudpack.telemetryConnectionString;\n\n const telemetryClient = await telemetryApi.createClient(connectionString);\n\n telemetryClient.tracer.startSpan('CLI_ENTRY', { startTime: getCliStartTime() }).end();\n\n await telemetryClient.tracer.startActiveSpan('INIT_TELEMETRY', { startTime }, (span) => {\n const enabledFeatureNames = Object.entries(config.features || {})\n .filter(([, value]) => value)\n .map(([key]) => key);\n\n if (enabledFeatureNames.length) {\n console.log(`Enabled features: ${enabledFeatureNames.map((f) => yellow(f)).join(', ')}`);\n }\n\n const telemetryAttributes = {\n verb: this._verb,\n arguments: programOptions.argv.slice(3).join(' '),\n environment: environmentInfo.isCI ? 'ci' : environmentInfo.isCodespaces ? 'codespaces' : 'local',\n appName: appName || '<unknown>',\n mode: config.mode,\n features: enabledFeatureNames,\n externalCorrelationId: environmentInfo.cloudpack.telemetryExternalCorrelationId,\n // Azure DevOps build attributes\n ...environmentInfo.ado,\n };\n\n for (const [key, value] of Object.entries(telemetryAttributes)) {\n if (value) {\n span.setAttribute(key, value);\n }\n }\n });\n\n return telemetryClient;\n }\n\n protected _sigintHandler = (): void => {\n this._sigintCount++;\n\n if (this._sigintCount > 1) {\n console.debug('Forcing exit');\n\n // We are forcing the process to exit.\n // No clean-up is needed because user pressed Ctrl+C twice.\n // eslint-disable-next-line no-restricted-properties -- top-level cleanup\n process.exit(1);\n }\n\n this._onInterrupt?.();\n\n // We are trying to exit gracefully.\n void this._exit({ isInterrupted: true, message: '' });\n };\n\n /**\n * Exit function called with the result returned by the command's execute function,\n * or manually via `CommandExecutor.exitAll()` in tests.\n */\n protected async _exit(params: CommandExitParams): Promise<never> {\n const { hasErrors = this._reporter.hasErrors(), exitCode = hasErrors ? 1 : 0 } = params;\n const message = params.isInterrupted ? this._getMessageOnInterrupt?.() || 'Interrupted by user' : params.message;\n\n if (this._hasCalledExit) {\n // Skip most of the operations if exit() was called multiple times.\n // But only use the error message if not in a test, due to the way we're mocking process.exit.\n if (!environmentInfo.isJest) {\n const prettyParams = Object.entries(params)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(', ');\n console.warn(`exit() was called multiple times. This call's options: ${prettyParams}.`);\n }\n } else {\n this._hasCalledExit = true;\n\n // Dispose all registered disposables.\n await this._autoDisposableList.dispose();\n\n // Show the summary message (this will throw if called twice).\n this._reporter.complete({\n summary: hasErrors ? red(message) : message,\n showHelp: exitCode !== 0,\n });\n }\n\n CommandExecutor._activeInstances.delete(this);\n process.off('SIGINT', this._sigintHandler);\n\n // eslint-disable-next-line no-restricted-properties -- top-level cleanup\n process.exit(exitCode);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discoverRemoteAppPaths.d.ts","sourceRoot":"","sources":["../../src/utilities/discoverRemoteAppPaths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"discoverRemoteAppPaths.d.ts","sourceRoot":"","sources":["../../src/utilities/discoverRemoteAppPaths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGxD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnC,OAAO,EAAE;QACP;;;;;WAKG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GAClC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;CAChC,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC,CAiExC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getCachePath } from '@ms-cloudpack/config';
|
|
2
2
|
import { selectItemFromPaginatedResults } from './selectItemFromPaginatedResults.js';
|
|
3
3
|
import { createNoOpTelemetryClient } from '@ms-cloudpack/telemetry';
|
|
4
|
+
import path from 'path';
|
|
4
5
|
export async function discoverRemoteAppPaths(params) {
|
|
5
6
|
const { options } = params;
|
|
6
7
|
const { desiredApp, login } = options;
|
|
@@ -43,11 +44,15 @@ export async function discoverRemoteAppPaths(params) {
|
|
|
43
44
|
container: version.container,
|
|
44
45
|
},
|
|
45
46
|
});
|
|
46
|
-
const
|
|
47
|
+
const targetPath = path.join(cachePath, version.localBundleFolderName);
|
|
48
|
+
const downloadStatus = await remoteCacheClient.downloadFolder({
|
|
47
49
|
friendlyName: `${app.name}-${version.version}`,
|
|
48
50
|
id: version.resourceId,
|
|
49
|
-
path:
|
|
51
|
+
path: targetPath,
|
|
50
52
|
});
|
|
51
|
-
|
|
53
|
+
if (downloadStatus === 'not-found') {
|
|
54
|
+
return { message: 'The specified resource was not found in the remote cache.', hasErrors: true };
|
|
55
|
+
}
|
|
56
|
+
return [path.join(targetPath, '__cloudpack')];
|
|
52
57
|
}
|
|
53
58
|
//# sourceMappingURL=discoverRemoteAppPaths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discoverRemoteAppPaths.js","sourceRoot":"","sources":["../../src/utilities/discoverRemoteAppPaths.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AAGrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"discoverRemoteAppPaths.js","sourceRoot":"","sources":["../../src/utilities/discoverRemoteAppPaths.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AAGrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAY5C;IACC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC3B,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEtC,MAAM,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAExG,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG;QACd,GAAG,MAAM,CAAC,OAAO;QACjB,eAAe,EAAE,yBAAyB,EAAE;KAC7C,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC;QAC3C,OAAO,EAAE;YACP,SAAS;YACT,WAAW,EAAE,KAAK;SACnB;QACD,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,8BAA8B,CAAkB;QAChE,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC;QACnE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAAyB;QAC3E,OAAO,EAAE,yBAAyB,GAAG,CAAC,IAAI,oBAAoB;QAC9D,OAAO,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC;QACrE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO;KACjC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAM,uBAAuB,CAAC;QACtD,OAAO;QACP,OAAO,EAAE;YACP,SAAS;YACT,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B;KACF,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEvE,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC;QAC5D,YAAY,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE;QAC9C,EAAE,EAAE,OAAO,CAAC,UAAU;QACtB,IAAI,EAAE,UAAU;KACjB,CAAC,CAAC;IAEH,IAAI,cAAc,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,2DAA2D,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnG,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;AAChD,CAAC","sourcesContent":["import type { AppRegistration, AppRegistrationVersion } from '@ms-cloudpack/remote-cache';\nimport type { CommandExitParams } from '../types/CommandAction.js';\nimport { getCachePath } from '@ms-cloudpack/config';\nimport { selectItemFromPaginatedResults } from './selectItemFromPaginatedResults.js';\nimport type { SharedOptions } from '../types/SharedOptions.js';\nimport type { ReusedOptions } from '../types/ReusedOptions.js';\nimport { createNoOpTelemetryClient } from '@ms-cloudpack/telemetry';\nimport type { Context } from '@ms-cloudpack/api-server';\nimport path from 'path';\n\nexport async function discoverRemoteAppPaths(params: {\n context: Pick<Context, 'reporter'>;\n options: {\n /**\n * Desired app name or substring, from the `--app` option.\n * - If there's an exact match, only that app will be returned.\n * - If multiple apps match a substring, see `discover` for behavior.\n * - If no match, it's an error.\n */\n desiredApp?: string;\n } & Pick<SharedOptions, 'cachePath'> &\n Pick<ReusedOptions, 'login'>;\n}): Promise<string[] | CommandExitParams> {\n const { options } = params;\n const { desiredApp, login } = options;\n\n const { createRemoteCacheClient, createAppRegistryClient } = await import('@ms-cloudpack/remote-cache');\n\n const cachePath = await getCachePath(options.cachePath);\n\n const context = {\n ...params.context,\n telemetryClient: createNoOpTelemetryClient(),\n };\n\n const client = await createAppRegistryClient({\n options: {\n cachePath,\n loginMethod: login,\n },\n context,\n });\n\n const app = await selectItemFromPaginatedResults<AppRegistration>({\n message: 'Select the app you want to start',\n getPage: (pageSettings) => client.getApps(desiredApp, pageSettings),\n getTitle: (item) => item.name,\n });\n\n if (!app) {\n return { isInterrupted: true, message: '' };\n }\n\n const version = await selectItemFromPaginatedResults<AppRegistrationVersion>({\n message: `Select the version of ${app.name} you want to start`,\n getPage: (pageSettings) => client.getVersions(app.name, pageSettings),\n getTitle: (item) => item.version,\n });\n\n if (!version) {\n return { isInterrupted: true, message: '' };\n }\n\n const remoteCacheClient = await createRemoteCacheClient({\n context,\n options: {\n cachePath,\n loginMethod: login,\n storageAccount: version.storageAccount,\n tenantId: version.tenantId,\n container: version.container,\n },\n });\n\n const targetPath = path.join(cachePath, version.localBundleFolderName);\n\n const downloadStatus = await remoteCacheClient.downloadFolder({\n friendlyName: `${app.name}-${version.version}`,\n id: version.resourceId,\n path: targetPath,\n });\n\n if (downloadStatus === 'not-found') {\n return { message: 'The specified resource was not found in the remote cache.', hasErrors: true };\n }\n\n return [path.join(targetPath, '__cloudpack')];\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CloudpackConfig } from '@ms-cloudpack/common-types';
|
|
2
|
+
import { type ReadConfigOptions } from '@ms-cloudpack/config';
|
|
3
|
+
export declare class InvalidCloudpackConfigError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare const readLocalConfigs: (appPaths: string[], readConfigOptions: ReadConfigOptions) => Promise<Record<string, CloudpackConfig>>;
|
|
7
|
+
//# sourceMappingURL=readLocalConfigs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readLocalConfigs.d.ts","sourceRoot":"","sources":["../../src/utilities/readLocalConfigs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,eAAO,MAAM,gBAAgB,aACjB,MAAM,EAAE,qBACC,iBAAiB,KACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAgBzC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { readConfig } from '@ms-cloudpack/config';
|
|
2
|
+
export class InvalidCloudpackConfigError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'InvalidCloudpackConfigError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export const readLocalConfigs = async (appPaths, readConfigOptions) => {
|
|
9
|
+
const configs = {};
|
|
10
|
+
for (const appPath of appPaths) {
|
|
11
|
+
let config;
|
|
12
|
+
try {
|
|
13
|
+
config = await readConfig(appPath, readConfigOptions);
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
throw new InvalidCloudpackConfigError(`Invalid cloudpack config in ${appPath}: ${err.message || err}`);
|
|
17
|
+
}
|
|
18
|
+
configs[appPath] = config;
|
|
19
|
+
}
|
|
20
|
+
return configs;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=readLocalConfigs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readLocalConfigs.js","sourceRoot":"","sources":["../../src/utilities/readLocalConfigs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAA0B,MAAM,sBAAsB,CAAC;AAE1E,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,QAAkB,EAClB,iBAAoC,EACM,EAAE;IAC5C,MAAM,OAAO,GAAoC,EAAE,CAAC;IAEpD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAuB,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,2BAA2B,CAAC,+BAA+B,OAAO,KAAM,GAAa,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;QACpH,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;IAC5B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import type { CloudpackConfig } from '@ms-cloudpack/common-types';\nimport { readConfig, type ReadConfigOptions } from '@ms-cloudpack/config';\n\nexport class InvalidCloudpackConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidCloudpackConfigError';\n }\n}\n\nexport const readLocalConfigs = async (\n appPaths: string[],\n readConfigOptions: ReadConfigOptions,\n): Promise<Record<string, CloudpackConfig>> => {\n const configs: Record<string, CloudpackConfig> = {};\n\n for (const appPath of appPaths) {\n let config: CloudpackConfig;\n\n try {\n config = await readConfig(appPath, readConfigOptions);\n } catch (err) {\n throw new InvalidCloudpackConfigError(`Invalid cloudpack config in ${appPath}: ${(err as Error).message || err}`);\n }\n\n configs[appPath] = config;\n }\n\n return configs;\n};\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CloudpackConfig } from '@ms-cloudpack/common-types';
|
|
2
|
+
import { type ReadConfigOptions } from '@ms-cloudpack/config';
|
|
3
|
+
export declare const readRemoteConfigs: (appPaths: string[], readConfigOptions: ReadConfigOptions) => Promise<Record<string, CloudpackConfig>>;
|
|
4
|
+
//# sourceMappingURL=readRemoteConfigs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readRemoteConfigs.d.ts","sourceRoot":"","sources":["../../src/utilities/readRemoteConfigs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGvF,eAAO,MAAM,iBAAiB,aAClB,MAAM,EAAE,qBACC,iBAAiB,KACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAezC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { addReadAppConfigOptions } from '@ms-cloudpack/config';
|
|
2
|
+
import { readJson } from '@ms-cloudpack/json-utilities';
|
|
3
|
+
export const readRemoteConfigs = async (appPaths, readConfigOptions) => {
|
|
4
|
+
const configs = {};
|
|
5
|
+
for (const appPath of appPaths) {
|
|
6
|
+
const cloudAppContext = await readJson(`${appPath}/cloudpack-context.json`);
|
|
7
|
+
if (!cloudAppContext) {
|
|
8
|
+
throw new Error(`Could not find cloudpack-context.json in ${appPath}. This must be a Cloudpack bug, please report it.`);
|
|
9
|
+
}
|
|
10
|
+
configs[appPath] = addReadAppConfigOptions(cloudAppContext.config, readConfigOptions);
|
|
11
|
+
}
|
|
12
|
+
return configs;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=readRemoteConfigs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readRemoteConfigs.js","sourceRoot":"","sources":["../../src/utilities/readRemoteConfigs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAA0B,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,QAAkB,EAClB,iBAAoC,EACM,EAAE;IAC5C,MAAM,OAAO,GAAoC,EAAE,CAAC;IAEpD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAkB,GAAG,OAAO,yBAAyB,CAAC,CAAC;QAC7F,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,4CAA4C,OAAO,mDAAmD,CACvG,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,GAAG,uBAAuB,CAAC,eAAe,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import type { CloudAppContext } from '@ms-cloudpack/api-server';\nimport type { CloudpackConfig } from '@ms-cloudpack/common-types';\nimport { addReadAppConfigOptions, type ReadConfigOptions } from '@ms-cloudpack/config';\nimport { readJson } from '@ms-cloudpack/json-utilities';\n\nexport const readRemoteConfigs = async (\n appPaths: string[],\n readConfigOptions: ReadConfigOptions,\n): Promise<Record<string, CloudpackConfig>> => {\n const configs: Record<string, CloudpackConfig> = {};\n\n for (const appPath of appPaths) {\n const cloudAppContext = await readJson<CloudAppContext>(`${appPath}/cloudpack-context.json`);\n if (!cloudAppContext) {\n throw new Error(\n `Could not find cloudpack-context.json in ${appPath}. This must be a Cloudpack bug, please report it.`,\n );\n }\n\n configs[appPath] = addReadAppConfigOptions(cloudAppContext.config, readConfigOptions);\n }\n\n return configs;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ms-cloudpack/cli",
|
|
3
|
-
"version": "0.72.
|
|
3
|
+
"version": "0.72.68",
|
|
4
4
|
"description": "The Cloudpack command line interface - a tool for managing fast inner and outer looping in web apps.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -10,21 +10,21 @@
|
|
|
10
10
|
"cloudpack": "./bin/cloudpack.js"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@ms-cloudpack/api-server": "^0.61.
|
|
14
|
-
"@ms-cloudpack/app-server": "^0.17.
|
|
15
|
-
"@ms-cloudpack/bundler": "^0.24.
|
|
13
|
+
"@ms-cloudpack/api-server": "^0.61.11",
|
|
14
|
+
"@ms-cloudpack/app-server": "^0.17.63",
|
|
15
|
+
"@ms-cloudpack/bundler": "^0.24.8",
|
|
16
16
|
"@ms-cloudpack/common-types": "^0.24.10",
|
|
17
|
-
"@ms-cloudpack/config": "^0.33.
|
|
17
|
+
"@ms-cloudpack/config": "^0.33.21",
|
|
18
18
|
"@ms-cloudpack/environment": "^0.1.1",
|
|
19
19
|
"@ms-cloudpack/json-utilities": "^0.1.10",
|
|
20
|
-
"@ms-cloudpack/overlay": "^0.17.
|
|
20
|
+
"@ms-cloudpack/overlay": "^0.17.144",
|
|
21
21
|
"@ms-cloudpack/package-utilities": "^12.0.1",
|
|
22
22
|
"@ms-cloudpack/path-string-parsing": "^1.2.6",
|
|
23
23
|
"@ms-cloudpack/path-utilities": "^3.0.7",
|
|
24
|
-
"@ms-cloudpack/remote-cache": "^0.10.
|
|
24
|
+
"@ms-cloudpack/remote-cache": "^0.10.18",
|
|
25
25
|
"@ms-cloudpack/setup-utilities": "^0.5.17",
|
|
26
26
|
"@ms-cloudpack/task-reporter": "^0.16.0",
|
|
27
|
-
"@ms-cloudpack/telemetry": "^0.
|
|
27
|
+
"@ms-cloudpack/telemetry": "^0.11.0",
|
|
28
28
|
"@yarnpkg/lockfile": "^1.1.0",
|
|
29
29
|
"commander": "^13.0.0",
|
|
30
30
|
"cross-spawn": "^7.0.3",
|