@ms-cloudpack/cli 0.31.6 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commands/init/evaluateImportsForOverrides.d.ts +4 -1
- package/lib/commands/init/evaluateImportsForOverrides.js +8 -3
- package/lib/commands/init/evaluateImportsForOverrides.js.map +1 -1
- package/lib/commands/init/evaluateImportsForOverrides.test.js +67 -0
- package/lib/commands/init/evaluateImportsForOverrides.test.js.map +1 -0
- package/lib/commands/init/index.js +1 -1
- package/lib/commands/init/index.js.map +1 -1
- package/lib/commands/init/init.js +10 -5
- package/lib/commands/init/init.js.map +1 -1
- package/lib/commands/init/init.test.js +1 -1
- package/lib/commands/init/init.test.js.map +1 -1
- package/lib/commands/start/appServer/createRoutes.d.ts +3 -1
- package/lib/commands/start/appServer/createRoutes.js.map +1 -1
- package/lib/commands/start/appServer/setHeaders.d.ts +2 -1
- package/lib/commands/start/appServer/setHeaders.js.map +1 -1
- package/lib/commands/start/appServer/startAppServer.d.ts +3 -1
- package/lib/commands/start/appServer/startAppServer.js.map +1 -1
- package/lib/commands/start/createBundleTask.d.ts +2 -1
- package/lib/commands/start/createBundleTask.js.map +1 -1
- package/lib/commands/start/start.js +4 -4
- package/lib/commands/start/start.js.map +1 -1
- package/lib/commands/start/startBundleServer.d.ts +3 -1
- package/lib/commands/start/startBundleServer.js.map +1 -1
- package/lib/common/createPackageOverrideTransform.d.ts +1 -1
- package/lib/common/createPackageOverrideTransform.js.map +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js.map +1 -1
- package/lib/initTelemetry.js +1 -1
- package/lib/initTelemetry.js.map +1 -1
- package/lib/types.d.ts +3 -135
- package/lib/types.js.map +1 -1
- package/package.json +6 -4
- package/lib/commands/start/TaskRunner.d.ts +0 -40
- package/lib/commands/start/TaskRunner.js +0 -119
- package/lib/commands/start/TaskRunner.js.map +0 -1
- package/lib/commands/start/addOverride.d.ts +0 -7
- package/lib/commands/start/addOverride.js +0 -63
- package/lib/commands/start/addOverride.js.map +0 -1
- package/lib/commands/start/addOverride.test.js +0 -254
- package/lib/commands/start/addOverride.test.js.map +0 -1
- package/lib/commands/start/startApiServer.d.ts +0 -19
- package/lib/commands/start/startApiServer.js +0 -303
- package/lib/commands/start/startApiServer.js.map +0 -1
- package/lib/commands/start/startWatcher.d.ts +0 -7
- package/lib/commands/start/startWatcher.js +0 -51
- package/lib/commands/start/startWatcher.js.map +0 -1
- package/lib/commands/start/taskRunner.test.d.ts +0 -1
- package/lib/commands/start/taskRunner.test.js +0 -80
- package/lib/commands/start/taskRunner.test.js.map +0 -1
- package/lib/commands/start/validateOverride.d.ts +0 -7
- package/lib/commands/start/validateOverride.js +0 -28
- package/lib/commands/start/validateOverride.js.map +0 -1
- package/lib/commands/start/validateOverride.test.d.ts +0 -1
- package/lib/commands/start/validateOverride.test.js +0 -137
- package/lib/commands/start/validateOverride.test.js.map +0 -1
- package/lib/common/config.d.ts +0 -31
- package/lib/common/config.js +0 -54
- package/lib/common/config.js.map +0 -1
- package/lib/common/configTemplate.d.ts +0 -13
- package/lib/common/configTemplate.js +0 -16
- package/lib/common/configTemplate.js.map +0 -1
- /package/lib/commands/{start/addOverride.test.d.ts → init/evaluateImportsForOverrides.test.d.ts} +0 -0
|
@@ -8,17 +8,22 @@ export async function evaluateImportsForOverrides(options) {
|
|
|
8
8
|
const { packages, imports, definition, packageOverrides, packagePathsToEvaluate, evaluatedPackages, resolveMap } = options;
|
|
9
9
|
const displayName = `${definition.name}@${definition.version}`;
|
|
10
10
|
let changeCount = 0;
|
|
11
|
+
const errors = [];
|
|
11
12
|
// Iterate through imports and find their path from the resolve map.
|
|
12
13
|
for (const [dependencyName, dependencyImportPaths] of imports.entries()) {
|
|
13
14
|
const resolveEntry = findResolveMapEntry({ definition, packageName: dependencyName, resolveMap });
|
|
14
15
|
if (!resolveEntry) {
|
|
15
|
-
|
|
16
|
+
const errorMessage = `Package "${displayName}" depends on "${dependencyName}" but it was not found in the resolve map. Ensure that "${dependencyName}" listed in dependencies of ${displayName}.`;
|
|
17
|
+
console.error(errorMessage);
|
|
18
|
+
errors.push(errorMessage);
|
|
16
19
|
continue;
|
|
17
20
|
}
|
|
18
21
|
// Load the dependency definition.
|
|
19
22
|
const dependencyDefinition = await packages.get(resolveEntry.path);
|
|
20
23
|
if (!dependencyDefinition) {
|
|
21
|
-
|
|
24
|
+
const errorMessage = `Package "${displayName}" depends on "${dependencyName}" at "${resolveEntry.path}" but its definition couldn't be loaded.`;
|
|
25
|
+
console.error(errorMessage);
|
|
26
|
+
errors.push(errorMessage);
|
|
22
27
|
continue;
|
|
23
28
|
}
|
|
24
29
|
// Make sure to add the package to the list of packages to evaluate.
|
|
@@ -50,6 +55,6 @@ export async function evaluateImportsForOverrides(options) {
|
|
|
50
55
|
}
|
|
51
56
|
}
|
|
52
57
|
}
|
|
53
|
-
return changeCount;
|
|
58
|
+
return { changeCount, errors };
|
|
54
59
|
}
|
|
55
60
|
//# sourceMappingURL=evaluateImportsForOverrides.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluateImportsForOverrides.js","sourceRoot":"","sources":["../../../src/commands/init/evaluateImportsForOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAKrE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OASjD;IACC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAC9G,OAAO,CAAC;IACV,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;IAC/D,IAAI,WAAW,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluateImportsForOverrides.js","sourceRoot":"","sources":["../../../src/commands/init/evaluateImportsForOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAKrE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OASjD;IACC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAC9G,OAAO,CAAC;IACV,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;IAC/D,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,oEAAoE;IACpE,KAAK,MAAM,CAAC,cAAc,EAAE,qBAAqB,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE;QACvE,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;QAElG,IAAI,CAAC,YAAY,EAAE;YACjB,MAAM,YAAY,GAAG,YAAY,WAAW,iBAAiB,cAAc,2DAA2D,cAAc,+BAA+B,WAAW,GAAG,CAAC;YAClM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE1B,SAAS;SACV;QAED,kCAAkC;QAClC,MAAM,oBAAoB,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnE,IAAI,CAAC,oBAAoB,EAAE;YACzB,MAAM,YAAY,GAAG,YAAY,WAAW,iBAAiB,cAAc,SAAS,YAAY,CAAC,IAAI,0CAA0C,CAAC;YAChJ,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE1B,SAAS;SACV;QAED,oEAAoE;QACpE,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE9C,mIAAmI;QACnI,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAEpD,KAAK,MAAM,oBAAoB,IAAI,qBAAqB,EAAE;YACxD,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE;gBAC3C,sBAAsB,CAAC;oBACrB,gBAAgB;oBAChB,UAAU;oBACV,oBAAoB;oBACpB,OAAO;oBACP,UAAU,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC;iBAClD,CAAC,CAAC;gBAEH,MAAM,kBAAkB,CAAC;oBACvB,OAAO;oBACP,QAAQ;oBACR,WAAW,EAAE,YAAY,CAAC,IAAI;oBAC9B,UAAU,EAAE,oBAAoB;iBACjC,CAAC,CAAC;gBAEH,yEAAyE;gBACzE,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAEjB,WAAW,EAAE,CAAC;gBAEd,4FAA4F;gBAC5F,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC9C,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aAC7C;SACF;KACF;IAED,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC","sourcesContent":["import {\n flattenExportsMap,\n addExportsMapEntry,\n getExportsMap,\n findResolveMapEntry,\n isExternalPackage,\n} from '@ms-cloudpack/package-utilities';\nimport { preparePackageOverride } from './preparePackageOverride.js';\nimport type { PackageJson, PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { ResolveMap } from '@ms-cloudpack/package-utilities';\nimport type { PackageOverride } from '../../types.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 to the given packageOverrides array.\n */\nexport async function evaluateImportsForOverrides(options: {\n packages: PackageDefinitionsCache;\n packagePath: string;\n imports: Map<string, Set<string>>;\n definition: PackageJson;\n packageOverrides: PackageOverride[];\n packagePathsToEvaluate: Set<string>;\n evaluatedPackages: Set<string>;\n resolveMap: ResolveMap;\n}): Promise<{ changeCount: number; errors: string[] }> {\n const { packages, imports, definition, packageOverrides, packagePathsToEvaluate, evaluatedPackages, resolveMap } =\n options;\n const displayName = `${definition.name}@${definition.version}`;\n let changeCount = 0;\n const errors: string[] = [];\n\n // Iterate through imports and find their path from the resolve map.\n for (const [dependencyName, dependencyImportPaths] of imports.entries()) {\n const resolveEntry = findResolveMapEntry({ definition, packageName: dependencyName, resolveMap });\n\n if (!resolveEntry) {\n const errorMessage = `Package \"${displayName}\" depends on \"${dependencyName}\" but it was not found in the resolve map. Ensure that \"${dependencyName}\" listed in dependencies of ${displayName}.`;\n console.error(errorMessage);\n errors.push(errorMessage);\n\n continue;\n }\n\n // Load the dependency definition.\n const dependencyDefinition = await packages.get(resolveEntry.path);\n\n if (!dependencyDefinition) {\n const errorMessage = `Package \"${displayName}\" depends on \"${dependencyName}\" at \"${resolveEntry.path}\" but its definition couldn't be loaded.`;\n console.error(errorMessage);\n errors.push(errorMessage);\n\n continue;\n }\n\n // Make sure to add the package to the list of packages to evaluate.\n packagePathsToEvaluate.add(resolveEntry.path);\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(resolveEntry.path, { packages });\n const flattenedExports = flattenExportsMap(exports);\n\n for (const dependencyImportPath of dependencyImportPaths) {\n if (!flattenedExports[dependencyImportPath]) {\n preparePackageOverride({\n packageOverrides,\n definition,\n dependencyDefinition,\n exports,\n isInternal: !isExternalPackage(resolveEntry.path),\n });\n\n await addExportsMapEntry({\n exports,\n packages,\n packagePath: resolveEntry.path,\n importPath: dependencyImportPath,\n });\n\n // Clear cache when we've mutated an override. Transforms need to re-run.\n packages.clear();\n\n changeCount++;\n\n // Since we've found a missing exports, we need to re-enqueue the dependency for evaluation.\n packagePathsToEvaluate.add(resolveEntry.path);\n evaluatedPackages.delete(resolveEntry.path);\n }\n }\n }\n\n return { changeCount, errors };\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { afterAll, afterEach, beforeAll, describe, expect, it, jest } from '@jest/globals';
|
|
2
|
+
import { PackageDefinitions } from '@ms-cloudpack/package-utilities';
|
|
3
|
+
import { evaluateImportsForOverrides } from './evaluateImportsForOverrides.js';
|
|
4
|
+
describe('evaluateImportsForOverrides', () => {
|
|
5
|
+
beforeAll(() => {
|
|
6
|
+
jest.spyOn(console, 'error').mockImplementation(() => {
|
|
7
|
+
// Disabling console.error to keep jest logs clean.
|
|
8
|
+
// This will also be used in the assertions to ensure that the errors are logged.
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
afterAll(() => {
|
|
12
|
+
console.error.mockRestore();
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
console.error.mockClear();
|
|
16
|
+
});
|
|
17
|
+
it('should error out when dependency was not found in the resolve map', async () => {
|
|
18
|
+
const imports = new Map();
|
|
19
|
+
imports.set('exampleDependencyName', new Set(['exampleImportPath']));
|
|
20
|
+
const result = await evaluateImportsForOverrides({
|
|
21
|
+
definition: {
|
|
22
|
+
name: 'test',
|
|
23
|
+
version: '1.0.0',
|
|
24
|
+
},
|
|
25
|
+
evaluatedPackages: new Set(),
|
|
26
|
+
imports,
|
|
27
|
+
packageOverrides: [],
|
|
28
|
+
packagePathsToEvaluate: new Set(),
|
|
29
|
+
packages: new PackageDefinitions(),
|
|
30
|
+
resolveMap: {},
|
|
31
|
+
packagePath: '',
|
|
32
|
+
});
|
|
33
|
+
expect(console.error).toHaveBeenCalledTimes(1);
|
|
34
|
+
expect(result.changeCount).toBe(0);
|
|
35
|
+
expect(result.errors.length).toEqual(1);
|
|
36
|
+
});
|
|
37
|
+
it('should error out when definition of a dependency could not be loaded', async () => {
|
|
38
|
+
const imports = new Map();
|
|
39
|
+
imports.set('a', new Set(['b']));
|
|
40
|
+
const result = await evaluateImportsForOverrides({
|
|
41
|
+
definition: {
|
|
42
|
+
name: 'test',
|
|
43
|
+
version: '1.0.0',
|
|
44
|
+
},
|
|
45
|
+
evaluatedPackages: new Set(),
|
|
46
|
+
imports,
|
|
47
|
+
packageOverrides: [],
|
|
48
|
+
packagePathsToEvaluate: new Set(),
|
|
49
|
+
packages: new PackageDefinitions(),
|
|
50
|
+
resolveMap: {
|
|
51
|
+
a: {
|
|
52
|
+
version: '1.0.0',
|
|
53
|
+
name: 'a',
|
|
54
|
+
requiredBy: {
|
|
55
|
+
test: '1.0.0',
|
|
56
|
+
},
|
|
57
|
+
path: 'path',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
packagePath: '',
|
|
61
|
+
});
|
|
62
|
+
expect(result.changeCount).toBe(0);
|
|
63
|
+
expect(result.errors.length).toEqual(1);
|
|
64
|
+
expect(console.error).toHaveBeenCalledTimes(1);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=evaluateImportsForOverrides.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluateImportsForOverrides.test.js","sourceRoot":"","sources":["../../../src/commands/init/evaluateImportsForOverrides.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterAll, afterEach, beforeAll, describe, expect, it, jest } from '@jest/globals';\nimport { PackageDefinitions } from '@ms-cloudpack/package-utilities';\nimport { evaluateImportsForOverrides } from './evaluateImportsForOverrides.js';\n\ntype MockErrorFn = jest.MockedFunction<typeof console.error>;\n\ndescribe('evaluateImportsForOverrides', () => {\n beforeAll(() => {\n jest.spyOn(console, 'error').mockImplementation(() => {\n // Disabling console.error to keep jest logs clean.\n // This will also be used in the assertions to ensure that the errors are logged.\n });\n });\n\n afterAll(() => {\n (console.error as MockErrorFn).mockRestore();\n });\n\n afterEach(() => {\n (console.error as MockErrorFn).mockClear();\n });\n\n it('should error out when dependency was not found in the resolve map', async () => {\n const imports = new Map<string, Set<string>>();\n imports.set('exampleDependencyName', new Set<string>(['exampleImportPath']));\n\n const result = await evaluateImportsForOverrides({\n definition: {\n name: 'test',\n version: '1.0.0',\n },\n evaluatedPackages: new Set<string>(),\n imports,\n packageOverrides: [],\n packagePathsToEvaluate: new Set<string>(),\n packages: new PackageDefinitions(),\n resolveMap: {},\n packagePath: '',\n });\n\n expect(console.error).toHaveBeenCalledTimes(1);\n expect(result.changeCount).toBe(0);\n expect(result.errors.length).toEqual(1);\n });\n\n it('should error out when definition of a dependency could not be loaded', async () => {\n const imports = new Map<string, Set<string>>();\n imports.set('a', new Set<string>(['b']));\n\n const result = await evaluateImportsForOverrides({\n definition: {\n name: 'test',\n version: '1.0.0',\n },\n evaluatedPackages: new Set<string>(),\n imports,\n packageOverrides: [],\n packagePathsToEvaluate: new Set<string>(),\n packages: new PackageDefinitions(),\n resolveMap: {\n a: {\n version: '1.0.0',\n name: 'a',\n requiredBy: {\n test: '1.0.0',\n },\n path: 'path',\n },\n },\n packagePath: '',\n });\n\n expect(result.changeCount).toBe(0);\n expect(result.errors.length).toEqual(1);\n expect(console.error).toHaveBeenCalledTimes(1);\n });\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { reporter } from '../../reporter.js';
|
|
2
2
|
import { red } from '@ms-cloudpack/task-reporter';
|
|
3
|
-
import { configFileName } from '
|
|
3
|
+
import { configFileName } from '@ms-cloudpack/config';
|
|
4
4
|
import { stopTelemetry } from '../../initTelemetry.js';
|
|
5
5
|
/* Defines the "init" verb. */
|
|
6
6
|
export function init(command) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,8BAA8B;AAC9B,MAAM,UAAU,IAAI,CAAC,OAAgB;IACnC,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,sIAAsI,CACvI;SACA,MAAM,CAAC,OAAO,EAAE,8DAA8D,CAAC;SAC/E,MAAM,CAAC,SAAS,EAAE,0DAA0D,CAAC;SAC7E,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAE3C,IAAI,cAAkC,CAAC;QACvC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI;YACF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YAE5C,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE;gBACxB,SAAS,GAAG,IAAI,CAAC;gBACjB,cAAc,GAAG,oBAAoB,CAAC;aACvC;iBAAM;gBACL,cAAc,GAAG,WAAW;oBAC1B,CAAC,CAAC,YAAY,cAAc,UAAU,WAAW,aAAa;oBAC9D,CAAC,CAAC,qCAAqC,CAAC;aAC3C;SACF;QAAC,OAAO,KAAK,EAAE;YACd,SAAS,GAAG,IAAI,CAAC;YACjB,cAAc,GAAG,qBAAsB,KAAe,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;SAC/E;QAED,MAAM,aAAa,EAAE,CAAC;QACtB,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAEpE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from 'commander';\nimport type { InitOptions } from './types.js';\nimport { reporter } from '../../reporter.js';\nimport { red } from '@ms-cloudpack/task-reporter';\nimport { configFileName } from '@ms-cloudpack/config';\nimport { stopTelemetry } from '../../initTelemetry.js';\n\n/* Defines the \"init\" verb. */\nexport function init(command: Command) {\n command\n .command('init')\n .description(\n 'Initializes a given app project and defines the necessary configuration overrides to make an existing app compatible with Cloudpack.',\n )\n .option('--fix', 'Applies fixes to all identified issues in internal packages.')\n .option('--reset', 'Ignores existing overrides when determining all entries.')\n .option('--check', 'Fails if any package exports are missing.')\n .action(async (options: InitOptions) => {\n const { init } = await import('./init.js');\n\n let completeReason: string | undefined;\n let hasErrors = false;\n try {\n const { changeCount } = await init(options);\n\n if (reporter.hasErrors()) {\n hasErrors = true;\n completeReason = 'Some tasks failed.';\n } else {\n completeReason = changeCount\n ? `Updated \"${configFileName}\" with ${changeCount} change(s).`\n : 'Looks good, no changes required. :)';\n }\n } catch (error) {\n hasErrors = true;\n completeReason = `Unexpected error: ${(error as Error).message || '<Error>'}`;\n }\n\n await stopTelemetry();\n reporter.complete(hasErrors ? red(completeReason) : completeReason);\n\n process.exit(hasErrors ? 1 : 0);\n });\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PackageDefinitions } from '@ms-cloudpack/package-utilities';
|
|
2
2
|
import { createPackageOverrideTransform } from '../../common/createPackageOverrideTransform.js';
|
|
3
|
-
import { configFileName, readConfig, writeConfig } from '
|
|
3
|
+
import { configFileName, readConfig, writeConfig } from '@ms-cloudpack/config';
|
|
4
4
|
import { resolveDependenciesTask } from '../../tasks/resolveDependenciesTask.js';
|
|
5
5
|
import { evaluateImportsForOverrides } from './evaluateImportsForOverrides.js';
|
|
6
6
|
import { getImportsFromBundle } from './getImportsFromBundle.js';
|
|
@@ -50,7 +50,7 @@ export async function init(options) {
|
|
|
50
50
|
continue;
|
|
51
51
|
}
|
|
52
52
|
// Given the package imports, find the missing exports maps and update packageOverrides.
|
|
53
|
-
|
|
53
|
+
const result = await evaluateImportsForOverrides({
|
|
54
54
|
definition,
|
|
55
55
|
packages,
|
|
56
56
|
packagePath,
|
|
@@ -60,10 +60,15 @@ export async function init(options) {
|
|
|
60
60
|
packageOverrides,
|
|
61
61
|
resolveMap,
|
|
62
62
|
});
|
|
63
|
-
if (options.check && changeCount
|
|
64
|
-
rootSpan?.addEvent('INIT_CHECK_FAILED'
|
|
65
|
-
|
|
63
|
+
if (options.check && (result.changeCount || result.errors.length)) {
|
|
64
|
+
rootSpan?.addEvent('INIT_CHECK_FAILED', {
|
|
65
|
+
reason: result.changeCount ? 'Config needs to be updated.' : result.errors,
|
|
66
|
+
});
|
|
67
|
+
throw Error(result.changeCount
|
|
68
|
+
? 'Run "cloudpack init --reset" to update the config.'
|
|
69
|
+
: result.errors.map((e) => e).join('\n'));
|
|
66
70
|
}
|
|
71
|
+
changeCount += result.changeCount;
|
|
67
72
|
}
|
|
68
73
|
if (options.fix) {
|
|
69
74
|
await patchAllInternalPackageExports({ resolveMap, packageOverrides });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,8BAA8B,EAAE,MAAM,gDAAgD,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":"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","sourcesContent":["import { PackageDefinitions, type ResolveMap } from '@ms-cloudpack/package-utilities';\nimport { createPackageOverrideTransform } from '../../common/createPackageOverrideTransform.js';\nimport { configFileName, readConfig, writeConfig } from '@ms-cloudpack/config';\nimport { resolveDependenciesTask } from '../../tasks/resolveDependenciesTask.js';\nimport type { PackageOverride } from '../../types.js';\nimport type { CloudpackConfig } from '@ms-cloudpack/config';\nimport { evaluateImportsForOverrides } from './evaluateImportsForOverrides.js';\nimport { getImportsFromBundle } from './getImportsFromBundle.js';\nimport { patchAllInternalPackageExports } from './patchAllInternalPackageExports.js';\nimport type { InitOptions } from './types.js';\nimport { rootSpan } from '../../initTelemetry.js';\n\n/** Given the path, updates the Cloudpack config with overrides and project settings. */\nexport async function init(options: InitOptions): Promise<{ changeCount: number }> {\n if (options.check && options.fix) {\n throw Error('Cannot use --check and --fix together.');\n }\n\n if (options.check && options.reset) {\n throw Error('Cannot use --check and --reset together.');\n }\n\n const appPath = options.cwd || process.cwd();\n const config = await readConfig(appPath);\n const packageOverrides: PackageOverride[] = (!options.reset && config.packageOverrides) || [];\n const packages = new PackageDefinitions();\n\n packages.registerTransform(createPackageOverrideTransform({ packageOverrides }));\n\n // Try to resolve dependencies.\n const resolveMap = (await resolveDependenciesTask({ appPath, packages })) as ResolveMap;\n\n if (!resolveMap) {\n throw new Error(\"Couldn't resolve dependencies.\");\n }\n\n const packagePathsToEvaluate = new Set<string>([appPath]);\n const evaluatedPackages = new Set<string>();\n let changeCount = 0;\n\n while (packagePathsToEvaluate.size) {\n const packagePath = packagePathsToEvaluate.values().next().value as string;\n\n packagePathsToEvaluate.delete(packagePath);\n\n // Skip already-visited packages.\n if (!packagePath || evaluatedPackages.has(packagePath)) {\n continue;\n }\n\n evaluatedPackages.add(packagePath);\n\n const definition = await packages.get(packagePath, { refresh: true });\n\n if (!definition) {\n continue;\n }\n\n // Bundle the package and find the imports it depends on.\n const imports = await getImportsFromBundle({\n packagePath,\n definition,\n packages,\n });\n\n if (!imports) {\n console.info(`Skipping ${packagePath} evaluation due to no imports returned.`);\n continue;\n }\n\n // Given the package imports, find the missing exports maps and update packageOverrides.\n const result = await evaluateImportsForOverrides({\n definition,\n packages,\n packagePath,\n packagePathsToEvaluate,\n evaluatedPackages,\n imports,\n packageOverrides,\n resolveMap,\n });\n\n if (options.check && (result.changeCount || result.errors.length)) {\n rootSpan?.addEvent('INIT_CHECK_FAILED', {\n reason: result.changeCount ? 'Config needs to be updated.' : result.errors,\n });\n throw Error(\n result.changeCount\n ? 'Run \"cloudpack init --reset\" to update the config.'\n : result.errors.map((e) => e).join('\\n'),\n );\n }\n\n changeCount += result.changeCount;\n }\n\n if (options.fix) {\n await patchAllInternalPackageExports({ resolveMap, packageOverrides });\n }\n\n if (changeCount) {\n // Log the results to a file.\n console.log(`Writing results to ${configFileName}...`);\n\n const updatedConfig: CloudpackConfig = {\n ...config,\n ...(packageOverrides.length ? { packageOverrides } : {}),\n };\n await writeConfig(updatedConfig, appPath);\n }\n\n return {\n changeCount,\n };\n}\n"]}
|
|
@@ -7,7 +7,7 @@ import { readJson } from '@ms-cloudpack/json-utilities';
|
|
|
7
7
|
import { createTestFileStructure } from '@ms-cloudpack/test-utilities';
|
|
8
8
|
import { noLoggingConfig } from '@ms-cloudpack/task-reporter';
|
|
9
9
|
import { reporter } from '../../reporter.js';
|
|
10
|
-
import { getConfigPath, readConfig } from '
|
|
10
|
+
import { getConfigPath, readConfig } from '@ms-cloudpack/config';
|
|
11
11
|
const { rm } = fs.promises;
|
|
12
12
|
describe('init', () => {
|
|
13
13
|
let testPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/commands/init/init.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, describe, it, expect, beforeAll } from '@jest/globals';\nimport { init } from './init.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { isFile } from '@ms-cloudpack/path-utilities';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport type { PackageJson } from '@ms-cloudpack/bundler-types';\nimport { createTestFileStructure } from '@ms-cloudpack/test-utilities';\nimport { noLoggingConfig } from '@ms-cloudpack/task-reporter';\nimport { reporter } from '../../reporter.js';\nimport { getConfigPath, readConfig } from '../../common/config.js';\n\nconst { rm } = fs.promises;\n\ndescribe('init', () => {\n let testPath: string | undefined;\n\n beforeAll(() => {\n reporter.setOptions(noLoggingConfig);\n });\n\n afterEach(async () => {\n if (testPath) {\n await rm(testPath, { recursive: true });\n testPath = undefined;\n }\n });\n\n it('can make no changes to a package that has no config and needs no changes', async () => {\n testPath = await createTestFileStructure({\n 'package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n foo: '1.0.0',\n },\n },\n 'src/index.ts': 'import foo from \"foo\"; console.log(foo);',\n 'node_modules/foo/package.json': {\n name: 'foo',\n version: '1.0.0',\n main: 'lib/index.js',\n },\n 'node_modules/foo/lib/index.js': 'export default \"foo\";',\n });\n\n await init({ cwd: testPath });\n\n expect(await isFile(getConfigPath(testPath))).toBe(false);\n });\n\n it('can create a config when a package needs to have an exports map defined', async () => {\n testPath = await createTestFileStructure({\n 'package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n foo: '1.0.0',\n },\n },\n 'src/index.ts': 'import foo from \"foo/lib/bar\"; console.log(foo);',\n 'node_modules/foo/package.json': {\n name: 'foo',\n version: '1.0.0',\n main: 'lib/index.js',\n },\n 'node_modules/foo/lib/index.js': 'export default \"index\";',\n 'node_modules/foo/lib/bar.js': 'export default \"foo\";',\n });\n\n expect(await init({ cwd: testPath })).toEqual({ changeCount: 1 });\n\n const configPath = getConfigPath(testPath);\n expect(await isFile(configPath)).toBe(true);\n expect(await readJson(configPath)).toMatchInlineSnapshot(`\n {\n \"packageOverrides\": [\n {\n \"name\": \"foo\",\n \"overrides\": {\n \"exports\": {\n \".\": {\n \"default\": \"./lib/index.js\",\n },\n \"./lib/bar\": {\n \"default\": \"./lib/bar.js\",\n },\n },\n },\n \"versionRequirement\": \"1.0.0\",\n },\n ],\n }\n `);\n });\n\n it('can modify inner-repo packages if the fix option is specified and a package needs an override', async () => {\n testPath = await createTestFileStructure(\n {\n 'app/package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n library: '1.0.0',\n },\n },\n 'app/src/index.ts': 'import foo from \"library/lib/bar\"; console.log(foo);',\n 'library/package.json': {\n name: 'library',\n version: '1.0.0',\n main: 'lib/index.js',\n },\n 'library/lib/index.js': 'export default \"index\";',\n 'library/lib/bar.js': 'export default \"bar\";',\n },\n { links: { 'app/node_modules/library': 'library' } },\n );\n\n await init({ cwd: path.join(testPath, 'app'), fix: true });\n\n // There are no overrides required in this scenario; everything is fixed locally, so no\n // config file should be created.\n expect(await isFile(getConfigPath(testPath))).toBe(false);\n\n // Both the app and the library should have been fixed to have the correct exports map.\n\n // The app package shouldn't require an exports map; no changes expected.\n const appDefinition = (await readJson(path.join(testPath, 'app/package.json'))) as PackageJson;\n expect(appDefinition.exports).toBeUndefined();\n\n // The library exports should have the main entry hoisted (\".\"), as well as the \"./lib/bar\" import that the app\n // depends on. There should be no source/typings as the library only has a js file and no src/*.ts\n // files.\n const libraryDefinition = (await readJson(path.join(testPath, 'library/package.json'))) as PackageJson;\n expect(libraryDefinition.exports).toMatchInlineSnapshot(`\n {\n \".\": {\n \"default\": \"./lib/index.js\",\n },\n \"./lib/bar\": {\n \"default\": \"./lib/bar.js\",\n },\n }\n `);\n });\n\n it('can avoids modifying external packages if the fix option is specified and a package needs an override', async () => {\n testPath = await createTestFileStructure({\n 'package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n library: '1.0.0',\n },\n },\n 'src/index.ts': 'import foo from \"library/lib/bar\"; console.log(foo);',\n 'node_modules/library/package.json': {\n name: 'library',\n version: '1.0.0',\n main: 'lib/index.js',\n },\n 'node_modules/library/lib/index.js': 'export default \"index\";',\n 'node_modules/library/lib/bar.js': 'export default \"bar\";',\n });\n\n await init({ cwd: testPath, fix: true });\n\n // An override config would be created for this scenario.\n const config = await readConfig(testPath);\n expect(config).toMatchInlineSnapshot(`\n {\n \"packageOverrides\": [\n {\n \"name\": \"library\",\n \"overrides\": {\n \"exports\": {\n \".\": {\n \"default\": \"./lib/index.js\",\n },\n \"./lib/bar\": {\n \"default\": \"./lib/bar.js\",\n },\n },\n },\n \"versionRequirement\": \"1.0.0\",\n },\n ],\n }\n `);\n\n // The library package shouldn't be modified.\n const libraryDefinition = (await readJson(path.join(testPath, 'node_modules/library/package.json'))) as PackageJson;\n expect(libraryDefinition.exports).toBeUndefined();\n });\n\n it('can update an existing exports map when fix is provided', async () => {\n testPath = await createTestFileStructure(\n {\n 'app/package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n library: '1.0.0',\n },\n },\n 'app/src/index.ts': 'import bar from \"library/lib/bar\"; console.log(bar);',\n 'library/package.json': {\n name: 'library',\n version: '1.0.0',\n exports: {\n '.': {\n default: './lib/index.js',\n },\n },\n },\n 'library/lib/index.js': 'export default \"index\";',\n 'library/lib/bar.js': 'export default \"bar\";',\n },\n { links: { 'app/node_modules/library': 'library' } },\n );\n\n await init({ cwd: path.join(testPath, 'app'), fix: true });\n\n expect(await isFile(getConfigPath(testPath))).toBe(false);\n expect(await readJson(path.join(testPath, 'library/package.json'))).toMatchInlineSnapshot(`\n {\n \"exports\": {\n \".\": {\n \"default\": \"./lib/index.js\",\n },\n \"./lib/bar\": {\n \"default\": \"./lib/bar.js\",\n },\n },\n \"name\": \"library\",\n \"version\": \"1.0.0\",\n }\n `);\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/commands/init/init.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, describe, it, expect, beforeAll } from '@jest/globals';\nimport { init } from './init.js';\nimport fs from 'fs';\nimport path from 'path';\nimport { isFile } from '@ms-cloudpack/path-utilities';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport type { PackageJson } from '@ms-cloudpack/bundler-types';\nimport { createTestFileStructure } from '@ms-cloudpack/test-utilities';\nimport { noLoggingConfig } from '@ms-cloudpack/task-reporter';\nimport { reporter } from '../../reporter.js';\nimport { getConfigPath, readConfig } from '@ms-cloudpack/config';\n\nconst { rm } = fs.promises;\n\ndescribe('init', () => {\n let testPath: string | undefined;\n\n beforeAll(() => {\n reporter.setOptions(noLoggingConfig);\n });\n\n afterEach(async () => {\n if (testPath) {\n await rm(testPath, { recursive: true });\n testPath = undefined;\n }\n });\n\n it('can make no changes to a package that has no config and needs no changes', async () => {\n testPath = await createTestFileStructure({\n 'package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n foo: '1.0.0',\n },\n },\n 'src/index.ts': 'import foo from \"foo\"; console.log(foo);',\n 'node_modules/foo/package.json': {\n name: 'foo',\n version: '1.0.0',\n main: 'lib/index.js',\n },\n 'node_modules/foo/lib/index.js': 'export default \"foo\";',\n });\n\n await init({ cwd: testPath });\n\n expect(await isFile(getConfigPath(testPath))).toBe(false);\n });\n\n it('can create a config when a package needs to have an exports map defined', async () => {\n testPath = await createTestFileStructure({\n 'package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n foo: '1.0.0',\n },\n },\n 'src/index.ts': 'import foo from \"foo/lib/bar\"; console.log(foo);',\n 'node_modules/foo/package.json': {\n name: 'foo',\n version: '1.0.0',\n main: 'lib/index.js',\n },\n 'node_modules/foo/lib/index.js': 'export default \"index\";',\n 'node_modules/foo/lib/bar.js': 'export default \"foo\";',\n });\n\n expect(await init({ cwd: testPath })).toEqual({ changeCount: 1 });\n\n const configPath = getConfigPath(testPath);\n expect(await isFile(configPath)).toBe(true);\n expect(await readJson(configPath)).toMatchInlineSnapshot(`\n {\n \"packageOverrides\": [\n {\n \"name\": \"foo\",\n \"overrides\": {\n \"exports\": {\n \".\": {\n \"default\": \"./lib/index.js\",\n },\n \"./lib/bar\": {\n \"default\": \"./lib/bar.js\",\n },\n },\n },\n \"versionRequirement\": \"1.0.0\",\n },\n ],\n }\n `);\n });\n\n it('can modify inner-repo packages if the fix option is specified and a package needs an override', async () => {\n testPath = await createTestFileStructure(\n {\n 'app/package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n library: '1.0.0',\n },\n },\n 'app/src/index.ts': 'import foo from \"library/lib/bar\"; console.log(foo);',\n 'library/package.json': {\n name: 'library',\n version: '1.0.0',\n main: 'lib/index.js',\n },\n 'library/lib/index.js': 'export default \"index\";',\n 'library/lib/bar.js': 'export default \"bar\";',\n },\n { links: { 'app/node_modules/library': 'library' } },\n );\n\n await init({ cwd: path.join(testPath, 'app'), fix: true });\n\n // There are no overrides required in this scenario; everything is fixed locally, so no\n // config file should be created.\n expect(await isFile(getConfigPath(testPath))).toBe(false);\n\n // Both the app and the library should have been fixed to have the correct exports map.\n\n // The app package shouldn't require an exports map; no changes expected.\n const appDefinition = (await readJson(path.join(testPath, 'app/package.json'))) as PackageJson;\n expect(appDefinition.exports).toBeUndefined();\n\n // The library exports should have the main entry hoisted (\".\"), as well as the \"./lib/bar\" import that the app\n // depends on. There should be no source/typings as the library only has a js file and no src/*.ts\n // files.\n const libraryDefinition = (await readJson(path.join(testPath, 'library/package.json'))) as PackageJson;\n expect(libraryDefinition.exports).toMatchInlineSnapshot(`\n {\n \".\": {\n \"default\": \"./lib/index.js\",\n },\n \"./lib/bar\": {\n \"default\": \"./lib/bar.js\",\n },\n }\n `);\n });\n\n it('can avoids modifying external packages if the fix option is specified and a package needs an override', async () => {\n testPath = await createTestFileStructure({\n 'package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n library: '1.0.0',\n },\n },\n 'src/index.ts': 'import foo from \"library/lib/bar\"; console.log(foo);',\n 'node_modules/library/package.json': {\n name: 'library',\n version: '1.0.0',\n main: 'lib/index.js',\n },\n 'node_modules/library/lib/index.js': 'export default \"index\";',\n 'node_modules/library/lib/bar.js': 'export default \"bar\";',\n });\n\n await init({ cwd: testPath, fix: true });\n\n // An override config would be created for this scenario.\n const config = await readConfig(testPath);\n expect(config).toMatchInlineSnapshot(`\n {\n \"packageOverrides\": [\n {\n \"name\": \"library\",\n \"overrides\": {\n \"exports\": {\n \".\": {\n \"default\": \"./lib/index.js\",\n },\n \"./lib/bar\": {\n \"default\": \"./lib/bar.js\",\n },\n },\n },\n \"versionRequirement\": \"1.0.0\",\n },\n ],\n }\n `);\n\n // The library package shouldn't be modified.\n const libraryDefinition = (await readJson(path.join(testPath, 'node_modules/library/package.json'))) as PackageJson;\n expect(libraryDefinition.exports).toBeUndefined();\n });\n\n it('can update an existing exports map when fix is provided', async () => {\n testPath = await createTestFileStructure(\n {\n 'app/package.json': {\n name: 'test-package',\n version: '1.0.0',\n main: 'lib/index.js',\n dependencies: {\n library: '1.0.0',\n },\n },\n 'app/src/index.ts': 'import bar from \"library/lib/bar\"; console.log(bar);',\n 'library/package.json': {\n name: 'library',\n version: '1.0.0',\n exports: {\n '.': {\n default: './lib/index.js',\n },\n },\n },\n 'library/lib/index.js': 'export default \"index\";',\n 'library/lib/bar.js': 'export default \"bar\";',\n },\n { links: { 'app/node_modules/library': 'library' } },\n );\n\n await init({ cwd: path.join(testPath, 'app'), fix: true });\n\n expect(await isFile(getConfigPath(testPath))).toBe(false);\n expect(await readJson(path.join(testPath, 'library/package.json'))).toMatchInlineSnapshot(`\n {\n \"exports\": {\n \".\": {\n \"default\": \"./lib/index.js\",\n },\n \"./lib/bar\": {\n \"default\": \"./lib/bar.js\",\n },\n },\n \"name\": \"library\",\n \"version\": \"1.0.0\",\n }\n `);\n });\n});\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { PackageJson } from '@ms-cloudpack/bundler-types';
|
|
2
2
|
import type { Express } from '@ms-cloudpack/create-express-app';
|
|
3
|
-
import type {
|
|
3
|
+
import type { BundleServer, Session } from '../../../types.js';
|
|
4
|
+
import type { ApiServer } from '@ms-cloudpack/api-server';
|
|
5
|
+
import type { CloudpackConfig } from '@ms-cloudpack/config';
|
|
4
6
|
/**
|
|
5
7
|
* Creates the routes for the express app, considering how the config is defined.
|
|
6
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createRoutes.js","sourceRoot":"","sources":["../../../../src/commands/start/appServer/createRoutes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC1D,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"createRoutes.js","sourceRoot":"","sources":["../../../../src/commands/start/appServer/createRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageJson } from '@ms-cloudpack/bundler-types';\nimport type { Express, Request, Response } from '@ms-cloudpack/create-express-app';\nimport { express } from '@ms-cloudpack/create-express-app';\nimport { createImportMap } from '@ms-cloudpack/package-utilities';\nimport { slash } from '@ms-cloudpack/path-string-parsing';\nimport path from 'path';\nimport type { BundleServer, Session } from '../../../types.js';\nimport { error } from './error.js';\nimport { getHtmlResponse } from './getHtmlResponse.js';\nimport { getInlineScripts } from './inlineScripts/getInlineScripts.js';\nimport { handleSessionVersion } from './handleSessionVersion.js';\nimport { log } from './log.js';\nimport { setHeaders } from './setHeaders.js';\nimport type { ApiServer } from '@ms-cloudpack/api-server';\nimport type { CloudpackConfig } from '@ms-cloudpack/config';\n\n/**\n * Creates the routes for the express app, considering how the config is defined.\n */\nexport function createRoutes({\n app,\n url,\n session,\n definition,\n bundleServer,\n apiServer,\n config,\n}: {\n app: Express;\n url: string;\n session: Session;\n definition: PackageJson;\n bundleServer: BundleServer;\n apiServer: ApiServer;\n config: CloudpackConfig;\n}) {\n const routes = [...(config.devServer?.routes || [])];\n const hasDefaultRoute = routes.some((route) => route.match === '*' || route.match === '/');\n\n if (!hasDefaultRoute) {\n routes.push({\n match: '*',\n exportEntry: '.',\n });\n }\n\n for (const route of routes) {\n if (route.staticPath) {\n app.use(route.match, express.static(path.resolve(session.appPath, route.staticPath)));\n } else {\n app.get(route.match, (req: Request, res: Response) => {\n (async () => {\n // Build the import map if it hasn't been built yet for this session version.\n const sessionVersion = handleSessionVersion(session, req);\n const importMap =\n session.getImportMap() ||\n session.setImportMap(\n await createImportMap(session.resolveMap, bundleServer.url, {\n sessionVersion,\n targetVersions: session.targetVersions,\n }),\n );\n\n // Parse the request path, extension, grab the overlay script path.\n const requestPath = slash(req.path.substring(1));\n const requestExt = path.extname(requestPath);\n const overlayScript = importMap.imports['@ms-cloudpack/overlay'];\n const entryScript =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n route.exportEntry && importMap.imports[slash(path.join(definition.name!, route.exportEntry))];\n\n // Set the apppropriate Cloudpack headers/cookies in the response.\n // TODO: setting the headers here prohibits cases where the page rendering is owned by existing server code\n // that can only accept changing the scripts. We should consider moving to a model where an initial script\n // fetch loads the import map and sets Cloudpack settings in local storage rather than headers/cookies.\n setHeaders({ res, session, apiServer });\n\n const inlineScripts = await getInlineScripts();\n const { html, statusCode } = await getHtmlResponse({\n route,\n baseUrl: url,\n importMap,\n overlayScript,\n entryScript,\n session,\n definition,\n inlineScripts,\n });\n\n // Send the result.\n res.status(statusCode).send(html).end();\n\n log(`App server: Request: ${requestPath}, ext: ${requestExt}`);\n })().catch((err) => {\n error((err as Error)?.stack || err);\n res.status(500).send(`Error loading app: ${err}`);\n });\n });\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Response } from '@ms-cloudpack/create-express-app';
|
|
2
|
-
import type {
|
|
2
|
+
import type { Session } from '../../../types.js';
|
|
3
|
+
import type { ApiServer } from '@ms-cloudpack/api-server';
|
|
3
4
|
/**
|
|
4
5
|
* Set the Cloudpack headers and cookies in the response.
|
|
5
6
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setHeaders.js","sourceRoot":"","sources":["../../../../src/commands/start/appServer/setHeaders.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setHeaders.js","sourceRoot":"","sources":["../../../../src/commands/start/appServer/setHeaders.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAA6D;IAC/G,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IACxC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACxC,GAAG,CAAC,MAAM,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAE/C,GAAG,CAAC,MAAM,CAAC,sBAAsB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,MAAM,CAAC,4BAA4B,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3D,GAAG,CAAC,MAAM,CAAC,4BAA4B,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC3F,GAAG,CAAC,MAAM,CAAC,mBAAmB,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC","sourcesContent":["import type { Response } from '@ms-cloudpack/create-express-app';\nimport type { Session } from '../../../types.js';\nimport type { ApiServer } from '@ms-cloudpack/api-server';\n\n/**\n * Set the Cloudpack headers and cookies in the response.\n */\nexport function setHeaders({ res, session, apiServer }: { res: Response; session: Session; apiServer: ApiServer }) {\n res.header('Content-Type', 'text/html');\n res.header('Cache-Control', 'no-cache');\n res.header('Access-Control-Allow-Origin', '*');\n\n res.cookie('cloudpack-session-id', session.id);\n res.cookie('cloudpack-session-sequence', session.sequence);\n res.cookie(`cloudpack-sessionVersion-${session.projectName}`, session.getSessionVersion());\n res.cookie('cloudpack-api-url', apiServer.url);\n}\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BundleServer, Session } from '../../../types.js';
|
|
2
2
|
import type { PackageJson } from '@ms-cloudpack/bundler-types';
|
|
3
|
+
import type { CloudpackConfig } from '@ms-cloudpack/config';
|
|
4
|
+
import type { ApiServer } from '@ms-cloudpack/api-server';
|
|
3
5
|
/**
|
|
4
6
|
* The app server hosts the appropriate routes for the web app, primarily returning html content
|
|
5
7
|
* which loads resources from the bundle server.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startAppServer.js","sourceRoot":"","sources":["../../../../src/commands/start/appServer/startAppServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"startAppServer.js","sourceRoot":"","sources":["../../../../src/commands/start/appServer/startAppServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAInD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EACnC,OAAO,EACP,YAAY,EACZ,SAAS,EACT,UAAU,EACV,MAAM,GAAG,EAAqB,GAO/B;IACC,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,MAAM,IAAK,EAAsB,CAAC;IAE7D,mEAAmE;IACnE,MAAM,oBAAoB,GAAG,SAAS,EAAE,IAAI,KAAK,SAAS,CAAC;IAC3D,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAE1D,mEAAmE;IACnE,+EAA+E;IAC/E,oEAAoE;IAEpE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAErD,IAAI;QACF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,gBAAgB,CAAC;YAClD,SAAS,EAAE,KAAK;YAChB,oBAAoB;YACpB,QAAQ,EAAE,SAAS,EAAE,MAAM;YAC3B,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK;YACnC,cAAc;YACd,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAC1B,YAAY,CAAC;gBACX,GAAG;gBACH,GAAG;gBACH,OAAO;gBACP,UAAU;gBACV,YAAY;gBACZ,SAAS;gBACT,MAAM;aACP,CAAC;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,eAAe,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAExE,OAAO;YACL,KAAK;YACL,IAAI;YACJ,GAAG;SACJ,CAAC;KACH;IAAC,OAAO,GAAY,EAAE;QACrB,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEvD,MAAM,GAAG,CAAC;KACX;AACH,CAAC","sourcesContent":["import { createExpressApp } from '@ms-cloudpack/create-express-app';\nimport type { BundleServer, Session } from '../../../types.js';\nimport type { PackageJson } from '@ms-cloudpack/bundler-types';\nimport { createRoutes } from './createRoutes.js';\nimport { exitIfPortUnavailable } from './exitIfPortUnavailable.js';\nimport { reporter } from '../../../reporter.js';\nimport { cyan } from '@ms-cloudpack/task-reporter';\nimport type { CloudpackConfig } from '@ms-cloudpack/config';\nimport type { ApiServer } from '@ms-cloudpack/api-server';\n\n/**\n * The app server hosts the appropriate routes for the web app, primarily returning html content\n * which loads resources from the bundle server.\n *\n * Separating the app server from the bundle service keeps the routes separate - the app server\n * can support whichever routes the app needs, while the bundle server can provide package\n * assets in various forms using its own routing.\n */\nexport async function startAppServer({\n session,\n bundleServer,\n apiServer,\n definition,\n config = {} as CloudpackConfig,\n}: {\n session: Session;\n definition: PackageJson;\n bundleServer: BundleServer;\n apiServer: ApiServer;\n config: CloudpackConfig;\n}) {\n const { devServer = {} } = config || ({} as CloudpackConfig);\n\n // Read the port from the config file or default to array of ports.\n const requireSpecifiedPort = devServer?.port !== undefined;\n const ports = devServer?.port ?? [5000, 5001, 5002, 5003];\n\n // Directory to serve as plain static assets. Defaults to \"public\".\n // Can be overridden by setting the 'publicDir' option in the cloudpack config.\n // const publicDir = path.resolve(devServer.publicPath ?? 'public');\n\n const task = reporter.addTask('Starting app server');\n\n try {\n const { close, port, url } = await createExpressApp({\n portRange: ports,\n requireSpecifiedPort,\n hostname: devServer?.domain,\n sslOptions: config.devServer?.https,\n // publicDir,\n setupCallback: (app, url) =>\n createRoutes({\n app,\n url,\n session,\n definition,\n bundleServer,\n apiServer,\n config,\n }),\n });\n\n task.complete({ message: `Available @ ${cyan(url)}`, forceShow: true });\n\n return {\n close,\n port,\n url,\n };\n } catch (err: unknown) {\n task.complete({ status: 'fail', message: 'Failed to start app server', forceShow: true });\n exitIfPortUnavailable(err, session.projectName, ports);\n\n throw err;\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { BundleRequest, BundleTaskOptions
|
|
1
|
+
import type { BundleRequest, BundleTaskOptions } from '../../types.js';
|
|
2
|
+
import type { Task } from '@ms-cloudpack/api-server';
|
|
2
3
|
/**
|
|
3
4
|
* Creates a bundle task tracked in the task runner of the api server. This allows active tasks to be tracked
|
|
4
5
|
* remotely (e.g. in the browser) and allows the user to cancel tasks.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBundleTask.js","sourceRoot":"","sources":["../../../src/commands/start/createBundleTask.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createBundleTask.js","sourceRoot":"","sources":["../../../src/commands/start/createBundleTask.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,aAA4B,EAAE,OAA2B;IACxF,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC;IAExF,OAAO;QACL,IAAI,EAAE,UAAU,WAAW,IAAI,OAAO,EAAE;QACxC,EAAE;QACF,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE;QACvC,KAAK,EAAE,CAAC,UAAU;QAClB,KAAK,CAAC,OAAO;YACX,MAAM,UAAU,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;YAE7C,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;YAClC,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC;YACjC,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACpC,CAAC;QACD,SAAS,EAAE,GAAG,EAAE,CAAW,aAAa,CAAC,MAAM,EAAE,MAAsB;QACvE,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;YAC1B,EAAE;YACF,IAAI,EAAE,UAAU,WAAW,IAAI,OAAO,EAAE;YACxC,SAAS,EAAE,WAAW,IAAI,EAAE;YAC5B,UAAU;SACX,CAAC;QACF,iBAAiB,EAAE,CAAC,UAAU,EAAE,EAAE,CAChC,CAAC;YACC,EAAE;YACF,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM;YAClC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ;SAChB,CAAA;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["import type { BundleRequest, BundleTaskOptions } from '../../types.js';\nimport type { Task, TaskEndDescription, TaskError } from '@ms-cloudpack/api-server';\nimport path from 'path';\nimport fs from 'fs';\nimport { bundleTask } from '../../tasks/bundleTask.js';\n\n/**\n * Creates a bundle task tracked in the task runner of the api server. This allows active tasks to be tracked\n * remotely (e.g. in the browser) and allows the user to cancel tasks.\n */\nexport function createBundleTask(bundleRequest: BundleRequest, options?: BundleTaskOptions): Task<BundleRequest> {\n const { id, packageName, version, outputPath, packagePath, isExternal } = bundleRequest;\n\n return {\n name: `Bundle ${packageName}@${version}`,\n id,\n dir: `${path.join(packagePath, 'src')}`,\n watch: !isExternal,\n async execute(): Promise<BundleRequest> {\n await bundleTask({ bundleRequest, options });\n\n return bundleRequest;\n },\n clear: () => {\n bundleRequest.result?.dispose?.();\n bundleRequest.result = undefined;\n fs.rmSync(outputPath, { recursive: true, force: true });\n },\n onDispose: () => {\n bundleRequest.result?.dispose?.();\n },\n getErrors: () => (<unknown>bundleRequest.result?.errors) as TaskError[],\n getStartDescription: () => ({\n id,\n name: `Bundle ${packageName}@${version}`,\n inputPath: packagePath || '',\n outputPath,\n }),\n getEndDescription: (taskResult) =>\n ({\n id,\n errors: taskResult?.result?.errors,\n warnings: taskResult?.result?.warnings,\n } as TaskEndDescription),\n };\n}\n"]}
|
|
@@ -5,12 +5,12 @@ import { createPackageOverrideTransform } from '../../common/createPackageOverri
|
|
|
5
5
|
import { startAppServer } from './appServer/startAppServer.js';
|
|
6
6
|
import { createSession } from './createSession.js';
|
|
7
7
|
import { openBrowser } from './openBrowser.js';
|
|
8
|
-
import { startApiServer } from '
|
|
8
|
+
import { startApiServer } from '@ms-cloudpack/api-server';
|
|
9
9
|
import { startBundleServer } from './startBundleServer.js';
|
|
10
10
|
import { reporter } from '../../reporter.js';
|
|
11
|
-
import { readConfig } from '
|
|
11
|
+
import { readConfig } from '@ms-cloudpack/config';
|
|
12
12
|
import { PerfMarkerCliEntry, PerfMeasurementOpenBrowser } from '../../performance/markers.js';
|
|
13
|
-
import { setSharedTelemetryAttribute, stopTelemetry } from '../../initTelemetry.js';
|
|
13
|
+
import { setSharedTelemetryAttribute, stopTelemetry, rootSpan } from '../../initTelemetry.js';
|
|
14
14
|
/**
|
|
15
15
|
* Defines the "start" verb entry point.
|
|
16
16
|
*/
|
|
@@ -39,7 +39,7 @@ export async function start(options) {
|
|
|
39
39
|
await writeJson(path.join(appPath, 'resolve-map.json'), session.resolveMap);
|
|
40
40
|
}
|
|
41
41
|
// Start api server for tracking status and handling remote requests.
|
|
42
|
-
const apiServer = await startApiServer({ session, config });
|
|
42
|
+
const apiServer = await startApiServer({ session, config, rootSpan });
|
|
43
43
|
// Then start bundle and app servers for hosting the app.
|
|
44
44
|
const bundleServer = await startBundleServer({ session, apiServer, config });
|
|
45
45
|
const appServer = await startAppServer({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/start/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,8BAA8B,EAAE,MAAM,gDAAgD,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/start/start.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeJson } from '@ms-cloudpack/json-utilities';\nimport { PackageDefinitions } from '@ms-cloudpack/package-utilities';\nimport path from 'path';\nimport { createPackageOverrideTransform } from '../../common/createPackageOverrideTransform.js';\nimport { startAppServer } from './appServer/startAppServer.js';\nimport { createSession } from './createSession.js';\nimport { openBrowser } from './openBrowser.js';\nimport { startApiServer } from '@ms-cloudpack/api-server';\nimport { startBundleServer } from './startBundleServer.js';\nimport type { StartOptions } from './types.js';\nimport { reporter } from '../../reporter.js';\nimport { readConfig } from '@ms-cloudpack/config';\nimport { PerfMarkerCliEntry, PerfMeasurementOpenBrowser } from '../../performance/markers.js';\nimport { setSharedTelemetryAttribute, stopTelemetry, rootSpan } from '../../initTelemetry.js';\n\n/**\n * Defines the \"start\" verb entry point.\n */\nexport async function start(options: StartOptions) {\n const appPath = process.cwd();\n\n try {\n // Parse config if it exists.\n const config = await readConfig(appPath);\n\n // Initialize package overrides.\n PackageDefinitions.getInstance().registerTransform(createPackageOverrideTransform(config));\n\n // Make sure the package has a valid definition.\n const definition = await PackageDefinitions.getInstance().get(appPath);\n\n if (!definition) {\n throw new Error(`There was no package.json located at \"${appPath}\".`);\n }\n\n if (!definition.name || !definition.version) {\n throw new Error(`The package.json at \"${appPath}\" did not have a name and/or version.`);\n }\n\n // Initialize session definition.\n const session = await createSession({ appPath });\n\n // Set shared telemetry attributes which will be sent with all telemetry events.\n setSharedTelemetryAttribute('sessionId', session.id);\n setSharedTelemetryAttribute('appName', definition.name);\n\n if (options.logResolveMap) {\n // Write the resolve map to disk.\n await writeJson(path.join(appPath, 'resolve-map.json'), session.resolveMap);\n }\n\n // Start api server for tracking status and handling remote requests.\n const apiServer = await startApiServer({ session, config, rootSpan });\n\n // Then start bundle and app servers for hosting the app.\n const bundleServer = await startBundleServer({ session, apiServer, config });\n\n const appServer = await startAppServer({\n session,\n definition,\n bundleServer,\n apiServer,\n config,\n });\n\n const cleanup = async () => {\n for (const [name, server] of [\n ['appServer', appServer] as const,\n ['apiServer', apiServer] as const,\n ['bundleServer', bundleServer] as const,\n ]) {\n console.info(`Closing ${name}: ${server.url}`);\n try {\n await server.close();\n } catch (err) {\n console.warn('Error closing server:', err);\n }\n }\n\n // Complete the reporting and list pending tasks as aborted.\n reporter.complete();\n\n // Flush and close telemetry.\n await stopTelemetry();\n };\n\n // Setup cleanup and close things on completion.\n let sigintCount = 0;\n\n process.on('SIGINT', () => {\n sigintCount++;\n if (sigintCount > 1) {\n console.debug('Forcing exit');\n process.exit(1);\n }\n\n cleanup().finally(() => {\n process.exit(0);\n });\n });\n\n // Open the browser.\n const url = appServer.url;\n\n performance.measure(PerfMeasurementOpenBrowser, PerfMarkerCliEntry);\n openBrowser(url).catch((err) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n console.warn('Error opening browser:', err?.stack || err);\n console.warn('Please open the browser manually to:', url);\n });\n } catch (err) {\n reporter.complete();\n process.exit(1);\n }\n}\n"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BundleServer } from '../../types.js';
|
|
2
|
+
import type { ApiServer, Session } from '@ms-cloudpack/api-server';
|
|
3
|
+
import type { CloudpackConfig } from '@ms-cloudpack/config';
|
|
2
4
|
/**
|
|
3
5
|
* The bundle server handles package requests and returns bundled resources.
|
|
4
6
|
* Resources are bundled on demand and cached locally to avoid re-bundling
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startBundleServer.js","sourceRoot":"","sources":["../../../src/commands/start/startBundleServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA6C,MAAM,kCAAkC,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC1D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"startBundleServer.js","sourceRoot":"","sources":["../../../src/commands/start/startBundleServer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createExpressApp, type Express, type Request, type Response } from '@ms-cloudpack/create-express-app';\nimport { isFolder } from '@ms-cloudpack/path-utilities';\nimport { slash } from '@ms-cloudpack/path-string-parsing';\nimport path from 'path';\nimport { parseRequestInfo } from './parseRequestInfo.js';\nimport { createBundleTask } from './createBundleTask.js';\nimport type { BundleRequest, BundleServer } from '../../types.js';\nimport { getBundleDetails } from '../../common/getBundleDetails.js';\nimport { isExternalPackage } from '@ms-cloudpack/package-utilities';\nimport type { ApiServer, Session } from '@ms-cloudpack/api-server';\nimport type { CloudpackConfig } from '@ms-cloudpack/config';\n\n/**\n * The bundle server handles package requests and returns bundled resources.\n * Resources are bundled on demand and cached locally to avoid re-bundling\n * on each request.\n */\nexport async function startBundleServer({\n session,\n apiServer,\n config = {} as CloudpackConfig,\n}: {\n session: Session;\n apiServer: ApiServer;\n config: CloudpackConfig;\n}): Promise<BundleServer> {\n const { port, close, url } = await createExpressApp({\n portRange: [5500, 5501, 5502, 5503],\n hostname: config.devServer?.domain,\n sslOptions: config.devServer?.https,\n setupCallback: (app: Express) => {\n // Set up the express app routes.\n app.get('*', (req, res) => {\n handleRequest(req, res, session, apiServer).catch((err) => {\n console.error((err as Error)?.stack || err);\n res.status(500).send(`Error bundling: ${err}`);\n });\n });\n },\n });\n\n return {\n close,\n port,\n url,\n };\n}\n\nasync function handleRequest(req: Request, res: Response, session: Session, apiServer: ApiServer) {\n const { resolveMap } = session;\n const requestPath = slash(req.path.substring(1));\n const { packageName, version, bundled, filePath } = parseRequestInfo(requestPath);\n const packageEntry = resolveMap[packageName];\n const packagePath =\n version && packageEntry?.version === version ? packageEntry?.path : packageEntry?.scopedVersions?.[version]?.path;\n const force = req.query.force !== undefined;\n\n console.debug(`Request: \"${packageName}@${version}${filePath}\"`);\n\n // If the package is missing, invalid arguments.\n if (!requestPath || !packageName) {\n console.debug(`Response (400): \"${packageName}@${version}${filePath}\"`);\n\n res.status(400).send(`Requests must be in the format \"/{packageName}@{version}/{type}/path/file.ext\".`);\n return;\n }\n\n // If the version is missing, redirect to the primary version.\n if (!version) {\n const resolvedPackage = resolveMap[packageName];\n\n if (!resolvedPackage) {\n console.debug(`Response (404): Unrecognized package \"${packageName}\"`);\n\n res.status(404).send(`Unrecognized package \"${packageName}\".`);\n return;\n }\n\n res.redirect(`/${packageName}@${resolvedPackage.version}${filePath}`);\n return;\n }\n\n // If it's an unrecognized package, 404.\n if (!packagePath) {\n console.debug(`Response (404): \"${packageName}@${version}${filePath}\"`);\n\n res\n .status(404)\n .send(`The requested package \"${packageName}@${version}${filePath}\" was not found in the resolve map.`);\n\n return;\n }\n\n // If we are accessing a non-bundled asset, return the file directly.\n if (!bundled) {\n const fullPath = path.join(packagePath, filePath);\n\n if (fullPath.length < packagePath.length) {\n console.debug(`Response (400): \"${packageName}@${version}${filePath}\"`);\n\n res.status(400).send(`Invalid file path.`);\n return;\n }\n\n console.debug(`Unbundled response returning: \"${packageName}@${version}${filePath}\"`);\n // If the package is external, set cache headers.\n if (isExternalPackage(packagePath)) {\n res.setHeader('Cache-Control', 'public, max-age=31536000');\n }\n\n res.sendFile(path.join(packagePath, filePath));\n return;\n }\n\n const { isExternal, bundleId, outputPath } = await getBundleDetails(packagePath);\n\n // Set up for bundling.\n const rerun = !(await isFolder(outputPath)) || force;\n const taskResult: BundleRequest = {\n id: bundleId,\n packageName,\n version,\n packagePath,\n outputPath,\n isExternal,\n };\n\n console.debug(`Trying to bundle \"${packageName}@${version}\"`);\n\n const bundleTask = createBundleTask(taskResult, { force });\n await apiServer.addTask(bundleTask, { rerun });\n\n // At this point we should have a Task completed.\n if ((taskResult.result?.errors?.length || 0) > 0) {\n res.status(500).type('json').send(taskResult);\n } else {\n console.debug(`Bundle returning: \"${packageName}@${version}${filePath}\"`);\n // Try to return the result.\n if (isExternal) {\n res.setHeader('Cache-Control', 'public, max-age=31536000');\n }\n\n res.sendFile(path.join(outputPath, filePath));\n }\n}\n"]}
|