@ms-cloudpack/cli 0.74.13 → 0.76.0
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/commands/init/evaluateDynamicImports.d.ts.map +1 -1
- package/lib/commands/init/evaluateDynamicImports.js +3 -0
- package/lib/commands/init/evaluateDynamicImports.js.map +1 -1
- package/lib/commands/init/init.d.ts.map +1 -1
- package/lib/commands/init/init.js +8 -1
- package/lib/commands/init/init.js.map +1 -1
- package/lib/commands/init/verifyExports.d.ts.map +1 -1
- package/lib/commands/init/verifyExports.js +53 -29
- package/lib/commands/init/verifyExports.js.map +1 -1
- package/lib/utilities/sequentialPromiseExecutor.d.ts +22 -0
- package/lib/utilities/sequentialPromiseExecutor.d.ts.map +1 -0
- package/lib/utilities/sequentialPromiseExecutor.js +51 -0
- package/lib/utilities/sequentialPromiseExecutor.js.map +1 -0
- package/package.json +19 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluateDynamicImports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/evaluateDynamicImports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,4BAA4B,CAAC;AAExF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAElF;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE;IACP,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,EACD,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,GAC5C,OAAO,CAAC;IACT,qBAAqB,EAAE,uBAAuB,EAAE,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC,
|
|
1
|
+
{"version":3,"file":"evaluateDynamicImports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/evaluateDynamicImports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,4BAA4B,CAAC;AAExF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAElF;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE;IACP,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,EACD,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,GAC5C,OAAO,CAAC;IACT,qBAAqB,EAAE,uBAAuB,EAAE,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC,CAsDD"}
|
|
@@ -17,6 +17,9 @@ export async function evaluateDynamicImports(options, context) {
|
|
|
17
17
|
let shouldRefresh = false;
|
|
18
18
|
let generatedPackageSettings;
|
|
19
19
|
for (const entryInfo of Object.values(info)) {
|
|
20
|
+
if (!entryInfo) {
|
|
21
|
+
continue; // This is to make type-checking happy
|
|
22
|
+
}
|
|
20
23
|
for (const dynamicImport of entryInfo.dynamicImports || []) {
|
|
21
24
|
if (dynamicImport.packageName !== '.') {
|
|
22
25
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluateDynamicImports.js","sourceRoot":"","sources":["../../../src/commands/init/evaluateDynamicImports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AAGzE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAIC,EACD,OAA6C;IAM7C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,UAAU,CAAC;IAClE,MAAM,WAAW,GAAG,GAAG,WAAW,IAAI,cAAc,EAAE,CAAC;IACvD,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,iCAAiC,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,qBAAqB,GAA8B,EAAE,CAAC;IAC5D,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,wBAA8D,CAAC;IAEnE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,KAAK,MAAM,aAAa,IAAI,SAAS,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;YAC3D,IAAI,aAAa,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;YACvC,4EAA4E;YAC5E,gBAAgB,GAAG,IAAI,CAAC;YACxB,wBAAwB,KAAK,MAAM,iCAAiC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5G,IAAI,wBAAwB,EAAE,cAAc,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrE,SAAS;YACX,CAAC;YAED,mGAAmG;YACnG,wBAAwB,CAAC,cAAc,KAAK,EAAE,CAAC;YAC/C,wBAAwB,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3D,aAAa,GAAG,IAAI,CAAC;YAErB,qBAAqB,CAAC,IAAI,CAAC;gBACzB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,sBAAsB;wBAC5B,MAAM,EAAE,YAAY;wBACpB,MAAM,EAAE,qCAAqC;qBAC9C;iBACF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;AACpE,CAAC","sourcesContent":["import type { BundleInfo, PartialContext } from '@ms-cloudpack/api-server';\nimport type { PackageJson, GeneratedPackageSettings } from '@ms-cloudpack/common-types';\nimport { ensureGeneratedSettingsForPackage } from '@ms-cloudpack/config';\nimport type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.js';\n\n/**\n * Check for dynamic `import()` statements of relative paths, and add any files where those are\n * found to `GeneratedPackageSettings.dynamicImports`.\n */\nexport async function evaluateDynamicImports(\n options: {\n info: BundleInfo;\n definition: PackageJson;\n packagePath: string;\n },\n context: PartialContext<'packages', 'config'>,\n): Promise<{\n dynamicImportsChanges: GeneratedPackageChanges[];\n shouldReevaluate: boolean;\n shouldRefresh: boolean;\n}> {\n const { info, definition, packagePath } = options;\n const { packages, session } = context;\n const { config } = session;\n\n const { name: packageName, version: packageVersion } = definition;\n const displayName = `${packageName}@${packageVersion}`;\n if (!packageName || !packageVersion) {\n throw new Error(`Package \"${displayName}\" is missing a name or version.`);\n }\n\n const dynamicImportsChanges: GeneratedPackageChanges[] = [];\n let shouldReevaluate = false;\n let shouldRefresh = false;\n let generatedPackageSettings: GeneratedPackageSettings | undefined;\n\n for (const entryInfo of Object.values(info)) {\n for (const dynamicImport of entryInfo.dynamicImports || []) {\n if (dynamicImport.packageName !== '.') {\n continue;\n }\n\n const { importOrigin } = dynamicImport;\n // TODO: does this actually need to re-evaluate if there are no new imports?\n shouldReevaluate = true;\n generatedPackageSettings ??= await ensureGeneratedSettingsForPackage({ packagePath }, { config, packages });\n if (generatedPackageSettings?.dynamicImports?.includes(importOrigin)) {\n continue;\n }\n\n // We are missing an import path. We need to add this entry to the exports map in package settings.\n generatedPackageSettings.dynamicImports ??= [];\n generatedPackageSettings.dynamicImports.push(importOrigin);\n shouldRefresh = true;\n\n dynamicImportsChanges.push({\n name: packageName,\n version: packageVersion,\n path: packagePath,\n changes: [\n {\n type: 'added-dynamic-import',\n change: importOrigin,\n reason: `Found non-literal path in import().`,\n },\n ],\n });\n }\n }\n\n return { dynamicImportsChanges, shouldReevaluate, shouldRefresh };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"evaluateDynamicImports.js","sourceRoot":"","sources":["../../../src/commands/init/evaluateDynamicImports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AAGzE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAIC,EACD,OAA6C;IAM7C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,UAAU,CAAC;IAClE,MAAM,WAAW,GAAG,GAAG,WAAW,IAAI,cAAc,EAAE,CAAC;IACvD,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,iCAAiC,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,qBAAqB,GAA8B,EAAE,CAAC;IAC5D,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,wBAA8D,CAAC;IAEnE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,CAAC,sCAAsC;QAClD,CAAC;QACD,KAAK,MAAM,aAAa,IAAI,SAAS,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;YAC3D,IAAI,aAAa,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;YACvC,4EAA4E;YAC5E,gBAAgB,GAAG,IAAI,CAAC;YACxB,wBAAwB,KAAK,MAAM,iCAAiC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5G,IAAI,wBAAwB,EAAE,cAAc,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrE,SAAS;YACX,CAAC;YAED,mGAAmG;YACnG,wBAAwB,CAAC,cAAc,KAAK,EAAE,CAAC;YAC/C,wBAAwB,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3D,aAAa,GAAG,IAAI,CAAC;YAErB,qBAAqB,CAAC,IAAI,CAAC;gBACzB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,sBAAsB;wBAC5B,MAAM,EAAE,YAAY;wBACpB,MAAM,EAAE,qCAAqC;qBAC9C;iBACF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;AACpE,CAAC","sourcesContent":["import type { BundleInfo, PartialContext } from '@ms-cloudpack/api-server';\nimport type { PackageJson, GeneratedPackageSettings } from '@ms-cloudpack/common-types';\nimport { ensureGeneratedSettingsForPackage } from '@ms-cloudpack/config';\nimport type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.js';\n\n/**\n * Check for dynamic `import()` statements of relative paths, and add any files where those are\n * found to `GeneratedPackageSettings.dynamicImports`.\n */\nexport async function evaluateDynamicImports(\n options: {\n info: BundleInfo;\n definition: PackageJson;\n packagePath: string;\n },\n context: PartialContext<'packages', 'config'>,\n): Promise<{\n dynamicImportsChanges: GeneratedPackageChanges[];\n shouldReevaluate: boolean;\n shouldRefresh: boolean;\n}> {\n const { info, definition, packagePath } = options;\n const { packages, session } = context;\n const { config } = session;\n\n const { name: packageName, version: packageVersion } = definition;\n const displayName = `${packageName}@${packageVersion}`;\n if (!packageName || !packageVersion) {\n throw new Error(`Package \"${displayName}\" is missing a name or version.`);\n }\n\n const dynamicImportsChanges: GeneratedPackageChanges[] = [];\n let shouldReevaluate = false;\n let shouldRefresh = false;\n let generatedPackageSettings: GeneratedPackageSettings | undefined;\n\n for (const entryInfo of Object.values(info)) {\n if (!entryInfo) {\n continue; // This is to make type-checking happy\n }\n for (const dynamicImport of entryInfo.dynamicImports || []) {\n if (dynamicImport.packageName !== '.') {\n continue;\n }\n\n const { importOrigin } = dynamicImport;\n // TODO: does this actually need to re-evaluate if there are no new imports?\n shouldReevaluate = true;\n generatedPackageSettings ??= await ensureGeneratedSettingsForPackage({ packagePath }, { config, packages });\n if (generatedPackageSettings?.dynamicImports?.includes(importOrigin)) {\n continue;\n }\n\n // We are missing an import path. We need to add this entry to the exports map in package settings.\n generatedPackageSettings.dynamicImports ??= [];\n generatedPackageSettings.dynamicImports.push(importOrigin);\n shouldRefresh = true;\n\n dynamicImportsChanges.push({\n name: packageName,\n version: packageVersion,\n path: packagePath,\n changes: [\n {\n type: 'added-dynamic-import',\n change: importOrigin,\n reason: `Found non-literal path in import().`,\n },\n ],\n });\n }\n }\n\n return { dynamicImportsChanges, shouldReevaluate, shouldRefresh };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAU3F;;GAEG;AACH,wBAAsB,IAAI,CACxB,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAAC,GAAG;IACnG;;;OAGG;IACH,WAAW,EAAE,eAAe,CAAC;CAC9B,GACA,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -8,6 +8,7 @@ import { runPrerequisites } from '../../utilities/runPrerequisites.js';
|
|
|
8
8
|
import { getFilteredPackages } from '../../utilities/getFilteredPackages.js';
|
|
9
9
|
import { optimizeDependencies } from './optimizeDependencies.js';
|
|
10
10
|
import { bulletedList } from '@ms-cloudpack/task-reporter';
|
|
11
|
+
import { SequentialPromiseExecutor } from '../../utilities/sequentialPromiseExecutor.js';
|
|
11
12
|
/**
|
|
12
13
|
* Init execution function.
|
|
13
14
|
*/
|
|
@@ -29,6 +30,7 @@ async function initApp(options, context) {
|
|
|
29
30
|
const { match } = initOptions;
|
|
30
31
|
const { config, resolveMap } = context.session;
|
|
31
32
|
const { appPath } = config;
|
|
33
|
+
const executor = new SequentialPromiseExecutor();
|
|
32
34
|
// Ensure config.generated.packageSettings is initialized.
|
|
33
35
|
config.generated.packageSettings ??= [];
|
|
34
36
|
let isExitingPrematurely = false;
|
|
@@ -65,6 +67,9 @@ async function initApp(options, context) {
|
|
|
65
67
|
const priority = priorityMap.get(packagePath) ?? 0;
|
|
66
68
|
// Lower priority of this package path by 1.
|
|
67
69
|
priorityMap.set(packagePath, priority - 1);
|
|
70
|
+
// Use the sequential executor to run the evaluation to avoid concurrency issues.
|
|
71
|
+
executor
|
|
72
|
+
.execute(packagePath, () =>
|
|
68
73
|
// Evaluate this path, but don't await - when we're done, we'll re-enqueue newly discovered paths.
|
|
69
74
|
evaluatePath({
|
|
70
75
|
...options,
|
|
@@ -74,7 +79,7 @@ async function initApp(options, context) {
|
|
|
74
79
|
// as we'll re-evaluate packages if they are different since we use a different task id.
|
|
75
80
|
shouldForce: !isMultiApp && shouldForce,
|
|
76
81
|
priority,
|
|
77
|
-
}, context)
|
|
82
|
+
}, context))
|
|
78
83
|
.then(({ pathsToEvaluate, pathsToRefresh, shouldExit }) => {
|
|
79
84
|
pending--;
|
|
80
85
|
if (shouldExit) {
|
|
@@ -118,6 +123,8 @@ async function initApp(options, context) {
|
|
|
118
123
|
isExitingPrematurely = true;
|
|
119
124
|
summaryData.recordException({ packagePath: appPath, error, source: 'init', context: 'running init' });
|
|
120
125
|
});
|
|
126
|
+
// Clear the executor so that it doesn't hold onto any references to the promises.
|
|
127
|
+
executor.clear();
|
|
121
128
|
// Log the resolve map to a file if requested. Do this *after* the main init process in case
|
|
122
129
|
// any additional deps were discovered and added.
|
|
123
130
|
if (initOptions.logResolveMap) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EnsurePackageBundledContext } from '@ms-cloudpack/api-server';\nimport type { PackageImporterContext } from '@ms-cloudpack/common-types';\nimport type { InitOptions } from './types/InitOptions.js';\n\nimport { createPartialApiContext } from '@ms-cloudpack/api-server';\nimport { writeGeneratedConfig } from '@ms-cloudpack/config';\nimport type { InitSummaryData } from './InitSummaryData.js';\nimport { evaluatePath } from './evaluatePath.js';\nimport { verifyExports } from './verifyExports.js';\nimport type { AppCommandContext, CommandActionParams } from '../../types/CommandAction.js';\nimport path from 'path';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport { runPrerequisites } from '../../utilities/runPrerequisites.js';\nimport { getFilteredPackages } from '../../utilities/getFilteredPackages.js';\nimport { optimizeDependencies } from './optimizeDependencies.js';\nimport { bulletedList } from '@ms-cloudpack/task-reporter';\nimport type { InitAppOptions } from './types/InitAppOptions.js';\n\n/**\n * Init execution function.\n */\nexport async function init(\n params: Pick<CommandActionParams<InitOptions>, keyof AppCommandContext | 'options' | 'isMultiApp'> & {\n /**\n * App summary object, created ahead of time so that a partial summary can be generated\n * if the process is interrupted.\n */\n summaryData: InitSummaryData;\n },\n): Promise<void> {\n const { options: initOptions, summaryData, isMultiApp, config, telemetryClient } = params;\n\n await telemetryClient.tracer.startActiveSpan('INIT_APP', async (span) => {\n // Run prerequisites for the app.\n await runPrerequisites(params);\n\n // If --reset is specified, reset the generated config.\n if (initOptions.reset) {\n config.generated = {};\n }\n\n const context = await createPartialApiContext(params);\n\n await initApp({ span, summaryData, initOptions, isMultiApp }, context);\n });\n}\n\nasync function initApp(options: InitAppOptions, context: EnsurePackageBundledContext): Promise<void> {\n const { initOptions, summaryData, span, isMultiApp } = options;\n const { match } = initOptions;\n const { config, resolveMap } = context.session;\n const { appPath } = config;\n\n // Ensure config.generated.packageSettings is initialized.\n config.generated.packageSettings ??= [];\n\n let isExitingPrematurely = false;\n\n await new Promise<void>((resolve) => {\n let pending = 0;\n const visitedSet = new Set<string>();\n const refreshPaths = new Set<string>();\n const priorityMap = new Map<string, number>();\n\n // Start with the app path or requested matches\n const initialPaths = match ? getFilteredPackages(resolveMap, match) : [appPath];\n if (!initialPaths.length) {\n summaryData.addErrors(appPath, [{ text: `No packages found matching ${match}`, source: 'init' }]);\n resolve();\n }\n\n enqueuePaths(new Map(initialPaths.map((packagePath) => [packagePath, undefined])));\n\n /**\n * Enqueue more paths.\n * @param newPaths Mapping from package path to importer context.\n */\n function enqueuePaths(newPaths: Map<string, PackageImporterContext | undefined>): void {\n if (isExitingPrematurely) {\n return;\n }\n\n // Iterate through the given paths.\n for (const [packagePath, importerContext] of newPaths) {\n if (visitedSet.has(packagePath)) {\n console.debug(`Skipping ${packagePath} as it has already been visited.`);\n continue;\n }\n\n visitedSet.add(packagePath);\n pending++;\n\n const shouldForce = refreshPaths.delete(packagePath);\n\n // Get the priority value for this package path, defaults to 0.\n const priority = priorityMap.get(packagePath) ?? 0;\n // Lower priority of this package path by 1.\n priorityMap.set(packagePath, priority - 1);\n\n // Evaluate this path, but don't await - when we're done, we'll re-enqueue newly discovered paths.\n evaluatePath(\n {\n ...options,\n packagePath,\n importerContext,\n // No need to force if we're in a multi-app scenario\n // as we'll re-evaluate packages if they are different since we use a different task id.\n shouldForce: !isMultiApp && shouldForce,\n priority,\n },\n context,\n )\n .then(({ pathsToEvaluate, pathsToRefresh, shouldExit }) => {\n pending--;\n\n if (shouldExit) {\n isExitingPrematurely = true;\n } else if (pathsToEvaluate?.size) {\n // If there are packages that need to be rebuilt, delete them from the visited set to re-enqueue them\n // and add them to the refresh set so that on re-enqueuing we pass the `shouldRerun` flag through\n // on single app runs.\n pathsToRefresh?.forEach((refreshPath) => {\n refreshPaths.add(refreshPath);\n visitedSet.delete(refreshPath);\n });\n\n // Try to enqueue the new paths.\n console.debug(\n `Enqueuing paths found from ${packagePath}:\\n` +\n bulletedList(\n [...pathsToEvaluate].map(([newPath, newContext]) => `${newPath} ${JSON.stringify(newContext)}`),\n ),\n );\n enqueuePaths(pathsToEvaluate);\n }\n\n // If nothing is pending after this call, we're complete.\n if (!pending) {\n resolve();\n }\n })\n .catch((error: unknown) => {\n // Record the exception as an init error for the package.\n // This gives better context than a stack trace which could have come from any package.\n let prefix = 'evaluating package';\n if (importerContext) {\n prefix += ` (context: ${JSON.stringify(importerContext, null, 2).replace(/\\s+/g, ' ')})`;\n }\n summaryData.recordException({ packagePath, error, source: 'init', context: prefix });\n\n // Don't immediately stop evaluation, but don't enqueue more paths.\n isExitingPrematurely = true;\n });\n }\n }\n }).catch((error: unknown) => {\n // If there's an error thrown from some other part of the promise besides evaluatePath (not likely),\n // record it as an init error for the app instead of allowing it to propagate.\n // This allows the overall init summary and any other errors to be logged as usual.\n isExitingPrematurely = true;\n summaryData.recordException({ packagePath: appPath, error, source: 'init', context: 'running init' });\n });\n\n // Log the resolve map to a file if requested. Do this *after* the main init process in case\n // any additional deps were discovered and added.\n if (initOptions.logResolveMap) {\n console.log('\\nWriting resolve map to `resolve-map.json`.');\n await writeJson(path.join(appPath, 'resolve-map.json'), resolveMap);\n }\n\n if (isExitingPrematurely) {\n span.setAttribute('isExitingPrematurely', true);\n } else {\n // Only do extra checks if there's not a major error already\n if (config.features?.optimizeDependencies) {\n // Conditionally scan dependency usage so that we can populate\n // include/excludeDependencies automatically, ensuring the dep list\n // is both minimal (remove unused deps) and complete (include\n // specific devDeps.)\n const excludedDependenciesChanges = await optimizeDependencies(summaryData.getResults(), context);\n summaryData.recordGeneratedChanges(excludedDependenciesChanges);\n }\n\n if (config.features?.verifyExports) {\n const packageResults = await verifyExports(summaryData.getResults(), context);\n for (const [packagePath, errors] of Object.entries(packageResults)) {\n summaryData.addErrors(packagePath, errors);\n }\n }\n }\n\n // The feature \"removeUnusedExports\" doesn't (yet) write summary changes, but we still\n // want to write the generated config if that featureFlag is on.\n const hasSummaryChanges = config.features?.removeUnusedExports || summaryData.hasChanges();\n\n if (!initOptions.check && hasSummaryChanges) {\n // Update the generated config: either write it if there are settings, or delete it if it\n // previously existed but is no longer needed.\n const generatedResult = await writeGeneratedConfig(config.generated, appPath);\n if (generatedResult === 'deleted') {\n summaryData.deletedGeneratedConfig = true;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AAEzF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,MAMC;IAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAE1F,MAAM,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtE,iCAAiC;QACjC,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE/B,uDAAuD;QACvD,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAEtD,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAuB,EAAE,OAAoC;IAClF,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/D,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,yBAAyB,EAAE,CAAC;IAEjD,0DAA0D;IAC1D,MAAM,CAAC,SAAS,CAAC,eAAe,KAAK,EAAE,CAAC;IAExC,IAAI,oBAAoB,GAAG,KAAK,CAAC;IAEjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE9C,+CAA+C;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAChF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACzB,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAClG,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,YAAY,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnF;;;WAGG;QACH,SAAS,YAAY,CAAC,QAAyD;YAC7E,IAAI,oBAAoB,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,mCAAmC;YACnC,KAAK,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACtD,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;oBAChC,OAAO,CAAC,KAAK,CAAC,YAAY,WAAW,kCAAkC,CAAC,CAAC;oBACzE,SAAS;gBACX,CAAC;gBAED,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC5B,OAAO,EAAE,CAAC;gBAEV,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAErD,+DAA+D;gBAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACnD,4CAA4C;gBAC5C,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAE3C,iFAAiF;gBACjF,QAAQ;qBACL,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE;gBACzB,kGAAkG;gBAClG,YAAY,CACV;oBACE,GAAG,OAAO;oBACV,WAAW;oBACX,eAAe;oBACf,oDAAoD;oBACpD,wFAAwF;oBACxF,WAAW,EAAE,CAAC,UAAU,IAAI,WAAW;oBACvC,QAAQ;iBACT,EACD,OAAO,CACR,CACF;qBACA,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE;oBACxD,OAAO,EAAE,CAAC;oBAEV,IAAI,UAAU,EAAE,CAAC;wBACf,oBAAoB,GAAG,IAAI,CAAC;oBAC9B,CAAC;yBAAM,IAAI,eAAe,EAAE,IAAI,EAAE,CAAC;wBACjC,qGAAqG;wBACrG,iGAAiG;wBACjG,sBAAsB;wBACtB,cAAc,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;4BACtC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;4BAC9B,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;wBACjC,CAAC,CAAC,CAAC;wBAEH,gCAAgC;wBAChC,OAAO,CAAC,KAAK,CACX,8BAA8B,WAAW,KAAK;4BAC5C,YAAY,CACV,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAChG,CACJ,CAAC;wBACF,YAAY,CAAC,eAAe,CAAC,CAAC;oBAChC,CAAC;oBAED,yDAAyD;oBACzD,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBACxB,yDAAyD;oBACzD,uFAAuF;oBACvF,IAAI,MAAM,GAAG,oBAAoB,CAAC;oBAClC,IAAI,eAAe,EAAE,CAAC;wBACpB,MAAM,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC;oBAC3F,CAAC;oBACD,WAAW,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBAErF,mEAAmE;oBACnE,oBAAoB,GAAG,IAAI,CAAC;gBAC9B,CAAC,CAAC,CAAC;YACP,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC1B,oGAAoG;QACpG,8EAA8E;QAC9E,mFAAmF;QACnF,oBAAoB,GAAG,IAAI,CAAC;QAC5B,WAAW,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;IAEH,kFAAkF;IAClF,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEjB,4FAA4F;IAC5F,iDAAiD;IACjD,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,UAAU,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,4DAA4D;QAC5D,IAAI,MAAM,CAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAC;YAC1C,8DAA8D;YAC9D,mEAAmE;YACnE,6DAA6D;YAC7D,qBAAqB;YACrB,MAAM,2BAA2B,GAAG,MAAM,oBAAoB,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;YAClG,WAAW,CAAC,sBAAsB,CAAC,2BAA2B,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;YAC9E,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACnE,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,sFAAsF;IACtF,gEAAgE;IAChE,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,EAAE,mBAAmB,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;IAE3F,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,iBAAiB,EAAE,CAAC;QAC5C,yFAAyF;QACzF,8CAA8C;QAC9C,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,WAAW,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import type { EnsurePackageBundledContext } from '@ms-cloudpack/api-server';\nimport type { PackageImporterContext } from '@ms-cloudpack/common-types';\nimport type { InitOptions } from './types/InitOptions.js';\n\nimport { createPartialApiContext } from '@ms-cloudpack/api-server';\nimport { writeGeneratedConfig } from '@ms-cloudpack/config';\nimport type { InitSummaryData } from './InitSummaryData.js';\nimport { evaluatePath } from './evaluatePath.js';\nimport { verifyExports } from './verifyExports.js';\nimport type { AppCommandContext, CommandActionParams } from '../../types/CommandAction.js';\nimport path from 'path';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport { runPrerequisites } from '../../utilities/runPrerequisites.js';\nimport { getFilteredPackages } from '../../utilities/getFilteredPackages.js';\nimport { optimizeDependencies } from './optimizeDependencies.js';\nimport { bulletedList } from '@ms-cloudpack/task-reporter';\nimport type { InitAppOptions } from './types/InitAppOptions.js';\nimport { SequentialPromiseExecutor } from '../../utilities/sequentialPromiseExecutor.js';\n\n/**\n * Init execution function.\n */\nexport async function init(\n params: Pick<CommandActionParams<InitOptions>, keyof AppCommandContext | 'options' | 'isMultiApp'> & {\n /**\n * App summary object, created ahead of time so that a partial summary can be generated\n * if the process is interrupted.\n */\n summaryData: InitSummaryData;\n },\n): Promise<void> {\n const { options: initOptions, summaryData, isMultiApp, config, telemetryClient } = params;\n\n await telemetryClient.tracer.startActiveSpan('INIT_APP', async (span) => {\n // Run prerequisites for the app.\n await runPrerequisites(params);\n\n // If --reset is specified, reset the generated config.\n if (initOptions.reset) {\n config.generated = {};\n }\n\n const context = await createPartialApiContext(params);\n\n await initApp({ span, summaryData, initOptions, isMultiApp }, context);\n });\n}\n\nasync function initApp(options: InitAppOptions, context: EnsurePackageBundledContext): Promise<void> {\n const { initOptions, summaryData, span, isMultiApp } = options;\n const { match } = initOptions;\n const { config, resolveMap } = context.session;\n const { appPath } = config;\n const executor = new SequentialPromiseExecutor();\n\n // Ensure config.generated.packageSettings is initialized.\n config.generated.packageSettings ??= [];\n\n let isExitingPrematurely = false;\n\n await new Promise<void>((resolve) => {\n let pending = 0;\n const visitedSet = new Set<string>();\n const refreshPaths = new Set<string>();\n const priorityMap = new Map<string, number>();\n\n // Start with the app path or requested matches\n const initialPaths = match ? getFilteredPackages(resolveMap, match) : [appPath];\n if (!initialPaths.length) {\n summaryData.addErrors(appPath, [{ text: `No packages found matching ${match}`, source: 'init' }]);\n resolve();\n }\n\n enqueuePaths(new Map(initialPaths.map((packagePath) => [packagePath, undefined])));\n\n /**\n * Enqueue more paths.\n * @param newPaths Mapping from package path to importer context.\n */\n function enqueuePaths(newPaths: Map<string, PackageImporterContext | undefined>): void {\n if (isExitingPrematurely) {\n return;\n }\n\n // Iterate through the given paths.\n for (const [packagePath, importerContext] of newPaths) {\n if (visitedSet.has(packagePath)) {\n console.debug(`Skipping ${packagePath} as it has already been visited.`);\n continue;\n }\n\n visitedSet.add(packagePath);\n pending++;\n\n const shouldForce = refreshPaths.delete(packagePath);\n\n // Get the priority value for this package path, defaults to 0.\n const priority = priorityMap.get(packagePath) ?? 0;\n // Lower priority of this package path by 1.\n priorityMap.set(packagePath, priority - 1);\n\n // Use the sequential executor to run the evaluation to avoid concurrency issues.\n executor\n .execute(packagePath, () =>\n // Evaluate this path, but don't await - when we're done, we'll re-enqueue newly discovered paths.\n evaluatePath(\n {\n ...options,\n packagePath,\n importerContext,\n // No need to force if we're in a multi-app scenario\n // as we'll re-evaluate packages if they are different since we use a different task id.\n shouldForce: !isMultiApp && shouldForce,\n priority,\n },\n context,\n ),\n )\n .then(({ pathsToEvaluate, pathsToRefresh, shouldExit }) => {\n pending--;\n\n if (shouldExit) {\n isExitingPrematurely = true;\n } else if (pathsToEvaluate?.size) {\n // If there are packages that need to be rebuilt, delete them from the visited set to re-enqueue them\n // and add them to the refresh set so that on re-enqueuing we pass the `shouldRerun` flag through\n // on single app runs.\n pathsToRefresh?.forEach((refreshPath) => {\n refreshPaths.add(refreshPath);\n visitedSet.delete(refreshPath);\n });\n\n // Try to enqueue the new paths.\n console.debug(\n `Enqueuing paths found from ${packagePath}:\\n` +\n bulletedList(\n [...pathsToEvaluate].map(([newPath, newContext]) => `${newPath} ${JSON.stringify(newContext)}`),\n ),\n );\n enqueuePaths(pathsToEvaluate);\n }\n\n // If nothing is pending after this call, we're complete.\n if (!pending) {\n resolve();\n }\n })\n .catch((error: unknown) => {\n // Record the exception as an init error for the package.\n // This gives better context than a stack trace which could have come from any package.\n let prefix = 'evaluating package';\n if (importerContext) {\n prefix += ` (context: ${JSON.stringify(importerContext, null, 2).replace(/\\s+/g, ' ')})`;\n }\n summaryData.recordException({ packagePath, error, source: 'init', context: prefix });\n\n // Don't immediately stop evaluation, but don't enqueue more paths.\n isExitingPrematurely = true;\n });\n }\n }\n }).catch((error: unknown) => {\n // If there's an error thrown from some other part of the promise besides evaluatePath (not likely),\n // record it as an init error for the app instead of allowing it to propagate.\n // This allows the overall init summary and any other errors to be logged as usual.\n isExitingPrematurely = true;\n summaryData.recordException({ packagePath: appPath, error, source: 'init', context: 'running init' });\n });\n\n // Clear the executor so that it doesn't hold onto any references to the promises.\n executor.clear();\n\n // Log the resolve map to a file if requested. Do this *after* the main init process in case\n // any additional deps were discovered and added.\n if (initOptions.logResolveMap) {\n console.log('\\nWriting resolve map to `resolve-map.json`.');\n await writeJson(path.join(appPath, 'resolve-map.json'), resolveMap);\n }\n\n if (isExitingPrematurely) {\n span.setAttribute('isExitingPrematurely', true);\n } else {\n // Only do extra checks if there's not a major error already\n if (config.features?.optimizeDependencies) {\n // Conditionally scan dependency usage so that we can populate\n // include/excludeDependencies automatically, ensuring the dep list\n // is both minimal (remove unused deps) and complete (include\n // specific devDeps.)\n const excludedDependenciesChanges = await optimizeDependencies(summaryData.getResults(), context);\n summaryData.recordGeneratedChanges(excludedDependenciesChanges);\n }\n\n if (config.features?.verifyExports) {\n const packageResults = await verifyExports(summaryData.getResults(), context);\n for (const [packagePath, errors] of Object.entries(packageResults)) {\n summaryData.addErrors(packagePath, errors);\n }\n }\n }\n\n // The feature \"removeUnusedExports\" doesn't (yet) write summary changes, but we still\n // want to write the generated config if that featureFlag is on.\n const hasSummaryChanges = config.features?.removeUnusedExports || summaryData.hasChanges();\n\n if (!initOptions.check && hasSummaryChanges) {\n // Update the generated config: either write it if there are settings, or delete it if it\n // previously existed but is no longer needed.\n const generatedResult = await writeGeneratedConfig(config.generated, appPath);\n if (generatedResult === 'deleted') {\n summaryData.deletedGeneratedConfig = true;\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyExports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EACV,aAAa,EAMd,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAMtE;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACjD,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,YAAY,CAAC,GAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"verifyExports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EACV,aAAa,EAMd,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAMtE;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACjD,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,YAAY,CAAC,GAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAmL1C"}
|
|
@@ -49,13 +49,17 @@ export async function verifyExports(packageResults, context) {
|
|
|
49
49
|
const sourceMainEntry = await getSourceEntry({ entry: '.', inputPath: parentPath }, { packages, config });
|
|
50
50
|
const importingSource = path.join(parentPath, sourceMainEntry || '.');
|
|
51
51
|
// Iterate through each entry path from the parent package
|
|
52
|
-
for (const
|
|
52
|
+
for (const parentInfo of Object.values(parentResult.info)) {
|
|
53
53
|
// Skip entries with no imports
|
|
54
|
-
if (!consumes?.length) {
|
|
54
|
+
if (!parentInfo?.consumes?.length) {
|
|
55
55
|
continue;
|
|
56
56
|
}
|
|
57
57
|
// Iterate through each imported package
|
|
58
|
-
for (const { packageName: depName, importPath: depImportPath, names: consumedNames } of consumes) {
|
|
58
|
+
for (const { packageName: depName, importPath: depImportPath, names: consumedNames } of parentInfo.consumes) {
|
|
59
|
+
// Skip imports from the current package or the same package name.
|
|
60
|
+
if (depName === '.' || depName === parentDefinition.name) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
59
63
|
const dependencyInfo = getDependencyInfo({
|
|
60
64
|
packageName: depName,
|
|
61
65
|
definition: parentDefinition,
|
|
@@ -75,6 +79,7 @@ export async function verifyExports(packageResults, context) {
|
|
|
75
79
|
continue;
|
|
76
80
|
}
|
|
77
81
|
const importProducesStarResult = await importProducesStar({
|
|
82
|
+
name: depName,
|
|
78
83
|
packagePath: depResolveMapEntry.path,
|
|
79
84
|
importPath: depImportPath,
|
|
80
85
|
info: depEntries,
|
|
@@ -101,7 +106,7 @@ export async function verifyExports(packageResults, context) {
|
|
|
101
106
|
importName: depName,
|
|
102
107
|
importPath: depImportPath,
|
|
103
108
|
importVersion: depResolveMapEntry.version,
|
|
104
|
-
bundledFile: path.join(depOutputPath ?? '', depEntries[depImportPath]?.bundlePath),
|
|
109
|
+
bundledFile: path.join(depOutputPath ?? '', depEntries[depImportPath]?.bundlePath || '.'),
|
|
105
110
|
};
|
|
106
111
|
missing.forEach((m) => depsMissingExports[depKey][filePath].missingNames.add(m));
|
|
107
112
|
// Check if the package satisfies the parent semver requirement.
|
|
@@ -143,7 +148,7 @@ export async function verifyExports(packageResults, context) {
|
|
|
143
148
|
return allErrors;
|
|
144
149
|
}
|
|
145
150
|
async function importProducesStar(params) {
|
|
146
|
-
const { packagePath, info, importPath, context, visited = new Set(), cache = {} } = params;
|
|
151
|
+
const { name, packagePath, info, importPath, context, visited = new Set(), cache = {} } = params;
|
|
147
152
|
const key = `${packagePath}${importPath}`;
|
|
148
153
|
// Check if the entry has already been visited to avoid cycles
|
|
149
154
|
if (visited.has(key)) {
|
|
@@ -157,33 +162,52 @@ async function importProducesStar(params) {
|
|
|
157
162
|
}
|
|
158
163
|
const { packages, resolveMap, packageResultsArray } = context;
|
|
159
164
|
let result = [];
|
|
165
|
+
if (!info[importPath]) {
|
|
166
|
+
// If the importPath is not found in the info, return an empty array.
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
160
169
|
// Iterate over the produced names
|
|
161
|
-
for (const
|
|
162
|
-
if (
|
|
163
|
-
// Extract the name and path from the format "*ImportString"
|
|
164
|
-
const { packageName: depName, importPath: depImportPath } = parseImportString(name.slice(1));
|
|
165
|
-
const dependencyInfo = getDependencyInfo({
|
|
166
|
-
packageName: depName,
|
|
167
|
-
definition: await packages.get(packagePath),
|
|
168
|
-
resolveMap,
|
|
169
|
-
packageResultsArray,
|
|
170
|
-
});
|
|
171
|
-
if (dependencyInfo) {
|
|
172
|
-
const { depResolveMapEntry, depResult } = dependencyInfo;
|
|
173
|
-
// Recursively aggregate the produced names from the other package
|
|
174
|
-
result = result.concat(await importProducesStar({
|
|
175
|
-
packagePath: depResolveMapEntry.path,
|
|
176
|
-
info: depResult.info,
|
|
177
|
-
importPath: depImportPath,
|
|
178
|
-
context,
|
|
179
|
-
visited,
|
|
180
|
-
}));
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
170
|
+
for (const exportedName of info[importPath].produces) {
|
|
171
|
+
if (!exportedName.startsWith('*')) {
|
|
184
172
|
// Add the name to the result if it doesn't start with '*'
|
|
185
|
-
result.push(
|
|
173
|
+
result.push(exportedName);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
// Extract the name and path from the format "*ImportString"
|
|
177
|
+
const { packageName: depName, importPath: depImportPath } = parseImportString(exportedName.slice(1));
|
|
178
|
+
if (depName === name) {
|
|
179
|
+
// Reuse the current packagePath and info if it is an import from the same package.
|
|
180
|
+
result = result.concat(await importProducesStar({
|
|
181
|
+
name,
|
|
182
|
+
packagePath,
|
|
183
|
+
info,
|
|
184
|
+
importPath: depImportPath,
|
|
185
|
+
context,
|
|
186
|
+
visited,
|
|
187
|
+
cache,
|
|
188
|
+
}));
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const dependencyInfo = getDependencyInfo({
|
|
192
|
+
packageName: depName,
|
|
193
|
+
definition: await packages.get(packagePath),
|
|
194
|
+
resolveMap,
|
|
195
|
+
packageResultsArray,
|
|
196
|
+
});
|
|
197
|
+
if (!dependencyInfo) {
|
|
198
|
+
continue; // Skip if we can't find the imported package in the resolve map, or there's no info about its entries/exports.
|
|
186
199
|
}
|
|
200
|
+
const { depResolveMapEntry, depResult } = dependencyInfo;
|
|
201
|
+
// Recursively aggregate the produced names from the other package
|
|
202
|
+
result = result.concat(await importProducesStar({
|
|
203
|
+
name: depName,
|
|
204
|
+
packagePath: depResolveMapEntry.path,
|
|
205
|
+
info: depResult.info,
|
|
206
|
+
importPath: depImportPath,
|
|
207
|
+
context,
|
|
208
|
+
visited,
|
|
209
|
+
cache,
|
|
210
|
+
}));
|
|
187
211
|
}
|
|
188
212
|
cache[key] = result;
|
|
189
213
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyExports.js","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACvG,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAmB,MAAM,6BAA6B,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,cAAiD,EACjD,OAA4D;IAE5D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,SAAS,GAAoC,EAAE,CAAC;IACtD,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,YAAY,GAA6B,EAAE,CAAC;IAElD,+BAA+B;IAC/B,KAAK,MAAM,YAAY,IAAI,mBAAmB,EAAE,CAAC;QAC/C,6CAA6C;QAC7C,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACnF,SAAS;QACX,CAAC;QAED,yDAAyD;QACzD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC;QACzD,MAAM,oBAAoB,GACxB,kBAAkB,CAAC;YACjB,IAAI;YACJ,OAAO;YACP,mBAAmB,EAAE,MAAM,CAAC,eAAe;YAC3C,cAAc,EAAE,IAAI;YACpB,wBAAwB,EAAE,SAAS;SACpC,CAAC,CAAC,mBAAmB,EAAE,oBAAoB,IAAI,EAAE,CAAC;QAErD,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,qBAAqB,GAAG,eAAe,CAAC,gBAAgB,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtF;;;WAGG;QACH,MAAM,kBAAkB,GAYpB,EAAE,CAAC;QACP,MAAM,aAAa,GAA2B,EAAE,CAAC;QAEjD,oFAAoF;QACpF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QAEvG,oFAAoF;QACpF,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1G,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,IAAI,GAAG,CAAC,CAAC;QAEtE,0DAA0D;QAC1D,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,+BAA+B;YAC/B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YAED,wCAAwC;YACxC,KAAK,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACjG,MAAM,cAAc,GAAG,iBAAiB,CAAC;oBACvC,WAAW,EAAE,OAAO;oBACpB,UAAU,EAAE,gBAAgB;oBAC5B,UAAU;oBACV,mBAAmB;iBACpB,CAAC,CAAC;gBACH,kEAAkE;gBAClE,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,SAAS;gBACX,CAAC;gBAED,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC;gBACzD,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;gBAElE,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC;gBAC3D,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,0FAA0F;oBAC1F,yFAAyF;oBACzF,SAAS;gBACX,CAAC;gBAED,MAAM,wBAAwB,GAAG,MAAM,kBAAkB,CAAC;oBACxD,WAAW,EAAE,kBAAkB,CAAC,IAAI;oBACpC,UAAU,EAAE,aAAa;oBACzB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE;oBACtD,KAAK,EAAE,YAAY;iBACpB,CAAC,CAAC;gBAEH,0BAA0B;gBAC1B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAClC,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,KAAK,GAAG;oBACnB,CAAC,wBAAwB,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAC/C,CAAC,oBAAoB,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAC9D,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,SAAS;gBACX,CAAC;gBAED,sEAAsE;gBACtE,MAAM,YAAY,GAChB,CAAC,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC1G,qFAAqF;oBACrF,aAAa,CAAC;gBAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAElE,2DAA2D;gBAC3D,MAAM,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBAC1E,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClC,kBAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK;oBACvC,YAAY,EAAE,IAAI,GAAG,EAAE;oBACvB,UAAU,EAAE,OAAO;oBACnB,UAAU,EAAE,aAAa;oBACzB,aAAa,EAAE,kBAAkB,CAAC,OAAO;oBACzC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,UAAU,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;iBACnF,CAAC;gBACF,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEjF,gEAAgE;gBAChE,MAAM,eAAe,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBACjF,IAAI,eAAe,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,CAAC;oBACtF,aAAa,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACtE,+FAA+F;YAC/F,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9D,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACvF,MAAM,KAAK,GAAe;oBACxB,qBAAqB,eAAe,EAAE;oBACtC,qBAAqB,eAAe,EAAE;oBACtC,sBAAsB,iBAAiB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,UAAU,IAAI,EAAE;oBACvJ,qBAAqB,WAAW,EAAE;oBAClC,qBAAqB,UAAU,EAAE;oBACjC,wBAAwB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;iBAChE,CAAC;gBAEF,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,+EAA+E;oBAC/E,KAAK,CAAC,MAAM,CACV,CAAC,EACD,CAAC,EACD,yBAAyB,iBAAiB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,2CAA2C,aAAa,CAAC,SAAS,CAAC,GAAG,EAC9J,CAAC,gGAAgG,CAAC,CACnG,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,yEAAyE,YAAY,CAAC,KAAK,CAAC,IAAI;oBACtG,MAAM,EAAE,gBAAgB;oBACxB,mGAAmG;oBACnG,gFAAgF;iBACjF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAWjC;IACC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE3F,MAAM,GAAG,GAAG,GAAG,WAAW,GAAG,UAAU,EAAE,CAAC;IAC1C,8DAA8D;IAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,oCAAoC;IACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjB,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC;IAC9D,IAAI,MAAM,GAAa,EAAE,CAAC;IAE1B,kCAAkC;IAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,4DAA4D;YAC5D,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7F,MAAM,cAAc,GAAG,iBAAiB,CAAC;gBACvC,WAAW,EAAE,OAAO;gBACpB,UAAU,EAAE,MAAM,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC3C,UAAU;gBACV,mBAAmB;aACpB,CAAC,CAAC;YAEH,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC;gBACzD,kEAAkE;gBAClE,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,MAAM,kBAAkB,CAAC;oBACvB,WAAW,EAAE,kBAAkB,CAAC,IAAI;oBACpC,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,UAAU,EAAE,aAAa;oBACzB,OAAO;oBACP,OAAO;iBACR,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,0DAA0D;YAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IACpB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAK1B;IAMC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC;IAE7E,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IACxF,MAAM,SAAS,GACb,kBAAkB;QAClB,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAElH,0FAA0F;IAC1F,uBAAuB;IACvB,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAoD,EAAE,CAAC;AACjG,CAAC","sourcesContent":["import type { BundleInfo, PartialContext } from '@ms-cloudpack/api-server';\nimport type {\n BundleMessage,\n PackageDefinitionsCache,\n PackageJson,\n ResolveMap,\n ResolveMapEntry,\n WithRequired,\n} from '@ms-cloudpack/common-types';\nimport { findResolveMapEntry, getDependencies, getSourceEntry } from '@ms-cloudpack/package-utilities';\nimport path from 'path';\nimport type { InitPackageResult } from './types/InitPackageResult.js';\nimport { bulletedList, formatPackageName, type BulletList } from '@ms-cloudpack/task-reporter';\nimport { getPackageSettings } from '@ms-cloudpack/config';\nimport semver from 'semver';\nimport { parseImportString } from '@ms-cloudpack/path-string-parsing';\n\n/**\n * Checks that the imports/exports of packages match.\n * To be called before `summarize`.\n * @param packageResults - The package results to check.\n * @param context - The context to use.\n * @returns Mapping from absolute package path to errors.\n */\nexport async function verifyExports(\n packageResults: Record<string, InitPackageResult>,\n context: PartialContext<'packages', 'config' | 'resolveMap'>,\n): Promise<Record<string, BundleMessage[]>> {\n const { packages, session } = context;\n const { config, resolveMap } = session;\n const allErrors: Record<string, BundleMessage[]> = {};\n const packageResultsArray = Object.values(packageResults);\n const importsCache: Record<string, string[]> = {};\n\n // Iterate through each package\n for (const parentResult of packageResultsArray) {\n // Skip packages with build errors or no info\n if (!parentResult?.info || !parentResult.outputPath || parentResult.errors?.length) {\n continue;\n }\n\n // Skip packages with `ignoreMissingExports` set to true.\n const { name, version, path: parentPath } = parentResult;\n const ignoreMissingExports =\n getPackageSettings({\n name,\n version,\n userPackageSettings: config.packageSettings,\n includeBuiltIn: true,\n generatedPackageSettings: undefined,\n }).userPackageSettings?.ignoreMissingExports || {};\n\n if (ignoreMissingExports === true) {\n continue;\n }\n\n const parentDefinition = await packages.get(parentPath);\n const allParentDependencies = getDependencies(parentDefinition, { includeAll: true });\n\n /**\n * Mapping from imported dependency package ID (`name@version`) to import path\n * to an object with export names missing from that file, the importString, and bundledFile.\n */\n const depsMissingExports: Record<\n string,\n Record<\n string,\n {\n missingNames: Set<string>;\n importName: string;\n importPath: string;\n importVersion: string;\n bundledFile: string;\n }\n >\n > = {};\n const invalidSemver: Record<string, string> = {};\n\n // Find the main entry point for the parent package to list as the importing bundle.\n const importingBundle = path.join(parentResult.outputPath, parentResult.info?.['.']?.bundlePath || '');\n\n // Find the main entry point for the parent package to list as the importing source.\n const sourceMainEntry = await getSourceEntry({ entry: '.', inputPath: parentPath }, { packages, config });\n const importingSource = path.join(parentPath, sourceMainEntry || '.');\n\n // Iterate through each entry path from the parent package\n for (const { consumes } of Object.values(parentResult.info)) {\n // Skip entries with no imports\n if (!consumes?.length) {\n continue;\n }\n\n // Iterate through each imported package\n for (const { packageName: depName, importPath: depImportPath, names: consumedNames } of consumes) {\n const dependencyInfo = getDependencyInfo({\n packageName: depName,\n definition: parentDefinition,\n resolveMap,\n packageResultsArray,\n });\n // We don't have enough info to check this dependency, so skip it.\n if (!dependencyInfo) {\n continue;\n }\n\n const { depResolveMapEntry, depResult } = dependencyInfo;\n const { outputPath: depOutputPath, info: depEntries } = depResult;\n\n const importProduces = depEntries[depImportPath]?.produces;\n if (!importProduces) {\n // Skip if the imported package has no entry for the import path. (If the path is missing,\n // evaluateImportsForOverrides has already run and tried to fix it or reported an error.)\n continue;\n }\n\n const importProducesStarResult = await importProducesStar({\n packagePath: depResolveMapEntry.path,\n importPath: depImportPath,\n info: depEntries,\n context: { packages, resolveMap, packageResultsArray },\n cache: importsCache,\n });\n\n // Find any missing names.\n const missing = consumedNames.filter(\n (namedImport) =>\n namedImport !== '*' &&\n !importProducesStarResult.includes(namedImport) &&\n !ignoreMissingExports[depImportPath]?.includes(namedImport),\n );\n if (!missing.length) {\n continue;\n }\n\n // Figure out which actual file the exports appear to be missing from.\n const relativePath =\n (await getSourceEntry({ entry: depImportPath, inputPath: depResolveMapEntry.path }, { packages, config })) ||\n // If the package is missing an exports map, assume the import path is the real path.\n depImportPath;\n const filePath = path.join(depResolveMapEntry.path, relativePath);\n\n // Save the missing names for this path within the package.\n const depKey = `${depResolveMapEntry.name}@${depResolveMapEntry.version}`;\n depsMissingExports[depKey] ??= {};\n depsMissingExports[depKey][filePath] ??= {\n missingNames: new Set(),\n importName: depName,\n importPath: depImportPath,\n importVersion: depResolveMapEntry.version,\n bundledFile: path.join(depOutputPath ?? '', depEntries[depImportPath]?.bundlePath),\n };\n missing.forEach((m) => depsMissingExports[depKey][filePath].missingNames.add(m));\n\n // Check if the package satisfies the parent semver requirement.\n const requiredVersion = !invalidSemver[depKey] && allParentDependencies[depName];\n if (requiredVersion && !semver.satisfies(depResolveMapEntry.version, requiredVersion)) {\n invalidSemver[depKey] = requiredVersion;\n }\n }\n }\n\n const errors: BundleMessage[] = [];\n\n for (const [packageId, missing] of Object.entries(depsMissingExports)) {\n // We want a single error for each package, with a bulleted list of files with missing exports.\n for (const [sourceFile, errorInfo] of Object.entries(missing)) {\n const { missingNames, importName, importPath, importVersion, bundledFile } = errorInfo;\n const error: BulletList = [\n `Importing bundle: ${importingBundle}`,\n `Importing source: ${importingSource}`,\n `Exporting package: ${formatPackageName({ name: importName, version: importVersion })}${importPath === '.' ? '' : ` (imported path: \"${importPath}\")`}`,\n `Exporting bundle: ${bundledFile}`,\n `Exporting source: ${sourceFile}`,\n `Missing export(s): { ${Array.from(missingNames).join(', ')} }`,\n ];\n\n if (invalidSemver[packageId]) {\n // If we have an invalid semver, add a note about that after exporting package.\n error.splice(\n 3,\n 0,\n `Incompatible version: ${formatPackageName({ name: importName, version: importVersion })} does not satisfy importer requirement \"${invalidSemver[packageId]}\"`,\n ['If this was unexpected, make sure you installed dependencies after pulling the latest changes.'],\n );\n }\n\n errors.push({\n text: `A bundle imported names from another bundle which were not exported:\\n${bulletedList(error)}\\n`,\n source: 'verify exports',\n // Don't include a whole-message location here because that doesn't make sense for this error type,\n // and we already put full paths to individual problem files within the message.\n });\n }\n }\n\n if (errors.length) {\n allErrors[parentPath] = errors;\n }\n }\n\n return allErrors;\n}\n\nasync function importProducesStar(params: {\n packagePath: string;\n info: BundleInfo;\n importPath: string;\n context: {\n packages: PackageDefinitionsCache;\n resolveMap: ResolveMap;\n packageResultsArray: InitPackageResult[];\n };\n visited?: Set<string>;\n cache?: Record<string, string[]>;\n}): Promise<string[]> {\n const { packagePath, info, importPath, context, visited = new Set(), cache = {} } = params;\n\n const key = `${packagePath}${importPath}`;\n // Check if the entry has already been visited to avoid cycles\n if (visited.has(key)) {\n return [];\n }\n\n // Mark the current entry as visited\n visited.add(key);\n\n const cachedResult = cache[key];\n if (cachedResult) {\n return cachedResult;\n }\n\n const { packages, resolveMap, packageResultsArray } = context;\n let result: string[] = [];\n\n // Iterate over the produced names\n for (const name of info[importPath].produces) {\n if (name.startsWith('*')) {\n // Extract the name and path from the format \"*ImportString\"\n const { packageName: depName, importPath: depImportPath } = parseImportString(name.slice(1));\n\n const dependencyInfo = getDependencyInfo({\n packageName: depName,\n definition: await packages.get(packagePath),\n resolveMap,\n packageResultsArray,\n });\n\n if (dependencyInfo) {\n const { depResolveMapEntry, depResult } = dependencyInfo;\n // Recursively aggregate the produced names from the other package\n result = result.concat(\n await importProducesStar({\n packagePath: depResolveMapEntry.path,\n info: depResult.info,\n importPath: depImportPath,\n context,\n visited,\n }),\n );\n }\n } else {\n // Add the name to the result if it doesn't start with '*'\n result.push(name);\n }\n }\n\n cache[key] = result;\n return result;\n}\n\nfunction getDependencyInfo(options: {\n packageName: string;\n definition: PackageJson;\n resolveMap: ResolveMap;\n packageResultsArray: InitPackageResult[];\n}):\n | {\n depResult: WithRequired<InitPackageResult, 'info'>;\n depResolveMapEntry: ResolveMapEntry;\n }\n | undefined {\n const { packageName, definition, resolveMap, packageResultsArray } = options;\n\n const depResolveMapEntry = findResolveMapEntry({ packageName, definition, resolveMap });\n const depResult =\n depResolveMapEntry &&\n packageResultsArray.find((r) => r.name === depResolveMapEntry.name && r.version === depResolveMapEntry.version);\n\n // Skip if we can't find the imported package in the resolve map, or there's no info about\n // its entries/exports.\n if (!depResolveMapEntry || !depResult?.info) {\n return undefined;\n }\n\n return { depResolveMapEntry, depResult: depResult as WithRequired<InitPackageResult, 'info'> };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"verifyExports.js","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BundleInfo, PartialContext } from '@ms-cloudpack/api-server';\nimport type {\n BundleMessage,\n PackageDefinitionsCache,\n PackageJson,\n ResolveMap,\n ResolveMapEntry,\n WithRequired,\n} from '@ms-cloudpack/common-types';\nimport { findResolveMapEntry, getDependencies, getSourceEntry } from '@ms-cloudpack/package-utilities';\nimport path from 'path';\nimport type { InitPackageResult } from './types/InitPackageResult.js';\nimport { bulletedList, formatPackageName, type BulletList } from '@ms-cloudpack/task-reporter';\nimport { getPackageSettings } from '@ms-cloudpack/config';\nimport semver from 'semver';\nimport { parseImportString } from '@ms-cloudpack/path-string-parsing';\n\n/**\n * Checks that the imports/exports of packages match.\n * To be called before `summarize`.\n * @param packageResults - The package results to check.\n * @param context - The context to use.\n * @returns Mapping from absolute package path to errors.\n */\nexport async function verifyExports(\n packageResults: Record<string, InitPackageResult>,\n context: PartialContext<'packages', 'config' | 'resolveMap'>,\n): Promise<Record<string, BundleMessage[]>> {\n const { packages, session } = context;\n const { config, resolveMap } = session;\n const allErrors: Record<string, BundleMessage[]> = {};\n const packageResultsArray = Object.values(packageResults);\n const importsCache: Record<string, string[]> = {};\n\n // Iterate through each package\n for (const parentResult of packageResultsArray) {\n // Skip packages with build errors or no info\n if (!parentResult?.info || !parentResult.outputPath || parentResult.errors?.length) {\n continue;\n }\n\n // Skip packages with `ignoreMissingExports` set to true.\n const { name, version, path: parentPath } = parentResult;\n const ignoreMissingExports =\n getPackageSettings({\n name,\n version,\n userPackageSettings: config.packageSettings,\n includeBuiltIn: true,\n generatedPackageSettings: undefined,\n }).userPackageSettings?.ignoreMissingExports || {};\n\n if (ignoreMissingExports === true) {\n continue;\n }\n\n const parentDefinition = await packages.get(parentPath);\n const allParentDependencies = getDependencies(parentDefinition, { includeAll: true });\n\n /**\n * Mapping from imported dependency package ID (`name@version`) to import path\n * to an object with export names missing from that file, the importString, and bundledFile.\n */\n const depsMissingExports: Record<\n string,\n Record<\n string,\n {\n missingNames: Set<string>;\n importName: string;\n importPath: string;\n importVersion: string;\n bundledFile: string;\n }\n >\n > = {};\n const invalidSemver: Record<string, string> = {};\n\n // Find the main entry point for the parent package to list as the importing bundle.\n const importingBundle = path.join(parentResult.outputPath, parentResult.info?.['.']?.bundlePath || '');\n\n // Find the main entry point for the parent package to list as the importing source.\n const sourceMainEntry = await getSourceEntry({ entry: '.', inputPath: parentPath }, { packages, config });\n const importingSource = path.join(parentPath, sourceMainEntry || '.');\n\n // Iterate through each entry path from the parent package\n for (const parentInfo of Object.values(parentResult.info)) {\n // Skip entries with no imports\n if (!parentInfo?.consumes?.length) {\n continue;\n }\n\n // Iterate through each imported package\n for (const { packageName: depName, importPath: depImportPath, names: consumedNames } of parentInfo.consumes) {\n // Skip imports from the current package or the same package name.\n if (depName === '.' || depName === parentDefinition.name) {\n continue;\n }\n const dependencyInfo = getDependencyInfo({\n packageName: depName,\n definition: parentDefinition,\n resolveMap,\n packageResultsArray,\n });\n // We don't have enough info to check this dependency, so skip it.\n if (!dependencyInfo) {\n continue;\n }\n\n const { depResolveMapEntry, depResult } = dependencyInfo;\n const { outputPath: depOutputPath, info: depEntries } = depResult;\n\n const importProduces = depEntries[depImportPath]?.produces;\n if (!importProduces) {\n // Skip if the imported package has no entry for the import path. (If the path is missing,\n // evaluateImportsForOverrides has already run and tried to fix it or reported an error.)\n continue;\n }\n\n const importProducesStarResult = await importProducesStar({\n name: depName,\n packagePath: depResolveMapEntry.path,\n importPath: depImportPath,\n info: depEntries,\n context: { packages, resolveMap, packageResultsArray },\n cache: importsCache,\n });\n\n // Find any missing names.\n const missing = consumedNames.filter(\n (namedImport) =>\n namedImport !== '*' &&\n !importProducesStarResult.includes(namedImport) &&\n !ignoreMissingExports[depImportPath]?.includes(namedImport),\n );\n if (!missing.length) {\n continue;\n }\n\n // Figure out which actual file the exports appear to be missing from.\n const relativePath =\n (await getSourceEntry({ entry: depImportPath, inputPath: depResolveMapEntry.path }, { packages, config })) ||\n // If the package is missing an exports map, assume the import path is the real path.\n depImportPath;\n const filePath = path.join(depResolveMapEntry.path, relativePath);\n\n // Save the missing names for this path within the package.\n const depKey = `${depResolveMapEntry.name}@${depResolveMapEntry.version}`;\n depsMissingExports[depKey] ??= {};\n depsMissingExports[depKey][filePath] ??= {\n missingNames: new Set(),\n importName: depName,\n importPath: depImportPath,\n importVersion: depResolveMapEntry.version,\n bundledFile: path.join(depOutputPath ?? '', depEntries[depImportPath]?.bundlePath || '.'),\n };\n missing.forEach((m) => depsMissingExports[depKey][filePath].missingNames.add(m));\n\n // Check if the package satisfies the parent semver requirement.\n const requiredVersion = !invalidSemver[depKey] && allParentDependencies[depName];\n if (requiredVersion && !semver.satisfies(depResolveMapEntry.version, requiredVersion)) {\n invalidSemver[depKey] = requiredVersion;\n }\n }\n }\n\n const errors: BundleMessage[] = [];\n\n for (const [packageId, missing] of Object.entries(depsMissingExports)) {\n // We want a single error for each package, with a bulleted list of files with missing exports.\n for (const [sourceFile, errorInfo] of Object.entries(missing)) {\n const { missingNames, importName, importPath, importVersion, bundledFile } = errorInfo;\n const error: BulletList = [\n `Importing bundle: ${importingBundle}`,\n `Importing source: ${importingSource}`,\n `Exporting package: ${formatPackageName({ name: importName, version: importVersion })}${importPath === '.' ? '' : ` (imported path: \"${importPath}\")`}`,\n `Exporting bundle: ${bundledFile}`,\n `Exporting source: ${sourceFile}`,\n `Missing export(s): { ${Array.from(missingNames).join(', ')} }`,\n ];\n\n if (invalidSemver[packageId]) {\n // If we have an invalid semver, add a note about that after exporting package.\n error.splice(\n 3,\n 0,\n `Incompatible version: ${formatPackageName({ name: importName, version: importVersion })} does not satisfy importer requirement \"${invalidSemver[packageId]}\"`,\n ['If this was unexpected, make sure you installed dependencies after pulling the latest changes.'],\n );\n }\n\n errors.push({\n text: `A bundle imported names from another bundle which were not exported:\\n${bulletedList(error)}\\n`,\n source: 'verify exports',\n // Don't include a whole-message location here because that doesn't make sense for this error type,\n // and we already put full paths to individual problem files within the message.\n });\n }\n }\n\n if (errors.length) {\n allErrors[parentPath] = errors;\n }\n }\n\n return allErrors;\n}\n\nasync function importProducesStar(params: {\n name: string;\n packagePath: string;\n info: BundleInfo;\n importPath: string;\n context: {\n packages: PackageDefinitionsCache;\n resolveMap: ResolveMap;\n packageResultsArray: InitPackageResult[];\n };\n visited?: Set<string>;\n cache?: Record<string, string[]>;\n}): Promise<string[]> {\n const { name, packagePath, info, importPath, context, visited = new Set(), cache = {} } = params;\n\n const key = `${packagePath}${importPath}`;\n // Check if the entry has already been visited to avoid cycles\n if (visited.has(key)) {\n return [];\n }\n\n // Mark the current entry as visited\n visited.add(key);\n\n const cachedResult = cache[key];\n if (cachedResult) {\n return cachedResult;\n }\n\n const { packages, resolveMap, packageResultsArray } = context;\n let result: string[] = [];\n\n if (!info[importPath]) {\n // If the importPath is not found in the info, return an empty array.\n return result;\n }\n\n // Iterate over the produced names\n for (const exportedName of info[importPath].produces) {\n if (!exportedName.startsWith('*')) {\n // Add the name to the result if it doesn't start with '*'\n result.push(exportedName);\n continue;\n }\n\n // Extract the name and path from the format \"*ImportString\"\n const { packageName: depName, importPath: depImportPath } = parseImportString(exportedName.slice(1));\n\n if (depName === name) {\n // Reuse the current packagePath and info if it is an import from the same package.\n result = result.concat(\n await importProducesStar({\n name,\n packagePath,\n info,\n importPath: depImportPath,\n context,\n visited,\n cache,\n }),\n );\n continue;\n }\n\n const dependencyInfo = getDependencyInfo({\n packageName: depName,\n definition: await packages.get(packagePath),\n resolveMap,\n packageResultsArray,\n });\n\n if (!dependencyInfo) {\n continue; // Skip if we can't find the imported package in the resolve map, or there's no info about its entries/exports.\n }\n\n const { depResolveMapEntry, depResult } = dependencyInfo;\n\n // Recursively aggregate the produced names from the other package\n result = result.concat(\n await importProducesStar({\n name: depName,\n packagePath: depResolveMapEntry.path,\n info: depResult.info,\n importPath: depImportPath,\n context,\n visited,\n cache,\n }),\n );\n }\n\n cache[key] = result;\n return result;\n}\n\nfunction getDependencyInfo(options: {\n packageName: string;\n definition: PackageJson;\n resolveMap: ResolveMap;\n packageResultsArray: InitPackageResult[];\n}):\n | {\n depResult: WithRequired<InitPackageResult, 'info'>;\n depResolveMapEntry: ResolveMapEntry;\n }\n | undefined {\n const { packageName, definition, resolveMap, packageResultsArray } = options;\n\n const depResolveMapEntry = findResolveMapEntry({ packageName, definition, resolveMap });\n const depResult =\n depResolveMapEntry &&\n packageResultsArray.find((r) => r.name === depResolveMapEntry.name && r.version === depResolveMapEntry.version);\n\n // Skip if we can't find the imported package in the resolve map, or there's no info about\n // its entries/exports.\n if (!depResolveMapEntry || !depResult?.info) {\n return undefined;\n }\n\n return { depResolveMapEntry, depResult: depResult as WithRequired<InitPackageResult, 'info'> };\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class for executing promises sequentially by ID.
|
|
3
|
+
* Ensures that operations with the same ID are processed in order.
|
|
4
|
+
* Automatically cleans up completed operations to prevent memory leaks.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SequentialPromiseExecutor {
|
|
7
|
+
/**
|
|
8
|
+
* Map tracking the last operation promise for each ID
|
|
9
|
+
*/
|
|
10
|
+
operations: Map<string, Promise<unknown>>;
|
|
11
|
+
/**
|
|
12
|
+
* Execute a promise-returning function, ensuring sequential execution for the same ID.
|
|
13
|
+
* Automatically removes the promise from tracking once it completes.
|
|
14
|
+
*/
|
|
15
|
+
execute<T>(id: string, execute: () => Promise<T>): Promise<T>;
|
|
16
|
+
/**
|
|
17
|
+
* Clear all tracked operations for all IDs.
|
|
18
|
+
* This is still useful for forcibly clearing all operations when needed.
|
|
19
|
+
*/
|
|
20
|
+
clear(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=sequentialPromiseExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequentialPromiseExecutor.d.ts","sourceRoot":"","sources":["../../src/utilities/sequentialPromiseExecutor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,yBAAyB;IACpC;;OAEG;IACI,UAAU,gCAAuC;IAExD;;;OAGG;IACU,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiC1E;;;OAGG;IACI,KAAK,IAAI,IAAI;CAGrB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class for executing promises sequentially by ID.
|
|
3
|
+
* Ensures that operations with the same ID are processed in order.
|
|
4
|
+
* Automatically cleans up completed operations to prevent memory leaks.
|
|
5
|
+
*/
|
|
6
|
+
export class SequentialPromiseExecutor {
|
|
7
|
+
/**
|
|
8
|
+
* Map tracking the last operation promise for each ID
|
|
9
|
+
*/
|
|
10
|
+
operations = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Execute a promise-returning function, ensuring sequential execution for the same ID.
|
|
13
|
+
* Automatically removes the promise from tracking once it completes.
|
|
14
|
+
*/
|
|
15
|
+
async execute(id, execute) {
|
|
16
|
+
// Get the promise for the last operation with this ID, or a resolved promise if none
|
|
17
|
+
const lastOperation = this.operations.get(id) || Promise.resolve();
|
|
18
|
+
// Create a new operation that starts after the previous one finishes
|
|
19
|
+
const operation = lastOperation
|
|
20
|
+
// Suppress errors from previous operations to prevent chain breakage
|
|
21
|
+
.catch((err) => {
|
|
22
|
+
console.debug(`Ignoring error from previous operation on ${id}: ${err instanceof Error ? err.stack : err}`);
|
|
23
|
+
})
|
|
24
|
+
.then(execute); // Execute the new operation and use its return value
|
|
25
|
+
// Set up cleanup when this operation completes (success or failure)
|
|
26
|
+
const cleanupOperation = operation
|
|
27
|
+
// Ensure cleanup happens even if operation fails
|
|
28
|
+
.catch((err) => {
|
|
29
|
+
console.debug(`Ignoring error cleaning operation on ${id}: ${err instanceof Error ? err.stack : err}`);
|
|
30
|
+
})
|
|
31
|
+
.finally(() => {
|
|
32
|
+
// Only clean up if this is still the current operation for this ID
|
|
33
|
+
if (this.operations.get(id) === cleanupOperation) {
|
|
34
|
+
this.operations.delete(id);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
// Update the last operation for this ID with the operation that includes cleanup
|
|
38
|
+
this.operations.set(id, cleanupOperation);
|
|
39
|
+
// Return the original operation without the cleanup logic to avoid creating
|
|
40
|
+
// a circular reference that might prevent garbage collection
|
|
41
|
+
return operation;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Clear all tracked operations for all IDs.
|
|
45
|
+
* This is still useful for forcibly clearing all operations when needed.
|
|
46
|
+
*/
|
|
47
|
+
clear() {
|
|
48
|
+
this.operations.clear();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=sequentialPromiseExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequentialPromiseExecutor.js","sourceRoot":"","sources":["../../src/utilities/sequentialPromiseExecutor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,yBAAyB;IACpC;;OAEG;IACI,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IAExD;;;OAGG;IACI,KAAK,CAAC,OAAO,CAAI,EAAU,EAAE,OAAyB;QAC3D,qFAAqF;QACrF,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAEnE,qEAAqE;QACrE,MAAM,SAAS,GAAG,aAAa;YAC7B,qEAAqE;aACpE,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9G,CAAC,CAAC;aACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,qDAAqD;QAEvE,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,SAAS;YAChC,iDAAiD;aAChD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACzG,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,mEAAmE;YACnE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,gBAAgB,EAAE,CAAC;gBACjD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,iFAAiF;QACjF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAE1C,4EAA4E;QAC5E,6DAA6D;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,KAAK;QACV,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF","sourcesContent":["/**\n * Class for executing promises sequentially by ID.\n * Ensures that operations with the same ID are processed in order.\n * Automatically cleans up completed operations to prevent memory leaks.\n */\nexport class SequentialPromiseExecutor {\n /**\n * Map tracking the last operation promise for each ID\n */\n public operations = new Map<string, Promise<unknown>>();\n\n /**\n * Execute a promise-returning function, ensuring sequential execution for the same ID.\n * Automatically removes the promise from tracking once it completes.\n */\n public async execute<T>(id: string, execute: () => Promise<T>): Promise<T> {\n // Get the promise for the last operation with this ID, or a resolved promise if none\n const lastOperation = this.operations.get(id) || Promise.resolve();\n\n // Create a new operation that starts after the previous one finishes\n const operation = lastOperation\n // Suppress errors from previous operations to prevent chain breakage\n .catch((err) => {\n console.debug(`Ignoring error from previous operation on ${id}: ${err instanceof Error ? err.stack : err}`);\n })\n .then(execute); // Execute the new operation and use its return value\n\n // Set up cleanup when this operation completes (success or failure)\n const cleanupOperation = operation\n // Ensure cleanup happens even if operation fails\n .catch((err) => {\n console.debug(`Ignoring error cleaning operation on ${id}: ${err instanceof Error ? err.stack : err}`);\n })\n .finally(() => {\n // Only clean up if this is still the current operation for this ID\n if (this.operations.get(id) === cleanupOperation) {\n this.operations.delete(id);\n }\n });\n\n // Update the last operation for this ID with the operation that includes cleanup\n this.operations.set(id, cleanupOperation);\n\n // Return the original operation without the cleanup logic to avoid creating\n // a circular reference that might prevent garbage collection\n return operation;\n }\n\n /**\n * Clear all tracked operations for all IDs.\n * This is still useful for forcibly clearing all operations when needed.\n */\n public clear(): void {\n this.operations.clear();\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ms-cloudpack/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.76.0",
|
|
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",
|
|
@@ -18,26 +18,26 @@
|
|
|
18
18
|
"cloudpack": "./bin/cloudpack.js"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@ms-cloudpack/api-server": "^0.
|
|
22
|
-
"@ms-cloudpack/app-server": "^0.18.
|
|
23
|
-
"@ms-cloudpack/bundler": "^0.25.
|
|
24
|
-
"@ms-cloudpack/bundler-capabilities": "^0.2.
|
|
25
|
-
"@ms-cloudpack/common-types": "^0.
|
|
26
|
-
"@ms-cloudpack/config": "^0.35.
|
|
27
|
-
"@ms-cloudpack/create-express-app": "^1.10.
|
|
21
|
+
"@ms-cloudpack/api-server": "^0.64.0",
|
|
22
|
+
"@ms-cloudpack/app-server": "^0.18.15",
|
|
23
|
+
"@ms-cloudpack/bundler": "^0.25.14",
|
|
24
|
+
"@ms-cloudpack/bundler-capabilities": "^0.2.27",
|
|
25
|
+
"@ms-cloudpack/common-types": "^0.25.0",
|
|
26
|
+
"@ms-cloudpack/config": "^0.35.11",
|
|
27
|
+
"@ms-cloudpack/create-express-app": "^1.10.36",
|
|
28
28
|
"@ms-cloudpack/environment": "^0.1.1",
|
|
29
29
|
"@ms-cloudpack/json-utilities": "^0.1.10",
|
|
30
|
-
"@ms-cloudpack/link-proxy": "^0.2.
|
|
31
|
-
"@ms-cloudpack/overlay": "^0.19.
|
|
32
|
-
"@ms-cloudpack/package-utilities": "^12.3.
|
|
30
|
+
"@ms-cloudpack/link-proxy": "^0.2.14",
|
|
31
|
+
"@ms-cloudpack/overlay": "^0.19.10",
|
|
32
|
+
"@ms-cloudpack/package-utilities": "^12.3.13",
|
|
33
33
|
"@ms-cloudpack/path-string-parsing": "^1.2.7",
|
|
34
|
-
"@ms-cloudpack/path-utilities": "^3.1.
|
|
35
|
-
"@ms-cloudpack/remote-cache": "^0.11.
|
|
36
|
-
"@ms-cloudpack/setup-utilities": "^0.5.
|
|
37
|
-
"@ms-cloudpack/task-reporter": "^0.17.
|
|
38
|
-
"@ms-cloudpack/telemetry": "^0.11.
|
|
34
|
+
"@ms-cloudpack/path-utilities": "^3.1.7",
|
|
35
|
+
"@ms-cloudpack/remote-cache": "^0.11.23",
|
|
36
|
+
"@ms-cloudpack/setup-utilities": "^0.5.28",
|
|
37
|
+
"@ms-cloudpack/task-reporter": "^0.17.1",
|
|
38
|
+
"@ms-cloudpack/telemetry": "^0.11.25",
|
|
39
39
|
"@yarnpkg/lockfile": "^1.1.0",
|
|
40
|
-
"commander": "^
|
|
40
|
+
"commander": "^14.0.0",
|
|
41
41
|
"cross-spawn": "^7.0.3",
|
|
42
42
|
"didyoumean": "^1.2.2",
|
|
43
43
|
"get-port": "^7.0.0",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"workspace-tools": "^0.38.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@ms-cloudpack/common-types": "^0.
|
|
51
|
+
"@ms-cloudpack/common-types": "^0.25.0",
|
|
52
52
|
"@ms-cloudpack/common-types-browser": "^0.6.1",
|
|
53
53
|
"@ms-cloudpack/eslint-plugin-internal": "^0.0.1",
|
|
54
54
|
"@ms-cloudpack/scripts": "^0.0.1",
|
|
@@ -73,6 +73,6 @@
|
|
|
73
73
|
"lib/**/!(*.test.*)"
|
|
74
74
|
],
|
|
75
75
|
"engines": {
|
|
76
|
-
"node": ">=
|
|
76
|
+
"node": ">=20.11.0"
|
|
77
77
|
}
|
|
78
78
|
}
|