@cratis/scene.react 4.9.0 → 4.11.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.
Files changed (169) hide show
  1. package/SceneElementView.tsx +29 -7
  2. package/dist/cjs/SceneElementView.js +21 -8
  3. package/dist/cjs/SceneElementView.js.map +1 -1
  4. package/dist/cjs/core/coreComponents.js +6 -0
  5. package/dist/cjs/core/coreComponents.js.map +1 -1
  6. package/dist/cjs/core/coreDescriptors.js +5 -0
  7. package/dist/cjs/core/coreDescriptors.js.map +1 -1
  8. package/dist/cjs/index.js +28 -0
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/navigation/SceneNavigationContext.js +21 -0
  11. package/dist/cjs/navigation/SceneNavigationContext.js.map +1 -0
  12. package/dist/cjs/navigation/SceneNavigationHost.js +82 -0
  13. package/dist/cjs/navigation/SceneNavigationHost.js.map +1 -0
  14. package/dist/cjs/navigation/resolveDestination.js +54 -0
  15. package/dist/cjs/navigation/resolveDestination.js.map +1 -0
  16. package/dist/cjs/packages/DesignTimeBundle.js.map +1 -1
  17. package/dist/cjs/packages/DesignTimeProvider.js +23 -0
  18. package/dist/cjs/packages/DesignTimeProvider.js.map +1 -0
  19. package/dist/cjs/packages/EmbeddedPackageHost.js +15 -0
  20. package/dist/cjs/packages/EmbeddedPackageHost.js.map +1 -0
  21. package/dist/cjs/packages/PackageHostAssets.js +30 -0
  22. package/dist/cjs/packages/PackageHostAssets.js.map +1 -0
  23. package/dist/cjs/packages/PackageHostConfiguration.js +40 -4
  24. package/dist/cjs/packages/PackageHostConfiguration.js.map +1 -1
  25. package/dist/cjs/packages/PackageHostRenderMode.js +15 -0
  26. package/dist/cjs/packages/PackageHostRenderMode.js.map +1 -0
  27. package/dist/cjs/packages/PackageHostView.js +53 -0
  28. package/dist/cjs/packages/PackageHostView.js.map +1 -0
  29. package/dist/cjs/packages/StandalonePackageHost.js +15 -0
  30. package/dist/cjs/packages/StandalonePackageHost.js.map +1 -0
  31. package/dist/cjs/packages/WebViewPackageHost.js +15 -0
  32. package/dist/cjs/packages/WebViewPackageHost.js.map +1 -0
  33. package/dist/cjs/renderer/AbortableQueryRunner.js +26 -0
  34. package/dist/cjs/renderer/AbortableQueryRunner.js.map +1 -0
  35. package/dist/cjs/renderer/InteractiveComponent.js +34 -1
  36. package/dist/cjs/renderer/InteractiveComponent.js.map +1 -1
  37. package/dist/cjs/renderer/RenderBindingScopeContext.js +77 -0
  38. package/dist/cjs/renderer/RenderBindingScopeContext.js.map +1 -0
  39. package/dist/esm/SceneElementView.d.ts +5 -2
  40. package/dist/esm/SceneElementView.d.ts.map +1 -1
  41. package/dist/esm/SceneElementView.js +22 -9
  42. package/dist/esm/SceneElementView.js.map +1 -1
  43. package/dist/esm/core/coreComponents.js +6 -0
  44. package/dist/esm/core/coreComponents.js.map +1 -1
  45. package/dist/esm/core/coreDescriptors.js +5 -0
  46. package/dist/esm/core/coreDescriptors.js.map +1 -1
  47. package/dist/esm/index.d.ts +1 -0
  48. package/dist/esm/index.d.ts.map +1 -1
  49. package/dist/esm/index.js +12 -0
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/navigation/DestinationResolution.d.ts +10 -0
  52. package/dist/esm/navigation/DestinationResolution.d.ts.map +1 -0
  53. package/dist/esm/navigation/DestinationResolution.js +2 -0
  54. package/dist/esm/navigation/DestinationResolution.js.map +1 -0
  55. package/dist/esm/navigation/SceneNavigationContext.d.ts +20 -0
  56. package/dist/esm/navigation/SceneNavigationContext.d.ts.map +1 -0
  57. package/dist/esm/navigation/SceneNavigationContext.js +18 -0
  58. package/dist/esm/navigation/SceneNavigationContext.js.map +1 -0
  59. package/dist/esm/navigation/SceneNavigationHost.d.ts +12 -0
  60. package/dist/esm/navigation/SceneNavigationHost.d.ts.map +1 -0
  61. package/dist/esm/navigation/SceneNavigationHost.js +80 -0
  62. package/dist/esm/navigation/SceneNavigationHost.js.map +1 -0
  63. package/dist/esm/navigation/index.d.ts +5 -0
  64. package/dist/esm/navigation/index.d.ts.map +1 -0
  65. package/dist/esm/navigation/index.js +5 -0
  66. package/dist/esm/navigation/index.js.map +1 -0
  67. package/dist/esm/navigation/resolveDestination.d.ts +5 -0
  68. package/dist/esm/navigation/resolveDestination.d.ts.map +1 -0
  69. package/dist/esm/navigation/resolveDestination.js +52 -0
  70. package/dist/esm/navigation/resolveDestination.js.map +1 -0
  71. package/dist/esm/packages/DesignTimeAction.d.ts +3 -4
  72. package/dist/esm/packages/DesignTimeAction.d.ts.map +1 -1
  73. package/dist/esm/packages/DesignTimeBundle.d.ts +8 -11
  74. package/dist/esm/packages/DesignTimeBundle.d.ts.map +1 -1
  75. package/dist/esm/packages/DesignTimeBundle.js.map +1 -1
  76. package/dist/esm/packages/DesignTimeComponentProps.d.ts +5 -0
  77. package/dist/esm/packages/DesignTimeComponentProps.d.ts.map +1 -0
  78. package/dist/esm/packages/DesignTimeComponentProps.js +2 -0
  79. package/dist/esm/packages/DesignTimeComponentProps.js.map +1 -0
  80. package/dist/esm/packages/DesignTimeContext.d.ts +18 -0
  81. package/dist/esm/packages/DesignTimeContext.d.ts.map +1 -0
  82. package/dist/esm/packages/DesignTimeContext.js +2 -0
  83. package/dist/esm/packages/DesignTimeContext.js.map +1 -0
  84. package/dist/esm/packages/DesignTimePropertyDisplayProps.d.ts +8 -0
  85. package/dist/esm/packages/DesignTimePropertyDisplayProps.d.ts.map +1 -0
  86. package/dist/esm/packages/DesignTimePropertyDisplayProps.js +2 -0
  87. package/dist/esm/packages/DesignTimePropertyDisplayProps.js.map +1 -0
  88. package/dist/esm/packages/DesignTimePropertyEditorProps.d.ts +9 -0
  89. package/dist/esm/packages/DesignTimePropertyEditorProps.d.ts.map +1 -0
  90. package/dist/esm/packages/DesignTimePropertyEditorProps.js +2 -0
  91. package/dist/esm/packages/DesignTimePropertyEditorProps.js.map +1 -0
  92. package/dist/esm/packages/DesignTimeProvider.d.ts +9 -0
  93. package/dist/esm/packages/DesignTimeProvider.d.ts.map +1 -0
  94. package/dist/esm/packages/DesignTimeProvider.js +20 -0
  95. package/dist/esm/packages/DesignTimeProvider.js.map +1 -0
  96. package/dist/esm/packages/EmbeddedPackageHost.d.ts +3 -0
  97. package/dist/esm/packages/EmbeddedPackageHost.d.ts.map +1 -0
  98. package/dist/esm/packages/EmbeddedPackageHost.js +13 -0
  99. package/dist/esm/packages/EmbeddedPackageHost.js.map +1 -0
  100. package/dist/esm/packages/PackageHostAssets.d.ts +6 -0
  101. package/dist/esm/packages/PackageHostAssets.d.ts.map +1 -0
  102. package/dist/esm/packages/PackageHostAssets.js +28 -0
  103. package/dist/esm/packages/PackageHostAssets.js.map +1 -0
  104. package/dist/esm/packages/PackageHostConfiguration.d.ts +11 -1
  105. package/dist/esm/packages/PackageHostConfiguration.d.ts.map +1 -1
  106. package/dist/esm/packages/PackageHostConfiguration.js +41 -5
  107. package/dist/esm/packages/PackageHostConfiguration.js.map +1 -1
  108. package/dist/esm/packages/PackageHostRenderMode.d.ts +6 -0
  109. package/dist/esm/packages/PackageHostRenderMode.d.ts.map +1 -0
  110. package/dist/esm/packages/PackageHostRenderMode.js +13 -0
  111. package/dist/esm/packages/PackageHostRenderMode.js.map +1 -0
  112. package/dist/esm/packages/PackageHostView.d.ts +13 -0
  113. package/dist/esm/packages/PackageHostView.d.ts.map +1 -0
  114. package/dist/esm/packages/PackageHostView.js +51 -0
  115. package/dist/esm/packages/PackageHostView.js.map +1 -0
  116. package/dist/esm/packages/StandalonePackageHost.d.ts +3 -0
  117. package/dist/esm/packages/StandalonePackageHost.d.ts.map +1 -0
  118. package/dist/esm/packages/StandalonePackageHost.js +13 -0
  119. package/dist/esm/packages/StandalonePackageHost.js.map +1 -0
  120. package/dist/esm/packages/WebViewPackageHost.d.ts +3 -0
  121. package/dist/esm/packages/WebViewPackageHost.d.ts.map +1 -0
  122. package/dist/esm/packages/WebViewPackageHost.js +13 -0
  123. package/dist/esm/packages/WebViewPackageHost.js.map +1 -0
  124. package/dist/esm/packages/index.d.ts +12 -0
  125. package/dist/esm/packages/index.d.ts.map +1 -1
  126. package/dist/esm/packages/index.js +12 -0
  127. package/dist/esm/packages/index.js.map +1 -1
  128. package/dist/esm/renderer/AbortableQueryRunner.d.ts +7 -0
  129. package/dist/esm/renderer/AbortableQueryRunner.d.ts.map +1 -0
  130. package/dist/esm/renderer/AbortableQueryRunner.js +24 -0
  131. package/dist/esm/renderer/AbortableQueryRunner.js.map +1 -0
  132. package/dist/esm/renderer/InteractiveComponent.d.ts.map +1 -1
  133. package/dist/esm/renderer/InteractiveComponent.js +35 -2
  134. package/dist/esm/renderer/InteractiveComponent.js.map +1 -1
  135. package/dist/esm/renderer/RenderBindingScopeContext.d.ts +14 -0
  136. package/dist/esm/renderer/RenderBindingScopeContext.d.ts.map +1 -0
  137. package/dist/esm/renderer/RenderBindingScopeContext.js +73 -0
  138. package/dist/esm/renderer/RenderBindingScopeContext.js.map +1 -0
  139. package/dist/esm/renderer/index.d.ts +2 -0
  140. package/dist/esm/renderer/index.d.ts.map +1 -1
  141. package/dist/esm/renderer/index.js +2 -0
  142. package/dist/esm/renderer/index.js.map +1 -1
  143. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  144. package/index.ts +1 -0
  145. package/navigation/DestinationResolution.ts +13 -0
  146. package/navigation/SceneNavigationContext.tsx +34 -0
  147. package/navigation/SceneNavigationHost.tsx +67 -0
  148. package/navigation/index.ts +7 -0
  149. package/navigation/resolveDestination.ts +50 -0
  150. package/package.json +5 -5
  151. package/packages/DesignTimeAction.ts +3 -4
  152. package/packages/DesignTimeBundle.ts +8 -5
  153. package/packages/DesignTimeComponentProps.ts +11 -0
  154. package/packages/DesignTimeContext.ts +32 -0
  155. package/packages/DesignTimePropertyDisplayProps.ts +14 -0
  156. package/packages/DesignTimePropertyEditorProps.ts +15 -0
  157. package/packages/DesignTimeProvider.tsx +25 -0
  158. package/packages/EmbeddedPackageHost.tsx +10 -0
  159. package/packages/PackageHostAssets.tsx +18 -0
  160. package/packages/PackageHostConfiguration.ts +62 -5
  161. package/packages/PackageHostRenderMode.ts +11 -0
  162. package/packages/PackageHostView.tsx +43 -0
  163. package/packages/StandalonePackageHost.tsx +10 -0
  164. package/packages/WebViewPackageHost.tsx +10 -0
  165. package/packages/index.ts +12 -0
  166. package/renderer/AbortableQueryRunner.ts +27 -0
  167. package/renderer/InteractiveComponent.tsx +32 -3
  168. package/renderer/RenderBindingScopeContext.tsx +73 -0
  169. package/renderer/index.ts +2 -0
@@ -0,0 +1,13 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { PackageHostView } from './PackageHostView.js';
3
+ import { PackageHostRenderMode } from './PackageHostRenderMode.js';
4
+
5
+ /** An embedded package host example surface for application or designer panes. */ function EmbeddedPackageHost(props) {
6
+ return /*#__PURE__*/ jsx(PackageHostView, {
7
+ ...props,
8
+ mode: PackageHostRenderMode.Embedded
9
+ });
10
+ }
11
+
12
+ export { EmbeddedPackageHost };
13
+ //# sourceMappingURL=EmbeddedPackageHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddedPackageHost.js","sources":["../../../packages/EmbeddedPackageHost.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 { PackageHostView, PackageHostViewProps } from './PackageHostView';\nimport { PackageHostRenderMode } from './PackageHostRenderMode';\n\n/** An embedded package host example surface for application or designer panes. */\nexport function EmbeddedPackageHost(props: Omit<PackageHostViewProps, 'mode'>) {\n return <PackageHostView {...props} mode={PackageHostRenderMode.Embedded} />;\n}\n"],"names":["EmbeddedPackageHost","props","_jsx","PackageHostView","mode","PackageHostRenderMode","Embedded"],"mappings":";;;;AAMA,mFACO,SAASA,mBAAAA,CAAoBC,KAAyC,EAAA;AACzE,IAAA,qBAAOC,GAAA,CAACC,eAAAA,EAAAA;AAAiB,QAAA,GAAGF,KAAK;AAAEG,QAAAA,IAAAA,EAAMC,sBAAsBC;;AACnE;;"}
@@ -0,0 +1,6 @@
1
+ export interface PackageHostAssetsProps {
2
+ assets: string[];
3
+ fonts: string[];
4
+ }
5
+ export declare function PackageHostAssets({ assets, fonts }: PackageHostAssetsProps): import("react").JSX.Element;
6
+ //# sourceMappingURL=PackageHostAssets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageHostAssets.d.ts","sourceRoot":"","sources":["../../../packages/PackageHostAssets.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAKD,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,sBAAsB,+BAM1E"}
@@ -0,0 +1,28 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
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
+ * Emits package-declared browser assets for a package host example.
7
+ */ function PackageHostAssets({ assets, fonts }) {
8
+ const fontSet = new Set(fonts);
9
+ return /*#__PURE__*/ jsxs(Fragment, {
10
+ children: [
11
+ assets.filter((asset)=>!fontSet.has(asset)).map((asset)=>/*#__PURE__*/ jsx("link", {
12
+ rel: "stylesheet",
13
+ href: asset,
14
+ "data-scene-package-asset": asset
15
+ }, asset)),
16
+ fonts.map((font)=>/*#__PURE__*/ jsx("link", {
17
+ rel: "preload",
18
+ href: font,
19
+ as: "font",
20
+ crossOrigin: "",
21
+ "data-scene-package-font": font
22
+ }, font))
23
+ ]
24
+ });
25
+ }
26
+
27
+ export { PackageHostAssets };
28
+ //# sourceMappingURL=PackageHostAssets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageHostAssets.js","sources":["../../../packages/PackageHostAssets.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\nexport interface PackageHostAssetsProps {\n assets: string[];\n fonts: string[];\n}\n\n/**\n * Emits package-declared browser assets for a package host example.\n */\nexport function PackageHostAssets({ assets, fonts }: PackageHostAssetsProps) {\n const fontSet = new Set(fonts);\n return <>\n {assets.filter(asset => !fontSet.has(asset)).map(asset => <link key={asset} rel='stylesheet' href={asset} data-scene-package-asset={asset} />)}\n {fonts.map(font => <link key={font} rel='preload' href={font} as='font' crossOrigin='' data-scene-package-font={font} />)}\n </>;\n}\n"],"names":["PackageHostAssets","assets","fonts","fontSet","Set","_jsxs","_Fragment","filter","asset","has","map","_jsx","link","rel","href","data-scene-package-asset","font","as","crossOrigin","data-scene-package-font"],"mappings":";;AAAA;AACA;AAOA;;AAEC,IACM,SAASA,iBAAAA,CAAkB,EAAEC,MAAM,EAAEC,KAAK,EAA0B,EAAA;IACvE,MAAMC,OAAAA,GAAU,IAAIC,GAAAA,CAAIF,KAAAA,CAAAA;IACxB,qBAAOG,IAAA,CAAAC,QAAA,EAAA;;AACFL,YAAAA,MAAAA,CAAOM,MAAM,CAACC,CAAAA,KAAAA,GAAS,CAACL,OAAAA,CAAQM,GAAG,CAACD,KAAAA,CAAAA,CAAAA,CAAQE,GAAG,CAACF,CAAAA,sBAASG,GAAA,CAACC,MAAAA,EAAAA;oBAAiBC,GAAAA,EAAI,YAAA;oBAAaC,IAAAA,EAAMN,KAAAA;oBAAOO,0BAAAA,EAA0BP;AAA/DA,iBAAAA,EAAAA,KAAAA,CAAAA,CAAAA;AACpEN,YAAAA,KAAAA,CAAMQ,GAAG,CAACM,CAAAA,IAAAA,iBAAQL,GAAA,CAACC,MAAAA,EAAAA;oBAAgBC,GAAAA,EAAI,SAAA;oBAAUC,IAAAA,EAAME,IAAAA;oBAAMC,EAAAA,EAAG,MAAA;oBAAOC,WAAAA,EAAY,EAAA;oBAAGC,yBAAAA,EAAyBH;AAAlFA,iBAAAA,EAAAA,IAAAA,CAAAA;;;AAEtC;;"}
@@ -1,8 +1,10 @@
1
- import { UiProfile } from '@cratis/scene.model';
1
+ import { DialogTemplate, Layout, ScreenTemplate, Theme, UiProfile } from '@cratis/scene.model';
2
+ import { IconAdapterRegistry } from '../icons/IconAdapterRegistry';
2
3
  import { ScenePackageBundle, mergePackageRegistries } from './ScenePackageBundle';
3
4
  export interface PackageHostPolicy {
4
5
  allowExecutableImports: boolean;
5
6
  allowNetworkAssets: boolean;
7
+ loadDesignTime?: boolean;
6
8
  }
7
9
  export interface PackageHostConfiguration {
8
10
  bundles: ScenePackageBundle[];
@@ -12,6 +14,14 @@ export interface PackageHostConfiguration {
12
14
  export interface ResolvedPackageHost {
13
15
  bundles: ScenePackageBundle[];
14
16
  components: ReturnType<typeof mergePackageRegistries>;
17
+ layouts: Layout[];
18
+ screenTemplates: ScreenTemplate[];
19
+ dialogTemplates: DialogTemplate[];
20
+ themes: Theme[];
21
+ icons: IconAdapterRegistry;
22
+ assets: string[];
23
+ fonts: string[];
24
+ blocked: boolean;
15
25
  diagnostics: string[];
16
26
  }
17
27
  export declare function resolvePackageHost(configuration: PackageHostConfiguration): ResolvedPackageHost;
@@ -1 +1 @@
1
- {"version":3,"file":"PackageHostConfiguration.d.ts","sourceRoot":"","sources":["../../../packages/PackageHostConfiguration.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAElF,MAAM,WAAW,iBAAiB;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,UAAU,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;IACtD,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAKD,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,wBAAwB,GAAG,mBAAmB,CA6B/F"}
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;AAE/F,OAAO,EAAE,mBAAmB,EAA6B,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAyB,MAAM,sBAAsB,CAAC;AAEzG,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;CAC7B;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;IAChB,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,CAqE/F"}
@@ -1,4 +1,6 @@
1
- import { mergePackageRegistries } from './ScenePackageBundle.js';
1
+ import { resolvePackageDependencies } from '@cratis/scene.engine';
2
+ import { createIconAdapterRegistry } from '../icons/IconAdapterRegistry.js';
3
+ import { validatePackageBundle, mergePackageRegistries } from './ScenePackageBundle.js';
2
4
 
3
5
  // Copyright (c) Cratis. All rights reserved.
4
6
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -6,21 +8,41 @@ import { mergePackageRegistries } from './ScenePackageBundle.js';
6
8
  * Resolves the approved package set a standalone or embedded React host uses.
7
9
  */ function resolvePackageHost(configuration) {
8
10
  const diagnostics = [];
11
+ const names = new Map();
12
+ for (const bundle of configuration.bundles){
13
+ names.set(bundle.manifest.name, (names.get(bundle.manifest.name) ?? 0) + 1);
14
+ }
15
+ for (const [name, count] of names){
16
+ if (count > 1) diagnostics.push(`Package '${name}' is approved more than once; duplicate bundles are ambiguous`);
17
+ }
9
18
  const byName = new Map(configuration.bundles.map((bundle)=>[
10
19
  bundle.manifest.name,
11
20
  bundle
12
21
  ]));
22
+ const selection = resolvePackageDependencies(configuration.profile.packages, configuration.bundles.map((bundle)=>bundle.manifest));
23
+ for (const missing of selection.missing)diagnostics.push(`Package '${missing.package}' depends on missing package '${missing.dependsOn}'`);
24
+ for (const conflict of selection.versionConflicts){
25
+ diagnostics.push(`Package '${conflict.package}' requires '${conflict.dependsOn}' ${conflict.requiredRange} but approved version is ${conflict.actualVersion}`);
26
+ }
27
+ for (const cycle of selection.cycles)diagnostics.push(`Package dependency cycle: ${cycle.join(' -> ')}`);
13
28
  const bundles = [];
14
29
  const runtimeSingletons = new Map();
15
- for (const packageName of configuration.profile.packages){
30
+ const assets = [];
31
+ for (const packageName of selection.packages){
16
32
  const bundle = byName.get(packageName);
17
33
  if (!bundle) {
18
34
  diagnostics.push(`UI profile asks for '${packageName}' but the host did not approve a bundle for it`);
19
35
  continue;
20
36
  }
21
- if (!configuration.policy.allowNetworkAssets && (bundle.manifest.assets ?? []).some((asset)=>/^https?:\/\//.test(asset))) {
37
+ diagnostics.push(...validatePackageBundle(bundle).map((problem)=>`${packageName}: ${problem}`));
38
+ if (configuration.policy.loadDesignTime === true && !configuration.policy.allowExecutableImports && bundle.designTime) {
39
+ diagnostics.push(`Package '${packageName}' provides executable design-time contributions, but host policy forbids them`);
40
+ }
41
+ const packageAssets = bundle.manifest.assets ?? [];
42
+ if (!configuration.policy.allowNetworkAssets && packageAssets.some((asset)=>/^https?:\/\//.test(asset))) {
22
43
  diagnostics.push(`Package '${packageName}' declares network assets, but host policy forbids them`);
23
44
  }
45
+ assets.push(...packageAssets);
24
46
  for (const dependency of bundle.manifest.runtimeSingletons ?? []){
25
47
  const owner = runtimeSingletons.get(dependency);
26
48
  if (owner && owner !== packageName) {
@@ -30,12 +52,26 @@ import { mergePackageRegistries } from './ScenePackageBundle.js';
30
52
  }
31
53
  bundles.push(bundle);
32
54
  }
55
+ const blocked = diagnostics.length > 0;
56
+ const approved = blocked ? [] : bundles;
57
+ const approvedAssets = blocked ? [] : assets;
33
58
  return {
34
- bundles,
35
- components: mergePackageRegistries(bundles),
59
+ bundles: approved,
60
+ components: mergePackageRegistries(approved),
61
+ layouts: approved.flatMap((bundle)=>bundle.layouts ?? []),
62
+ screenTemplates: approved.flatMap((bundle)=>bundle.screenTemplates ?? []),
63
+ dialogTemplates: approved.flatMap((bundle)=>bundle.dialogTemplates ?? []),
64
+ themes: approved.flatMap((bundle)=>bundle.themes ?? []),
65
+ icons: createIconAdapterRegistry(approved.map((bundle)=>bundle.iconLibrary?.adapter).filter((adapter)=>adapter !== undefined)),
66
+ assets: approvedAssets,
67
+ fonts: approvedAssets.filter(isFontAsset),
68
+ blocked,
36
69
  diagnostics
37
70
  };
38
71
  }
72
+ function isFontAsset(asset) {
73
+ return /\.(woff2?|otf|ttf)(\?|$)/.test(asset) || asset.includes('/fonts/');
74
+ }
39
75
 
40
76
  export { resolvePackageHost };
41
77
  //# sourceMappingURL=PackageHostConfiguration.js.map
@@ -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 { UiProfile } from '@cratis/scene.model';\nimport { ScenePackageBundle, mergePackageRegistries } from './ScenePackageBundle';\n\nexport interface PackageHostPolicy {\n allowExecutableImports: boolean;\n allowNetworkAssets: 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 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 byName = new Map(configuration.bundles.map(bundle => [bundle.manifest.name, bundle]));\n const bundles: ScenePackageBundle[] = [];\n const runtimeSingletons = new Map<string, string>();\n\n for (const packageName of configuration.profile.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 if (!configuration.policy.allowNetworkAssets && (bundle.manifest.assets ?? []).some(asset => /^https?:\\/\\//.test(asset))) {\n diagnostics.push(`Package '${packageName}' declares network assets, but host policy forbids them`);\n }\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 return { bundles, components: mergePackageRegistries(bundles), diagnostics };\n}\n"],"names":["resolvePackageHost","configuration","diagnostics","byName","Map","bundles","map","bundle","manifest","name","runtimeSingletons","packageName","profile","packages","get","push","policy","allowNetworkAssets","assets","some","asset","test","dependency","owner","set","components","mergePackageRegistries"],"mappings":";;AAAA;AACA;AAsBA;;IAGO,SAASA,kBAAAA,CAAmBC,aAAuC,EAAA;AACtE,IAAA,MAAMC,cAAwB,EAAE;IAChC,MAAMC,MAAAA,GAAS,IAAIC,GAAAA,CAAIH,aAAAA,CAAcI,OAAO,CAACC,GAAG,CAACC,CAAAA,MAAAA,GAAU;YAACA,MAAAA,CAAOC,QAAQ,CAACC,IAAI;AAAEF,YAAAA;AAAO,SAAA,CAAA,CAAA;AACzF,IAAA,MAAMF,UAAgC,EAAE;AACxC,IAAA,MAAMK,oBAAoB,IAAIN,GAAAA,EAAAA;AAE9B,IAAA,KAAK,MAAMO,WAAAA,IAAeV,aAAAA,CAAcW,OAAO,CAACC,QAAQ,CAAE;QACtD,MAAMN,MAAAA,GAASJ,MAAAA,CAAOW,GAAG,CAACH,WAAAA,CAAAA;AAC1B,QAAA,IAAI,CAACJ,MAAAA,EAAQ;AACTL,YAAAA,WAAAA,CAAYa,IAAI,CAAC,CAAC,qBAAqB,EAAEJ,WAAAA,CAAY,8CAA8C,CAAC,CAAA;AACpG,YAAA;AACJ,QAAA;QAEA,IAAI,CAACV,cAAce,MAAM,CAACC,kBAAkB,IAAKV,CAAAA,MAAAA,CAAOC,QAAQ,CAACU,MAAM,IAAI,EAAE,EAAEC,IAAI,CAACC,CAAAA,KAAAA,GAAS,cAAA,CAAeC,IAAI,CAACD,KAAAA,CAAAA,CAAAA,EAAS;AACtHlB,YAAAA,WAAAA,CAAYa,IAAI,CAAC,CAAC,SAAS,EAAEJ,WAAAA,CAAY,uDAAuD,CAAC,CAAA;AACrG,QAAA;QAEA,KAAK,MAAMW,cAAcf,MAAAA,CAAOC,QAAQ,CAACE,iBAAiB,IAAI,EAAE,CAAE;YAC9D,MAAMa,KAAAA,GAAQb,iBAAAA,CAAkBI,GAAG,CAACQ,UAAAA,CAAAA;YACpC,IAAIC,KAAAA,IAASA,UAAUZ,WAAAA,EAAa;AAChCT,gBAAAA,WAAAA,CAAYa,IAAI,CAAC,CAAC,mBAAmB,EAAEO,UAAAA,CAAW,uBAAuB,EAAEC,KAAAA,CAAM,OAAO,EAAEZ,WAAAA,CAAY,CAAC,CAAC,CAAA;AAC5G,YAAA;YACAD,iBAAAA,CAAkBc,GAAG,CAACF,UAAAA,EAAYX,WAAAA,CAAAA;AACtC,QAAA;AAEAN,QAAAA,OAAAA,CAAQU,IAAI,CAACR,MAAAA,CAAAA;AACjB,IAAA;IAEA,OAAO;AAAEF,QAAAA,OAAAA;AAASoB,QAAAA,UAAAA,EAAYC,sBAAAA,CAAuBrB,OAAAA,CAAAA;AAAUH,QAAAA;AAAY,KAAA;AAC/E;;"}
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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"}
@@ -0,0 +1,6 @@
1
+ export declare enum PackageHostRenderMode {
2
+ Standalone = "standalone",
3
+ Embedded = "embedded",
4
+ WebView = "webView"
5
+ }
6
+ //# sourceMappingURL=PackageHostRenderMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageHostRenderMode.d.ts","sourceRoot":"","sources":["../../../packages/PackageHostRenderMode.ts"],"names":[],"mappings":"AAMA,oBAAY,qBAAqB;IAC7B,UAAU,eAAe;IACzB,QAAQ,aAAa;IACrB,OAAO,YAAY;CACtB"}
@@ -0,0 +1,13 @@
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
+ * The host surface rendering a resolved package profile.
5
+ */ var PackageHostRenderMode = /*#__PURE__*/ function(PackageHostRenderMode) {
6
+ PackageHostRenderMode["Standalone"] = "standalone";
7
+ PackageHostRenderMode["Embedded"] = "embedded";
8
+ PackageHostRenderMode["WebView"] = "webView";
9
+ return PackageHostRenderMode;
10
+ }({});
11
+
12
+ export { PackageHostRenderMode };
13
+ //# sourceMappingURL=PackageHostRenderMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageHostRenderMode.js","sources":["../../../packages/PackageHostRenderMode.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 host surface rendering a resolved package profile.\n */\nexport enum PackageHostRenderMode {\n Standalone = 'standalone',\n Embedded = 'embedded',\n WebView = 'webView',\n}\n"],"names":["PackageHostRenderMode"],"mappings":"AAAA;AACA;AAEA;;IAGO,IAAKA,qBAAAA,iBAAAA,SAAAA,qBAAAA,EAAAA;;;;AAAAA,IAAAA,OAAAA,qBAAAA;AAIX,CAAA,CAAA,EAAA;;"}
@@ -0,0 +1,13 @@
1
+ import { SceneElement } from '@cratis/scene.model';
2
+ import { PackageHostConfiguration } from './PackageHostConfiguration';
3
+ import { PackageHostRenderMode } from './PackageHostRenderMode';
4
+ export interface PackageHostViewProps {
5
+ configuration: PackageHostConfiguration;
6
+ element: SceneElement;
7
+ mode?: PackageHostRenderMode;
8
+ dataContext?: unknown;
9
+ queryResults?: Record<string, unknown>;
10
+ componentOutputs?: Record<string, Record<string, unknown>>;
11
+ }
12
+ export declare function PackageHostView({ configuration, element, mode, dataContext, queryResults, componentOutputs, }: PackageHostViewProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=PackageHostView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageHostView.d.ts","sourceRoot":"","sources":["../../../packages/PackageHostView.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,wBAAwB,EAAsB,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACjC,aAAa,EAAE,wBAAwB,CAAC;IACxC,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,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;CAC9D;AAMD,wBAAgB,eAAe,CAAC,EAC5B,aAAa,EACb,OAAO,EACP,IAAqC,EACrC,WAAW,EACX,YAAY,EACZ,gBAAgB,GACnB,EAAE,oBAAoB,+BAatB"}
@@ -0,0 +1,51 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { SceneElementView } from '../SceneElementView.js';
3
+ import { PackageHostAssets } from './PackageHostAssets.js';
4
+ import { resolvePackageHost } from './PackageHostConfiguration.js';
5
+ import { PackageHostRenderMode } from './PackageHostRenderMode.js';
6
+
7
+ // Copyright (c) Cratis. All rights reserved.
8
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
9
+ /**
10
+ * Renders a Scene element through an approved package host. Diagnostics are blocking: no rejected bundle,
11
+ * component, asset or design-time contribution is rendered after policy/dependency validation fails.
12
+ */ function PackageHostView({ configuration, element, mode = PackageHostRenderMode.Embedded, dataContext, queryResults, componentOutputs }) {
13
+ const host = resolvePackageHost(configuration);
14
+ if (host.blocked) {
15
+ return /*#__PURE__*/ jsxs("section", {
16
+ role: "alert",
17
+ "data-scene-host-mode": mode,
18
+ "data-scene-host-blocked": "true",
19
+ children: [
20
+ /*#__PURE__*/ jsx("h2", {
21
+ children: "Scene package host blocked rendering"
22
+ }),
23
+ /*#__PURE__*/ jsx("ul", {
24
+ children: host.diagnostics.map((diagnostic)=>/*#__PURE__*/ jsx("li", {
25
+ children: diagnostic
26
+ }, diagnostic))
27
+ })
28
+ ]
29
+ });
30
+ }
31
+ return /*#__PURE__*/ jsxs("section", {
32
+ "data-scene-host-mode": mode,
33
+ "data-scene-host-blocked": "false",
34
+ children: [
35
+ /*#__PURE__*/ jsx(PackageHostAssets, {
36
+ assets: host.assets,
37
+ fonts: host.fonts
38
+ }),
39
+ /*#__PURE__*/ jsx(SceneElementView, {
40
+ element: element,
41
+ registry: host.components,
42
+ dataContext: dataContext,
43
+ queryResults: queryResults,
44
+ componentOutputs: componentOutputs
45
+ })
46
+ ]
47
+ });
48
+ }
49
+
50
+ export { PackageHostView };
51
+ //# sourceMappingURL=PackageHostView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageHostView.js","sources":["../../../packages/PackageHostView.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 { SceneElement } from '@cratis/scene.model';\nimport { SceneElementView } from '../SceneElementView';\nimport { PackageHostAssets } from './PackageHostAssets';\nimport { PackageHostConfiguration, resolvePackageHost } from './PackageHostConfiguration';\nimport { PackageHostRenderMode } from './PackageHostRenderMode';\n\nexport interface PackageHostViewProps {\n configuration: PackageHostConfiguration;\n element: SceneElement;\n mode?: PackageHostRenderMode;\n dataContext?: unknown;\n queryResults?: Record<string, unknown>;\n componentOutputs?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Renders a Scene element through an approved package host. Diagnostics are blocking: no rejected bundle,\n * component, asset or design-time contribution is rendered after policy/dependency validation fails.\n */\nexport function PackageHostView({\n configuration,\n element,\n mode = PackageHostRenderMode.Embedded,\n dataContext,\n queryResults,\n componentOutputs,\n}: PackageHostViewProps) {\n const host = resolvePackageHost(configuration);\n if (host.blocked) {\n return <section role='alert' data-scene-host-mode={mode} data-scene-host-blocked='true'>\n <h2>Scene package host blocked rendering</h2>\n <ul>{host.diagnostics.map(diagnostic => <li key={diagnostic}>{diagnostic}</li>)}</ul>\n </section>;\n }\n\n return <section data-scene-host-mode={mode} data-scene-host-blocked='false'>\n <PackageHostAssets assets={host.assets} fonts={host.fonts} />\n <SceneElementView element={element} registry={host.components} dataContext={dataContext} queryResults={queryResults} componentOutputs={componentOutputs} />\n </section>;\n}\n"],"names":["PackageHostView","configuration","element","mode","PackageHostRenderMode","Embedded","dataContext","queryResults","componentOutputs","host","resolvePackageHost","blocked","_jsxs","section","role","data-scene-host-mode","data-scene-host-blocked","_jsx","h2","ul","diagnostics","map","diagnostic","li","PackageHostAssets","assets","fonts","SceneElementView","registry","components"],"mappings":";;;;;;AAAA;AACA;AAiBA;;;AAGC,IACM,SAASA,eAAAA,CAAgB,EAC5BC,aAAa,EACbC,OAAO,EACPC,IAAAA,GAAOC,qBAAAA,CAAsBC,QAAQ,EACrCC,WAAW,EACXC,YAAY,EACZC,gBAAgB,EACG,EAAA;AACnB,IAAA,MAAMC,OAAOC,kBAAAA,CAAmBT,aAAAA,CAAAA;IAChC,IAAIQ,IAAAA,CAAKE,OAAO,EAAE;AACd,QAAA,qBAAOC,IAAA,CAACC,SAAAA,EAAAA;YAAQC,IAAAA,EAAK,OAAA;YAAQC,sBAAAA,EAAsBZ,IAAAA;YAAMa,yBAAAA,EAAwB,MAAA;;8BAC7EC,GAAA,CAACC,IAAAA,EAAAA;AAAG,oBAAA,QAAA,EAAA;;8BACJD,GAAA,CAACE,IAAAA,EAAAA;AAAIV,oBAAAA,QAAAA,EAAAA,IAAAA,CAAKW,WAAW,CAACC,GAAG,CAACC,CAAAA,2BAAcL,GAAA,CAACM,IAAAA,EAAAA;AAAqBD,4BAAAA,QAAAA,EAAAA;AAAbA,yBAAAA,EAAAA,UAAAA,CAAAA;;;;AAEzD,IAAA;AAEA,IAAA,qBAAOV,IAAA,CAACC,SAAAA,EAAAA;QAAQE,sBAAAA,EAAsBZ,IAAAA;QAAMa,yBAAAA,EAAwB,OAAA;;0BAChEC,GAAA,CAACO,iBAAAA,EAAAA;AAAkBC,gBAAAA,MAAAA,EAAQhB,KAAKgB,MAAM;AAAEC,gBAAAA,KAAAA,EAAOjB,KAAKiB;;0BACpDT,GAAA,CAACU,gBAAAA,EAAAA;gBAAiBzB,OAAAA,EAASA,OAAAA;AAAS0B,gBAAAA,QAAAA,EAAUnB,KAAKoB,UAAU;gBAAEvB,WAAAA,EAAaA,WAAAA;gBAAaC,YAAAA,EAAcA,YAAAA;gBAAcC,gBAAAA,EAAkBA;;;;AAE/I;;"}
@@ -0,0 +1,3 @@
1
+ import { PackageHostViewProps } from './PackageHostView';
2
+ export declare function StandalonePackageHost(props: Omit<PackageHostViewProps, 'mode'>): import("react").JSX.Element;
3
+ //# sourceMappingURL=StandalonePackageHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StandalonePackageHost.d.ts","sourceRoot":"","sources":["../../../packages/StandalonePackageHost.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAmB,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAI1E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,+BAE9E"}
@@ -0,0 +1,13 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { PackageHostView } from './PackageHostView.js';
3
+ import { PackageHostRenderMode } from './PackageHostRenderMode.js';
4
+
5
+ /** A standalone browser package host example surface. */ function StandalonePackageHost(props) {
6
+ return /*#__PURE__*/ jsx(PackageHostView, {
7
+ ...props,
8
+ mode: PackageHostRenderMode.Standalone
9
+ });
10
+ }
11
+
12
+ export { StandalonePackageHost };
13
+ //# sourceMappingURL=StandalonePackageHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StandalonePackageHost.js","sources":["../../../packages/StandalonePackageHost.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 { PackageHostView, PackageHostViewProps } from './PackageHostView';\nimport { PackageHostRenderMode } from './PackageHostRenderMode';\n\n/** A standalone browser package host example surface. */\nexport function StandalonePackageHost(props: Omit<PackageHostViewProps, 'mode'>) {\n return <PackageHostView {...props} mode={PackageHostRenderMode.Standalone} />;\n}\n"],"names":["StandalonePackageHost","props","_jsx","PackageHostView","mode","PackageHostRenderMode","Standalone"],"mappings":";;;;AAMA,0DACO,SAASA,qBAAAA,CAAsBC,KAAyC,EAAA;AAC3E,IAAA,qBAAOC,GAAA,CAACC,eAAAA,EAAAA;AAAiB,QAAA,GAAGF,KAAK;AAAEG,QAAAA,IAAAA,EAAMC,sBAAsBC;;AACnE;;"}
@@ -0,0 +1,3 @@
1
+ import { PackageHostViewProps } from './PackageHostView';
2
+ export declare function WebViewPackageHost(props: Omit<PackageHostViewProps, 'mode'>): import("react").JSX.Element;
3
+ //# sourceMappingURL=WebViewPackageHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebViewPackageHost.d.ts","sourceRoot":"","sources":["../../../packages/WebViewPackageHost.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAmB,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAI1E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,+BAE3E"}
@@ -0,0 +1,13 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { PackageHostView } from './PackageHostView.js';
3
+ import { PackageHostRenderMode } from './PackageHostRenderMode.js';
4
+
5
+ /** A constrained webview package host example surface. */ function WebViewPackageHost(props) {
6
+ return /*#__PURE__*/ jsx(PackageHostView, {
7
+ ...props,
8
+ mode: PackageHostRenderMode.WebView
9
+ });
10
+ }
11
+
12
+ export { WebViewPackageHost };
13
+ //# sourceMappingURL=WebViewPackageHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebViewPackageHost.js","sources":["../../../packages/WebViewPackageHost.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 { PackageHostView, PackageHostViewProps } from './PackageHostView';\nimport { PackageHostRenderMode } from './PackageHostRenderMode';\n\n/** A constrained webview package host example surface. */\nexport function WebViewPackageHost(props: Omit<PackageHostViewProps, 'mode'>) {\n return <PackageHostView {...props} mode={PackageHostRenderMode.WebView} />;\n}\n"],"names":["WebViewPackageHost","props","_jsx","PackageHostView","mode","PackageHostRenderMode","WebView"],"mappings":";;;;AAMA,2DACO,SAASA,kBAAAA,CAAmBC,KAAyC,EAAA;AACxE,IAAA,qBAAOC,GAAA,CAACC,eAAAA,EAAAA;AAAiB,QAAA,GAAGF,KAAK;AAAEG,QAAAA,IAAAA,EAAMC,sBAAsBC;;AACnE;;"}
@@ -1,6 +1,18 @@
1
1
  export * from './DesignTimeAction';
2
2
  export * from './DesignTimeBundle';
3
+ export * from './DesignTimeComponentProps';
4
+ export * from './DesignTimeContext';
5
+ export * from './DesignTimePropertyDisplayProps';
6
+ export * from './DesignTimePropertyEditorProps';
7
+ export * from './DesignTimeProvider';
8
+ export * from '../navigation';
9
+ export * from './EmbeddedPackageHost';
10
+ export * from './PackageHostAssets';
3
11
  export * from './PackageHostConfiguration';
12
+ export * from './PackageHostRenderMode';
13
+ export * from './PackageHostView';
4
14
  export * from './ScenePackageBundle';
15
+ export * from './StandalonePackageHost';
16
+ export * from './WebViewPackageHost';
5
17
  export * from './ComponentsUiLibraryContract';
6
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../packages/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,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,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC"}
@@ -1,6 +1,18 @@
1
1
  export * from './DesignTimeAction';
2
2
  export * from './DesignTimeBundle';
3
+ export * from './DesignTimeComponentProps';
4
+ export * from './DesignTimeContext';
5
+ export * from './DesignTimePropertyDisplayProps';
6
+ export * from './DesignTimePropertyEditorProps';
7
+ export * from './DesignTimeProvider';
8
+ export * from '../navigation';
9
+ export * from './EmbeddedPackageHost';
10
+ export * from './PackageHostAssets';
3
11
  export * from './PackageHostConfiguration';
12
+ export * from './PackageHostRenderMode';
13
+ export * from './PackageHostView';
4
14
  export * from './ScenePackageBundle';
15
+ export * from './StandalonePackageHost';
16
+ export * from './WebViewPackageHost';
5
17
  export * from './ComponentsUiLibraryContract';
6
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,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,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type QueryPerformer = (query: string, argumentsValue: unknown, signal: AbortSignal) => Promise<unknown>;
2
+ export declare class AbortableQueryRunner {
3
+ #private;
4
+ run(query: string, argumentsValue: unknown, performer: QueryPerformer): Promise<unknown | undefined>;
5
+ clear(): void;
6
+ }
7
+ //# sourceMappingURL=AbortableQueryRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbortableQueryRunner.d.ts","sourceRoot":"","sources":["../../../renderer/AbortableQueryRunner.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAK/G,qBAAa,oBAAoB;;IAIvB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAOzG;IAED,KAAK,IAAI,IAAI,CAIZ;CACJ"}
@@ -0,0 +1,24 @@
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
+ * Runs query bindings so a newer argument set aborts and ignores older work.
5
+ */ class AbortableQueryRunner {
6
+ #controller;
7
+ #generation = 0;
8
+ async run(query, argumentsValue, performer) {
9
+ this.#controller?.abort();
10
+ const controller = new AbortController();
11
+ const generation = ++this.#generation;
12
+ this.#controller = controller;
13
+ const result = await performer(query, argumentsValue, controller.signal);
14
+ return generation === this.#generation && !controller.signal.aborted ? result : undefined;
15
+ }
16
+ clear() {
17
+ this.#controller?.abort();
18
+ this.#generation++;
19
+ this.#controller = undefined;
20
+ }
21
+ }
22
+
23
+ export { AbortableQueryRunner };
24
+ //# sourceMappingURL=AbortableQueryRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbortableQueryRunner.js","sources":["../../../renderer/AbortableQueryRunner.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\nexport type QueryPerformer = (query: string, argumentsValue: unknown, signal: AbortSignal) => Promise<unknown>;\n\n/**\n * Runs query bindings so a newer argument set aborts and ignores older work.\n */\nexport class AbortableQueryRunner {\n #controller?: AbortController;\n #generation = 0;\n\n async run(query: string, argumentsValue: unknown, performer: QueryPerformer): Promise<unknown | undefined> {\n this.#controller?.abort();\n const controller = new AbortController();\n const generation = ++this.#generation;\n this.#controller = controller;\n const result = await performer(query, argumentsValue, controller.signal);\n return generation === this.#generation && !controller.signal.aborted ? result : undefined;\n }\n\n clear(): void {\n this.#controller?.abort();\n this.#generation++;\n this.#controller = undefined;\n }\n}\n"],"names":["AbortableQueryRunner","run","query","argumentsValue","performer","abort","controller","AbortController","generation","result","signal","aborted","undefined","clear"],"mappings":"AAAA;AACA;AAIA;;AAEC,IACM,MAAMA,oBAAAA,CAAAA;AACT,IAAA,WAAW;IACX,WAAW,GAAG,CAAA;AAEd,IAAA,MAAMC,IAAIC,KAAa,EAAEC,cAAuB,EAAEC,SAAyB,EAAgC;QACvG,IAAI,CAAC,WAAW,EAAEC,KAAAA,EAAAA;AAClB,QAAA,MAAMC,aAAa,IAAIC,eAAAA,EAAAA;AACvB,QAAA,MAAMC,UAAAA,GAAa,EAAE,IAAI,CAAC,WAAW;QACrC,IAAI,CAAC,WAAW,GAAGF,UAAAA;AACnB,QAAA,MAAMG,SAAS,MAAML,SAAAA,CAAUF,KAAAA,EAAOC,cAAAA,EAAgBG,WAAWI,MAAM,CAAA;AACvE,QAAA,OAAOF,UAAAA,KAAe,IAAI,CAAC,WAAW,IAAI,CAACF,UAAAA,CAAWI,MAAM,CAACC,OAAO,GAAGF,MAAAA,GAASG,SAAAA;AACpF,IAAA;IAEAC,KAAAA,GAAc;QACV,IAAI,CAAC,WAAW,EAAER,KAAAA,EAAAA;QAClB,IAAI,CAAC,WAAW,EAAA;QAChB,IAAI,CAAC,WAAW,GAAGO,SAAAA;AACvB,IAAA;AACJ;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"InteractiveComponent.d.ts","sourceRoot":"","sources":["../../../renderer/InteractiveComponent.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,SAAS,EAA4B,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACnD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;CACtC;AASD,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,yBAAyB,+GAK5F"}
1
+ {"version":3,"file":"InteractiveComponent.d.ts","sourceRoot":"","sources":["../../../renderer/InteractiveComponent.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAqC,MAAM,OAAO,CAAC;AACpF,OAAO,EAAqB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACnD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;CACtC;AASD,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,yBAAyB,+GAU5F"}
@@ -1,8 +1,9 @@
1
- import { useEffect, createElement } from 'react';
1
+ import { useMemo, useEffect, createElement } from 'react';
2
2
  import 'react/jsx-runtime';
3
3
  import { useInteractions } from '../interactions/useInteractions.js';
4
4
  import '../interactions/NotificationHost.js';
5
5
  import { useBindingOutputs } from './BindingOutputContext.js';
6
+ import { useRenderBindingResolver } from './RenderBindingScopeContext.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.
@@ -15,16 +16,48 @@ import { useBindingOutputs } from './BindingOutputContext.js';
15
16
  */ function InteractiveComponent({ component, element, slots }) {
16
17
  const interactions = useInteractions(element.id, element.behaviors);
17
18
  const bindingOutputs = useBindingOutputs(element.id);
19
+ const resolveBinding = useRenderBindingResolver();
20
+ const resolvedElement = useMemo(()=>({
21
+ ...element,
22
+ properties: resolveProperties(element.properties, resolveBinding)
23
+ }), [
24
+ element,
25
+ resolveBinding
26
+ ]);
18
27
  useEffect(()=>()=>bindingOutputs.clearAll(), [
19
28
  element.id
20
29
  ]);
21
30
  return /*#__PURE__*/ createElement(component, {
22
- element,
31
+ element: resolvedElement,
23
32
  slots,
24
33
  interactions,
25
34
  bindingOutputs
26
35
  });
27
36
  }
37
+ function resolveProperties(properties, resolveBinding) {
38
+ return Object.fromEntries(Object.entries(properties).map(([name, value])=>[
39
+ name,
40
+ resolveValue(value, resolveBinding)
41
+ ]));
42
+ }
43
+ function resolveValue(value, resolveBinding) {
44
+ if (isBindingExpression(value)) return resolveBinding(value);
45
+ if (isDestinationReference(value)) return value;
46
+ if (Array.isArray(value)) return value.map((entry)=>resolveValue(entry, resolveBinding));
47
+ if (value !== null && typeof value === 'object') {
48
+ return Object.fromEntries(Object.entries(value).map(([name, entry])=>[
49
+ name,
50
+ resolveValue(entry, resolveBinding)
51
+ ]));
52
+ }
53
+ return value;
54
+ }
55
+ function isBindingExpression(value) {
56
+ return value !== null && typeof value === 'object' && !Array.isArray(value) && typeof value.path === 'string';
57
+ }
58
+ function isDestinationReference(value) {
59
+ return value !== null && typeof value === 'object' && !Array.isArray(value) && 'routeParameterBindings' in value;
60
+ }
28
61
 
29
62
  export { InteractiveComponent };
30
63
  //# sourceMappingURL=InteractiveComponent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InteractiveComponent.js","sources":["../../../renderer/InteractiveComponent.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 { ComponentType, ReactNode, createElement, useEffect } from 'react';\nimport { ExternalComponent } from '@cratis/scene.model';\nimport { useInteractions } from '../interactions';\nimport { useBindingOutputs } from './BindingOutputContext';\nimport { RegisteredComponentProps } from './ComponentRegistry';\n\nexport interface InteractiveComponentProps {\n component: ComponentType<RegisteredComponentProps>;\n element: ExternalComponent;\n slots: Record<string, ReactNode[]>;\n}\n\n/**\n * Resolves an element's interactions and hands them to the component that renders it.\n *\n * This exists as a component rather than as a call inside the renderer because resolving them is a hook, and a\n * hook cannot run inside the plain function a {@link Renderer} is. Keeping the renderer plain is what lets the\n * same element tree be rendered by something that is not React at all.\n */\nexport function InteractiveComponent({ component, element, slots }: InteractiveComponentProps) {\n const interactions = useInteractions(element.id, element.behaviors);\n const bindingOutputs = useBindingOutputs(element.id);\n useEffect(() => () => bindingOutputs.clearAll(), [element.id]);\n return createElement(component, { element, slots, interactions, bindingOutputs });\n}\n"],"names":["InteractiveComponent","component","element","slots","interactions","useInteractions","id","behaviors","bindingOutputs","useBindingOutputs","useEffect","clearAll","createElement"],"mappings":";;;;;;AAAA;AACA;AAcA;;;;;;IAOO,SAASA,oBAAAA,CAAqB,EAAEC,SAAS,EAAEC,OAAO,EAAEC,KAAK,EAA6B,EAAA;AACzF,IAAA,MAAMC,eAAeC,eAAAA,CAAgBH,OAAAA,CAAQI,EAAE,EAAEJ,QAAQK,SAAS,CAAA;IAClE,MAAMC,cAAAA,GAAiBC,iBAAAA,CAAkBP,OAAAA,CAAQI,EAAE,CAAA;AACnDI,IAAAA,SAAAA,CAAU,IAAM,IAAMF,cAAAA,CAAeG,QAAQ,EAAA,EAAI;AAACT,QAAAA,OAAAA,CAAQI;AAAG,KAAA,CAAA;AAC7D,IAAA,qBAAOM,cAAcX,SAAAA,EAAW;AAAEC,QAAAA,OAAAA;AAASC,QAAAA,KAAAA;AAAOC,QAAAA,YAAAA;AAAcI,QAAAA;AAAe,KAAA,CAAA;AACnF;;"}
1
+ {"version":3,"file":"InteractiveComponent.js","sources":["../../../renderer/InteractiveComponent.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 { ComponentType, ReactNode, createElement, useEffect, useMemo } from 'react';\nimport { BindingExpression, ExternalComponent } from '@cratis/scene.model';\nimport { useInteractions } from '../interactions';\nimport { useBindingOutputs } from './BindingOutputContext';\nimport { RegisteredComponentProps } from './ComponentRegistry';\nimport { useRenderBindingResolver } from './RenderBindingScopeContext';\n\nexport interface InteractiveComponentProps {\n component: ComponentType<RegisteredComponentProps>;\n element: ExternalComponent;\n slots: Record<string, ReactNode[]>;\n}\n\n/**\n * Resolves an element's interactions and hands them to the component that renders it.\n *\n * This exists as a component rather than as a call inside the renderer because resolving them is a hook, and a\n * hook cannot run inside the plain function a {@link Renderer} is. Keeping the renderer plain is what lets the\n * same element tree be rendered by something that is not React at all.\n */\nexport function InteractiveComponent({ component, element, slots }: InteractiveComponentProps) {\n const interactions = useInteractions(element.id, element.behaviors);\n const bindingOutputs = useBindingOutputs(element.id);\n const resolveBinding = useRenderBindingResolver();\n const resolvedElement = useMemo(() => ({\n ...element,\n properties: resolveProperties(element.properties, resolveBinding),\n }), [element, resolveBinding]);\n useEffect(() => () => bindingOutputs.clearAll(), [element.id]);\n return createElement(component, { element: resolvedElement, slots, interactions, bindingOutputs });\n}\n\nfunction resolveProperties(properties: Record<string, unknown>, resolveBinding: (binding: BindingExpression) => unknown): Record<string, unknown> {\n return Object.fromEntries(Object.entries(properties).map(([name, value]) => [name, resolveValue(value, resolveBinding)]));\n}\n\nfunction resolveValue(value: unknown, resolveBinding: (binding: BindingExpression) => unknown): unknown {\n if (isBindingExpression(value)) return resolveBinding(value);\n if (isDestinationReference(value)) return value;\n if (Array.isArray(value)) return value.map(entry => resolveValue(entry, resolveBinding));\n if (value !== null && typeof value === 'object') {\n return Object.fromEntries(Object.entries(value as Record<string, unknown>).map(([name, entry]) => [name, resolveValue(entry, resolveBinding)]));\n }\n\n return value;\n}\n\nfunction isBindingExpression(value: unknown): value is BindingExpression {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && typeof (value as Record<string, unknown>).path === 'string';\n}\n\nfunction isDestinationReference(value: unknown): boolean {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && 'routeParameterBindings' in value;\n}\n"],"names":["InteractiveComponent","component","element","slots","interactions","useInteractions","id","behaviors","bindingOutputs","useBindingOutputs","resolveBinding","useRenderBindingResolver","resolvedElement","useMemo","properties","resolveProperties","useEffect","clearAll","createElement","Object","fromEntries","entries","map","name","value","resolveValue","isBindingExpression","isDestinationReference","Array","isArray","entry","path"],"mappings":";;;;;;;AAAA;AACA;AAeA;;;;;;IAOO,SAASA,oBAAAA,CAAqB,EAAEC,SAAS,EAAEC,OAAO,EAAEC,KAAK,EAA6B,EAAA;AACzF,IAAA,MAAMC,eAAeC,eAAAA,CAAgBH,OAAAA,CAAQI,EAAE,EAAEJ,QAAQK,SAAS,CAAA;IAClE,MAAMC,cAAAA,GAAiBC,iBAAAA,CAAkBP,OAAAA,CAAQI,EAAE,CAAA;AACnD,IAAA,MAAMI,cAAAA,GAAiBC,wBAAAA,EAAAA;IACvB,MAAMC,eAAAA,GAAkBC,OAAAA,CAAQ,KAAO;AACnC,YAAA,GAAGX,OAAO;YACVY,UAAAA,EAAYC,iBAAAA,CAAkBb,OAAAA,CAAQY,UAAU,EAAEJ,cAAAA;AACtD,SAAA,CAAA,EAAI;AAACR,QAAAA,OAAAA;AAASQ,QAAAA;AAAe,KAAA,CAAA;AAC7BM,IAAAA,SAAAA,CAAU,IAAM,IAAMR,cAAAA,CAAeS,QAAQ,EAAA,EAAI;AAACf,QAAAA,OAAAA,CAAQI;AAAG,KAAA,CAAA;AAC7D,IAAA,qBAAOY,cAAcjB,SAAAA,EAAW;QAAEC,OAAAA,EAASU,eAAAA;AAAiBT,QAAAA,KAAAA;AAAOC,QAAAA,YAAAA;AAAcI,QAAAA;AAAe,KAAA,CAAA;AACpG;AAEA,SAASO,iBAAAA,CAAkBD,UAAmC,EAAEJ,cAAuD,EAAA;AACnH,IAAA,OAAOS,MAAAA,CAAOC,WAAW,CAACD,MAAAA,CAAOE,OAAO,CAACP,UAAAA,CAAAA,CAAYQ,GAAG,CAAC,CAAC,CAACC,IAAAA,EAAMC,MAAM,GAAK;AAACD,YAAAA,IAAAA;AAAME,YAAAA,YAAAA,CAAaD,KAAAA,EAAOd,cAAAA;AAAgB,SAAA,CAAA,CAAA;AAC3H;AAEA,SAASe,YAAAA,CAAaD,KAAc,EAAEd,cAAuD,EAAA;IACzF,IAAIgB,mBAAAA,CAAoBF,KAAAA,CAAAA,EAAQ,OAAOd,cAAAA,CAAec,KAAAA,CAAAA;IACtD,IAAIG,sBAAAA,CAAuBH,QAAQ,OAAOA,KAAAA;IAC1C,IAAII,KAAAA,CAAMC,OAAO,CAACL,KAAAA,CAAAA,EAAQ,OAAOA,KAAAA,CAAMF,GAAG,CAACQ,CAAAA,KAAAA,GAASL,YAAAA,CAAaK,KAAAA,EAAOpB,cAAAA,CAAAA,CAAAA;AACxE,IAAA,IAAIc,KAAAA,KAAU,IAAA,IAAQ,OAAOA,KAAAA,KAAU,QAAA,EAAU;AAC7C,QAAA,OAAOL,MAAAA,CAAOC,WAAW,CAACD,MAAAA,CAAOE,OAAO,CAACG,KAAAA,CAAAA,CAAkCF,GAAG,CAAC,CAAC,CAACC,IAAAA,EAAMO,MAAM,GAAK;AAACP,gBAAAA,IAAAA;AAAME,gBAAAA,YAAAA,CAAaK,KAAAA,EAAOpB,cAAAA;AAAgB,aAAA,CAAA,CAAA;AACjJ,IAAA;IAEA,OAAOc,KAAAA;AACX;AAEA,SAASE,oBAAoBF,KAAc,EAAA;AACvC,IAAA,OAAOA,KAAAA,KAAU,IAAA,IAAQ,OAAOA,KAAAA,KAAU,YAAY,CAACI,KAAAA,CAAMC,OAAO,CAACL,KAAAA,CAAAA,IAAU,OAAO,KAACA,CAAkCO,IAAI,KAAK,QAAA;AACtI;AAEA,SAASJ,uBAAuBH,KAAc,EAAA;IAC1C,OAAOA,KAAAA,KAAU,IAAA,IAAQ,OAAOA,KAAAA,KAAU,QAAA,IAAY,CAACI,KAAAA,CAAMC,OAAO,CAACL,KAAAA,CAAAA,IAAU,wBAAA,IAA4BA,KAAAA;AAC/G;;"}
@@ -0,0 +1,14 @@
1
+ import { ReactNode } from 'react';
2
+ import { BindingResolver, BindingScope } from '@cratis/scene.engine';
3
+ export interface RenderBindingScopeProviderProps {
4
+ children: ReactNode;
5
+ dataContext?: unknown;
6
+ queryResults?: Record<string, unknown>;
7
+ componentOutputs?: Record<string, Record<string, unknown>>;
8
+ resolveBinding?: BindingResolver;
9
+ onComponentOutputsChanged?: (outputs: Record<string, Record<string, unknown>>) => void;
10
+ }
11
+ export declare function RenderBindingScopeProvider(props: RenderBindingScopeProviderProps): import("react").JSX.Element;
12
+ export declare function useRenderBindingResolver(): BindingResolver;
13
+ export declare function useRenderBindingScope(): BindingScope;
14
+ //# sourceMappingURL=RenderBindingScopeContext.d.ts.map
@@ -0,0 +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,EAA4B,MAAM,sBAAsB,CAAC;AAW/F,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;AAKD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,+BAA+B,+BAShF;AA4BD,wBAAgB,wBAAwB,IAAI,eAAe,CAI1D;AAED,wBAAgB,qBAAqB,IAAI,YAAY,CAEpD"}