@cratis/scene.react 4.12.0 → 4.14.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/core/coreComponents.js +2 -1
- package/dist/cjs/core/coreComponents.js.map +1 -1
- package/dist/cjs/core/coreDescriptors.js +1 -0
- package/dist/cjs/core/coreDescriptors.js.map +1 -1
- package/dist/cjs/index.js +27 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/navigation/SceneNavigationContext.js.map +1 -1
- package/dist/cjs/navigation/SceneNavigationHost.js +19 -44
- package/dist/cjs/navigation/SceneNavigationHost.js.map +1 -1
- package/dist/cjs/navigation/createBrowserSceneHistory.js +39 -0
- package/dist/cjs/navigation/createBrowserSceneHistory.js.map +1 -0
- package/dist/cjs/navigation/createMemorySceneHistory.js +53 -0
- package/dist/cjs/navigation/createMemorySceneHistory.js.map +1 -0
- package/dist/cjs/navigation/diagnoseRenderedNavigation.js +17 -0
- package/dist/cjs/navigation/diagnoseRenderedNavigation.js.map +1 -0
- package/dist/cjs/navigation/identityRoute.js +19 -0
- package/dist/cjs/navigation/identityRoute.js.map +1 -0
- package/dist/cjs/navigation/matchSceneRoute.js +43 -0
- package/dist/cjs/navigation/matchSceneRoute.js.map +1 -0
- package/dist/cjs/navigation/navigationRouteKey.js +19 -0
- package/dist/cjs/navigation/navigationRouteKey.js.map +1 -0
- package/dist/cjs/navigation/resolveDestination.js +3 -10
- package/dist/cjs/navigation/resolveDestination.js.map +1 -1
- package/dist/cjs/navigation/sceneRoutesFrom.js +37 -0
- package/dist/cjs/navigation/sceneRoutesFrom.js.map +1 -0
- package/dist/cjs/navigation/useSceneHistoryNavigation.js +112 -0
- package/dist/cjs/navigation/useSceneHistoryNavigation.js.map +1 -0
- package/dist/cjs/packages/DesignTimeContractVersion.js +15 -0
- package/dist/cjs/packages/DesignTimeContractVersion.js.map +1 -0
- package/dist/cjs/packages/DesignTimeExtensionPoint.js +26 -0
- package/dist/cjs/packages/DesignTimeExtensionPoint.js.map +1 -0
- package/dist/cjs/packages/PackageHostConfiguration.js +1 -0
- package/dist/cjs/packages/PackageHostConfiguration.js.map +1 -1
- package/dist/cjs/packages/loadDesignTimeContributions.js +80 -0
- package/dist/cjs/packages/loadDesignTimeContributions.js.map +1 -0
- package/dist/cjs/packages/resolveDesignTimeHost.js +114 -0
- package/dist/cjs/packages/resolveDesignTimeHost.js.map +1 -0
- package/dist/cjs/packages/runDesignTimeAction.js +50 -0
- package/dist/cjs/packages/runDesignTimeAction.js.map +1 -0
- package/dist/esm/core/coreComponents.js +2 -1
- package/dist/esm/core/coreComponents.js.map +1 -1
- package/dist/esm/core/coreDescriptors.js +1 -0
- package/dist/esm/core/coreDescriptors.js.map +1 -1
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/navigation/DestinationResolution.d.ts +1 -0
- package/dist/esm/navigation/DestinationResolution.d.ts.map +1 -1
- package/dist/esm/navigation/DialogResult.d.ts +5 -0
- package/dist/esm/navigation/DialogResult.d.ts.map +1 -0
- package/dist/esm/navigation/DialogResult.js +2 -0
- package/dist/esm/navigation/DialogResult.js.map +1 -0
- package/dist/esm/navigation/SceneHistory.d.ts +10 -0
- package/dist/esm/navigation/SceneHistory.d.ts.map +1 -0
- package/dist/esm/navigation/SceneHistory.js +2 -0
- package/dist/esm/navigation/SceneHistory.js.map +1 -0
- package/dist/esm/navigation/SceneNavigationContext.d.ts +6 -1
- package/dist/esm/navigation/SceneNavigationContext.d.ts.map +1 -1
- package/dist/esm/navigation/SceneNavigationContext.js.map +1 -1
- package/dist/esm/navigation/SceneNavigationHost.d.ts +7 -2
- package/dist/esm/navigation/SceneNavigationHost.d.ts.map +1 -1
- package/dist/esm/navigation/SceneNavigationHost.js +20 -45
- package/dist/esm/navigation/SceneNavigationHost.js.map +1 -1
- package/dist/esm/navigation/SceneNavigationState.d.ts +8 -0
- package/dist/esm/navigation/SceneNavigationState.d.ts.map +1 -0
- package/dist/esm/navigation/SceneNavigationState.js +2 -0
- package/dist/esm/navigation/SceneNavigationState.js.map +1 -0
- package/dist/esm/navigation/SceneRoute.d.ts +6 -0
- package/dist/esm/navigation/SceneRoute.d.ts.map +1 -0
- package/dist/esm/navigation/SceneRoute.js +2 -0
- package/dist/esm/navigation/SceneRoute.js.map +1 -0
- package/dist/esm/navigation/createBrowserSceneHistory.d.ts +4 -0
- package/dist/esm/navigation/createBrowserSceneHistory.d.ts.map +1 -0
- package/dist/esm/navigation/createBrowserSceneHistory.js +37 -0
- package/dist/esm/navigation/createBrowserSceneHistory.js.map +1 -0
- package/dist/esm/navigation/createMemorySceneHistory.d.ts +7 -0
- package/dist/esm/navigation/createMemorySceneHistory.d.ts.map +1 -0
- package/dist/esm/navigation/createMemorySceneHistory.js +51 -0
- package/dist/esm/navigation/createMemorySceneHistory.js.map +1 -0
- package/dist/esm/navigation/diagnoseRenderedNavigation.d.ts +3 -0
- package/dist/esm/navigation/diagnoseRenderedNavigation.d.ts.map +1 -0
- package/dist/esm/navigation/diagnoseRenderedNavigation.js +15 -0
- package/dist/esm/navigation/diagnoseRenderedNavigation.js.map +1 -0
- package/dist/esm/navigation/identityRoute.d.ts +3 -0
- package/dist/esm/navigation/identityRoute.d.ts.map +1 -0
- package/dist/esm/navigation/identityRoute.js +17 -0
- package/dist/esm/navigation/identityRoute.js.map +1 -0
- package/dist/esm/navigation/index.d.ts +12 -0
- package/dist/esm/navigation/index.d.ts.map +1 -1
- package/dist/esm/navigation/index.js +12 -0
- package/dist/esm/navigation/index.js.map +1 -1
- package/dist/esm/navigation/matchSceneRoute.d.ts +7 -0
- package/dist/esm/navigation/matchSceneRoute.d.ts.map +1 -0
- package/dist/esm/navigation/matchSceneRoute.js +41 -0
- package/dist/esm/navigation/matchSceneRoute.js.map +1 -0
- package/dist/esm/navigation/navigationRouteKey.d.ts +3 -0
- package/dist/esm/navigation/navigationRouteKey.d.ts.map +1 -0
- package/dist/esm/navigation/navigationRouteKey.js +17 -0
- package/dist/esm/navigation/navigationRouteKey.js.map +1 -0
- package/dist/esm/navigation/resolveDestination.d.ts.map +1 -1
- package/dist/esm/navigation/resolveDestination.js +2 -9
- package/dist/esm/navigation/resolveDestination.js.map +1 -1
- package/dist/esm/navigation/sceneRoutesFrom.d.ts +4 -0
- package/dist/esm/navigation/sceneRoutesFrom.d.ts.map +1 -0
- package/dist/esm/navigation/sceneRoutesFrom.js +35 -0
- package/dist/esm/navigation/sceneRoutesFrom.js.map +1 -0
- package/dist/esm/navigation/useSceneHistoryNavigation.d.ts +6 -0
- package/dist/esm/navigation/useSceneHistoryNavigation.d.ts.map +1 -0
- package/dist/esm/navigation/useSceneHistoryNavigation.js +110 -0
- package/dist/esm/navigation/useSceneHistoryNavigation.js.map +1 -0
- package/dist/esm/packages/DesignTimeActionOutcome.d.ts +7 -0
- package/dist/esm/packages/DesignTimeActionOutcome.d.ts.map +1 -0
- package/dist/esm/packages/DesignTimeActionOutcome.js +2 -0
- package/dist/esm/packages/DesignTimeActionOutcome.js.map +1 -0
- package/dist/esm/packages/DesignTimeActionState.d.ts +9 -0
- package/dist/esm/packages/DesignTimeActionState.d.ts.map +1 -0
- package/dist/esm/packages/DesignTimeActionState.js +2 -0
- package/dist/esm/packages/DesignTimeActionState.js.map +1 -0
- package/dist/esm/packages/DesignTimeContractVersion.d.ts +2 -0
- package/dist/esm/packages/DesignTimeContractVersion.d.ts.map +1 -0
- package/dist/esm/packages/DesignTimeContractVersion.js +13 -0
- package/dist/esm/packages/DesignTimeContractVersion.js.map +1 -0
- package/dist/esm/packages/DesignTimeExtensionPoint.d.ts +9 -0
- package/dist/esm/packages/DesignTimeExtensionPoint.d.ts.map +1 -0
- package/dist/esm/packages/DesignTimeExtensionPoint.js +23 -0
- package/dist/esm/packages/DesignTimeExtensionPoint.js.map +1 -0
- package/dist/esm/packages/DesignTimeResolution.d.ts +7 -0
- package/dist/esm/packages/DesignTimeResolution.d.ts.map +1 -0
- package/dist/esm/packages/DesignTimeResolution.js +2 -0
- package/dist/esm/packages/DesignTimeResolution.js.map +1 -0
- package/dist/esm/packages/PackageHostConfiguration.d.ts +3 -0
- package/dist/esm/packages/PackageHostConfiguration.d.ts.map +1 -1
- package/dist/esm/packages/PackageHostConfiguration.js +2 -1
- package/dist/esm/packages/PackageHostConfiguration.js.map +1 -1
- package/dist/esm/packages/index.d.ts +8 -0
- package/dist/esm/packages/index.d.ts.map +1 -1
- package/dist/esm/packages/index.js +8 -0
- package/dist/esm/packages/index.js.map +1 -1
- package/dist/esm/packages/loadDesignTimeContributions.d.ts +11 -0
- package/dist/esm/packages/loadDesignTimeContributions.d.ts.map +1 -0
- package/dist/esm/packages/loadDesignTimeContributions.js +78 -0
- package/dist/esm/packages/loadDesignTimeContributions.js.map +1 -0
- package/dist/esm/packages/resolveDesignTimeHost.d.ts +26 -0
- package/dist/esm/packages/resolveDesignTimeHost.d.ts.map +1 -0
- package/dist/esm/packages/resolveDesignTimeHost.js +112 -0
- package/dist/esm/packages/resolveDesignTimeHost.js.map +1 -0
- package/dist/esm/packages/runDesignTimeAction.d.ts +4 -0
- package/dist/esm/packages/runDesignTimeAction.d.ts.map +1 -0
- package/dist/esm/packages/runDesignTimeAction.js +48 -0
- package/dist/esm/packages/runDesignTimeAction.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/navigation/DestinationResolution.ts +3 -0
- package/navigation/DialogResult.ts +8 -0
- package/navigation/SceneHistory.ts +24 -0
- package/navigation/SceneNavigationContext.tsx +16 -1
- package/navigation/SceneNavigationHost.tsx +30 -40
- package/navigation/SceneNavigationState.ts +19 -0
- package/navigation/SceneRoute.ts +12 -0
- package/navigation/createBrowserSceneHistory.ts +40 -0
- package/navigation/createMemorySceneHistory.ts +44 -0
- package/navigation/diagnoseRenderedNavigation.ts +14 -0
- package/navigation/identityRoute.ts +14 -0
- package/navigation/index.ts +12 -0
- package/navigation/matchSceneRoute.ts +45 -0
- package/navigation/navigationRouteKey.ts +22 -0
- package/navigation/resolveDestination.ts +2 -6
- package/navigation/sceneRoutesFrom.ts +24 -0
- package/navigation/useSceneHistoryNavigation.ts +80 -0
- package/package.json +5 -5
- package/packages/DesignTimeActionOutcome.ts +18 -0
- package/packages/DesignTimeActionState.ts +21 -0
- package/packages/DesignTimeContractVersion.ts +12 -0
- package/packages/DesignTimeExtensionPoint.ts +23 -0
- package/packages/DesignTimeResolution.ts +23 -0
- package/packages/PackageHostConfiguration.ts +11 -1
- package/packages/index.ts +8 -0
- package/packages/loadDesignTimeContributions.ts +98 -0
- package/packages/resolveDesignTimeHost.ts +133 -0
- package/packages/runDesignTimeAction.ts +36 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveDestination.js","sources":["../../../navigation/resolveDestination.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 { BindingScope, resolveBindingExpression } from '@cratis/scene.engine';\nimport { DestinationKind, DestinationReference } from '@cratis/scene.model';\nimport { DestinationResolution } from './DestinationResolution';\n\n/**\n * Resolves a destination into a renderer-neutral navigation action, deep link and target outlet/dialog.\n */\nexport function resolveDestination(destination: DestinationReference, scope: BindingScope = {}): DestinationResolution {\n const diagnostics: string[] = [];\n const kind = destination.kind ?? (destination.dialog ? DestinationKind.Dialog : DestinationKind.Outlet);\n const parameters = Object.entries(destination.routeParameterBindings ?? {})\n .map(([name, binding]) => [name, String(resolveBindingExpression(binding, scope) ?? '')] as const);\n const base = destination.route ?? identityRoute(destination);\n if (!base && kind !== DestinationKind.Dialog) diagnostics.push('Destination has no routeable screen, stable identity or route.');\n\n const url = base ? appendParameters(base, parameters) : undefined;\n return {\n kind,\n url,\n outlet: destination.outlet,\n dialog: destination.dialog,\n action: kind === DestinationKind.Dialog ? 'openDialog' : kind === DestinationKind.External ? 'openExternal' : 'navigate',\n diagnostics,\n };\n}\n\nfunction
|
|
1
|
+
{"version":3,"file":"resolveDestination.js","sources":["../../../navigation/resolveDestination.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 { BindingScope, resolveBindingExpression } from '@cratis/scene.engine';\nimport { DestinationKind, DestinationReference } from '@cratis/scene.model';\nimport { DestinationResolution } from './DestinationResolution';\nimport { identityRoute } from './identityRoute';\n\n/**\n * Resolves a destination into a renderer-neutral navigation action, deep link and target outlet/dialog.\n */\nexport function resolveDestination(destination: DestinationReference, scope: BindingScope = {}): DestinationResolution {\n const diagnostics: string[] = [];\n const kind = destination.kind ?? (destination.dialog ? DestinationKind.Dialog : DestinationKind.Outlet);\n const parameters = Object.entries(destination.routeParameterBindings ?? {})\n .map(([name, binding]) => [name, String(resolveBindingExpression(binding, scope) ?? '')] as const);\n const base = destination.route ?? identityRoute(destination);\n if (!base && kind !== DestinationKind.Dialog) diagnostics.push('Destination has no routeable screen, stable identity or route.');\n\n const url = base ? appendParameters(base, parameters) : undefined;\n return {\n kind,\n url,\n outlet: destination.outlet,\n dialog: destination.dialog,\n parameters: Object.fromEntries(parameters),\n action: kind === DestinationKind.Dialog ? 'openDialog' : kind === DestinationKind.External ? 'openExternal' : 'navigate',\n diagnostics,\n };\n}\n\nfunction appendParameters(route: string, parameters: readonly (readonly [string, string])[]): string {\n if (!parameters.length) return route;\n let replaced = route;\n const unused: string[] = [];\n for (const [name, value] of parameters) {\n const marker = `{${name}}`;\n if (replaced.includes(marker)) {\n replaced = replaced.split(marker).join(encodeURIComponent(value));\n } else {\n unused.push(`${encodeURIComponent(name)}=${encodeURIComponent(value)}`);\n }\n }\n\n return unused.length ? `${replaced}?${unused.join('&')}` : replaced;\n}\n"],"names":["resolveDestination","destination","scope","diagnostics","kind","dialog","DestinationKind","Dialog","Outlet","parameters","Object","entries","routeParameterBindings","map","name","binding","String","resolveBindingExpression","base","route","identityRoute","push","url","appendParameters","undefined","outlet","fromEntries","action","External","length","replaced","unused","value","marker","includes","split","join","encodeURIComponent"],"mappings":";;;;;;AAAA;AACA;AAOA;;AAEC,IACM,SAASA,kBAAAA,CAAmBC,WAAiC,EAAEC,KAAAA,GAAsB,EAAE,EAAA;AAC1F,IAAA,MAAMC,cAAwB,EAAE;AAChC,IAAA,MAAMC,IAAAA,GAAOH,WAAAA,CAAYG,IAAI,KAAKH,WAAAA,CAAYI,MAAM,GAAGC,2BAAAA,CAAgBC,MAAM,GAAGD,2BAAAA,CAAgBE,MAAM,CAAD;AACrG,IAAA,MAAMC,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAACV,YAAYW,sBAAsB,IAAI,EAAC,CAAA,CACpEC,GAAG,CAAC,CAAC,CAACC,IAAAA,EAAMC,QAAQ,GAAK;AAACD,YAAAA,IAAAA;YAAME,MAAAA,CAAOC,qCAAAA,CAAyBF,SAASb,KAAAA,CAAAA,IAAU,EAAA;AAAI,SAAA,CAAA;AAC5F,IAAA,MAAMgB,IAAAA,GAAOjB,WAAAA,CAAYkB,KAAK,IAAIC,2BAAAA,CAAcnB,WAAAA,CAAAA;IAChD,IAAI,CAACiB,QAAQd,IAAAA,KAASE,2BAAAA,CAAgBC,MAAM,EAAEJ,WAAAA,CAAYkB,IAAI,CAAC,gEAAA,CAAA;AAE/D,IAAA,MAAMC,GAAAA,GAAMJ,IAAAA,GAAOK,gBAAAA,CAAiBL,IAAAA,EAAMT,UAAAA,CAAAA,GAAce,SAAAA;IACxD,OAAO;AACHpB,QAAAA,IAAAA;AACAkB,QAAAA,GAAAA;AACAG,QAAAA,MAAAA,EAAQxB,YAAYwB,MAAM;AAC1BpB,QAAAA,MAAAA,EAAQJ,YAAYI,MAAM;QAC1BI,UAAAA,EAAYC,MAAAA,CAAOgB,WAAW,CAACjB,UAAAA,CAAAA;QAC/BkB,MAAAA,EAAQvB,IAAAA,KAASE,4BAAgBC,MAAM,GAAG,eAAeH,IAAAA,KAASE,2BAAAA,CAAgBsB,QAAQ,GAAG,cAAA,GAAiB,UAAA;AAC9GzB,QAAAA;AACJ,KAAA;AACJ;AAEA,SAASoB,gBAAAA,CAAiBJ,KAAa,EAAEV,UAAkD,EAAA;AACvF,IAAA,IAAI,CAACA,UAAAA,CAAWoB,MAAM,EAAE,OAAOV,KAAAA;AAC/B,IAAA,IAAIW,QAAAA,GAAWX,KAAAA;AACf,IAAA,MAAMY,SAAmB,EAAE;AAC3B,IAAA,KAAK,MAAM,CAACjB,IAAAA,EAAMkB,KAAAA,CAAM,IAAIvB,UAAAA,CAAY;AACpC,QAAA,MAAMwB,SAAS,CAAC,CAAC,EAAEnB,IAAAA,CAAK,CAAC,CAAC;QAC1B,IAAIgB,QAAAA,CAASI,QAAQ,CAACD,MAAAA,CAAAA,EAAS;AAC3BH,YAAAA,QAAAA,GAAWA,SAASK,KAAK,CAACF,MAAAA,CAAAA,CAAQG,IAAI,CAACC,kBAAAA,CAAmBL,KAAAA,CAAAA,CAAAA;QAC9D,CAAA,MAAO;YACHD,MAAAA,CAAOV,IAAI,CAAC,CAAA,EAAGgB,kBAAAA,CAAmBvB,MAAM,CAAC,EAAEuB,mBAAmBL,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AAC1E,QAAA;AACJ,IAAA;IAEA,OAAOD,MAAAA,CAAOF,MAAM,GAAG,CAAA,EAAGC,QAAAA,CAAS,CAAC,EAAEC,MAAAA,CAAOK,IAAI,CAAC,GAAA,CAAA,CAAA,CAAM,GAAGN,QAAAA;AAC/D;;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var scene_model = require('@cratis/scene.model');
|
|
4
|
+
var identityRoute = require('./identityRoute.js');
|
|
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
|
+
* The routes a host can deep link to: every screen at its own name, and every outlet destination at its
|
|
10
|
+
* authored route override or identity route. A destination listed earlier wins a route it shares with a
|
|
11
|
+
* later one, and authored overrides come before the screen-name defaults.
|
|
12
|
+
*/ function sceneRoutesFrom(screens, destinations = []) {
|
|
13
|
+
const routes = [];
|
|
14
|
+
for (const destination of destinations){
|
|
15
|
+
const kind = destination.kind ?? (destination.dialog ? scene_model.DestinationKind.Dialog : scene_model.DestinationKind.Outlet);
|
|
16
|
+
const screen = destination.screen ?? destination.slice;
|
|
17
|
+
const route = destination.route ?? identityRoute.identityRoute(destination);
|
|
18
|
+
if (kind !== scene_model.DestinationKind.Outlet || !screen || !route) continue;
|
|
19
|
+
routes.push({
|
|
20
|
+
route,
|
|
21
|
+
screen,
|
|
22
|
+
...destination.outlet ? {
|
|
23
|
+
outlet: destination.outlet
|
|
24
|
+
} : {}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return [
|
|
28
|
+
...routes,
|
|
29
|
+
...screens.map((screen)=>({
|
|
30
|
+
route: screen,
|
|
31
|
+
screen
|
|
32
|
+
}))
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
exports.sceneRoutesFrom = sceneRoutesFrom;
|
|
37
|
+
//# sourceMappingURL=sceneRoutesFrom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneRoutesFrom.js","sources":["../../../navigation/sceneRoutesFrom.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 { DestinationKind, DestinationReference } from '@cratis/scene.model';\nimport { identityRoute } from './identityRoute';\nimport { SceneRoute } from './SceneRoute';\n\n/**\n * The routes a host can deep link to: every screen at its own name, and every outlet destination at its\n * authored route override or identity route. A destination listed earlier wins a route it shares with a\n * later one, and authored overrides come before the screen-name defaults.\n */\nexport function sceneRoutesFrom(screens: string[], destinations: DestinationReference[] = []): SceneRoute[] {\n const routes: SceneRoute[] = [];\n for (const destination of destinations) {\n const kind = destination.kind ?? (destination.dialog ? DestinationKind.Dialog : DestinationKind.Outlet);\n const screen = destination.screen ?? destination.slice;\n const route = destination.route ?? identityRoute(destination);\n if (kind !== DestinationKind.Outlet || !screen || !route) continue;\n routes.push({ route, screen, ...(destination.outlet ? { outlet: destination.outlet } : {}) });\n }\n\n return [...routes, ...screens.map(screen => ({ route: screen, screen }))];\n}\n"],"names":["sceneRoutesFrom","screens","destinations","routes","destination","kind","dialog","DestinationKind","Dialog","Outlet","screen","slice","route","identityRoute","push","outlet","map"],"mappings":";;;;;AAAA;AACA;AAMA;;;;AAIC,IACM,SAASA,eAAAA,CAAgBC,OAAiB,EAAEC,eAAuC,EAAE,EAAA;AACxF,IAAA,MAAMC,SAAuB,EAAE;IAC/B,KAAK,MAAMC,eAAeF,YAAAA,CAAc;AACpC,QAAA,MAAMG,IAAAA,GAAOD,WAAAA,CAAYC,IAAI,KAAKD,WAAAA,CAAYE,MAAM,GAAGC,2BAAAA,CAAgBC,MAAM,GAAGD,2BAAAA,CAAgBE,MAAM,CAAD;AACrG,QAAA,MAAMC,MAAAA,GAASN,WAAAA,CAAYM,MAAM,IAAIN,YAAYO,KAAK;AACtD,QAAA,MAAMC,KAAAA,GAAQR,WAAAA,CAAYQ,KAAK,IAAIC,2BAAAA,CAAcT,WAAAA,CAAAA;AACjD,QAAA,IAAIC,SAASE,2BAAAA,CAAgBE,MAAM,IAAI,CAACC,MAAAA,IAAU,CAACE,KAAAA,EAAO;AAC1DT,QAAAA,MAAAA,CAAOW,IAAI,CAAC;AAAEF,YAAAA,KAAAA;AAAOF,YAAAA,MAAAA;YAAQ,GAAIN,WAAAA,CAAYW,MAAM,GAAG;AAAEA,gBAAAA,MAAAA,EAAQX,YAAYW;AAAO,aAAA,GAAI;AAAI,SAAA,CAAA;AAC/F,IAAA;IAEA,OAAO;AAAIZ,QAAAA,GAAAA,MAAAA;AAAWF,QAAAA,GAAAA,OAAAA,CAAQe,GAAG,CAACN,CAAAA,MAAAA,IAAW;gBAAEE,KAAAA,EAAOF,MAAAA;AAAQA,gBAAAA;aAAO,CAAA;AAAI,KAAA;AAC7E;;"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var scene_model = require('@cratis/scene.model');
|
|
5
|
+
var matchSceneRoute = require('./matchSceneRoute.js');
|
|
6
|
+
var resolveDestination = require('./resolveDestination.js');
|
|
7
|
+
|
|
8
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
9
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
10
|
+
/**
|
|
11
|
+
* Keeps a navigation host's state in a {@link SceneHistory}: every navigation and every dialog is an entry,
|
|
12
|
+
* so back and forward step through them, a refresh restores the stored entry, and a deep link is matched
|
|
13
|
+
* against the route table. Closing a dialog goes back to the entry that opened it.
|
|
14
|
+
*/ function useSceneHistoryNavigation(history, routes, initialScreen, bindingScope) {
|
|
15
|
+
const fromLocation = react.useCallback((url)=>{
|
|
16
|
+
const match = url ? matchSceneRoute.matchSceneRoute(url, routes) : undefined;
|
|
17
|
+
return match ? {
|
|
18
|
+
screen: match.route.screen,
|
|
19
|
+
url,
|
|
20
|
+
outlet: match.route.outlet,
|
|
21
|
+
parameters: match.parameters
|
|
22
|
+
} : undefined;
|
|
23
|
+
}, [
|
|
24
|
+
routes
|
|
25
|
+
]);
|
|
26
|
+
const fallback = react.useMemo(()=>({
|
|
27
|
+
screen: initialScreen,
|
|
28
|
+
url: initialScreen,
|
|
29
|
+
parameters: {}
|
|
30
|
+
}), [
|
|
31
|
+
initialScreen
|
|
32
|
+
]);
|
|
33
|
+
const [unresolvedUrl] = react.useState(()=>{
|
|
34
|
+
const url = history.location();
|
|
35
|
+
return !history.state() && url && !fromLocation(url) ? url : undefined;
|
|
36
|
+
});
|
|
37
|
+
const [state, setState] = react.useState(()=>history.state() ?? fromLocation(history.location()) ?? fallback);
|
|
38
|
+
const [dialogResult, setDialogResult] = react.useState();
|
|
39
|
+
// Back and forward restore the stored entry, or match a URL the host never wrote against the current routes.
|
|
40
|
+
const restore = react.useRef((url, stored)=>stored ?? fromLocation(url) ?? fallback);
|
|
41
|
+
restore.current = (url, stored)=>stored ?? fromLocation(url) ?? fallback;
|
|
42
|
+
const initialState = react.useRef(state);
|
|
43
|
+
// The current entry is written once, when a history is attached; later entries are written by navigate.
|
|
44
|
+
react.useEffect(()=>{
|
|
45
|
+
history.replace(initialState.current);
|
|
46
|
+
return history.listen((url, stored)=>setState(restore.current(url, stored)));
|
|
47
|
+
}, [
|
|
48
|
+
history
|
|
49
|
+
]);
|
|
50
|
+
const go = react.useCallback((next)=>{
|
|
51
|
+
history.push(next);
|
|
52
|
+
setState(next);
|
|
53
|
+
}, [
|
|
54
|
+
history
|
|
55
|
+
]);
|
|
56
|
+
const navigate = react.useCallback((destination)=>{
|
|
57
|
+
const resolution = resolveDestination.resolveDestination(destination, bindingScope);
|
|
58
|
+
if (resolution.kind === scene_model.DestinationKind.Dialog) {
|
|
59
|
+
if (resolution.dialog) go({
|
|
60
|
+
...state,
|
|
61
|
+
dialog: resolution.dialog
|
|
62
|
+
});
|
|
63
|
+
} else if (resolution.kind !== scene_model.DestinationKind.External) {
|
|
64
|
+
go({
|
|
65
|
+
screen: destination.screen ?? destination.slice ?? state.screen,
|
|
66
|
+
url: resolution.url,
|
|
67
|
+
outlet: resolution.outlet,
|
|
68
|
+
parameters: resolution.parameters
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return resolution;
|
|
72
|
+
}, [
|
|
73
|
+
bindingScope,
|
|
74
|
+
go,
|
|
75
|
+
state
|
|
76
|
+
]);
|
|
77
|
+
const closeDialog = react.useCallback((result)=>{
|
|
78
|
+
if (!state.dialog) return;
|
|
79
|
+
setDialogResult({
|
|
80
|
+
dialog: state.dialog,
|
|
81
|
+
result
|
|
82
|
+
});
|
|
83
|
+
history.back();
|
|
84
|
+
}, [
|
|
85
|
+
history,
|
|
86
|
+
state.dialog
|
|
87
|
+
]);
|
|
88
|
+
return react.useMemo(()=>({
|
|
89
|
+
currentScreen: state.screen,
|
|
90
|
+
currentUrl: state.url,
|
|
91
|
+
currentOutlet: state.outlet,
|
|
92
|
+
currentDialog: state.dialog,
|
|
93
|
+
currentParameters: state.parameters,
|
|
94
|
+
dialogResult,
|
|
95
|
+
unresolvedUrl,
|
|
96
|
+
bindingScope,
|
|
97
|
+
navigate,
|
|
98
|
+
closeDialog,
|
|
99
|
+
back: ()=>history.back()
|
|
100
|
+
}), [
|
|
101
|
+
bindingScope,
|
|
102
|
+
closeDialog,
|
|
103
|
+
dialogResult,
|
|
104
|
+
history,
|
|
105
|
+
navigate,
|
|
106
|
+
state,
|
|
107
|
+
unresolvedUrl
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
exports.useSceneHistoryNavigation = useSceneHistoryNavigation;
|
|
112
|
+
//# sourceMappingURL=useSceneHistoryNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSceneHistoryNavigation.js","sources":["../../../navigation/useSceneHistoryNavigation.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 { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { BindingScope } from '@cratis/scene.engine';\nimport { DestinationKind, DestinationReference } from '@cratis/scene.model';\nimport { DialogResult } from './DialogResult';\nimport { matchSceneRoute } from './matchSceneRoute';\nimport { resolveDestination } from './resolveDestination';\nimport { SceneHistory } from './SceneHistory';\nimport { SceneNavigationContextValue } from './SceneNavigationContext';\nimport { SceneNavigationState } from './SceneNavigationState';\nimport { SceneRoute } from './SceneRoute';\n\n/**\n * Keeps a navigation host's state in a {@link SceneHistory}: every navigation and every dialog is an entry,\n * so back and forward step through them, a refresh restores the stored entry, and a deep link is matched\n * against the route table. Closing a dialog goes back to the entry that opened it.\n */\nexport function useSceneHistoryNavigation(history: SceneHistory, routes: SceneRoute[], initialScreen: string, bindingScope: BindingScope): SceneNavigationContextValue {\n const fromLocation = useCallback((url: string | undefined): SceneNavigationState | undefined => {\n const match = url ? matchSceneRoute(url, routes) : undefined;\n return match ? { screen: match.route.screen, url, outlet: match.route.outlet, parameters: match.parameters } : undefined;\n }, [routes]);\n const fallback = useMemo<SceneNavigationState>(() => ({ screen: initialScreen, url: initialScreen, parameters: {} }), [initialScreen]);\n\n const [unresolvedUrl] = useState(() => {\n const url = history.location();\n return !history.state() && url && !fromLocation(url) ? url : undefined;\n });\n const [state, setState] = useState<SceneNavigationState>(() => history.state() ?? fromLocation(history.location()) ?? fallback);\n const [dialogResult, setDialogResult] = useState<DialogResult>();\n\n // Back and forward restore the stored entry, or match a URL the host never wrote against the current routes.\n const restore = useRef((url: string | undefined, stored: SceneNavigationState | undefined) => stored ?? fromLocation(url) ?? fallback);\n restore.current = (url, stored) => stored ?? fromLocation(url) ?? fallback;\n const initialState = useRef(state);\n\n // The current entry is written once, when a history is attached; later entries are written by navigate.\n useEffect(() => {\n history.replace(initialState.current);\n return history.listen((url, stored) => setState(restore.current(url, stored)));\n }, [history]);\n\n const go = useCallback((next: SceneNavigationState) => {\n history.push(next);\n setState(next);\n }, [history]);\n\n const navigate = useCallback((destination: DestinationReference) => {\n const resolution = resolveDestination(destination, bindingScope);\n if (resolution.kind === DestinationKind.Dialog) {\n if (resolution.dialog) go({ ...state, dialog: resolution.dialog });\n } else if (resolution.kind !== DestinationKind.External) {\n go({ screen: destination.screen ?? destination.slice ?? state.screen, url: resolution.url, outlet: resolution.outlet, parameters: resolution.parameters });\n }\n\n return resolution;\n }, [bindingScope, go, state]);\n\n const closeDialog = useCallback((result?: unknown) => {\n if (!state.dialog) return;\n setDialogResult({ dialog: state.dialog, result });\n history.back();\n }, [history, state.dialog]);\n\n return useMemo(() => ({\n currentScreen: state.screen,\n currentUrl: state.url,\n currentOutlet: state.outlet,\n currentDialog: state.dialog,\n currentParameters: state.parameters,\n dialogResult,\n unresolvedUrl,\n bindingScope,\n navigate,\n closeDialog,\n back: () => history.back(),\n }), [bindingScope, closeDialog, dialogResult, history, navigate, state, unresolvedUrl]);\n}\n"],"names":["useSceneHistoryNavigation","history","routes","initialScreen","bindingScope","fromLocation","useCallback","url","match","matchSceneRoute","undefined","screen","route","outlet","parameters","fallback","useMemo","unresolvedUrl","useState","location","state","setState","dialogResult","setDialogResult","restore","useRef","stored","current","initialState","useEffect","replace","listen","go","next","push","navigate","destination","resolution","resolveDestination","kind","DestinationKind","Dialog","dialog","External","slice","closeDialog","result","back","currentScreen","currentUrl","currentOutlet","currentDialog","currentParameters"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
* The design-time extension contract this host implements, as `major.minor`.
|
|
7
|
+
*
|
|
8
|
+
* The contract is the set of extension points a package's design-time bundle fills - previews, designers,
|
|
9
|
+
* property editors, property displays and actions - and the props and context each receives. A minor
|
|
10
|
+
* version adds optional members; a major version changes or removes them. A host loads a package's
|
|
11
|
+
* contributions only when the package's declared major version matches this one.
|
|
12
|
+
*/ const DesignTimeContractVersion = '1.0';
|
|
13
|
+
|
|
14
|
+
exports.DesignTimeContractVersion = DesignTimeContractVersion;
|
|
15
|
+
//# sourceMappingURL=DesignTimeContractVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignTimeContractVersion.js","sources":["../../../packages/DesignTimeContractVersion.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 * The design-time extension contract this host implements, as `major.minor`.\n *\n * The contract is the set of extension points a package's design-time bundle fills - previews, designers,\n * property editors, property displays and actions - and the props and context each receives. A minor\n * version adds optional members; a major version changes or removes them. A host loads a package's\n * contributions only when the package's declared major version matches this one.\n */\nexport const DesignTimeContractVersion = '1.0';\n"],"names":["DesignTimeContractVersion"],"mappings":";;AAAA;AACA;AAEA;;;;;;;IAQO,MAAMA,yBAAAA,GAA4B;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
* The versioned design-time extension points a package can fill. The values are the keys shared by
|
|
7
|
+
* `PackageDesignTimeMetadata` (what a manifest declares) and `DesignTimeBundle` (what a bundle provides).
|
|
8
|
+
*/ var DesignTimeExtensionPoint = /*#__PURE__*/ function(DesignTimeExtensionPoint) {
|
|
9
|
+
DesignTimeExtensionPoint["Preview"] = "previews";
|
|
10
|
+
DesignTimeExtensionPoint["Designer"] = "designers";
|
|
11
|
+
DesignTimeExtensionPoint["PropertyEditor"] = "propertyEditors";
|
|
12
|
+
DesignTimeExtensionPoint["PropertyDisplay"] = "propertyDisplays";
|
|
13
|
+
DesignTimeExtensionPoint["Action"] = "actions";
|
|
14
|
+
return DesignTimeExtensionPoint;
|
|
15
|
+
}({});
|
|
16
|
+
/** How a diagnostic names an extension point. */ const designTimeExtensionPointLabels = {
|
|
17
|
+
["previews"]: 'preview',
|
|
18
|
+
["designers"]: 'designer',
|
|
19
|
+
["propertyEditors"]: 'property editor',
|
|
20
|
+
["propertyDisplays"]: 'property display',
|
|
21
|
+
["actions"]: 'action'
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
exports.DesignTimeExtensionPoint = DesignTimeExtensionPoint;
|
|
25
|
+
exports.designTimeExtensionPointLabels = designTimeExtensionPointLabels;
|
|
26
|
+
//# sourceMappingURL=DesignTimeExtensionPoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignTimeExtensionPoint.js","sources":["../../../packages/DesignTimeExtensionPoint.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 * The versioned design-time extension points a package can fill. The values are the keys shared by\n * `PackageDesignTimeMetadata` (what a manifest declares) and `DesignTimeBundle` (what a bundle provides).\n */\nexport enum DesignTimeExtensionPoint {\n Preview = 'previews',\n Designer = 'designers',\n PropertyEditor = 'propertyEditors',\n PropertyDisplay = 'propertyDisplays',\n Action = 'actions',\n}\n\n/** How a diagnostic names an extension point. */\nexport const designTimeExtensionPointLabels: Record<DesignTimeExtensionPoint, string> = {\n [DesignTimeExtensionPoint.Preview]: 'preview',\n [DesignTimeExtensionPoint.Designer]: 'designer',\n [DesignTimeExtensionPoint.PropertyEditor]: 'property editor',\n [DesignTimeExtensionPoint.PropertyDisplay]: 'property display',\n [DesignTimeExtensionPoint.Action]: 'action',\n};\n"],"names":["DesignTimeExtensionPoint","designTimeExtensionPointLabels"],"mappings":";;AAAA;AACA;AAEA;;;IAIO,IAAKA,wBAAAA,iBAAAA,SAAAA,wBAAAA,EAAAA;;;;;;AAAAA,IAAAA,OAAAA,wBAAAA;AAMX,CAAA,CAAA,EAAA;AAED,kDACO,MAAMC,8BAAAA,GAA2E;AACpF,IAAA,CAAA,UAAA,GAAoC,SAAA;AACpC,IAAA,CAAA,WAAA,GAAqC,UAAA;AACrC,IAAA,CAAA,iBAAA,GAA2C,iBAAA;AAC3C,IAAA,CAAA,kBAAA,GAA4C,kBAAA;AAC5C,IAAA,CAAA,SAAA,GAAmC;AACvC;;;"}
|
|
@@ -64,6 +64,7 @@ var ScenePackageBundle = require('./ScenePackageBundle.js');
|
|
|
64
64
|
screenTemplates: approved.flatMap((bundle)=>bundle.screenTemplates ?? []),
|
|
65
65
|
dialogTemplates: approved.flatMap((bundle)=>bundle.dialogTemplates ?? []),
|
|
66
66
|
themes: approved.flatMap((bundle)=>bundle.themes ?? []),
|
|
67
|
+
templates: scene_engine.describeTemplateCatalog(approved, configuration.sceneVersion),
|
|
67
68
|
icons: IconAdapterRegistry.createIconAdapterRegistry(approved.map((bundle)=>bundle.iconLibrary?.adapter).filter((adapter)=>adapter !== undefined)),
|
|
68
69
|
assets: approvedAssets,
|
|
69
70
|
fonts: approvedAssets.filter(isFontAsset),
|
|
@@ -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 { 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\nexport interface ResolvedPackageHost {\n bundles: ScenePackageBundle[];\n components: ReturnType<typeof mergePackageRegistries>;\n layouts: Layout[];\n screenTemplates: ScreenTemplate[];\n dialogTemplates: DialogTemplate[];\n themes: Theme[];\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 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","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, 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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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var DesignTimeContractVersion = require('./DesignTimeContractVersion.js');
|
|
4
|
+
var DesignTimeExtensionPoint = require('./DesignTimeExtensionPoint.js');
|
|
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
|
+
* Loads the design-time contributions of approved bundles, checking each against the contract version this
|
|
10
|
+
* host implements and against what its manifest declares. Nothing is partially trusted: a package with an
|
|
11
|
+
* incompatible or unreadable contract version, or contributions its manifest does not declare at all,
|
|
12
|
+
* contributes nothing; a single undeclared contribution is left out; a declared one the bundle lacks is
|
|
13
|
+
* reported and falls back.
|
|
14
|
+
*/ function loadDesignTimeContributions(bundles, loadDesignTime) {
|
|
15
|
+
const packages = new Map();
|
|
16
|
+
const diagnostics = [];
|
|
17
|
+
const hostMajor = DesignTimeContractVersion.DesignTimeContractVersion.split('.')[0];
|
|
18
|
+
for (const { manifest, designTime } of bundles){
|
|
19
|
+
const declared = manifest.designTime;
|
|
20
|
+
const unavailable = (reason)=>{
|
|
21
|
+
diagnostics.push(reason);
|
|
22
|
+
packages.set(manifest.name, {
|
|
23
|
+
contributions: {},
|
|
24
|
+
unavailableReason: reason
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
if (!declared && !designTime) continue;
|
|
28
|
+
if (!loadDesignTime) {
|
|
29
|
+
packages.set(manifest.name, {
|
|
30
|
+
contributions: {},
|
|
31
|
+
unavailableReason: `This host does not load design-time contributions, so package '${manifest.name}' uses generic editors`
|
|
32
|
+
});
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (!declared) {
|
|
36
|
+
unavailable(`Package '${manifest.name}' provides design-time contributions its manifest does not declare; none are loaded`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const version = declared.contractVersion ?? '1.0';
|
|
40
|
+
if (!/^\d+\.\d+$/.test(version)) {
|
|
41
|
+
unavailable(`Package '${manifest.name}' declares design-time contract version '${version}', which is not a major.minor version; none of its contributions are loaded`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (version.split('.')[0] !== hostMajor) {
|
|
45
|
+
unavailable(`Package '${manifest.name}' targets design-time contract ${version}, but this host implements ${DesignTimeContractVersion.DesignTimeContractVersion}; none of its contributions are loaded`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
packages.set(manifest.name, {
|
|
49
|
+
contributions: declaredContributions(manifest.name, declared, designTime, diagnostics)
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
packages,
|
|
54
|
+
diagnostics
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function declaredContributions(packageName, declared, provided, diagnostics) {
|
|
58
|
+
const contributions = {};
|
|
59
|
+
for (const point of Object.values(DesignTimeExtensionPoint.DesignTimeExtensionPoint)){
|
|
60
|
+
const label = DesignTimeExtensionPoint.designTimeExtensionPointLabels[point];
|
|
61
|
+
const names = new Set(declared[point] ?? []);
|
|
62
|
+
const available = provided?.[point] ?? {};
|
|
63
|
+
const loaded = {};
|
|
64
|
+
for (const name of names){
|
|
65
|
+
if (name in available) {
|
|
66
|
+
loaded[name] = available[name];
|
|
67
|
+
} else {
|
|
68
|
+
diagnostics.push(`Package '${packageName}' declares the ${label} '${name}', but its design-time bundle does not provide it`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (const name of Object.keys(available).filter((name)=>!names.has(name))){
|
|
72
|
+
diagnostics.push(`Package '${packageName}' provides the ${label} '${name}', which its manifest does not declare; it is not loaded`);
|
|
73
|
+
}
|
|
74
|
+
contributions[point] = loaded;
|
|
75
|
+
}
|
|
76
|
+
return contributions;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
exports.loadDesignTimeContributions = loadDesignTimeContributions;
|
|
80
|
+
//# sourceMappingURL=loadDesignTimeContributions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadDesignTimeContributions.js","sources":["../../../packages/loadDesignTimeContributions.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 { DesignTimeBundle } from './DesignTimeBundle';\nimport { DesignTimeContractVersion } from './DesignTimeContractVersion';\nimport { DesignTimeExtensionPoint, designTimeExtensionPointLabels } from './DesignTimeExtensionPoint';\nimport { ScenePackageBundle } from './ScenePackageBundle';\n\n/**\n * A package's design-time contributions as a host loaded them: only what the manifest declares, or nothing\n * with the reason when the package cannot be loaded at all.\n */\nexport interface LoadedDesignTimeContributions {\n contributions: Partial<Record<DesignTimeExtensionPoint, Record<string, unknown>>>;\n unavailableReason?: string;\n}\n\n/**\n * Loads the design-time contributions of approved bundles, checking each against the contract version this\n * host implements and against what its manifest declares. Nothing is partially trusted: a package with an\n * incompatible or unreadable contract version, or contributions its manifest does not declare at all,\n * contributes nothing; a single undeclared contribution is left out; a declared one the bundle lacks is\n * reported and falls back.\n */\nexport function loadDesignTimeContributions(\n bundles: ScenePackageBundle[],\n loadDesignTime: boolean,\n): { packages: Map<string, LoadedDesignTimeContributions>; diagnostics: string[] } {\n const packages = new Map<string, LoadedDesignTimeContributions>();\n const diagnostics: string[] = [];\n const hostMajor = DesignTimeContractVersion.split('.')[0];\n\n for (const { manifest, designTime } of bundles) {\n const declared = manifest.designTime;\n const unavailable = (reason: string) => {\n diagnostics.push(reason);\n packages.set(manifest.name, { contributions: {}, unavailableReason: reason });\n };\n\n if (!declared && !designTime) continue;\n if (!loadDesignTime) {\n packages.set(manifest.name, { contributions: {}, unavailableReason: `This host does not load design-time contributions, so package '${manifest.name}' uses generic editors` });\n continue;\n }\n\n if (!declared) {\n unavailable(`Package '${manifest.name}' provides design-time contributions its manifest does not declare; none are loaded`);\n continue;\n }\n\n const version = declared.contractVersion ?? '1.0';\n if (!/^\\d+\\.\\d+$/.test(version)) {\n unavailable(`Package '${manifest.name}' declares design-time contract version '${version}', which is not a major.minor version; none of its contributions are loaded`);\n continue;\n }\n\n if (version.split('.')[0] !== hostMajor) {\n unavailable(`Package '${manifest.name}' targets design-time contract ${version}, but this host implements ${DesignTimeContractVersion}; none of its contributions are loaded`);\n continue;\n }\n\n packages.set(manifest.name, { contributions: declaredContributions(manifest.name, declared, designTime, diagnostics) });\n }\n\n return { packages, diagnostics };\n}\n\nfunction declaredContributions(\n packageName: string,\n declared: Record<DesignTimeExtensionPoint, string[]>,\n provided: DesignTimeBundle | undefined,\n diagnostics: string[],\n): LoadedDesignTimeContributions['contributions'] {\n const contributions: LoadedDesignTimeContributions['contributions'] = {};\n\n for (const point of Object.values(DesignTimeExtensionPoint)) {\n const label = designTimeExtensionPointLabels[point];\n const names = new Set(declared[point] ?? []);\n const available = (provided?.[point] ?? {}) as Record<string, unknown>;\n const loaded: Record<string, unknown> = {};\n\n for (const name of names) {\n if (name in available) {\n loaded[name] = available[name];\n } else {\n diagnostics.push(`Package '${packageName}' declares the ${label} '${name}', but its design-time bundle does not provide it`);\n }\n }\n\n for (const name of Object.keys(available).filter(name => !names.has(name))) {\n diagnostics.push(`Package '${packageName}' provides the ${label} '${name}', which its manifest does not declare; it is not loaded`);\n }\n\n contributions[point] = loaded;\n }\n\n return contributions;\n}\n"],"names":["loadDesignTimeContributions","bundles","loadDesignTime","packages","Map","diagnostics","hostMajor","DesignTimeContractVersion","split","manifest","designTime","declared","unavailable","reason","push","set","name","contributions","unavailableReason","version","contractVersion","test","declaredContributions","packageName","provided","point","Object","values","DesignTimeExtensionPoint","label","designTimeExtensionPointLabels","names","Set","available","loaded","keys","filter","has"],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var DesignTimeExtensionPoint = require('./DesignTimeExtensionPoint.js');
|
|
4
|
+
var loadDesignTimeContributions = require('./loadDesignTimeContributions.js');
|
|
5
|
+
var PackageHostConfiguration = require('./PackageHostConfiguration.js');
|
|
6
|
+
var runDesignTimeAction = require('./runDesignTimeAction.js');
|
|
7
|
+
|
|
8
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
9
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
10
|
+
/**
|
|
11
|
+
* Resolves a package host and the design-time contributions of its approved packages. Design-time code is
|
|
12
|
+
* only loaded when the host policy sets `loadDesignTime`; a runtime host gets generic fallbacks everywhere.
|
|
13
|
+
*/ function resolveDesignTimeHost(configuration, options = {}) {
|
|
14
|
+
const host = PackageHostConfiguration.resolvePackageHost(configuration);
|
|
15
|
+
const loaded = loadDesignTimeContributions.loadDesignTimeContributions(host.bundles, configuration.policy.loadDesignTime === true);
|
|
16
|
+
const hostEditorKinds = new Set(options.hostEditorKinds ?? []);
|
|
17
|
+
const approved = new Set(host.bundles.map((bundle)=>bundle.manifest.name));
|
|
18
|
+
const lookup = (descriptor, point, kind)=>{
|
|
19
|
+
if (!kind) return {};
|
|
20
|
+
const label = DesignTimeExtensionPoint.designTimeExtensionPointLabels[point];
|
|
21
|
+
const separator = kind.indexOf(':');
|
|
22
|
+
const owner = separator > 0 ? kind.substring(0, separator) : ownerOf(descriptor);
|
|
23
|
+
const name = separator > 0 ? kind.substring(separator + 1) : kind;
|
|
24
|
+
const outcome = point === DesignTimeExtensionPoint.DesignTimeExtensionPoint.Action ? 'the host shows it disabled' : `the host uses its generic ${label}`;
|
|
25
|
+
const fallback = (reason)=>({
|
|
26
|
+
diagnostic: `'${descriptor.component}' asks for the ${label} '${kind}', ${reason}; ${outcome}`
|
|
27
|
+
});
|
|
28
|
+
if (!approved.has(owner)) return fallback(`but package '${owner}' is not approved by this host`);
|
|
29
|
+
const contributions = loaded.packages.get(owner);
|
|
30
|
+
if (contributions?.unavailableReason) return fallback(`but design-time contributions from package '${owner}' are not loaded`);
|
|
31
|
+
const contribution = contributions?.contributions[point]?.[name];
|
|
32
|
+
if (contribution !== undefined) return {
|
|
33
|
+
contribution,
|
|
34
|
+
package: owner
|
|
35
|
+
};
|
|
36
|
+
if (point === DesignTimeExtensionPoint.DesignTimeExtensionPoint.PropertyEditor && separator < 0 && hostEditorKinds.has(kind)) return {
|
|
37
|
+
hostKind: kind
|
|
38
|
+
};
|
|
39
|
+
return fallback(`which package '${owner}' does not provide`);
|
|
40
|
+
};
|
|
41
|
+
const actionOf = (descriptor, actionId)=>loaded.packages.get(ownerOf(descriptor))?.contributions[DesignTimeExtensionPoint.DesignTimeExtensionPoint.Action]?.[actionId];
|
|
42
|
+
const actions = (descriptor, context)=>(descriptor.actions ?? []).map((action)=>{
|
|
43
|
+
const state = {
|
|
44
|
+
descriptor: action,
|
|
45
|
+
package: ownerOf(descriptor)
|
|
46
|
+
};
|
|
47
|
+
const handler = actionOf(descriptor, action.id);
|
|
48
|
+
if (!handler) {
|
|
49
|
+
const resolution = lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.Action, action.id);
|
|
50
|
+
return {
|
|
51
|
+
...state,
|
|
52
|
+
visible: true,
|
|
53
|
+
enabled: false,
|
|
54
|
+
diagnostic: resolution.diagnostic
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
return {
|
|
59
|
+
...state,
|
|
60
|
+
visible: handler.isVisible(context),
|
|
61
|
+
enabled: handler.isEnabled(context)
|
|
62
|
+
};
|
|
63
|
+
} catch (error) {
|
|
64
|
+
return {
|
|
65
|
+
...state,
|
|
66
|
+
visible: true,
|
|
67
|
+
enabled: false,
|
|
68
|
+
diagnostic: `Action '${action.id}' could not decide its availability: ${String(error)}`
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
const descriptors = host.bundles.flatMap((bundle)=>bundle.descriptors ?? []);
|
|
73
|
+
return {
|
|
74
|
+
host,
|
|
75
|
+
diagnostics: [
|
|
76
|
+
...host.diagnostics,
|
|
77
|
+
...loaded.diagnostics
|
|
78
|
+
],
|
|
79
|
+
preview: (descriptor)=>lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.Preview, descriptor.previewKind),
|
|
80
|
+
designer: (descriptor)=>lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.Designer, descriptor.editorKind),
|
|
81
|
+
propertyEditor: (descriptor, property)=>lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.PropertyEditor, property.editorKind),
|
|
82
|
+
propertyDisplay: (descriptor)=>lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.PropertyDisplay, descriptor.propertyDisplayKind),
|
|
83
|
+
actions,
|
|
84
|
+
runAction: (descriptor, actionId, context)=>{
|
|
85
|
+
const state = actions(descriptor, context).find((action)=>action.descriptor.id === actionId);
|
|
86
|
+
const handler = actionOf(descriptor, actionId);
|
|
87
|
+
if (!state || !handler || !state.visible || !state.enabled) {
|
|
88
|
+
const reason = state?.diagnostic ?? (state ? `Action '${actionId}' is not available here` : `'${descriptor.component}' has no action '${actionId}'`);
|
|
89
|
+
return {
|
|
90
|
+
submitted: false,
|
|
91
|
+
edits: [],
|
|
92
|
+
diagnostics: [
|
|
93
|
+
reason
|
|
94
|
+
]
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return runDesignTimeAction.runDesignTimeAction(handler, context);
|
|
98
|
+
},
|
|
99
|
+
diagnoseDescriptors: ()=>descriptors.flatMap((descriptor)=>[
|
|
100
|
+
lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.Preview, descriptor.previewKind),
|
|
101
|
+
lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.Designer, descriptor.editorKind),
|
|
102
|
+
lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.PropertyDisplay, descriptor.propertyDisplayKind),
|
|
103
|
+
...descriptor.properties.map((property)=>lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.PropertyEditor, property.editorKind)),
|
|
104
|
+
...(descriptor.actions ?? []).map((action)=>lookup(descriptor, DesignTimeExtensionPoint.DesignTimeExtensionPoint.Action, action.id))
|
|
105
|
+
]).map((resolution)=>resolution.diagnostic).filter((diagnostic)=>diagnostic !== undefined)
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function ownerOf(descriptor) {
|
|
109
|
+
const separator = descriptor.component.indexOf(':');
|
|
110
|
+
return separator > 0 ? descriptor.component.substring(0, separator) : descriptor.component;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
exports.resolveDesignTimeHost = resolveDesignTimeHost;
|
|
114
|
+
//# sourceMappingURL=resolveDesignTimeHost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveDesignTimeHost.js","sources":["../../../packages/resolveDesignTimeHost.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 { ComponentType } from 'react';\nimport { ComponentDescriptor, PropertyDescriptor } from '@cratis/scene.model';\nimport { DesignTimeAction, DesignTimeActionContext } from './DesignTimeAction';\nimport { DesignTimeActionOutcome } from './DesignTimeActionOutcome';\nimport { DesignTimeActionState } from './DesignTimeActionState';\nimport { DesignTimeComponentProps } from './DesignTimeComponentProps';\nimport { DesignTimeExtensionPoint, designTimeExtensionPointLabels } from './DesignTimeExtensionPoint';\nimport { DesignTimePropertyDisplayProps } from './DesignTimePropertyDisplayProps';\nimport { DesignTimePropertyEditorProps } from './DesignTimePropertyEditorProps';\nimport { DesignTimeResolution } from './DesignTimeResolution';\nimport { LoadedDesignTimeContributions, loadDesignTimeContributions } from './loadDesignTimeContributions';\nimport { PackageHostConfiguration, ResolvedPackageHost, resolvePackageHost } from './PackageHostConfiguration';\nimport { runDesignTimeAction } from './runDesignTimeAction';\n\n/**\n * The generic design-time host contract: every package - first or third party - is reached through these\n * lookups, so a designer never switches on package or component names.\n */\nexport interface DesignTimeHost {\n /** The runtime package host the design-time contributions were loaded alongside. */\n host: ResolvedPackageHost;\n\n /** Package-level problems: the host's own, contract version mismatches and declared/provided disagreements. */\n diagnostics: string[];\n\n preview(descriptor: ComponentDescriptor): DesignTimeResolution<ComponentType<DesignTimeComponentProps>>;\n designer(descriptor: ComponentDescriptor): DesignTimeResolution<ComponentType<DesignTimeComponentProps>>;\n propertyEditor(descriptor: ComponentDescriptor, property: PropertyDescriptor): DesignTimeResolution<ComponentType<DesignTimePropertyEditorProps>>;\n propertyDisplay(descriptor: ComponentDescriptor): DesignTimeResolution<ComponentType<DesignTimePropertyDisplayProps>>;\n\n /** The component's actions, with the visibility and enablement their owning package decides. */\n actions(descriptor: ComponentDescriptor, context: DesignTimeActionContext): DesignTimeActionState[];\n\n /** Runs an action and submits its canonical edit batch to the host through `context.submitAction`. */\n runAction(descriptor: ComponentDescriptor, actionId: string, context: DesignTimeActionContext): DesignTimeActionOutcome;\n\n /** Every unknown or unavailable extension the approved packages' descriptors ask for. */\n diagnoseDescriptors(): string[];\n}\n\n/** Options for {@link resolveDesignTimeHost}. */\nexport interface DesignTimeHostOptions {\n /** Property editor kinds the host implements itself, such as an icon picker or a query binder. */\n hostEditorKinds?: string[];\n}\n\n/**\n * Resolves a package host and the design-time contributions of its approved packages. Design-time code is\n * only loaded when the host policy sets `loadDesignTime`; a runtime host gets generic fallbacks everywhere.\n */\nexport function resolveDesignTimeHost(configuration: PackageHostConfiguration, options: DesignTimeHostOptions = {}): DesignTimeHost {\n const host = resolvePackageHost(configuration);\n const loaded = loadDesignTimeContributions(host.bundles, configuration.policy.loadDesignTime === true);\n const hostEditorKinds = new Set(options.hostEditorKinds ?? []);\n const approved = new Set(host.bundles.map(bundle => bundle.manifest.name));\n\n const lookup = <T>(descriptor: ComponentDescriptor, point: DesignTimeExtensionPoint, kind: string | undefined): DesignTimeResolution<T> => {\n if (!kind) return {};\n const label = designTimeExtensionPointLabels[point];\n const separator = kind.indexOf(':');\n const owner = separator > 0 ? kind.substring(0, separator) : ownerOf(descriptor);\n const name = separator > 0 ? kind.substring(separator + 1) : kind;\n const outcome = point === DesignTimeExtensionPoint.Action ? 'the host shows it disabled' : `the host uses its generic ${label}`;\n const fallback = (reason: string) => ({ diagnostic: `'${descriptor.component}' asks for the ${label} '${kind}', ${reason}; ${outcome}` });\n\n if (!approved.has(owner)) return fallback(`but package '${owner}' is not approved by this host`);\n const contributions: LoadedDesignTimeContributions | undefined = loaded.packages.get(owner);\n if (contributions?.unavailableReason) return fallback(`but design-time contributions from package '${owner}' are not loaded`);\n const contribution = contributions?.contributions[point]?.[name] as T | undefined;\n if (contribution !== undefined) return { contribution, package: owner };\n if (point === DesignTimeExtensionPoint.PropertyEditor && separator < 0 && hostEditorKinds.has(kind)) return { hostKind: kind };\n return fallback(`which package '${owner}' does not provide`);\n };\n\n const actionOf = (descriptor: ComponentDescriptor, actionId: string): DesignTimeAction | undefined =>\n loaded.packages.get(ownerOf(descriptor))?.contributions[DesignTimeExtensionPoint.Action]?.[actionId] as DesignTimeAction | undefined;\n\n const actions = (descriptor: ComponentDescriptor, context: DesignTimeActionContext): DesignTimeActionState[] =>\n (descriptor.actions ?? []).map(action => {\n const state = { descriptor: action, package: ownerOf(descriptor) };\n const handler = actionOf(descriptor, action.id);\n if (!handler) {\n const resolution = lookup<DesignTimeAction>(descriptor, DesignTimeExtensionPoint.Action, action.id);\n return { ...state, visible: true, enabled: false, diagnostic: resolution.diagnostic };\n }\n\n try {\n return { ...state, visible: handler.isVisible(context), enabled: handler.isEnabled(context) };\n } catch (error) {\n return { ...state, visible: true, enabled: false, diagnostic: `Action '${action.id}' could not decide its availability: ${String(error)}` };\n }\n });\n\n const descriptors = host.bundles.flatMap(bundle => bundle.descriptors ?? []);\n\n return {\n host,\n diagnostics: [...host.diagnostics, ...loaded.diagnostics],\n preview: descriptor => lookup(descriptor, DesignTimeExtensionPoint.Preview, descriptor.previewKind),\n designer: descriptor => lookup(descriptor, DesignTimeExtensionPoint.Designer, descriptor.editorKind),\n propertyEditor: (descriptor, property) => lookup(descriptor, DesignTimeExtensionPoint.PropertyEditor, property.editorKind),\n propertyDisplay: descriptor => lookup(descriptor, DesignTimeExtensionPoint.PropertyDisplay, descriptor.propertyDisplayKind),\n actions,\n runAction: (descriptor, actionId, context) => {\n const state = actions(descriptor, context).find(action => action.descriptor.id === actionId);\n const handler = actionOf(descriptor, actionId);\n if (!state || !handler || !state.visible || !state.enabled) {\n const reason = state?.diagnostic ?? (state ? `Action '${actionId}' is not available here` : `'${descriptor.component}' has no action '${actionId}'`);\n return { submitted: false, edits: [], diagnostics: [reason] };\n }\n\n return runDesignTimeAction(handler, context);\n },\n diagnoseDescriptors: () =>\n descriptors.flatMap(descriptor => [\n lookup(descriptor, DesignTimeExtensionPoint.Preview, descriptor.previewKind),\n lookup(descriptor, DesignTimeExtensionPoint.Designer, descriptor.editorKind),\n lookup(descriptor, DesignTimeExtensionPoint.PropertyDisplay, descriptor.propertyDisplayKind),\n ...descriptor.properties.map(property => lookup(descriptor, DesignTimeExtensionPoint.PropertyEditor, property.editorKind)),\n ...(descriptor.actions ?? []).map(action => lookup(descriptor, DesignTimeExtensionPoint.Action, action.id)),\n ])\n .map(resolution => resolution.diagnostic)\n .filter((diagnostic): diagnostic is string => diagnostic !== undefined),\n };\n}\n\nfunction ownerOf(descriptor: ComponentDescriptor): string {\n const separator = descriptor.component.indexOf(':');\n return separator > 0 ? descriptor.component.substring(0, separator) : descriptor.component;\n}\n"],"names":["resolveDesignTimeHost","configuration","options","host","resolvePackageHost","loaded","loadDesignTimeContributions","bundles","policy","loadDesignTime","hostEditorKinds","Set","approved","map","bundle","manifest","name","lookup","descriptor","point","kind","label","designTimeExtensionPointLabels","separator","indexOf","owner","substring","ownerOf","outcome","DesignTimeExtensionPoint","Action","fallback","reason","diagnostic","component","has","contributions","packages","get","unavailableReason","contribution","undefined","package","PropertyEditor","hostKind","actionOf","actionId","actions","context","action","state","handler","id","resolution","visible","enabled","isVisible","isEnabled","error","String","descriptors","flatMap","diagnostics","preview","Preview","previewKind","designer","Designer","editorKind","propertyEditor","property","propertyDisplay","PropertyDisplay","propertyDisplayKind","runAction","find","submitted","edits","runDesignTimeAction","diagnoseDescriptors","properties","filter"],"mappings":"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"}
|