@cratis/scene.react 4.18.1 → 4.20.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/dist/cjs/index.js +3 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/packages/loadApprovedPackages.js +122 -0
- package/dist/cjs/packages/loadApprovedPackages.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/packages/ApprovedPackageSet.d.ts +16 -0
- package/dist/esm/packages/ApprovedPackageSet.d.ts.map +1 -0
- package/dist/esm/packages/ApprovedPackageSet.js +2 -0
- package/dist/esm/packages/ApprovedPackageSet.js.map +1 -0
- package/dist/esm/packages/index.d.ts +2 -0
- package/dist/esm/packages/index.d.ts.map +1 -1
- package/dist/esm/packages/index.js +2 -0
- package/dist/esm/packages/index.js.map +1 -1
- package/dist/esm/packages/loadApprovedPackages.d.ts +18 -0
- package/dist/esm/packages/loadApprovedPackages.d.ts.map +1 -0
- package/dist/esm/packages/loadApprovedPackages.js +119 -0
- package/dist/esm/packages/loadApprovedPackages.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/packages/ApprovedPackageSet.ts +37 -0
- package/packages/index.ts +2 -0
- package/packages/loadApprovedPackages.ts +143 -0
package/dist/cjs/index.js
CHANGED
|
@@ -45,6 +45,7 @@ var DesignTimeContractVersion = require('./packages/DesignTimeContractVersion.js
|
|
|
45
45
|
var DesignTimeExtensionPoint = require('./packages/DesignTimeExtensionPoint.js');
|
|
46
46
|
var DesignTimeProvider = require('./packages/DesignTimeProvider.js');
|
|
47
47
|
var EmbeddedPackageHost = require('./packages/EmbeddedPackageHost.js');
|
|
48
|
+
var loadApprovedPackages = require('./packages/loadApprovedPackages.js');
|
|
48
49
|
var loadDesignTimeContributions = require('./packages/loadDesignTimeContributions.js');
|
|
49
50
|
var isNetworkAsset = require('./packages/isNetworkAsset.js');
|
|
50
51
|
var PackageHostAssets = require('./packages/PackageHostAssets.js');
|
|
@@ -138,6 +139,8 @@ exports.designTimeExtensionPointLabels = DesignTimeExtensionPoint.designTimeExte
|
|
|
138
139
|
exports.DesignTimeProvider = DesignTimeProvider.DesignTimeProvider;
|
|
139
140
|
exports.useDesignTimeContext = DesignTimeProvider.useDesignTimeContext;
|
|
140
141
|
exports.EmbeddedPackageHost = EmbeddedPackageHost.EmbeddedPackageHost;
|
|
142
|
+
exports.loadApprovedPackages = loadApprovedPackages.loadApprovedPackages;
|
|
143
|
+
exports.resolveApprovedPackageHost = loadApprovedPackages.resolveApprovedPackageHost;
|
|
141
144
|
exports.loadDesignTimeContributions = loadDesignTimeContributions.loadDesignTimeContributions;
|
|
142
145
|
exports.isNetworkAsset = isNetworkAsset.isNetworkAsset;
|
|
143
146
|
exports.PackageHostAssets = PackageHostAssets.PackageHostAssets;
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var PackageHostConfiguration = require('./PackageHostConfiguration.js');
|
|
4
|
+
|
|
5
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
6
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
7
|
+
/**
|
|
8
|
+
* Loads the runtime bundles of an approved package set through the host's importers.
|
|
9
|
+
*
|
|
10
|
+
* Nothing executes unless the host's policy allows executable imports. A package whose module cannot be imported,
|
|
11
|
+
* lacks its declared export, or whose bundle manifest differs from the declaration (name, version, components,
|
|
12
|
+
* layouts, templates, themes) contributes nothing and is reported - the declaration planning used and the code
|
|
13
|
+
* running must be the same package. Packages load in ordinal name order, so the result does not depend on the
|
|
14
|
+
* order the set was written in.
|
|
15
|
+
*/ async function loadApprovedPackages(set, importers, policy) {
|
|
16
|
+
const bundles = [];
|
|
17
|
+
const diagnostics = [];
|
|
18
|
+
const ordered = [
|
|
19
|
+
...set.packages
|
|
20
|
+
].sort((a, b)=>a.manifest.name < b.manifest.name ? -1 : a.manifest.name > b.manifest.name ? 1 : 0);
|
|
21
|
+
for (const { manifest, module } of ordered){
|
|
22
|
+
const label = `Package '${manifest.name}'`;
|
|
23
|
+
if (!policy.allowExecutableImports) {
|
|
24
|
+
diagnostics.push(`${label} brings executable code from '${module.npm}', but host policy forbids executable imports`);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const importer = Object.prototype.hasOwnProperty.call(importers, module.npm) ? importers[module.npm] : undefined;
|
|
28
|
+
if (!importer) {
|
|
29
|
+
diagnostics.push(`${label} is imported from '${module.npm}', which this host's build does not include`);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
let loaded;
|
|
33
|
+
try {
|
|
34
|
+
loaded = await importer();
|
|
35
|
+
} catch (error) {
|
|
36
|
+
diagnostics.push(`${label} could not be loaded from '${module.npm}': ${error instanceof Error ? error.message : String(error)}`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const bundle = loaded[module.export];
|
|
40
|
+
if (!bundle || typeof bundle !== 'object' || !bundle.manifest || !bundle.components) {
|
|
41
|
+
diagnostics.push(`${label} expects '${module.npm}' to export a package bundle named '${module.export}', which it does not`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const mismatches = declarationMismatches(manifest, bundle);
|
|
45
|
+
if (mismatches.length > 0) {
|
|
46
|
+
diagnostics.push(...mismatches.map((mismatch)=>`${label} does not match the bundle '${module.export}' of '${module.npm}': ${mismatch}`));
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
bundles.push(bundle);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
bundles,
|
|
53
|
+
diagnostics
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function declarationMismatches(declared, bundle) {
|
|
57
|
+
const actual = bundle.manifest;
|
|
58
|
+
const mismatches = [];
|
|
59
|
+
if (actual.name !== declared.name) mismatches.push(`the bundle is named '${actual.name}'`);
|
|
60
|
+
if (actual.version !== declared.version) mismatches.push(`the set declares version ${declared.version} but the bundle is ${actual.version}`);
|
|
61
|
+
if (actual.kind !== declared.kind) mismatches.push(`the set declares kind ${declared.kind} but the bundle is ${actual.kind}`);
|
|
62
|
+
const lists = [
|
|
63
|
+
'components',
|
|
64
|
+
'layouts',
|
|
65
|
+
'screenTemplates',
|
|
66
|
+
'dialogTemplates',
|
|
67
|
+
'themes'
|
|
68
|
+
];
|
|
69
|
+
for (const list of lists){
|
|
70
|
+
const expected = [
|
|
71
|
+
...declared[list] ?? []
|
|
72
|
+
].sort();
|
|
73
|
+
const found = [
|
|
74
|
+
...actual[list] ?? []
|
|
75
|
+
].sort();
|
|
76
|
+
if (expected.join('\u0000') !== found.join('\u0000')) {
|
|
77
|
+
mismatches.push(`the set declares ${list} [${expected.join(', ')}] but the bundle declares [${found.join(', ')}]`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return mismatches;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Loads the approved package set and resolves the effective profile over the built-in and approved bundles in one
|
|
84
|
+
* step. Packages that failed to load are reported in the result's `diagnostics` and block the host, so a profile
|
|
85
|
+
* is never rendered with a silently missing package.
|
|
86
|
+
*/ async function resolveApprovedPackageHost(configuration) {
|
|
87
|
+
const { packageSet, importers, ...rest } = configuration;
|
|
88
|
+
const loaded = await loadApprovedPackages(packageSet, importers, configuration.policy);
|
|
89
|
+
const host = PackageHostConfiguration.resolvePackageHost({
|
|
90
|
+
...rest,
|
|
91
|
+
bundles: [
|
|
92
|
+
...configuration.bundles,
|
|
93
|
+
...loaded.bundles
|
|
94
|
+
]
|
|
95
|
+
});
|
|
96
|
+
if (loaded.diagnostics.length === 0) {
|
|
97
|
+
return host;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
...host,
|
|
101
|
+
bundles: [],
|
|
102
|
+
components: {},
|
|
103
|
+
layouts: [],
|
|
104
|
+
screenTemplates: [],
|
|
105
|
+
dialogTemplates: [],
|
|
106
|
+
themes: [],
|
|
107
|
+
layout: undefined,
|
|
108
|
+
theme: undefined,
|
|
109
|
+
templates: [],
|
|
110
|
+
assets: [],
|
|
111
|
+
fonts: [],
|
|
112
|
+
blocked: true,
|
|
113
|
+
diagnostics: [
|
|
114
|
+
...loaded.diagnostics,
|
|
115
|
+
...host.diagnostics
|
|
116
|
+
]
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
exports.loadApprovedPackages = loadApprovedPackages;
|
|
121
|
+
exports.resolveApprovedPackageHost = resolveApprovedPackageHost;
|
|
122
|
+
//# sourceMappingURL=loadApprovedPackages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadApprovedPackages.js","sources":["../../../packages/loadApprovedPackages.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ApprovedPackageSet } from './ApprovedPackageSet';\nimport { PackageHostConfiguration, ResolvedPackageHost, resolvePackageHost } from './PackageHostConfiguration';\nimport { ScenePackageBundle } from './ScenePackageBundle';\n\n/**\n * How a host loads the modules of an approved package set: one loader per npm package name the set may import.\n *\n * A bundler resolves imports at build time, so the host lists them as literal `import()` calls\n * (`{ '@acme/scene.charts': () => import('@acme/scene.charts') }`). A set naming a module the host's build does\n * not include is a diagnostic, never an attempt to load an arbitrary specifier.\n */\nexport type ApprovedPackageImporters = Record<string, () => Promise<Record<string, unknown>>>;\n\n/** The outcome of loading an approved package set. */\nexport interface LoadedApprovedPackages {\n /** The bundles that loaded and match what the set declared, in ordinal package-name order. */\n bundles: ScenePackageBundle[];\n\n /** Every reason a package was not loaded or does not match its declaration. */\n diagnostics: string[];\n}\n\n/**\n * Loads the runtime bundles of an approved package set through the host's importers.\n *\n * Nothing executes unless the host's policy allows executable imports. A package whose module cannot be imported,\n * lacks its declared export, or whose bundle manifest differs from the declaration (name, version, components,\n * layouts, templates, themes) contributes nothing and is reported - the declaration planning used and the code\n * running must be the same package. Packages load in ordinal name order, so the result does not depend on the\n * order the set was written in.\n */\nexport async function loadApprovedPackages(\n set: ApprovedPackageSet,\n importers: ApprovedPackageImporters,\n policy: { allowExecutableImports: boolean },\n): Promise<LoadedApprovedPackages> {\n const bundles: ScenePackageBundle[] = [];\n const diagnostics: string[] = [];\n const ordered = [...set.packages].sort((a, b) => (a.manifest.name < b.manifest.name ? -1 : a.manifest.name > b.manifest.name ? 1 : 0));\n\n for (const { manifest, module } of ordered) {\n const label = `Package '${manifest.name}'`;\n if (!policy.allowExecutableImports) {\n diagnostics.push(`${label} brings executable code from '${module.npm}', but host policy forbids executable imports`);\n continue;\n }\n\n const importer = Object.prototype.hasOwnProperty.call(importers, module.npm) ? importers[module.npm] : undefined;\n if (!importer) {\n diagnostics.push(`${label} is imported from '${module.npm}', which this host's build does not include`);\n continue;\n }\n\n let loaded: Record<string, unknown>;\n try {\n loaded = await importer();\n } catch (error) {\n diagnostics.push(`${label} could not be loaded from '${module.npm}': ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n\n const bundle = loaded[module.export] as ScenePackageBundle | undefined;\n if (!bundle || typeof bundle !== 'object' || !bundle.manifest || !bundle.components) {\n diagnostics.push(`${label} expects '${module.npm}' to export a package bundle named '${module.export}', which it does not`);\n continue;\n }\n\n const mismatches = declarationMismatches(manifest, bundle);\n if (mismatches.length > 0) {\n diagnostics.push(...mismatches.map(mismatch => `${label} does not match the bundle '${module.export}' of '${module.npm}': ${mismatch}`));\n continue;\n }\n\n bundles.push(bundle);\n }\n\n return { bundles, diagnostics };\n}\n\nfunction declarationMismatches(declared: ApprovedPackageSet['packages'][number]['manifest'], bundle: ScenePackageBundle): string[] {\n const actual = bundle.manifest;\n const mismatches: string[] = [];\n if (actual.name !== declared.name) mismatches.push(`the bundle is named '${actual.name}'`);\n if (actual.version !== declared.version) mismatches.push(`the set declares version ${declared.version} but the bundle is ${actual.version}`);\n if (actual.kind !== declared.kind) mismatches.push(`the set declares kind ${declared.kind} but the bundle is ${actual.kind}`);\n\n const lists = ['components', 'layouts', 'screenTemplates', 'dialogTemplates', 'themes'] as const;\n for (const list of lists) {\n const expected = [...(declared[list] ?? [])].sort();\n const found = [...(actual[list] ?? [])].sort();\n if (expected.join('\\u0000') !== found.join('\\u0000')) {\n mismatches.push(`the set declares ${list} [${expected.join(', ')}] but the bundle declares [${found.join(', ')}]`);\n }\n }\n\n return mismatches;\n}\n\n/** An approved package set and the importers that load it, resolved together with the built-in bundles. */\nexport interface ApprovedPackageHostConfiguration extends Omit<PackageHostConfiguration, 'bundles'> {\n /** The bundles the host ships. */\n bundles: ScenePackageBundle[];\n\n /** The custom packages the host approved. */\n packageSet: ApprovedPackageSet;\n\n /** The importers for the set's modules. */\n importers: ApprovedPackageImporters;\n}\n\n/**\n * Loads the approved package set and resolves the effective profile over the built-in and approved bundles in one\n * step. Packages that failed to load are reported in the result's `diagnostics` and block the host, so a profile\n * is never rendered with a silently missing package.\n */\nexport async function resolveApprovedPackageHost(configuration: ApprovedPackageHostConfiguration): Promise<ResolvedPackageHost> {\n const { packageSet, importers, ...rest } = configuration;\n const loaded = await loadApprovedPackages(packageSet, importers, configuration.policy);\n const host = resolvePackageHost({ ...rest, bundles: [...configuration.bundles, ...loaded.bundles] });\n if (loaded.diagnostics.length === 0) {\n return host;\n }\n\n return {\n ...host,\n bundles: [],\n components: {},\n layouts: [],\n screenTemplates: [],\n dialogTemplates: [],\n themes: [],\n layout: undefined,\n theme: undefined,\n templates: [],\n assets: [],\n fonts: [],\n blocked: true,\n diagnostics: [...loaded.diagnostics, ...host.diagnostics],\n };\n}\n"],"names":["loadApprovedPackages","set","importers","policy","bundles","diagnostics","ordered","packages","sort","a","b","manifest","name","module","label","allowExecutableImports","push","npm","importer","Object","prototype","hasOwnProperty","call","undefined","loaded","error","Error","message","String","bundle","export","components","mismatches","declarationMismatches","length","map","mismatch","declared","actual","version","kind","lists","list","expected","found","join","resolveApprovedPackageHost","configuration","packageSet","rest","host","resolvePackageHost","layouts","screenTemplates","dialogTemplates","themes","layout","theme","templates","assets","fonts","blocked"],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -43,6 +43,7 @@ export { DesignTimeContractVersion } from './packages/DesignTimeContractVersion.
|
|
|
43
43
|
export { DesignTimeExtensionPoint, designTimeExtensionPointLabels } from './packages/DesignTimeExtensionPoint.js';
|
|
44
44
|
export { DesignTimeProvider, useDesignTimeContext } from './packages/DesignTimeProvider.js';
|
|
45
45
|
export { EmbeddedPackageHost } from './packages/EmbeddedPackageHost.js';
|
|
46
|
+
export { loadApprovedPackages, resolveApprovedPackageHost } from './packages/loadApprovedPackages.js';
|
|
46
47
|
export { loadDesignTimeContributions } from './packages/loadDesignTimeContributions.js';
|
|
47
48
|
export { isNetworkAsset } from './packages/isNetworkAsset.js';
|
|
48
49
|
export { PackageHostAssets } from './packages/PackageHostAssets.js';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ScenePackage } from '@cratis/scene.model';
|
|
2
|
+
export interface PackageModuleReference {
|
|
3
|
+
npm: string;
|
|
4
|
+
version: string;
|
|
5
|
+
export: string;
|
|
6
|
+
styles?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface ApprovedPackage {
|
|
9
|
+
manifest: ScenePackage;
|
|
10
|
+
module: PackageModuleReference;
|
|
11
|
+
}
|
|
12
|
+
export interface ApprovedPackageSet {
|
|
13
|
+
version: 1;
|
|
14
|
+
packages: ApprovedPackage[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ApprovedPackageSet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovedPackageSet.d.ts","sourceRoot":"","sources":["../../../packages/ApprovedPackageSet.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD,MAAM,WAAW,sBAAsB;IAEnC,GAAG,EAAE,MAAM,CAAC;IAGZ,OAAO,EAAE,MAAM,CAAC;IAGhB,MAAM,EAAE,MAAM,CAAC;IAGf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAGD,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,sBAAsB,CAAC;CAClC;AAMD,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovedPackageSet.js","sourceRoot":"","sources":["../../../packages/ApprovedPackageSet.ts"],"names":[],"mappings":""}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './ApprovedPackageSet';
|
|
1
2
|
export * from './DesignTimeAction';
|
|
2
3
|
export * from './DesignTimeActionOutcome';
|
|
3
4
|
export * from './DesignTimeActionState';
|
|
@@ -12,6 +13,7 @@ export * from './DesignTimeProvider';
|
|
|
12
13
|
export * from './DesignTimeResolution';
|
|
13
14
|
export * from '../navigation';
|
|
14
15
|
export * from './EmbeddedPackageHost';
|
|
16
|
+
export * from './loadApprovedPackages';
|
|
15
17
|
export * from './loadDesignTimeContributions';
|
|
16
18
|
export * from './isNetworkAsset';
|
|
17
19
|
export * from './PackageHostAssets';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../packages/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../packages/index.ts"],"names":[],"mappings":"AAGA,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './ApprovedPackageSet';
|
|
1
2
|
export * from './DesignTimeAction';
|
|
2
3
|
export * from './DesignTimeActionOutcome';
|
|
3
4
|
export * from './DesignTimeActionState';
|
|
@@ -12,6 +13,7 @@ export * from './DesignTimeProvider';
|
|
|
12
13
|
export * from './DesignTimeResolution';
|
|
13
14
|
export * from '../navigation';
|
|
14
15
|
export * from './EmbeddedPackageHost';
|
|
16
|
+
export * from './loadApprovedPackages';
|
|
15
17
|
export * from './loadDesignTimeContributions';
|
|
16
18
|
export * from './isNetworkAsset';
|
|
17
19
|
export * from './PackageHostAssets';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/index.ts"],"names":[],"mappings":"AAGA,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ApprovedPackageSet } from './ApprovedPackageSet';
|
|
2
|
+
import { PackageHostConfiguration, ResolvedPackageHost } from './PackageHostConfiguration';
|
|
3
|
+
import { ScenePackageBundle } from './ScenePackageBundle';
|
|
4
|
+
export type ApprovedPackageImporters = Record<string, () => Promise<Record<string, unknown>>>;
|
|
5
|
+
export interface LoadedApprovedPackages {
|
|
6
|
+
bundles: ScenePackageBundle[];
|
|
7
|
+
diagnostics: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function loadApprovedPackages(set: ApprovedPackageSet, importers: ApprovedPackageImporters, policy: {
|
|
10
|
+
allowExecutableImports: boolean;
|
|
11
|
+
}): Promise<LoadedApprovedPackages>;
|
|
12
|
+
export interface ApprovedPackageHostConfiguration extends Omit<PackageHostConfiguration, 'bundles'> {
|
|
13
|
+
bundles: ScenePackageBundle[];
|
|
14
|
+
packageSet: ApprovedPackageSet;
|
|
15
|
+
importers: ApprovedPackageImporters;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveApprovedPackageHost(configuration: ApprovedPackageHostConfiguration): Promise<ResolvedPackageHost>;
|
|
18
|
+
//# sourceMappingURL=loadApprovedPackages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadApprovedPackages.d.ts","sourceRoot":"","sources":["../../../packages/loadApprovedPackages.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAsB,MAAM,4BAA4B,CAAC;AAC/G,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAS1D,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAG9F,MAAM,WAAW,sBAAsB;IAEnC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAG9B,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAWD,wBAAsB,oBAAoB,CACtC,GAAG,EAAE,kBAAkB,EACvB,SAAS,EAAE,wBAAwB,EACnC,MAAM,EAAE;IAAE,sBAAsB,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,sBAAsB,CAAC,CA0CjC;AAsBD,MAAM,WAAW,gCAAiC,SAAQ,IAAI,CAAC,wBAAwB,EAAE,SAAS,CAAC;IAE/F,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAG9B,UAAU,EAAE,kBAAkB,CAAC;IAG/B,SAAS,EAAE,wBAAwB,CAAC;CACvC;AAOD,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,gCAAgC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwB9H"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { resolvePackageHost } from './PackageHostConfiguration.js';
|
|
2
|
+
|
|
3
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
4
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
5
|
+
/**
|
|
6
|
+
* Loads the runtime bundles of an approved package set through the host's importers.
|
|
7
|
+
*
|
|
8
|
+
* Nothing executes unless the host's policy allows executable imports. A package whose module cannot be imported,
|
|
9
|
+
* lacks its declared export, or whose bundle manifest differs from the declaration (name, version, components,
|
|
10
|
+
* layouts, templates, themes) contributes nothing and is reported - the declaration planning used and the code
|
|
11
|
+
* running must be the same package. Packages load in ordinal name order, so the result does not depend on the
|
|
12
|
+
* order the set was written in.
|
|
13
|
+
*/ async function loadApprovedPackages(set, importers, policy) {
|
|
14
|
+
const bundles = [];
|
|
15
|
+
const diagnostics = [];
|
|
16
|
+
const ordered = [
|
|
17
|
+
...set.packages
|
|
18
|
+
].sort((a, b)=>a.manifest.name < b.manifest.name ? -1 : a.manifest.name > b.manifest.name ? 1 : 0);
|
|
19
|
+
for (const { manifest, module } of ordered){
|
|
20
|
+
const label = `Package '${manifest.name}'`;
|
|
21
|
+
if (!policy.allowExecutableImports) {
|
|
22
|
+
diagnostics.push(`${label} brings executable code from '${module.npm}', but host policy forbids executable imports`);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const importer = Object.prototype.hasOwnProperty.call(importers, module.npm) ? importers[module.npm] : undefined;
|
|
26
|
+
if (!importer) {
|
|
27
|
+
diagnostics.push(`${label} is imported from '${module.npm}', which this host's build does not include`);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
let loaded;
|
|
31
|
+
try {
|
|
32
|
+
loaded = await importer();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
diagnostics.push(`${label} could not be loaded from '${module.npm}': ${error instanceof Error ? error.message : String(error)}`);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const bundle = loaded[module.export];
|
|
38
|
+
if (!bundle || typeof bundle !== 'object' || !bundle.manifest || !bundle.components) {
|
|
39
|
+
diagnostics.push(`${label} expects '${module.npm}' to export a package bundle named '${module.export}', which it does not`);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const mismatches = declarationMismatches(manifest, bundle);
|
|
43
|
+
if (mismatches.length > 0) {
|
|
44
|
+
diagnostics.push(...mismatches.map((mismatch)=>`${label} does not match the bundle '${module.export}' of '${module.npm}': ${mismatch}`));
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
bundles.push(bundle);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
bundles,
|
|
51
|
+
diagnostics
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function declarationMismatches(declared, bundle) {
|
|
55
|
+
const actual = bundle.manifest;
|
|
56
|
+
const mismatches = [];
|
|
57
|
+
if (actual.name !== declared.name) mismatches.push(`the bundle is named '${actual.name}'`);
|
|
58
|
+
if (actual.version !== declared.version) mismatches.push(`the set declares version ${declared.version} but the bundle is ${actual.version}`);
|
|
59
|
+
if (actual.kind !== declared.kind) mismatches.push(`the set declares kind ${declared.kind} but the bundle is ${actual.kind}`);
|
|
60
|
+
const lists = [
|
|
61
|
+
'components',
|
|
62
|
+
'layouts',
|
|
63
|
+
'screenTemplates',
|
|
64
|
+
'dialogTemplates',
|
|
65
|
+
'themes'
|
|
66
|
+
];
|
|
67
|
+
for (const list of lists){
|
|
68
|
+
const expected = [
|
|
69
|
+
...declared[list] ?? []
|
|
70
|
+
].sort();
|
|
71
|
+
const found = [
|
|
72
|
+
...actual[list] ?? []
|
|
73
|
+
].sort();
|
|
74
|
+
if (expected.join('\u0000') !== found.join('\u0000')) {
|
|
75
|
+
mismatches.push(`the set declares ${list} [${expected.join(', ')}] but the bundle declares [${found.join(', ')}]`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return mismatches;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Loads the approved package set and resolves the effective profile over the built-in and approved bundles in one
|
|
82
|
+
* step. Packages that failed to load are reported in the result's `diagnostics` and block the host, so a profile
|
|
83
|
+
* is never rendered with a silently missing package.
|
|
84
|
+
*/ async function resolveApprovedPackageHost(configuration) {
|
|
85
|
+
const { packageSet, importers, ...rest } = configuration;
|
|
86
|
+
const loaded = await loadApprovedPackages(packageSet, importers, configuration.policy);
|
|
87
|
+
const host = resolvePackageHost({
|
|
88
|
+
...rest,
|
|
89
|
+
bundles: [
|
|
90
|
+
...configuration.bundles,
|
|
91
|
+
...loaded.bundles
|
|
92
|
+
]
|
|
93
|
+
});
|
|
94
|
+
if (loaded.diagnostics.length === 0) {
|
|
95
|
+
return host;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
...host,
|
|
99
|
+
bundles: [],
|
|
100
|
+
components: {},
|
|
101
|
+
layouts: [],
|
|
102
|
+
screenTemplates: [],
|
|
103
|
+
dialogTemplates: [],
|
|
104
|
+
themes: [],
|
|
105
|
+
layout: undefined,
|
|
106
|
+
theme: undefined,
|
|
107
|
+
templates: [],
|
|
108
|
+
assets: [],
|
|
109
|
+
fonts: [],
|
|
110
|
+
blocked: true,
|
|
111
|
+
diagnostics: [
|
|
112
|
+
...loaded.diagnostics,
|
|
113
|
+
...host.diagnostics
|
|
114
|
+
]
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { loadApprovedPackages, resolveApprovedPackageHost };
|
|
119
|
+
//# sourceMappingURL=loadApprovedPackages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadApprovedPackages.js","sources":["../../../packages/loadApprovedPackages.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ApprovedPackageSet } from './ApprovedPackageSet';\nimport { PackageHostConfiguration, ResolvedPackageHost, resolvePackageHost } from './PackageHostConfiguration';\nimport { ScenePackageBundle } from './ScenePackageBundle';\n\n/**\n * How a host loads the modules of an approved package set: one loader per npm package name the set may import.\n *\n * A bundler resolves imports at build time, so the host lists them as literal `import()` calls\n * (`{ '@acme/scene.charts': () => import('@acme/scene.charts') }`). A set naming a module the host's build does\n * not include is a diagnostic, never an attempt to load an arbitrary specifier.\n */\nexport type ApprovedPackageImporters = Record<string, () => Promise<Record<string, unknown>>>;\n\n/** The outcome of loading an approved package set. */\nexport interface LoadedApprovedPackages {\n /** The bundles that loaded and match what the set declared, in ordinal package-name order. */\n bundles: ScenePackageBundle[];\n\n /** Every reason a package was not loaded or does not match its declaration. */\n diagnostics: string[];\n}\n\n/**\n * Loads the runtime bundles of an approved package set through the host's importers.\n *\n * Nothing executes unless the host's policy allows executable imports. A package whose module cannot be imported,\n * lacks its declared export, or whose bundle manifest differs from the declaration (name, version, components,\n * layouts, templates, themes) contributes nothing and is reported - the declaration planning used and the code\n * running must be the same package. Packages load in ordinal name order, so the result does not depend on the\n * order the set was written in.\n */\nexport async function loadApprovedPackages(\n set: ApprovedPackageSet,\n importers: ApprovedPackageImporters,\n policy: { allowExecutableImports: boolean },\n): Promise<LoadedApprovedPackages> {\n const bundles: ScenePackageBundle[] = [];\n const diagnostics: string[] = [];\n const ordered = [...set.packages].sort((a, b) => (a.manifest.name < b.manifest.name ? -1 : a.manifest.name > b.manifest.name ? 1 : 0));\n\n for (const { manifest, module } of ordered) {\n const label = `Package '${manifest.name}'`;\n if (!policy.allowExecutableImports) {\n diagnostics.push(`${label} brings executable code from '${module.npm}', but host policy forbids executable imports`);\n continue;\n }\n\n const importer = Object.prototype.hasOwnProperty.call(importers, module.npm) ? importers[module.npm] : undefined;\n if (!importer) {\n diagnostics.push(`${label} is imported from '${module.npm}', which this host's build does not include`);\n continue;\n }\n\n let loaded: Record<string, unknown>;\n try {\n loaded = await importer();\n } catch (error) {\n diagnostics.push(`${label} could not be loaded from '${module.npm}': ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n\n const bundle = loaded[module.export] as ScenePackageBundle | undefined;\n if (!bundle || typeof bundle !== 'object' || !bundle.manifest || !bundle.components) {\n diagnostics.push(`${label} expects '${module.npm}' to export a package bundle named '${module.export}', which it does not`);\n continue;\n }\n\n const mismatches = declarationMismatches(manifest, bundle);\n if (mismatches.length > 0) {\n diagnostics.push(...mismatches.map(mismatch => `${label} does not match the bundle '${module.export}' of '${module.npm}': ${mismatch}`));\n continue;\n }\n\n bundles.push(bundle);\n }\n\n return { bundles, diagnostics };\n}\n\nfunction declarationMismatches(declared: ApprovedPackageSet['packages'][number]['manifest'], bundle: ScenePackageBundle): string[] {\n const actual = bundle.manifest;\n const mismatches: string[] = [];\n if (actual.name !== declared.name) mismatches.push(`the bundle is named '${actual.name}'`);\n if (actual.version !== declared.version) mismatches.push(`the set declares version ${declared.version} but the bundle is ${actual.version}`);\n if (actual.kind !== declared.kind) mismatches.push(`the set declares kind ${declared.kind} but the bundle is ${actual.kind}`);\n\n const lists = ['components', 'layouts', 'screenTemplates', 'dialogTemplates', 'themes'] as const;\n for (const list of lists) {\n const expected = [...(declared[list] ?? [])].sort();\n const found = [...(actual[list] ?? [])].sort();\n if (expected.join('\\u0000') !== found.join('\\u0000')) {\n mismatches.push(`the set declares ${list} [${expected.join(', ')}] but the bundle declares [${found.join(', ')}]`);\n }\n }\n\n return mismatches;\n}\n\n/** An approved package set and the importers that load it, resolved together with the built-in bundles. */\nexport interface ApprovedPackageHostConfiguration extends Omit<PackageHostConfiguration, 'bundles'> {\n /** The bundles the host ships. */\n bundles: ScenePackageBundle[];\n\n /** The custom packages the host approved. */\n packageSet: ApprovedPackageSet;\n\n /** The importers for the set's modules. */\n importers: ApprovedPackageImporters;\n}\n\n/**\n * Loads the approved package set and resolves the effective profile over the built-in and approved bundles in one\n * step. Packages that failed to load are reported in the result's `diagnostics` and block the host, so a profile\n * is never rendered with a silently missing package.\n */\nexport async function resolveApprovedPackageHost(configuration: ApprovedPackageHostConfiguration): Promise<ResolvedPackageHost> {\n const { packageSet, importers, ...rest } = configuration;\n const loaded = await loadApprovedPackages(packageSet, importers, configuration.policy);\n const host = resolvePackageHost({ ...rest, bundles: [...configuration.bundles, ...loaded.bundles] });\n if (loaded.diagnostics.length === 0) {\n return host;\n }\n\n return {\n ...host,\n bundles: [],\n components: {},\n layouts: [],\n screenTemplates: [],\n dialogTemplates: [],\n themes: [],\n layout: undefined,\n theme: undefined,\n templates: [],\n assets: [],\n fonts: [],\n blocked: true,\n diagnostics: [...loaded.diagnostics, ...host.diagnostics],\n };\n}\n"],"names":["loadApprovedPackages","set","importers","policy","bundles","diagnostics","ordered","packages","sort","a","b","manifest","name","module","label","allowExecutableImports","push","npm","importer","Object","prototype","hasOwnProperty","call","undefined","loaded","error","Error","message","String","bundle","export","components","mismatches","declarationMismatches","length","map","mismatch","declared","actual","version","kind","lists","list","expected","found","join","resolveApprovedPackageHost","configuration","packageSet","rest","host","resolvePackageHost","layouts","screenTemplates","dialogTemplates","themes","layout","theme","templates","assets","fonts","blocked"],"mappings":"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"}
|