@ms-cloudpack/cli 0.59.0 → 0.59.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import type { BundleInfo } from '@ms-cloudpack/api-server';
2
- import type { CloudpackConfig, PackageDefinitionsCache, PackageImporterContext, PackageJson } from '@ms-cloudpack/common-types';
2
+ import type { BundleMessage, CloudpackConfig, PackageDefinitionsCache, PackageImporterContext, PackageJson } from '@ms-cloudpack/common-types';
3
3
  import type { ResolveMap } from '@ms-cloudpack/package-utilities';
4
4
  import type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.js';
5
5
  /**
@@ -21,9 +21,9 @@ export declare function evaluateImportsForOverrides(options: {
21
21
  /** Included dependencies changes made to the generated config */
22
22
  includedDependenciesChanges: GeneratedPackageChanges[];
23
23
  /** Any errors encountered */
24
- errors: string[];
24
+ errors: BundleMessage[];
25
25
  /** Any warnings generated */
26
- warnings: string[];
26
+ warnings: BundleMessage[];
27
27
  /** Map from new package path (to be evaluated) to info about the parent. */
28
28
  pathsToEvaluate: Map<string, PackageImporterContext | undefined>;
29
29
  /** Package paths for which new exports were added, so the package should be re-processed. */
@@ -1 +1 @@
1
- {"version":3,"file":"evaluateImportsForOverrides.d.ts","sourceRoot":"","sources":["../../../src/commands/init/evaluateImportsForOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,sBAAsB,EACtB,WAAW,EAEZ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAWlE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAKlF;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,QAAQ,EAAE,uBAAuB,CAAC;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,sBAAsB,GAAG,SAAS,CAAC;CACrD,GAAG,OAAO,CAAC;IACV,kDAAkD;IAClD,cAAc,EAAE,uBAAuB,EAAE,CAAC;IAC1C,iEAAiE;IACjE,2BAA2B,EAAE,uBAAuB,EAAE,CAAC;IACvD,6BAA6B;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4EAA4E;IAC5E,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC;IACjE,6FAA6F;IAC7F,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC,CAiMD"}
1
+ {"version":3,"file":"evaluateImportsForOverrides.d.ts","sourceRoot":"","sources":["../../../src/commands/init/evaluateImportsForOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,sBAAsB,EACtB,WAAW,EAEZ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAWlE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAMlF;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,QAAQ,EAAE,uBAAuB,CAAC;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,sBAAsB,GAAG,SAAS,CAAC;CACrD,GAAG,OAAO,CAAC;IACV,kDAAkD;IAClD,cAAc,EAAE,uBAAuB,EAAE,CAAC;IAC1C,iEAAiE;IACjE,2BAA2B,EAAE,uBAAuB,EAAE,CAAC;IACvD,6BAA6B;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,4EAA4E;IAC5E,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC;IACjE,6FAA6F;IAC7F,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC,CA0LD"}
@@ -4,6 +4,7 @@ import { bulletedList, cyan } from '@ms-cloudpack/task-reporter';
4
4
  import { isBuiltin } from 'module';
5
5
  import { getConsumedPaths } from '@ms-cloudpack/api-server';
6
6
  import { neverExclude } from './neverExclude.js';
7
+ import path from 'path';
7
8
  /**
8
9
  * Evaluate the imports depended on by a package to determine if missing exports map paths need to be added.
9
10
  * If so, updates package overrides in the config.
@@ -29,49 +30,39 @@ export async function evaluateImportsForOverrides(options) {
29
30
  const resolveEntry = findResolveMapEntry({ definition, packageName: dependencyName, resolveMap });
30
31
  const dependencyPath = resolveEntry?.path;
31
32
  const dependencyDefinition = dependencyPath ? await packages.get(dependencyPath) : undefined;
32
- const message = `The package "${dependencyName}" couldn't be found, but it's being imported by the package "${displayName}". ` +
33
- `Please ensure that "${dependencyName}" is listed in the dependencies of "${displayName}".`;
34
- const messageBuiltin = `The node built-in "${dependencyName}" is being imported by the package "${displayName}", but no browser-friendly version was found in dependencies. ` +
35
- `This can be fixed by forcing the package "${displayName}" to use "bundlerType": "rollup" in package settings, or by adding a polyfill browser-friendly dependency.`;
36
33
  // If the dependency is not resolved, add an error.
37
34
  if (!dependencyPath || !dependencyDefinition) {
38
- isBuiltin(dependencyName) ? errors.push(messageBuiltin) : errors.push(message);
35
+ errors.push(getMissingDepMessage({ dependencyName, displayName, issueType: 'not-found', packagePath }));
39
36
  // If the dependency is not resolved, we can't continue to evaluate it.
40
37
  continue;
41
38
  }
42
- // If the dependency is not listed as a dependency add to includedDependencies.
39
+ // If the dependency is not listed, add to includedDependencies.
43
40
  if (!dependencies[dependencyName] && dependencyName !== definition.name && !neverExclude(dependencyName, config)) {
44
41
  // Survive from the case where it is not a dependency in the package.json
45
42
  // and it is resolvable, but warn the user.
46
43
  if (!unusedDependencies[dependencyName]) {
47
- isBuiltin(dependencyName) ? warnings.push(messageBuiltin) : warnings.push(message);
44
+ warnings.push(getMissingDepMessage({ dependencyName, displayName, issueType: 'undeclared', packagePath }));
48
45
  }
49
46
  // Make sure to add the package to the list of packages to evaluate.
50
47
  pathsToEvaluate.set(packagePath, importerContext);
51
48
  // Add to includedDependencies
52
49
  const packageSettings = (config.generated.packageSettings ??= []);
53
- let generatedPackageSettings = getPackageSettings({
50
+ let { generatedPackageSettings } = getPackageSettings({
54
51
  config: { generated: { packageSettings } },
55
52
  name: packageName,
56
53
  version: packageVersion,
57
54
  firstMatch: true,
58
- }).generatedPackageSettings;
55
+ });
59
56
  if (!generatedPackageSettings) {
60
- if (isExternalPackage(packagePath)) {
61
- generatedPackageSettings = {
62
- match: { name: packageName, version: `^${packageVersion}` },
63
- };
64
- }
65
- else {
66
- generatedPackageSettings = {
67
- match: packageName,
68
- };
69
- }
57
+ generatedPackageSettings = {
58
+ match: isExternalPackage(packagePath) ? { name: packageName, version: `^${packageVersion}` } : packageName,
59
+ };
70
60
  packageSettings.push(generatedPackageSettings);
71
61
  }
72
62
  generatedPackageSettings.includedDependencies ??= [];
73
63
  // Add to includedDependencies if it is not already included.
74
64
  if (generatedPackageSettings.includedDependencies.includes(dependencyName)) {
65
+ // TODO this seems wrong--it's skipping all further evaluation of the package
75
66
  continue;
76
67
  }
77
68
  generatedPackageSettings.includedDependencies.push(dependencyName);
@@ -160,15 +151,38 @@ export async function evaluateImportsForOverrides(options) {
160
151
  pathsToRefresh.add(dependencyPath);
161
152
  }
162
153
  else {
163
- const errorMessage = `An import couldn't be resolved to a physical file. Check that the import refers to a file that's exported by the package or adjust the "${cyan(dependencyName)}" package version to one that supports this import path.\n${bulletedList([
164
- `Import: ${cyan(dependencyImportPath.replace('.', dependencyName))}`,
165
- `Location: ${packagePath}`,
166
- `Resolved to: ${dependencyName}@${version} (${dependencyImportPath})`,
167
- ], 2)}`;
168
- errors.push(errorMessage);
154
+ const text = `An import couldn't be resolved to a physical file. ` +
155
+ `Check that the import refers to a file that's exported by the package or adjust the "${cyan(dependencyName)}" package version to one that supports this import path.\n${bulletedList([
156
+ `Import: ${cyan(dependencyImportPath.replace('.', dependencyName))}`,
157
+ `Resolved to: ${dependencyName}@${version} (${dependencyImportPath})`,
158
+ ], 2)}`;
159
+ errors.push({
160
+ text,
161
+ source: 'evaluate imports',
162
+ location: { file: packagePath, line: 1, column: 0 },
163
+ });
169
164
  }
170
165
  }
171
166
  }
172
167
  return { exportsChanges, includedDependenciesChanges, errors, warnings, pathsToEvaluate, pathsToRefresh };
173
168
  }
169
+ function getMissingDepMessage(params) {
170
+ const { dependencyName, displayName, issueType, packagePath } = params;
171
+ let text;
172
+ if (isBuiltin(dependencyName)) {
173
+ text =
174
+ `The node built-in "${dependencyName}" is being imported by "${displayName}", ` +
175
+ `but no browser-friendly version was found in the package's dependencies. ` +
176
+ `This can be fixed by forcing "${displayName}" to use "bundlerType": "rollup" in package settings, ` +
177
+ `or by adding a polyfill browser-friendly dependency.`;
178
+ }
179
+ else {
180
+ text = `The package "${dependencyName}" is imported by "${displayName}", but ${issueType === 'not-found' ? "it couldn't be found" : "it's not included in the package's dependencies"}. Please ensure that "${dependencyName}" is listed in the dependencies of "${displayName}"${issueType === 'undeclared' ? ` or add it to "includedDependencies" for "${displayName}" in package settings.` : ''}.`;
181
+ }
182
+ return {
183
+ text,
184
+ source: 'evaluate imports',
185
+ location: { file: path.join(packagePath, 'package.json'), line: 1, column: 0 },
186
+ };
187
+ }
174
188
  //# sourceMappingURL=evaluateImportsForOverrides.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluateImportsForOverrides.js","sourceRoot":"","sources":["../../../src/commands/init/evaluateImportsForOverrides.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BundleInfo } from '@ms-cloudpack/api-server';\nimport type {\n CloudpackConfig,\n PackageDefinitionsCache,\n PackageImporterContext,\n PackageJson,\n PackageSettings,\n} from '@ms-cloudpack/common-types';\nimport { getPackageSettings } from '@ms-cloudpack/config';\nimport type { ResolveMap } from '@ms-cloudpack/package-utilities';\nimport {\n addExportsMapEntry,\n findResolveMapEntry,\n flattenExportsMap,\n getDependencies,\n getUnusedDependencies,\n getExportsMap,\n isExternalPackage,\n} from '@ms-cloudpack/package-utilities';\nimport { bulletedList, cyan } from '@ms-cloudpack/task-reporter';\nimport type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.js';\nimport { isBuiltin } from 'module';\nimport { getConsumedPaths } from '@ms-cloudpack/api-server';\nimport { neverExclude } from './neverExclude.js';\n\n/**\n * Evaluate the imports depended on by a package to determine if missing exports map paths need to be added.\n * If so, updates package overrides in the config.\n */\nexport async function evaluateImportsForOverrides(options: {\n packages: PackageDefinitionsCache;\n info: BundleInfo;\n definition: PackageJson;\n packagePath: string;\n /** Config so far. This will be modified if new overrides are needed. */\n config: CloudpackConfig;\n resolveMap: ResolveMap;\n importerContext: PackageImporterContext | undefined;\n}): Promise<{\n /** Export changes made to the generated config */\n exportsChanges: GeneratedPackageChanges[];\n /** Included dependencies changes made to the generated config */\n includedDependenciesChanges: GeneratedPackageChanges[];\n /** Any errors encountered */\n errors: string[];\n /** Any warnings generated */\n warnings: string[];\n /** Map from new package path (to be evaluated) to info about the parent. */\n pathsToEvaluate: Map<string, PackageImporterContext | undefined>;\n /** Package paths for which new exports were added, so the package should be re-processed. */\n pathsToRefresh: Set<string>;\n}> {\n const { packages, info, definition, packagePath, config, resolveMap, importerContext } = options;\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 exportsChanges: GeneratedPackageChanges[] = [];\n const includedDependenciesChanges: GeneratedPackageChanges[] = [];\n const errors = [];\n const warnings = [];\n const pathsToEvaluate = new Map<string, PackageImporterContext | undefined>();\n const pathsToRefresh = new Set<string>();\n const dependencies = getDependencies(definition);\n const unusedDependencies = getUnusedDependencies(definition);\n const consumedPaths = getConsumedPaths(info);\n\n // Iterate through imports and find their path from the resolve map.\n for (const [dependencyName, dependencyImportPaths] of Object.entries(consumedPaths)) {\n const resolveEntry = findResolveMapEntry({ definition, packageName: dependencyName, resolveMap });\n const dependencyPath = resolveEntry?.path;\n const dependencyDefinition = dependencyPath ? await packages.get(dependencyPath) : undefined;\n\n const message =\n `The package \"${dependencyName}\" couldn't be found, but it's being imported by the package \"${displayName}\". ` +\n `Please ensure that \"${dependencyName}\" is listed in the dependencies of \"${displayName}\".`;\n const messageBuiltin =\n `The node built-in \"${dependencyName}\" is being imported by the package \"${displayName}\", but no browser-friendly version was found in dependencies. ` +\n `This can be fixed by forcing the package \"${displayName}\" to use \"bundlerType\": \"rollup\" in package settings, or by adding a polyfill browser-friendly dependency.`;\n\n // If the dependency is not resolved, add an error.\n if (!dependencyPath || !dependencyDefinition) {\n isBuiltin(dependencyName) ? errors.push(messageBuiltin) : errors.push(message);\n // If the dependency is not resolved, we can't continue to evaluate it.\n continue;\n }\n\n // If the dependency is not listed as a dependency add to includedDependencies.\n if (!dependencies[dependencyName] && dependencyName !== definition.name && !neverExclude(dependencyName, config)) {\n // Survive from the case where it is not a dependency in the package.json\n // and it is resolvable, but warn the user.\n if (!unusedDependencies[dependencyName]) {\n isBuiltin(dependencyName) ? warnings.push(messageBuiltin) : warnings.push(message);\n }\n // Make sure to add the package to the list of packages to evaluate.\n pathsToEvaluate.set(packagePath, importerContext);\n\n // Add to includedDependencies\n const packageSettings = (config.generated.packageSettings ??= []);\n let generatedPackageSettings = getPackageSettings({\n config: { generated: { packageSettings } },\n name: packageName,\n version: packageVersion,\n firstMatch: true,\n }).generatedPackageSettings;\n\n if (!generatedPackageSettings) {\n if (isExternalPackage(packagePath)) {\n generatedPackageSettings = {\n match: { name: packageName, version: `^${packageVersion}` },\n };\n } else {\n generatedPackageSettings = {\n match: packageName,\n };\n }\n packageSettings.push(generatedPackageSettings);\n }\n\n generatedPackageSettings.includedDependencies ??= [];\n\n // Add to includedDependencies if it is not already included.\n if (generatedPackageSettings.includedDependencies.includes(dependencyName)) {\n continue;\n }\n\n generatedPackageSettings.includedDependencies.push(dependencyName);\n\n includedDependenciesChanges.push({\n name: packageName,\n version: packageVersion,\n path: packagePath,\n changes: [\n {\n type: 'included-dependency',\n change: dependencyName,\n reason: `Imported by \"${displayName}\"`,\n },\n ],\n });\n\n pathsToRefresh.add(packagePath);\n }\n\n const { name, version } = dependencyDefinition as Required<PackageJson>;\n if (!name || !version) {\n throw new Error(`Package \"${displayName}\" depends on \"${dependencyName}\" but it is missing a name or version.`);\n }\n\n let dependencyImporterContext: PackageImporterContext | undefined;\n const versionRequirement = dependencies[dependencyName];\n if (versionRequirement && definition.name && definition.version) {\n dependencyImporterContext = {\n parentName: definition.name,\n parentVersion: definition.version,\n importedName: dependencyName,\n versionRequirement,\n };\n }\n\n // Make sure to add the package to the list of packages to evaluate.\n pathsToEvaluate.set(dependencyPath, dependencyImporterContext);\n\n // Get the flattened bundle-able exports map for this dependency and iterate through our import paths to ensure nothing is missing.\n const exports = await getExportsMap({ packagePath: dependencyPath }, { packages, config });\n const flattenedExports = flattenExportsMap(exports);\n const packageSettings = (config.generated.packageSettings ??= []);\n let generatedPackageSettings: PackageSettings | undefined;\n // iterate through all the import paths.\n for (const dependencyImportPath of dependencyImportPaths) {\n if (flattenedExports[dependencyImportPath]) {\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 ??= getPackageSettings({\n config: { generated: { packageSettings } },\n name,\n version,\n firstMatch: true,\n }).generatedPackageSettings;\n\n if (!generatedPackageSettings) {\n if (isExternalPackage(dependencyPath)) {\n generatedPackageSettings = {\n match: { name, version: `^${version}` },\n exports: {},\n };\n } else {\n generatedPackageSettings = {\n match: name,\n exports: {},\n };\n }\n packageSettings.push(generatedPackageSettings);\n }\n\n generatedPackageSettings.exports ??= {};\n\n const addedEntry = await addExportsMapEntry(\n {\n exports: generatedPackageSettings.exports,\n packagePath: dependencyPath,\n importPath: dependencyImportPath,\n },\n { packages, config },\n );\n\n if (addedEntry) {\n exportsChanges.push({\n name: dependencyName,\n version: dependencyDefinition.version || '',\n path: dependencyPath,\n changes: [\n {\n type: 'added-export',\n change: dependencyImportPath,\n reason: `Imported by \"${displayName}\"`,\n },\n ],\n });\n\n // Since we've found a missing export, we need to re-enqueue the dependency for evaluation.\n pathsToRefresh.add(dependencyPath);\n } else {\n const errorMessage = `An import couldn't be resolved to a physical file. Check that the import refers to a file that's exported by the package or adjust the \"${cyan(\n dependencyName,\n )}\" package version to one that supports this import path.\\n${bulletedList(\n [\n `Import: ${cyan(dependencyImportPath.replace('.', dependencyName))}`,\n `Location: ${packagePath}`,\n `Resolved to: ${dependencyName}@${version} (${dependencyImportPath})`,\n ],\n 2,\n )}`;\n errors.push(errorMessage);\n }\n }\n }\n\n return { exportsChanges, includedDependenciesChanges, errors, warnings, pathsToEvaluate, pathsToRefresh };\n}\n"]}
1
+ {"version":3,"file":"evaluateImportsForOverrides.js","sourceRoot":"","sources":["../../../src/commands/init/evaluateImportsForOverrides.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BundleInfo } from '@ms-cloudpack/api-server';\nimport type {\n BundleMessage,\n CloudpackConfig,\n PackageDefinitionsCache,\n PackageImporterContext,\n PackageJson,\n PackageSettings,\n} from '@ms-cloudpack/common-types';\nimport { getPackageSettings } from '@ms-cloudpack/config';\nimport type { ResolveMap } from '@ms-cloudpack/package-utilities';\nimport {\n addExportsMapEntry,\n findResolveMapEntry,\n flattenExportsMap,\n getDependencies,\n getUnusedDependencies,\n getExportsMap,\n isExternalPackage,\n} from '@ms-cloudpack/package-utilities';\nimport { bulletedList, cyan } from '@ms-cloudpack/task-reporter';\nimport type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.js';\nimport { isBuiltin } from 'module';\nimport { getConsumedPaths } from '@ms-cloudpack/api-server';\nimport { neverExclude } from './neverExclude.js';\nimport path from 'path';\n\n/**\n * Evaluate the imports depended on by a package to determine if missing exports map paths need to be added.\n * If so, updates package overrides in the config.\n */\nexport async function evaluateImportsForOverrides(options: {\n packages: PackageDefinitionsCache;\n info: BundleInfo;\n definition: PackageJson;\n packagePath: string;\n /** Config so far. This will be modified if new overrides are needed. */\n config: CloudpackConfig;\n resolveMap: ResolveMap;\n importerContext: PackageImporterContext | undefined;\n}): Promise<{\n /** Export changes made to the generated config */\n exportsChanges: GeneratedPackageChanges[];\n /** Included dependencies changes made to the generated config */\n includedDependenciesChanges: GeneratedPackageChanges[];\n /** Any errors encountered */\n errors: BundleMessage[];\n /** Any warnings generated */\n warnings: BundleMessage[];\n /** Map from new package path (to be evaluated) to info about the parent. */\n pathsToEvaluate: Map<string, PackageImporterContext | undefined>;\n /** Package paths for which new exports were added, so the package should be re-processed. */\n pathsToRefresh: Set<string>;\n}> {\n const { packages, info, definition, packagePath, config, resolveMap, importerContext } = options;\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 exportsChanges: GeneratedPackageChanges[] = [];\n const includedDependenciesChanges: GeneratedPackageChanges[] = [];\n const errors: BundleMessage[] = [];\n const warnings: BundleMessage[] = [];\n const pathsToEvaluate = new Map<string, PackageImporterContext | undefined>();\n const pathsToRefresh = new Set<string>();\n const dependencies = getDependencies(definition);\n const unusedDependencies = getUnusedDependencies(definition);\n const consumedPaths = getConsumedPaths(info);\n\n // Iterate through imports and find their path from the resolve map.\n for (const [dependencyName, dependencyImportPaths] of Object.entries(consumedPaths)) {\n const resolveEntry = findResolveMapEntry({ definition, packageName: dependencyName, resolveMap });\n const dependencyPath = resolveEntry?.path;\n const dependencyDefinition = dependencyPath ? await packages.get(dependencyPath) : undefined;\n\n // If the dependency is not resolved, add an error.\n if (!dependencyPath || !dependencyDefinition) {\n errors.push(getMissingDepMessage({ dependencyName, displayName, issueType: 'not-found', packagePath }));\n // If the dependency is not resolved, we can't continue to evaluate it.\n continue;\n }\n\n // If the dependency is not listed, add to includedDependencies.\n if (!dependencies[dependencyName] && dependencyName !== definition.name && !neverExclude(dependencyName, config)) {\n // Survive from the case where it is not a dependency in the package.json\n // and it is resolvable, but warn the user.\n if (!unusedDependencies[dependencyName]) {\n warnings.push(getMissingDepMessage({ dependencyName, displayName, issueType: 'undeclared', packagePath }));\n }\n // Make sure to add the package to the list of packages to evaluate.\n pathsToEvaluate.set(packagePath, importerContext);\n\n // Add to includedDependencies\n const packageSettings = (config.generated.packageSettings ??= []);\n let { generatedPackageSettings } = getPackageSettings({\n config: { generated: { packageSettings } },\n name: packageName,\n version: packageVersion,\n firstMatch: true,\n });\n\n if (!generatedPackageSettings) {\n generatedPackageSettings = {\n match: isExternalPackage(packagePath) ? { name: packageName, version: `^${packageVersion}` } : packageName,\n };\n packageSettings.push(generatedPackageSettings);\n }\n\n generatedPackageSettings.includedDependencies ??= [];\n\n // Add to includedDependencies if it is not already included.\n if (generatedPackageSettings.includedDependencies.includes(dependencyName)) {\n // TODO this seems wrong--it's skipping all further evaluation of the package\n continue;\n }\n\n generatedPackageSettings.includedDependencies.push(dependencyName);\n\n includedDependenciesChanges.push({\n name: packageName,\n version: packageVersion,\n path: packagePath,\n changes: [\n {\n type: 'included-dependency',\n change: dependencyName,\n reason: `Imported by \"${displayName}\"`,\n },\n ],\n });\n\n pathsToRefresh.add(packagePath);\n }\n\n const { name, version } = dependencyDefinition as Required<PackageJson>;\n if (!name || !version) {\n throw new Error(`Package \"${displayName}\" depends on \"${dependencyName}\" but it is missing a name or version.`);\n }\n\n let dependencyImporterContext: PackageImporterContext | undefined;\n const versionRequirement = dependencies[dependencyName];\n if (versionRequirement && definition.name && definition.version) {\n dependencyImporterContext = {\n parentName: definition.name,\n parentVersion: definition.version,\n importedName: dependencyName,\n versionRequirement,\n };\n }\n\n // Make sure to add the package to the list of packages to evaluate.\n pathsToEvaluate.set(dependencyPath, dependencyImporterContext);\n\n // Get the flattened bundle-able exports map for this dependency and iterate through our import paths to ensure nothing is missing.\n const exports = await getExportsMap({ packagePath: dependencyPath }, { packages, config });\n const flattenedExports = flattenExportsMap(exports);\n const packageSettings = (config.generated.packageSettings ??= []);\n let generatedPackageSettings: PackageSettings | undefined;\n // iterate through all the import paths.\n for (const dependencyImportPath of dependencyImportPaths) {\n if (flattenedExports[dependencyImportPath]) {\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 ??= getPackageSettings({\n config: { generated: { packageSettings } },\n name,\n version,\n firstMatch: true,\n }).generatedPackageSettings;\n\n if (!generatedPackageSettings) {\n if (isExternalPackage(dependencyPath)) {\n generatedPackageSettings = {\n match: { name, version: `^${version}` },\n exports: {},\n };\n } else {\n generatedPackageSettings = {\n match: name,\n exports: {},\n };\n }\n packageSettings.push(generatedPackageSettings);\n }\n\n generatedPackageSettings.exports ??= {};\n\n const addedEntry = await addExportsMapEntry(\n {\n exports: generatedPackageSettings.exports,\n packagePath: dependencyPath,\n importPath: dependencyImportPath,\n },\n { packages, config },\n );\n\n if (addedEntry) {\n exportsChanges.push({\n name: dependencyName,\n version: dependencyDefinition.version || '',\n path: dependencyPath,\n changes: [\n {\n type: 'added-export',\n change: dependencyImportPath,\n reason: `Imported by \"${displayName}\"`,\n },\n ],\n });\n\n // Since we've found a missing export, we need to re-enqueue the dependency for evaluation.\n pathsToRefresh.add(dependencyPath);\n } else {\n const text =\n `An import couldn't be resolved to a physical file. ` +\n `Check that the import refers to a file that's exported by the package or adjust the \"${cyan(\n dependencyName,\n )}\" package version to one that supports this import path.\\n${bulletedList(\n [\n `Import: ${cyan(dependencyImportPath.replace('.', dependencyName))}`,\n `Resolved to: ${dependencyName}@${version} (${dependencyImportPath})`,\n ],\n 2,\n )}`;\n errors.push({\n text,\n source: 'evaluate imports',\n location: { file: packagePath, line: 1, column: 0 },\n });\n }\n }\n }\n\n return { exportsChanges, includedDependenciesChanges, errors, warnings, pathsToEvaluate, pathsToRefresh };\n}\n\nfunction getMissingDepMessage(params: {\n dependencyName: string;\n displayName: string;\n issueType: 'not-found' | 'undeclared';\n packagePath: string;\n}): BundleMessage {\n const { dependencyName, displayName, issueType, packagePath } = params;\n\n let text: string;\n if (isBuiltin(dependencyName)) {\n text =\n `The node built-in \"${dependencyName}\" is being imported by \"${displayName}\", ` +\n `but no browser-friendly version was found in the package's dependencies. ` +\n `This can be fixed by forcing \"${displayName}\" to use \"bundlerType\": \"rollup\" in package settings, ` +\n `or by adding a polyfill browser-friendly dependency.`;\n } else {\n text = `The package \"${dependencyName}\" is imported by \"${displayName}\", but ${\n issueType === 'not-found' ? \"it couldn't be found\" : \"it's not included in the package's dependencies\"\n }. Please ensure that \"${dependencyName}\" is listed in the dependencies of \"${displayName}\"${\n issueType === 'undeclared' ? ` or add it to \"includedDependencies\" for \"${displayName}\" in package settings.` : ''\n }.`;\n }\n\n return {\n text,\n source: 'evaluate imports',\n location: { file: path.join(packagePath, 'package.json'), line: 1, column: 0 },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"evaluatePath.d.ts","sourceRoot":"","sources":["../../../src/commands/init/evaluatePath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1D;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,eAAe,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACpD,wEAAwE;IACxE,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,eAAe,CAAC;IAC7B,GAAG,EAAE,2BAA2B,CAAC;CAClC,GAAG,OAAO,CAAC;IACV,4EAA4E;IAC5E,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAClE,6FAA6F;IAC7F,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC,CAkHD"}
1
+ {"version":3,"file":"evaluatePath.d.ts","sourceRoot":"","sources":["../../../src/commands/init/evaluatePath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1D;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,eAAe,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACpD,wEAAwE;IACxE,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,eAAe,CAAC;IAC7B,GAAG,EAAE,2BAA2B,CAAC;CAClC,GAAG,OAAO,CAAC;IACV,4EAA4E;IAC5E,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAClE,6FAA6F;IAC7F,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC,CAqGD"}
@@ -39,7 +39,7 @@ export async function evaluatePath(options) {
39
39
  };
40
40
  summaryData.recordResult({ packageResult: { ...resultIdentifier, errors, warnings, info } });
41
41
  // If there were errors or no imports, return early.
42
- if (errors?.length || !info?.entry) {
42
+ if (errors?.length || !info) {
43
43
  return {};
44
44
  }
45
45
  // Given the package imports, find the missing exports maps and update packageOverrides.
@@ -54,10 +54,7 @@ export async function evaluatePath(options) {
54
54
  });
55
55
  if (evalErrors.length) {
56
56
  summaryData.recordResult({
57
- packageResult: {
58
- ...resultIdentifier,
59
- errors: evalErrors.map((text) => ({ text, source: 'evaluate imports' })),
60
- },
57
+ packageResult: { ...resultIdentifier, errors: evalErrors },
61
58
  append: true,
62
59
  });
63
60
  }
@@ -68,16 +65,7 @@ export async function evaluatePath(options) {
68
65
  // is both minimal (remove unused deps) and complete (include
69
66
  // specific devDeps.)
70
67
  if (features?.optimizeDependencies) {
71
- const { warnings: excludedDependenciesWarnings, excludedDependenciesChanges } = optimizeDependencies({ definition, packagePath, info, resolveMap }, { packages, config });
72
- if (excludedDependenciesWarnings.length) {
73
- summaryData.recordResult({
74
- packageResult: {
75
- ...resultIdentifier,
76
- warnings: excludedDependenciesWarnings.map((text) => ({ text, source: 'optimize dependencies' })),
77
- },
78
- append: true,
79
- });
80
- }
68
+ const excludedDependenciesChanges = optimizeDependencies({ definition, packagePath, info, resolveMap }, { packages, config });
81
69
  summaryData.recordGeneratedChanges(excludedDependenciesChanges);
82
70
  }
83
71
  // Uncomment this when #1694 init does not cache packages correctly after editing config is fixed
@@ -86,7 +74,7 @@ export async function evaluatePath(options) {
86
74
  // importPathsToRefresh?.forEach((path) => pathsToRefresh.add(path));
87
75
  if (initOptions.check && (exportsChanges.length || evalErrors.length)) {
88
76
  telemetryClient.rootSpan.addEvent('INIT_CHECK_FAILED', {
89
- reason: exportsChanges ? 'Config needs to be updated.' : evalErrors,
77
+ reason: exportsChanges ? 'Config needs to be updated.' : evalErrors.map((e) => e.text),
90
78
  });
91
79
  return { shouldExit: true };
92
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"evaluatePath.js","sourceRoot":"","sources":["../../../src/commands/init/evaluatePath.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EnsurePackageBundledContext } from '@ms-cloudpack/api-server';\nimport type { CloudpackConfig, PackageImporterContext } from '@ms-cloudpack/common-types';\nimport type { ResolveMap } from '@ms-cloudpack/package-utilities';\nimport type { TelemetryClient } from '@ms-cloudpack/telemetry';\nimport type { InitSummaryData } from './InitSummaryData.js';\nimport type { InitOptions } from './types/InitOptions.js';\n\nimport { ensurePackageBundled } from '@ms-cloudpack/api-server';\nimport { evaluateImportsForOverrides } from './evaluateImportsForOverrides.js';\nimport { optimizeDependencies } from './optimizeDependencies.js';\n\n/**\n * A helper which given the packagePath, tries to evaluate the path by bundling things, finding imports,\n * and cross checking the imports with explicit exports. If any exports are missing, they are documented\n * in the generated config.\n */\nexport async function evaluatePath(options: {\n /** Path to evaluate. */\n packagePath: string;\n /** Info about how the parent package */\n importerContext: PackageImporterContext | undefined;\n /** Config so far. This will be modified if new overrides are needed. */\n config: CloudpackConfig;\n resolveMap: ResolveMap;\n telemetryClient: TelemetryClient;\n initOptions: InitOptions;\n summaryData: InitSummaryData;\n ctx: EnsurePackageBundledContext;\n}): Promise<{\n /** Map from new package path (to be evaluated) to info about the parent. */\n pathsToEvaluate?: Map<string, PackageImporterContext | undefined>;\n /** Package paths for which new exports were added, so the package should be re-processed. */\n pathsToRefresh?: Set<string>;\n /** Whether a fatal error was encountered. */\n shouldExit?: boolean;\n}> {\n const { packagePath, config, initOptions, telemetryClient, resolveMap, summaryData, ctx, importerContext } = options;\n const { packages } = ctx;\n const { features } = config;\n\n // This line is the reason we have to track the importerContext for packages to evaluate:\n // otherwise if a non-semver package is read here, we'd lose the modifications from the initial\n // time the package was read (and getNonSemverTransform was called) when building the resolve map.\n const definition = await packages.get(packagePath, { refresh: true, importerContext });\n const { name, version } = definition || {};\n\n if (!definition || !name || !version) {\n // Unsure why a package would be missing a definition/name/version - we've built the resolve map already.\n throw new Error(\n `${packagePath} evaluation failed because the package.json with a name/version was not found or not readable.`,\n );\n }\n\n // Bundle the package and find the imports it depends on.\n const { result } = await ensurePackageBundled({\n input: {\n name,\n version,\n isIncremental: false,\n shouldGetBundleInfo: true,\n useHashAsId: true,\n },\n ctx,\n });\n\n const { errors, warnings, info } = result;\n\n // Record the results for the summary.\n const resultIdentifier = {\n name: definition.name || '',\n version: definition.version || '',\n path: packagePath,\n };\n\n summaryData.recordResult({ packageResult: { ...resultIdentifier, errors, warnings, info } });\n\n // If there were errors or no imports, return early.\n if (errors?.length || !info?.entry) {\n return {};\n }\n\n // Given the package imports, find the missing exports maps and update packageOverrides.\n const {\n exportsChanges,\n includedDependenciesChanges,\n errors: evalErrors,\n pathsToEvaluate,\n pathsToRefresh,\n } = await evaluateImportsForOverrides({\n definition,\n packagePath,\n packages,\n info,\n config,\n resolveMap,\n importerContext,\n });\n\n if (evalErrors.length) {\n summaryData.recordResult({\n packageResult: {\n ...resultIdentifier,\n errors: evalErrors.map((text) => ({ text, source: 'evaluate imports' })),\n },\n append: true,\n });\n }\n summaryData.recordGeneratedChanges(exportsChanges);\n summaryData.recordGeneratedChanges(includedDependenciesChanges);\n\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 if (features?.optimizeDependencies) {\n const { warnings: excludedDependenciesWarnings, excludedDependenciesChanges } = optimizeDependencies(\n { definition, packagePath, info, resolveMap },\n { packages, config },\n );\n\n if (excludedDependenciesWarnings.length) {\n summaryData.recordResult({\n packageResult: {\n ...resultIdentifier,\n warnings: excludedDependenciesWarnings.map((text) => ({ text, source: 'optimize dependencies' })),\n },\n append: true,\n });\n }\n summaryData.recordGeneratedChanges(excludedDependenciesChanges);\n }\n\n // Uncomment this when #1694 init does not cache packages correctly after editing config is fixed\n // and the heap does not reach the limit as almost every package is enqueued.\n // importPathsToEvaluate?.forEach((path) => pathsToEvaluate.set(path, importerContext));\n // importPathsToRefresh?.forEach((path) => pathsToRefresh.add(path));\n\n if (initOptions.check && (exportsChanges.length || evalErrors.length)) {\n telemetryClient.rootSpan.addEvent('INIT_CHECK_FAILED', {\n reason: exportsChanges ? 'Config needs to be updated.' : evalErrors,\n });\n\n return { shouldExit: true };\n }\n\n return {\n pathsToEvaluate,\n pathsToRefresh,\n };\n}\n"]}
1
+ {"version":3,"file":"evaluatePath.js","sourceRoot":"","sources":["../../../src/commands/init/evaluatePath.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EnsurePackageBundledContext } from '@ms-cloudpack/api-server';\nimport type { CloudpackConfig, PackageImporterContext } from '@ms-cloudpack/common-types';\nimport type { ResolveMap } from '@ms-cloudpack/package-utilities';\nimport type { TelemetryClient } from '@ms-cloudpack/telemetry';\nimport type { InitSummaryData } from './InitSummaryData.js';\nimport type { InitOptions } from './types/InitOptions.js';\n\nimport { ensurePackageBundled } from '@ms-cloudpack/api-server';\nimport { evaluateImportsForOverrides } from './evaluateImportsForOverrides.js';\nimport { optimizeDependencies } from './optimizeDependencies.js';\n\n/**\n * A helper which given the packagePath, tries to evaluate the path by bundling things, finding imports,\n * and cross checking the imports with explicit exports. If any exports are missing, they are documented\n * in the generated config.\n */\nexport async function evaluatePath(options: {\n /** Path to evaluate. */\n packagePath: string;\n /** Info about how the parent package */\n importerContext: PackageImporterContext | undefined;\n /** Config so far. This will be modified if new overrides are needed. */\n config: CloudpackConfig;\n resolveMap: ResolveMap;\n telemetryClient: TelemetryClient;\n initOptions: InitOptions;\n summaryData: InitSummaryData;\n ctx: EnsurePackageBundledContext;\n}): Promise<{\n /** Map from new package path (to be evaluated) to info about the parent. */\n pathsToEvaluate?: Map<string, PackageImporterContext | undefined>;\n /** Package paths for which new exports were added, so the package should be re-processed. */\n pathsToRefresh?: Set<string>;\n /** Whether a fatal error was encountered. */\n shouldExit?: boolean;\n}> {\n const { packagePath, config, initOptions, telemetryClient, resolveMap, summaryData, ctx, importerContext } = options;\n const { packages } = ctx;\n const { features } = config;\n\n // This line is the reason we have to track the importerContext for packages to evaluate:\n // otherwise if a non-semver package is read here, we'd lose the modifications from the initial\n // time the package was read (and getNonSemverTransform was called) when building the resolve map.\n const definition = await packages.get(packagePath, { refresh: true, importerContext });\n const { name, version } = definition || {};\n\n if (!definition || !name || !version) {\n // Unsure why a package would be missing a definition/name/version - we've built the resolve map already.\n throw new Error(\n `${packagePath} evaluation failed because the package.json with a name/version was not found or not readable.`,\n );\n }\n\n // Bundle the package and find the imports it depends on.\n const { result } = await ensurePackageBundled({\n input: {\n name,\n version,\n isIncremental: false,\n shouldGetBundleInfo: true,\n useHashAsId: true,\n },\n ctx,\n });\n\n const { errors, warnings, info } = result;\n\n // Record the results for the summary.\n const resultIdentifier = {\n name: definition.name || '',\n version: definition.version || '',\n path: packagePath,\n };\n\n summaryData.recordResult({ packageResult: { ...resultIdentifier, errors, warnings, info } });\n\n // If there were errors or no imports, return early.\n if (errors?.length || !info) {\n return {};\n }\n\n // Given the package imports, find the missing exports maps and update packageOverrides.\n const {\n exportsChanges,\n includedDependenciesChanges,\n errors: evalErrors,\n pathsToEvaluate,\n pathsToRefresh,\n } = await evaluateImportsForOverrides({\n definition,\n packagePath,\n packages,\n info,\n config,\n resolveMap,\n importerContext,\n });\n\n if (evalErrors.length) {\n summaryData.recordResult({\n packageResult: { ...resultIdentifier, errors: evalErrors },\n append: true,\n });\n }\n summaryData.recordGeneratedChanges(exportsChanges);\n summaryData.recordGeneratedChanges(includedDependenciesChanges);\n\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 if (features?.optimizeDependencies) {\n const excludedDependenciesChanges = optimizeDependencies(\n { definition, packagePath, info, resolveMap },\n { packages, config },\n );\n summaryData.recordGeneratedChanges(excludedDependenciesChanges);\n }\n\n // Uncomment this when #1694 init does not cache packages correctly after editing config is fixed\n // and the heap does not reach the limit as almost every package is enqueued.\n // importPathsToEvaluate?.forEach((path) => pathsToEvaluate.set(path, importerContext));\n // importPathsToRefresh?.forEach((path) => pathsToRefresh.add(path));\n\n if (initOptions.check && (exportsChanges.length || evalErrors.length)) {\n telemetryClient.rootSpan.addEvent('INIT_CHECK_FAILED', {\n reason: exportsChanges ? 'Config needs to be updated.' : evalErrors.map((e) => e.text),\n });\n\n return { shouldExit: true };\n }\n\n return {\n pathsToEvaluate,\n pathsToRefresh,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"formatInitSummary.d.ts","sourceRoot":"","sources":["../../../src/commands/init/formatInitSummary.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,UA+GpH"}
1
+ {"version":3,"file":"formatInitSummary.d.ts","sourceRoot":"","sources":["../../../src/commands/init/formatInitSummary.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,UAoHpH"}
@@ -1,5 +1,5 @@
1
1
  import { bold, bulletedList, cyan, green, lightCyan, plural, red, yellow, formatTime, statusCharacter, } from '@ms-cloudpack/task-reporter';
2
- import path from 'path';
2
+ import { formatLocation } from '@ms-cloudpack/path-utilities';
3
3
  /**
4
4
  * Given an init summary and init options, returns a formatted string message to display to the user via console.
5
5
  */
@@ -8,7 +8,7 @@ export function formatInitSummary(params) {
8
8
  const summaryString = [];
9
9
  const isMultiApp = summaries.length > 1;
10
10
  for (const summary of summaries) {
11
- const { totalPackages, totalErrors, totalWarnings, totalRequiredChanges, packagesWithErrors, packagesWithWarnings, generatedFileUpdates, } = summary;
11
+ const { totalPackages, totalErrors, totalWarnings, totalChanges, totalRequiredChanges, packagesWithErrors, packagesWithWarnings, generatedFileUpdates, } = summary;
12
12
  const { check } = options;
13
13
  const incompleteText = isInterrupted ? bold(` (incomplete)`) : ``;
14
14
  // Report the "Summary" title if no errors or warnings are listed (seems redundant otherwise.
@@ -16,8 +16,11 @@ export function formatInitSummary(params) {
16
16
  summaryString.push(bold(`==== Summary for ${summary.appPath}${incompleteText} ====`));
17
17
  }
18
18
  if (!isMultiApp) {
19
+ // If there are required changes, updates will be "made" or "needed" with check,
20
+ // else if the changes are not required, only report work done when updates are "made" (check is disabled).
21
+ const updatesRequired = totalRequiredChanges || (totalChanges && !check);
19
22
  // Report work done to the generated file.
20
- if (!packagesWithErrors.length && generatedFileUpdates.length) {
23
+ if (!packagesWithErrors.length && updatesRequired) {
21
24
  summaryString.push(`Updates ${check || isInterrupted ? 'needed for' : 'made to'} ${cyan(`cloudpack.generated.json`)}:\n`);
22
25
  for (const packageUpdates of generatedFileUpdates) {
23
26
  const exportsUpdates = packageUpdates.changes.filter((u) => u.type === 'added-export');
@@ -73,19 +76,11 @@ function formatBundleMessages(result, formatErrors) {
73
76
  const unformattedMessages = (formatErrors ? result.errors : result.warnings) || [];
74
77
  for (const message of unformattedMessages) {
75
78
  const { location, text, source } = message;
76
- const prefix = `${formatErrors ? red('Error') : yellow('Warning')} [${source}]`;
77
- if (!location?.file) {
78
- messages.push(`${prefix}: ${text}`);
79
- }
80
- else {
81
- // Show the whole path so it can be easily opened with ctrl+click.
82
- // NOTE: location.file should be relative to the package path, not the app path.
83
- const filePath = path.resolve(result.path, location.file);
84
- const characterLocation = location.line !== undefined && location.column !== undefined
85
- ? yellow(`:${location.line}:${location.column}`)
86
- : ``;
87
- messages.push(`${prefix}: ${filePath}${characterLocation} - ${text}`);
88
- }
79
+ const issueType = formatErrors ? red('Error') : yellow('Warning');
80
+ // Show the whole path so it can be easily opened with ctrl+click.
81
+ // NOTE: location.file should be relative to the package path, not the app path.
82
+ const filePath = location ? ` - ${formatLocation({ ...location, fromPath: result.path })} -` : '';
83
+ messages.push(`${issueType} [${source}]:${filePath} ${text}`);
89
84
  }
90
85
  return messages.length ? bulletedList(messages) : undefined;
91
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"formatInitSummary.js","sourceRoot":"","sources":["../../../src/commands/init/formatInitSummary.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,SAAS,EACT,MAAM,EACN,GAAG,EACH,MAAM,EACN,UAAU,EACV,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AAMxB;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmF;IACnH,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IACrD,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAExC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,EACJ,aAAa,EACb,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,GAAG,OAAO,CAAC;QACZ,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAC1B,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAElE,6FAA6F;QAC7F,IAAI,CAAC,CAAC,kBAAkB,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC/E,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,OAAO,GAAG,cAAc,OAAO,CAAC,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,0CAA0C;YAC1C,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,oBAAoB,CAAC,MAAM,EAAE,CAAC;gBAC9D,aAAa,CAAC,IAAI,CAChB,WAAW,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,0BAA0B,CAAC,KAAK,CACtG,CAAC;gBAEF,KAAK,MAAM,cAAc,IAAI,oBAAoB,EAAE,CAAC;oBAClD,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;oBAEvF,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;wBAC1B,aAAa,CAAC,IAAI,CAChB,GAAG,iBAAiB,CAAC,cAAc,CAAC,MAAM,MAAM,CAC9C,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CACtC,2BAA2B,CAC7B,CAAC;wBACF,aAAa,CAAC,IAAI,CAChB,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAC/F,EAAE,CACH,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,iCAAiC;YACjC,IAAI,oBAAoB,CAAC,MAAM,EAAE,CAAC;gBAChC,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACtG,IAAI,YAAY,GAAG,CAAC,CAAC;gBAErB,KAAK,MAAM,mBAAmB,IAAI,oBAAoB,EAAE,CAAC;oBACvD,aAAa,CAAC,IAAI,CAChB,GAAG,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,IAAI,YAAY,EAAE,GAAG,CAAC,IAAI,iBAAiB,CAAC,mBAAmB,CAAC,MAAM,MAAM,CAC3G,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CACvD,KAAK,mBAAmB,CAAC,IAAI,GAAG,CAClC,CAAC;oBACF,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,mBAAwC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC9B,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC1F,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,iBAAiB,IAAI,kBAAkB,EAAE,CAAC;gBACnD,aAAa,CAAC,IAAI,CAChB,GAAG,GAAG,CAAC,GAAG,eAAe,CAAC,IAAI,IAAI,YAAY,EAAE,GAAG,CAAC,IAAI,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CACnG,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACjD,KAAK,iBAAiB,CAAC,IAAI,GAAG,CAChC,CAAC;gBACF,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,iBAAsC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,MAAM,IAAI,CAAC,CAAC;QAC1D,MAAM,eAAe,GAAG,CAAC,KAAK,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAE7D,eAAe;QACf,aAAa,CAAC,IAAI,CAChB,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,iBAAiB,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,cAAc,GAAG,EAChH,YAAY,CACV;YACE,eAAe,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YACvF,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,GAAG,kBAAkB,EAAE,SAAS,CAAC,CAAC,sBAC7D,oBAAoB,CAAC,MAAM;gBACzB,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,iBAAiB;gBAC9E,CAAC,CAAC,EACN,EAAE;YACF,kBAAkB,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;YAChG,WAAW,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE;SACtJ,CAAC,MAAM,CAAC,OAAO,CAAC,CAClB,CACF,CAAC;QAEF,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC,CAAC;QACnG,CAAC;aAAM,IAAI,eAAe,EAAE,CAAC;YAC3B,aAAa,CAAC,IAAI,CAChB,QAAQ,MAAM,CAAC,gBAAgB,CAAC,wDAAwD,IAAI,CAC1F,0BAA0B,CAC3B,QAAQ,CACV,CAAC;QACJ,CAAC;QAED,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,wCAAwC;AACxC,SAAS,oBAAoB,CAAC,MAAyB,EAAE,YAAqB;IAC5E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,mBAAmB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnF,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC3C,MAAM,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,GAAG,CAAC;QAEhF,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,kEAAkE;YAClE,gFAAgF;YAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,iBAAiB,GACrB,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;gBAC1D,CAAC,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAChD,CAAC,CAAC,EAAE,CAAC;YAET,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,QAAQ,GAAG,iBAAiB,MAAM,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9D,CAAC;AAED,sCAAsC;AACtC,SAAS,iBAAiB,CAAC,iBAAwC;IACjE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC;IAE5C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC","sourcesContent":["import {\n bold,\n bulletedList,\n cyan,\n green,\n lightCyan,\n plural,\n red,\n yellow,\n formatTime,\n statusCharacter,\n} from '@ms-cloudpack/task-reporter';\nimport path from 'path';\nimport type { InitOptions } from './types/InitOptions.js';\nimport type { InitPackageIdentifier } from './types/InitPackageIdentifier.js';\nimport type { InitPackageResult } from './types/InitPackageResult.js';\nimport type { InitSummary } from './types/InitSummary.js';\n\n/**\n * Given an init summary and init options, returns a formatted string message to display to the user via console.\n */\nexport function formatInitSummary(params: { summaries: InitSummary[]; options: InitOptions; isInterrupted?: boolean }) {\n const { summaries, options, isInterrupted } = params;\n const summaryString: (string | undefined)[] = [];\n const isMultiApp = summaries.length > 1;\n\n for (const summary of summaries) {\n const {\n totalPackages,\n totalErrors,\n totalWarnings,\n totalRequiredChanges,\n packagesWithErrors,\n packagesWithWarnings,\n generatedFileUpdates,\n } = summary;\n const { check } = options;\n const incompleteText = isInterrupted ? bold(` (incomplete)`) : ``;\n\n // Report the \"Summary\" title if no errors or warnings are listed (seems redundant otherwise.\n if ((!packagesWithErrors.length && !packagesWithWarnings.length) || isMultiApp) {\n summaryString.push(bold(`==== Summary for ${summary.appPath}${incompleteText} ====`));\n }\n\n if (!isMultiApp) {\n // Report work done to the generated file.\n if (!packagesWithErrors.length && generatedFileUpdates.length) {\n summaryString.push(\n `Updates ${check || isInterrupted ? 'needed for' : 'made to'} ${cyan(`cloudpack.generated.json`)}:\\n`,\n );\n\n for (const packageUpdates of generatedFileUpdates) {\n const exportsUpdates = packageUpdates.changes.filter((u) => u.type === 'added-export');\n\n if (exportsUpdates.length) {\n summaryString.push(\n `${formatPackageName(packageUpdates)} - ${yellow(\n plural(exportsUpdates.length, 'path'),\n )} missing from exports map`,\n );\n summaryString.push(\n bulletedList(exportsUpdates.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ``}`)),\n '',\n );\n }\n }\n }\n\n // Report packages with warnings.\n if (packagesWithWarnings.length) {\n summaryString.push(`${plural(packagesWithWarnings.length, 'package')} with ${yellow('warnings')}:\\n`);\n let currentCount = 1;\n\n for (const packageWithWarnings of packagesWithWarnings) {\n summaryString.push(\n `${yellow(`${statusCharacter.warn} ${currentCount++}.`)} ${formatPackageName(packageWithWarnings)} - ${yellow(\n plural(packageWithWarnings.warnings.length, 'warning'),\n )}, ${packageWithWarnings.path}:`,\n );\n summaryString.push(formatBundleMessages(packageWithWarnings as InitPackageResult, false), '');\n }\n }\n }\n\n // Report packages with errors.\n if (packagesWithErrors.length) {\n summaryString.push(`${plural(packagesWithErrors.length, 'package')} ${red('failed')}:\\n`);\n let currentCount = 1;\n for (const packageWithErrors of packagesWithErrors) {\n summaryString.push(\n `${red(`${statusCharacter.fail} ${currentCount++}.`)} ${formatPackageName(packageWithErrors)} - ${red(\n plural(packageWithErrors.errors.length, 'error'),\n )}, ${packageWithErrors.path}:`,\n );\n summaryString.push(formatBundleMessages(packageWithErrors as InitPackageResult, true), '');\n }\n }\n\n const blockingIssueCount = packagesWithErrors.length || 0;\n const requiresChanges = (check && totalRequiredChanges) || 0;\n\n // Add summary.\n summaryString.push(\n `${cyan(plural(totalPackages, 'total package'))} evaluated in ${formatTime(summary.duration)}${incompleteText}:`,\n bulletedList(\n [\n requiresChanges ? `${red(plural(totalRequiredChanges, 'change'))} required` : undefined,\n `${green(plural(totalPackages - blockingIssueCount, 'package'))} built successfully${\n packagesWithWarnings.length\n ? ` (${yellow(plural(packagesWithWarnings.length, 'package'))} with warnings)`\n : ''\n }`,\n blockingIssueCount ? `${red(plural(blockingIssueCount, 'package'))} failed to build` : undefined,\n `Totals: ${totalErrors ? red(plural(totalErrors, 'error')) : '0 errors'}, ${totalWarnings ? yellow(plural(totalWarnings, 'warning')) : '0 warnings'}`,\n ].filter(Boolean),\n ),\n );\n\n if (isInterrupted) {\n summaryString.push('', yellow(bold('Process was interrupted before all tasks could complete.')));\n } else if (requiresChanges) {\n summaryString.push(\n `Run \"${yellow('cloudpack init')}\" in your application folder to apply changes to the ${cyan(\n 'cloudpack.generated.json',\n )} file.`,\n );\n }\n\n summaryString.push('\\n');\n }\n\n return summaryString.filter((a) => a !== undefined).join('\\n');\n}\n\n/** Helper to format bundle messages. */\nfunction formatBundleMessages(result: InitPackageResult, formatErrors: boolean) {\n const messages: string[] = [];\n const unformattedMessages = (formatErrors ? result.errors : result.warnings) || [];\n\n for (const message of unformattedMessages) {\n const { location, text, source } = message;\n const prefix = `${formatErrors ? red('Error') : yellow('Warning')} [${source}]`;\n\n if (!location?.file) {\n messages.push(`${prefix}: ${text}`);\n } else {\n // Show the whole path so it can be easily opened with ctrl+click.\n // NOTE: location.file should be relative to the package path, not the app path.\n const filePath = path.resolve(result.path, location.file);\n const characterLocation =\n location.line !== undefined && location.column !== undefined\n ? yellow(`:${location.line}:${location.column}`)\n : ``;\n\n messages.push(`${prefix}: ${filePath}${characterLocation} - ${text}`);\n }\n }\n\n return messages.length ? bulletedList(messages) : undefined;\n}\n\n/** Helper to format package names. */\nfunction formatPackageName(packageIdentifier: InitPackageIdentifier) {\n const { name, version } = packageIdentifier;\n\n return bold(lightCyan(`${name}@${version || `<no-version>`}`));\n}\n"]}
1
+ {"version":3,"file":"formatInitSummary.js","sourceRoot":"","sources":["../../../src/commands/init/formatInitSummary.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n bold,\n bulletedList,\n cyan,\n green,\n lightCyan,\n plural,\n red,\n yellow,\n formatTime,\n statusCharacter,\n} from '@ms-cloudpack/task-reporter';\nimport type { InitOptions } from './types/InitOptions.js';\nimport type { InitPackageIdentifier } from './types/InitPackageIdentifier.js';\nimport type { InitPackageResult } from './types/InitPackageResult.js';\nimport type { InitSummary } from './types/InitSummary.js';\nimport { formatLocation } from '@ms-cloudpack/path-utilities';\n\n/**\n * Given an init summary and init options, returns a formatted string message to display to the user via console.\n */\nexport function formatInitSummary(params: { summaries: InitSummary[]; options: InitOptions; isInterrupted?: boolean }) {\n const { summaries, options, isInterrupted } = params;\n const summaryString: (string | undefined)[] = [];\n const isMultiApp = summaries.length > 1;\n\n for (const summary of summaries) {\n const {\n totalPackages,\n totalErrors,\n totalWarnings,\n totalChanges,\n totalRequiredChanges,\n packagesWithErrors,\n packagesWithWarnings,\n generatedFileUpdates,\n } = summary;\n const { check } = options;\n const incompleteText = isInterrupted ? bold(` (incomplete)`) : ``;\n\n // Report the \"Summary\" title if no errors or warnings are listed (seems redundant otherwise.\n if ((!packagesWithErrors.length && !packagesWithWarnings.length) || isMultiApp) {\n summaryString.push(bold(`==== Summary for ${summary.appPath}${incompleteText} ====`));\n }\n\n if (!isMultiApp) {\n // If there are required changes, updates will be \"made\" or \"needed\" with check,\n // else if the changes are not required, only report work done when updates are \"made\" (check is disabled).\n const updatesRequired = totalRequiredChanges || (totalChanges && !check);\n\n // Report work done to the generated file.\n if (!packagesWithErrors.length && updatesRequired) {\n summaryString.push(\n `Updates ${check || isInterrupted ? 'needed for' : 'made to'} ${cyan(`cloudpack.generated.json`)}:\\n`,\n );\n\n for (const packageUpdates of generatedFileUpdates) {\n const exportsUpdates = packageUpdates.changes.filter((u) => u.type === 'added-export');\n\n if (exportsUpdates.length) {\n summaryString.push(\n `${formatPackageName(packageUpdates)} - ${yellow(\n plural(exportsUpdates.length, 'path'),\n )} missing from exports map`,\n );\n summaryString.push(\n bulletedList(exportsUpdates.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ``}`)),\n '',\n );\n }\n }\n }\n\n // Report packages with warnings.\n if (packagesWithWarnings.length) {\n summaryString.push(`${plural(packagesWithWarnings.length, 'package')} with ${yellow('warnings')}:\\n`);\n let currentCount = 1;\n\n for (const packageWithWarnings of packagesWithWarnings) {\n summaryString.push(\n `${yellow(`${statusCharacter.warn} ${currentCount++}.`)} ${formatPackageName(packageWithWarnings)} - ${yellow(\n plural(packageWithWarnings.warnings.length, 'warning'),\n )}, ${packageWithWarnings.path}:`,\n );\n summaryString.push(formatBundleMessages(packageWithWarnings as InitPackageResult, false), '');\n }\n }\n }\n\n // Report packages with errors.\n if (packagesWithErrors.length) {\n summaryString.push(`${plural(packagesWithErrors.length, 'package')} ${red('failed')}:\\n`);\n let currentCount = 1;\n for (const packageWithErrors of packagesWithErrors) {\n summaryString.push(\n `${red(`${statusCharacter.fail} ${currentCount++}.`)} ${formatPackageName(packageWithErrors)} - ${red(\n plural(packageWithErrors.errors.length, 'error'),\n )}, ${packageWithErrors.path}:`,\n );\n summaryString.push(formatBundleMessages(packageWithErrors as InitPackageResult, true), '');\n }\n }\n\n const blockingIssueCount = packagesWithErrors.length || 0;\n const requiresChanges = (check && totalRequiredChanges) || 0;\n\n // Add summary.\n summaryString.push(\n `${cyan(plural(totalPackages, 'total package'))} evaluated in ${formatTime(summary.duration)}${incompleteText}:`,\n bulletedList(\n [\n requiresChanges ? `${red(plural(totalRequiredChanges, 'change'))} required` : undefined,\n `${green(plural(totalPackages - blockingIssueCount, 'package'))} built successfully${\n packagesWithWarnings.length\n ? ` (${yellow(plural(packagesWithWarnings.length, 'package'))} with warnings)`\n : ''\n }`,\n blockingIssueCount ? `${red(plural(blockingIssueCount, 'package'))} failed to build` : undefined,\n `Totals: ${totalErrors ? red(plural(totalErrors, 'error')) : '0 errors'}, ${totalWarnings ? yellow(plural(totalWarnings, 'warning')) : '0 warnings'}`,\n ].filter(Boolean),\n ),\n );\n\n if (isInterrupted) {\n summaryString.push('', yellow(bold('Process was interrupted before all tasks could complete.')));\n } else if (requiresChanges) {\n summaryString.push(\n `Run \"${yellow('cloudpack init')}\" in your application folder to apply changes to the ${cyan(\n 'cloudpack.generated.json',\n )} file.`,\n );\n }\n\n summaryString.push('\\n');\n }\n\n return summaryString.filter((a) => a !== undefined).join('\\n');\n}\n\n/** Helper to format bundle messages. */\nfunction formatBundleMessages(result: InitPackageResult, formatErrors: boolean) {\n const messages: string[] = [];\n const unformattedMessages = (formatErrors ? result.errors : result.warnings) || [];\n\n for (const message of unformattedMessages) {\n const { location, text, source } = message;\n const issueType = formatErrors ? red('Error') : yellow('Warning');\n\n // Show the whole path so it can be easily opened with ctrl+click.\n // NOTE: location.file should be relative to the package path, not the app path.\n const filePath = location ? ` - ${formatLocation({ ...location, fromPath: result.path })} -` : '';\n messages.push(`${issueType} [${source}]:${filePath} ${text}`);\n }\n\n return messages.length ? bulletedList(messages) : undefined;\n}\n\n/** Helper to format package names. */\nfunction formatPackageName(packageIdentifier: InitPackageIdentifier) {\n const { name, version } = packageIdentifier;\n\n return bold(lightCyan(`${name}@${version || `<no-version>`}`));\n}\n"]}
@@ -5,6 +5,8 @@ import type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.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.
8
+ *
9
+ * Returns the list of excluded dependencies added to the generated config.
8
10
  */
9
11
  export declare function optimizeDependencies(options: {
10
12
  info: BundleInfo;
@@ -14,14 +16,5 @@ export declare function optimizeDependencies(options: {
14
16
  }, context: {
15
17
  packages: PackageDefinitionsCache;
16
18
  config: CloudpackConfig;
17
- }): {
18
- /** Excluded dependencies changes made to the generated config */
19
- excludedDependenciesChanges: GeneratedPackageChanges[];
20
- /** Any warnings encountered */
21
- warnings: string[];
22
- /** Set from new package path (to be evaluated) to info about the parent. */
23
- pathsToEvaluate: Set<string>;
24
- /** Package paths for which dependencies where included or excluded, so the package should be re-processed. */
25
- pathsToRefresh: Set<string>;
26
- };
19
+ }): GeneratedPackageChanges[];
27
20
  //# sourceMappingURL=optimizeDependencies.d.ts.map
@@ -1 +1 @@
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,eAAe,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACxG,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
+ {"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,eAAe,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACxG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAGlF;;;;;GAKG;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,uBAAuB,EAAE,CAkE3B"}
@@ -5,15 +5,14 @@ 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.
8
+ *
9
+ * Returns the list of excluded dependencies added to the generated config.
8
10
  */
9
11
  export function optimizeDependencies(options, context) {
10
12
  const { info, definition, packagePath } = options;
11
13
  const { config } = context;
12
14
  const displayName = `${definition.name}@${definition.version}`;
13
15
  const excludedDependenciesChanges = [];
14
- const warnings = [];
15
- const pathsToEvaluate = new Set();
16
- const pathsToRefresh = new Set();
17
16
  const { name, version } = definition;
18
17
  if (!name || !version) {
19
18
  throw new Error(`Package "${displayName}" is missing a name or version.`);
@@ -25,7 +24,6 @@ export function optimizeDependencies(options, context) {
25
24
  if (consumedDependencies.has(dependencyName) || neverExclude(dependencyName, config)) {
26
25
  continue;
27
26
  }
28
- pathsToEvaluate.add(packagePath);
29
27
  // Add to excludedDependencies
30
28
  const packageSettings = (config.generated.packageSettings ??= []);
31
29
  let generatedPackageSettings = getPackageSettings({
@@ -65,8 +63,7 @@ export function optimizeDependencies(options, context) {
65
63
  },
66
64
  ],
67
65
  });
68
- pathsToRefresh.add(packagePath);
69
66
  }
70
- return { warnings, excludedDependenciesChanges, pathsToEvaluate, pathsToRefresh };
67
+ return excludedDependenciesChanges;
71
68
  }
72
69
  //# 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, isExternalPackage, type ResolveMap } from '@ms-cloudpack/package-utilities';\nimport { getConsumedDependencies, type BundleInfo } from '@ms-cloudpack/api-server';\nimport type { CloudpackConfig, PackageDefinitionsCache, PackageJson } from '@ms-cloudpack/common-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"]}
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;AAGpF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAKC,EACD,OAGC;IAED,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;IAElE,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,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;IACL,CAAC;IAED,OAAO,2BAA2B,CAAC;AACrC,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 { CloudpackConfig, PackageDefinitionsCache, PackageJson } from '@ms-cloudpack/common-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 *\n * Returns the list of excluded dependencies added to the generated config.\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): GeneratedPackageChanges[] {\n const { info, definition, packagePath } = options;\n const { config } = context;\n const displayName = `${definition.name}@${definition.version}`;\n const excludedDependenciesChanges: GeneratedPackageChanges[] = [];\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 // 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\n return excludedDependenciesChanges;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  export interface InitPackageIdentifier {
2
2
  name: string;
3
3
  version: string;
4
+ /** Absolute path to the package */
4
5
  path: string;
5
6
  }
6
7
  //# sourceMappingURL=InitPackageIdentifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InitPackageIdentifier.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitPackageIdentifier.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd"}
1
+ {"version":3,"file":"InitPackageIdentifier.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitPackageIdentifier.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -1 +1 @@
1
- {"version":3,"file":"InitPackageIdentifier.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitPackageIdentifier.ts"],"names":[],"mappings":"","sourcesContent":["export interface InitPackageIdentifier {\n name: string;\n version: string;\n path: string;\n}\n"]}
1
+ {"version":3,"file":"InitPackageIdentifier.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitPackageIdentifier.ts"],"names":[],"mappings":"","sourcesContent":["export interface InitPackageIdentifier {\n name: string;\n version: string;\n /** Absolute path to the package */\n path: string;\n}\n"]}
@@ -1,6 +1,6 @@
1
- import type { InitPackageResult } from './types/InitPackageResult.js';
1
+ import type { Session } from '@ms-cloudpack/api-server';
2
2
  import type { PackageDefinitionsCache } from '@ms-cloudpack/common-types';
3
- import type { Session } from '@ms-cloudpack//api-server';
3
+ import type { InitPackageResult } from './types/InitPackageResult.js';
4
4
  /**
5
5
  * Checks that the imports/exports of packages match.
6
6
  * To be called before `summarize`.
@@ -1 +1 @@
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,4BAA4B,CAAC;AAC1E,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,CAoH9B"}
1
+ {"version":3,"file":"verifyExports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE;;;;;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,CAgG9B"}
@@ -1,6 +1,6 @@
1
1
  import { findResolveMapEntry, flattenExportsMap, getExportsMap } from '@ms-cloudpack/package-utilities';
2
- import { bulletedList } from '@ms-cloudpack/task-reporter';
3
2
  import path from 'path';
3
+ import { bulletedList } from '@ms-cloudpack/task-reporter';
4
4
  /**
5
5
  * Checks that the imports/exports of packages match.
6
6
  * To be called before `summarize`.
@@ -13,100 +13,76 @@ export async function verifyExports(packageResults, context) {
13
13
  const allErrors = [];
14
14
  const packageResultsArray = Object.values(packageResults);
15
15
  // Iterate through each package
16
- for (const packagePath in packageResults) {
17
- const result = packageResults[packagePath];
18
- // Skip packages with errors
19
- if (!result || result.errors?.length) {
20
- continue;
21
- }
22
- const { info, name, version } = result;
23
- const definition = {
24
- name,
25
- version,
26
- path: packagePath,
27
- };
28
- const packageError = {
29
- ...definition,
30
- };
31
- // Makes sure that the errors array is initialized and typescript happy.
32
- packageError.errors = [];
33
- const missingExportsErrors = {};
34
- // Skip packages with no info
35
- if (!info?.entry) {
16
+ for (const [parentPath, parentResult] of Object.entries(packageResults)) {
17
+ // Skip packages with build errors or no info
18
+ if (!parentResult?.info || parentResult.errors?.length) {
36
19
  continue;
37
20
  }
38
- // Iterate through each entry
39
- for (const [exportsEntry, required] of Object.entries(info.entry)) {
40
- const { consumes } = required;
21
+ /**
22
+ * Mapping from imported dependency package ID (`name@version`) to import path
23
+ * to export names missing from that file.
24
+ */
25
+ const depsMissingExports = {};
26
+ // Iterate through each entry path from the parent package
27
+ for (const { consumes } of Object.values(parentResult.info)) {
41
28
  // Skip entries with no imports
42
29
  if (!consumes?.length) {
43
30
  continue;
44
31
  }
45
32
  // Iterate through each imported package
46
- for (const { packageName, importPath, names } of consumes) {
47
- const entry = findResolveMapEntry({ packageName, definition, resolveMap });
48
- // Skip if we can't find the imported package in the resolve map
49
- if (!entry) {
33
+ for (const { packageName: depName, importPath: depImportPath, names: consumedNames } of consumes) {
34
+ const depResolveMapEntry = findResolveMapEntry({ packageName: depName, definition: parentResult, resolveMap });
35
+ const depEntries = depResolveMapEntry &&
36
+ packageResultsArray.find((r) => r.name === depResolveMapEntry.name && r.version === depResolveMapEntry.version)?.info;
37
+ // Skip if we can't find the imported package in the resolve map, or there's no info about
38
+ // its entries/exports.
39
+ if (!depEntries) {
50
40
  continue;
51
41
  }
52
- const packageResult = packageResultsArray.find((r) => r.name === entry.name && r.version === entry.version);
53
- // Skip packages without information.
54
- if (!packageResult?.info?.entry) {
42
+ const importProduces = (depEntries[depImportPath] || depEntries[`${depImportPath}.js`])?.produces;
43
+ if (!importProduces || importProduces.includes('*')) {
44
+ // Skip if the imported package has no entry for the import path, or if the import
45
+ // produces `*` (everything) since we can't check that. (If the path is missing,
46
+ // evaluateImportsForOverrides has already run and tried to fix it or reported an error.)
55
47
  continue;
56
48
  }
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
70
- continue;
71
- }
72
- const { produces: importProduces } = packageResult.info.entry[realImportPath];
73
- // Skip if the import produces everything `*` because we can't check that.
74
- if (importProduces.includes('*')) {
75
- continue;
76
- }
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);
83
- }
84
- }
85
- // No missing exports found.
49
+ // Find any missing names.
50
+ const missing = consumedNames.filter((namedImport) => namedImport !== '*' && !importProduces.includes(namedImport));
86
51
  if (!missing.length) {
87
52
  continue;
88
53
  }
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));
54
+ // Figure out which actual file the exports appear to be missing from.
55
+ const depExportsMap = await getExportsMap({ packagePath: depResolveMapEntry.path }, { packages, config });
56
+ const depFlattenedExportsMap = flattenExportsMap(depExportsMap);
57
+ // If the package is missing an exports map, assume the import path is the real path.
58
+ const relativePath = depFlattenedExportsMap[depImportPath] || depImportPath;
59
+ const filePath = path.join(depResolveMapEntry.path, relativePath);
60
+ // Save the missing names for this path within the package.
61
+ const depKey = `${depResolveMapEntry.name}@${depResolveMapEntry.version}`;
62
+ depsMissingExports[depKey] ??= {};
63
+ depsMissingExports[depKey][filePath] ??= new Set();
64
+ missing.forEach((m) => depsMissingExports[depKey][filePath].add(m));
94
65
  }
95
66
  }
96
- for (const location in missingExportsErrors) {
97
- const missing = Array.from(missingExportsErrors[location]);
98
- packageError.errors.push({
99
- text: errorText({ location, missing }),
67
+ const depErrors = Object.entries(depsMissingExports).map(([packageId, missing]) => {
68
+ // We want a single error for each package, with a bulleted list of files with missing exports.
69
+ const missingExportsForFiles = Object.entries(missing).map(([file, names]) => `${file}:\n${[...names].sort().join(', ')}`);
70
+ return {
71
+ text: `Imported names are missing from exports of external package ${packageId}:\n${bulletedList(missingExportsForFiles)}`,
100
72
  source: 'verify exports',
73
+ // Don't include a whole-message location here because that doesn't make sense for this error type,
74
+ // and we already put full paths to individual problem files within the message.
75
+ };
76
+ });
77
+ if (depErrors.length) {
78
+ allErrors.push({
79
+ name: parentResult.name,
80
+ version: parentResult.version,
81
+ path: parentPath,
82
+ errors: depErrors,
101
83
  });
102
84
  }
103
- if (packageError.errors?.length) {
104
- allErrors.push(packageError);
105
- }
106
85
  }
107
86
  return allErrors;
108
87
  }
109
- function errorText({ location, missing }) {
110
- return `Imported names are missing from external package's exports:\n${bulletedList([`Missing export(s): ${missing.join(', ')}`, `From: ${location}`], 2)}\n`;
111
- }
112
88
  //# sourceMappingURL=verifyExports.js.map
@@ -1 +1 @@
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/common-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 source: 'verify exports',\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
+ {"version":3,"file":"verifyExports.js","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Session } from '@ms-cloudpack/api-server';\nimport type { PackageDefinitionsCache } from '@ms-cloudpack/common-types';\nimport { findResolveMapEntry, flattenExportsMap, getExportsMap } from '@ms-cloudpack/package-utilities';\nimport path from 'path';\nimport type { InitPackageResult } from './types/InitPackageResult.js';\nimport { bulletedList } from '@ms-cloudpack/task-reporter';\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 [parentPath, parentResult] of Object.entries(packageResults)) {\n // Skip packages with build errors or no info\n if (!parentResult?.info || parentResult.errors?.length) {\n continue;\n }\n\n /**\n * Mapping from imported dependency package ID (`name@version`) to import path\n * to export names missing from that file.\n */\n const depsMissingExports: Record<string, Record<string, Set<string>>> = {};\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 depResolveMapEntry = findResolveMapEntry({ packageName: depName, definition: parentResult, resolveMap });\n const depEntries =\n depResolveMapEntry &&\n packageResultsArray.find(\n (r) => r.name === depResolveMapEntry.name && r.version === depResolveMapEntry.version,\n )?.info;\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 (!depEntries) {\n continue;\n }\n\n const importProduces = (depEntries[depImportPath] || depEntries[`${depImportPath}.js`])?.produces;\n if (!importProduces || importProduces.includes('*')) {\n // Skip if the imported package has no entry for the import path, or if the import\n // produces `*` (everything) since we can't check that. (If the path is missing,\n // evaluateImportsForOverrides has already run and tried to fix it or reported an error.)\n continue;\n }\n\n // Find any missing names.\n const missing = consumedNames.filter(\n (namedImport) => namedImport !== '*' && !importProduces.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 depExportsMap = await getExportsMap({ packagePath: depResolveMapEntry.path }, { packages, config });\n const depFlattenedExportsMap = flattenExportsMap(depExportsMap);\n // If the package is missing an exports map, assume the import path is the real path.\n const relativePath = depFlattenedExportsMap[depImportPath] || 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] ??= new Set();\n missing.forEach((m) => depsMissingExports[depKey][filePath].add(m));\n }\n }\n\n const depErrors = Object.entries(depsMissingExports).map(([packageId, missing]) => {\n // We want a single error for each package, with a bulleted list of files with missing exports.\n const missingExportsForFiles = Object.entries(missing).map(\n ([file, names]) => `${file}:\\n${[...names].sort().join(', ')}`,\n );\n return {\n text: `Imported names are missing from exports of external package ${packageId}:\\n${bulletedList(missingExportsForFiles)}`,\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 if (depErrors.length) {\n allErrors.push({\n name: parentResult.name,\n version: parentResult.version,\n path: parentPath,\n errors: depErrors,\n });\n }\n }\n\n return allErrors;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/cli",
3
- "version": "0.59.0",
3
+ "version": "0.59.1",
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,18 +10,18 @@
10
10
  "cloudpack": "./bin/cloudpack.js"
11
11
  },
12
12
  "dependencies": {
13
- "@ms-cloudpack/api-server": "^0.36.0",
14
- "@ms-cloudpack/app-server": "^0.3.7",
15
- "@ms-cloudpack/bundle-server": "^0.2.51",
16
- "@ms-cloudpack/common-types": "^0.2.1",
17
- "@ms-cloudpack/config": "^0.19.0",
13
+ "@ms-cloudpack/api-server": "^0.37.0",
14
+ "@ms-cloudpack/app-server": "^0.3.8",
15
+ "@ms-cloudpack/bundle-server": "^0.2.52",
16
+ "@ms-cloudpack/common-types": "^0.2.2",
17
+ "@ms-cloudpack/config": "^0.19.1",
18
18
  "@ms-cloudpack/feature-flags": "^0.1.1",
19
19
  "@ms-cloudpack/json-utilities": "^0.1.4",
20
- "@ms-cloudpack/overlay": "^0.16.100",
21
- "@ms-cloudpack/package-utilities": "^7.1.2",
22
- "@ms-cloudpack/path-utilities": "^2.6.1",
23
- "@ms-cloudpack/remote-cache": "^0.6.3",
24
- "@ms-cloudpack/task-reporter": "^0.12.0",
20
+ "@ms-cloudpack/overlay": "^0.16.101",
21
+ "@ms-cloudpack/package-utilities": "^7.1.3",
22
+ "@ms-cloudpack/path-utilities": "^2.7.0",
23
+ "@ms-cloudpack/remote-cache": "^0.6.4",
24
+ "@ms-cloudpack/task-reporter": "^0.13.0",
25
25
  "@ms-cloudpack/telemetry": "^0.5.1",
26
26
  "@yarnpkg/lockfile": "^1.1.0",
27
27
  "commander": "^11.1.0",
@@ -34,7 +34,7 @@
34
34
  "workspace-tools": "^0.36.4"
35
35
  },
36
36
  "devDependencies": {
37
- "@ms-cloudpack/common-types": "^0.2.1",
37
+ "@ms-cloudpack/common-types": "^0.2.2",
38
38
  "@ms-cloudpack/eslint-plugin-internal": "^0.0.1",
39
39
  "@ms-cloudpack/scripts": "^0.0.1",
40
40
  "@ms-cloudpack/test-utilities": "^0.5.0",