@cratis/scene.react 4.14.0 → 4.15.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 +4 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/packages/PackageHostConfiguration.js +18 -2
- package/dist/cjs/packages/PackageHostConfiguration.js.map +1 -1
- package/dist/cjs/packages/isNetworkAsset.js +18 -0
- package/dist/cjs/packages/isNetworkAsset.js.map +1 -0
- package/dist/cjs/renderer/RenderBindingScopeContext.js +15 -5
- package/dist/cjs/renderer/RenderBindingScopeContext.js.map +1 -1
- package/dist/cjs/renderer/useBoundQuery.js +50 -0
- package/dist/cjs/renderer/useBoundQuery.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/packages/PackageHostConfiguration.d.ts +2 -0
- package/dist/esm/packages/PackageHostConfiguration.d.ts.map +1 -1
- package/dist/esm/packages/PackageHostConfiguration.js +19 -3
- package/dist/esm/packages/PackageHostConfiguration.js.map +1 -1
- package/dist/esm/packages/index.d.ts +1 -0
- package/dist/esm/packages/index.d.ts.map +1 -1
- package/dist/esm/packages/index.js +1 -0
- package/dist/esm/packages/index.js.map +1 -1
- package/dist/esm/packages/isNetworkAsset.d.ts +2 -0
- package/dist/esm/packages/isNetworkAsset.d.ts.map +1 -0
- package/dist/esm/packages/isNetworkAsset.js +16 -0
- package/dist/esm/packages/isNetworkAsset.js.map +1 -0
- package/dist/esm/renderer/RenderBindingScopeContext.d.ts.map +1 -1
- package/dist/esm/renderer/RenderBindingScopeContext.js +17 -7
- package/dist/esm/renderer/RenderBindingScopeContext.js.map +1 -1
- package/dist/esm/renderer/index.d.ts +1 -0
- package/dist/esm/renderer/index.d.ts.map +1 -1
- package/dist/esm/renderer/index.js +1 -0
- package/dist/esm/renderer/index.js.map +1 -1
- package/dist/esm/renderer/useBoundQuery.d.ts +3 -0
- package/dist/esm/renderer/useBoundQuery.d.ts.map +1 -0
- package/dist/esm/renderer/useBoundQuery.js +48 -0
- package/dist/esm/renderer/useBoundQuery.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/packages/PackageHostConfiguration.ts +26 -3
- package/packages/index.ts +1 -0
- package/packages/isNetworkAsset.ts +15 -0
- package/renderer/RenderBindingScopeContext.tsx +12 -8
- package/renderer/index.ts +1 -0
- package/renderer/useBoundQuery.ts +50 -0
package/dist/cjs/index.js
CHANGED
|
@@ -5,6 +5,7 @@ var AbortableQueryRunner = require('./renderer/AbortableQueryRunner.js');
|
|
|
5
5
|
var BindingOutputContext = require('./renderer/BindingOutputContext.js');
|
|
6
6
|
var RenderBindingScopeContext = require('./renderer/RenderBindingScopeContext.js');
|
|
7
7
|
var UnresolvedComponent = require('./renderer/UnresolvedComponent.js');
|
|
8
|
+
var useBoundQuery = require('./renderer/useBoundQuery.js');
|
|
8
9
|
var createReactRenderer = require('./renderer/createReactRenderer.js');
|
|
9
10
|
var InteractiveComponent = require('./renderer/InteractiveComponent.js');
|
|
10
11
|
var CoreText = require('./core/CoreText.js');
|
|
@@ -38,6 +39,7 @@ var DesignTimeExtensionPoint = require('./packages/DesignTimeExtensionPoint.js')
|
|
|
38
39
|
var DesignTimeProvider = require('./packages/DesignTimeProvider.js');
|
|
39
40
|
var EmbeddedPackageHost = require('./packages/EmbeddedPackageHost.js');
|
|
40
41
|
var loadDesignTimeContributions = require('./packages/loadDesignTimeContributions.js');
|
|
42
|
+
var isNetworkAsset = require('./packages/isNetworkAsset.js');
|
|
41
43
|
var PackageHostAssets = require('./packages/PackageHostAssets.js');
|
|
42
44
|
var PackageHostConfiguration = require('./packages/PackageHostConfiguration.js');
|
|
43
45
|
var PackageHostRenderMode = require('./packages/PackageHostRenderMode.js');
|
|
@@ -69,6 +71,7 @@ exports.RenderBindingScopeProvider = RenderBindingScopeContext.RenderBindingScop
|
|
|
69
71
|
exports.useRenderBindingResolver = RenderBindingScopeContext.useRenderBindingResolver;
|
|
70
72
|
exports.useRenderBindingScope = RenderBindingScopeContext.useRenderBindingScope;
|
|
71
73
|
exports.UnresolvedComponent = UnresolvedComponent.UnresolvedComponent;
|
|
74
|
+
exports.useBoundQuery = useBoundQuery.useBoundQuery;
|
|
72
75
|
exports.createReactRenderer = createReactRenderer.createReactRenderer;
|
|
73
76
|
exports.InteractiveComponent = InteractiveComponent.InteractiveComponent;
|
|
74
77
|
exports.CoreText = CoreText.CoreText;
|
|
@@ -118,6 +121,7 @@ exports.DesignTimeProvider = DesignTimeProvider.DesignTimeProvider;
|
|
|
118
121
|
exports.useDesignTimeContext = DesignTimeProvider.useDesignTimeContext;
|
|
119
122
|
exports.EmbeddedPackageHost = EmbeddedPackageHost.EmbeddedPackageHost;
|
|
120
123
|
exports.loadDesignTimeContributions = loadDesignTimeContributions.loadDesignTimeContributions;
|
|
124
|
+
exports.isNetworkAsset = isNetworkAsset.isNetworkAsset;
|
|
121
125
|
exports.PackageHostAssets = PackageHostAssets.PackageHostAssets;
|
|
122
126
|
exports.resolvePackageHost = PackageHostConfiguration.resolvePackageHost;
|
|
123
127
|
exports.PackageHostRenderMode = PackageHostRenderMode.PackageHostRenderMode;
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var scene_engine = require('@cratis/scene.engine');
|
|
4
4
|
var IconAdapterRegistry = require('../icons/IconAdapterRegistry.js');
|
|
5
5
|
var ScenePackageBundle = require('./ScenePackageBundle.js');
|
|
6
|
+
var isNetworkAsset = require('./isNetworkAsset.js');
|
|
6
7
|
|
|
7
8
|
// Copyright (c) Cratis. All rights reserved.
|
|
8
9
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
@@ -41,8 +42,9 @@ var ScenePackageBundle = require('./ScenePackageBundle.js');
|
|
|
41
42
|
diagnostics.push(`Package '${packageName}' provides executable design-time contributions, but host policy forbids them`);
|
|
42
43
|
}
|
|
43
44
|
const packageAssets = bundle.manifest.assets ?? [];
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
const networkAssets = packageAssets.filter(isNetworkAsset.isNetworkAsset);
|
|
46
|
+
if (!configuration.policy.allowNetworkAssets && networkAssets.length > 0) {
|
|
47
|
+
diagnostics.push(`Package '${packageName}' declares network assets (${networkAssets.join(', ')}), but host policy forbids them`);
|
|
46
48
|
}
|
|
47
49
|
assets.push(...packageAssets);
|
|
48
50
|
for (const dependency of bundle.manifest.runtimeSingletons ?? []){
|
|
@@ -54,6 +56,18 @@ var ScenePackageBundle = require('./ScenePackageBundle.js');
|
|
|
54
56
|
}
|
|
55
57
|
bundles.push(bundle);
|
|
56
58
|
}
|
|
59
|
+
const layouts = bundles.flatMap((bundle)=>bundle.layouts ?? []);
|
|
60
|
+
const themes = bundles.flatMap((bundle)=>bundle.themes ?? []);
|
|
61
|
+
const layout = configuration.profile.layout ? layouts.find((candidate)=>candidate.name === configuration.profile.layout) : undefined;
|
|
62
|
+
const theme = configuration.profile.theme ? themes.find((candidate)=>candidate.name === configuration.profile.theme) : undefined;
|
|
63
|
+
if (configuration.profile.layout && !layout) {
|
|
64
|
+
diagnostics.push(`UI profile '${configuration.profile.name}' uses layout '${configuration.profile.layout}', which no approved package provides`);
|
|
65
|
+
}
|
|
66
|
+
if (configuration.profile.theme && !theme) {
|
|
67
|
+
diagnostics.push(`UI profile '${configuration.profile.name}' uses theme '${configuration.profile.theme}', which no approved package provides`);
|
|
68
|
+
} else if (theme && scene_engine.incompatiblePackages(theme, configuration.profile).length > 0) {
|
|
69
|
+
diagnostics.push(`Theme '${theme.name}' is not compatible with ${scene_engine.incompatiblePackages(theme, configuration.profile).join(', ')} in UI profile '${configuration.profile.name}'`);
|
|
70
|
+
}
|
|
57
71
|
const blocked = diagnostics.length > 0;
|
|
58
72
|
const approved = blocked ? [] : bundles;
|
|
59
73
|
const approvedAssets = blocked ? [] : assets;
|
|
@@ -64,6 +78,8 @@ var ScenePackageBundle = require('./ScenePackageBundle.js');
|
|
|
64
78
|
screenTemplates: approved.flatMap((bundle)=>bundle.screenTemplates ?? []),
|
|
65
79
|
dialogTemplates: approved.flatMap((bundle)=>bundle.dialogTemplates ?? []),
|
|
66
80
|
themes: approved.flatMap((bundle)=>bundle.themes ?? []),
|
|
81
|
+
layout: blocked ? undefined : layout,
|
|
82
|
+
theme: blocked ? undefined : theme,
|
|
67
83
|
templates: scene_engine.describeTemplateCatalog(approved, configuration.sceneVersion),
|
|
68
84
|
icons: IconAdapterRegistry.createIconAdapterRegistry(approved.map((bundle)=>bundle.iconLibrary?.adapter).filter((adapter)=>adapter !== undefined)),
|
|
69
85
|
assets: approvedAssets,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PackageHostConfiguration.js","sources":["../../../packages/PackageHostConfiguration.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 { DialogTemplate, Layout, ScreenTemplate, Theme, UiProfile } from '@cratis/scene.model';\nimport { TemplateCatalogEntry, describeTemplateCatalog, resolvePackageDependencies } from '@cratis/scene.engine';\nimport { IconAdapterRegistry, createIconAdapterRegistry } from '../icons/IconAdapterRegistry';\nimport { ScenePackageBundle, mergePackageRegistries, validatePackageBundle } from './ScenePackageBundle';\n\nexport interface PackageHostPolicy {\n allowExecutableImports: boolean;\n allowNetworkAssets: boolean;\n\n /** Whether this host is resolving optional design-time bundles in addition to runtime contributions. */\n loadDesignTime?: boolean;\n}\n\nexport interface PackageHostConfiguration {\n bundles: ScenePackageBundle[];\n profile: UiProfile;\n policy: PackageHostPolicy;\n\n /** The Scene version the host runs, checked against each template's compatibility range when given. */\n sceneVersion?: string;\n}\n\nexport interface ResolvedPackageHost {\n bundles: ScenePackageBundle[];\n components: ReturnType<typeof mergePackageRegistries>;\n layouts: Layout[];\n screenTemplates: ScreenTemplate[];\n dialogTemplates: DialogTemplate[];\n themes: Theme[];\n\n /**\n * Every template the approved packages provide, with compatibility, attribution and license metadata and\n * whether it can be used with this package set. Template browsers read this rather than the raw lists.\n */\n templates: TemplateCatalogEntry[];\n icons: IconAdapterRegistry;\n assets: string[];\n fonts: string[];\n blocked: boolean;\n diagnostics: string[];\n}\n\n/**\n * Resolves the approved package set a standalone or embedded React host uses.\n */\nexport function resolvePackageHost(configuration: PackageHostConfiguration): ResolvedPackageHost {\n const diagnostics: string[] = [];\n const names = new Map<string, number>();\n for (const bundle of configuration.bundles) {\n names.set(bundle.manifest.name, (names.get(bundle.manifest.name) ?? 0) + 1);\n }\n\n for (const [name, count] of names) {\n if (count > 1) diagnostics.push(`Package '${name}' is approved more than once; duplicate bundles are ambiguous`);\n }\n\n const byName = new Map(configuration.bundles.map(bundle => [bundle.manifest.name, bundle]));\n const selection = resolvePackageDependencies(configuration.profile.packages, configuration.bundles.map(bundle => bundle.manifest));\n for (const missing of selection.missing) diagnostics.push(`Package '${missing.package}' depends on missing package '${missing.dependsOn}'`);\n for (const conflict of selection.versionConflicts) {\n diagnostics.push(`Package '${conflict.package}' requires '${conflict.dependsOn}' ${conflict.requiredRange} but approved version is ${conflict.actualVersion}`);\n }\n for (const cycle of selection.cycles) diagnostics.push(`Package dependency cycle: ${cycle.join(' -> ')}`);\n\n const bundles: ScenePackageBundle[] = [];\n const runtimeSingletons = new Map<string, string>();\n const assets: string[] = [];\n\n for (const packageName of selection.packages) {\n const bundle = byName.get(packageName);\n if (!bundle) {\n diagnostics.push(`UI profile asks for '${packageName}' but the host did not approve a bundle for it`);\n continue;\n }\n\n diagnostics.push(...validatePackageBundle(bundle).map(problem => `${packageName}: ${problem}`));\n if (configuration.policy.loadDesignTime === true && !configuration.policy.allowExecutableImports && bundle.designTime) {\n diagnostics.push(`Package '${packageName}' provides executable design-time contributions, but host policy forbids them`);\n }\n\n const packageAssets = bundle.manifest.assets ?? [];\n if (!configuration.policy.allowNetworkAssets && packageAssets.some(asset => /^https?:\\/\\//.test(asset))) {\n diagnostics.push(`Package '${packageName}' declares network assets, but host policy forbids them`);\n }\n assets.push(...packageAssets);\n\n for (const dependency of bundle.manifest.runtimeSingletons ?? []) {\n const owner = runtimeSingletons.get(dependency);\n if (owner && owner !== packageName) {\n diagnostics.push(`Runtime singleton '${dependency}' is provided by both '${owner}' and '${packageName}'`);\n }\n runtimeSingletons.set(dependency, packageName);\n }\n\n bundles.push(bundle);\n }\n\n const blocked = diagnostics.length > 0;\n const approved = blocked ? [] : bundles;\n const approvedAssets = blocked ? [] : assets;\n\n return {\n bundles: approved,\n components: mergePackageRegistries(approved),\n layouts: approved.flatMap(bundle => bundle.layouts ?? []),\n screenTemplates: approved.flatMap(bundle => bundle.screenTemplates ?? []),\n dialogTemplates: approved.flatMap(bundle => bundle.dialogTemplates ?? []),\n themes: approved.flatMap(bundle => bundle.themes ?? []),\n templates: describeTemplateCatalog(approved, configuration.sceneVersion),\n icons: createIconAdapterRegistry(approved.map(bundle => bundle.iconLibrary?.adapter).filter(adapter => adapter !== undefined)),\n assets: approvedAssets,\n fonts: approvedAssets.filter(isFontAsset),\n blocked,\n diagnostics,\n };\n}\n\nfunction isFontAsset(asset: string): boolean {\n return /\\.(woff2?|otf|ttf)(\\?|$)/.test(asset) || asset.includes('/fonts/');\n}\n"],"names":["resolvePackageHost","configuration","diagnostics","names","Map","bundle","bundles","set","manifest","name","get","count","push","byName","map","selection","resolvePackageDependencies","profile","packages","missing","package","dependsOn","conflict","versionConflicts","requiredRange","actualVersion","cycle","cycles","join","runtimeSingletons","assets","packageName","validatePackageBundle","problem","policy","loadDesignTime","allowExecutableImports","designTime","packageAssets","allowNetworkAssets","some","asset","test","dependency","owner","blocked","length","approved","approvedAssets","components","mergePackageRegistries","layouts","flatMap","screenTemplates","dialogTemplates","themes","templates","describeTemplateCatalog","sceneVersion","icons","createIconAdapterRegistry","iconLibrary","adapter","filter","undefined","fonts","isFontAsset","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PackageHostConfiguration.js","sources":["../../../packages/PackageHostConfiguration.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 { DialogTemplate, Layout, ScreenTemplate, Theme, UiProfile } from '@cratis/scene.model';\nimport { TemplateCatalogEntry, describeTemplateCatalog, incompatiblePackages, resolvePackageDependencies } from '@cratis/scene.engine';\nimport { IconAdapterRegistry, createIconAdapterRegistry } from '../icons/IconAdapterRegistry';\nimport { ScenePackageBundle, mergePackageRegistries, validatePackageBundle } from './ScenePackageBundle';\nimport { isNetworkAsset } from './isNetworkAsset';\n\nexport interface PackageHostPolicy {\n allowExecutableImports: boolean;\n allowNetworkAssets: boolean;\n\n /** Whether this host is resolving optional design-time bundles in addition to runtime contributions. */\n loadDesignTime?: boolean;\n}\n\nexport interface PackageHostConfiguration {\n bundles: ScenePackageBundle[];\n profile: UiProfile;\n policy: PackageHostPolicy;\n\n /** The Scene version the host runs, checked against each template's compatibility range when given. */\n sceneVersion?: string;\n}\n\nexport interface ResolvedPackageHost {\n bundles: ScenePackageBundle[];\n components: ReturnType<typeof mergePackageRegistries>;\n layouts: Layout[];\n screenTemplates: ScreenTemplate[];\n dialogTemplates: DialogTemplate[];\n themes: Theme[];\n\n /** The layout the UI profile names, from the approved packages. Absent when the profile names none. */\n layout?: Layout;\n\n /** The theme the UI profile names, from the approved packages. Absent when the profile names none. */\n theme?: Theme;\n\n /**\n * Every template the approved packages provide, with compatibility, attribution and license metadata and\n * whether it can be used with this package set. Template browsers read this rather than the raw lists.\n */\n templates: TemplateCatalogEntry[];\n icons: IconAdapterRegistry;\n assets: string[];\n fonts: string[];\n blocked: boolean;\n diagnostics: string[];\n}\n\n/**\n * Resolves the approved package set a standalone or embedded React host uses.\n */\nexport function resolvePackageHost(configuration: PackageHostConfiguration): ResolvedPackageHost {\n const diagnostics: string[] = [];\n const names = new Map<string, number>();\n for (const bundle of configuration.bundles) {\n names.set(bundle.manifest.name, (names.get(bundle.manifest.name) ?? 0) + 1);\n }\n\n for (const [name, count] of names) {\n if (count > 1) diagnostics.push(`Package '${name}' is approved more than once; duplicate bundles are ambiguous`);\n }\n\n const byName = new Map(configuration.bundles.map(bundle => [bundle.manifest.name, bundle]));\n const selection = resolvePackageDependencies(configuration.profile.packages, configuration.bundles.map(bundle => bundle.manifest));\n for (const missing of selection.missing) diagnostics.push(`Package '${missing.package}' depends on missing package '${missing.dependsOn}'`);\n for (const conflict of selection.versionConflicts) {\n diagnostics.push(`Package '${conflict.package}' requires '${conflict.dependsOn}' ${conflict.requiredRange} but approved version is ${conflict.actualVersion}`);\n }\n for (const cycle of selection.cycles) diagnostics.push(`Package dependency cycle: ${cycle.join(' -> ')}`);\n\n const bundles: ScenePackageBundle[] = [];\n const runtimeSingletons = new Map<string, string>();\n const assets: string[] = [];\n\n for (const packageName of selection.packages) {\n const bundle = byName.get(packageName);\n if (!bundle) {\n diagnostics.push(`UI profile asks for '${packageName}' but the host did not approve a bundle for it`);\n continue;\n }\n\n diagnostics.push(...validatePackageBundle(bundle).map(problem => `${packageName}: ${problem}`));\n if (configuration.policy.loadDesignTime === true && !configuration.policy.allowExecutableImports && bundle.designTime) {\n diagnostics.push(`Package '${packageName}' provides executable design-time contributions, but host policy forbids them`);\n }\n\n const packageAssets = bundle.manifest.assets ?? [];\n const networkAssets = packageAssets.filter(isNetworkAsset);\n if (!configuration.policy.allowNetworkAssets && networkAssets.length > 0) {\n diagnostics.push(`Package '${packageName}' declares network assets (${networkAssets.join(', ')}), but host policy forbids them`);\n }\n assets.push(...packageAssets);\n\n for (const dependency of bundle.manifest.runtimeSingletons ?? []) {\n const owner = runtimeSingletons.get(dependency);\n if (owner && owner !== packageName) {\n diagnostics.push(`Runtime singleton '${dependency}' is provided by both '${owner}' and '${packageName}'`);\n }\n runtimeSingletons.set(dependency, packageName);\n }\n\n bundles.push(bundle);\n }\n\n const layouts = bundles.flatMap(bundle => bundle.layouts ?? []);\n const themes = bundles.flatMap(bundle => bundle.themes ?? []);\n const layout = configuration.profile.layout ? layouts.find(candidate => candidate.name === configuration.profile.layout) : undefined;\n const theme = configuration.profile.theme ? themes.find(candidate => candidate.name === configuration.profile.theme) : undefined;\n if (configuration.profile.layout && !layout) {\n diagnostics.push(`UI profile '${configuration.profile.name}' uses layout '${configuration.profile.layout}', which no approved package provides`);\n }\n if (configuration.profile.theme && !theme) {\n diagnostics.push(`UI profile '${configuration.profile.name}' uses theme '${configuration.profile.theme}', which no approved package provides`);\n } else if (theme && incompatiblePackages(theme, configuration.profile).length > 0) {\n diagnostics.push(`Theme '${theme.name}' is not compatible with ${incompatiblePackages(theme, configuration.profile).join(', ')} in UI profile '${configuration.profile.name}'`);\n }\n\n const blocked = diagnostics.length > 0;\n const approved = blocked ? [] : bundles;\n const approvedAssets = blocked ? [] : assets;\n\n return {\n bundles: approved,\n components: mergePackageRegistries(approved),\n layouts: approved.flatMap(bundle => bundle.layouts ?? []),\n screenTemplates: approved.flatMap(bundle => bundle.screenTemplates ?? []),\n dialogTemplates: approved.flatMap(bundle => bundle.dialogTemplates ?? []),\n themes: approved.flatMap(bundle => bundle.themes ?? []),\n layout: blocked ? undefined : layout,\n theme: blocked ? undefined : theme,\n templates: describeTemplateCatalog(approved, configuration.sceneVersion),\n icons: createIconAdapterRegistry(approved.map(bundle => bundle.iconLibrary?.adapter).filter(adapter => adapter !== undefined)),\n assets: approvedAssets,\n fonts: approvedAssets.filter(isFontAsset),\n blocked,\n diagnostics,\n };\n}\n\nfunction isFontAsset(asset: string): boolean {\n return /\\.(woff2?|otf|ttf)(\\?|$)/.test(asset) || asset.includes('/fonts/');\n}\n"],"names":["resolvePackageHost","configuration","diagnostics","names","Map","bundle","bundles","set","manifest","name","get","count","push","byName","map","selection","resolvePackageDependencies","profile","packages","missing","package","dependsOn","conflict","versionConflicts","requiredRange","actualVersion","cycle","cycles","join","runtimeSingletons","assets","packageName","validatePackageBundle","problem","policy","loadDesignTime","allowExecutableImports","designTime","packageAssets","networkAssets","filter","isNetworkAsset","allowNetworkAssets","length","dependency","owner","layouts","flatMap","themes","layout","find","candidate","undefined","theme","incompatiblePackages","blocked","approved","approvedAssets","components","mergePackageRegistries","screenTemplates","dialogTemplates","templates","describeTemplateCatalog","sceneVersion","icons","createIconAdapterRegistry","iconLibrary","adapter","fonts","isFontAsset","asset","test","includes"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
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
|
+
* Whether loading an asset reaches beyond the host: an absolute URL with any scheme other than `data:`
|
|
7
|
+
* or `blob:` (`https://`, `http://`, `ws://`, `ftp://`), or a protocol-relative `//host/...` reference. A
|
|
8
|
+
* package-relative path or a bare module specifier such as `@cratis/components/styles` is resolved by the
|
|
9
|
+
* host from what it bundled, so it is not a network asset.
|
|
10
|
+
*/ function isNetworkAsset(asset) {
|
|
11
|
+
const trimmed = asset.trim();
|
|
12
|
+
if (trimmed.startsWith('//')) return true;
|
|
13
|
+
const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(trimmed)?.[1]?.toLowerCase();
|
|
14
|
+
return scheme !== undefined && scheme !== 'data' && scheme !== 'blob';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.isNetworkAsset = isNetworkAsset;
|
|
18
|
+
//# sourceMappingURL=isNetworkAsset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNetworkAsset.js","sources":["../../../packages/isNetworkAsset.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\n/**\n * Whether loading an asset reaches beyond the host: an absolute URL with any scheme other than `data:`\n * or `blob:` (`https://`, `http://`, `ws://`, `ftp://`), or a protocol-relative `//host/...` reference. A\n * package-relative path or a bare module specifier such as `@cratis/components/styles` is resolved by the\n * host from what it bundled, so it is not a network asset.\n */\nexport function isNetworkAsset(asset: string): boolean {\n const trimmed = asset.trim();\n if (trimmed.startsWith('//')) return true;\n const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(trimmed)?.[1]?.toLowerCase();\n return scheme !== undefined && scheme !== 'data' && scheme !== 'blob';\n}\n"],"names":["isNetworkAsset","asset","trimmed","trim","startsWith","scheme","exec","toLowerCase","undefined"],"mappings":";;AAAA;AACA;AAEA;;;;;IAMO,SAASA,cAAAA,CAAeC,KAAa,EAAA;IACxC,MAAMC,OAAAA,GAAUD,MAAME,IAAI,EAAA;AAC1B,IAAA,IAAID,OAAAA,CAAQE,UAAU,CAAC,IAAA,CAAA,EAAO,OAAO,IAAA;AACrC,IAAA,MAAMC,SAAS,6BAAA,CAA8BC,IAAI,CAACJ,OAAAA,CAAAA,GAAW,EAAE,EAAEK,WAAAA,EAAAA;AACjE,IAAA,OAAOF,MAAAA,KAAWG,SAAAA,IAAaH,MAAAA,KAAW,MAAA,IAAUA,MAAAA,KAAW,MAAA;AACnE;;"}
|
|
@@ -9,10 +9,16 @@ var BindingOutputContext = require('./BindingOutputContext.js');
|
|
|
9
9
|
const Context = /*#__PURE__*/ react.createContext(undefined);
|
|
10
10
|
/**
|
|
11
11
|
* Provides the inherited reactive binding scope for a rendered Scene tree.
|
|
12
|
+
*
|
|
13
|
+
* The outermost provider owns the component output scope. A provider rendered inside another - a nested
|
|
14
|
+
* template or region - nests its own data context, query results and component outputs over the inherited
|
|
15
|
+
* scope with `nestBindingScope`, so a detail region bound to the selected row reads that row while still
|
|
16
|
+
* seeing the screen's queries and every component's outputs.
|
|
12
17
|
*/ function RenderBindingScopeProvider(props) {
|
|
13
18
|
const current = react.useContext(Context);
|
|
14
|
-
if (current) return /*#__PURE__*/ jsxRuntime.jsx(
|
|
15
|
-
|
|
19
|
+
if (current) return /*#__PURE__*/ jsxRuntime.jsx(RenderBindingScopeInner, {
|
|
20
|
+
...props,
|
|
21
|
+
parent: current.scope
|
|
16
22
|
});
|
|
17
23
|
return /*#__PURE__*/ jsxRuntime.jsx(BindingOutputContext.BindingOutputProvider, {
|
|
18
24
|
onOutputsChanged: props.onComponentOutputsChanged,
|
|
@@ -21,20 +27,24 @@ const Context = /*#__PURE__*/ react.createContext(undefined);
|
|
|
21
27
|
})
|
|
22
28
|
});
|
|
23
29
|
}
|
|
24
|
-
function RenderBindingScopeInner({ children, dataContext, queryResults, componentOutputs, resolveBinding }) {
|
|
30
|
+
function RenderBindingScopeInner({ children, dataContext, queryResults, componentOutputs, resolveBinding, parent }) {
|
|
25
31
|
const outputs = BindingOutputContext.useBindingOutputScope();
|
|
26
32
|
const previousValues = react.useRef(new Map());
|
|
27
|
-
const scope = react.useMemo(()=>
|
|
33
|
+
const scope = react.useMemo(()=>{
|
|
34
|
+
const own = {
|
|
28
35
|
dataContext,
|
|
29
36
|
queryResults,
|
|
30
37
|
componentOutputs: {
|
|
31
38
|
...componentOutputs ?? {},
|
|
32
39
|
...outputs
|
|
33
40
|
}
|
|
34
|
-
}
|
|
41
|
+
};
|
|
42
|
+
return parent ? scene_engine.nestBindingScope(parent, own) : own;
|
|
43
|
+
}, [
|
|
35
44
|
componentOutputs,
|
|
36
45
|
dataContext,
|
|
37
46
|
outputs,
|
|
47
|
+
parent,
|
|
38
48
|
queryResults
|
|
39
49
|
]);
|
|
40
50
|
const resolver = react.useCallback((binding)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderBindingScopeContext.js","sources":["../../../renderer/RenderBindingScopeContext.tsx"],"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 { ReactNode, createContext, useCallback, useContext, useMemo, useRef } from 'react';\nimport { BindingResolver, BindingScope, resolveBindingExpression } from '@cratis/scene.engine';\nimport { BindingExpression, BindingNullBehavior } from '@cratis/scene.model';\nimport { BindingOutputProvider, useBindingOutputScope } from './BindingOutputContext';\n\ninterface RenderBindingScopeValue {\n resolveBinding: BindingResolver;\n scope: BindingScope;\n}\n\nconst Context = createContext<RenderBindingScopeValue | undefined>(undefined);\n\nexport interface RenderBindingScopeProviderProps {\n children: ReactNode;\n dataContext?: unknown;\n queryResults?: Record<string, unknown>;\n componentOutputs?: Record<string, Record<string, unknown>>;\n resolveBinding?: BindingResolver;\n onComponentOutputsChanged?: (outputs: Record<string, Record<string, unknown>>) => void;\n}\n\n/**\n * Provides the inherited reactive binding scope for a rendered Scene tree.\n */\nexport function RenderBindingScopeProvider(props: RenderBindingScopeProviderProps) {\n const current = useContext(Context);\n if (current) return
|
|
1
|
+
{"version":3,"file":"RenderBindingScopeContext.js","sources":["../../../renderer/RenderBindingScopeContext.tsx"],"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 { ReactNode, createContext, useCallback, useContext, useMemo, useRef } from 'react';\nimport { BindingResolver, BindingScope, nestBindingScope, resolveBindingExpression } from '@cratis/scene.engine';\nimport { BindingExpression, BindingNullBehavior } from '@cratis/scene.model';\nimport { BindingOutputProvider, useBindingOutputScope } from './BindingOutputContext';\n\ninterface RenderBindingScopeValue {\n resolveBinding: BindingResolver;\n scope: BindingScope;\n}\n\nconst Context = createContext<RenderBindingScopeValue | undefined>(undefined);\n\nexport interface RenderBindingScopeProviderProps {\n children: ReactNode;\n dataContext?: unknown;\n queryResults?: Record<string, unknown>;\n componentOutputs?: Record<string, Record<string, unknown>>;\n resolveBinding?: BindingResolver;\n onComponentOutputsChanged?: (outputs: Record<string, Record<string, unknown>>) => void;\n}\n\n/**\n * Provides the inherited reactive binding scope for a rendered Scene tree.\n *\n * The outermost provider owns the component output scope. A provider rendered inside another - a nested\n * template or region - nests its own data context, query results and component outputs over the inherited\n * scope with `nestBindingScope`, so a detail region bound to the selected row reads that row while still\n * seeing the screen's queries and every component's outputs.\n */\nexport function RenderBindingScopeProvider(props: RenderBindingScopeProviderProps) {\n const current = useContext(Context);\n if (current) return <RenderBindingScopeInner {...props} parent={current.scope} />;\n\n return (\n <BindingOutputProvider onOutputsChanged={props.onComponentOutputsChanged}>\n <RenderBindingScopeInner {...props} />\n </BindingOutputProvider>\n );\n}\n\nfunction RenderBindingScopeInner({ children, dataContext, queryResults, componentOutputs, resolveBinding, parent }: RenderBindingScopeProviderProps & { parent?: BindingScope }) {\n const outputs = useBindingOutputScope();\n const previousValues = useRef(new Map<string, unknown>());\n const scope = useMemo<BindingScope>(() => {\n const own = { dataContext, queryResults, componentOutputs: { ...(componentOutputs ?? {}), ...outputs } };\n return parent ? nestBindingScope(parent, own) : own;\n }, [componentOutputs, dataContext, outputs, parent, queryResults]);\n\n const resolver = useCallback<BindingResolver>((binding: BindingExpression) => {\n if (!binding.kind && resolveBinding) return resolveBinding(binding);\n\n const key = JSON.stringify(binding);\n const value = resolveBindingExpression(binding, scope);\n if (binding.nullBehavior === BindingNullBehavior.Preserve && value === undefined) {\n return previousValues.current.get(key);\n }\n\n if (value !== undefined) previousValues.current.set(key, value);\n return value;\n }, [resolveBinding, scope]);\n\n const value = useMemo<RenderBindingScopeValue>(() => ({ resolveBinding: resolver, scope }), [resolver, scope]);\n return <Context.Provider value={value}>{children}</Context.Provider>;\n}\n\nexport function useRenderBindingResolver(): BindingResolver {\n const context = useContext(Context);\n if (!context) throw new Error('No Scene render binding scope is available.');\n return context.resolveBinding;\n}\n\nexport function useRenderBindingScope(): BindingScope {\n return useContext(Context)?.scope ?? {};\n}\n"],"names":["Context","createContext","undefined","RenderBindingScopeProvider","props","current","useContext","_jsx","RenderBindingScopeInner","parent","scope","BindingOutputProvider","onOutputsChanged","onComponentOutputsChanged","children","dataContext","queryResults","componentOutputs","resolveBinding","outputs","useBindingOutputScope","previousValues","useRef","Map","useMemo","own","nestBindingScope","resolver","useCallback","binding","kind","key","JSON","stringify","value","resolveBindingExpression","nullBehavior","BindingNullBehavior","Preserve","get","set","Provider","useRenderBindingResolver","context","Error","useRenderBindingScope"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var scene_engine = require('@cratis/scene.engine');
|
|
5
|
+
|
|
6
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
7
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
8
|
+
/**
|
|
9
|
+
* Runs a bound query whenever its arguments change and returns the accepted query results.
|
|
10
|
+
*
|
|
11
|
+
* Each change of arguments rebinds the query: the previous run is aborted and, should its answer still
|
|
12
|
+
* arrive, discarded by `QueryBindingState` - a slow result for a previous selection never replaces the
|
|
13
|
+
* current one. Arguments of `undefined` mean the binding is cleared, as when a selection is cleared, so the
|
|
14
|
+
* result is removed, and so is it when the current run fails - a failed rebind must not leave the previous
|
|
15
|
+
* selection's data on screen. The results are keyed by `query`, ready to pass as a scope's `queryResults`.
|
|
16
|
+
*/ function useBoundQuery(query, argumentsValue, perform) {
|
|
17
|
+
const state = react.useMemo(()=>new scene_engine.QueryBindingState(), []);
|
|
18
|
+
const [results, setResults] = react.useState({});
|
|
19
|
+
const key = argumentsValue === undefined ? undefined : JSON.stringify(argumentsValue);
|
|
20
|
+
const latestArguments = react.useRef(argumentsValue);
|
|
21
|
+
latestArguments.current = argumentsValue;
|
|
22
|
+
// The arguments are compared by value through `key`; the effect reads them from `latestArguments`.
|
|
23
|
+
react.useEffect(()=>{
|
|
24
|
+
const argumentsForRun = latestArguments.current;
|
|
25
|
+
if (argumentsForRun === undefined) {
|
|
26
|
+
state.clear(query);
|
|
27
|
+
setResults(state.queryResults);
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
const ticket = state.begin(query);
|
|
32
|
+
perform(query, argumentsForRun, controller.signal).then((result)=>{
|
|
33
|
+
if (state.complete(ticket, result)) setResults(state.queryResults);
|
|
34
|
+
}, ()=>{
|
|
35
|
+
if (controller.signal.aborted || !state.complete(ticket, undefined)) return;
|
|
36
|
+
state.clear(query);
|
|
37
|
+
setResults(state.queryResults);
|
|
38
|
+
});
|
|
39
|
+
return ()=>controller.abort();
|
|
40
|
+
}, [
|
|
41
|
+
key,
|
|
42
|
+
perform,
|
|
43
|
+
query,
|
|
44
|
+
state
|
|
45
|
+
]);
|
|
46
|
+
return results;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
exports.useBoundQuery = useBoundQuery;
|
|
50
|
+
//# sourceMappingURL=useBoundQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBoundQuery.js","sources":["../../../renderer/useBoundQuery.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 { useEffect, useMemo, useRef, useState } from 'react';\nimport { QueryBindingState } from '@cratis/scene.engine';\nimport { QueryPerformer } from './AbortableQueryRunner';\n\n/**\n * Runs a bound query whenever its arguments change and returns the accepted query results.\n *\n * Each change of arguments rebinds the query: the previous run is aborted and, should its answer still\n * arrive, discarded by `QueryBindingState` - a slow result for a previous selection never replaces the\n * current one. Arguments of `undefined` mean the binding is cleared, as when a selection is cleared, so the\n * result is removed, and so is it when the current run fails - a failed rebind must not leave the previous\n * selection's data on screen. The results are keyed by `query`, ready to pass as a scope's `queryResults`.\n */\nexport function useBoundQuery(query: string, argumentsValue: unknown, perform: QueryPerformer): Record<string, unknown> {\n const state = useMemo(() => new QueryBindingState(), []);\n const [results, setResults] = useState<Record<string, unknown>>({});\n const key = argumentsValue === undefined ? undefined : JSON.stringify(argumentsValue);\n const latestArguments = useRef(argumentsValue);\n latestArguments.current = argumentsValue;\n\n // The arguments are compared by value through `key`; the effect reads them from `latestArguments`.\n useEffect(() => {\n const argumentsForRun = latestArguments.current;\n if (argumentsForRun === undefined) {\n state.clear(query);\n setResults(state.queryResults);\n return undefined;\n }\n\n const controller = new AbortController();\n const ticket = state.begin(query);\n perform(query, argumentsForRun, controller.signal).then(\n result => {\n if (state.complete(ticket, result)) setResults(state.queryResults);\n },\n () => {\n if (controller.signal.aborted || !state.complete(ticket, undefined)) return;\n state.clear(query);\n setResults(state.queryResults);\n },\n );\n\n return () => controller.abort();\n }, [key, perform, query, state]);\n\n return results;\n}\n"],"names":["useBoundQuery","query","argumentsValue","perform","state","useMemo","QueryBindingState","results","setResults","useState","key","undefined","JSON","stringify","latestArguments","useRef","current","useEffect","argumentsForRun","clear","queryResults","controller","AbortController","ticket","begin","signal","then","result","complete","aborted","abort"],"mappings":";;;;;AAAA;AACA;AAMA;;;;;;;;AAQC,IACM,SAASA,aAAAA,CAAcC,KAAa,EAAEC,cAAuB,EAAEC,OAAuB,EAAA;AACzF,IAAA,MAAMC,KAAAA,GAAQC,aAAAA,CAAQ,IAAM,IAAIC,kCAAqB,EAAE,CAAA;AACvD,IAAA,MAAM,CAACC,OAAAA,EAASC,UAAAA,CAAW,GAAGC,eAAkC,EAAC,CAAA;AACjE,IAAA,MAAMC,MAAMR,cAAAA,KAAmBS,SAAAA,GAAYA,SAAAA,GAAYC,IAAAA,CAAKC,SAAS,CAACX,cAAAA,CAAAA;AACtE,IAAA,MAAMY,kBAAkBC,YAAAA,CAAOb,cAAAA,CAAAA;AAC/BY,IAAAA,eAAAA,CAAgBE,OAAO,GAAGd,cAAAA;;IAG1Be,eAAAA,CAAU,IAAA;QACN,MAAMC,eAAAA,GAAkBJ,gBAAgBE,OAAO;AAC/C,QAAA,IAAIE,oBAAoBP,SAAAA,EAAW;AAC/BP,YAAAA,KAAAA,CAAMe,KAAK,CAAClB,KAAAA,CAAAA;AACZO,YAAAA,UAAAA,CAAWJ,MAAMgB,YAAY,CAAA;YAC7B,OAAOT,SAAAA;AACX,QAAA;AAEA,QAAA,MAAMU,aAAa,IAAIC,eAAAA,EAAAA;QACvB,MAAMC,MAAAA,GAASnB,KAAAA,CAAMoB,KAAK,CAACvB,KAAAA,CAAAA;AAC3BE,QAAAA,OAAAA,CAAQF,OAAOiB,eAAAA,EAAiBG,UAAAA,CAAWI,MAAM,CAAA,CAAEC,IAAI,CACnDC,CAAAA,MAAAA,GAAAA;AACI,YAAA,IAAIvB,MAAMwB,QAAQ,CAACL,QAAQI,MAAAA,CAAAA,EAASnB,UAAAA,CAAWJ,MAAMgB,YAAY,CAAA;QACrE,CAAA,EACA,IAAA;YACI,IAAIC,UAAAA,CAAWI,MAAM,CAACI,OAAO,IAAI,CAACzB,KAAAA,CAAMwB,QAAQ,CAACL,MAAAA,EAAQZ,SAAAA,CAAAA,EAAY;AACrEP,YAAAA,KAAAA,CAAMe,KAAK,CAAClB,KAAAA,CAAAA;AACZO,YAAAA,UAAAA,CAAWJ,MAAMgB,YAAY,CAAA;AACjC,QAAA,CAAA,CAAA;QAGJ,OAAO,IAAMC,WAAWS,KAAK,EAAA;IACjC,CAAA,EAAG;AAACpB,QAAAA,GAAAA;AAAKP,QAAAA,OAAAA;AAASF,QAAAA,KAAAA;AAAOG,QAAAA;AAAM,KAAA,CAAA;IAE/B,OAAOG,OAAAA;AACX;;"}
|
package/dist/esm/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export { AbortableQueryRunner } from './renderer/AbortableQueryRunner.js';
|
|
|
3
3
|
export { BindingOutputProvider, useBindingOutputScope, useBindingOutputs } from './renderer/BindingOutputContext.js';
|
|
4
4
|
export { RenderBindingScopeProvider, useRenderBindingResolver, useRenderBindingScope } from './renderer/RenderBindingScopeContext.js';
|
|
5
5
|
export { UnresolvedComponent } from './renderer/UnresolvedComponent.js';
|
|
6
|
+
export { useBoundQuery } from './renderer/useBoundQuery.js';
|
|
6
7
|
export { createReactRenderer } from './renderer/createReactRenderer.js';
|
|
7
8
|
export { InteractiveComponent } from './renderer/InteractiveComponent.js';
|
|
8
9
|
export { CoreText } from './core/CoreText.js';
|
|
@@ -36,6 +37,7 @@ export { DesignTimeExtensionPoint, designTimeExtensionPointLabels } from './pack
|
|
|
36
37
|
export { DesignTimeProvider, useDesignTimeContext } from './packages/DesignTimeProvider.js';
|
|
37
38
|
export { EmbeddedPackageHost } from './packages/EmbeddedPackageHost.js';
|
|
38
39
|
export { loadDesignTimeContributions } from './packages/loadDesignTimeContributions.js';
|
|
40
|
+
export { isNetworkAsset } from './packages/isNetworkAsset.js';
|
|
39
41
|
export { PackageHostAssets } from './packages/PackageHostAssets.js';
|
|
40
42
|
export { resolvePackageHost } from './packages/PackageHostConfiguration.js';
|
|
41
43
|
export { PackageHostRenderMode } from './packages/PackageHostRenderMode.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -20,6 +20,8 @@ export interface ResolvedPackageHost {
|
|
|
20
20
|
screenTemplates: ScreenTemplate[];
|
|
21
21
|
dialogTemplates: DialogTemplate[];
|
|
22
22
|
themes: Theme[];
|
|
23
|
+
layout?: Layout;
|
|
24
|
+
theme?: Theme;
|
|
23
25
|
templates: TemplateCatalogEntry[];
|
|
24
26
|
icons: IconAdapterRegistry;
|
|
25
27
|
assets: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PackageHostConfiguration.d.ts","sourceRoot":"","sources":["../../../packages/PackageHostConfiguration.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"PackageHostConfiguration.d.ts","sourceRoot":"","sources":["../../../packages/PackageHostConfiguration.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAA6E,MAAM,sBAAsB,CAAC;AACvI,OAAO,EAAE,mBAAmB,EAA6B,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAyB,MAAM,sBAAsB,CAAC;AAGzG,MAAM,WAAW,iBAAiB;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAG5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAG1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,UAAU,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,CAAC;IAGhB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,KAAK,CAAC,EAAE,KAAK,CAAC;IAMd,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAKD,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,wBAAwB,GAAG,mBAAmB,CAsF/F"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { resolvePackageDependencies, describeTemplateCatalog } from '@cratis/scene.engine';
|
|
1
|
+
import { resolvePackageDependencies, incompatiblePackages, describeTemplateCatalog } from '@cratis/scene.engine';
|
|
2
2
|
import { createIconAdapterRegistry } from '../icons/IconAdapterRegistry.js';
|
|
3
3
|
import { validatePackageBundle, mergePackageRegistries } from './ScenePackageBundle.js';
|
|
4
|
+
import { isNetworkAsset } from './isNetworkAsset.js';
|
|
4
5
|
|
|
5
6
|
// Copyright (c) Cratis. All rights reserved.
|
|
6
7
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
@@ -39,8 +40,9 @@ import { validatePackageBundle, mergePackageRegistries } from './ScenePackageBun
|
|
|
39
40
|
diagnostics.push(`Package '${packageName}' provides executable design-time contributions, but host policy forbids them`);
|
|
40
41
|
}
|
|
41
42
|
const packageAssets = bundle.manifest.assets ?? [];
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
const networkAssets = packageAssets.filter(isNetworkAsset);
|
|
44
|
+
if (!configuration.policy.allowNetworkAssets && networkAssets.length > 0) {
|
|
45
|
+
diagnostics.push(`Package '${packageName}' declares network assets (${networkAssets.join(', ')}), but host policy forbids them`);
|
|
44
46
|
}
|
|
45
47
|
assets.push(...packageAssets);
|
|
46
48
|
for (const dependency of bundle.manifest.runtimeSingletons ?? []){
|
|
@@ -52,6 +54,18 @@ import { validatePackageBundle, mergePackageRegistries } from './ScenePackageBun
|
|
|
52
54
|
}
|
|
53
55
|
bundles.push(bundle);
|
|
54
56
|
}
|
|
57
|
+
const layouts = bundles.flatMap((bundle)=>bundle.layouts ?? []);
|
|
58
|
+
const themes = bundles.flatMap((bundle)=>bundle.themes ?? []);
|
|
59
|
+
const layout = configuration.profile.layout ? layouts.find((candidate)=>candidate.name === configuration.profile.layout) : undefined;
|
|
60
|
+
const theme = configuration.profile.theme ? themes.find((candidate)=>candidate.name === configuration.profile.theme) : undefined;
|
|
61
|
+
if (configuration.profile.layout && !layout) {
|
|
62
|
+
diagnostics.push(`UI profile '${configuration.profile.name}' uses layout '${configuration.profile.layout}', which no approved package provides`);
|
|
63
|
+
}
|
|
64
|
+
if (configuration.profile.theme && !theme) {
|
|
65
|
+
diagnostics.push(`UI profile '${configuration.profile.name}' uses theme '${configuration.profile.theme}', which no approved package provides`);
|
|
66
|
+
} else if (theme && incompatiblePackages(theme, configuration.profile).length > 0) {
|
|
67
|
+
diagnostics.push(`Theme '${theme.name}' is not compatible with ${incompatiblePackages(theme, configuration.profile).join(', ')} in UI profile '${configuration.profile.name}'`);
|
|
68
|
+
}
|
|
55
69
|
const blocked = diagnostics.length > 0;
|
|
56
70
|
const approved = blocked ? [] : bundles;
|
|
57
71
|
const approvedAssets = blocked ? [] : assets;
|
|
@@ -62,6 +76,8 @@ import { validatePackageBundle, mergePackageRegistries } from './ScenePackageBun
|
|
|
62
76
|
screenTemplates: approved.flatMap((bundle)=>bundle.screenTemplates ?? []),
|
|
63
77
|
dialogTemplates: approved.flatMap((bundle)=>bundle.dialogTemplates ?? []),
|
|
64
78
|
themes: approved.flatMap((bundle)=>bundle.themes ?? []),
|
|
79
|
+
layout: blocked ? undefined : layout,
|
|
80
|
+
theme: blocked ? undefined : theme,
|
|
65
81
|
templates: describeTemplateCatalog(approved, configuration.sceneVersion),
|
|
66
82
|
icons: createIconAdapterRegistry(approved.map((bundle)=>bundle.iconLibrary?.adapter).filter((adapter)=>adapter !== undefined)),
|
|
67
83
|
assets: approvedAssets,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PackageHostConfiguration.js","sources":["../../../packages/PackageHostConfiguration.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 { DialogTemplate, Layout, ScreenTemplate, Theme, UiProfile } from '@cratis/scene.model';\nimport { TemplateCatalogEntry, describeTemplateCatalog, resolvePackageDependencies } from '@cratis/scene.engine';\nimport { IconAdapterRegistry, createIconAdapterRegistry } from '../icons/IconAdapterRegistry';\nimport { ScenePackageBundle, mergePackageRegistries, validatePackageBundle } from './ScenePackageBundle';\n\nexport interface PackageHostPolicy {\n allowExecutableImports: boolean;\n allowNetworkAssets: boolean;\n\n /** Whether this host is resolving optional design-time bundles in addition to runtime contributions. */\n loadDesignTime?: boolean;\n}\n\nexport interface PackageHostConfiguration {\n bundles: ScenePackageBundle[];\n profile: UiProfile;\n policy: PackageHostPolicy;\n\n /** The Scene version the host runs, checked against each template's compatibility range when given. */\n sceneVersion?: string;\n}\n\nexport interface ResolvedPackageHost {\n bundles: ScenePackageBundle[];\n components: ReturnType<typeof mergePackageRegistries>;\n layouts: Layout[];\n screenTemplates: ScreenTemplate[];\n dialogTemplates: DialogTemplate[];\n themes: Theme[];\n\n /**\n * Every template the approved packages provide, with compatibility, attribution and license metadata and\n * whether it can be used with this package set. Template browsers read this rather than the raw lists.\n */\n templates: TemplateCatalogEntry[];\n icons: IconAdapterRegistry;\n assets: string[];\n fonts: string[];\n blocked: boolean;\n diagnostics: string[];\n}\n\n/**\n * Resolves the approved package set a standalone or embedded React host uses.\n */\nexport function resolvePackageHost(configuration: PackageHostConfiguration): ResolvedPackageHost {\n const diagnostics: string[] = [];\n const names = new Map<string, number>();\n for (const bundle of configuration.bundles) {\n names.set(bundle.manifest.name, (names.get(bundle.manifest.name) ?? 0) + 1);\n }\n\n for (const [name, count] of names) {\n if (count > 1) diagnostics.push(`Package '${name}' is approved more than once; duplicate bundles are ambiguous`);\n }\n\n const byName = new Map(configuration.bundles.map(bundle => [bundle.manifest.name, bundle]));\n const selection = resolvePackageDependencies(configuration.profile.packages, configuration.bundles.map(bundle => bundle.manifest));\n for (const missing of selection.missing) diagnostics.push(`Package '${missing.package}' depends on missing package '${missing.dependsOn}'`);\n for (const conflict of selection.versionConflicts) {\n diagnostics.push(`Package '${conflict.package}' requires '${conflict.dependsOn}' ${conflict.requiredRange} but approved version is ${conflict.actualVersion}`);\n }\n for (const cycle of selection.cycles) diagnostics.push(`Package dependency cycle: ${cycle.join(' -> ')}`);\n\n const bundles: ScenePackageBundle[] = [];\n const runtimeSingletons = new Map<string, string>();\n const assets: string[] = [];\n\n for (const packageName of selection.packages) {\n const bundle = byName.get(packageName);\n if (!bundle) {\n diagnostics.push(`UI profile asks for '${packageName}' but the host did not approve a bundle for it`);\n continue;\n }\n\n diagnostics.push(...validatePackageBundle(bundle).map(problem => `${packageName}: ${problem}`));\n if (configuration.policy.loadDesignTime === true && !configuration.policy.allowExecutableImports && bundle.designTime) {\n diagnostics.push(`Package '${packageName}' provides executable design-time contributions, but host policy forbids them`);\n }\n\n const packageAssets = bundle.manifest.assets ?? [];\n if (!configuration.policy.allowNetworkAssets && packageAssets.some(asset => /^https?:\\/\\//.test(asset))) {\n diagnostics.push(`Package '${packageName}' declares network assets, but host policy forbids them`);\n }\n assets.push(...packageAssets);\n\n for (const dependency of bundle.manifest.runtimeSingletons ?? []) {\n const owner = runtimeSingletons.get(dependency);\n if (owner && owner !== packageName) {\n diagnostics.push(`Runtime singleton '${dependency}' is provided by both '${owner}' and '${packageName}'`);\n }\n runtimeSingletons.set(dependency, packageName);\n }\n\n bundles.push(bundle);\n }\n\n const blocked = diagnostics.length > 0;\n const approved = blocked ? [] : bundles;\n const approvedAssets = blocked ? [] : assets;\n\n return {\n bundles: approved,\n components: mergePackageRegistries(approved),\n layouts: approved.flatMap(bundle => bundle.layouts ?? []),\n screenTemplates: approved.flatMap(bundle => bundle.screenTemplates ?? []),\n dialogTemplates: approved.flatMap(bundle => bundle.dialogTemplates ?? []),\n themes: approved.flatMap(bundle => bundle.themes ?? []),\n templates: describeTemplateCatalog(approved, configuration.sceneVersion),\n icons: createIconAdapterRegistry(approved.map(bundle => bundle.iconLibrary?.adapter).filter(adapter => adapter !== undefined)),\n assets: approvedAssets,\n fonts: approvedAssets.filter(isFontAsset),\n blocked,\n diagnostics,\n };\n}\n\nfunction isFontAsset(asset: string): boolean {\n return /\\.(woff2?|otf|ttf)(\\?|$)/.test(asset) || asset.includes('/fonts/');\n}\n"],"names":["resolvePackageHost","configuration","diagnostics","names","Map","bundle","bundles","set","manifest","name","get","count","push","byName","map","selection","resolvePackageDependencies","profile","packages","missing","package","dependsOn","conflict","versionConflicts","requiredRange","actualVersion","cycle","cycles","join","runtimeSingletons","assets","packageName","validatePackageBundle","problem","policy","loadDesignTime","allowExecutableImports","designTime","packageAssets","allowNetworkAssets","some","asset","test","dependency","owner","blocked","length","approved","approvedAssets","components","mergePackageRegistries","layouts","flatMap","screenTemplates","dialogTemplates","themes","templates","describeTemplateCatalog","sceneVersion","icons","createIconAdapterRegistry","iconLibrary","adapter","filter","undefined","fonts","isFontAsset","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PackageHostConfiguration.js","sources":["../../../packages/PackageHostConfiguration.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 { DialogTemplate, Layout, ScreenTemplate, Theme, UiProfile } from '@cratis/scene.model';\nimport { TemplateCatalogEntry, describeTemplateCatalog, incompatiblePackages, resolvePackageDependencies } from '@cratis/scene.engine';\nimport { IconAdapterRegistry, createIconAdapterRegistry } from '../icons/IconAdapterRegistry';\nimport { ScenePackageBundle, mergePackageRegistries, validatePackageBundle } from './ScenePackageBundle';\nimport { isNetworkAsset } from './isNetworkAsset';\n\nexport interface PackageHostPolicy {\n allowExecutableImports: boolean;\n allowNetworkAssets: boolean;\n\n /** Whether this host is resolving optional design-time bundles in addition to runtime contributions. */\n loadDesignTime?: boolean;\n}\n\nexport interface PackageHostConfiguration {\n bundles: ScenePackageBundle[];\n profile: UiProfile;\n policy: PackageHostPolicy;\n\n /** The Scene version the host runs, checked against each template's compatibility range when given. */\n sceneVersion?: string;\n}\n\nexport interface ResolvedPackageHost {\n bundles: ScenePackageBundle[];\n components: ReturnType<typeof mergePackageRegistries>;\n layouts: Layout[];\n screenTemplates: ScreenTemplate[];\n dialogTemplates: DialogTemplate[];\n themes: Theme[];\n\n /** The layout the UI profile names, from the approved packages. Absent when the profile names none. */\n layout?: Layout;\n\n /** The theme the UI profile names, from the approved packages. Absent when the profile names none. */\n theme?: Theme;\n\n /**\n * Every template the approved packages provide, with compatibility, attribution and license metadata and\n * whether it can be used with this package set. Template browsers read this rather than the raw lists.\n */\n templates: TemplateCatalogEntry[];\n icons: IconAdapterRegistry;\n assets: string[];\n fonts: string[];\n blocked: boolean;\n diagnostics: string[];\n}\n\n/**\n * Resolves the approved package set a standalone or embedded React host uses.\n */\nexport function resolvePackageHost(configuration: PackageHostConfiguration): ResolvedPackageHost {\n const diagnostics: string[] = [];\n const names = new Map<string, number>();\n for (const bundle of configuration.bundles) {\n names.set(bundle.manifest.name, (names.get(bundle.manifest.name) ?? 0) + 1);\n }\n\n for (const [name, count] of names) {\n if (count > 1) diagnostics.push(`Package '${name}' is approved more than once; duplicate bundles are ambiguous`);\n }\n\n const byName = new Map(configuration.bundles.map(bundle => [bundle.manifest.name, bundle]));\n const selection = resolvePackageDependencies(configuration.profile.packages, configuration.bundles.map(bundle => bundle.manifest));\n for (const missing of selection.missing) diagnostics.push(`Package '${missing.package}' depends on missing package '${missing.dependsOn}'`);\n for (const conflict of selection.versionConflicts) {\n diagnostics.push(`Package '${conflict.package}' requires '${conflict.dependsOn}' ${conflict.requiredRange} but approved version is ${conflict.actualVersion}`);\n }\n for (const cycle of selection.cycles) diagnostics.push(`Package dependency cycle: ${cycle.join(' -> ')}`);\n\n const bundles: ScenePackageBundle[] = [];\n const runtimeSingletons = new Map<string, string>();\n const assets: string[] = [];\n\n for (const packageName of selection.packages) {\n const bundle = byName.get(packageName);\n if (!bundle) {\n diagnostics.push(`UI profile asks for '${packageName}' but the host did not approve a bundle for it`);\n continue;\n }\n\n diagnostics.push(...validatePackageBundle(bundle).map(problem => `${packageName}: ${problem}`));\n if (configuration.policy.loadDesignTime === true && !configuration.policy.allowExecutableImports && bundle.designTime) {\n diagnostics.push(`Package '${packageName}' provides executable design-time contributions, but host policy forbids them`);\n }\n\n const packageAssets = bundle.manifest.assets ?? [];\n const networkAssets = packageAssets.filter(isNetworkAsset);\n if (!configuration.policy.allowNetworkAssets && networkAssets.length > 0) {\n diagnostics.push(`Package '${packageName}' declares network assets (${networkAssets.join(', ')}), but host policy forbids them`);\n }\n assets.push(...packageAssets);\n\n for (const dependency of bundle.manifest.runtimeSingletons ?? []) {\n const owner = runtimeSingletons.get(dependency);\n if (owner && owner !== packageName) {\n diagnostics.push(`Runtime singleton '${dependency}' is provided by both '${owner}' and '${packageName}'`);\n }\n runtimeSingletons.set(dependency, packageName);\n }\n\n bundles.push(bundle);\n }\n\n const layouts = bundles.flatMap(bundle => bundle.layouts ?? []);\n const themes = bundles.flatMap(bundle => bundle.themes ?? []);\n const layout = configuration.profile.layout ? layouts.find(candidate => candidate.name === configuration.profile.layout) : undefined;\n const theme = configuration.profile.theme ? themes.find(candidate => candidate.name === configuration.profile.theme) : undefined;\n if (configuration.profile.layout && !layout) {\n diagnostics.push(`UI profile '${configuration.profile.name}' uses layout '${configuration.profile.layout}', which no approved package provides`);\n }\n if (configuration.profile.theme && !theme) {\n diagnostics.push(`UI profile '${configuration.profile.name}' uses theme '${configuration.profile.theme}', which no approved package provides`);\n } else if (theme && incompatiblePackages(theme, configuration.profile).length > 0) {\n diagnostics.push(`Theme '${theme.name}' is not compatible with ${incompatiblePackages(theme, configuration.profile).join(', ')} in UI profile '${configuration.profile.name}'`);\n }\n\n const blocked = diagnostics.length > 0;\n const approved = blocked ? [] : bundles;\n const approvedAssets = blocked ? [] : assets;\n\n return {\n bundles: approved,\n components: mergePackageRegistries(approved),\n layouts: approved.flatMap(bundle => bundle.layouts ?? []),\n screenTemplates: approved.flatMap(bundle => bundle.screenTemplates ?? []),\n dialogTemplates: approved.flatMap(bundle => bundle.dialogTemplates ?? []),\n themes: approved.flatMap(bundle => bundle.themes ?? []),\n layout: blocked ? undefined : layout,\n theme: blocked ? undefined : theme,\n templates: describeTemplateCatalog(approved, configuration.sceneVersion),\n icons: createIconAdapterRegistry(approved.map(bundle => bundle.iconLibrary?.adapter).filter(adapter => adapter !== undefined)),\n assets: approvedAssets,\n fonts: approvedAssets.filter(isFontAsset),\n blocked,\n diagnostics,\n };\n}\n\nfunction isFontAsset(asset: string): boolean {\n return /\\.(woff2?|otf|ttf)(\\?|$)/.test(asset) || asset.includes('/fonts/');\n}\n"],"names":["resolvePackageHost","configuration","diagnostics","names","Map","bundle","bundles","set","manifest","name","get","count","push","byName","map","selection","resolvePackageDependencies","profile","packages","missing","package","dependsOn","conflict","versionConflicts","requiredRange","actualVersion","cycle","cycles","join","runtimeSingletons","assets","packageName","validatePackageBundle","problem","policy","loadDesignTime","allowExecutableImports","designTime","packageAssets","networkAssets","filter","isNetworkAsset","allowNetworkAssets","length","dependency","owner","layouts","flatMap","themes","layout","find","candidate","undefined","theme","incompatiblePackages","blocked","approved","approvedAssets","components","mergePackageRegistries","screenTemplates","dialogTemplates","templates","describeTemplateCatalog","sceneVersion","icons","createIconAdapterRegistry","iconLibrary","adapter","fonts","isFontAsset","asset","test","includes"],"mappings":";;;;;AAAA;AACA;AAmDA;;IAGO,SAASA,kBAAAA,CAAmBC,aAAuC,EAAA;AACtE,IAAA,MAAMC,cAAwB,EAAE;AAChC,IAAA,MAAMC,QAAQ,IAAIC,GAAAA,EAAAA;AAClB,IAAA,KAAK,MAAMC,MAAAA,IAAUJ,aAAAA,CAAcK,OAAO,CAAE;AACxCH,QAAAA,KAAAA,CAAMI,GAAG,CAACF,MAAAA,CAAOG,QAAQ,CAACC,IAAI,EAAE,CAACN,KAAAA,CAAMO,GAAG,CAACL,MAAAA,CAAOG,QAAQ,CAACC,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,CAAA;AAC7E,IAAA;AAEA,IAAA,KAAK,MAAM,CAACA,IAAAA,EAAME,KAAAA,CAAM,IAAIR,KAAAA,CAAO;QAC/B,IAAIQ,KAAAA,GAAQ,CAAA,EAAGT,WAAAA,CAAYU,IAAI,CAAC,CAAC,SAAS,EAAEH,IAAAA,CAAK,6DAA6D,CAAC,CAAA;AACnH,IAAA;IAEA,MAAMI,MAAAA,GAAS,IAAIT,GAAAA,CAAIH,aAAAA,CAAcK,OAAO,CAACQ,GAAG,CAACT,CAAAA,MAAAA,GAAU;YAACA,MAAAA,CAAOG,QAAQ,CAACC,IAAI;AAAEJ,YAAAA;AAAO,SAAA,CAAA,CAAA;AACzF,IAAA,MAAMU,SAAAA,GAAYC,0BAAAA,CAA2Bf,aAAAA,CAAcgB,OAAO,CAACC,QAAQ,EAAEjB,aAAAA,CAAcK,OAAO,CAACQ,GAAG,CAACT,CAAAA,MAAAA,GAAUA,OAAOG,QAAQ,CAAA,CAAA;IAChI,KAAK,MAAMW,WAAWJ,SAAAA,CAAUI,OAAO,CAAEjB,WAAAA,CAAYU,IAAI,CAAC,CAAC,SAAS,EAAEO,OAAAA,CAAQC,OAAO,CAAC,8BAA8B,EAAED,QAAQE,SAAS,CAAC,CAAC,CAAC,CAAA;AAC1I,IAAA,KAAK,MAAMC,QAAAA,IAAYP,SAAAA,CAAUQ,gBAAgB,CAAE;QAC/CrB,WAAAA,CAAYU,IAAI,CAAC,CAAC,SAAS,EAAEU,QAAAA,CAASF,OAAO,CAAC,YAAY,EAAEE,QAAAA,CAASD,SAAS,CAAC,EAAE,EAAEC,QAAAA,CAASE,aAAa,CAAC,yBAAyB,EAAEF,QAAAA,CAASG,aAAa,CAAA,CAAE,CAAA;AACjK,IAAA;AACA,IAAA,KAAK,MAAMC,KAAAA,IAASX,SAAAA,CAAUY,MAAM,CAAEzB,WAAAA,CAAYU,IAAI,CAAC,CAAC,0BAA0B,EAAEc,KAAAA,CAAME,IAAI,CAAC,MAAA,CAAA,CAAA,CAAS,CAAA;AAExG,IAAA,MAAMtB,UAAgC,EAAE;AACxC,IAAA,MAAMuB,oBAAoB,IAAIzB,GAAAA,EAAAA;AAC9B,IAAA,MAAM0B,SAAmB,EAAE;AAE3B,IAAA,KAAK,MAAMC,WAAAA,IAAehB,SAAAA,CAAUG,QAAQ,CAAE;QAC1C,MAAMb,MAAAA,GAASQ,MAAAA,CAAOH,GAAG,CAACqB,WAAAA,CAAAA;AAC1B,QAAA,IAAI,CAAC1B,MAAAA,EAAQ;AACTH,YAAAA,WAAAA,CAAYU,IAAI,CAAC,CAAC,qBAAqB,EAAEmB,WAAAA,CAAY,8CAA8C,CAAC,CAAA;AACpG,YAAA;AACJ,QAAA;AAEA7B,QAAAA,WAAAA,CAAYU,IAAI,CAAA,GAAIoB,qBAAAA,CAAsB3B,MAAAA,CAAAA,CAAQS,GAAG,CAACmB,CAAAA,OAAAA,GAAW,CAAA,EAAGF,WAAAA,CAAY,EAAE,EAAEE,OAAAA,CAAAA,CAAS,CAAA,CAAA;AAC7F,QAAA,IAAIhC,aAAAA,CAAciC,MAAM,CAACC,cAAc,KAAK,IAAA,IAAQ,CAAClC,aAAAA,CAAciC,MAAM,CAACE,sBAAsB,IAAI/B,MAAAA,CAAOgC,UAAU,EAAE;AACnHnC,YAAAA,WAAAA,CAAYU,IAAI,CAAC,CAAC,SAAS,EAAEmB,WAAAA,CAAY,6EAA6E,CAAC,CAAA;AAC3H,QAAA;AAEA,QAAA,MAAMO,gBAAgBjC,MAAAA,CAAOG,QAAQ,CAACsB,MAAM,IAAI,EAAE;QAClD,MAAMS,aAAAA,GAAgBD,aAAAA,CAAcE,MAAM,CAACC,cAAAA,CAAAA;QAC3C,IAAI,CAACxC,cAAciC,MAAM,CAACQ,kBAAkB,IAAIH,aAAAA,CAAcI,MAAM,GAAG,CAAA,EAAG;AACtEzC,YAAAA,WAAAA,CAAYU,IAAI,CAAC,CAAC,SAAS,EAAEmB,WAAAA,CAAY,2BAA2B,EAAEQ,aAAAA,CAAcX,IAAI,CAAC,IAAA,CAAA,CAAM,+BAA+B,CAAC,CAAA;AACnI,QAAA;AACAE,QAAAA,MAAAA,CAAOlB,IAAI,CAAA,GAAI0B,aAAAA,CAAAA;QAEf,KAAK,MAAMM,cAAcvC,MAAAA,CAAOG,QAAQ,CAACqB,iBAAiB,IAAI,EAAE,CAAE;YAC9D,MAAMgB,KAAAA,GAAQhB,iBAAAA,CAAkBnB,GAAG,CAACkC,UAAAA,CAAAA;YACpC,IAAIC,KAAAA,IAASA,UAAUd,WAAAA,EAAa;AAChC7B,gBAAAA,WAAAA,CAAYU,IAAI,CAAC,CAAC,mBAAmB,EAAEgC,UAAAA,CAAW,uBAAuB,EAAEC,KAAAA,CAAM,OAAO,EAAEd,WAAAA,CAAY,CAAC,CAAC,CAAA;AAC5G,YAAA;YACAF,iBAAAA,CAAkBtB,GAAG,CAACqC,UAAAA,EAAYb,WAAAA,CAAAA;AACtC,QAAA;AAEAzB,QAAAA,OAAAA,CAAQM,IAAI,CAACP,MAAAA,CAAAA;AACjB,IAAA;IAEA,MAAMyC,OAAAA,GAAUxC,QAAQyC,OAAO,CAAC1C,CAAAA,MAAAA,GAAUA,MAAAA,CAAOyC,OAAO,IAAI,EAAE,CAAA;IAC9D,MAAME,MAAAA,GAAS1C,QAAQyC,OAAO,CAAC1C,CAAAA,MAAAA,GAAUA,MAAAA,CAAO2C,MAAM,IAAI,EAAE,CAAA;AAC5D,IAAA,MAAMC,SAAShD,aAAAA,CAAcgB,OAAO,CAACgC,MAAM,GAAGH,QAAQI,IAAI,CAACC,CAAAA,SAAAA,GAAaA,UAAU1C,IAAI,KAAKR,cAAcgB,OAAO,CAACgC,MAAM,CAAA,GAAIG,SAAAA;AAC3H,IAAA,MAAMC,QAAQpD,aAAAA,CAAcgB,OAAO,CAACoC,KAAK,GAAGL,OAAOE,IAAI,CAACC,CAAAA,SAAAA,GAAaA,UAAU1C,IAAI,KAAKR,cAAcgB,OAAO,CAACoC,KAAK,CAAA,GAAID,SAAAA;AACvH,IAAA,IAAInD,cAAcgB,OAAO,CAACgC,MAAM,IAAI,CAACA,MAAAA,EAAQ;AACzC/C,QAAAA,WAAAA,CAAYU,IAAI,CAAC,CAAC,YAAY,EAAEX,aAAAA,CAAcgB,OAAO,CAACR,IAAI,CAAC,eAAe,EAAER,aAAAA,CAAcgB,OAAO,CAACgC,MAAM,CAAC,qCAAqC,CAAC,CAAA;AACnJ,IAAA;AACA,IAAA,IAAIhD,cAAcgB,OAAO,CAACoC,KAAK,IAAI,CAACA,KAAAA,EAAO;AACvCnD,QAAAA,WAAAA,CAAYU,IAAI,CAAC,CAAC,YAAY,EAAEX,aAAAA,CAAcgB,OAAO,CAACR,IAAI,CAAC,cAAc,EAAER,aAAAA,CAAcgB,OAAO,CAACoC,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACjJ,CAAA,MAAO,IAAIA,SAASC,oBAAAA,CAAqBD,KAAAA,EAAOpD,cAAcgB,OAAO,CAAA,CAAE0B,MAAM,GAAG,CAAA,EAAG;QAC/EzC,WAAAA,CAAYU,IAAI,CAAC,CAAC,OAAO,EAAEyC,KAAAA,CAAM5C,IAAI,CAAC,yBAAyB,EAAE6C,oBAAAA,CAAqBD,KAAAA,EAAOpD,aAAAA,CAAcgB,OAAO,CAAA,CAAEW,IAAI,CAAC,IAAA,CAAA,CAAM,gBAAgB,EAAE3B,aAAAA,CAAcgB,OAAO,CAACR,IAAI,CAAC,CAAC,CAAC,CAAA;AAClL,IAAA;IAEA,MAAM8C,OAAAA,GAAUrD,WAAAA,CAAYyC,MAAM,GAAG,CAAA;IACrC,MAAMa,QAAAA,GAAWD,OAAAA,GAAU,EAAE,GAAGjD,OAAAA;IAChC,MAAMmD,cAAAA,GAAiBF,OAAAA,GAAU,EAAE,GAAGzB,MAAAA;IAEtC,OAAO;QACHxB,OAAAA,EAASkD,QAAAA;AACTE,QAAAA,UAAAA,EAAYC,sBAAAA,CAAuBH,QAAAA,CAAAA;QACnCV,OAAAA,EAASU,QAAAA,CAAST,OAAO,CAAC1C,CAAAA,SAAUA,MAAAA,CAAOyC,OAAO,IAAI,EAAE,CAAA;QACxDc,eAAAA,EAAiBJ,QAAAA,CAAST,OAAO,CAAC1C,CAAAA,SAAUA,MAAAA,CAAOuD,eAAe,IAAI,EAAE,CAAA;QACxEC,eAAAA,EAAiBL,QAAAA,CAAST,OAAO,CAAC1C,CAAAA,SAAUA,MAAAA,CAAOwD,eAAe,IAAI,EAAE,CAAA;QACxEb,MAAAA,EAAQQ,QAAAA,CAAST,OAAO,CAAC1C,CAAAA,SAAUA,MAAAA,CAAO2C,MAAM,IAAI,EAAE,CAAA;AACtDC,QAAAA,MAAAA,EAAQM,UAAUH,SAAAA,GAAYH,MAAAA;AAC9BI,QAAAA,KAAAA,EAAOE,UAAUH,SAAAA,GAAYC,KAAAA;QAC7BS,SAAAA,EAAWC,uBAAAA,CAAwBP,QAAAA,EAAUvD,aAAAA,CAAc+D,YAAY,CAAA;AACvEC,QAAAA,KAAAA,EAAOC,yBAAAA,CAA0BV,QAAAA,CAAS1C,GAAG,CAACT,CAAAA,MAAAA,GAAUA,MAAAA,CAAO8D,WAAW,EAAEC,OAAAA,CAAAA,CAAS5B,MAAM,CAAC4B,CAAAA,UAAWA,OAAAA,KAAYhB,SAAAA,CAAAA,CAAAA;QACnHtB,MAAAA,EAAQ2B,cAAAA;QACRY,KAAAA,EAAOZ,cAAAA,CAAejB,MAAM,CAAC8B,WAAAA,CAAAA;AAC7Bf,QAAAA,OAAAA;AACArD,QAAAA;AACJ,KAAA;AACJ;AAEA,SAASoE,YAAYC,KAAa,EAAA;AAC9B,IAAA,OAAO,2BAA2BC,IAAI,CAACD,KAAAA,CAAAA,IAAUA,KAAAA,CAAME,QAAQ,CAAC,SAAA,CAAA;AACpE;;"}
|
|
@@ -13,6 +13,7 @@ export * from './DesignTimeResolution';
|
|
|
13
13
|
export * from '../navigation';
|
|
14
14
|
export * from './EmbeddedPackageHost';
|
|
15
15
|
export * from './loadDesignTimeContributions';
|
|
16
|
+
export * from './isNetworkAsset';
|
|
16
17
|
export * from './PackageHostAssets';
|
|
17
18
|
export * from './PackageHostConfiguration';
|
|
18
19
|
export * from './PackageHostRenderMode';
|
|
@@ -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,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,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"}
|
|
@@ -13,6 +13,7 @@ export * from './DesignTimeResolution';
|
|
|
13
13
|
export * from '../navigation';
|
|
14
14
|
export * from './EmbeddedPackageHost';
|
|
15
15
|
export * from './loadDesignTimeContributions';
|
|
16
|
+
export * from './isNetworkAsset';
|
|
16
17
|
export * from './PackageHostAssets';
|
|
17
18
|
export * from './PackageHostConfiguration';
|
|
18
19
|
export * from './PackageHostRenderMode';
|
|
@@ -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,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,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNetworkAsset.d.ts","sourceRoot":"","sources":["../../../packages/isNetworkAsset.ts"],"names":[],"mappings":"AASA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKrD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
/**
|
|
4
|
+
* Whether loading an asset reaches beyond the host: an absolute URL with any scheme other than `data:`
|
|
5
|
+
* or `blob:` (`https://`, `http://`, `ws://`, `ftp://`), or a protocol-relative `//host/...` reference. A
|
|
6
|
+
* package-relative path or a bare module specifier such as `@cratis/components/styles` is resolved by the
|
|
7
|
+
* host from what it bundled, so it is not a network asset.
|
|
8
|
+
*/ function isNetworkAsset(asset) {
|
|
9
|
+
const trimmed = asset.trim();
|
|
10
|
+
if (trimmed.startsWith('//')) return true;
|
|
11
|
+
const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(trimmed)?.[1]?.toLowerCase();
|
|
12
|
+
return scheme !== undefined && scheme !== 'data' && scheme !== 'blob';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { isNetworkAsset };
|
|
16
|
+
//# sourceMappingURL=isNetworkAsset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNetworkAsset.js","sources":["../../../packages/isNetworkAsset.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\n/**\n * Whether loading an asset reaches beyond the host: an absolute URL with any scheme other than `data:`\n * or `blob:` (`https://`, `http://`, `ws://`, `ftp://`), or a protocol-relative `//host/...` reference. A\n * package-relative path or a bare module specifier such as `@cratis/components/styles` is resolved by the\n * host from what it bundled, so it is not a network asset.\n */\nexport function isNetworkAsset(asset: string): boolean {\n const trimmed = asset.trim();\n if (trimmed.startsWith('//')) return true;\n const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(trimmed)?.[1]?.toLowerCase();\n return scheme !== undefined && scheme !== 'data' && scheme !== 'blob';\n}\n"],"names":["isNetworkAsset","asset","trimmed","trim","startsWith","scheme","exec","toLowerCase","undefined"],"mappings":"AAAA;AACA;AAEA;;;;;IAMO,SAASA,cAAAA,CAAeC,KAAa,EAAA;IACxC,MAAMC,OAAAA,GAAUD,MAAME,IAAI,EAAA;AAC1B,IAAA,IAAID,OAAAA,CAAQE,UAAU,CAAC,IAAA,CAAA,EAAO,OAAO,IAAA;AACrC,IAAA,MAAMC,SAAS,6BAAA,CAA8BC,IAAI,CAACJ,OAAAA,CAAAA,GAAW,EAAE,EAAEK,WAAAA,EAAAA;AACjE,IAAA,OAAOF,MAAAA,KAAWG,SAAAA,IAAaH,MAAAA,KAAW,MAAA,IAAUA,MAAAA,KAAW,MAAA;AACnE;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderBindingScopeContext.d.ts","sourceRoot":"","sources":["../../../renderer/RenderBindingScopeContext.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAA2D,MAAM,OAAO,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"RenderBindingScopeContext.d.ts","sourceRoot":"","sources":["../../../renderer/RenderBindingScopeContext.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAA2D,MAAM,OAAO,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,YAAY,EAA8C,MAAM,sBAAsB,CAAC;AAWjH,MAAM,WAAW,+BAA+B;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;CAC1F;AAUD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,+BAA+B,+BAShF;AA2BD,wBAAgB,wBAAwB,IAAI,eAAe,CAI1D;AAED,wBAAgB,qBAAqB,IAAI,YAAY,CAEpD"}
|