@ms-cloudpack/cli 0.56.6-beta.0 → 0.56.7

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.
Files changed (34) hide show
  1. package/lib/commands/init/InitSummaryData.d.ts.map +1 -1
  2. package/lib/commands/init/InitSummaryData.js +4 -1
  3. package/lib/commands/init/InitSummaryData.js.map +1 -1
  4. package/lib/commands/init/evaluateImportsForOverrides.d.ts +4 -2
  5. package/lib/commands/init/evaluateImportsForOverrides.d.ts.map +1 -1
  6. package/lib/commands/init/evaluateImportsForOverrides.js +39 -19
  7. package/lib/commands/init/evaluateImportsForOverrides.js.map +1 -1
  8. package/lib/commands/init/evaluatePath.js +9 -10
  9. package/lib/commands/init/evaluatePath.js.map +1 -1
  10. package/lib/commands/init/formatInitSummary.d.ts.map +1 -1
  11. package/lib/commands/init/formatInitSummary.js +4 -5
  12. package/lib/commands/init/formatInitSummary.js.map +1 -1
  13. package/lib/commands/init/init.d.ts.map +1 -1
  14. package/lib/commands/init/init.js +5 -2
  15. package/lib/commands/init/init.js.map +1 -1
  16. package/lib/commands/init/neverExclude.d.ts +10 -0
  17. package/lib/commands/init/neverExclude.d.ts.map +1 -0
  18. package/lib/commands/init/neverExclude.js +17 -0
  19. package/lib/commands/init/neverExclude.js.map +1 -0
  20. package/lib/commands/init/optimizeDependencies.d.ts +2 -2
  21. package/lib/commands/init/optimizeDependencies.d.ts.map +1 -1
  22. package/lib/commands/init/optimizeDependencies.js +16 -14
  23. package/lib/commands/init/optimizeDependencies.js.map +1 -1
  24. package/lib/commands/init/types/InitSummary.d.ts +5 -0
  25. package/lib/commands/init/types/InitSummary.d.ts.map +1 -1
  26. package/lib/commands/init/types/InitSummary.js.map +1 -1
  27. package/lib/commands/init/verifyExports.d.ts +7 -3
  28. package/lib/commands/init/verifyExports.d.ts.map +1 -1
  29. package/lib/commands/init/verifyExports.js +64 -63
  30. package/lib/commands/init/verifyExports.js.map +1 -1
  31. package/lib/common/CommandExecutor.d.ts.map +1 -1
  32. package/lib/common/CommandExecutor.js +15 -1
  33. package/lib/common/CommandExecutor.js.map +1 -1
  34. package/package.json +10 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neverExclude.d.ts","sourceRoot":"","sources":["../../../src/commands/init/neverExclude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIlE;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAQlF"}
@@ -0,0 +1,17 @@
1
+ const defaultNeverExcludeDependencies = ['tslib', '@babel/runtime'];
2
+ /**
3
+ * Checks if a package should never be excluded.
4
+ * Uses the `neverExcludeDependencies` field in the config or the default list.
5
+ * @param packageName Name of the package to check.
6
+ * @param config Cloudpack configuration.
7
+ * @returns True if the package should never be excluded.
8
+ */
9
+ export function neverExclude(packageName, config) {
10
+ // Set never exclude to the default if it is not set. Replace string '...' with default if set.
11
+ const neverExcludeDependencies = config.neverExcludeDependencies ?? defaultNeverExcludeDependencies;
12
+ if (neverExcludeDependencies.includes('...')) {
13
+ neverExcludeDependencies.splice(neverExcludeDependencies.indexOf('...'), 1, ...defaultNeverExcludeDependencies);
14
+ }
15
+ return neverExcludeDependencies.includes(packageName);
16
+ }
17
+ //# sourceMappingURL=neverExclude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neverExclude.js","sourceRoot":"","sources":["../../../src/commands/init/neverExclude.ts"],"names":[],"mappings":"AAEA,MAAM,+BAA+B,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,MAAuB;IACvE,+FAA+F;IAC/F,MAAM,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,IAAI,+BAA+B,CAAC;IACpG,IAAI,wBAAwB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,wBAAwB,CAAC,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,+BAA+B,CAAC,CAAC;IAClH,CAAC;IAED,OAAO,wBAAwB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC","sourcesContent":["import type { CloudpackConfig } from '@ms-cloudpack/config-types';\n\nconst defaultNeverExcludeDependencies = ['tslib', '@babel/runtime'];\n\n/**\n * Checks if a package should never be excluded.\n * Uses the `neverExcludeDependencies` field in the config or the default list.\n * @param packageName Name of the package to check.\n * @param config Cloudpack configuration.\n * @returns True if the package should never be excluded.\n */\nexport function neverExclude(packageName: string, config: CloudpackConfig): boolean {\n // Set never exclude to the default if it is not set. Replace string '...' with default if set.\n const neverExcludeDependencies = config.neverExcludeDependencies ?? defaultNeverExcludeDependencies;\n if (neverExcludeDependencies.includes('...')) {\n neverExcludeDependencies.splice(neverExcludeDependencies.indexOf('...'), 1, ...defaultNeverExcludeDependencies);\n }\n\n return neverExcludeDependencies.includes(packageName);\n}\n"]}
@@ -16,8 +16,8 @@ export declare function optimizeDependencies(options: {
16
16
  packages: PackageDefinitionsCache;
17
17
  config: CloudpackConfig;
18
18
  }): {
19
- /** Changes made to the generated config */
20
- changes: GeneratedPackageChanges[];
19
+ /** Excluded dependencies changes made to the generated config */
20
+ excludedDependenciesChanges: GeneratedPackageChanges[];
21
21
  /** Any warnings encountered */
22
22
  warnings: string[];
23
23
  /** Set from new package path (to be evaluated) to info about the parent. */
@@ -1 +1 @@
1
- {"version":3,"file":"optimizeDependencies.d.ts","sourceRoot":"","sources":["../../../src/commands/init/optimizeDependencies.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAIlF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE;IACP,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;CACxB,EACD,OAAO,EAAE;IACP,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,eAAe,CAAC;CACzB,GACA;IACD,2CAA2C;IAC3C,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4EAA4E;IAC5E,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,8GAA8G;IAC9G,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B,CAwEA"}
1
+ {"version":3,"file":"optimizeDependencies.d.ts","sourceRoot":"","sources":["../../../src/commands/init/optimizeDependencies.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACtG,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAGlF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE;IACP,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;CACxB,EACD,OAAO,EAAE;IACP,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,eAAe,CAAC;CACzB,GACA;IACD,iEAAiE;IACjE,2BAA2B,EAAE,uBAAuB,EAAE,CAAC;IACvD,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4EAA4E;IAC5E,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,8GAA8G;IAC9G,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B,CAwEA"}
@@ -1,7 +1,7 @@
1
1
  import { getPackageSettings } from '@ms-cloudpack/config';
2
- import { getDependencies } from '@ms-cloudpack/package-utilities';
2
+ import { getDependencies, isExternalPackage } from '@ms-cloudpack/package-utilities';
3
3
  import { getConsumedDependencies } from '@ms-cloudpack/api-server';
4
- const defaultNeverExcludeDependencies = ['tslib', '@babel/runtime'];
4
+ import { neverExclude } from './neverExclude.js';
5
5
  /**
6
6
  * Optimizes the dependencies of a package to determine if there are any missing or unused.
7
7
  * If so, adds the the missing dependencies to included and the unused dependencies to excluded.
@@ -10,7 +10,7 @@ export function optimizeDependencies(options, context) {
10
10
  const { info, definition, packagePath } = options;
11
11
  const { config } = context;
12
12
  const displayName = `${definition.name}@${definition.version}`;
13
- const changes = [];
13
+ const excludedDependenciesChanges = [];
14
14
  const warnings = [];
15
15
  const pathsToEvaluate = new Set();
16
16
  const pathsToRefresh = new Set();
@@ -22,12 +22,7 @@ export function optimizeDependencies(options, context) {
22
22
  const consumedDependencies = getConsumedDependencies(info);
23
23
  // Iterate through dependencies and find unused.
24
24
  for (const dependencyName of Object.keys(dependencies)) {
25
- // Set never exclude to the default if it is not set. Replace string '...' with default if set.
26
- const neverExclude = config.neverExcludeDependencies ?? defaultNeverExcludeDependencies;
27
- if (neverExclude.includes('...')) {
28
- neverExclude.splice(neverExclude.indexOf('...'), 1, ...defaultNeverExcludeDependencies);
29
- }
30
- if (consumedDependencies.has(dependencyName) || neverExclude.includes(dependencyName)) {
25
+ if (consumedDependencies.has(dependencyName) || neverExclude(dependencyName, config)) {
31
26
  continue;
32
27
  }
33
28
  pathsToEvaluate.add(packagePath);
@@ -40,9 +35,16 @@ export function optimizeDependencies(options, context) {
40
35
  firstMatch: true,
41
36
  }).generatedPackageSettings;
42
37
  if (!generatedPackageSettings) {
43
- generatedPackageSettings = {
44
- match: { name, version: `^${version}` },
45
- };
38
+ if (isExternalPackage(packagePath)) {
39
+ generatedPackageSettings = {
40
+ match: { name, version: `^${version}` },
41
+ };
42
+ }
43
+ else {
44
+ generatedPackageSettings = {
45
+ match: name,
46
+ };
47
+ }
46
48
  packageSettings.push(generatedPackageSettings);
47
49
  }
48
50
  generatedPackageSettings.excludedDependencies ??= [];
@@ -51,7 +53,7 @@ export function optimizeDependencies(options, context) {
51
53
  continue;
52
54
  }
53
55
  generatedPackageSettings.excludedDependencies.push(dependencyName);
54
- changes.push({
56
+ excludedDependenciesChanges.push({
55
57
  name,
56
58
  version,
57
59
  path: packagePath,
@@ -65,6 +67,6 @@ export function optimizeDependencies(options, context) {
65
67
  });
66
68
  pathsToRefresh.add(packagePath);
67
69
  }
68
- return { warnings, changes, pathsToEvaluate, pathsToRefresh };
70
+ return { warnings, excludedDependenciesChanges, pathsToEvaluate, pathsToRefresh };
69
71
  }
70
72
  //# sourceMappingURL=optimizeDependencies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"optimizeDependencies.js","sourceRoot":"","sources":["../../../src/commands/init/optimizeDependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPackageSettings } from '@ms-cloudpack/config';\nimport { getDependencies, type ResolveMap } from '@ms-cloudpack/package-utilities';\nimport { getConsumedDependencies, type BundleInfo } from '@ms-cloudpack/api-server';\nimport type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { CloudpackConfig, PackageJson } from '@ms-cloudpack/config-types';\nimport type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.js';\n\nconst defaultNeverExcludeDependencies = ['tslib', '@babel/runtime'];\n\n/**\n * Optimizes the dependencies of a package to determine if there are any missing or unused.\n * If so, adds the the missing dependencies to included and the unused dependencies to excluded.\n */\nexport function optimizeDependencies(\n options: {\n info: BundleInfo;\n definition: PackageJson;\n packagePath: string;\n resolveMap: ResolveMap;\n },\n context: {\n packages: PackageDefinitionsCache;\n config: CloudpackConfig;\n },\n): {\n /** Changes made to the generated config */\n changes: GeneratedPackageChanges[];\n /** Any warnings encountered */\n warnings: string[];\n /** Set from new package path (to be evaluated) to info about the parent. */\n pathsToEvaluate: Set<string>;\n /** Package paths for which dependencies where included or excluded, so the package should be re-processed. */\n pathsToRefresh: Set<string>;\n} {\n const { info, definition, packagePath } = options;\n const { config } = context;\n const displayName = `${definition.name}@${definition.version}`;\n const changes: GeneratedPackageChanges[] = [];\n const warnings: string[] = [];\n const pathsToEvaluate = new Set<string>();\n const pathsToRefresh = new Set<string>();\n\n const { name, version } = definition;\n if (!name || !version) {\n throw new Error(`Package \"${displayName}\" is missing a name or version.`);\n }\n\n const dependencies = getDependencies(definition);\n const consumedDependencies = getConsumedDependencies(info);\n\n // Iterate through dependencies and find unused.\n for (const dependencyName of Object.keys(dependencies)) {\n // Set never exclude to the default if it is not set. Replace string '...' with default if set.\n const neverExclude = config.neverExcludeDependencies ?? defaultNeverExcludeDependencies;\n if (neverExclude.includes('...')) {\n neverExclude.splice(neverExclude.indexOf('...'), 1, ...defaultNeverExcludeDependencies);\n }\n\n if (consumedDependencies.has(dependencyName) || neverExclude.includes(dependencyName)) {\n continue;\n }\n\n pathsToEvaluate.add(packagePath);\n\n // Add to excludedDependencies\n const packageSettings = (config.generated.packageSettings ??= []);\n let generatedPackageSettings = getPackageSettings({\n config: { generated: { packageSettings } },\n name,\n version,\n firstMatch: true,\n }).generatedPackageSettings;\n\n if (!generatedPackageSettings) {\n generatedPackageSettings = {\n match: { name, version: `^${version}` },\n };\n packageSettings.push(generatedPackageSettings);\n }\n\n generatedPackageSettings.excludedDependencies ??= [];\n\n // Add to includedDependencies if it is not already included.\n if (generatedPackageSettings.excludedDependencies.includes(dependencyName)) {\n continue;\n }\n\n generatedPackageSettings.excludedDependencies.push(dependencyName);\n\n changes.push({\n name,\n version,\n path: packagePath,\n changes: [\n {\n type: 'excluded-dependency',\n change: dependencyName,\n reason: `Not imported by \"${displayName}\"`,\n },\n ],\n });\n\n pathsToRefresh.add(packagePath);\n }\n return { warnings, changes, pathsToEvaluate, pathsToRefresh };\n}\n"]}
1
+ {"version":3,"file":"optimizeDependencies.js","sourceRoot":"","sources":["../../../src/commands/init/optimizeDependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAmB,MAAM,iCAAiC,CAAC;AACtG,OAAO,EAAE,uBAAuB,EAAmB,MAAM,0BAA0B,CAAC;AAIpF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAKC,EACD,OAGC;IAWD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;IAC/D,MAAM,2BAA2B,GAA8B,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;IACrC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,iCAAiC,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAE3D,gDAAgD;IAChD,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACvD,IAAI,oBAAoB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;YACrF,SAAS;QACX,CAAC;QAED,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEjC,8BAA8B;QAC9B,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;QAClE,IAAI,wBAAwB,GAAG,kBAAkB,CAAC;YAChD,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,EAAE;YAC1C,IAAI;YACJ,OAAO;YACP,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC,wBAAwB,CAAC;QAE5B,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC9B,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnC,wBAAwB,GAAG;oBACzB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE;iBACxC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,wBAAwB,GAAG;oBACzB,KAAK,EAAE,IAAI;iBACZ,CAAC;YACJ,CAAC;YACD,eAAe,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACjD,CAAC;QAED,wBAAwB,CAAC,oBAAoB,KAAK,EAAE,CAAC;QAErD,6DAA6D;QAC7D,IAAI,wBAAwB,CAAC,oBAAoB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3E,SAAS;QACX,CAAC;QAED,wBAAwB,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEnE,2BAA2B,CAAC,IAAI,CAAC;YAC/B,IAAI;YACJ,OAAO;YACP,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,qBAAqB;oBAC3B,MAAM,EAAE,cAAc;oBACtB,MAAM,EAAE,oBAAoB,WAAW,GAAG;iBAC3C;aACF;SACF,CAAC,CAAC;QAEH,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,2BAA2B,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AACpF,CAAC","sourcesContent":["import { getPackageSettings } from '@ms-cloudpack/config';\nimport { getDependencies, isExternalPackage, type ResolveMap } from '@ms-cloudpack/package-utilities';\nimport { getConsumedDependencies, type BundleInfo } from '@ms-cloudpack/api-server';\nimport type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { CloudpackConfig, PackageJson } from '@ms-cloudpack/config-types';\nimport type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.js';\nimport { neverExclude } from './neverExclude.js';\n\n/**\n * Optimizes the dependencies of a package to determine if there are any missing or unused.\n * If so, adds the the missing dependencies to included and the unused dependencies to excluded.\n */\nexport function optimizeDependencies(\n options: {\n info: BundleInfo;\n definition: PackageJson;\n packagePath: string;\n resolveMap: ResolveMap;\n },\n context: {\n packages: PackageDefinitionsCache;\n config: CloudpackConfig;\n },\n): {\n /** Excluded dependencies changes made to the generated config */\n excludedDependenciesChanges: GeneratedPackageChanges[];\n /** Any warnings encountered */\n warnings: string[];\n /** Set from new package path (to be evaluated) to info about the parent. */\n pathsToEvaluate: Set<string>;\n /** Package paths for which dependencies where included or excluded, so the package should be re-processed. */\n pathsToRefresh: Set<string>;\n} {\n const { info, definition, packagePath } = options;\n const { config } = context;\n const displayName = `${definition.name}@${definition.version}`;\n const excludedDependenciesChanges: GeneratedPackageChanges[] = [];\n const warnings: string[] = [];\n const pathsToEvaluate = new Set<string>();\n const pathsToRefresh = new Set<string>();\n\n const { name, version } = definition;\n if (!name || !version) {\n throw new Error(`Package \"${displayName}\" is missing a name or version.`);\n }\n\n const dependencies = getDependencies(definition);\n const consumedDependencies = getConsumedDependencies(info);\n\n // Iterate through dependencies and find unused.\n for (const dependencyName of Object.keys(dependencies)) {\n if (consumedDependencies.has(dependencyName) || neverExclude(dependencyName, config)) {\n continue;\n }\n\n pathsToEvaluate.add(packagePath);\n\n // Add to excludedDependencies\n const packageSettings = (config.generated.packageSettings ??= []);\n let generatedPackageSettings = getPackageSettings({\n config: { generated: { packageSettings } },\n name,\n version,\n firstMatch: true,\n }).generatedPackageSettings;\n\n if (!generatedPackageSettings) {\n if (isExternalPackage(packagePath)) {\n generatedPackageSettings = {\n match: { name, version: `^${version}` },\n };\n } else {\n generatedPackageSettings = {\n match: name,\n };\n }\n packageSettings.push(generatedPackageSettings);\n }\n\n generatedPackageSettings.excludedDependencies ??= [];\n\n // Add to includedDependencies if it is not already included.\n if (generatedPackageSettings.excludedDependencies.includes(dependencyName)) {\n continue;\n }\n\n generatedPackageSettings.excludedDependencies.push(dependencyName);\n\n excludedDependenciesChanges.push({\n name,\n version,\n path: packagePath,\n changes: [\n {\n type: 'excluded-dependency',\n change: dependencyName,\n reason: `Not imported by \"${displayName}\"`,\n },\n ],\n });\n\n pathsToRefresh.add(packagePath);\n }\n return { warnings, excludedDependenciesChanges, pathsToEvaluate, pathsToRefresh };\n}\n"]}
@@ -8,7 +8,12 @@ export interface InitSummary {
8
8
  totalSuccess: number;
9
9
  totalErrors: number;
10
10
  totalWarnings: number;
11
+ /** Total number of changes made to the generated config */
11
12
  totalChanges: number;
13
+ /** Total number of required changes made to the generated config
14
+ * This changes will cause "--check" to fail if it's not 0
15
+ */
16
+ totalRequiredChanges: number;
12
17
  failed: boolean;
13
18
  generatedFileUpdates: GeneratedPackageChanges[];
14
19
  packagesWithErrors: InitPackageResultErrors[];
@@ -1 +1 @@
1
- {"version":3,"file":"InitSummary.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAEhB,oBAAoB,EAAE,uBAAuB,EAAE,CAAC;IAChD,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;IAC9C,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;CACnD"}
1
+ {"version":3,"file":"InitSummary.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAEhB,oBAAoB,EAAE,uBAAuB,EAAE,CAAC;IAChD,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;IAC9C,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;CACnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"InitSummary.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitSummary.ts"],"names":[],"mappings":"","sourcesContent":["import type { InitPackageResultErrors } from './InitPackageResultErrors.js';\nimport type { InitPackageResultWarnings } from './InitPackageResultWarnings.js';\nimport type { GeneratedPackageChanges } from './GeneratedPackageChanges.js';\n\nexport interface InitSummary {\n appPath: string;\n duration: number;\n totalPackages: number;\n totalSuccess: number;\n totalErrors: number;\n totalWarnings: number;\n totalChanges: number;\n failed: boolean;\n\n generatedFileUpdates: GeneratedPackageChanges[];\n packagesWithErrors: InitPackageResultErrors[];\n packagesWithWarnings: InitPackageResultWarnings[];\n}\n"]}
1
+ {"version":3,"file":"InitSummary.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitSummary.ts"],"names":[],"mappings":"","sourcesContent":["import type { InitPackageResultErrors } from './InitPackageResultErrors.js';\nimport type { InitPackageResultWarnings } from './InitPackageResultWarnings.js';\nimport type { GeneratedPackageChanges } from './GeneratedPackageChanges.js';\n\nexport interface InitSummary {\n appPath: string;\n duration: number;\n totalPackages: number;\n totalSuccess: number;\n totalErrors: number;\n totalWarnings: number;\n /** Total number of changes made to the generated config */\n totalChanges: number;\n /** Total number of required changes made to the generated config\n * This changes will cause \"--check\" to fail if it's not 0\n */\n totalRequiredChanges: number;\n failed: boolean;\n\n generatedFileUpdates: GeneratedPackageChanges[];\n packagesWithErrors: InitPackageResultErrors[];\n packagesWithWarnings: InitPackageResultWarnings[];\n}\n"]}
@@ -1,10 +1,14 @@
1
- import { type ResolveMap } from '@ms-cloudpack/package-utilities';
2
1
  import type { InitPackageResult } from './types/InitPackageResult.js';
2
+ import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';
3
+ import type { Session } from '@ms-cloudpack//api-server';
3
4
  /**
4
5
  * Checks that the imports/exports of packages match.
5
6
  * To be called before `summarize`.
6
7
  * @param packageResults - The package results to check.
7
- * @param resolveMap - The resolve map used to find the imported packages.
8
+ * @param context - The context to use.
8
9
  */
9
- export declare function verifyExports(packageResults: Record<string, InitPackageResult>, resolveMap: ResolveMap): InitPackageResult[];
10
+ export declare function verifyExports(packageResults: Record<string, InitPackageResult>, context: {
11
+ packages: PackageDefinitionsCache;
12
+ session: Session;
13
+ }): Promise<InitPackageResult[]>;
10
14
  //# sourceMappingURL=verifyExports.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifyExports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAuB,MAAM,iCAAiC,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACjD,UAAU,EAAE,UAAU,GACrB,iBAAiB,EAAE,CA+HrB"}
1
+ {"version":3,"file":"verifyExports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACjD,OAAO,EAAE;IACP,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB,GACA,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmH9B"}
@@ -1,12 +1,16 @@
1
- import { findResolveMapEntry } from '@ms-cloudpack/package-utilities';
1
+ import { findResolveMapEntry, flattenExportsMap, getExportsMap } from '@ms-cloudpack/package-utilities';
2
+ import { bulletedList } from '@ms-cloudpack/task-reporter';
3
+ import path from 'path';
2
4
  /**
3
5
  * Checks that the imports/exports of packages match.
4
6
  * To be called before `summarize`.
5
7
  * @param packageResults - The package results to check.
6
- * @param resolveMap - The resolve map used to find the imported packages.
8
+ * @param context - The context to use.
7
9
  */
8
- export function verifyExports(packageResults, resolveMap) {
9
- const allWarnings = [];
10
+ export async function verifyExports(packageResults, context) {
11
+ const { packages, session } = context;
12
+ const { config, resolveMap } = session;
13
+ const allErrors = [];
10
14
  const packageResultsArray = Object.values(packageResults);
11
15
  // Iterate through each package
12
16
  for (const packagePath in packageResults) {
@@ -15,96 +19,93 @@ export function verifyExports(packageResults, resolveMap) {
15
19
  if (!result || result.errors?.length) {
16
20
  continue;
17
21
  }
18
- const { info } = result;
22
+ const { info, name, version } = result;
19
23
  const definition = {
20
- name: result.name,
21
- version: result.version,
22
- path: result.path,
24
+ name,
25
+ version,
26
+ path: packagePath,
23
27
  };
24
- const packageWarning = {
28
+ const packageError = {
25
29
  ...definition,
26
30
  };
27
- // Makes sure that the warnings array is initialized and typescript happy.
28
- packageWarning.warnings = [];
31
+ // Makes sure that the errors array is initialized and typescript happy.
32
+ packageError.errors = [];
33
+ const missingExportsErrors = {};
29
34
  // Skip packages with no info
30
- if (!info) {
31
- packageWarning.warnings.push({ text: `Can't find bundle info` });
32
- allWarnings.push(packageWarning);
35
+ if (!info?.entry) {
33
36
  continue;
34
37
  }
35
38
  // Iterate through each entry
36
- for (const required of Object.values(info.entry ?? {})) {
37
- const { consumes, bundlePath } = required;
39
+ for (const [exportsEntry, required] of Object.entries(info.entry)) {
40
+ const { consumes } = required;
38
41
  // Skip entries with no imports
39
42
  if (!consumes?.length) {
40
43
  continue;
41
44
  }
42
- const namedExports = [];
43
- let missingExport = false;
44
45
  // Iterate through each imported package
45
46
  for (const { packageName, importPath, names } of consumes) {
46
- let prettyImportPath = importPath;
47
47
  const entry = findResolveMapEntry({ packageName, definition, resolveMap });
48
- // Remove leading dot from import path
49
- if (importPath.startsWith('.')) {
50
- prettyImportPath = importPath.substring(1);
51
- }
52
- // Warn if we can't find the imported package in the resolve map
48
+ // Skip if we can't find the imported package in the resolve map
53
49
  if (!entry) {
54
- packageWarning.warnings.push({
55
- text: `Can't find entry in resolve map for ${packageName}`,
56
- });
57
50
  continue;
58
51
  }
59
52
  const packageResult = packageResultsArray.find((r) => r.name === entry.name && r.version === entry.version);
60
- // Warn if we can't find the imported package in the package results
61
- if (!packageResult) {
62
- packageWarning.warnings.push({
63
- text: `In ${bundlePath} can't find package result of ${packageName}@${entry.version}`,
64
- });
53
+ // Skip packages without information.
54
+ if (!packageResult?.info?.entry) {
65
55
  continue;
66
56
  }
67
- // Warn if the imported package has no entry for the import path
68
- if (!packageResult.info?.entry?.[importPath] && !packageResult.info?.entry?.[importPath + '.js']) {
69
- packageWarning.warnings.push({
70
- text: `In ${bundlePath} can't find entry ${importPath} for ${packageName}@${entry.version})`,
71
- });
57
+ let realImportPath;
58
+ // Check if there is an entry for the import path.
59
+ if (packageResult.info.entry[importPath]) {
60
+ realImportPath = importPath;
61
+ // Check again with '.js' extension.
62
+ }
63
+ else if (packageResult.info.entry[`${importPath}.js`]) {
64
+ realImportPath = `${importPath}.js`;
65
+ }
66
+ else {
67
+ // evaluateImportsForOverrides has already been run,
68
+ // so if the export is missing it has tried to fix it and has already reported an error.
69
+ // Skip if the imported package has no entry for the import path
72
70
  continue;
73
71
  }
74
- const { bundlePath: importBundlePath, produces: importProduces } = packageResult.info.entry[importPath] || packageResult.info?.entry?.[importPath + '.js'] || {};
75
- const location = `${packageName}@${entry.version}${prettyImportPath} ${importBundlePath}`;
76
- const missingNamedExports = [];
77
- const catchAll = [];
72
+ const { produces: importProduces } = packageResult.info.entry[realImportPath];
73
+ // Skip if the import produces everything `*` because we can't check that.
78
74
  if (importProduces.includes('*')) {
79
- catchAll.push('*');
80
- }
81
- if (importProduces.includes('default')) {
82
- catchAll.push('default');
75
+ continue;
83
76
  }
84
- // Iterate through each imported name
85
- for (const name of names) {
86
- // Warn if the imported name is not exported
87
- if ((name !== '*' && !importProduces.includes(name)) || (name === '*' && importProduces.length === 0)) {
88
- missingExport = true;
89
- // Warn if the imported name is not exported
90
- missingNamedExports.push(name);
77
+ const missing = [];
78
+ // Iterate through each imported name.
79
+ for (const namedImport of names) {
80
+ // Error if the imported name is not exported.
81
+ if (namedImport !== '*' && !importProduces.includes(namedImport)) {
82
+ missing.push(namedImport);
91
83
  }
92
84
  }
93
- if (missingNamedExports.length) {
94
- namedExports.push(`${missingNamedExports.join(', ')} from ${location}${catchAll.length ? `, but it exports ${catchAll.join(', ')} which might be dynamically generated` : ''}`);
85
+ // No missing exports found.
86
+ if (!missing.length) {
87
+ continue;
95
88
  }
96
- }
97
- // Warn if the entry has missing exports
98
- if (missingExport) {
99
- packageWarning.warnings.push({
100
- text: `In ${bundlePath} can't find exports:\n` + namedExports.join('\n'),
101
- });
89
+ const exportsMapConsumed = await getExportsMap({ packagePath: entry.path }, { packages, config });
90
+ const flattenedExportsMapConsumed = flattenExportsMap(exportsMapConsumed);
91
+ const location = `"${packageName}@${entry.version}" (${path.join(entry.path, flattenedExportsMapConsumed[exportsEntry] || '')})`;
92
+ missingExportsErrors[location] ??= new Set();
93
+ missing.forEach((m) => missingExportsErrors[location].add(m));
102
94
  }
103
95
  }
104
- if (packageWarning.warnings?.length) {
105
- allWarnings.push(packageWarning);
96
+ for (const location in missingExportsErrors) {
97
+ const missing = Array.from(missingExportsErrors[location]);
98
+ packageError.errors.push({
99
+ text: errorText({ location, missing }),
100
+ });
101
+ }
102
+ if (packageError.errors?.length) {
103
+ allErrors.push(packageError);
106
104
  }
107
105
  }
108
- return allWarnings;
106
+ return allErrors;
107
+ }
108
+ function errorText({ location, missing }) {
109
+ return `Imported names are missing from external package's exports:\n${bulletedList([`Missing export(s): ${missing.join(', ')}`, `From: ${location}`], 2)}\n`;
109
110
  }
110
111
  //# sourceMappingURL=verifyExports.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifyExports.js","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGvF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,cAAiD,EACjD,UAAsB;IAEtB,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAE1D,+BAA+B;IAC/B,KAAK,MAAM,WAAW,IAAI,cAAc,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAE3C,4BAA4B;QAC5B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACxB,MAAM,UAAU,GAAG;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QAEF,MAAM,cAAc,GAAsB;YACxC,GAAG,UAAU;SACd,CAAC;QACF,0EAA0E;QAC1E,cAAc,CAAC,QAAQ,GAAG,EAAE,CAAC;QAE7B,6BAA6B;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;YACjE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YACvD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;YAE1C,+BAA+B;YAC/B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YAED,MAAM,YAAY,GAAa,EAAE,CAAC;YAClC,IAAI,aAAa,GAAG,KAAK,CAAC;YAE1B,wCAAwC;YACxC,KAAK,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1D,IAAI,gBAAgB,GAAG,UAAU,CAAC;gBAClC,MAAM,KAAK,GAAG,mBAAmB,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;gBAE3E,sCAAsC;gBACtC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,gBAAgB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;gBAED,gEAAgE;gBAChE,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAC3B,IAAI,EAAE,uCAAuC,WAAW,EAAE;qBAC3D,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;gBAE5G,oEAAoE;gBACpE,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAC3B,IAAI,EAAE,MAAM,UAAU,iCAAiC,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE;qBACtF,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,gEAAgE;gBAChE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC;oBACjG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAC3B,IAAI,EAAE,MAAM,UAAU,qBAAqB,UAAU,QAAQ,WAAW,IAAI,KAAK,CAAC,OAAO,GAAG;qBAC7F,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,GAC9D,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBAEhG,MAAM,QAAQ,GAAG,GAAG,WAAW,IAAI,KAAK,CAAC,OAAO,GAAG,gBAAgB,IAAI,gBAAgB,EAAE,CAAC;gBAC1F,MAAM,mBAAmB,GAAG,EAAE,CAAC;gBAE/B,MAAM,QAAQ,GAAG,EAAE,CAAC;gBACpB,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACvC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3B,CAAC;gBAED,qCAAqC;gBACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,4CAA4C;oBAC5C,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;wBACtG,aAAa,GAAG,IAAI,CAAC;wBACrB,4CAA4C;wBAC5C,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;gBAED,IAAI,mBAAmB,CAAC,MAAM,EAAE,CAAC;oBAC/B,YAAY,CAAC,IAAI,CACf,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,QAAQ,GAChD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC,EACrG,EAAE,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,wCAAwC;YACxC,IAAI,aAAa,EAAE,CAAC;gBAClB,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC3B,IAAI,EAAE,MAAM,UAAU,wBAAwB,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;iBACzE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACpC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { type ResolveMap, findResolveMapEntry } from '@ms-cloudpack/package-utilities';\nimport type { InitPackageResult } from './types/InitPackageResult.js';\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 resolveMap - The resolve map used to find the imported packages.\n */\nexport function verifyExports(\n packageResults: Record<string, InitPackageResult>,\n resolveMap: ResolveMap,\n): InitPackageResult[] {\n const allWarnings: InitPackageResult[] = [];\n const packageResultsArray = Object.values(packageResults);\n\n // Iterate through each package\n for (const packagePath in packageResults) {\n const result = packageResults[packagePath];\n\n // Skip packages with errors\n if (!result || result.errors?.length) {\n continue;\n }\n\n const { info } = result;\n const definition = {\n name: result.name,\n version: result.version,\n path: result.path,\n };\n\n const packageWarning: InitPackageResult = {\n ...definition,\n };\n // Makes sure that the warnings array is initialized and typescript happy.\n packageWarning.warnings = [];\n\n // Skip packages with no info\n if (!info) {\n packageWarning.warnings.push({ text: `Can't find bundle info` });\n allWarnings.push(packageWarning);\n continue;\n }\n\n // Iterate through each entry\n for (const required of Object.values(info.entry ?? {})) {\n const { consumes, bundlePath } = required;\n\n // Skip entries with no imports\n if (!consumes?.length) {\n continue;\n }\n\n const namedExports: string[] = [];\n let missingExport = false;\n\n // Iterate through each imported package\n for (const { packageName, importPath, names } of consumes) {\n let prettyImportPath = importPath;\n const entry = findResolveMapEntry({ packageName, definition, resolveMap });\n\n // Remove leading dot from import path\n if (importPath.startsWith('.')) {\n prettyImportPath = importPath.substring(1);\n }\n\n // Warn if we can't find the imported package in the resolve map\n if (!entry) {\n packageWarning.warnings.push({\n text: `Can't find entry in resolve map for ${packageName}`,\n });\n continue;\n }\n\n const packageResult = packageResultsArray.find((r) => r.name === entry.name && r.version === entry.version);\n\n // Warn if we can't find the imported package in the package results\n if (!packageResult) {\n packageWarning.warnings.push({\n text: `In ${bundlePath} can't find package result of ${packageName}@${entry.version}`,\n });\n continue;\n }\n\n // Warn if the imported package has no entry for the import path\n if (!packageResult.info?.entry?.[importPath] && !packageResult.info?.entry?.[importPath + '.js']) {\n packageWarning.warnings.push({\n text: `In ${bundlePath} can't find entry ${importPath} for ${packageName}@${entry.version})`,\n });\n continue;\n }\n\n const { bundlePath: importBundlePath, produces: importProduces } =\n packageResult.info.entry[importPath] || packageResult.info?.entry?.[importPath + '.js'] || {};\n\n const location = `${packageName}@${entry.version}${prettyImportPath} ${importBundlePath}`;\n const missingNamedExports = [];\n\n const catchAll = [];\n if (importProduces.includes('*')) {\n catchAll.push('*');\n }\n if (importProduces.includes('default')) {\n catchAll.push('default');\n }\n\n // Iterate through each imported name\n for (const name of names) {\n // Warn if the imported name is not exported\n if ((name !== '*' && !importProduces.includes(name)) || (name === '*' && importProduces.length === 0)) {\n missingExport = true;\n // Warn if the imported name is not exported\n missingNamedExports.push(name);\n }\n }\n\n if (missingNamedExports.length) {\n namedExports.push(\n `${missingNamedExports.join(', ')} from ${location}${\n catchAll.length ? `, but it exports ${catchAll.join(', ')} which might be dynamically generated` : ''\n }`,\n );\n }\n }\n\n // Warn if the entry has missing exports\n if (missingExport) {\n packageWarning.warnings.push({\n text: `In ${bundlePath} can't find exports:\\n` + namedExports.join('\\n'),\n });\n }\n }\n if (packageWarning.warnings?.length) {\n allWarnings.push(packageWarning);\n }\n }\n\n return allWarnings;\n}\n"]}
1
+ {"version":3,"file":"verifyExports.js","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"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","sourcesContent":["import { findResolveMapEntry, flattenExportsMap, getExportsMap } from '@ms-cloudpack/package-utilities';\nimport { bulletedList } from '@ms-cloudpack/task-reporter';\nimport path from 'path';\nimport type { InitPackageResult } from './types/InitPackageResult.js';\nimport type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { Session } from '@ms-cloudpack//api-server';\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 */\nexport async function verifyExports(\n packageResults: Record<string, InitPackageResult>,\n context: {\n packages: PackageDefinitionsCache;\n session: Session;\n },\n): Promise<InitPackageResult[]> {\n const { packages, session } = context;\n const { config, resolveMap } = session;\n const allErrors: InitPackageResult[] = [];\n const packageResultsArray = Object.values(packageResults);\n\n // Iterate through each package\n for (const packagePath in packageResults) {\n const result = packageResults[packagePath];\n\n // Skip packages with errors\n if (!result || result.errors?.length) {\n continue;\n }\n\n const { info, name, version } = result;\n const definition = {\n name,\n version,\n path: packagePath,\n };\n\n const packageError: InitPackageResult = {\n ...definition,\n };\n // Makes sure that the errors array is initialized and typescript happy.\n packageError.errors = [];\n const missingExportsErrors: Record<string, Set<string>> = {};\n\n // Skip packages with no info\n if (!info?.entry) {\n continue;\n }\n\n // Iterate through each entry\n for (const [exportsEntry, required] of Object.entries(info.entry)) {\n const { consumes } = required;\n\n // Skip entries with no imports\n if (!consumes?.length) {\n continue;\n }\n\n // Iterate through each imported package\n for (const { packageName, importPath, names } of consumes) {\n const entry = findResolveMapEntry({ packageName, definition, resolveMap });\n\n // Skip if we can't find the imported package in the resolve map\n if (!entry) {\n continue;\n }\n\n const packageResult = packageResultsArray.find((r) => r.name === entry.name && r.version === entry.version);\n\n // Skip packages without information.\n if (!packageResult?.info?.entry) {\n continue;\n }\n\n let realImportPath: string;\n // Check if there is an entry for the import path.\n if (packageResult.info.entry[importPath]) {\n realImportPath = importPath;\n // Check again with '.js' extension.\n } else if (packageResult.info.entry[`${importPath}.js`]) {\n realImportPath = `${importPath}.js`;\n } else {\n // evaluateImportsForOverrides has already been run,\n // so if the export is missing it has tried to fix it and has already reported an error.\n // Skip if the imported package has no entry for the import path\n continue;\n }\n\n const { produces: importProduces } = packageResult.info.entry[realImportPath];\n\n // Skip if the import produces everything `*` because we can't check that.\n if (importProduces.includes('*')) {\n continue;\n }\n\n const missing = [];\n // Iterate through each imported name.\n for (const namedImport of names) {\n // Error if the imported name is not exported.\n if (namedImport !== '*' && !importProduces.includes(namedImport)) {\n missing.push(namedImport);\n }\n }\n\n // No missing exports found.\n if (!missing.length) {\n continue;\n }\n\n const exportsMapConsumed = await getExportsMap({ packagePath: entry.path }, { packages, config });\n const flattenedExportsMapConsumed = flattenExportsMap(exportsMapConsumed);\n const location = `\"${packageName}@${entry.version}\" (${path.join(entry.path, flattenedExportsMapConsumed[exportsEntry] || '')})`;\n missingExportsErrors[location] ??= new Set();\n missing.forEach((m) => missingExportsErrors[location].add(m));\n }\n }\n\n for (const location in missingExportsErrors) {\n const missing = Array.from(missingExportsErrors[location]);\n packageError.errors.push({\n text: errorText({ location, missing }),\n });\n }\n\n if (packageError.errors?.length) {\n allErrors.push(packageError);\n }\n }\n\n return allErrors;\n}\n\nfunction errorText({ location, missing }: { location: string; missing: string[] }) {\n return `Imported names are missing from external package's exports:\\n${bulletedList(\n [`Missing export(s): ${missing.join(', ')}`, `From: ${location}`],\n 2,\n )}\\n`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"CommandExecutor.d.ts","sourceRoot":"","sources":["../../src/common/CommandExecutor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,2BAA2B,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM/D;;GAEG;AACH,qBAAa,eAAe,CAAC,QAAQ,SAAS,aAAa;IACzD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,EAAE;QAClB,2CAA2C;QAC3C,OAAO,EAAE,QAAQ,CAAC;QAClB,uCAAuC;QACvC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjC,0CAA0C;QAC1C,cAAc,EAAE,cAAc,CAAC;QAC/B,sDAAsD;QACtD,IAAI,EAAE,MAAM,CAAC;KACd;IAUD,uBAAuB;IAEV,OAAO;IAwCpB;;;;;OAKG;YACW,WAAW;YAyFX,cAAc;IAiC5B;;;OAGG;IACH,OAAO,CAAC,KAAK,CA0BX;CACH"}
1
+ {"version":3,"file":"CommandExecutor.d.ts","sourceRoot":"","sources":["../../src/common/CommandExecutor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,2BAA2B,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM/D;;GAEG;AACH,qBAAa,eAAe,CAAC,QAAQ,SAAS,aAAa;IACzD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,EAAE;QAClB,2CAA2C;QAC3C,OAAO,EAAE,QAAQ,CAAC;QAClB,uCAAuC;QACvC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjC,0CAA0C;QAC1C,cAAc,EAAE,cAAc,CAAC;QAC/B,sDAAsD;QACtD,IAAI,EAAE,MAAM,CAAC;KACd;IAUD,uBAAuB;IAEV,OAAO;IAwCpB;;;;;OAKG;YACW,WAAW;YAyFX,cAAc;IAkD5B;;;OAGG;IACH,OAAO,CAAC,KAAK,CA0BX;CACH"}
@@ -162,10 +162,24 @@ export class CommandExecutor {
162
162
  serviceName: 'cli',
163
163
  rootSpanName: 'CLI',
164
164
  });
165
+ const isCI = isCIBuild();
165
166
  telemetryClient.setSharedSpanAttribute('verb', this._verb);
166
167
  telemetryClient.setSharedSpanAttribute('arguments', programOptions.argv.slice(3).join(' '));
167
- telemetryClient.setSharedSpanAttribute('environment', isCIBuild() ? 'ci' : 'local');
168
+ telemetryClient.setSharedSpanAttribute('environment', isCI ? 'ci' : 'local');
168
169
  telemetryClient.setSharedSpanAttribute('appName', appName || '<unknown>');
170
+ if (isCI) {
171
+ const ciAttributes = {
172
+ buildId: process.env.BUILD_BUILDID,
173
+ definitionId: process.env.SYSTEM_DEFINITIONID,
174
+ buildReason: process.env.BUILD_REASON,
175
+ pullRequestId: process.env.SYSTEM_PULLREQUEST_PULLREQUESTID,
176
+ };
177
+ for (const [key, value] of Object.entries(ciAttributes)) {
178
+ if (value) {
179
+ telemetryClient.setSharedSpanAttribute(key, value);
180
+ }
181
+ }
182
+ }
169
183
  // Register performance observers to track performance metrics as events of CLI span.
170
184
  registerPerformanceObservers(telemetryClient);
171
185
  return telemetryClient;
@@ -1 +1 @@
1
- {"version":3,"file":"CommandExecutor.js","sourceRoot":"","sources":["../../src/common/CommandExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["import { readConfig } from '@ms-cloudpack/config';\nimport type { CloudpackConfig, PackageJson } from '@ms-cloudpack/config-types';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport {\n TaskReporter,\n bold,\n debugLoggingConfig,\n defaultLoggingConfig,\n noLoggingConfig,\n red,\n verboseLoggingConfig,\n yellow,\n} from '@ms-cloudpack/task-reporter';\nimport { createTelemetryClient, type TelemetryClient } from '@ms-cloudpack/telemetry';\nimport path from 'path';\nimport { registerPerformanceObservers } from '../performance/registerPerformanceObservers.js';\nimport type { CommandAction, InitContext } from '../types/CommandAction.js';\nimport type { ProgramOptions } from '../types/ProgramOptions.js';\nimport type { SharedOptions } from '../types/SharedOptions.js';\nimport { isCIBuild } from '../utilities/isCIBuild.js';\nimport { AutoDisposableList } from './AutoDisposableList.js';\nimport { checkFeatures } from './checkFeatures.js';\nimport { getMergedFeatureFlags } from './getMergedFeatureFlags.js';\n\n/**\n * This class manages orchestration and shared state while executing a command.\n */\nexport class CommandExecutor<TOptions extends SharedOptions> {\n private _options: TOptions;\n private _execute: CommandAction<TOptions>;\n private _programOptions: ProgramOptions;\n private _verb: string;\n private _reporter: TaskReporter;\n private _autoDisposableList: AutoDisposableList;\n private _abortController: AbortController;\n private _hasCalledExit = false;\n\n constructor(params: {\n /** Command-specific and shared options. */\n options: TOptions;\n /** Function to execute the command. */\n execute: CommandAction<TOptions>;\n /** Shared program-level configuration. */\n programOptions: ProgramOptions;\n /** Verb being run, e.g. `bundle` or `cache clean`. */\n verb: string;\n }) {\n this._options = params.options;\n this._execute = params.execute;\n this._programOptions = params.programOptions;\n this._verb = params.verb;\n this._reporter = new TaskReporter();\n this._abortController = new AbortController();\n this._autoDisposableList = new AutoDisposableList();\n }\n\n /** Run the command. */\n // This has to be a separate method because constructors can't be async.\n public async execute() {\n try {\n // Setup cleanup and close things on completion.\n let sigintCount = 0;\n\n // Handle SIGINT (Ctrl+C) gracefully.\n process.on('SIGINT', () => {\n sigintCount++;\n if (sigintCount > 1) {\n console.debug('Forcing exit');\n\n // We are forcing the process to exit.\n // No clean-up is needed because user pressed Ctrl+C twice.\n process.exit(1);\n }\n\n // We are trying to exit gracefully.\n void this._exit();\n });\n\n // Call the execute function which is the real command logic\n // (ie: real init command logic, real start command logic, etc.)\n await this._execute({\n options: this._options,\n cwd: this._programOptions.cwd,\n reporter: this._reporter,\n initialize: this._initialize.bind(this),\n abortSignal: this._abortController.signal,\n autoDispose: (disposable) => this._autoDisposableList.add(disposable),\n exit: this._exit,\n });\n } catch (error) {\n // If an error occurs, exit the process with a non-zero exit code.\n await this._exit({\n hasErrors: true,\n message: error instanceof Error ? error.stack || error.message : String(error),\n });\n }\n }\n\n /**\n * This is the `initialize` function passed to the command's execute function.\n * This function uses `this` to references several class members, which is why\n * the `execute` method must use `.bind(this)`.\n * (An arrow function isn't possible here due to the overloaded method signature).\n */\n private async _initialize(initializeParams: {\n appPath: string;\n overrideOptions?: Partial<SharedOptions>;\n }): Promise<InitContext>;\n private async _initialize(initializeParams: {\n appPaths: string[];\n overrideOptions?: Partial<SharedOptions>;\n }): Promise<InitContext[]>;\n private async _initialize(initializeParams: {\n appPath?: string;\n appPaths?: string[];\n overrideOptions?: Partial<SharedOptions>;\n }): Promise<InitContext | InitContext[]> {\n const { appPath: singleAppPath } = initializeParams;\n let { appPaths } = initializeParams;\n\n if (singleAppPath && appPaths) {\n throw Error('appPath and appPaths cannot both be specified at the same time');\n }\n if (!singleAppPath && !appPaths) {\n throw Error('one of appPath or appPaths must be specified');\n }\n\n if (!appPaths || appPaths.length === 0) {\n appPaths = singleAppPath ? [singleAppPath] : [];\n }\n\n const initContexts = [];\n\n for (const appPath of appPaths) {\n const actionOptions: SharedOptions = {\n ...this._options,\n ...initializeParams.overrideOptions,\n };\n\n const config = await readConfig(appPath);\n const definition = (await readJson(path.join(appPath, 'package.json'))) as PackageJson;\n\n // Set reporter options and print the product info header\n this._reporter.setOptions({\n productName: 'Cloudpack',\n version: this._programOptions.version,\n description: () => `Running \"${bold(this._programOptions.argv.slice(2).join(' '))}\"`,\n helpMessage: config.helpMessage,\n plainTextMode: !actionOptions.color,\n ...(actionOptions.debug\n ? debugLoggingConfig\n : actionOptions.verbose\n ? verboseLoggingConfig\n : actionOptions.quiet\n ? noLoggingConfig\n : defaultLoggingConfig),\n });\n\n const telemetryClient = await this._initTelemetry(definition.name, config);\n // Dispose the telemetry client when the app is closing\n this._autoDisposableList.add({\n dispose: () => telemetryClient.shutdown(),\n });\n\n // Merge in any additional features from the command line and remote feature flags.\n config.features = await getMergedFeatureFlags(config, actionOptions, appPath, definition.name);\n\n const featureErrors = checkFeatures({ configFeatures: config.features });\n // If there are any invalid features, exit with an error.\n if (featureErrors.length) {\n featureErrors.forEach((error) => console.error(error));\n process.exit(1);\n }\n\n const enabledFeatureNames = Object.entries(config.features)\n .filter(([, value]) => value)\n .map(([key]) => key);\n\n if (enabledFeatureNames.length) {\n telemetryClient.setSharedSpanAttribute('features', enabledFeatureNames);\n console.log(`Enabled features: ${enabledFeatureNames.map((f) => yellow(f)).join(', ')}`);\n }\n\n initContexts.push({\n appPath: appPath,\n telemetryClient,\n config,\n });\n }\n\n return singleAppPath ? initContexts[0] : initContexts;\n }\n\n private async _initTelemetry(appName: string | undefined, config: CloudpackConfig): Promise<TelemetryClient> {\n const programOptions = this._programOptions;\n const options = this._options;\n\n const connectionString = programOptions.disableTelemetry\n ? undefined\n : config.telemetry?.connectionString || process.env.CLOUDPACK_TELEMETRY_CONNECTION_STRING;\n\n const logLevel = options.verbose ? 'VERBOSE' : options.debug ? 'DEBUG' : undefined;\n if (!options.debug) {\n this._reporter.ignoreLogMessage('ApplicationInsights:');\n }\n\n const telemetryClient = await createTelemetryClient({\n productVersion: programOptions.version,\n connectionString,\n logLevel,\n serviceNamespace: 'cloudpack',\n serviceName: 'cli',\n rootSpanName: 'CLI',\n });\n\n telemetryClient.setSharedSpanAttribute('verb', this._verb);\n telemetryClient.setSharedSpanAttribute('arguments', programOptions.argv.slice(3).join(' '));\n telemetryClient.setSharedSpanAttribute('environment', isCIBuild() ? 'ci' : 'local');\n telemetryClient.setSharedSpanAttribute('appName', appName || '<unknown>');\n\n // Register performance observers to track performance metrics as events of CLI span.\n registerPerformanceObservers(telemetryClient);\n\n return telemetryClient;\n }\n\n /**\n * This is the `exit` function passed to the command's execute function.\n * (It must be an arrow function to ensure the correct `this` context.)\n */\n private _exit = async (\n exitOptions: {\n hasErrors?: boolean;\n message?: string;\n exitCode?: number;\n } = {},\n ) => {\n const { message, hasErrors = this._reporter.hasErrors(), exitCode = hasErrors ? 1 : 0 } = exitOptions;\n\n if (this._hasCalledExit) {\n // Skip most of the operations if exit() was called multiple times.\n console.warn(\"exit() was called multiple times. This call's options:\", exitOptions);\n } else {\n this._hasCalledExit = true;\n\n // Let the execute function know that we are exiting.\n this._abortController.abort();\n\n // Dispose all registered disposables.\n await this._autoDisposableList.dispose();\n\n // Show the summary message (this will throw if called twice).\n this._reporter.complete(hasErrors ? red(message) : message);\n }\n\n process.exit(exitCode);\n };\n}\n"]}
1
+ {"version":3,"file":"CommandExecutor.js","sourceRoot":"","sources":["../../src/common/CommandExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["import { readConfig } from '@ms-cloudpack/config';\nimport type { CloudpackConfig, PackageJson } from '@ms-cloudpack/config-types';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport {\n TaskReporter,\n bold,\n debugLoggingConfig,\n defaultLoggingConfig,\n noLoggingConfig,\n red,\n verboseLoggingConfig,\n yellow,\n} from '@ms-cloudpack/task-reporter';\nimport { createTelemetryClient, type TelemetryClient } from '@ms-cloudpack/telemetry';\nimport path from 'path';\nimport { registerPerformanceObservers } from '../performance/registerPerformanceObservers.js';\nimport type { CommandAction, InitContext } from '../types/CommandAction.js';\nimport type { ProgramOptions } from '../types/ProgramOptions.js';\nimport type { SharedOptions } from '../types/SharedOptions.js';\nimport { isCIBuild } from '../utilities/isCIBuild.js';\nimport { AutoDisposableList } from './AutoDisposableList.js';\nimport { checkFeatures } from './checkFeatures.js';\nimport { getMergedFeatureFlags } from './getMergedFeatureFlags.js';\n\n/**\n * This class manages orchestration and shared state while executing a command.\n */\nexport class CommandExecutor<TOptions extends SharedOptions> {\n private _options: TOptions;\n private _execute: CommandAction<TOptions>;\n private _programOptions: ProgramOptions;\n private _verb: string;\n private _reporter: TaskReporter;\n private _autoDisposableList: AutoDisposableList;\n private _abortController: AbortController;\n private _hasCalledExit = false;\n\n constructor(params: {\n /** Command-specific and shared options. */\n options: TOptions;\n /** Function to execute the command. */\n execute: CommandAction<TOptions>;\n /** Shared program-level configuration. */\n programOptions: ProgramOptions;\n /** Verb being run, e.g. `bundle` or `cache clean`. */\n verb: string;\n }) {\n this._options = params.options;\n this._execute = params.execute;\n this._programOptions = params.programOptions;\n this._verb = params.verb;\n this._reporter = new TaskReporter();\n this._abortController = new AbortController();\n this._autoDisposableList = new AutoDisposableList();\n }\n\n /** Run the command. */\n // This has to be a separate method because constructors can't be async.\n public async execute() {\n try {\n // Setup cleanup and close things on completion.\n let sigintCount = 0;\n\n // Handle SIGINT (Ctrl+C) gracefully.\n process.on('SIGINT', () => {\n sigintCount++;\n if (sigintCount > 1) {\n console.debug('Forcing exit');\n\n // We are forcing the process to exit.\n // No clean-up is needed because user pressed Ctrl+C twice.\n process.exit(1);\n }\n\n // We are trying to exit gracefully.\n void this._exit();\n });\n\n // Call the execute function which is the real command logic\n // (ie: real init command logic, real start command logic, etc.)\n await this._execute({\n options: this._options,\n cwd: this._programOptions.cwd,\n reporter: this._reporter,\n initialize: this._initialize.bind(this),\n abortSignal: this._abortController.signal,\n autoDispose: (disposable) => this._autoDisposableList.add(disposable),\n exit: this._exit,\n });\n } catch (error) {\n // If an error occurs, exit the process with a non-zero exit code.\n await this._exit({\n hasErrors: true,\n message: error instanceof Error ? error.stack || error.message : String(error),\n });\n }\n }\n\n /**\n * This is the `initialize` function passed to the command's execute function.\n * This function uses `this` to references several class members, which is why\n * the `execute` method must use `.bind(this)`.\n * (An arrow function isn't possible here due to the overloaded method signature).\n */\n private async _initialize(initializeParams: {\n appPath: string;\n overrideOptions?: Partial<SharedOptions>;\n }): Promise<InitContext>;\n private async _initialize(initializeParams: {\n appPaths: string[];\n overrideOptions?: Partial<SharedOptions>;\n }): Promise<InitContext[]>;\n private async _initialize(initializeParams: {\n appPath?: string;\n appPaths?: string[];\n overrideOptions?: Partial<SharedOptions>;\n }): Promise<InitContext | InitContext[]> {\n const { appPath: singleAppPath } = initializeParams;\n let { appPaths } = initializeParams;\n\n if (singleAppPath && appPaths) {\n throw Error('appPath and appPaths cannot both be specified at the same time');\n }\n if (!singleAppPath && !appPaths) {\n throw Error('one of appPath or appPaths must be specified');\n }\n\n if (!appPaths || appPaths.length === 0) {\n appPaths = singleAppPath ? [singleAppPath] : [];\n }\n\n const initContexts = [];\n\n for (const appPath of appPaths) {\n const actionOptions: SharedOptions = {\n ...this._options,\n ...initializeParams.overrideOptions,\n };\n\n const config = await readConfig(appPath);\n const definition = (await readJson(path.join(appPath, 'package.json'))) as PackageJson;\n\n // Set reporter options and print the product info header\n this._reporter.setOptions({\n productName: 'Cloudpack',\n version: this._programOptions.version,\n description: () => `Running \"${bold(this._programOptions.argv.slice(2).join(' '))}\"`,\n helpMessage: config.helpMessage,\n plainTextMode: !actionOptions.color,\n ...(actionOptions.debug\n ? debugLoggingConfig\n : actionOptions.verbose\n ? verboseLoggingConfig\n : actionOptions.quiet\n ? noLoggingConfig\n : defaultLoggingConfig),\n });\n\n const telemetryClient = await this._initTelemetry(definition.name, config);\n // Dispose the telemetry client when the app is closing\n this._autoDisposableList.add({\n dispose: () => telemetryClient.shutdown(),\n });\n\n // Merge in any additional features from the command line and remote feature flags.\n config.features = await getMergedFeatureFlags(config, actionOptions, appPath, definition.name);\n\n const featureErrors = checkFeatures({ configFeatures: config.features });\n // If there are any invalid features, exit with an error.\n if (featureErrors.length) {\n featureErrors.forEach((error) => console.error(error));\n process.exit(1);\n }\n\n const enabledFeatureNames = Object.entries(config.features)\n .filter(([, value]) => value)\n .map(([key]) => key);\n\n if (enabledFeatureNames.length) {\n telemetryClient.setSharedSpanAttribute('features', enabledFeatureNames);\n console.log(`Enabled features: ${enabledFeatureNames.map((f) => yellow(f)).join(', ')}`);\n }\n\n initContexts.push({\n appPath: appPath,\n telemetryClient,\n config,\n });\n }\n\n return singleAppPath ? initContexts[0] : initContexts;\n }\n\n private async _initTelemetry(appName: string | undefined, config: CloudpackConfig): Promise<TelemetryClient> {\n const programOptions = this._programOptions;\n const options = this._options;\n\n const connectionString = programOptions.disableTelemetry\n ? undefined\n : config.telemetry?.connectionString || process.env.CLOUDPACK_TELEMETRY_CONNECTION_STRING;\n\n const logLevel = options.verbose ? 'VERBOSE' : options.debug ? 'DEBUG' : undefined;\n if (!options.debug) {\n this._reporter.ignoreLogMessage('ApplicationInsights:');\n }\n\n const telemetryClient = await createTelemetryClient({\n productVersion: programOptions.version,\n connectionString,\n logLevel,\n serviceNamespace: 'cloudpack',\n serviceName: 'cli',\n rootSpanName: 'CLI',\n });\n\n const isCI = isCIBuild();\n\n telemetryClient.setSharedSpanAttribute('verb', this._verb);\n telemetryClient.setSharedSpanAttribute('arguments', programOptions.argv.slice(3).join(' '));\n telemetryClient.setSharedSpanAttribute('environment', isCI ? 'ci' : 'local');\n telemetryClient.setSharedSpanAttribute('appName', appName || '<unknown>');\n\n if (isCI) {\n const ciAttributes = {\n buildId: process.env.BUILD_BUILDID,\n definitionId: process.env.SYSTEM_DEFINITIONID,\n buildReason: process.env.BUILD_REASON,\n pullRequestId: process.env.SYSTEM_PULLREQUEST_PULLREQUESTID,\n };\n\n for (const [key, value] of Object.entries(ciAttributes)) {\n if (value) {\n telemetryClient.setSharedSpanAttribute(key, value);\n }\n }\n }\n\n // Register performance observers to track performance metrics as events of CLI span.\n registerPerformanceObservers(telemetryClient);\n\n return telemetryClient;\n }\n\n /**\n * This is the `exit` function passed to the command's execute function.\n * (It must be an arrow function to ensure the correct `this` context.)\n */\n private _exit = async (\n exitOptions: {\n hasErrors?: boolean;\n message?: string;\n exitCode?: number;\n } = {},\n ) => {\n const { message, hasErrors = this._reporter.hasErrors(), exitCode = hasErrors ? 1 : 0 } = exitOptions;\n\n if (this._hasCalledExit) {\n // Skip most of the operations if exit() was called multiple times.\n console.warn(\"exit() was called multiple times. This call's options:\", exitOptions);\n } else {\n this._hasCalledExit = true;\n\n // Let the execute function know that we are exiting.\n this._abortController.abort();\n\n // Dispose all registered disposables.\n await this._autoDisposableList.dispose();\n\n // Show the summary message (this will throw if called twice).\n this._reporter.complete(hasErrors ? red(message) : message);\n }\n\n process.exit(exitCode);\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/cli",
3
- "version": "0.56.6-beta.0",
3
+ "version": "0.56.7",
4
4
  "description": "The Cloudpack command line interface - a tool for managing fast inner and outer looping in web apps.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -10,19 +10,20 @@
10
10
  "cloudpack": "./bin/cloudpack.js"
11
11
  },
12
12
  "dependencies": {
13
- "@ms-cloudpack/api-server": "^0.31.6-beta.0",
14
- "@ms-cloudpack/bundle-server": "^0.2.30-beta.0",
15
- "@ms-cloudpack/config": "^0.17.32",
16
- "@ms-cloudpack/config-types": "^0.5.1",
13
+ "@ms-cloudpack/api-server": "^0.31.6",
14
+ "@ms-cloudpack/bundle-server": "^0.2.30",
15
+ "@ms-cloudpack/config": "^0.17.33",
16
+ "@ms-cloudpack/config-types": "^0.6.0",
17
17
  "@ms-cloudpack/feature-flags": "^0.1.1",
18
18
  "@ms-cloudpack/json-utilities": "^0.1.4",
19
- "@ms-cloudpack/package-utilities": "^5.11.1",
19
+ "@ms-cloudpack/package-utilities": "^5.11.2",
20
20
  "@ms-cloudpack/path-string-parsing": "^1.2.0",
21
21
  "@ms-cloudpack/path-utilities": "^2.6.0",
22
- "@ms-cloudpack/remote-cache": "^0.5.1-beta.0",
23
- "@ms-cloudpack/app-server": "^0.1.33-beta.0",
22
+ "@ms-cloudpack/remote-cache": "^0.5.0",
23
+ "@ms-cloudpack/app-server": "^0.2.0",
24
24
  "@ms-cloudpack/task-reporter": "^0.11.1",
25
- "@ms-cloudpack/telemetry": "^0.4.7-beta.0",
25
+ "@ms-cloudpack/telemetry": "^0.4.6",
26
+ "@ms-cloudpack/overlay": "^0.16.79",
26
27
  "@yarnpkg/lockfile": "^1.1.0",
27
28
  "commander": "^11.1.0",
28
29
  "cross-spawn": "^7.0.3",