@shopify/cli-kit 4.9.5 → 5.0.1
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/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.d.ts +5 -0
- package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.js +22 -0
- package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.js.map +1 -1
- package/dist/private/node/api/graphql.d.ts +2 -1
- package/dist/private/node/api/graphql.js +12 -1
- package/dist/private/node/api/graphql.js.map +1 -1
- package/dist/private/node/api.d.ts +2 -0
- package/dist/private/node/api.js +49 -22
- package/dist/private/node/api.js.map +1 -1
- package/dist/private/node/command-json-schema.js +1 -0
- package/dist/private/node/command-json-schema.js.map +1 -1
- package/dist/private/node/constants.d.ts +1 -0
- package/dist/private/node/constants.js +1 -0
- package/dist/private/node/constants.js.map +1 -1
- package/dist/private/node/dev-instance-output.d.ts +47 -0
- package/dist/private/node/dev-instance-output.js +143 -0
- package/dist/private/node/dev-instance-output.js.map +1 -0
- package/dist/private/node/json-error.d.ts +1 -15
- package/dist/private/node/json-error.js +4 -98
- package/dist/private/node/json-error.js.map +1 -1
- package/dist/private/node/output-context.d.ts +8 -0
- package/dist/private/node/output-context.js +10 -0
- package/dist/private/node/output-context.js.map +1 -0
- package/dist/private/node/output.test.js +4 -4
- package/dist/private/node/output.test.js.map +1 -1
- package/dist/private/node/session/automation-token.d.ts +50 -0
- package/dist/private/node/session/automation-token.js +77 -0
- package/dist/private/node/session/automation-token.js.map +1 -0
- package/dist/private/node/session/exchange.d.ts +5 -1
- package/dist/private/node/session/exchange.js +97 -7
- package/dist/private/node/session/exchange.js.map +1 -1
- package/dist/private/node/session/permanent-store-domain.d.ts +21 -0
- package/dist/private/node/session/permanent-store-domain.js +72 -0
- package/dist/private/node/session/permanent-store-domain.js.map +1 -0
- package/dist/private/node/session.d.ts +3 -2
- package/dist/private/node/session.js +12 -3
- package/dist/private/node/session.js.map +1 -1
- package/dist/private/node/themes/trust-challenge.d.ts +31 -0
- package/dist/private/node/themes/trust-challenge.js +143 -0
- package/dist/private/node/themes/trust-challenge.js.map +1 -0
- package/dist/private/node/ui/alert.js +1 -1
- package/dist/private/node/ui/alert.js.map +1 -1
- package/dist/private/node/ui/components/ConcurrentOutput.d.ts +2 -7
- package/dist/private/node/ui/components/ConcurrentOutput.js +4 -8
- package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
- package/dist/private/node/ui/components/LoadingBar.js +9 -15
- package/dist/private/node/ui/components/LoadingBar.js.map +1 -1
- package/dist/private/node/ui/components/LoadingBar.test.js +45 -107
- package/dist/private/node/ui/components/LoadingBar.test.js.map +1 -1
- package/dist/private/node/ui/components/LoadingIndicator.d.ts +7 -0
- package/dist/private/node/ui/components/LoadingIndicator.js +22 -0
- package/dist/private/node/ui/components/LoadingIndicator.js.map +1 -0
- package/dist/private/node/ui/components/Table/Table.d.ts +8 -0
- package/dist/private/node/ui/components/Table/Table.js +18 -2
- package/dist/private/node/ui/components/Table/Table.js.map +1 -1
- package/dist/public/common/version.d.ts +1 -1
- package/dist/public/common/version.js +1 -1
- package/dist/public/common/version.js.map +1 -1
- package/dist/public/node/api/admin.js +13 -0
- package/dist/public/node/api/admin.js.map +1 -1
- package/dist/public/node/api/graphql.js +38 -7
- package/dist/public/node/api/graphql.js.map +1 -1
- package/dist/public/node/archiver.js +13 -6
- package/dist/public/node/archiver.js.map +1 -1
- package/dist/public/node/base-command.d.ts +6 -0
- package/dist/public/node/base-command.js +97 -16
- package/dist/public/node/base-command.js.map +1 -1
- package/dist/public/node/dev-instance.d.ts +138 -0
- package/dist/public/node/dev-instance.js +365 -0
- package/dist/public/node/dev-instance.js.map +1 -0
- package/dist/public/node/environment.d.ts +6 -3
- package/dist/public/node/environment.js +11 -4
- package/dist/public/node/environment.js.map +1 -1
- package/dist/public/node/error/index.js +2 -1
- package/dist/public/node/error/index.js.map +1 -1
- package/dist/public/node/error/schema.d.ts +24 -24
- package/dist/public/node/error/serialization.d.ts +8 -0
- package/dist/public/node/error/serialization.js +103 -0
- package/dist/public/node/error/serialization.js.map +1 -0
- package/dist/public/node/graphiql/server.js +18 -2
- package/dist/public/node/graphiql/server.js.map +1 -1
- package/dist/public/node/is-global.js +2 -1
- package/dist/public/node/is-global.js.map +1 -1
- package/dist/public/node/notifications-system.d.ts +6 -6
- package/dist/public/node/path.d.ts +19 -3
- package/dist/public/node/path.js +21 -3
- package/dist/public/node/path.js.map +1 -1
- package/dist/public/node/session.d.ts +38 -3
- package/dist/public/node/session.js +56 -9
- package/dist/public/node/session.js.map +1 -1
- package/dist/public/node/system.d.ts +4 -0
- package/dist/public/node/system.js +39 -9
- package/dist/public/node/system.js.map +1 -1
- package/dist/public/node/themes/api.d.ts +9 -0
- package/dist/public/node/themes/api.js +50 -22
- package/dist/public/node/themes/api.js.map +1 -1
- package/dist/public/node/themes/theme-manager.d.ts +8 -1
- package/dist/public/node/themes/theme-manager.js +1 -1
- package/dist/public/node/themes/theme-manager.js.map +1 -1
- package/dist/public/node/tree-kill.js +12 -2
- package/dist/public/node/tree-kill.js.map +1 -1
- package/dist/public/node/ui/components.d.ts +1 -0
- package/dist/public/node/ui/components.js +1 -0
- package/dist/public/node/ui/components.js.map +1 -1
- package/dist/public/node/ui.d.ts +24 -4
- package/dist/public/node/ui.js +54 -21
- package/dist/public/node/ui.js.map +1 -1
- package/dist/public/node/upgrade/output.d.ts +17 -0
- package/dist/public/node/upgrade/output.js +51 -0
- package/dist/public/node/upgrade/output.js.map +1 -0
- package/dist/public/node/upgrade/result.d.ts +8 -0
- package/dist/public/node/upgrade/result.js +21 -0
- package/dist/public/node/upgrade/result.js.map +1 -0
- package/dist/public/node/upgrade/types.d.ts +61 -0
- package/dist/public/node/upgrade/types.js +46 -0
- package/dist/public/node/upgrade/types.js.map +1 -0
- package/dist/public/node/upgrade.d.ts +8 -0
- package/dist/public/node/upgrade.js +57 -22
- package/dist/public/node/upgrade.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/private/node/ui/components/TextAnimation.d.ts +0 -10
- package/dist/private/node/ui/components/TextAnimation.js +0 -56
- package/dist/private/node/ui/components/TextAnimation.js.map +0 -1
- package/dist/private/node/ui/components/TextAnimation.test.d.ts +0 -1
- package/dist/private/node/ui/components/TextAnimation.test.js +0 -73
- package/dist/private/node/ui/components/TextAnimation.test.js.map +0 -1
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { isDevelopment } from './context/local.js';
|
|
2
2
|
import { addPublicMetadata } from './metadata.js';
|
|
3
3
|
import { AbortError } from './error.js';
|
|
4
|
-
import { runWithCommandEventsForCommand } from './command-events.js';
|
|
4
|
+
import { commandEventOutputMode, emitCommandEvent, renderCommandEventAsJson, runWithCommandEvents, runWithCommandEventsForCommand, } from './command-events.js';
|
|
5
5
|
import { outputContent, outputResult, outputToken } from './output.js';
|
|
6
6
|
import { setCurrentSessionAlias } from './session.js';
|
|
7
7
|
import { terminalSupportsPrompting } from './system.js';
|
|
8
8
|
import { hashString } from './crypto.js';
|
|
9
9
|
import { isTruthy } from './context/utilities.js';
|
|
10
10
|
import { setCurrentCommandId } from './global-context.js';
|
|
11
|
+
import { environmentVariables } from '../../private/node/constants.js';
|
|
12
|
+
import { deprecatedAutomationTokenVariable } from '../../private/node/session/automation-token.js';
|
|
13
|
+
import { runAtMinimumInterval } from '../../private/node/conf-store.js';
|
|
11
14
|
import { underscore } from '../common/string.js';
|
|
12
15
|
import { Command, Errors, Flags } from '@oclif/core';
|
|
13
16
|
class BaseCommand extends Command {
|
|
@@ -42,11 +45,18 @@ class BaseCommand extends Command {
|
|
|
42
45
|
static analyticsStopCommand() {
|
|
43
46
|
return undefined;
|
|
44
47
|
}
|
|
48
|
+
jsonOutputFromFlags = false;
|
|
45
49
|
async catch(error) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
const handleError = async () => {
|
|
51
|
+
error.skipOclifErrorHandling = true;
|
|
52
|
+
const { errorHandler } = await import('./error-handler.js');
|
|
53
|
+
await errorHandler(error, this.config);
|
|
54
|
+
return Errors.handle(error);
|
|
55
|
+
};
|
|
56
|
+
if (this.jsonOutputFromFlags && commandEventOutputMode() !== 'json') {
|
|
57
|
+
return runWithCommandEvents({ outputMode: 'json', sink: renderCommandEventAsJson }, handleError);
|
|
58
|
+
}
|
|
59
|
+
return handleError();
|
|
50
60
|
}
|
|
51
61
|
async _run() {
|
|
52
62
|
return runWithCommandEventsForCommand(this.argv, () => super._run());
|
|
@@ -61,6 +71,7 @@ class BaseCommand extends Command {
|
|
|
61
71
|
}
|
|
62
72
|
await removeDuplicatedPlugins(this.config);
|
|
63
73
|
this.showNpmFlagWarning();
|
|
74
|
+
await this.showDeprecatedAutomationTokenVariableWarning();
|
|
64
75
|
const { showNotificationsIfNeeded } = await import('./notifications-system.js');
|
|
65
76
|
await showNotificationsIfNeeded();
|
|
66
77
|
return super.init();
|
|
@@ -86,6 +97,21 @@ class BaseCommand extends Command {
|
|
|
86
97
|
});
|
|
87
98
|
}
|
|
88
99
|
}
|
|
100
|
+
// SHOPIFY_APP_AUTOMATION_TOKEN and SHOPIFY_CLI_PARTNERS_TOKEN keep working, but SHOPIFY_SERVICE_ACCOUNT_TOKEN replaces
|
|
101
|
+
// them and takes the same tokens. This warning is how people still using an old name find out about the new one.
|
|
102
|
+
async showDeprecatedAutomationTokenVariableWarning() {
|
|
103
|
+
const variable = deprecatedAutomationTokenVariable();
|
|
104
|
+
if (!variable)
|
|
105
|
+
return;
|
|
106
|
+
// Show the warning only once per day
|
|
107
|
+
await runAtMinimumInterval('warn-on-deprecated-automation-token-variable', { days: 1 }, async () => {
|
|
108
|
+
const { renderWarning } = await import('./ui.js');
|
|
109
|
+
renderWarning({
|
|
110
|
+
headline: `${variable} is deprecated.`,
|
|
111
|
+
body: `Move the token to ${environmentVariables.serviceAccountToken}. ${variable} still works for now, but a future release will stop reading it.`,
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
89
115
|
exitWithTimestampWhenEnvVariablePresent() {
|
|
90
116
|
if (isTruthy(process.env.SHOPIFY_CLI_ENV_STARTUP_PERFORMANCE_RUN)) {
|
|
91
117
|
outputResult(`
|
|
@@ -97,17 +123,46 @@ class BaseCommand extends Command {
|
|
|
97
123
|
}
|
|
98
124
|
}
|
|
99
125
|
async parse(options, argv) {
|
|
100
|
-
|
|
101
|
-
result = await this.resultWithEnvironment(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
126
|
+
const parsed = await super.parse(options, argv);
|
|
127
|
+
const result = await this.resultWithEnvironment(parsed, options, argv);
|
|
128
|
+
return this.runWithParsedOutput(result.flags, async () => {
|
|
129
|
+
await setCurrentSessionAlias(result.flags['auth-alias']);
|
|
130
|
+
await addFromParsedFlags(result.flags);
|
|
131
|
+
this.validateNonTTYFlags(result.flags);
|
|
132
|
+
return { ...result, ...{ argv: result.argv } };
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
runWithParsedOutput(flags, execute) {
|
|
136
|
+
const command = this.constructor;
|
|
137
|
+
const json = commandSupportsFlag(command.flags, 'json') &&
|
|
138
|
+
(flags.json === true || (commandSupportsJsonOutputFormat(command.flags) && flags.output === 'json'));
|
|
139
|
+
this.jsonOutputFromFlags ||= json;
|
|
140
|
+
if (json && commandEventOutputMode() !== 'json') {
|
|
141
|
+
return runWithCommandEvents({ outputMode: 'json', sink: renderCommandEventAsJson }, execute);
|
|
142
|
+
}
|
|
143
|
+
return execute();
|
|
106
144
|
}
|
|
107
145
|
environmentsFilename() {
|
|
108
146
|
// To be re-implemented if needed
|
|
109
147
|
return undefined;
|
|
110
148
|
}
|
|
149
|
+
async parseEnvironmentFlags(environment, options, explicitFlags) {
|
|
150
|
+
const originalArgv = this.argv;
|
|
151
|
+
try {
|
|
152
|
+
const result = await super.parse(options, [
|
|
153
|
+
...originalArgv,
|
|
154
|
+
...argsFromEnvironment(environment, options, explicitFlags),
|
|
155
|
+
]);
|
|
156
|
+
return result.flags;
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
// Oclif replaces argv when parsing; the next environment needs the original arguments.
|
|
160
|
+
this.argv = originalArgv;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
validateNonTTYFlags(flags) {
|
|
164
|
+
this.failMissingNonTTYFlagRequirements(flags, this.applicableNonTTYFlagRequirements(flags));
|
|
165
|
+
}
|
|
111
166
|
failMissingNonTTYFlags(flags, requiredFlags) {
|
|
112
167
|
this.failMissingNonTTYFlagRequirements(flags, requiredFlags.map((flag) => ({ flags: [flag] })));
|
|
113
168
|
}
|
|
@@ -164,17 +219,28 @@ ${explanation} in non-interactive terminal environments, such as a CI environmen
|
|
|
164
219
|
// Parse using noDefaultsOptions to derive a list of flags specified as
|
|
165
220
|
// command-line arguments.
|
|
166
221
|
const noDefaultsResult = await super.parse(noDefaultsOptions(options), argv);
|
|
222
|
+
// Remember the requested format before environment flag validation can fail.
|
|
223
|
+
const effectiveFlags = { ...environment, ...noDefaultsResult.flags };
|
|
224
|
+
this.jsonOutputFromFlags =
|
|
225
|
+
(commandSupportsFlag(options?.flags, 'json') && effectiveFlags.json === true) ||
|
|
226
|
+
(commandSupportsJsonOutputFormat(options?.flags) && effectiveFlags.output === 'json');
|
|
227
|
+
const normalizedEnvironment = commandSupportsFlag(options?.flags, 'json') &&
|
|
228
|
+
commandSupportsJsonOutputFormat(options?.flags) &&
|
|
229
|
+
effectiveFlags.output === 'json'
|
|
230
|
+
? { json: true, ...environment }
|
|
231
|
+
: environment;
|
|
167
232
|
// Add the environment's settings to argv and pass them to `super.parse`. This
|
|
168
233
|
// invokes oclif's validation system without breaking the oclif black box.
|
|
169
234
|
// Replace the original result with this one.
|
|
170
235
|
const result = await super.parse(options, [
|
|
171
236
|
// Need to specify argv default because we're merging with argsFromEnvironment.
|
|
172
237
|
...(argv ?? this.argv),
|
|
173
|
-
...argsFromEnvironment(
|
|
238
|
+
...argsFromEnvironment(normalizedEnvironment, options, noDefaultsResult.flags),
|
|
174
239
|
...(isDefaultEnvironment ? ['--environment', 'default'] : []),
|
|
175
240
|
]);
|
|
176
241
|
// Report successful application of the environment.
|
|
177
|
-
reportEnvironmentApplication(noDefaultsResult.flags, result.flags, isDefaultEnvironment ? 'default' : environments[0], environment);
|
|
242
|
+
const report = () => reportEnvironmentApplication(noDefaultsResult.flags, result.flags, isDefaultEnvironment ? 'default' : environments[0], environment);
|
|
243
|
+
this.runWithParsedOutput(result.flags, report);
|
|
178
244
|
return result;
|
|
179
245
|
}
|
|
180
246
|
/**
|
|
@@ -216,13 +282,21 @@ function reportEnvironmentApplication(noDefaultsFlags, flagsWithEnvironments, en
|
|
|
216
282
|
const userSpecifiedThisFlag = Object.prototype.hasOwnProperty.call(noDefaultsFlags, name);
|
|
217
283
|
const environmentContainsFlag = Object.prototype.hasOwnProperty.call(environment, name);
|
|
218
284
|
if (!userSpecifiedThisFlag && environmentContainsFlag) {
|
|
219
|
-
const valueToReport = name === 'password' ? `********${value.substr(-4)}` : value;
|
|
285
|
+
const valueToReport = name === 'password' || name === 'store-password' ? `********${value.substr(-4)}` : value;
|
|
220
286
|
changes[name] = valueToReport;
|
|
221
287
|
}
|
|
222
288
|
}
|
|
223
289
|
if (Object.keys(changes).length === 0)
|
|
224
290
|
return;
|
|
225
291
|
const items = Object.entries(changes).map(([name, value]) => `${name}: ${value}`);
|
|
292
|
+
if (commandEventOutputMode() === 'json') {
|
|
293
|
+
emitCommandEvent({
|
|
294
|
+
type: 'diagnostic',
|
|
295
|
+
level: 'info',
|
|
296
|
+
message: `Using applicable flags from ${environmentName} environment:\n${items.join('\n')}`,
|
|
297
|
+
});
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
226
300
|
// eslint-disable-next-line no-void
|
|
227
301
|
void import('./ui.js').then(({ renderInfo }) => {
|
|
228
302
|
renderInfo({
|
|
@@ -268,12 +342,15 @@ export function noDefaultsOptions(options) {
|
|
|
268
342
|
* Converts the environment's settings to arguments as though passed on the command
|
|
269
343
|
* line, skipping any arguments the user specified on the command line.
|
|
270
344
|
*/
|
|
271
|
-
function argsFromEnvironment(environment, options,
|
|
345
|
+
function argsFromEnvironment(environment, options, explicitFlags) {
|
|
272
346
|
const args = [];
|
|
273
347
|
for (const [label, value] of Object.entries(environment)) {
|
|
274
348
|
const flagIsRelevantToCommand = commandSupportsFlag(options?.flags, label);
|
|
275
|
-
const userSpecifiedThisFlag =
|
|
349
|
+
const userSpecifiedThisFlag = Object.prototype.hasOwnProperty.call(explicitFlags, label);
|
|
276
350
|
if (flagIsRelevantToCommand && !userSpecifiedThisFlag) {
|
|
351
|
+
if (options?.flags?.[label]?.type === 'boolean' && typeof value !== 'boolean') {
|
|
352
|
+
throw new AbortError(outputContent `Environment flag ${outputToken.yellow(label)} must be a boolean.`);
|
|
353
|
+
}
|
|
277
354
|
if (typeof value === 'boolean') {
|
|
278
355
|
if (value) {
|
|
279
356
|
args.push(`--${label}`);
|
|
@@ -295,6 +372,10 @@ function argsFromEnvironment(environment, options, noDefaultsResult) {
|
|
|
295
372
|
function commandSupportsFlag(flags, flagName) {
|
|
296
373
|
return Boolean(flags) && Object.prototype.hasOwnProperty.call(flags, flagName);
|
|
297
374
|
}
|
|
375
|
+
function commandSupportsJsonOutputFormat(flags) {
|
|
376
|
+
const output = flags?.output;
|
|
377
|
+
return output?.type === 'option' && output.options?.includes('json') === true;
|
|
378
|
+
}
|
|
298
379
|
function appendJsonOutputSchema(description, outputSchema) {
|
|
299
380
|
if (!outputSchema)
|
|
300
381
|
return description;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../../src/public/node/base-command.ts"],"names":[],"mappings":"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","sourcesContent":["import {isDevelopment} from './context/local.js'\nimport {addPublicMetadata} from './metadata.js'\nimport {AbortError} from './error.js'\nimport {runWithCommandEventsForCommand} from './command-events.js'\nimport {outputContent, outputResult, outputToken} from './output.js'\nimport {setCurrentSessionAlias} from './session.js'\nimport {terminalSupportsPrompting} from './system.js'\nimport {hashString} from './crypto.js'\nimport {isTruthy} from './context/utilities.js'\nimport {setCurrentCommandId} from './global-context.js'\nimport {type JsonOutputSchema} from './json-output-schema.js'\nimport {JsonMap} from '../../private/common/json.js'\nimport {underscore} from '../common/string.js'\nimport {Command, Config, Errors, Flags} from '@oclif/core'\nimport {OutputFlags, Input, ParserOutput, FlagInput, OutputArgs} from '@oclif/core/parser'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ArgOutput = OutputArgs<any>\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type FlagOutput = OutputFlags<any>\n\nexport interface NonTTYFlagRequirement {\n /** At least one of these flags must be present when the requirement applies. */\n flags: string[]\n /** Determines whether the requirement applies to the parsed flags. */\n when?: (flags: FlagOutput) => boolean\n}\n\ninterface EnvironmentFlags {\n 'auth-alias'?: string\n environment?: string[]\n path?: string\n}\n\nabstract class BaseCommand extends Command {\n static baseFlags: FlagInput<{}> = {\n 'json-schema': Flags.boolean({\n description: \"Print the command's JSON schemas.\",\n env: 'SHOPIFY_FLAG_JSON_SCHEMA',\n }),\n }\n\n static descriptionWithMarkdown?: string\n\n public static get jsonOutputSchema(): JsonOutputSchema | undefined {\n return undefined\n }\n\n public static get requiresSyncAnalytics(): boolean {\n return false\n }\n\n public static nonTTYFlagRequirements(_flags: FlagOutput): NonTTYFlagRequirement[] {\n return []\n }\n\n // Include the JSON result schema and convert Markdown links to plain text for command help.\n public static descriptionForHelp(): string | undefined {\n const description = (this.descriptionWithMarkdown ?? '').replace(/(\\[)(.*?)(])(\\()(.*?)(\\))/gm, '\"$2\" ($5)')\n return appendJsonOutputSchema(description, this.jsonOutputSchema)\n }\n\n /** @deprecated Use descriptionForHelp instead. */\n public static descriptionWithoutMarkdown(): string | undefined {\n return this.descriptionForHelp()\n }\n\n public static analyticsNameOverride(): string | undefined {\n return undefined\n }\n\n public static analyticsStopCommand(): string | undefined {\n return undefined\n }\n\n async catch(error: Error & {skipOclifErrorHandling: boolean}): Promise<void> {\n error.skipOclifErrorHandling = true\n const {errorHandler} = await import('./error-handler.js')\n await errorHandler(error, this.config)\n return Errors.handle(error)\n }\n\n protected async _run<T>(): Promise<T> {\n return runWithCommandEventsForCommand(this.argv, () => super._run<T>())\n }\n\n protected async init(): Promise<unknown> {\n this.exitWithTimestampWhenEnvVariablePresent()\n setCurrentCommandId(this.id ?? '')\n if (!isDevelopment()) {\n // This function runs just prior to `run`\n const {registerCleanBugsnagErrorsFromWithinPlugins} = await import('./error-handler.js')\n await registerCleanBugsnagErrorsFromWithinPlugins(this.config)\n }\n await removeDuplicatedPlugins(this.config)\n this.showNpmFlagWarning()\n const {showNotificationsIfNeeded} = await import('./notifications-system.js')\n await showNotificationsIfNeeded()\n return super.init()\n }\n\n // NPM creates an environment variable for every flag passed to a script.\n // This function checks for the presence of any of the available CLI flags\n // and warns the user to use the `--` separator.\n protected showNpmFlagWarning(): void {\n const commandVariables = this.constructor as unknown as {flags: JsonMap}\n const commandFlags = Object.keys(commandVariables.flags || {})\n const possibleNpmEnvVars = commandFlags.map((key) => `npm_config_${underscore(key).replace(/^no_/, '')}`)\n\n if (possibleNpmEnvVars.some((flag) => process.env[flag] !== undefined)) {\n // eslint-disable-next-line no-void\n void import('./ui.js').then(({renderWarning}) => {\n renderWarning({\n body: [\n 'NPM scripts require an extra',\n {command: '--'},\n 'separator to pass the flags. Example:',\n {command: 'npm run dev -- --reset'},\n ],\n })\n })\n }\n }\n\n protected exitWithTimestampWhenEnvVariablePresent() {\n if (isTruthy(process.env.SHOPIFY_CLI_ENV_STARTUP_PERFORMANCE_RUN)) {\n outputResult(`\n SHOPIFY_CLI_TIMESTAMP_START\n { \"timestamp\": ${Date.now()} }\n SHOPIFY_CLI_TIMESTAMP_END\n `)\n process.exit(0)\n }\n }\n\n protected async parse<\n TFlags extends FlagOutput & {path?: string; verbose?: boolean; 'auth-alias'?: string},\n TGlobalFlags extends FlagOutput,\n TArgs extends ArgOutput,\n >(\n options?: Input<TFlags, TGlobalFlags, TArgs>,\n argv?: string[],\n ): Promise<ParserOutput<TFlags, TGlobalFlags, TArgs> & {argv: string[]}> {\n let result = await super.parse<TFlags, TGlobalFlags, TArgs>(options, argv)\n result = await this.resultWithEnvironment<TFlags, TGlobalFlags, TArgs>(result, options, argv)\n await setCurrentSessionAlias(result.flags['auth-alias'])\n await addFromParsedFlags(result.flags)\n this.failMissingNonTTYFlagRequirements(result.flags, this.applicableNonTTYFlagRequirements(result.flags))\n return {...result, ...{argv: result.argv as string[]}}\n }\n\n protected environmentsFilename(): string | undefined {\n // To be re-implemented if needed\n return undefined\n }\n\n protected failMissingNonTTYFlags(flags: FlagOutput, requiredFlags: string[]): void {\n this.failMissingNonTTYFlagRequirements(\n flags,\n requiredFlags.map((flag) => ({flags: [flag]})),\n )\n }\n\n private failMissingNonTTYFlagRequirements(flags: FlagOutput, requirements: NonTTYFlagRequirement[]): void {\n if (terminalSupportsPrompting()) return\n\n const missingRequirements = requirements.filter((requirement) =>\n requirement.flags.every((flag) => flags[flag] === undefined || flags[flag] === false),\n )\n if (missingRequirements.length === 0) return\n\n const heading = missingRequirements.length === 1 ? 'Flag not specified' : 'Flags not specified'\n const formattedRequirements = missingRequirements\n .map((requirement) => requirement.flags.map((flag) => `--${flag}`).join(' or '))\n .join('\\n')\n const explanation = missingRequirements.length === 1 ? 'This flag is required' : 'These flags are required'\n\n throw new AbortError(\n outputContent`${heading}:\n\n${outputToken.cyan(formattedRequirements)}\n\n${explanation} in non-interactive terminal environments, such as a CI environment, or when piping input from another process.`,\n 'To resolve this, specify the options in the command, or run the command in an interactive environment such as your local terminal.',\n )\n }\n\n private applicableNonTTYFlagRequirements(flags: FlagOutput): NonTTYFlagRequirement[] {\n const command = this.constructor as unknown as {\n flags?: FlagInput\n baseFlags?: FlagInput\n nonTTYFlagRequirements?: (flags: FlagOutput) => NonTTYFlagRequirement[]\n }\n const allFlags = {...command.baseFlags, ...command.flags}\n const requirementsFromFlags = Object.entries(allFlags)\n .filter(([, flag]) => Boolean((flag as {requiredIfNonInteractive?: boolean}).requiredIfNonInteractive))\n .map(([name]) => ({flags: [name]}))\n const commandRequirements = (command.nonTTYFlagRequirements?.(flags) ?? []).filter(\n (requirement) => requirement.when?.(flags) ?? true,\n )\n\n return [...requirementsFromFlags, ...commandRequirements]\n }\n\n private async resultWithEnvironment<\n TFlags extends FlagOutput & {path?: string; verbose?: boolean},\n TGlobalFlags extends FlagOutput,\n TArgs extends ArgOutput,\n >(\n originalResult: ParserOutput<TFlags, TGlobalFlags, TArgs>,\n options?: Input<TFlags, TGlobalFlags, TArgs>,\n argv?: string[],\n ): Promise<ParserOutput<TFlags, TGlobalFlags, TArgs>> {\n const flags = originalResult.flags as EnvironmentFlags\n const environmentsFileName = this.environmentsFilename()\n\n if (!environmentsFileName) return originalResult\n\n const {environmentFilePath} = await import('./environments.js')\n const environmentFileExists = await environmentFilePath(environmentsFileName, {from: flags.path})\n\n // Handle both string and array cases for environment flag\n let environments: string[] = []\n if (flags.environment) {\n environments = Array.isArray(flags.environment) ? flags.environment : [flags.environment]\n }\n\n const environmentSpecified = environments.length > 0\n\n // Noop if no environment file exists and none was specified\n if (!environmentFileExists && !environmentSpecified) return originalResult\n\n // Noop if multiple environments were specified (let commands handle this)\n if (environmentSpecified && environments.length > 1) return originalResult\n\n const {environment, isDefaultEnvironment} = await this.loadEnvironmentForCommand(\n flags.path,\n environmentsFileName,\n environments[0],\n )\n\n if (!environment) return originalResult\n if (isDefaultEnvironment && !commandSupportsFlag(options?.flags, 'environment')) return originalResult\n\n // Parse using noDefaultsOptions to derive a list of flags specified as\n // command-line arguments.\n const noDefaultsResult = await super.parse<TFlags, TGlobalFlags, TArgs>(noDefaultsOptions(options), argv)\n\n // Add the environment's settings to argv and pass them to `super.parse`. This\n // invokes oclif's validation system without breaking the oclif black box.\n // Replace the original result with this one.\n const result = await super.parse<TFlags, TGlobalFlags, TArgs>(options, [\n // Need to specify argv default because we're merging with argsFromEnvironment.\n ...(argv ?? this.argv),\n ...argsFromEnvironment<TFlags, TGlobalFlags, TArgs>(environment, options, noDefaultsResult),\n ...(isDefaultEnvironment ? ['--environment', 'default'] : []),\n ])\n\n // Report successful application of the environment.\n reportEnvironmentApplication<TFlags, TGlobalFlags, TArgs>(\n noDefaultsResult.flags,\n result.flags,\n isDefaultEnvironment ? 'default' : (environments[0] as string),\n environment,\n )\n\n return result\n }\n\n /**\n * Tries to load an environment to forward to the command. If no environment\n * is specified it will try to load a default environment.\n */\n private async loadEnvironmentForCommand(\n path: string | undefined,\n environmentsFileName: string,\n specifiedEnvironment: string | undefined,\n ): Promise<{environment: JsonMap | undefined; isDefaultEnvironment: boolean}> {\n const {loadEnvironment} = await import('./environments.js')\n if (specifiedEnvironment) {\n const environment = await loadEnvironment(specifiedEnvironment, environmentsFileName, {from: path})\n return {environment, isDefaultEnvironment: false}\n }\n\n const environment = await loadEnvironment('default', environmentsFileName, {from: path, silent: true})\n return {environment, isDefaultEnvironment: true}\n }\n}\n\nexport async function addFromParsedFlags(flags: {path?: string; verbose?: boolean}): Promise<void> {\n await addPublicMetadata(() => ({\n cmd_all_verbose: flags.verbose,\n cmd_all_path_override: flags.path !== undefined,\n cmd_all_path_override_hash: flags.path === undefined ? undefined : hashString(flags.path),\n }))\n}\n\n/**\n * Any flag which is:\n *\n * 1. Present in the final set of flags\n * 2. Specified in the environment\n * 3. Not specified by the user as a command line argument\n *\n * should be reported.\n *\n * It doesn't matter if the environment flag's value was the same as the default; from\n * the user's perspective, they want to know their environment was applied.\n */\nfunction reportEnvironmentApplication<\n TFlags extends FlagOutput,\n TGlobalFlags extends FlagOutput,\n TArgs extends ArgOutput,\n>(\n noDefaultsFlags: ParserOutput<TFlags, TGlobalFlags, TArgs>['flags'],\n flagsWithEnvironments: ParserOutput<TFlags, TGlobalFlags, TArgs>['flags'],\n environmentName: string,\n environment: JsonMap,\n): void {\n const changes: JsonMap = {}\n for (const [name, value] of Object.entries(flagsWithEnvironments)) {\n const userSpecifiedThisFlag = Object.prototype.hasOwnProperty.call(noDefaultsFlags, name)\n const environmentContainsFlag = Object.prototype.hasOwnProperty.call(environment, name)\n if (!userSpecifiedThisFlag && environmentContainsFlag) {\n const valueToReport = name === 'password' ? `********${value.substr(-4)}` : value\n changes[name] = valueToReport\n }\n }\n if (Object.keys(changes).length === 0) return\n\n const items = Object.entries(changes).map(([name, value]) => `${name}: ${value}`)\n // eslint-disable-next-line no-void\n void import('./ui.js').then(({renderInfo}) => {\n renderInfo({\n headline: ['Using applicable flags from', {userInput: environmentName}, 'environment:'],\n body: [{list: {items}}],\n })\n })\n}\n\n/**\n * Strips the defaults from configured flags. For example, if flags contains:\n *\n * ```\n * someFlag: Flags.boolean({\n * description: 'some flag',\n * default: false\n * })\n * ```\n *\n * it becomes:\n *\n * ```\n * someFlag: Flags.boolean({\n * description: 'some flag'\n * })\n * ```\n *\n * If we parse using this configuration, the only specified flags will be those\n * the user actually passed on the command line.\n */\nexport function noDefaultsOptions<TFlags extends FlagOutput, TGlobalFlags extends FlagOutput, TArgs extends ArgOutput>(\n options: Input<TFlags, TGlobalFlags, TArgs> | undefined,\n): Input<TFlags, TGlobalFlags, TArgs> | undefined {\n if (!options?.flags) return options\n return {\n ...options,\n flags: Object.fromEntries(\n Object.entries(options.flags).map(([label, settings]) => {\n const copiedSettings = {...(settings as {default?: unknown})}\n delete copiedSettings.default\n return [label, copiedSettings]\n }),\n ) as FlagInput<TFlags>,\n }\n}\n\n/**\n * Converts the environment's settings to arguments as though passed on the command\n * line, skipping any arguments the user specified on the command line.\n */\nfunction argsFromEnvironment<TFlags extends FlagOutput, TGlobalFlags extends FlagOutput, TArgs extends ArgOutput>(\n environment: JsonMap,\n options: Input<TFlags, TGlobalFlags, TArgs> | undefined,\n noDefaultsResult: ParserOutput<TFlags, TArgs>,\n): string[] {\n const args: string[] = []\n for (const [label, value] of Object.entries(environment)) {\n const flagIsRelevantToCommand = commandSupportsFlag(options?.flags, label)\n const userSpecifiedThisFlag =\n noDefaultsResult.flags && Object.prototype.hasOwnProperty.call(noDefaultsResult.flags, label)\n if (flagIsRelevantToCommand && !userSpecifiedThisFlag) {\n if (typeof value === 'boolean') {\n if (value) {\n args.push(`--${label}`)\n } else {\n throw new AbortError(\n outputContent`Environments can only specify true for boolean flags. Attempted to set ${outputToken.yellow(\n label,\n )} to false.`,\n )\n }\n } else if (Array.isArray(value)) {\n value.forEach((element) => args.push(`--${label}`, `${element}`))\n } else {\n args.push(`--${label}`, `${value}`)\n }\n }\n }\n return args\n}\n\nfunction commandSupportsFlag(flags: FlagInput | undefined, flagName: string): boolean {\n return Boolean(flags) && Object.prototype.hasOwnProperty.call(flags, flagName)\n}\n\nfunction appendJsonOutputSchema(description: string, outputSchema: JsonOutputSchema | undefined): string {\n if (!outputSchema) return description\n\n const jsonOutputDescription = `Use \\`--json-schema\\` to print the result, error, and event schemas.\n\nOutput from \\`--json\\` conforms to the \\`${outputSchema.name}\\` schema.\n\n\\`\\`\\`json\n${JSON.stringify(outputSchema.jsonSchema, null, 2)}\n\\`\\`\\``\n\n return [description, jsonOutputDescription].filter(Boolean).join('\\n\\n')\n}\n\nasync function removeDuplicatedPlugins(config: Config): Promise<void> {\n const plugins = Array.from(config.plugins.values())\n const bundlePlugins = ['@shopify/app', '@shopify/plugin-cloudflare']\n const pluginsToRemove = plugins.filter((plugin) => bundlePlugins.includes(plugin.name))\n if (pluginsToRemove.length > 0) {\n const commandsToRun = pluginsToRemove.map((plugin) => ` - shopify plugins remove ${plugin.name}`).join('\\n')\n const {renderWarning} = await import('./ui.js')\n renderWarning({\n headline: `Unsupported plugins detected: ${pluginsToRemove.map((plugin) => plugin.name).join(', ')}`,\n body: [\n 'They are already included in the CLI and installing them as custom plugins can cause conflicts.',\n `You can fix it by running:\\n${commandsToRun}`,\n ],\n })\n }\n const filteredPlugins = plugins.filter((plugin) => !bundlePlugins.includes(plugin.name))\n // eslint-disable-next-line require-atomic-updates -- config.plugins won't be modified by renderWarning above\n config.plugins = new Map(filteredPlugins.map((plugin) => [plugin.name, plugin]))\n}\n\nexport default BaseCommand\n"]}
|
|
1
|
+
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../../src/public/node/base-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AACrC,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAC,aAAa,EAAE,YAAY,EAAE,WAAW,EAAC,MAAM,aAAa,CAAA;AACpE,OAAO,EAAC,sBAAsB,EAAC,MAAM,cAAc,CAAA;AACnD,OAAO,EAAC,yBAAyB,EAAC,MAAM,aAAa,CAAA;AACrD,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAA;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAA;AAGvD,OAAO,EAAC,oBAAoB,EAAC,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAC,iCAAiC,EAAC,MAAM,gDAAgD,CAAA;AAChG,OAAO,EAAC,oBAAoB,EAAC,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAC,OAAO,EAAU,MAAM,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AAqB1D,MAAe,WAAY,SAAQ,OAAO;IACxC,MAAM,CAAC,SAAS,GAAkB;QAChC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC;YAC3B,WAAW,EAAE,mCAAmC;YAChD,GAAG,EAAE,0BAA0B;SAChC,CAAC;KACH,CAAA;IAED,MAAM,CAAC,uBAAuB,CAAS;IAEhC,MAAM,KAAK,gBAAgB;QAChC,OAAO,SAAS,CAAA;IAClB,CAAC;IAEM,MAAM,KAAK,qBAAqB;QACrC,OAAO,KAAK,CAAA;IACd,CAAC;IAEM,MAAM,CAAC,sBAAsB,CAAC,MAAkB;QACrD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,4FAA4F;IACrF,MAAM,CAAC,kBAAkB;QAC9B,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,WAAW,CAAC,CAAA;QAC5G,OAAO,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;IACnE,CAAC;IAED,kDAAkD;IAC3C,MAAM,CAAC,0BAA0B;QACtC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAA;IAClC,CAAC;IAEM,MAAM,CAAC,qBAAqB;QACjC,OAAO,SAAS,CAAA;IAClB,CAAC;IAEM,MAAM,CAAC,oBAAoB;QAChC,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,mBAAmB,GAAG,KAAK,CAAA;IAEnC,KAAK,CAAC,KAAK,CAAC,KAAgD;QAC1D,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;YAC7B,KAAK,CAAC,sBAAsB,GAAG,IAAI,CAAA;YACnC,MAAM,EAAC,YAAY,EAAC,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YACzD,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YACtC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7B,CAAC,CAAA;QACD,IAAI,IAAI,CAAC,mBAAmB,IAAI,sBAAsB,EAAE,KAAK,MAAM,EAAE,CAAC;YACpE,OAAO,oBAAoB,CAAC,EAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAC,EAAE,WAAW,CAAC,CAAA;QAChG,CAAC;QACD,OAAO,WAAW,EAAE,CAAA;IACtB,CAAC;IAES,KAAK,CAAC,IAAI;QAClB,OAAO,8BAA8B,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAK,CAAC,CAAA;IACzE,CAAC;IAES,KAAK,CAAC,IAAI;QAClB,IAAI,CAAC,uCAAuC,EAAE,CAAA;QAC9C,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,yCAAyC;YACzC,MAAM,EAAC,2CAA2C,EAAC,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YACxF,MAAM,2CAA2C,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChE,CAAC;QACD,MAAM,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,CAAC,kBAAkB,EAAE,CAAA;QACzB,MAAM,IAAI,CAAC,4CAA4C,EAAE,CAAA;QACzD,MAAM,EAAC,yBAAyB,EAAC,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAA;QAC7E,MAAM,yBAAyB,EAAE,CAAA;QACjC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAA;IACrB,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,gDAAgD;IACtC,kBAAkB;QAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAA0C,CAAA;QACxE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;QAC9D,MAAM,kBAAkB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;QAEzG,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;YACvE,mCAAmC;YACnC,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,aAAa,EAAC,EAAE,EAAE;gBAC9C,aAAa,CAAC;oBACZ,IAAI,EAAE;wBACJ,8BAA8B;wBAC9B,EAAC,OAAO,EAAE,IAAI,EAAC;wBACf,uCAAuC;wBACvC,EAAC,OAAO,EAAE,wBAAwB,EAAC;qBACpC;iBACF,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,uHAAuH;IACvH,iHAAiH;IACvG,KAAK,CAAC,4CAA4C;QAC1D,MAAM,QAAQ,GAAG,iCAAiC,EAAE,CAAA;QACpD,IAAI,CAAC,QAAQ;YAAE,OAAM;QAErB,qCAAqC;QACrC,MAAM,oBAAoB,CAAC,8CAA8C,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,EAAE,KAAK,IAAI,EAAE;YAC/F,MAAM,EAAC,aAAa,EAAC,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;YAC/C,aAAa,CAAC;gBACZ,QAAQ,EAAE,GAAG,QAAQ,iBAAiB;gBACtC,IAAI,EAAE,qBAAqB,oBAAoB,CAAC,mBAAmB,KAAK,QAAQ,kEAAkE;aACnJ,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAES,uCAAuC;QAC/C,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,EAAE,CAAC;YAClE,YAAY,CAAC;;uBAEI,IAAI,CAAC,GAAG,EAAE;;OAE1B,CAAC,CAAA;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAES,KAAK,CAAC,KAAK,CAKnB,OAA4C,EAC5C,IAAe;QAEf,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAA8B,OAAO,EAAE,IAAI,CAAC,CAAA;QAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAA8B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QACnG,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;YACxD,MAAM,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtC,OAAO,EAAC,GAAG,MAAM,EAAE,GAAG,EAAC,IAAI,EAAE,MAAM,CAAC,IAAgB,EAAC,EAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC;IAES,mBAAmB,CAAI,KAAiB,EAAE,OAAgB;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAiC,CAAA;QACtD,MAAM,IAAI,GACR,mBAAmB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;YAC1C,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,+BAA+B,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAA;QACtG,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAA;QACjC,IAAI,IAAI,IAAI,sBAAsB,EAAE,KAAK,MAAM,EAAE,CAAC;YAChD,OAAO,oBAAoB,CAAC,EAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAC,EAAE,OAAO,CAAC,CAAA;QAC5F,CAAC;QACD,OAAO,OAAO,EAAE,CAAA;IAClB,CAAC;IAES,oBAAoB;QAC5B,iCAAiC;QACjC,OAAO,SAAS,CAAA;IAClB,CAAC;IAES,KAAK,CAAC,qBAAqB,CAInC,WAAoB,EAAE,OAA2C,EAAE,aAAyB;QAC5F,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAA;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;gBACxC,GAAG,YAAY;gBACf,GAAG,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC;aAC5D,CAAC,CAAA;YACF,OAAO,MAAM,CAAC,KAAK,CAAA;QACrB,CAAC;gBAAS,CAAC;YACT,uFAAuF;YACvF,IAAI,CAAC,IAAI,GAAG,YAAY,CAAA;QAC1B,CAAC;IACH,CAAC;IAES,mBAAmB,CAAC,KAAiB;QAC7C,IAAI,CAAC,iCAAiC,CAAC,KAAK,EAAE,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7F,CAAC;IAES,sBAAsB,CAAC,KAAiB,EAAE,aAAuB;QACzE,IAAI,CAAC,iCAAiC,CACpC,KAAK,EACL,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,CAC/C,CAAA;IACH,CAAC;IAEO,iCAAiC,CAAC,KAAiB,EAAE,YAAqC;QAChG,IAAI,yBAAyB,EAAE;YAAE,OAAM;QAEvC,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAC9D,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CACtF,CAAA;QACD,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAE5C,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,qBAAqB,CAAA;QAC/F,MAAM,qBAAqB,GAAG,mBAAmB;aAC9C,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC/E,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,0BAA0B,CAAA;QAE3G,MAAM,IAAI,UAAU,CAClB,aAAa,CAAA,GAAG,OAAO;;EAE3B,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC;;EAEvC,WAAW,iHAAiH,EACxH,oIAAoI,CACrI,CAAA;IACH,CAAC;IAEO,gCAAgC,CAAC,KAAiB;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,WAIpB,CAAA;QACD,MAAM,QAAQ,GAAG,EAAC,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,KAAK,EAAC,CAAA;QACzD,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;aACnD,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,OAAO,CAAE,IAA6C,CAAC,wBAAwB,CAAC,CAAC;aACtG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,CAAA;QACrC,MAAM,mBAAmB,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAChF,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CACnD,CAAA;QAED,OAAO,CAAC,GAAG,qBAAqB,EAAE,GAAG,mBAAmB,CAAC,CAAA;IAC3D,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAKjC,cAAyD,EACzD,OAA4C,EAC5C,IAAe;QAEf,MAAM,KAAK,GAAG,cAAc,CAAC,KAAyB,CAAA;QACtD,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAExD,IAAI,CAAC,oBAAoB;YAAE,OAAO,cAAc,CAAA;QAEhD,MAAM,EAAC,mBAAmB,EAAC,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC/D,MAAM,qBAAqB,GAAG,MAAM,mBAAmB,CAAC,oBAAoB,EAAE,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAC,CAAC,CAAA;QAEjG,0DAA0D;QAC1D,IAAI,YAAY,GAAa,EAAE,CAAA;QAC/B,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAC3F,CAAC;QAED,MAAM,oBAAoB,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA;QAEpD,4DAA4D;QAC5D,IAAI,CAAC,qBAAqB,IAAI,CAAC,oBAAoB;YAAE,OAAO,cAAc,CAAA;QAE1E,0EAA0E;QAC1E,IAAI,oBAAoB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,cAAc,CAAA;QAE1E,MAAM,EAAC,WAAW,EAAE,oBAAoB,EAAC,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAC9E,KAAK,CAAC,IAAI,EACV,oBAAoB,EACpB,YAAY,CAAC,CAAC,CAAC,CAChB,CAAA;QAED,IAAI,CAAC,WAAW;YAAE,OAAO,cAAc,CAAA;QACvC,IAAI,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC;YAAE,OAAO,cAAc,CAAA;QAEtG,uEAAuE;QACvE,0BAA0B;QAC1B,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,KAAK,CAA8B,iBAAiB,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAA;QAEzG,6EAA6E;QAC7E,MAAM,cAAc,GAAG,EAAC,GAAG,WAAW,EAAE,GAAG,gBAAgB,CAAC,KAAK,EAAC,CAAA;QAClE,IAAI,CAAC,mBAAmB;YACtB,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,cAAc,CAAC,IAAI,KAAK,IAAI,CAAC;gBAC7E,CAAC,+BAA+B,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;QACvF,MAAM,qBAAqB,GACzB,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;YAC3C,+BAA+B,CAAC,OAAO,EAAE,KAAK,CAAC;YAC/C,cAAc,CAAC,MAAM,KAAK,MAAM;YAC9B,CAAC,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,GAAG,WAAW,EAAC;YAC9B,CAAC,CAAC,WAAW,CAAA;QAEjB,8EAA8E;QAC9E,0EAA0E;QAC1E,6CAA6C;QAC7C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAA8B,OAAO,EAAE;YACrE,+EAA+E;YAC/E,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;YACtB,GAAG,mBAAmB,CAA8B,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC;YAC3G,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAA;QAEF,oDAAoD;QACpD,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,4BAA4B,CAC1B,gBAAgB,CAAC,KAAK,EACtB,MAAM,CAAC,KAAK,EACZ,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,YAAY,CAAC,CAAC,CAAY,EAC9D,WAAW,CACZ,CAAA;QACH,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAE9C,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,yBAAyB,CACrC,IAAwB,EACxB,oBAA4B,EAC5B,oBAAwC;QAExC,MAAM,EAAC,eAAe,EAAC,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC3D,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAA;YACnG,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAE,KAAK,EAAC,CAAA;QACnD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,oBAAoB,EAAE,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAA;QACtG,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAC,CAAA;IAClD,CAAC;;AAGH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAyC;IAChF,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7B,eAAe,EAAE,KAAK,CAAC,OAAO;QAC9B,qBAAqB,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS;QAC/C,0BAA0B,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;KAC1F,CAAC,CAAC,CAAA;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,4BAA4B,CAKnC,eAAmE,EACnE,qBAAyE,EACzE,eAAuB,EACvB,WAAoB;IAEpB,MAAM,OAAO,GAAY,EAAE,CAAA;IAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAClE,MAAM,qBAAqB,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAA;QACzF,MAAM,uBAAuB,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;QACvF,IAAI,CAAC,qBAAqB,IAAI,uBAAuB,EAAE,CAAC;YACtD,MAAM,aAAa,GAAG,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;YAC9G,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAE7C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAA;IACjF,IAAI,sBAAsB,EAAE,KAAK,MAAM,EAAE,CAAC;QACxC,gBAAgB,CAAC;YACf,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,+BAA+B,eAAe,kBAAkB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC5F,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IACD,mCAAmC;IACnC,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,UAAU,EAAC,EAAE,EAAE;QAC3C,UAAU,CAAC;YACT,QAAQ,EAAE,CAAC,6BAA6B,EAAE,EAAC,SAAS,EAAE,eAAe,EAAC,EAAE,cAAc,CAAC;YACvF,IAAI,EAAE,CAAC,EAAC,IAAI,EAAE,EAAC,KAAK,EAAC,EAAC,CAAC;SACxB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAuD;IAEvD,IAAI,CAAC,OAAO,EAAE,KAAK;QAAE,OAAO,OAAO,CAAA;IACnC,OAAO;QACL,GAAG,OAAO;QACV,KAAK,EAAE,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE;YACtD,MAAM,cAAc,GAAG,EAAC,GAAI,QAAgC,EAAC,CAAA;YAC7D,OAAO,cAAc,CAAC,OAAO,CAAA;YAC7B,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;QAChC,CAAC,CAAC,CACkB;KACvB,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,WAAoB,EACpB,OAAuD,EACvD,aAAyB;IAEzB,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACzD,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAC1E,MAAM,qBAAqB,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;QACxF,IAAI,uBAAuB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACtD,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9E,MAAM,IAAI,UAAU,CAAC,aAAa,CAAA,oBAAoB,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;YACvG,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAA;gBACzB,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,UAAU,CAClB,aAAa,CAAA,0EAA0E,WAAW,CAAC,MAAM,CACvG,KAAK,CACN,YAAY,CACd,CAAA;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;YACnE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA4B,EAAE,QAAgB;IACzE,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,+BAA+B,CAAC,KAA4B;IACnE,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,CAAA;IAC5B,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;AAC/E,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAmB,EAAE,YAA0C;IAC7F,IAAI,CAAC,YAAY;QAAE,OAAO,WAAW,CAAA;IAErC,MAAM,qBAAqB,GAAG;;2CAEW,YAAY,CAAC,IAAI;;;EAG1D,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;OAC3C,CAAA;IAEL,OAAO,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC1E,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,MAAc;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACnD,MAAM,aAAa,GAAG,CAAC,cAAc,EAAE,4BAA4B,CAAC,CAAA;IACpE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IACvF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,8BAA8B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7G,MAAM,EAAC,aAAa,EAAC,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;QAC/C,aAAa,CAAC;YACZ,QAAQ,EAAE,iCAAiC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACpG,IAAI,EAAE;gBACJ,iGAAiG;gBACjG,+BAA+B,aAAa,EAAE;aAC/C;SACF,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IACxF,6GAA6G;IAC7G,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;AAClF,CAAC;AAED,eAAe,WAAW,CAAA","sourcesContent":["import {isDevelopment} from './context/local.js'\nimport {addPublicMetadata} from './metadata.js'\nimport {AbortError} from './error.js'\nimport {\n commandEventOutputMode,\n emitCommandEvent,\n renderCommandEventAsJson,\n runWithCommandEvents,\n runWithCommandEventsForCommand,\n} from './command-events.js'\nimport {outputContent, outputResult, outputToken} from './output.js'\nimport {setCurrentSessionAlias} from './session.js'\nimport {terminalSupportsPrompting} from './system.js'\nimport {hashString} from './crypto.js'\nimport {isTruthy} from './context/utilities.js'\nimport {setCurrentCommandId} from './global-context.js'\nimport {type JsonOutputSchema} from './json-output-schema.js'\nimport {JsonMap} from '../../private/common/json.js'\nimport {environmentVariables} from '../../private/node/constants.js'\nimport {deprecatedAutomationTokenVariable} from '../../private/node/session/automation-token.js'\nimport {runAtMinimumInterval} from '../../private/node/conf-store.js'\nimport {underscore} from '../common/string.js'\nimport {Command, Config, Errors, Flags} from '@oclif/core'\nimport {OutputFlags, Input, ParserOutput, FlagInput, OutputArgs} from '@oclif/core/parser'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ArgOutput = OutputArgs<any>\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type FlagOutput = OutputFlags<any>\n\nexport interface NonTTYFlagRequirement {\n /** At least one of these flags must be present when the requirement applies. */\n flags: string[]\n /** Determines whether the requirement applies to the parsed flags. */\n when?: (flags: FlagOutput) => boolean\n}\n\ninterface EnvironmentFlags {\n 'auth-alias'?: string\n environment?: string[]\n path?: string\n}\n\nabstract class BaseCommand extends Command {\n static baseFlags: FlagInput<{}> = {\n 'json-schema': Flags.boolean({\n description: \"Print the command's JSON schemas.\",\n env: 'SHOPIFY_FLAG_JSON_SCHEMA',\n }),\n }\n\n static descriptionWithMarkdown?: string\n\n public static get jsonOutputSchema(): JsonOutputSchema | undefined {\n return undefined\n }\n\n public static get requiresSyncAnalytics(): boolean {\n return false\n }\n\n public static nonTTYFlagRequirements(_flags: FlagOutput): NonTTYFlagRequirement[] {\n return []\n }\n\n // Include the JSON result schema and convert Markdown links to plain text for command help.\n public static descriptionForHelp(): string | undefined {\n const description = (this.descriptionWithMarkdown ?? '').replace(/(\\[)(.*?)(])(\\()(.*?)(\\))/gm, '\"$2\" ($5)')\n return appendJsonOutputSchema(description, this.jsonOutputSchema)\n }\n\n /** @deprecated Use descriptionForHelp instead. */\n public static descriptionWithoutMarkdown(): string | undefined {\n return this.descriptionForHelp()\n }\n\n public static analyticsNameOverride(): string | undefined {\n return undefined\n }\n\n public static analyticsStopCommand(): string | undefined {\n return undefined\n }\n\n private jsonOutputFromFlags = false\n\n async catch(error: Error & {skipOclifErrorHandling: boolean}): Promise<void> {\n const handleError = async () => {\n error.skipOclifErrorHandling = true\n const {errorHandler} = await import('./error-handler.js')\n await errorHandler(error, this.config)\n return Errors.handle(error)\n }\n if (this.jsonOutputFromFlags && commandEventOutputMode() !== 'json') {\n return runWithCommandEvents({outputMode: 'json', sink: renderCommandEventAsJson}, handleError)\n }\n return handleError()\n }\n\n protected async _run<T>(): Promise<T> {\n return runWithCommandEventsForCommand(this.argv, () => super._run<T>())\n }\n\n protected async init(): Promise<unknown> {\n this.exitWithTimestampWhenEnvVariablePresent()\n setCurrentCommandId(this.id ?? '')\n if (!isDevelopment()) {\n // This function runs just prior to `run`\n const {registerCleanBugsnagErrorsFromWithinPlugins} = await import('./error-handler.js')\n await registerCleanBugsnagErrorsFromWithinPlugins(this.config)\n }\n await removeDuplicatedPlugins(this.config)\n this.showNpmFlagWarning()\n await this.showDeprecatedAutomationTokenVariableWarning()\n const {showNotificationsIfNeeded} = await import('./notifications-system.js')\n await showNotificationsIfNeeded()\n return super.init()\n }\n\n // NPM creates an environment variable for every flag passed to a script.\n // This function checks for the presence of any of the available CLI flags\n // and warns the user to use the `--` separator.\n protected showNpmFlagWarning(): void {\n const commandVariables = this.constructor as unknown as {flags: JsonMap}\n const commandFlags = Object.keys(commandVariables.flags || {})\n const possibleNpmEnvVars = commandFlags.map((key) => `npm_config_${underscore(key).replace(/^no_/, '')}`)\n\n if (possibleNpmEnvVars.some((flag) => process.env[flag] !== undefined)) {\n // eslint-disable-next-line no-void\n void import('./ui.js').then(({renderWarning}) => {\n renderWarning({\n body: [\n 'NPM scripts require an extra',\n {command: '--'},\n 'separator to pass the flags. Example:',\n {command: 'npm run dev -- --reset'},\n ],\n })\n })\n }\n }\n\n // SHOPIFY_APP_AUTOMATION_TOKEN and SHOPIFY_CLI_PARTNERS_TOKEN keep working, but SHOPIFY_SERVICE_ACCOUNT_TOKEN replaces\n // them and takes the same tokens. This warning is how people still using an old name find out about the new one.\n protected async showDeprecatedAutomationTokenVariableWarning(): Promise<void> {\n const variable = deprecatedAutomationTokenVariable()\n if (!variable) return\n\n // Show the warning only once per day\n await runAtMinimumInterval('warn-on-deprecated-automation-token-variable', {days: 1}, async () => {\n const {renderWarning} = await import('./ui.js')\n renderWarning({\n headline: `${variable} is deprecated.`,\n body: `Move the token to ${environmentVariables.serviceAccountToken}. ${variable} still works for now, but a future release will stop reading it.`,\n })\n })\n }\n\n protected exitWithTimestampWhenEnvVariablePresent() {\n if (isTruthy(process.env.SHOPIFY_CLI_ENV_STARTUP_PERFORMANCE_RUN)) {\n outputResult(`\n SHOPIFY_CLI_TIMESTAMP_START\n { \"timestamp\": ${Date.now()} }\n SHOPIFY_CLI_TIMESTAMP_END\n `)\n process.exit(0)\n }\n }\n\n protected async parse<\n TFlags extends FlagOutput & {path?: string; verbose?: boolean; 'auth-alias'?: string},\n TGlobalFlags extends FlagOutput,\n TArgs extends ArgOutput,\n >(\n options?: Input<TFlags, TGlobalFlags, TArgs>,\n argv?: string[],\n ): Promise<ParserOutput<TFlags, TGlobalFlags, TArgs> & {argv: string[]}> {\n const parsed = await super.parse<TFlags, TGlobalFlags, TArgs>(options, argv)\n const result = await this.resultWithEnvironment<TFlags, TGlobalFlags, TArgs>(parsed, options, argv)\n return this.runWithParsedOutput(result.flags, async () => {\n await setCurrentSessionAlias(result.flags['auth-alias'])\n await addFromParsedFlags(result.flags)\n this.validateNonTTYFlags(result.flags)\n return {...result, ...{argv: result.argv as string[]}}\n })\n }\n\n protected runWithParsedOutput<T>(flags: FlagOutput, execute: () => T): T {\n const command = this.constructor as typeof BaseCommand\n const json =\n commandSupportsFlag(command.flags, 'json') &&\n (flags.json === true || (commandSupportsJsonOutputFormat(command.flags) && flags.output === 'json'))\n this.jsonOutputFromFlags ||= json\n if (json && commandEventOutputMode() !== 'json') {\n return runWithCommandEvents({outputMode: 'json', sink: renderCommandEventAsJson}, execute)\n }\n return execute()\n }\n\n protected environmentsFilename(): string | undefined {\n // To be re-implemented if needed\n return undefined\n }\n\n protected async parseEnvironmentFlags<\n TFlags extends FlagOutput,\n TGlobalFlags extends FlagOutput,\n TArgs extends ArgOutput,\n >(environment: JsonMap, options: Input<TFlags, TGlobalFlags, TArgs>, explicitFlags: FlagOutput): Promise<FlagOutput> {\n const originalArgv = this.argv\n try {\n const result = await super.parse(options, [\n ...originalArgv,\n ...argsFromEnvironment(environment, options, explicitFlags),\n ])\n return result.flags\n } finally {\n // Oclif replaces argv when parsing; the next environment needs the original arguments.\n this.argv = originalArgv\n }\n }\n\n protected validateNonTTYFlags(flags: FlagOutput): void {\n this.failMissingNonTTYFlagRequirements(flags, this.applicableNonTTYFlagRequirements(flags))\n }\n\n protected failMissingNonTTYFlags(flags: FlagOutput, requiredFlags: string[]): void {\n this.failMissingNonTTYFlagRequirements(\n flags,\n requiredFlags.map((flag) => ({flags: [flag]})),\n )\n }\n\n private failMissingNonTTYFlagRequirements(flags: FlagOutput, requirements: NonTTYFlagRequirement[]): void {\n if (terminalSupportsPrompting()) return\n\n const missingRequirements = requirements.filter((requirement) =>\n requirement.flags.every((flag) => flags[flag] === undefined || flags[flag] === false),\n )\n if (missingRequirements.length === 0) return\n\n const heading = missingRequirements.length === 1 ? 'Flag not specified' : 'Flags not specified'\n const formattedRequirements = missingRequirements\n .map((requirement) => requirement.flags.map((flag) => `--${flag}`).join(' or '))\n .join('\\n')\n const explanation = missingRequirements.length === 1 ? 'This flag is required' : 'These flags are required'\n\n throw new AbortError(\n outputContent`${heading}:\n\n${outputToken.cyan(formattedRequirements)}\n\n${explanation} in non-interactive terminal environments, such as a CI environment, or when piping input from another process.`,\n 'To resolve this, specify the options in the command, or run the command in an interactive environment such as your local terminal.',\n )\n }\n\n private applicableNonTTYFlagRequirements(flags: FlagOutput): NonTTYFlagRequirement[] {\n const command = this.constructor as unknown as {\n flags?: FlagInput\n baseFlags?: FlagInput\n nonTTYFlagRequirements?: (flags: FlagOutput) => NonTTYFlagRequirement[]\n }\n const allFlags = {...command.baseFlags, ...command.flags}\n const requirementsFromFlags = Object.entries(allFlags)\n .filter(([, flag]) => Boolean((flag as {requiredIfNonInteractive?: boolean}).requiredIfNonInteractive))\n .map(([name]) => ({flags: [name]}))\n const commandRequirements = (command.nonTTYFlagRequirements?.(flags) ?? []).filter(\n (requirement) => requirement.when?.(flags) ?? true,\n )\n\n return [...requirementsFromFlags, ...commandRequirements]\n }\n\n private async resultWithEnvironment<\n TFlags extends FlagOutput & {path?: string; verbose?: boolean},\n TGlobalFlags extends FlagOutput,\n TArgs extends ArgOutput,\n >(\n originalResult: ParserOutput<TFlags, TGlobalFlags, TArgs>,\n options?: Input<TFlags, TGlobalFlags, TArgs>,\n argv?: string[],\n ): Promise<ParserOutput<TFlags, TGlobalFlags, TArgs>> {\n const flags = originalResult.flags as EnvironmentFlags\n const environmentsFileName = this.environmentsFilename()\n\n if (!environmentsFileName) return originalResult\n\n const {environmentFilePath} = await import('./environments.js')\n const environmentFileExists = await environmentFilePath(environmentsFileName, {from: flags.path})\n\n // Handle both string and array cases for environment flag\n let environments: string[] = []\n if (flags.environment) {\n environments = Array.isArray(flags.environment) ? flags.environment : [flags.environment]\n }\n\n const environmentSpecified = environments.length > 0\n\n // Noop if no environment file exists and none was specified\n if (!environmentFileExists && !environmentSpecified) return originalResult\n\n // Noop if multiple environments were specified (let commands handle this)\n if (environmentSpecified && environments.length > 1) return originalResult\n\n const {environment, isDefaultEnvironment} = await this.loadEnvironmentForCommand(\n flags.path,\n environmentsFileName,\n environments[0],\n )\n\n if (!environment) return originalResult\n if (isDefaultEnvironment && !commandSupportsFlag(options?.flags, 'environment')) return originalResult\n\n // Parse using noDefaultsOptions to derive a list of flags specified as\n // command-line arguments.\n const noDefaultsResult = await super.parse<TFlags, TGlobalFlags, TArgs>(noDefaultsOptions(options), argv)\n\n // Remember the requested format before environment flag validation can fail.\n const effectiveFlags = {...environment, ...noDefaultsResult.flags}\n this.jsonOutputFromFlags =\n (commandSupportsFlag(options?.flags, 'json') && effectiveFlags.json === true) ||\n (commandSupportsJsonOutputFormat(options?.flags) && effectiveFlags.output === 'json')\n const normalizedEnvironment =\n commandSupportsFlag(options?.flags, 'json') &&\n commandSupportsJsonOutputFormat(options?.flags) &&\n effectiveFlags.output === 'json'\n ? {json: true, ...environment}\n : environment\n\n // Add the environment's settings to argv and pass them to `super.parse`. This\n // invokes oclif's validation system without breaking the oclif black box.\n // Replace the original result with this one.\n const result = await super.parse<TFlags, TGlobalFlags, TArgs>(options, [\n // Need to specify argv default because we're merging with argsFromEnvironment.\n ...(argv ?? this.argv),\n ...argsFromEnvironment<TFlags, TGlobalFlags, TArgs>(normalizedEnvironment, options, noDefaultsResult.flags),\n ...(isDefaultEnvironment ? ['--environment', 'default'] : []),\n ])\n\n // Report successful application of the environment.\n const report = () =>\n reportEnvironmentApplication<TFlags, TGlobalFlags, TArgs>(\n noDefaultsResult.flags,\n result.flags,\n isDefaultEnvironment ? 'default' : (environments[0] as string),\n environment,\n )\n this.runWithParsedOutput(result.flags, report)\n\n return result\n }\n\n /**\n * Tries to load an environment to forward to the command. If no environment\n * is specified it will try to load a default environment.\n */\n private async loadEnvironmentForCommand(\n path: string | undefined,\n environmentsFileName: string,\n specifiedEnvironment: string | undefined,\n ): Promise<{environment: JsonMap | undefined; isDefaultEnvironment: boolean}> {\n const {loadEnvironment} = await import('./environments.js')\n if (specifiedEnvironment) {\n const environment = await loadEnvironment(specifiedEnvironment, environmentsFileName, {from: path})\n return {environment, isDefaultEnvironment: false}\n }\n\n const environment = await loadEnvironment('default', environmentsFileName, {from: path, silent: true})\n return {environment, isDefaultEnvironment: true}\n }\n}\n\nexport async function addFromParsedFlags(flags: {path?: string; verbose?: boolean}): Promise<void> {\n await addPublicMetadata(() => ({\n cmd_all_verbose: flags.verbose,\n cmd_all_path_override: flags.path !== undefined,\n cmd_all_path_override_hash: flags.path === undefined ? undefined : hashString(flags.path),\n }))\n}\n\n/**\n * Any flag which is:\n *\n * 1. Present in the final set of flags\n * 2. Specified in the environment\n * 3. Not specified by the user as a command line argument\n *\n * should be reported.\n *\n * It doesn't matter if the environment flag's value was the same as the default; from\n * the user's perspective, they want to know their environment was applied.\n */\nfunction reportEnvironmentApplication<\n TFlags extends FlagOutput,\n TGlobalFlags extends FlagOutput,\n TArgs extends ArgOutput,\n>(\n noDefaultsFlags: ParserOutput<TFlags, TGlobalFlags, TArgs>['flags'],\n flagsWithEnvironments: ParserOutput<TFlags, TGlobalFlags, TArgs>['flags'],\n environmentName: string,\n environment: JsonMap,\n): void {\n const changes: JsonMap = {}\n for (const [name, value] of Object.entries(flagsWithEnvironments)) {\n const userSpecifiedThisFlag = Object.prototype.hasOwnProperty.call(noDefaultsFlags, name)\n const environmentContainsFlag = Object.prototype.hasOwnProperty.call(environment, name)\n if (!userSpecifiedThisFlag && environmentContainsFlag) {\n const valueToReport = name === 'password' || name === 'store-password' ? `********${value.substr(-4)}` : value\n changes[name] = valueToReport\n }\n }\n if (Object.keys(changes).length === 0) return\n\n const items = Object.entries(changes).map(([name, value]) => `${name}: ${value}`)\n if (commandEventOutputMode() === 'json') {\n emitCommandEvent({\n type: 'diagnostic',\n level: 'info',\n message: `Using applicable flags from ${environmentName} environment:\\n${items.join('\\n')}`,\n })\n return\n }\n // eslint-disable-next-line no-void\n void import('./ui.js').then(({renderInfo}) => {\n renderInfo({\n headline: ['Using applicable flags from', {userInput: environmentName}, 'environment:'],\n body: [{list: {items}}],\n })\n })\n}\n\n/**\n * Strips the defaults from configured flags. For example, if flags contains:\n *\n * ```\n * someFlag: Flags.boolean({\n * description: 'some flag',\n * default: false\n * })\n * ```\n *\n * it becomes:\n *\n * ```\n * someFlag: Flags.boolean({\n * description: 'some flag'\n * })\n * ```\n *\n * If we parse using this configuration, the only specified flags will be those\n * the user actually passed on the command line.\n */\nexport function noDefaultsOptions<TFlags extends FlagOutput, TGlobalFlags extends FlagOutput, TArgs extends ArgOutput>(\n options: Input<TFlags, TGlobalFlags, TArgs> | undefined,\n): Input<TFlags, TGlobalFlags, TArgs> | undefined {\n if (!options?.flags) return options\n return {\n ...options,\n flags: Object.fromEntries(\n Object.entries(options.flags).map(([label, settings]) => {\n const copiedSettings = {...(settings as {default?: unknown})}\n delete copiedSettings.default\n return [label, copiedSettings]\n }),\n ) as FlagInput<TFlags>,\n }\n}\n\n/**\n * Converts the environment's settings to arguments as though passed on the command\n * line, skipping any arguments the user specified on the command line.\n */\nfunction argsFromEnvironment<TFlags extends FlagOutput, TGlobalFlags extends FlagOutput, TArgs extends ArgOutput>(\n environment: JsonMap,\n options: Input<TFlags, TGlobalFlags, TArgs> | undefined,\n explicitFlags: FlagOutput,\n): string[] {\n const args: string[] = []\n for (const [label, value] of Object.entries(environment)) {\n const flagIsRelevantToCommand = commandSupportsFlag(options?.flags, label)\n const userSpecifiedThisFlag = Object.prototype.hasOwnProperty.call(explicitFlags, label)\n if (flagIsRelevantToCommand && !userSpecifiedThisFlag) {\n if (options?.flags?.[label]?.type === 'boolean' && typeof value !== 'boolean') {\n throw new AbortError(outputContent`Environment flag ${outputToken.yellow(label)} must be a boolean.`)\n }\n if (typeof value === 'boolean') {\n if (value) {\n args.push(`--${label}`)\n } else {\n throw new AbortError(\n outputContent`Environments can only specify true for boolean flags. Attempted to set ${outputToken.yellow(\n label,\n )} to false.`,\n )\n }\n } else if (Array.isArray(value)) {\n value.forEach((element) => args.push(`--${label}`, `${element}`))\n } else {\n args.push(`--${label}`, `${value}`)\n }\n }\n }\n return args\n}\n\nfunction commandSupportsFlag(flags: FlagInput | undefined, flagName: string): boolean {\n return Boolean(flags) && Object.prototype.hasOwnProperty.call(flags, flagName)\n}\n\nfunction commandSupportsJsonOutputFormat(flags: FlagInput | undefined): boolean {\n const output = flags?.output\n return output?.type === 'option' && output.options?.includes('json') === true\n}\n\nfunction appendJsonOutputSchema(description: string, outputSchema: JsonOutputSchema | undefined): string {\n if (!outputSchema) return description\n\n const jsonOutputDescription = `Use \\`--json-schema\\` to print the result, error, and event schemas.\n\nOutput from \\`--json\\` conforms to the \\`${outputSchema.name}\\` schema.\n\n\\`\\`\\`json\n${JSON.stringify(outputSchema.jsonSchema, null, 2)}\n\\`\\`\\``\n\n return [description, jsonOutputDescription].filter(Boolean).join('\\n\\n')\n}\n\nasync function removeDuplicatedPlugins(config: Config): Promise<void> {\n const plugins = Array.from(config.plugins.values())\n const bundlePlugins = ['@shopify/app', '@shopify/plugin-cloudflare']\n const pluginsToRemove = plugins.filter((plugin) => bundlePlugins.includes(plugin.name))\n if (pluginsToRemove.length > 0) {\n const commandsToRun = pluginsToRemove.map((plugin) => ` - shopify plugins remove ${plugin.name}`).join('\\n')\n const {renderWarning} = await import('./ui.js')\n renderWarning({\n headline: `Unsupported plugins detected: ${pluginsToRemove.map((plugin) => plugin.name).join(', ')}`,\n body: [\n 'They are already included in the CLI and installing them as custom plugins can cause conflicts.',\n `You can fix it by running:\\n${commandsToRun}`,\n ],\n })\n }\n const filteredPlugins = plugins.filter((plugin) => !bundlePlugins.includes(plugin.name))\n // eslint-disable-next-line require-atomic-updates -- config.plugins won't be modified by renderWarning above\n config.plugins = new Map(filteredPlugins.map((plugin) => [plugin.name, plugin]))\n}\n\nexport default BaseCommand\n"]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { type DevInstanceLogEntry } from '../../private/node/dev-instance-output.js';
|
|
2
|
+
import { Writable } from 'stream';
|
|
3
|
+
/**
|
|
4
|
+
* A stable error code for JSON consumers when a long-running command refuses to start because another instance of
|
|
5
|
+
* it is already running for the same project.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEV_INSTANCE_ALREADY_RUNNING_CODE = "dev_instance_already_running";
|
|
8
|
+
/**
|
|
9
|
+
* Describes a running instance of a long-running command such as `app dev` or `theme dev`.
|
|
10
|
+
* It's written to `.shopify/dev/<slug>.json` so agents and other tools can discover the instance.
|
|
11
|
+
*/
|
|
12
|
+
export interface DevInstanceInfo {
|
|
13
|
+
schemaVersion: 1;
|
|
14
|
+
/** Identifies this run, including when the OS reuses a PID. */
|
|
15
|
+
sessionId: string;
|
|
16
|
+
/** The command that owns the instance, for example `app dev`. */
|
|
17
|
+
command: string;
|
|
18
|
+
/** Distinguishes instances of the same command in the same directory, for example the app configuration file. */
|
|
19
|
+
key?: string;
|
|
20
|
+
pid: number;
|
|
21
|
+
status: 'starting' | 'running';
|
|
22
|
+
startedAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
/** The project directory the instance runs for. */
|
|
25
|
+
directory: string;
|
|
26
|
+
/** The JSON Lines file the instance appends its output to. */
|
|
27
|
+
logFile: string;
|
|
28
|
+
/** Command-specific, JSON-serializable details such as URLs and ports. */
|
|
29
|
+
details: {
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export { devInstanceLogOutputSchema, type DevInstanceLogEntry } from '../../private/node/dev-instance-output.js';
|
|
34
|
+
export interface DevInstancePaths {
|
|
35
|
+
/** The folder that holds every dev instance of the project: `.shopify/dev`. */
|
|
36
|
+
folder: string;
|
|
37
|
+
/** The instance description. */
|
|
38
|
+
infoFile: string;
|
|
39
|
+
/** The lock directory, owned by `proper-lockfile`. */
|
|
40
|
+
lockFile: string;
|
|
41
|
+
/** The JSON Lines log. */
|
|
42
|
+
logFile: string;
|
|
43
|
+
}
|
|
44
|
+
export interface DevInstanceIdentity {
|
|
45
|
+
/** The command that owns the instance, for example `app dev`. */
|
|
46
|
+
command: string;
|
|
47
|
+
/** The project directory. */
|
|
48
|
+
directory: string;
|
|
49
|
+
/** Distinguishes several instances of the same command in the same directory. */
|
|
50
|
+
key?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface AcquireDevInstanceOptions extends DevInstanceIdentity {
|
|
53
|
+
/** Initial command-specific details. */
|
|
54
|
+
details?: {
|
|
55
|
+
[key: string]: unknown;
|
|
56
|
+
};
|
|
57
|
+
/** Receives the exact JSONL bytes written to the session log. The caller owns this stream. */
|
|
58
|
+
logOutput?: Writable;
|
|
59
|
+
}
|
|
60
|
+
export interface DevInstanceUpdate {
|
|
61
|
+
status?: DevInstanceInfo['status'];
|
|
62
|
+
/** Merged into the existing details. */
|
|
63
|
+
details?: {
|
|
64
|
+
[key: string]: unknown;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface DevInstance {
|
|
68
|
+
readonly info: DevInstanceInfo;
|
|
69
|
+
readonly paths: DevInstancePaths;
|
|
70
|
+
/** Aborts when this session loses its lock or output fails. Consumers must stop their owned work. */
|
|
71
|
+
readonly abortSignal: AbortSignal;
|
|
72
|
+
/** Updates and persists the instance description. */
|
|
73
|
+
update: (changes: DevInstanceUpdate) => Promise<void>;
|
|
74
|
+
/** Appends one entry to the JSON Lines log. */
|
|
75
|
+
log: (entry: Omit<DevInstanceLogEntry, 'timestamp'> & {
|
|
76
|
+
timestamp?: string;
|
|
77
|
+
}) => Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Wraps a stream so every line written to it is also appended to the log, without ANSI styling.
|
|
80
|
+
* The returned stream forwards the original bytes to `target` unchanged.
|
|
81
|
+
*/
|
|
82
|
+
tee: (target: Writable, options: {
|
|
83
|
+
source: string;
|
|
84
|
+
/** Treat each string write as a complete message. Byte writes remain buffered into lines. */
|
|
85
|
+
stringWritesAreMessages?: boolean;
|
|
86
|
+
}) => Writable;
|
|
87
|
+
/** Closes the log, removes the instance description and releases the lock. Safe to call more than once. */
|
|
88
|
+
release: () => Promise<void>;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Returns the files used by a dev instance. Every instance of a project shares `.shopify/dev`,
|
|
92
|
+
* with one `<slug>.json`, `<slug>.lock` and `<slug>.jsonl` per command and key.
|
|
93
|
+
*
|
|
94
|
+
* @param identity - The command, directory and optional key of the instance.
|
|
95
|
+
* @returns The paths of the instance files.
|
|
96
|
+
*/
|
|
97
|
+
export declare function devInstancePaths(identity: DevInstanceIdentity): DevInstancePaths;
|
|
98
|
+
/**
|
|
99
|
+
* Marks this process as the running instance of a long-running command for a project.
|
|
100
|
+
*
|
|
101
|
+
* Mutual exclusion uses `proper-lockfile`: an atomic `mkdir` lock whose mtime this process refreshes as a heartbeat.
|
|
102
|
+
* An exclusive startup directory serializes abandoned-lock recovery. An interrupted startup requires explicit
|
|
103
|
+
* cleanup of that directory. A live owner blocks takeover, including when its heartbeat is stale.
|
|
104
|
+
*
|
|
105
|
+
* @param options - The instance identity, initial details.
|
|
106
|
+
* @returns The acquired instance.
|
|
107
|
+
* @throws AbortError with code {@link DEV_INSTANCE_ALREADY_RUNNING_CODE} when another live instance holds the lock.
|
|
108
|
+
*/
|
|
109
|
+
export declare function acquireDevInstance(options: AcquireDevInstanceOptions): Promise<DevInstance>;
|
|
110
|
+
/**
|
|
111
|
+
* Acquires a dev instance and releases it after the callback completes or throws.
|
|
112
|
+
*
|
|
113
|
+
* @param options - The command, project and output options for the instance.
|
|
114
|
+
* @param execute - The work to run while the instance is owned.
|
|
115
|
+
* @returns The callback's result after instance cleanup completes.
|
|
116
|
+
*/
|
|
117
|
+
export declare function withDevInstance<T>(options: AcquireDevInstanceOptions, execute: (instance: DevInstance) => T | Promise<T>): Promise<T>;
|
|
118
|
+
/**
|
|
119
|
+
* Returns the running instance of a command for a project, if there is one.
|
|
120
|
+
*
|
|
121
|
+
* @param identity - The command, directory and optional key of the instance.
|
|
122
|
+
* @returns The instance description, or undefined when no live instance holds the lock.
|
|
123
|
+
*/
|
|
124
|
+
export declare function readDevInstance(identity: DevInstanceIdentity): Promise<DevInstanceInfo | undefined>;
|
|
125
|
+
/**
|
|
126
|
+
* Lists every running dev instance of a project, across commands and keys.
|
|
127
|
+
*
|
|
128
|
+
* @param directory - The project directory.
|
|
129
|
+
* @returns The descriptions of the live instances.
|
|
130
|
+
*/
|
|
131
|
+
export declare function listDevInstances(directory: string): Promise<DevInstanceInfo[]>;
|
|
132
|
+
/**
|
|
133
|
+
* Checks whether a process exists. A process owned by another user counts as alive.
|
|
134
|
+
*
|
|
135
|
+
* @param pid - The process ID.
|
|
136
|
+
* @returns True when the process exists.
|
|
137
|
+
*/
|
|
138
|
+
export declare function isProcessAlive(pid: number): boolean;
|