@ms-cloudpack/cli 0.72.46 → 0.72.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commands/bundle/execute.d.ts.map +1 -1
- package/lib/commands/bundle/execute.js +40 -39
- package/lib/commands/bundle/execute.js.map +1 -1
- package/lib/commands/bundle/index.d.ts.map +1 -1
- package/lib/commands/bundle/index.js +1 -0
- package/lib/commands/bundle/index.js.map +1 -1
- package/lib/commands/bundle/types/BundleOptions.d.ts +5 -8
- package/lib/commands/bundle/types/BundleOptions.d.ts.map +1 -1
- package/lib/commands/bundle/types/BundleOptions.js.map +1 -1
- package/lib/commands/init/InitSummaryData.d.ts +21 -8
- package/lib/commands/init/InitSummaryData.d.ts.map +1 -1
- package/lib/commands/init/InitSummaryData.js +27 -10
- package/lib/commands/init/InitSummaryData.js.map +1 -1
- package/lib/commands/init/evaluatePath.d.ts.map +1 -1
- package/lib/commands/init/evaluatePath.js +3 -3
- package/lib/commands/init/evaluatePath.js.map +1 -1
- package/lib/commands/init/execute.d.ts.map +1 -1
- package/lib/commands/init/execute.js +8 -3
- package/lib/commands/init/execute.js.map +1 -1
- package/lib/commands/init/formatInitSummary.d.ts +5 -3
- package/lib/commands/init/formatInitSummary.d.ts.map +1 -1
- package/lib/commands/init/formatInitSummary.js +62 -56
- package/lib/commands/init/formatInitSummary.js.map +1 -1
- package/lib/commands/init/index.d.ts.map +1 -1
- package/lib/commands/init/index.js +2 -1
- package/lib/commands/init/index.js.map +1 -1
- package/lib/commands/init/init.js +3 -13
- package/lib/commands/init/init.js.map +1 -1
- package/lib/commands/init/types/GeneratedChange.d.ts +7 -2
- package/lib/commands/init/types/GeneratedChange.d.ts.map +1 -1
- package/lib/commands/init/types/GeneratedChange.js +12 -6
- package/lib/commands/init/types/GeneratedChange.js.map +1 -1
- package/lib/commands/init/types/InitOptions.d.ts +2 -10
- package/lib/commands/init/types/InitOptions.d.ts.map +1 -1
- package/lib/commands/init/types/InitOptions.js.map +1 -1
- package/lib/commands/init/types/InitPackageResult.d.ts +3 -1
- package/lib/commands/init/types/InitPackageResult.d.ts.map +1 -1
- package/lib/commands/init/types/InitPackageResult.js.map +1 -1
- package/lib/commands/init/types/InitSummary.d.ts +4 -4
- package/lib/commands/init/types/InitSummary.d.ts.map +1 -1
- package/lib/commands/init/types/InitSummary.js.map +1 -1
- package/lib/commands/init/verifyExports.d.ts.map +1 -1
- package/lib/commands/init/verifyExports.js +4 -4
- package/lib/commands/init/verifyExports.js.map +1 -1
- package/lib/commands/link/types/LinkOptions.d.ts +2 -3
- package/lib/commands/link/types/LinkOptions.d.ts.map +1 -1
- package/lib/commands/link/types/LinkOptions.js.map +1 -1
- package/lib/commands/start/getStartingAppPath.d.ts +0 -1
- package/lib/commands/start/getStartingAppPath.d.ts.map +1 -1
- package/lib/commands/start/getStartingAppPath.js +7 -6
- package/lib/commands/start/getStartingAppPath.js.map +1 -1
- package/lib/commands/start/index.d.ts.map +1 -1
- package/lib/commands/start/index.js +2 -1
- package/lib/commands/start/index.js.map +1 -1
- package/lib/commands/start/types/StartOptions.d.ts +2 -11
- package/lib/commands/start/types/StartOptions.d.ts.map +1 -1
- package/lib/commands/start/types/StartOptions.js.map +1 -1
- package/lib/commands/sync/execute.d.ts.map +1 -1
- package/lib/commands/sync/execute.js +5 -3
- package/lib/commands/sync/execute.js.map +1 -1
- package/lib/commands/sync/types/SyncOptions.d.ts +2 -3
- package/lib/commands/sync/types/SyncOptions.d.ts.map +1 -1
- package/lib/commands/sync/types/SyncOptions.js.map +1 -1
- package/lib/types/ReusedOptions.d.ts +16 -0
- package/lib/types/ReusedOptions.d.ts.map +1 -0
- package/lib/types/ReusedOptions.js +2 -0
- package/lib/types/ReusedOptions.js.map +1 -0
- package/lib/utilities/CommandExecutor.d.ts.map +1 -1
- package/lib/utilities/CommandExecutor.js +4 -2
- package/lib/utilities/CommandExecutor.js.map +1 -1
- package/lib/utilities/findCloudpackAppPaths.d.ts.map +1 -1
- package/lib/utilities/findCloudpackAppPaths.js +2 -1
- package/lib/utilities/findCloudpackAppPaths.js.map +1 -1
- package/lib/utilities/getConfigOptionsFromCliOptions.d.ts +1 -1
- package/lib/utilities/getConfigOptionsFromCliOptions.d.ts.map +1 -1
- package/lib/utilities/getConfigOptionsFromCliOptions.js +1 -0
- package/lib/utilities/getConfigOptionsFromCliOptions.js.map +1 -1
- package/lib/utilities/reusedOptions.d.ts +5 -1
- package/lib/utilities/reusedOptions.d.ts.map +1 -1
- package/lib/utilities/reusedOptions.js +6 -1
- package/lib/utilities/reusedOptions.js.map +1 -1
- package/package.json +16 -16
- package/lib/commands/init/types/InitPackageResultErrors.d.ts +0 -6
- package/lib/commands/init/types/InitPackageResultErrors.d.ts.map +0 -1
- package/lib/commands/init/types/InitPackageResultErrors.js +0 -2
- package/lib/commands/init/types/InitPackageResultErrors.js.map +0 -1
- package/lib/commands/init/types/InitPackageResultWarnings.d.ts +0 -6
- package/lib/commands/init/types/InitPackageResultWarnings.d.ts.map +0 -1
- package/lib/commands/init/types/InitPackageResultWarnings.js +0 -2
- package/lib/commands/init/types/InitPackageResultWarnings.js.map +0 -1
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { bold, bulletedList, cyan, formatTime, green, indent, lightCyan, plural, red,
|
|
1
|
+
import { bold, bulletedList, cyan, formatTime, green, grey, indent, lightCyan, plural, red, prefixCharacters, yellow, } from '@ms-cloudpack/task-reporter';
|
|
2
2
|
import { formatLocation } from '@ms-cloudpack/path-utilities';
|
|
3
|
-
import { requiredChangeTypes } from './types/GeneratedChange.js';
|
|
4
3
|
/**
|
|
5
|
-
* Given
|
|
4
|
+
* Given summaries and options, returns a formatted string message to display to the user via console.
|
|
5
|
+
*
|
|
6
|
+
* TODO rename to formatSummary
|
|
6
7
|
*/
|
|
7
8
|
export function formatInitSummary(params) {
|
|
8
|
-
const { summaries,
|
|
9
|
+
const { summaries, ...otherParams } = params;
|
|
9
10
|
const isMultiApp = summaries.length > 1;
|
|
10
11
|
return (summaries
|
|
11
|
-
.map((summary) =>
|
|
12
|
+
.map((summary) => formatAppSummary({ summary, ...otherParams, isMultiApp }))
|
|
12
13
|
.join('\n')
|
|
13
14
|
// replace >= 3 newlines with 2 newlines
|
|
14
15
|
.replace(/\n{3,}/g, '\n\n'));
|
|
15
16
|
}
|
|
16
17
|
/** Format a single app's init summary. */
|
|
17
|
-
function
|
|
18
|
-
const { summary,
|
|
18
|
+
function formatAppSummary(params) {
|
|
19
|
+
const { summary, check, isInterrupted, isMultiApp, verb } = params;
|
|
19
20
|
const summaryString = [];
|
|
20
21
|
const { totalPackages, totalErrors, totalWarnings, totalChanges, totalRequiredChanges, packagesWithErrors, packagesWithWarnings, generatedFileUpdates, deletedGeneratedConfig, } = summary;
|
|
21
|
-
const { check } = options;
|
|
22
22
|
const incompleteText = isInterrupted ? bold(` (incomplete)`) : ``;
|
|
23
|
-
// Report the "Summary" title if no errors or warnings are listed (seems redundant otherwise.
|
|
23
|
+
// Report the "Summary" title if no errors or warnings are listed (seems redundant otherwise).
|
|
24
24
|
if ((!packagesWithErrors.length && !packagesWithWarnings.length) || isMultiApp) {
|
|
25
25
|
summaryString.push(bold(`==== Summary for ${summary.appPath}${incompleteText} ====`));
|
|
26
26
|
}
|
|
@@ -29,7 +29,7 @@ function formatSummary(params) {
|
|
|
29
29
|
const updatesRequired = totalRequiredChanges || (totalChanges && !check);
|
|
30
30
|
// Report updates that were or should be added to the generated config.
|
|
31
31
|
if (!packagesWithErrors.length && updatesRequired) {
|
|
32
|
-
summaryString.push(formatPackageUpdates({ generatedFileUpdates, check
|
|
32
|
+
summaryString.push(formatPackageUpdates({ generatedFileUpdates, check }));
|
|
33
33
|
}
|
|
34
34
|
if (!isMultiApp) {
|
|
35
35
|
// Report packages with warnings.
|
|
@@ -44,51 +44,62 @@ function formatSummary(params) {
|
|
|
44
44
|
if (deletedGeneratedConfig) {
|
|
45
45
|
summaryString.push(`Deleted the ${cyan('cloudpack.generated.json')} file because it is no longer needed.`, '');
|
|
46
46
|
}
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
? ` (${
|
|
54
|
-
: ''
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
const actualRequiredChanges = check ? totalRequiredChanges : 0;
|
|
48
|
+
if (totalPackages > 1 || verb === 'init') {
|
|
49
|
+
const action = verb === 'init' ? 'evaluated' : 'bundled';
|
|
50
|
+
const errorPkgCount = packagesWithErrors.length;
|
|
51
|
+
const succesPkgCount = totalPackages - errorPkgCount;
|
|
52
|
+
const pkgWarningsMessage = packagesWithWarnings.length
|
|
53
|
+
? ` (${formatCount(packagesWithWarnings.length, 'package', 'with warnings', yellow)})`
|
|
54
|
+
: '';
|
|
55
|
+
summaryString.push(`${cyan(plural(totalPackages, 'total package'))} ${action} in ${formatTime(summary.duration)}${incompleteText}:`, bulletedList([
|
|
56
|
+
formatCount(actualRequiredChanges, 'change', 'required', red),
|
|
57
|
+
formatCount(succesPkgCount, 'package', `${action} successfully${pkgWarningsMessage}`, green),
|
|
58
|
+
formatCount(errorPkgCount, 'package', 'failed', red),
|
|
59
|
+
`Totals: ${formatTotal(totalErrors, 'error', red)}, ${formatTotal(totalWarnings, 'warning', yellow)}`,
|
|
60
|
+
].filter(Boolean)));
|
|
61
|
+
}
|
|
58
62
|
if (isInterrupted) {
|
|
59
63
|
summaryString.push('', yellow(bold('Process was interrupted before all tasks could complete.')));
|
|
60
64
|
}
|
|
61
|
-
else if (
|
|
65
|
+
else if (actualRequiredChanges) {
|
|
62
66
|
summaryString.push(`Run "${yellow('cloudpack init')}" in your application folder to apply changes to the ${cyan('cloudpack.generated.json')} file.`);
|
|
63
67
|
}
|
|
64
68
|
summaryString.push('\n');
|
|
65
69
|
return summaryString.join('\n');
|
|
66
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* If `count` is positive, returns a pluralized formatted string like "5 items description"
|
|
73
|
+
* (otherwise return undefined). The "5 items" part is formatted with `color`.
|
|
74
|
+
*/
|
|
75
|
+
function formatCount(count, item, description, color) {
|
|
76
|
+
return count > 0 ? `${color(plural(count, item))} ${description}` : undefined;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Format a total (e.g. "5 items"). The color is only used if the total is non-zero.
|
|
80
|
+
*/
|
|
81
|
+
function formatTotal(total, item, color) {
|
|
82
|
+
const pluralStr = plural(total, item);
|
|
83
|
+
return total ? color(pluralStr) : pluralStr;
|
|
84
|
+
}
|
|
67
85
|
function formatPackageUpdates(params) {
|
|
68
|
-
const { generatedFileUpdates, check, isInterrupted
|
|
69
|
-
|
|
70
|
-
|
|
86
|
+
const { generatedFileUpdates, check, isInterrupted } = params;
|
|
87
|
+
const descriptions = {
|
|
88
|
+
'added-export': `path$s ${check ? 'missing from' : 'added to'} exports map`,
|
|
89
|
+
'included-dependency-required': 'dependency$s required to be included',
|
|
90
|
+
'changed-export': 'previously unused export path$s are now used',
|
|
91
|
+
'added-dynamic-import': 'dynamic import$s added',
|
|
92
|
+
};
|
|
71
93
|
const summaryString = [];
|
|
72
94
|
for (const packageUpdates of generatedFileUpdates) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
summaryString.push(formatPackageHeader({ ...packageUpdates, issueType: type, description }), bulletedList(includedDependencies.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ''}`)), '');
|
|
82
|
-
}
|
|
83
|
-
const changedExports = getChangesToShow({ type: 'changed-export', packageUpdates, isMultiApp });
|
|
84
|
-
if (changedExports.length) {
|
|
85
|
-
const description = plural(changedExports.length, 'previously unused export path$s are now used');
|
|
86
|
-
summaryString.push(formatPackageHeader({ ...packageUpdates, issueType: type, description }), bulletedList(changedExports.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ''}`)), '');
|
|
87
|
-
}
|
|
88
|
-
const dynamicImportsUpdates = getChangesToShow({ type: 'added-dynamic-import', packageUpdates, isMultiApp });
|
|
89
|
-
if (dynamicImportsUpdates.length) {
|
|
90
|
-
const description = plural(dynamicImportsUpdates.length, 'dynamic import$s added');
|
|
91
|
-
summaryString.push(formatPackageHeader({ ...packageUpdates, issueType: type, description }), bulletedList(dynamicImportsUpdates.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ``}`)), '');
|
|
95
|
+
for (const type of Object.keys(descriptions)) {
|
|
96
|
+
const typeUpdates = packageUpdates.changes.filter((u) => u.type === type);
|
|
97
|
+
if (typeUpdates.length) {
|
|
98
|
+
const description = plural(typeUpdates.length, descriptions[type]);
|
|
99
|
+
// If we already made the updates, don't make them look like warnings.
|
|
100
|
+
const issueType = check ? 'warn' : 'add';
|
|
101
|
+
summaryString.push(formatPackageHeader({ ...packageUpdates, issueType, description }), bulletedList(typeUpdates.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ''}`)), '');
|
|
102
|
+
}
|
|
92
103
|
}
|
|
93
104
|
}
|
|
94
105
|
if (summaryString.length) {
|
|
@@ -96,13 +107,6 @@ function formatPackageUpdates(params) {
|
|
|
96
107
|
}
|
|
97
108
|
return summaryString.join('\n');
|
|
98
109
|
}
|
|
99
|
-
function getChangesToShow(params) {
|
|
100
|
-
const { packageUpdates, type, isMultiApp } = params;
|
|
101
|
-
if (isMultiApp && !requiredChangeTypes.includes(type)) {
|
|
102
|
-
return [];
|
|
103
|
-
}
|
|
104
|
-
return packageUpdates.changes.filter((u) => u.type === type);
|
|
105
|
-
}
|
|
106
110
|
/** Helper to format `packagesWithWarnings` or `packagesWithErrors`. */
|
|
107
111
|
function formatPackageResults(params) {
|
|
108
112
|
const { results, issueType } = params;
|
|
@@ -111,7 +115,7 @@ function formatPackageResults(params) {
|
|
|
111
115
|
}
|
|
112
116
|
const color = colorsByType[issueType];
|
|
113
117
|
const messageType = issueType === 'error' ? 'errors' : 'warnings';
|
|
114
|
-
const statusChar = bold(color(
|
|
118
|
+
const statusChar = bold(color(prefixCharacters[issueType]));
|
|
115
119
|
const summaryString = [bold(color(`${plural(results.length, 'package')} with ${messageType}:`)), ''];
|
|
116
120
|
for (const result of results) {
|
|
117
121
|
const unformattedMessages = result[messageType];
|
|
@@ -137,8 +141,8 @@ const colorsByType = {
|
|
|
137
141
|
add: (str) => str,
|
|
138
142
|
};
|
|
139
143
|
const statusByType = {
|
|
140
|
-
error:
|
|
141
|
-
warn:
|
|
144
|
+
error: prefixCharacters.error,
|
|
145
|
+
warn: prefixCharacters.warn,
|
|
142
146
|
add: '+',
|
|
143
147
|
};
|
|
144
148
|
/**
|
|
@@ -146,10 +150,12 @@ const statusByType = {
|
|
|
146
150
|
* status character, `name@version`, issue description, package path.
|
|
147
151
|
*/
|
|
148
152
|
function formatPackageHeader(params) {
|
|
149
|
-
const { name, version, path: packagePath, description, issueType } = params;
|
|
153
|
+
const { name, version, path: packagePath, outputPath, description, issueType } = params;
|
|
150
154
|
const color = colorsByType[issueType];
|
|
151
155
|
const statusChar = bold(color(statusByType[issueType]));
|
|
152
156
|
const packageName = bold(lightCyan(`${name}@${version || `<unknown>`}`));
|
|
153
|
-
return `${packageName} - ${packagePath}\n
|
|
157
|
+
return (`${packageName} - ${packagePath}\n` +
|
|
158
|
+
(outputPath ? grey(`(output: ${outputPath})\n`) : '') +
|
|
159
|
+
`${statusChar} ${bold(color(description))}`);
|
|
154
160
|
}
|
|
155
161
|
//# sourceMappingURL=formatInitSummary.js.map
|
|
@@ -1 +1 @@
|
|
|
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 formatTime,\n green,\n indent,\n lightCyan,\n plural,\n red,\n statusCharacter,\n yellow,\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';\nimport type { GeneratedPackageChanges } from './types/GeneratedPackageChanges.js';\nimport { requiredChangeTypes, type GeneratedChange, type GeneratedChangeType } from './types/GeneratedChange.js';\n\ninterface FormatInitSummaryParams {\n summaries: InitSummary[];\n options: InitOptions;\n isInterrupted?: boolean;\n}\n\n/**\n * Given init summaries and init options, returns a formatted string message to display to the user via console.\n */\nexport function formatInitSummary(params: FormatInitSummaryParams): string {\n const { summaries, options, isInterrupted } = params;\n const isMultiApp = summaries.length > 1;\n return (\n summaries\n .map((summary) => formatSummary({ summary, options, isInterrupted, isMultiApp }))\n .join('\\n')\n // replace >= 3 newlines with 2 newlines\n .replace(/\\n{3,}/g, '\\n\\n')\n );\n}\n\n/** Format a single app's init summary. */\nfunction formatSummary(\n params: Pick<FormatInitSummaryParams, 'options' | 'isInterrupted'> & {\n summary: InitSummary;\n isMultiApp: boolean;\n },\n): string {\n const { summary, options, isInterrupted, isMultiApp } = params;\n const summaryString: string[] = [];\n\n const {\n totalPackages,\n totalErrors,\n totalWarnings,\n totalChanges,\n totalRequiredChanges,\n packagesWithErrors,\n packagesWithWarnings,\n generatedFileUpdates,\n deletedGeneratedConfig,\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 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 updates that were or should be added to the generated config.\n if (!packagesWithErrors.length && updatesRequired) {\n summaryString.push(formatPackageUpdates({ generatedFileUpdates, check, isMultiApp }));\n }\n\n if (!isMultiApp) {\n // Report packages with warnings.\n if (packagesWithWarnings.length) {\n summaryString.push(formatPackageResults({ results: packagesWithWarnings, issueType: 'warn' }), '');\n }\n }\n\n // Report packages with errors.\n if (packagesWithErrors.length) {\n summaryString.push(formatPackageResults({ results: packagesWithErrors, issueType: 'error' }), '');\n }\n\n if (deletedGeneratedConfig) {\n summaryString.push(`Deleted the ${cyan('cloudpack.generated.json')} file because it is no longer needed.`, '');\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 return summaryString.join('\\n');\n}\n\nfunction formatPackageUpdates(\n params: Pick<InitSummary, 'generatedFileUpdates'> &\n Pick<InitOptions, 'check'> &\n Pick<FormatInitSummaryParams, 'isInterrupted'> & { isMultiApp: boolean },\n): string {\n const { generatedFileUpdates, check, isInterrupted, isMultiApp } = params;\n // If we already made the updates, don't make them look like warnings.\n const type = check ? 'warn' : 'add';\n\n const summaryString: string[] = [];\n\n for (const packageUpdates of generatedFileUpdates) {\n const exportsUpdates = getChangesToShow({ type: 'added-export', packageUpdates, isMultiApp });\n\n if (exportsUpdates.length) {\n const description = plural(exportsUpdates.length, `path$s ${check ? 'missing from' : 'added to'} exports map`);\n summaryString.push(\n formatPackageHeader({ ...packageUpdates, issueType: type, description }),\n bulletedList(exportsUpdates.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ''}`)),\n '',\n );\n }\n\n const includedDependencies = getChangesToShow({ type: 'included-dependency-required', packageUpdates, isMultiApp });\n\n if (includedDependencies.length) {\n const description = plural(includedDependencies.length, 'dependency$s required to be included');\n summaryString.push(\n formatPackageHeader({ ...packageUpdates, issueType: type, description }),\n bulletedList(includedDependencies.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ''}`)),\n '',\n );\n }\n\n const changedExports = getChangesToShow({ type: 'changed-export', packageUpdates, isMultiApp });\n\n if (changedExports.length) {\n const description = plural(changedExports.length, 'previously unused export path$s are now used');\n summaryString.push(\n formatPackageHeader({ ...packageUpdates, issueType: type, description }),\n bulletedList(changedExports.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ''}`)),\n '',\n );\n }\n\n const dynamicImportsUpdates = getChangesToShow({ type: 'added-dynamic-import', packageUpdates, isMultiApp });\n\n if (dynamicImportsUpdates.length) {\n const description = plural(dynamicImportsUpdates.length, 'dynamic import$s added');\n summaryString.push(\n formatPackageHeader({ ...packageUpdates, issueType: type, description }),\n bulletedList(dynamicImportsUpdates.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ``}`)),\n '',\n );\n }\n }\n\n if (summaryString.length) {\n summaryString.unshift(\n bold(`Updates ${check || isInterrupted ? 'needed for' : 'made to'} ${cyan(`cloudpack.generated.json`)}:\\n`),\n );\n }\n return summaryString.join('\\n');\n}\n\nfunction getChangesToShow(params: {\n packageUpdates: GeneratedPackageChanges;\n type: GeneratedChangeType;\n isMultiApp: boolean;\n}): GeneratedChange[] {\n const { packageUpdates, type, isMultiApp } = params;\n if (isMultiApp && !requiredChangeTypes.includes(type)) {\n return [];\n }\n return packageUpdates.changes.filter((u) => u.type === type);\n}\n\n/** Helper to format `packagesWithWarnings` or `packagesWithErrors`. */\nfunction formatPackageResults(params: { results: InitPackageResult[]; issueType: 'error' | 'warn' }): string {\n const { results, issueType } = params;\n if (!results.length) {\n return '';\n }\n\n const color = colorsByType[issueType];\n const messageType = issueType === 'error' ? 'errors' : 'warnings';\n const statusChar = bold(color(statusCharacter[issueType]));\n\n const summaryString = [bold(color(`${plural(results.length, 'package')} with ${messageType}:`)), ''];\n\n for (const result of results) {\n const unformattedMessages = result[messageType];\n if (!unformattedMessages?.length) {\n continue;\n }\n\n const description = plural(unformattedMessages.length, messageType.slice(0, -1) + '$s');\n summaryString.push(formatPackageHeader({ ...result, issueType, description }));\n\n const messages = unformattedMessages.map(({ location, text, source }) => {\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 // Indent the message for readability.\n return `[${source}]${filePath}\\n${color(indent(text, 1))}`;\n });\n\n summaryString.push(bulletedList(messages, undefined, statusChar), '');\n }\n\n return summaryString.join('\\n');\n}\n\nconst colorsByType = {\n error: red,\n warn: yellow,\n add: (str: string) => str,\n};\nconst statusByType = {\n error: statusCharacter.error,\n warn: statusCharacter.warn,\n add: '+',\n};\n\n/**\n * Helper to format the header for a list of issues in a package:\n * status character, `name@version`, issue description, package path.\n */\nfunction formatPackageHeader(\n params: InitPackageIdentifier & {\n description: string;\n issueType: 'error' | 'warn' | 'add';\n },\n): string {\n const { name, version, path: packagePath, description, issueType } = params;\n const color = colorsByType[issueType];\n const statusChar = bold(color(statusByType[issueType]));\n const packageName = bold(lightCyan(`${name}@${version || `<unknown>`}`));\n\n return `${packageName} - ${packagePath}\\n${statusChar} ${bold(color(description))}`;\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 formatTime,\n green,\n grey,\n indent,\n lightCyan,\n plural,\n red,\n prefixCharacters,\n yellow,\n} from '@ms-cloudpack/task-reporter';\nimport type { InitOptions } from './types/InitOptions.js';\nimport type { InitPackageResult } from './types/InitPackageResult.js';\nimport type { InitSummary } from './types/InitSummary.js';\nimport { formatLocation } from '@ms-cloudpack/path-utilities';\nimport type { RequiredGeneratedChangeType } from './types/GeneratedChange.js';\n\ninterface FormatInitSummaryParams extends Pick<InitOptions, 'check'> {\n summaries: InitSummary[];\n verb: 'init' | 'bundle';\n isInterrupted?: boolean;\n}\n\ninterface FormatAppSummaryParams extends Omit<FormatInitSummaryParams, 'summaries'> {\n summary: InitSummary;\n isMultiApp: boolean;\n}\n\ninterface FormatAppSummaryParams extends Omit<FormatInitSummaryParams, 'summaries'> {\n summary: InitSummary;\n isMultiApp: boolean;\n}\n\n/**\n * Given summaries and options, returns a formatted string message to display to the user via console.\n *\n * TODO rename to formatSummary\n */\nexport function formatInitSummary(params: FormatInitSummaryParams): string {\n const { summaries, ...otherParams } = params;\n const isMultiApp = summaries.length > 1;\n return (\n summaries\n .map((summary) => formatAppSummary({ summary, ...otherParams, isMultiApp }))\n .join('\\n')\n // replace >= 3 newlines with 2 newlines\n .replace(/\\n{3,}/g, '\\n\\n')\n );\n}\n\n/** Format a single app's init summary. */\nfunction formatAppSummary(params: FormatAppSummaryParams): string {\n const { summary, check, isInterrupted, isMultiApp, verb } = params;\n const summaryString: string[] = [];\n\n const {\n totalPackages,\n totalErrors,\n totalWarnings,\n totalChanges,\n totalRequiredChanges,\n packagesWithErrors,\n packagesWithWarnings,\n generatedFileUpdates,\n deletedGeneratedConfig,\n } = summary;\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 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 updates that were or should be added to the generated config.\n if (!packagesWithErrors.length && updatesRequired) {\n summaryString.push(formatPackageUpdates({ generatedFileUpdates, check }));\n }\n\n if (!isMultiApp) {\n // Report packages with warnings.\n if (packagesWithWarnings.length) {\n summaryString.push(formatPackageResults({ results: packagesWithWarnings, issueType: 'warn' }), '');\n }\n }\n\n // Report packages with errors.\n if (packagesWithErrors.length) {\n summaryString.push(formatPackageResults({ results: packagesWithErrors, issueType: 'error' }), '');\n }\n\n if (deletedGeneratedConfig) {\n summaryString.push(`Deleted the ${cyan('cloudpack.generated.json')} file because it is no longer needed.`, '');\n }\n\n const actualRequiredChanges = check ? totalRequiredChanges : 0;\n\n if (totalPackages > 1 || verb === 'init') {\n const action = verb === 'init' ? 'evaluated' : 'bundled';\n const errorPkgCount = packagesWithErrors.length;\n const succesPkgCount = totalPackages - errorPkgCount;\n const pkgWarningsMessage = packagesWithWarnings.length\n ? ` (${formatCount(packagesWithWarnings.length, 'package', 'with warnings', yellow)})`\n : '';\n\n summaryString.push(\n `${cyan(plural(totalPackages, 'total package'))} ${action} in ${formatTime(summary.duration)}${incompleteText}:`,\n bulletedList(\n [\n formatCount(actualRequiredChanges, 'change', 'required', red),\n formatCount(succesPkgCount, 'package', `${action} successfully${pkgWarningsMessage}`, green),\n formatCount(errorPkgCount, 'package', 'failed', red),\n `Totals: ${formatTotal(totalErrors, 'error', red)}, ${formatTotal(totalWarnings, 'warning', yellow)}`,\n ].filter(Boolean),\n ),\n );\n }\n\n if (isInterrupted) {\n summaryString.push('', yellow(bold('Process was interrupted before all tasks could complete.')));\n } else if (actualRequiredChanges) {\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 return summaryString.join('\\n');\n}\n\n/**\n * If `count` is positive, returns a pluralized formatted string like \"5 items description\"\n * (otherwise return undefined). The \"5 items\" part is formatted with `color`.\n */\nfunction formatCount(\n count: number,\n item: string,\n description: string,\n color: (str: string) => string,\n): string | undefined {\n return count > 0 ? `${color(plural(count, item))} ${description}` : undefined;\n}\n\n/**\n * Format a total (e.g. \"5 items\"). The color is only used if the total is non-zero.\n */\nfunction formatTotal(total: number, item: string, color: (str: string) => string): string {\n const pluralStr = plural(total, item);\n return total ? color(pluralStr) : pluralStr;\n}\n\nfunction formatPackageUpdates(\n params: Pick<InitSummary, 'generatedFileUpdates'> & Pick<FormatAppSummaryParams, 'isInterrupted' | 'check'>,\n): string {\n const { generatedFileUpdates, check, isInterrupted } = params;\n\n const descriptions: Record<RequiredGeneratedChangeType, string> = {\n 'added-export': `path$s ${check ? 'missing from' : 'added to'} exports map`,\n 'included-dependency-required': 'dependency$s required to be included',\n 'changed-export': 'previously unused export path$s are now used',\n 'added-dynamic-import': 'dynamic import$s added',\n };\n\n const summaryString: string[] = [];\n\n for (const packageUpdates of generatedFileUpdates) {\n for (const type of Object.keys(descriptions) as RequiredGeneratedChangeType[]) {\n const typeUpdates = packageUpdates.changes.filter((u) => u.type === type);\n\n if (typeUpdates.length) {\n const description = plural(typeUpdates.length, descriptions[type]);\n // If we already made the updates, don't make them look like warnings.\n const issueType = check ? 'warn' : 'add';\n summaryString.push(\n formatPackageHeader({ ...packageUpdates, issueType, description }),\n bulletedList(typeUpdates.map((u) => `${cyan(u.change)}${u.reason ? ` - ${u.reason}` : ''}`)),\n '',\n );\n }\n }\n }\n\n if (summaryString.length) {\n summaryString.unshift(\n bold(`Updates ${check || isInterrupted ? 'needed for' : 'made to'} ${cyan(`cloudpack.generated.json`)}:\\n`),\n );\n }\n return summaryString.join('\\n');\n}\n\n/** Helper to format `packagesWithWarnings` or `packagesWithErrors`. */\nfunction formatPackageResults(params: { results: InitPackageResult[]; issueType: 'error' | 'warn' }): string {\n const { results, issueType } = params;\n if (!results.length) {\n return '';\n }\n\n const color = colorsByType[issueType];\n const messageType = issueType === 'error' ? 'errors' : 'warnings';\n const statusChar = bold(color(prefixCharacters[issueType]));\n\n const summaryString = [bold(color(`${plural(results.length, 'package')} with ${messageType}:`)), ''];\n\n for (const result of results) {\n const unformattedMessages = result[messageType];\n if (!unformattedMessages?.length) {\n continue;\n }\n\n const description = plural(unformattedMessages.length, messageType.slice(0, -1) + '$s');\n summaryString.push(formatPackageHeader({ ...result, issueType, description }));\n\n const messages = unformattedMessages.map(({ location, text, source }) => {\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 // Indent the message for readability.\n return `[${source}]${filePath}\\n${color(indent(text, 1))}`;\n });\n\n summaryString.push(bulletedList(messages, undefined, statusChar), '');\n }\n\n return summaryString.join('\\n');\n}\n\nconst colorsByType = {\n error: red,\n warn: yellow,\n add: (str: string) => str,\n};\nconst statusByType = {\n error: prefixCharacters.error,\n warn: prefixCharacters.warn,\n add: '+',\n};\n\n/**\n * Helper to format the header for a list of issues in a package:\n * status character, `name@version`, issue description, package path.\n */\nfunction formatPackageHeader(\n params: InitPackageResult & {\n description: string;\n issueType: 'error' | 'warn' | 'add';\n },\n): string {\n const { name, version, path: packagePath, outputPath, description, issueType } = params;\n const color = colorsByType[issueType];\n const statusChar = bold(color(statusByType[issueType]));\n const packageName = bold(lightCyan(`${name}@${version || `<unknown>`}`));\n\n return (\n `${packageName} - ${packagePath}\\n` +\n (outputPath ? grey(`(output: ${outputPath})\\n`) : '') +\n `${statusChar} ${bold(color(description))}`\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAI9E,+BAA+B;AAC/B,eAAO,MAAM,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAI9E,+BAA+B;AAC/B,eAAO,MAAM,IAAI,EAAE,mBAgBlB,CAAC"}
|
|
@@ -8,10 +8,11 @@ export const init = (program) => {
|
|
|
8
8
|
'configuration overrides (cloudpack.generated.json).',
|
|
9
9
|
options: {
|
|
10
10
|
logResolveMap: reusedOptions.logResolveMap(),
|
|
11
|
+
logBundleInfo: reusedOptions.logBundleInfo({ requiresNoCache: true }),
|
|
11
12
|
reset: new Option('--reset', 'Ignore the previous generated config.').conflicts('check'),
|
|
12
13
|
check: new Option('--check', 'Fail if updates to the generated config are required.').conflicts('reset'),
|
|
13
14
|
match: reusedOptions.match('Only evaluate specific package(s)').conflicts('reset'),
|
|
14
|
-
cache: reusedOptions.
|
|
15
|
+
cache: reusedOptions.cache(),
|
|
15
16
|
},
|
|
16
17
|
getExecutor: () => import('./execute.js'),
|
|
17
18
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,+BAA+B;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,aAAa,CAAc;QACjC,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,6EAA6E;YAC7E,qDAAqD;QACvD,OAAO,EAAE;YACP,aAAa,EAAE,aAAa,CAAC,aAAa,EAAE;YAC5C,KAAK,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YACxF,KAAK,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,uDAAuD,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YACxG,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YAClF,KAAK,EAAE,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,+BAA+B;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,aAAa,CAAc;QACjC,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,6EAA6E;YAC7E,qDAAqD;QACvD,OAAO,EAAE;YACP,aAAa,EAAE,aAAa,CAAC,aAAa,EAAE;YAC5C,aAAa,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;YACrE,KAAK,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YACxF,KAAK,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,uDAAuD,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YACxG,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;YAClF,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE;SAC7B;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { Option } from 'commander';\nimport type { CommandInitFunction } from '../../types/CommandInitFunction.js';\nimport type { InitOptions } from './types/InitOptions.js';\nimport { reusedOptions } from '../../utilities/reusedOptions.js';\n\n/** Defines the \"init\" verb. */\nexport const init: CommandInitFunction = (program) => {\n program.addSubCommand<InitOptions>({\n name: 'init',\n description:\n \"Validate an app's compatibility with Cloudpack, and generate any necessary \" +\n 'configuration overrides (cloudpack.generated.json).',\n options: {\n logResolveMap: reusedOptions.logResolveMap(),\n logBundleInfo: reusedOptions.logBundleInfo({ requiresNoCache: true }),\n reset: new Option('--reset', 'Ignore the previous generated config.').conflicts('check'),\n check: new Option('--check', 'Fail if updates to the generated config are required.').conflicts('reset'),\n match: reusedOptions.match('Only evaluate specific package(s)').conflicts('reset'),\n cache: reusedOptions.cache(),\n },\n getExecutor: () => import('./execute.js'),\n });\n};\n"]}
|
|
@@ -125,16 +125,11 @@ async function initApp(params) {
|
|
|
125
125
|
.catch((error) => {
|
|
126
126
|
// Record the exception as an init error for the package.
|
|
127
127
|
// This gives better context than a stack trace which could have come from any package.
|
|
128
|
-
let prefix =
|
|
128
|
+
let prefix = 'evaluating package';
|
|
129
129
|
if (importerContext) {
|
|
130
130
|
prefix += ` (context: ${JSON.stringify(importerContext, null, 2).replace(/\s+/g, ' ')})`;
|
|
131
131
|
}
|
|
132
|
-
summaryData.
|
|
133
|
-
{
|
|
134
|
-
text: `${prefix}:\n${error instanceof Error ? error.stack : error}`,
|
|
135
|
-
source: 'init',
|
|
136
|
-
},
|
|
137
|
-
]);
|
|
132
|
+
summaryData.recordException({ packagePath, error, source: 'init', context: prefix });
|
|
138
133
|
// Don't immediately stop evaluation, but don't enqueue more paths.
|
|
139
134
|
isExitingPrematurely = true;
|
|
140
135
|
});
|
|
@@ -145,12 +140,7 @@ async function initApp(params) {
|
|
|
145
140
|
// record it as an init error for the app instead of allowing it to propagate.
|
|
146
141
|
// This allows the overall init summary and any other errors to be logged as usual.
|
|
147
142
|
isExitingPrematurely = true;
|
|
148
|
-
summaryData.
|
|
149
|
-
{
|
|
150
|
-
text: `Error thrown during init: ${error instanceof Error ? error.stack : error}`,
|
|
151
|
-
source: 'init',
|
|
152
|
-
},
|
|
153
|
-
]);
|
|
143
|
+
summaryData.recordException({ packagePath: appPath, error, source: 'init', context: 'running init' });
|
|
154
144
|
});
|
|
155
145
|
// Log the resolve map to a file if requested. Do this *after* the main init process in case
|
|
156
146
|
// any additional deps were discovered and added.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Context, TaskRunner } from '@ms-cloudpack/api-server';\nimport type { PackageImporterContext } from '@ms-cloudpack/common-types';\nimport type { AutoDispose } from '../../types/AutoDispose.js';\nimport type { InitOptions } from './types/InitOptions.js';\nimport type { InitSummary } from './types/InitSummary.js';\n\nimport { createPartialApiContext } from '@ms-cloudpack/api-server';\nimport { writeGeneratedConfig } from '@ms-cloudpack/config';\nimport type { InitSummaryData } from './InitSummaryData.js';\nimport { evaluatePath } from './evaluatePath.js';\nimport { verifyExports } from './verifyExports.js';\nimport type { AppCommandContext } from '../../types/CommandAction.js';\nimport path from 'path';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport { runPrerequisites } from '../../utilities/runPrerequisites.js';\nimport { getFilteredPackages } from '../../utilities/getFilteredPackages.js';\nimport { optimizeDependencies } from './optimizeDependencies.js';\nimport { bulletedList } from '@ms-cloudpack/task-reporter';\n\n/**\n * Init execution function.\n */\nexport async function init(parameters: {\n options: InitOptions;\n contexts: AppCommandContext[];\n autoDispose: AutoDispose;\n /**\n * App summary objects, created ahead of time so that a partial summary can be generated\n * if the process is interrupted.\n */\n appSummaries: Record<string, InitSummaryData>;\n}): Promise<InitSummary[]> {\n const { options, contexts, autoDispose, appSummaries } = parameters;\n\n const summaries: InitSummary[] = [];\n\n const taskRunner = new TaskRunner();\n\n for (const appContext of contexts) {\n const summary = await initApp({\n appContext,\n options,\n autoDispose,\n summaryData: appSummaries[appContext.appPath],\n taskRunner,\n isMultiApp: contexts.length > 1,\n });\n summaries.push(summary);\n }\n\n return summaries;\n}\n\nasync function initApp(params: {\n appContext: AppCommandContext;\n options: InitOptions;\n autoDispose: AutoDispose;\n summaryData: InitSummaryData;\n taskRunner: TaskRunner;\n isMultiApp: boolean;\n}): Promise<InitSummary> {\n const { appContext, options, autoDispose, summaryData, taskRunner, isMultiApp } = params;\n const { appPath, config, telemetryClient } = appContext;\n return telemetryClient.tracer.startActiveSpan('INIT_APP', async (span) => {\n // Run prerequisites for the app.\n await runPrerequisites(appContext);\n\n // If --reset is specified, reset the generated config.\n if (options.reset) {\n config.generated = {};\n }\n\n const apiContext: Context = await createPartialApiContext({\n ...appContext,\n items: ['bus', 'taskRunner', 'watcher', 'packages', 'session', 'packageImportPaths', 'packageHashes'],\n taskRunner,\n });\n autoDispose(apiContext);\n const resolveMap = apiContext.session.resolveMap;\n\n // Ensure config.generated.packageSettings is initialized.\n config.generated.packageSettings ??= [];\n\n let isExitingPrematurely = false;\n\n await new Promise<void>((resolve) => {\n let pending = 0;\n const visitedSet = new Set<string>();\n const refreshPaths = new Set<string>();\n const priorityMap = new Map<string, number>();\n\n // Start with the app path or requested matches\n const initialPaths = options.match ? getFilteredPackages(resolveMap, options.match) : [appPath];\n if (!initialPaths.length) {\n summaryData.addErrors(appPath, [{ text: `No packages found matching ${options.match}`, source: 'init' }]);\n resolve();\n }\n\n enqueuePaths(new Map(initialPaths.map((packagePath) => [packagePath, undefined])));\n\n /**\n * Enqueue more paths.\n * @param newPaths Mapping from package path to importer context.\n */\n function enqueuePaths(newPaths: Map<string, PackageImporterContext | undefined>): void {\n if (isExitingPrematurely) {\n return;\n }\n\n // Iterate through the given paths.\n for (const [packagePath, importerContext] of newPaths) {\n if (visitedSet.has(packagePath)) {\n console.debug(`Skipping ${packagePath} as it has already been visited.`);\n continue;\n }\n\n visitedSet.add(packagePath);\n pending++;\n\n const shouldForce = refreshPaths.delete(packagePath);\n\n // Get the priority value for this package path, defaults to 0.\n const priority = priorityMap.get(packagePath) ?? 0;\n // Lower priority of this package path by 1.\n priorityMap.set(packagePath, priority - 1);\n\n // Evaluate this path, but don't await - when we're done, we'll re-enqueue newly discovered paths.\n evaluatePath({\n appPath,\n packagePath,\n importerContext,\n config,\n span,\n resolveMap,\n initOptions: options,\n summaryData,\n ctx: apiContext,\n // No need to force if we're in a multi-app scenario\n // as we'll re-evaluate packages if they are different since we use a different task id.\n shouldForce: !isMultiApp && shouldForce,\n isMultiApp,\n priority,\n })\n .then(({ pathsToEvaluate, pathsToRefresh, shouldExit }) => {\n pending--;\n\n if (shouldExit) {\n isExitingPrematurely = true;\n } else if (pathsToEvaluate?.size) {\n // If there are packages that need to be rebuilt, delete them from the visited set to re-enqueue them\n // and add them to the refresh set so that on re-enqueuing we pass the `shouldRerun` flag through\n // on single app runs.\n pathsToRefresh?.forEach((refreshPath) => {\n refreshPaths.add(refreshPath);\n visitedSet.delete(refreshPath);\n });\n\n // Try to enqueue the new paths.\n console.debug(\n `Enqueuing paths found from ${packagePath}:\\n` +\n bulletedList(\n [...pathsToEvaluate].map(([newPath, newContext]) => `${newPath} ${JSON.stringify(newContext)}`),\n ),\n );\n enqueuePaths(pathsToEvaluate);\n }\n\n // If nothing is pending after this call, we're complete.\n if (!pending) {\n resolve();\n }\n })\n .catch((error) => {\n // Record the exception as an init error for the package.\n // This gives better context than a stack trace which could have come from any package.\n let prefix = `Error thrown while evaluating package`;\n if (importerContext) {\n prefix += ` (context: ${JSON.stringify(importerContext, null, 2).replace(/\\s+/g, ' ')})`;\n }\n\n summaryData.addErrors(packagePath, [\n {\n text: `${prefix}:\\n${error instanceof Error ? error.stack : error}`,\n source: 'init',\n },\n ]);\n\n // Don't immediately stop evaluation, but don't enqueue more paths.\n isExitingPrematurely = true;\n });\n }\n }\n }).catch((error) => {\n // If there's an error thrown from some other part of the promise besides evaluatePath (not likely),\n // record it as an init error for the app instead of allowing it to propagate.\n // This allows the overall init summary and any other errors to be logged as usual.\n isExitingPrematurely = true;\n summaryData.addErrors(appPath, [\n {\n text: `Error thrown during init: ${error instanceof Error ? error.stack : error}`,\n source: 'init',\n },\n ]);\n });\n\n // Log the resolve map to a file if requested. Do this *after* the main init process in case\n // any additional deps were discovered and added.\n if (options.logResolveMap) {\n console.log('\\nWriting resolve map to `resolve-map.json`.');\n await writeJson(path.join(appPath, 'resolve-map.json'), resolveMap);\n }\n\n // Only do extra checks if there's not a major error already\n if (!isExitingPrematurely) {\n if (config.features?.optimizeDependencies) {\n // Conditionally scan dependency usage so that we can populate\n // include/excludeDependencies automatically, ensuring the dep list\n // is both minimal (remove unused deps) and complete (include\n // specific devDeps.)\n const excludedDependenciesChanges = await optimizeDependencies(summaryData.getResults(), apiContext);\n summaryData.recordGeneratedChanges(excludedDependenciesChanges);\n }\n\n if (config.features?.verifyExports) {\n const packageResults = await verifyExports(summaryData.getResults(), apiContext);\n for (const [packagePath, errors] of Object.entries(packageResults)) {\n summaryData.addErrors(packagePath, errors);\n }\n }\n }\n\n const summary = summaryData.summarize(options);\n\n // The feature \"removeUnusedExports\" doesn't (yet) write summary changes, but we still\n // want to write the generated config if that featureFlag is on.\n const hasSummaryChanges = config.features?.removeUnusedExports || summary.totalChanges;\n\n if (!options.check && hasSummaryChanges) {\n // Update the generated config: either write it if there are settings, or delete it if it\n // previously existed but is no longer needed.\n const generatedResult = await writeGeneratedConfig(config.generated, appPath);\n if (generatedResult === 'deleted') {\n summary.deletedGeneratedConfig = true;\n }\n }\n\n return summary;\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Context, TaskRunner } from '@ms-cloudpack/api-server';\nimport type { PackageImporterContext } from '@ms-cloudpack/common-types';\nimport type { AutoDispose } from '../../types/AutoDispose.js';\nimport type { InitOptions } from './types/InitOptions.js';\nimport type { InitSummary } from './types/InitSummary.js';\n\nimport { createPartialApiContext } from '@ms-cloudpack/api-server';\nimport { writeGeneratedConfig } from '@ms-cloudpack/config';\nimport type { InitSummaryData } from './InitSummaryData.js';\nimport { evaluatePath } from './evaluatePath.js';\nimport { verifyExports } from './verifyExports.js';\nimport type { AppCommandContext } from '../../types/CommandAction.js';\nimport path from 'path';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport { runPrerequisites } from '../../utilities/runPrerequisites.js';\nimport { getFilteredPackages } from '../../utilities/getFilteredPackages.js';\nimport { optimizeDependencies } from './optimizeDependencies.js';\nimport { bulletedList } from '@ms-cloudpack/task-reporter';\n\n/**\n * Init execution function.\n */\nexport async function init(parameters: {\n options: InitOptions;\n contexts: AppCommandContext[];\n autoDispose: AutoDispose;\n /**\n * App summary objects, created ahead of time so that a partial summary can be generated\n * if the process is interrupted.\n */\n appSummaries: Record<string, InitSummaryData>;\n}): Promise<InitSummary[]> {\n const { options, contexts, autoDispose, appSummaries } = parameters;\n\n const summaries: InitSummary[] = [];\n\n const taskRunner = new TaskRunner();\n\n for (const appContext of contexts) {\n const summary = await initApp({\n appContext,\n options,\n autoDispose,\n summaryData: appSummaries[appContext.appPath],\n taskRunner,\n isMultiApp: contexts.length > 1,\n });\n summaries.push(summary);\n }\n\n return summaries;\n}\n\nasync function initApp(params: {\n appContext: AppCommandContext;\n options: InitOptions;\n autoDispose: AutoDispose;\n summaryData: InitSummaryData;\n taskRunner: TaskRunner;\n isMultiApp: boolean;\n}): Promise<InitSummary> {\n const { appContext, options, autoDispose, summaryData, taskRunner, isMultiApp } = params;\n const { appPath, config, telemetryClient } = appContext;\n return telemetryClient.tracer.startActiveSpan('INIT_APP', async (span) => {\n // Run prerequisites for the app.\n await runPrerequisites(appContext);\n\n // If --reset is specified, reset the generated config.\n if (options.reset) {\n config.generated = {};\n }\n\n const apiContext: Context = await createPartialApiContext({\n ...appContext,\n items: ['bus', 'taskRunner', 'watcher', 'packages', 'session', 'packageImportPaths', 'packageHashes'],\n taskRunner,\n });\n autoDispose(apiContext);\n const resolveMap = apiContext.session.resolveMap;\n\n // Ensure config.generated.packageSettings is initialized.\n config.generated.packageSettings ??= [];\n\n let isExitingPrematurely = false;\n\n await new Promise<void>((resolve) => {\n let pending = 0;\n const visitedSet = new Set<string>();\n const refreshPaths = new Set<string>();\n const priorityMap = new Map<string, number>();\n\n // Start with the app path or requested matches\n const initialPaths = options.match ? getFilteredPackages(resolveMap, options.match) : [appPath];\n if (!initialPaths.length) {\n summaryData.addErrors(appPath, [{ text: `No packages found matching ${options.match}`, source: 'init' }]);\n resolve();\n }\n\n enqueuePaths(new Map(initialPaths.map((packagePath) => [packagePath, undefined])));\n\n /**\n * Enqueue more paths.\n * @param newPaths Mapping from package path to importer context.\n */\n function enqueuePaths(newPaths: Map<string, PackageImporterContext | undefined>): void {\n if (isExitingPrematurely) {\n return;\n }\n\n // Iterate through the given paths.\n for (const [packagePath, importerContext] of newPaths) {\n if (visitedSet.has(packagePath)) {\n console.debug(`Skipping ${packagePath} as it has already been visited.`);\n continue;\n }\n\n visitedSet.add(packagePath);\n pending++;\n\n const shouldForce = refreshPaths.delete(packagePath);\n\n // Get the priority value for this package path, defaults to 0.\n const priority = priorityMap.get(packagePath) ?? 0;\n // Lower priority of this package path by 1.\n priorityMap.set(packagePath, priority - 1);\n\n // Evaluate this path, but don't await - when we're done, we'll re-enqueue newly discovered paths.\n evaluatePath({\n appPath,\n packagePath,\n importerContext,\n config,\n span,\n resolveMap,\n initOptions: options,\n summaryData,\n ctx: apiContext,\n // No need to force if we're in a multi-app scenario\n // as we'll re-evaluate packages if they are different since we use a different task id.\n shouldForce: !isMultiApp && shouldForce,\n isMultiApp,\n priority,\n })\n .then(({ pathsToEvaluate, pathsToRefresh, shouldExit }) => {\n pending--;\n\n if (shouldExit) {\n isExitingPrematurely = true;\n } else if (pathsToEvaluate?.size) {\n // If there are packages that need to be rebuilt, delete them from the visited set to re-enqueue them\n // and add them to the refresh set so that on re-enqueuing we pass the `shouldRerun` flag through\n // on single app runs.\n pathsToRefresh?.forEach((refreshPath) => {\n refreshPaths.add(refreshPath);\n visitedSet.delete(refreshPath);\n });\n\n // Try to enqueue the new paths.\n console.debug(\n `Enqueuing paths found from ${packagePath}:\\n` +\n bulletedList(\n [...pathsToEvaluate].map(([newPath, newContext]) => `${newPath} ${JSON.stringify(newContext)}`),\n ),\n );\n enqueuePaths(pathsToEvaluate);\n }\n\n // If nothing is pending after this call, we're complete.\n if (!pending) {\n resolve();\n }\n })\n .catch((error) => {\n // Record the exception as an init error for the package.\n // This gives better context than a stack trace which could have come from any package.\n let prefix = 'evaluating package';\n if (importerContext) {\n prefix += ` (context: ${JSON.stringify(importerContext, null, 2).replace(/\\s+/g, ' ')})`;\n }\n summaryData.recordException({ packagePath, error, source: 'init', context: prefix });\n\n // Don't immediately stop evaluation, but don't enqueue more paths.\n isExitingPrematurely = true;\n });\n }\n }\n }).catch((error) => {\n // If there's an error thrown from some other part of the promise besides evaluatePath (not likely),\n // record it as an init error for the app instead of allowing it to propagate.\n // This allows the overall init summary and any other errors to be logged as usual.\n isExitingPrematurely = true;\n summaryData.recordException({ packagePath: appPath, error, source: 'init', context: 'running init' });\n });\n\n // Log the resolve map to a file if requested. Do this *after* the main init process in case\n // any additional deps were discovered and added.\n if (options.logResolveMap) {\n console.log('\\nWriting resolve map to `resolve-map.json`.');\n await writeJson(path.join(appPath, 'resolve-map.json'), resolveMap);\n }\n\n // Only do extra checks if there's not a major error already\n if (!isExitingPrematurely) {\n if (config.features?.optimizeDependencies) {\n // Conditionally scan dependency usage so that we can populate\n // include/excludeDependencies automatically, ensuring the dep list\n // is both minimal (remove unused deps) and complete (include\n // specific devDeps.)\n const excludedDependenciesChanges = await optimizeDependencies(summaryData.getResults(), apiContext);\n summaryData.recordGeneratedChanges(excludedDependenciesChanges);\n }\n\n if (config.features?.verifyExports) {\n const packageResults = await verifyExports(summaryData.getResults(), apiContext);\n for (const [packagePath, errors] of Object.entries(packageResults)) {\n summaryData.addErrors(packagePath, errors);\n }\n }\n }\n\n const summary = summaryData.summarize(options);\n\n // The feature \"removeUnusedExports\" doesn't (yet) write summary changes, but we still\n // want to write the generated config if that featureFlag is on.\n const hasSummaryChanges = config.features?.removeUnusedExports || summary.totalChanges;\n\n if (!options.check && hasSummaryChanges) {\n // Update the generated config: either write it if there are settings, or delete it if it\n // previously existed but is no longer needed.\n const generatedResult = await writeGeneratedConfig(config.generated, appPath);\n if (generatedResult === 'deleted') {\n summary.deletedGeneratedConfig = true;\n }\n }\n\n return summary;\n });\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type RequiredGeneratedChangeType = 'changed-export' | 'added-export' | 'added-dynamic-import' | 'included-dependency-required';
|
|
2
|
+
export type GeneratedChangeType = RequiredGeneratedChangeType | 'included-dependency-optional' | 'excluded-dependency' | 'removed-excluded-dependency';
|
|
2
3
|
export interface GeneratedChange {
|
|
3
4
|
type: GeneratedChangeType;
|
|
4
5
|
/** Item that changed, such as the dependency name, export path, or bundler type */
|
|
@@ -6,5 +7,9 @@ export interface GeneratedChange {
|
|
|
6
7
|
/** Additional explanation */
|
|
7
8
|
reason?: string;
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Mapping of required change types to true.
|
|
12
|
+
* (Keys for non-required change types will be undefined.)
|
|
13
|
+
*/
|
|
14
|
+
export declare const requiredChangeTypes: Partial<Record<GeneratedChangeType, true>>;
|
|
10
15
|
//# sourceMappingURL=GeneratedChange.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeneratedChange.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/GeneratedChange.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"GeneratedChange.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/GeneratedChange.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,2BAA2B,GACnC,gBAAgB,GAChB,cAAc,GACd,sBAAsB,GACtB,8BAA8B,CAAC;AAEnC,MAAM,MAAM,mBAAmB,GAC3B,2BAA2B,GAC3B,8BAA8B,GAC9B,qBAAqB,GACrB,6BAA6B,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AAGH,eAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAKtB,CAAC"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Mapping of required change types to true.
|
|
3
|
+
* (Keys for non-required change types will be undefined.)
|
|
4
|
+
*/
|
|
5
|
+
// It's easier to ensure this stays up to date by using an object rather than an array.
|
|
6
|
+
// Any GeneratedChangeType is allowed as a lookup key to make usage easier.
|
|
7
|
+
export const requiredChangeTypes = {
|
|
8
|
+
'changed-export': true,
|
|
9
|
+
'added-export': true,
|
|
10
|
+
'added-dynamic-import': true,
|
|
11
|
+
'included-dependency-required': true,
|
|
12
|
+
};
|
|
7
13
|
//# sourceMappingURL=GeneratedChange.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeneratedChange.js","sourceRoot":"","sources":["../../../../src/commands/init/types/GeneratedChange.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GeneratedChange.js","sourceRoot":"","sources":["../../../../src/commands/init/types/GeneratedChange.ts"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,uFAAuF;AACvF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAA+C;IAC7E,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,IAAI;IACpB,sBAAsB,EAAE,IAAI;IAC5B,8BAA8B,EAAE,IAAI;CACe,CAAC","sourcesContent":["export type RequiredGeneratedChangeType =\n | 'changed-export'\n | 'added-export'\n | 'added-dynamic-import'\n | 'included-dependency-required';\n\nexport type GeneratedChangeType =\n | RequiredGeneratedChangeType\n | 'included-dependency-optional'\n | 'excluded-dependency'\n | 'removed-excluded-dependency';\n\nexport interface GeneratedChange {\n type: GeneratedChangeType;\n /** Item that changed, such as the dependency name, export path, or bundler type */\n change: string;\n /** Additional explanation */\n reason?: string;\n}\n\n/**\n * Mapping of required change types to true.\n * (Keys for non-required change types will be undefined.)\n */\n// It's easier to ensure this stays up to date by using an object rather than an array.\n// Any GeneratedChangeType is allowed as a lookup key to make usage easier.\nexport const requiredChangeTypes: Partial<Record<GeneratedChangeType, true>> = {\n 'changed-export': true,\n 'added-export': true,\n 'added-dynamic-import': true,\n 'included-dependency-required': true,\n} satisfies Record<RequiredGeneratedChangeType, true>;\n"]}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ReusedOptions } from '../../../types/ReusedOptions.js';
|
|
2
2
|
/**
|
|
3
3
|
* Defines the options for the "init" command.
|
|
4
4
|
*/
|
|
5
|
-
export interface InitOptions {
|
|
6
|
-
/** Writes the resolve map to `resolve-map.json`. */
|
|
7
|
-
logResolveMap?: boolean;
|
|
5
|
+
export interface InitOptions extends Pick<ReusedOptions, 'cache' | 'logBundleInfo' | 'logResolveMap' | 'match'> {
|
|
8
6
|
/**
|
|
9
7
|
* Ignore the previous generated config.
|
|
10
8
|
*/
|
|
@@ -13,11 +11,5 @@ export interface InitOptions {
|
|
|
13
11
|
* Fail if updates to the generated config are required.
|
|
14
12
|
*/
|
|
15
13
|
check?: boolean;
|
|
16
|
-
/**
|
|
17
|
-
* Only evaluate specific package(s).
|
|
18
|
-
*/
|
|
19
|
-
match?: PackageSettingsMatch[];
|
|
20
|
-
/** Whether to use the cache */
|
|
21
|
-
cache?: boolean;
|
|
22
14
|
}
|
|
23
15
|
//# sourceMappingURL=InitOptions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitOptions.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"InitOptions.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,eAAe,GAAG,eAAe,GAAG,OAAO,CAAC;IAC7G;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitOptions.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitOptions.ts"],"names":[],"mappings":"","sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"InitOptions.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitOptions.ts"],"names":[],"mappings":"","sourcesContent":["import type { ReusedOptions } from '../../../types/ReusedOptions.js';\n\n/**\n * Defines the options for the \"init\" command.\n */\nexport interface InitOptions extends Pick<ReusedOptions, 'cache' | 'logBundleInfo' | 'logResolveMap' | 'match'> {\n /**\n * Ignore the previous generated config.\n */\n reset?: boolean;\n\n /**\n * Fail if updates to the generated config are required.\n */\n check?: boolean;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BundleMessage } from '@ms-cloudpack/common-types';
|
|
1
|
+
import type { BundleMessage, WithRequired } from '@ms-cloudpack/common-types';
|
|
2
2
|
import type { InitPackageIdentifier } from './InitPackageIdentifier.js';
|
|
3
3
|
import type { BundleInfo } from '@ms-cloudpack/api-server';
|
|
4
4
|
export interface InitPackageResult extends InitPackageIdentifier {
|
|
@@ -8,4 +8,6 @@ export interface InitPackageResult extends InitPackageIdentifier {
|
|
|
8
8
|
/** Absolute path for the bundle output */
|
|
9
9
|
outputPath?: string;
|
|
10
10
|
}
|
|
11
|
+
export type InitPackageResultWarnings = WithRequired<InitPackageResult, 'warnings'>;
|
|
12
|
+
export type InitPackageResultErrors = InitPackageResult & Required<Pick<InitPackageResult, 'errors'>>;
|
|
11
13
|
//# sourceMappingURL=InitPackageResult.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitPackageResult.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitPackageResult.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"InitPackageResult.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitPackageResult.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,yBAAyB,GAAG,YAAY,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;AACpF,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitPackageResult.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitPackageResult.ts"],"names":[],"mappings":"","sourcesContent":["import type { BundleMessage } from '@ms-cloudpack/common-types';\nimport type { InitPackageIdentifier } from './InitPackageIdentifier.js';\nimport type { BundleInfo } from '@ms-cloudpack/api-server';\n\nexport interface InitPackageResult extends InitPackageIdentifier {\n errors?: BundleMessage[];\n warnings?: BundleMessage[];\n info?: BundleInfo;\n /** Absolute path for the bundle output */\n outputPath?: string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"InitPackageResult.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitPackageResult.ts"],"names":[],"mappings":"","sourcesContent":["import type { BundleMessage, WithRequired } from '@ms-cloudpack/common-types';\nimport type { InitPackageIdentifier } from './InitPackageIdentifier.js';\nimport type { BundleInfo } from '@ms-cloudpack/api-server';\n\nexport interface InitPackageResult extends InitPackageIdentifier {\n errors?: BundleMessage[];\n warnings?: BundleMessage[];\n info?: BundleInfo;\n /** Absolute path for the bundle output */\n outputPath?: string;\n}\n\nexport type InitPackageResultWarnings = WithRequired<InitPackageResult, 'warnings'>;\nexport type InitPackageResultErrors = InitPackageResult & Required<Pick<InitPackageResult, 'errors'>>;\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { InitPackageResultErrors } from './InitPackageResultErrors.js';
|
|
2
|
-
import type { InitPackageResultWarnings } from './InitPackageResultWarnings.js';
|
|
3
1
|
import type { GeneratedPackageChanges } from './GeneratedPackageChanges.js';
|
|
2
|
+
import type { InitPackageResultErrors, InitPackageResultWarnings } from './InitPackageResult.js';
|
|
4
3
|
export interface InitSummary {
|
|
5
4
|
appPath: string;
|
|
6
5
|
duration: number;
|
|
@@ -10,8 +9,9 @@ export interface InitSummary {
|
|
|
10
9
|
totalWarnings: number;
|
|
11
10
|
/** Total number of changes made to the generated config */
|
|
12
11
|
totalChanges: number;
|
|
13
|
-
/**
|
|
14
|
-
*
|
|
12
|
+
/**
|
|
13
|
+
* Total number of required changes made to the generated config.
|
|
14
|
+
* This will cause `init --check` to fail if it's not 0.
|
|
15
15
|
*/
|
|
16
16
|
totalRequiredChanges: number;
|
|
17
17
|
failed: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitSummary.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"InitSummary.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/types/InitSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEjG,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,6FAA6F;IAC7F,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC,oBAAoB,EAAE,uBAAuB,EAAE,CAAC;IAChD,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;IAC9C,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;CACnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitSummary.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitSummary.ts"],"names":[],"mappings":"","sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"InitSummary.js","sourceRoot":"","sources":["../../../../src/commands/init/types/InitSummary.ts"],"names":[],"mappings":"","sourcesContent":["import type { GeneratedPackageChanges } from './GeneratedPackageChanges.js';\nimport type { InitPackageResultErrors, InitPackageResultWarnings } from './InitPackageResult.js';\n\nexport interface InitSummary {\n appPath: string;\n duration: number;\n totalPackages: number;\n totalSuccess: number;\n totalErrors: number;\n totalWarnings: number;\n /** Total number of changes made to the generated config */\n totalChanges: number;\n /**\n * Total number of required changes made to the generated config.\n * This will cause `init --check` to fail if it's not 0.\n */\n totalRequiredChanges: number;\n failed: boolean;\n /** If true, the generated config previously existed but is now not needed and was deleted */\n deletedGeneratedConfig?: boolean;\n\n generatedFileUpdates: GeneratedPackageChanges[];\n packagesWithErrors: InitPackageResultErrors[];\n packagesWithWarnings: InitPackageResultWarnings[];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyExports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,
|
|
1
|
+
{"version":3,"file":"verifyExports.d.ts","sourceRoot":"","sources":["../../../src/commands/init/verifyExports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EAKxB,MAAM,4BAA4B,CAAC;AAQpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAMtE;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACjD,OAAO,EAAE;IACP,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB,GACA,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CA+K1C"}
|