@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
@@ -1,11 +1,12 @@
1
1
  // Copyright (c) Cratis. All rights reserved.
2
2
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
3
 
4
- import { ComponentType, ReactNode, createElement, useEffect } from 'react';
5
- import { ExternalComponent } from '@cratis/scene.model';
4
+ import { ComponentType, ReactNode, createElement, useEffect, useMemo } from 'react';
5
+ import { BindingExpression, ExternalComponent } from '@cratis/scene.model';
6
6
  import { useInteractions } from '../interactions';
7
7
  import { useBindingOutputs } from './BindingOutputContext';
8
8
  import { RegisteredComponentProps } from './ComponentRegistry';
9
+ import { useRenderBindingResolver } from './RenderBindingScopeContext';
9
10
 
10
11
  export interface InteractiveComponentProps {
11
12
  component: ComponentType<RegisteredComponentProps>;
@@ -23,6 +24,34 @@ export interface InteractiveComponentProps {
23
24
  export function InteractiveComponent({ component, element, slots }: InteractiveComponentProps) {
24
25
  const interactions = useInteractions(element.id, element.behaviors);
25
26
  const bindingOutputs = useBindingOutputs(element.id);
27
+ const resolveBinding = useRenderBindingResolver();
28
+ const resolvedElement = useMemo(() => ({
29
+ ...element,
30
+ properties: resolveProperties(element.properties, resolveBinding),
31
+ }), [element, resolveBinding]);
26
32
  useEffect(() => () => bindingOutputs.clearAll(), [element.id]);
27
- return createElement(component, { element, slots, interactions, bindingOutputs });
33
+ return createElement(component, { element: resolvedElement, slots, interactions, bindingOutputs });
34
+ }
35
+
36
+ function resolveProperties(properties: Record<string, unknown>, resolveBinding: (binding: BindingExpression) => unknown): Record<string, unknown> {
37
+ return Object.fromEntries(Object.entries(properties).map(([name, value]) => [name, resolveValue(value, resolveBinding)]));
38
+ }
39
+
40
+ function resolveValue(value: unknown, resolveBinding: (binding: BindingExpression) => unknown): unknown {
41
+ if (isBindingExpression(value)) return resolveBinding(value);
42
+ if (isDestinationReference(value)) return value;
43
+ if (Array.isArray(value)) return value.map(entry => resolveValue(entry, resolveBinding));
44
+ if (value !== null && typeof value === 'object') {
45
+ return Object.fromEntries(Object.entries(value as Record<string, unknown>).map(([name, entry]) => [name, resolveValue(entry, resolveBinding)]));
46
+ }
47
+
48
+ return value;
49
+ }
50
+
51
+ function isBindingExpression(value: unknown): value is BindingExpression {
52
+ return value !== null && typeof value === 'object' && !Array.isArray(value) && typeof (value as Record<string, unknown>).path === 'string';
53
+ }
54
+
55
+ function isDestinationReference(value: unknown): boolean {
56
+ return value !== null && typeof value === 'object' && !Array.isArray(value) && 'routeParameterBindings' in value;
28
57
  }
@@ -0,0 +1,73 @@
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
+ import { ReactNode, createContext, useCallback, useContext, useMemo, useRef } from 'react';
5
+ import { BindingResolver, BindingScope, resolveBindingExpression } from '@cratis/scene.engine';
6
+ import { BindingExpression, BindingNullBehavior } from '@cratis/scene.model';
7
+ import { BindingOutputProvider, useBindingOutputScope } from './BindingOutputContext';
8
+
9
+ interface RenderBindingScopeValue {
10
+ resolveBinding: BindingResolver;
11
+ scope: BindingScope;
12
+ }
13
+
14
+ const Context = createContext<RenderBindingScopeValue | undefined>(undefined);
15
+
16
+ export interface RenderBindingScopeProviderProps {
17
+ children: ReactNode;
18
+ dataContext?: unknown;
19
+ queryResults?: Record<string, unknown>;
20
+ componentOutputs?: Record<string, Record<string, unknown>>;
21
+ resolveBinding?: BindingResolver;
22
+ onComponentOutputsChanged?: (outputs: Record<string, Record<string, unknown>>) => void;
23
+ }
24
+
25
+ /**
26
+ * Provides the inherited reactive binding scope for a rendered Scene tree.
27
+ */
28
+ export function RenderBindingScopeProvider(props: RenderBindingScopeProviderProps) {
29
+ const current = useContext(Context);
30
+ if (current) return <>{props.children}</>;
31
+
32
+ return (
33
+ <BindingOutputProvider onOutputsChanged={props.onComponentOutputsChanged}>
34
+ <RenderBindingScopeInner {...props} />
35
+ </BindingOutputProvider>
36
+ );
37
+ }
38
+
39
+ function RenderBindingScopeInner({ children, dataContext, queryResults, componentOutputs, resolveBinding }: RenderBindingScopeProviderProps) {
40
+ const outputs = useBindingOutputScope();
41
+ const previousValues = useRef(new Map<string, unknown>());
42
+ const scope = useMemo<BindingScope>(() => ({
43
+ dataContext,
44
+ queryResults,
45
+ componentOutputs: { ...(componentOutputs ?? {}), ...outputs },
46
+ }), [componentOutputs, dataContext, outputs, queryResults]);
47
+
48
+ const resolver = useCallback<BindingResolver>((binding: BindingExpression) => {
49
+ if (!binding.kind && resolveBinding) return resolveBinding(binding);
50
+
51
+ const key = JSON.stringify(binding);
52
+ const value = resolveBindingExpression(binding, scope);
53
+ if (binding.nullBehavior === BindingNullBehavior.Preserve && value === undefined) {
54
+ return previousValues.current.get(key);
55
+ }
56
+
57
+ if (value !== undefined) previousValues.current.set(key, value);
58
+ return value;
59
+ }, [resolveBinding, scope]);
60
+
61
+ const value = useMemo<RenderBindingScopeValue>(() => ({ resolveBinding: resolver, scope }), [resolver, scope]);
62
+ return <Context.Provider value={value}>{children}</Context.Provider>;
63
+ }
64
+
65
+ export function useRenderBindingResolver(): BindingResolver {
66
+ const context = useContext(Context);
67
+ if (!context) throw new Error('No Scene render binding scope is available.');
68
+ return context.resolveBinding;
69
+ }
70
+
71
+ export function useRenderBindingScope(): BindingScope {
72
+ return useContext(Context)?.scope ?? {};
73
+ }
package/renderer/index.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  // Copyright (c) Cratis. All rights reserved.
2
2
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
3
 
4
+ export * from './AbortableQueryRunner';
4
5
  export * from './BindingOutputContext';
5
6
  export * from './ComponentRegistry';
7
+ export * from './RenderBindingScopeContext';
6
8
  export * from './UnresolvedComponent';
7
9
  export * from './createReactRenderer';
8
10
  export * from './InteractiveComponent';