@ankhorage/runtime 0.1.0 → 0.2.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/CHANGELOG.md +16 -0
- package/README.md +20 -5
- package/dist/ManifestContext.d.ts +16 -0
- package/dist/ManifestContext.d.ts.map +1 -0
- package/dist/ManifestContext.js +26 -0
- package/dist/ManifestContext.js.map +1 -0
- package/dist/RuntimeRenderer.d.ts +24 -0
- package/dist/RuntimeRenderer.d.ts.map +1 -0
- package/dist/RuntimeRenderer.js +302 -0
- package/dist/RuntimeRenderer.js.map +1 -0
- package/dist/RuntimeRendererConfig.d.ts +54 -0
- package/dist/RuntimeRendererConfig.d.ts.map +1 -0
- package/dist/RuntimeRendererConfig.js +70 -0
- package/dist/RuntimeRendererConfig.js.map +1 -0
- package/dist/RuntimeScreen.d.ts +11 -0
- package/dist/RuntimeScreen.d.ts.map +1 -0
- package/dist/RuntimeScreen.js +59 -0
- package/dist/RuntimeScreen.js.map +1 -0
- package/dist/appExtensionRegistry.d.ts +3 -0
- package/dist/appExtensionRegistry.d.ts.map +1 -0
- package/dist/appExtensionRegistry.js +2 -0
- package/dist/appExtensionRegistry.js.map +1 -0
- package/dist/componentRegistry.d.ts +4 -0
- package/dist/componentRegistry.d.ts.map +1 -0
- package/dist/componentRegistry.js +6 -0
- package/dist/componentRegistry.js.map +1 -0
- package/dist/index.d.ts +27 -52
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -30
- package/dist/index.js.map +1 -1
- package/dist/readme-usage.js +4 -4
- package/dist/readme-usage.js.map +1 -1
- package/dist/registry.d.ts +7 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +49 -0
- package/dist/registry.js.map +1 -0
- package/dist/rendering.d.ts +17 -0
- package/dist/rendering.d.ts.map +1 -0
- package/dist/rendering.js +24 -0
- package/dist/rendering.js.map +1 -0
- package/dist/runtimeActionRegistry.d.ts +55 -0
- package/dist/runtimeActionRegistry.d.ts.map +1 -0
- package/dist/runtimeActionRegistry.js +323 -0
- package/dist/runtimeActionRegistry.js.map +1 -0
- package/dist/runtimeApiLoaders.d.ts +35 -0
- package/dist/runtimeApiLoaders.d.ts.map +1 -0
- package/dist/runtimeApiLoaders.js +218 -0
- package/dist/runtimeApiLoaders.js.map +1 -0
- package/dist/runtimeBindings.d.ts +52 -0
- package/dist/runtimeBindings.d.ts.map +1 -0
- package/dist/runtimeBindings.js +299 -0
- package/dist/runtimeBindings.js.map +1 -0
- package/dist/runtimeDataSourceOperations.d.ts +8 -0
- package/dist/runtimeDataSourceOperations.d.ts.map +1 -0
- package/dist/runtimeDataSourceOperations.js +58 -0
- package/dist/runtimeDataSourceOperations.js.map +1 -0
- package/dist/runtimeDbPersist.d.ts +34 -0
- package/dist/runtimeDbPersist.d.ts.map +1 -0
- package/dist/runtimeDbPersist.js +73 -0
- package/dist/runtimeDbPersist.js.map +1 -0
- package/dist/runtimeEventExecution.d.ts +11 -0
- package/dist/runtimeEventExecution.d.ts.map +1 -0
- package/dist/runtimeEventExecution.js +17 -0
- package/dist/runtimeEventExecution.js.map +1 -0
- package/dist/runtimeManifest.d.ts +53 -0
- package/dist/runtimeManifest.d.ts.map +1 -0
- package/dist/runtimeManifest.js +31 -0
- package/dist/runtimeManifest.js.map +1 -0
- package/dist/runtimeNodeProps.d.ts +22 -0
- package/dist/runtimeNodeProps.d.ts.map +1 -0
- package/dist/runtimeNodeProps.js +130 -0
- package/dist/runtimeNodeProps.js.map +1 -0
- package/dist/runtimeRepeat.d.ts +27 -0
- package/dist/runtimeRepeat.d.ts.map +1 -0
- package/dist/runtimeRepeat.js +129 -0
- package/dist/runtimeRepeat.js.map +1 -0
- package/dist/runtimeRepeatDiagnostics.d.ts +3 -0
- package/dist/runtimeRepeatDiagnostics.d.ts.map +1 -0
- package/dist/runtimeRepeatDiagnostics.js +14 -0
- package/dist/runtimeRepeatDiagnostics.js.map +1 -0
- package/dist/runtimeRepeatEmptyState.d.ts +7 -0
- package/dist/runtimeRepeatEmptyState.d.ts.map +1 -0
- package/dist/runtimeRepeatEmptyState.js +10 -0
- package/dist/runtimeRepeatEmptyState.js.map +1 -0
- package/dist/runtimeScreenLoaders.d.ts +71 -0
- package/dist/runtimeScreenLoaders.d.ts.map +1 -0
- package/dist/runtimeScreenLoaders.js +309 -0
- package/dist/runtimeScreenLoaders.js.map +1 -0
- package/dist/runtimeStateAdapter.d.ts +6 -0
- package/dist/runtimeStateAdapter.d.ts.map +1 -0
- package/dist/runtimeStateAdapter.js +162 -0
- package/dist/runtimeStateAdapter.js.map +1 -0
- package/package.json +19 -2
- package/paradox/badges/npm.svg +3 -3
- package/paradox/components.md +72 -0
- package/paradox/diagrams/architecture-overview.mmd +135 -1
- package/paradox/diagrams/export-graph.mmd +303 -18
- package/paradox/diagrams/module-relationships.mmd +98 -1
- package/paradox/diagrams/sequences/create-component-event-from-handler-args.mmd +24 -0
- package/paradox/diagrams/sequences/execute-db-persist-action.mmd +16 -0
- package/paradox/diagrams/sequences/merge-runtime-renderer-config.mmd +11 -0
- package/paradox/diagrams/sequences/resolve-db-persist-input.mmd +13 -0
- package/paradox/diagrams/sequences/resolve-runtime-action-payload.mmd +8 -0
- package/paradox/diagrams/sequences/resolve-runtime-action-value.mmd +5 -0
- package/paradox/diagrams/sequences/runtime-renderer-config-provider.mmd +17 -0
- package/paradox/diagrams/sequences/runtime-screen.mmd +17 -0
- package/paradox/diagrams/sequences/use-manifest-context.mmd +5 -0
- package/paradox/diagrams/sequences/use-manifest.mmd +5 -0
- package/paradox/diagrams/sequences/use-optional-manifest-context.mmd +5 -0
- package/paradox/diagrams/sequences/use-runtime-renderer-config.mmd +5 -0
- package/paradox/diagrams/sequences/use-runtime-screen-operation-loaders.mmd +5 -0
- package/paradox/diagrams/sequences/validate-runtime-binding-operation-ref.mmd +8 -0
- package/paradox/diagrams/sequences/wrap-runtime-event-props.mmd +5 -0
- package/paradox/exports.json +3385 -330
- package/paradox/exports.md +1051 -38
- package/paradox/index.html +8244 -413
- package/paradox/paradox.json +10013 -511
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @ankhorage/runtime
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ae57bd5: Expand `@ankhorage/runtime` from bootstrap contracts into the extracted generic
|
|
8
|
+
runtime package. The package now owns the shared renderer, bindings, action
|
|
9
|
+
registry, screen loaders, and state-adapter helpers while keeping framework
|
|
10
|
+
integration injected through `executeAction` instead of importing `expo-router`
|
|
11
|
+
or Zora hooks directly.
|
|
12
|
+
|
|
13
|
+
## 0.1.1
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 0813996: Trigger release
|
|
18
|
+
|
|
3
19
|
## 0.1.0
|
|
4
20
|
|
|
5
21
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
|
|
4
4
|
# @ankhorage/runtime
|
|
5
5
|
|
|
6
|
-
         
|
|
7
7
|
|
|
8
8
|
Platform-neutral runtime contracts and helpers for Ankhorage generated apps.
|
|
9
9
|
|
|
10
10
|
## Usage
|
|
11
11
|
|
|
12
|
-
###
|
|
12
|
+
### Framework-neutral runtime boundary
|
|
13
13
|
|
|
14
|
-
`@ankhorage/runtime` owns platform-neutral runtime contracts for generated apps.
|
|
14
|
+
`@ankhorage/runtime` owns platform-neutral runtime renderer contracts for generated apps.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
Host apps keep router, theme, and other framework-specific behavior outside this package and
|
|
17
|
+
inject it at the runtime boundary.
|
|
18
18
|
|
|
19
19
|
Source: `src/readme-usage.ts`
|
|
20
20
|
|
|
@@ -36,3 +36,18 @@ createRuntimeManifest({
|
|
|
36
36
|
- [Architecture overview](./paradox/diagrams/architecture-overview.mmd)
|
|
37
37
|
- [Module relationships](./paradox/diagrams/module-relationships.mmd)
|
|
38
38
|
- [Export graph](./paradox/diagrams/export-graph.mmd)
|
|
39
|
+
- [createComponentEventFromHandlerArgs sequence](./paradox/diagrams/sequences/create-component-event-from-handler-args.mmd)
|
|
40
|
+
- [executeDbPersistAction sequence](./paradox/diagrams/sequences/execute-db-persist-action.mmd)
|
|
41
|
+
- [mergeRuntimeRendererConfig sequence](./paradox/diagrams/sequences/merge-runtime-renderer-config.mmd)
|
|
42
|
+
- [resolveDbPersistInput sequence](./paradox/diagrams/sequences/resolve-db-persist-input.mmd)
|
|
43
|
+
- [resolveRuntimeActionPayload sequence](./paradox/diagrams/sequences/resolve-runtime-action-payload.mmd)
|
|
44
|
+
- [resolveRuntimeActionValue sequence](./paradox/diagrams/sequences/resolve-runtime-action-value.mmd)
|
|
45
|
+
- [RuntimeRendererConfigProvider sequence](./paradox/diagrams/sequences/runtime-renderer-config-provider.mmd)
|
|
46
|
+
- [RuntimeScreen sequence](./paradox/diagrams/sequences/runtime-screen.mmd)
|
|
47
|
+
- [useManifest sequence](./paradox/diagrams/sequences/use-manifest.mmd)
|
|
48
|
+
- [useManifestContext sequence](./paradox/diagrams/sequences/use-manifest-context.mmd)
|
|
49
|
+
- [useOptionalManifestContext sequence](./paradox/diagrams/sequences/use-optional-manifest-context.mmd)
|
|
50
|
+
- [useRuntimeRendererConfig sequence](./paradox/diagrams/sequences/use-runtime-renderer-config.mmd)
|
|
51
|
+
- [useRuntimeScreenOperationLoaders sequence](./paradox/diagrams/sequences/use-runtime-screen-operation-loaders.mmd)
|
|
52
|
+
- [validateRuntimeBindingOperationRef sequence](./paradox/diagrams/sequences/validate-runtime-binding-operation-ref.mmd)
|
|
53
|
+
- [wrapRuntimeEventProps sequence](./paradox/diagrams/sequences/wrap-runtime-event-props.mmd)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AppManifest } from '@ankhorage/contracts';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
interface ManifestContextValue {
|
|
4
|
+
manifest: AppManifest;
|
|
5
|
+
activeScreenId?: string;
|
|
6
|
+
onScreenChange?: (screenId: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const ManifestContext: React.Context<ManifestContextValue | null>;
|
|
9
|
+
export declare function ManifestProvider(props: ManifestContextValue & {
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
}): React.JSX.Element;
|
|
12
|
+
export declare function useManifest(): AppManifest;
|
|
13
|
+
export declare function useManifestContext(): ManifestContextValue;
|
|
14
|
+
export declare function useOptionalManifestContext(): ManifestContextValue | null;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=ManifestContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManifestContext.d.ts","sourceRoot":"","sources":["../src/ManifestContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAoC,MAAM,OAAO,CAAC;AAEzD,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,WAAW,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,eAAe,4CAAmD,CAAC;AAEhF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAQ3F;AAED,wBAAgB,WAAW,gBAM1B;AAED,wBAAgB,kBAAkB,yBAMjC;AAED,wBAAgB,0BAA0B,gCAEzC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React, { createContext, useContext } from 'react';
|
|
2
|
+
export const ManifestContext = createContext(null);
|
|
3
|
+
export function ManifestProvider(props) {
|
|
4
|
+
const { manifest, activeScreenId, onScreenChange, children } = props;
|
|
5
|
+
return (<ManifestContext.Provider value={{ manifest, activeScreenId, onScreenChange }}>
|
|
6
|
+
{children}
|
|
7
|
+
</ManifestContext.Provider>);
|
|
8
|
+
}
|
|
9
|
+
export function useManifest() {
|
|
10
|
+
const context = useContext(ManifestContext);
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error('useManifest must be used within a ManifestProvider');
|
|
13
|
+
}
|
|
14
|
+
return context.manifest;
|
|
15
|
+
}
|
|
16
|
+
export function useManifestContext() {
|
|
17
|
+
const context = useContext(ManifestContext);
|
|
18
|
+
if (!context) {
|
|
19
|
+
throw new Error('useManifestContext must be used within a ManifestProvider');
|
|
20
|
+
}
|
|
21
|
+
return context;
|
|
22
|
+
}
|
|
23
|
+
export function useOptionalManifestContext() {
|
|
24
|
+
return useContext(ManifestContext);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ManifestContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManifestContext.js","sourceRoot":"","sources":["../src/ManifestContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAQzD,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAA8B,IAAI,CAAC,CAAC;AAEhF,MAAM,UAAU,gBAAgB,CAAC,KAA2D;IAC1F,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAErE,OAAO,CACL,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAC5E;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,eAAe,CAAC,QAAQ,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import type { AppManifest } from '@ankhorage/contracts';\nimport React, { createContext, useContext } from 'react';\n\ninterface ManifestContextValue {\n manifest: AppManifest;\n activeScreenId?: string;\n onScreenChange?: (screenId: string) => void;\n}\n\nexport const ManifestContext = createContext<ManifestContextValue | null>(null);\n\nexport function ManifestProvider(props: ManifestContextValue & { children: React.ReactNode }) {\n const { manifest, activeScreenId, onScreenChange, children } = props;\n\n return (\n <ManifestContext.Provider value={{ manifest, activeScreenId, onScreenChange }}>\n {children}\n </ManifestContext.Provider>\n );\n}\n\nexport function useManifest() {\n const context = useContext(ManifestContext);\n if (!context) {\n throw new Error('useManifest must be used within a ManifestProvider');\n }\n return context.manifest;\n}\n\nexport function useManifestContext() {\n const context = useContext(ManifestContext);\n if (!context) {\n throw new Error('useManifestContext must be used within a ManifestProvider');\n }\n return context;\n}\n\nexport function useOptionalManifestContext() {\n return useContext(ManifestContext);\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ComponentDataBindingRegistry, DataSourceDiagnostic, DataSourceRegistry, DbAdapter, DbRealtimeAdapter, StateAdapter, UiNode } from '@ankhorage/contracts';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { ComponentRegistry } from './registry';
|
|
4
|
+
import type { RuntimeBindingOperationExecutor, RuntimeBindingOperationResultCache } from './runtimeBindings';
|
|
5
|
+
import { type RuntimeActionExecutor, type RuntimeRendererWrapArgs } from './RuntimeRendererConfig';
|
|
6
|
+
export interface RuntimeRendererProps {
|
|
7
|
+
node: UiNode;
|
|
8
|
+
isRoot?: boolean;
|
|
9
|
+
registry?: ComponentRegistry;
|
|
10
|
+
disableActions?: boolean;
|
|
11
|
+
wrapNode?: (args: RuntimeRendererWrapArgs) => React.ReactNode;
|
|
12
|
+
dbAdapter?: DbAdapter;
|
|
13
|
+
dbRealtimeAdapter?: DbRealtimeAdapter;
|
|
14
|
+
stateAdapter?: StateAdapter;
|
|
15
|
+
bindingContext?: Record<string, unknown>;
|
|
16
|
+
dataSources?: DataSourceRegistry;
|
|
17
|
+
dataBindings?: ComponentDataBindingRegistry;
|
|
18
|
+
operationResults?: RuntimeBindingOperationResultCache;
|
|
19
|
+
executeAction?: RuntimeActionExecutor;
|
|
20
|
+
executeOperation?: RuntimeBindingOperationExecutor;
|
|
21
|
+
onDiagnostics?: (diagnostics: readonly DataSourceDiagnostic[]) => void;
|
|
22
|
+
}
|
|
23
|
+
export declare function RuntimeRenderer(props: RuntimeRendererProps): React.JSX.Element;
|
|
24
|
+
//# sourceMappingURL=RuntimeRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeRenderer.d.ts","sourceRoot":"","sources":["../src/RuntimeRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,4BAA4B,EAC5B,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,MAAM,EACP,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAWpD,OAAO,KAAK,EACV,+BAA+B,EAE/B,kCAAkC,EACnC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,uBAAuB,EAE7B,MAAM,yBAAyB,CAAC;AAajC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,uBAAuB,KAAK,KAAK,CAAC,SAAS,CAAC;IAC9D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,YAAY,CAAC,EAAE,4BAA4B,CAAC;IAC5C,gBAAgB,CAAC,EAAE,kCAAkC,CAAC;IACtD,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,gBAAgB,CAAC,EAAE,+BAA+B,CAAC;IACnD,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,KAAK,IAAI,CAAC;CACxE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,qBA+V1D"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { StyleSheet, Text, View } from 'react-native';
|
|
3
|
+
import { ZORA_COMPONENT_REGISTRY } from './registry';
|
|
4
|
+
import { getUnknownComponentDiagnostic, resolveRenderedChildren, resolveRuntimeRegistry, } from './rendering';
|
|
5
|
+
import { wrapRuntimeEventProps, } from './runtimeActionRegistry';
|
|
6
|
+
import { resolveRuntimeNodeProps, wrapRuntimeActionProps } from './runtimeNodeProps';
|
|
7
|
+
import { mergeRuntimeRendererConfig, RuntimeRendererConfigProvider, useRuntimeRendererConfig, } from './RuntimeRendererConfig';
|
|
8
|
+
import { dispatchRuntimeComponentEventWithReporting } from './runtimeEventExecution';
|
|
9
|
+
import { createRuntimeRepeatBindingContext, resolveRuntimeRepeatItemKey, resolveRuntimeRepeatItemsAsync, resolveRuntimeRepeatItemsSync, } from './runtimeRepeat';
|
|
10
|
+
import { createRepeatDiagnosticsKey } from './runtimeRepeatDiagnostics';
|
|
11
|
+
import { shouldRenderRuntimeRepeatEmptyState } from './runtimeRepeatEmptyState';
|
|
12
|
+
import { createDbPersistActionHandler } from './runtimeDbPersist';
|
|
13
|
+
export function RuntimeRenderer(props) {
|
|
14
|
+
const { node, isRoot = false, registry, disableActions = false, wrapNode, dbAdapter, dbRealtimeAdapter, stateAdapter, bindingContext, dataSources, dataBindings, operationResults, executeAction, executeOperation, onDiagnostics, } = props;
|
|
15
|
+
const inheritedConfig = useRuntimeRendererConfig();
|
|
16
|
+
const inheritedOperationResults = inheritedConfig.operationResults;
|
|
17
|
+
const [localOperationResults, setLocalOperationResults] = React.useState({});
|
|
18
|
+
const writeLocalOperationResult = React.useCallback((key, value) => {
|
|
19
|
+
setLocalOperationResults((currentResults) => ({
|
|
20
|
+
...currentResults,
|
|
21
|
+
[key]: value,
|
|
22
|
+
}));
|
|
23
|
+
}, []);
|
|
24
|
+
const actionHandlerCacheRef = React.useRef(new WeakMap());
|
|
25
|
+
const functionHandlerCacheRef = React.useRef(new WeakMap());
|
|
26
|
+
const effectiveOperationResults = React.useMemo(() => ({
|
|
27
|
+
...(inheritedOperationResults ?? {}),
|
|
28
|
+
...(operationResults ?? {}),
|
|
29
|
+
...localOperationResults,
|
|
30
|
+
}), [inheritedOperationResults, localOperationResults, operationResults]);
|
|
31
|
+
const explicitConfig = React.useMemo(() => ({
|
|
32
|
+
bindingContext,
|
|
33
|
+
dataBindings,
|
|
34
|
+
dataSources,
|
|
35
|
+
dbAdapter,
|
|
36
|
+
dbRealtimeAdapter,
|
|
37
|
+
disableActions,
|
|
38
|
+
executeAction,
|
|
39
|
+
executeOperation,
|
|
40
|
+
operationResults: effectiveOperationResults,
|
|
41
|
+
onDiagnostics,
|
|
42
|
+
registry,
|
|
43
|
+
stateAdapter,
|
|
44
|
+
wrapNode,
|
|
45
|
+
writeOperationResult: inheritedConfig.writeOperationResult ?? writeLocalOperationResult,
|
|
46
|
+
}), [
|
|
47
|
+
bindingContext,
|
|
48
|
+
dataBindings,
|
|
49
|
+
dataSources,
|
|
50
|
+
dbAdapter,
|
|
51
|
+
dbRealtimeAdapter,
|
|
52
|
+
disableActions,
|
|
53
|
+
executeAction,
|
|
54
|
+
effectiveOperationResults,
|
|
55
|
+
executeOperation,
|
|
56
|
+
inheritedConfig.writeOperationResult,
|
|
57
|
+
onDiagnostics,
|
|
58
|
+
registry,
|
|
59
|
+
stateAdapter,
|
|
60
|
+
wrapNode,
|
|
61
|
+
writeLocalOperationResult,
|
|
62
|
+
]);
|
|
63
|
+
const effectiveConfig = React.useMemo(() => mergeRuntimeRendererConfig(explicitConfig, inheritedConfig), [explicitConfig, inheritedConfig]);
|
|
64
|
+
const effectiveActionHandlers = React.useMemo(() => {
|
|
65
|
+
if (!effectiveConfig.dbAdapter) {
|
|
66
|
+
return effectiveConfig.actionHandlers;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
'db.persist': createDbPersistActionHandler({ dbAdapter: effectiveConfig.dbAdapter }),
|
|
70
|
+
...(effectiveConfig.actionHandlers ?? {}),
|
|
71
|
+
};
|
|
72
|
+
}, [effectiveConfig.actionHandlers, effectiveConfig.dbAdapter]);
|
|
73
|
+
const executeRuntimeAction = React.useCallback(async (actionArgs) => {
|
|
74
|
+
if (effectiveConfig.executeAction) {
|
|
75
|
+
await effectiveConfig.executeAction(actionArgs);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const handler = effectiveActionHandlers?.[actionArgs.action.type];
|
|
79
|
+
if (handler) {
|
|
80
|
+
await handler(actionArgs);
|
|
81
|
+
}
|
|
82
|
+
}, [effectiveActionHandlers, effectiveConfig.executeAction]);
|
|
83
|
+
const dispatchRuntimeEvent = React.useCallback(async (eventArgs) => {
|
|
84
|
+
await dispatchRuntimeComponentEventWithReporting({
|
|
85
|
+
...eventArgs,
|
|
86
|
+
actionHandlers: effectiveActionHandlers,
|
|
87
|
+
dataBindings: eventArgs.dataBindings ?? effectiveConfig.dataBindings,
|
|
88
|
+
dataSources: eventArgs.dataSources ?? effectiveConfig.dataSources,
|
|
89
|
+
executeAction: effectiveConfig.executeAction ?? executeRuntimeAction,
|
|
90
|
+
executeOperation: eventArgs.executeOperation ?? effectiveConfig.executeOperation,
|
|
91
|
+
onDiagnostics: effectiveConfig.onDiagnostics,
|
|
92
|
+
operationResults: eventArgs.operationResults ?? effectiveConfig.operationResults,
|
|
93
|
+
writeOperationResult: eventArgs.writeOperationResult ?? effectiveConfig.writeOperationResult,
|
|
94
|
+
});
|
|
95
|
+
}, [
|
|
96
|
+
effectiveActionHandlers,
|
|
97
|
+
effectiveConfig.dataBindings,
|
|
98
|
+
effectiveConfig.dataSources,
|
|
99
|
+
effectiveConfig.executeAction,
|
|
100
|
+
effectiveConfig.executeOperation,
|
|
101
|
+
effectiveConfig.onDiagnostics,
|
|
102
|
+
effectiveConfig.operationResults,
|
|
103
|
+
effectiveConfig.writeOperationResult,
|
|
104
|
+
executeRuntimeAction,
|
|
105
|
+
]);
|
|
106
|
+
const executeRuntimeActionRef = React.useRef(executeRuntimeAction);
|
|
107
|
+
const dispatchRuntimeEventRef = React.useRef(dispatchRuntimeEvent);
|
|
108
|
+
const effectiveRegistry = React.useMemo(() => resolveRuntimeRegistry({
|
|
109
|
+
propRegistry: registry,
|
|
110
|
+
configRegistry: effectiveConfig.registry,
|
|
111
|
+
fallbackRegistry: ZORA_COMPONENT_REGISTRY,
|
|
112
|
+
}), [effectiveConfig.registry, registry]);
|
|
113
|
+
const Component = effectiveRegistry[node.type];
|
|
114
|
+
React.useEffect(() => {
|
|
115
|
+
executeRuntimeActionRef.current = executeRuntimeAction;
|
|
116
|
+
}, [executeRuntimeAction]);
|
|
117
|
+
React.useEffect(() => {
|
|
118
|
+
dispatchRuntimeEventRef.current = dispatchRuntimeEvent;
|
|
119
|
+
}, [dispatchRuntimeEvent]);
|
|
120
|
+
const repeatSyncResult = React.useMemo(() => {
|
|
121
|
+
const { repeat } = node;
|
|
122
|
+
if (!repeat) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
return resolveRuntimeRepeatItemsSync(repeat, {
|
|
126
|
+
context: effectiveConfig.bindingContext,
|
|
127
|
+
dataBindings: effectiveConfig.dataBindings,
|
|
128
|
+
dataSources: effectiveConfig.dataSources,
|
|
129
|
+
executeOperation: effectiveConfig.executeOperation,
|
|
130
|
+
node,
|
|
131
|
+
operationResults: effectiveConfig.operationResults,
|
|
132
|
+
stateAdapter: effectiveConfig.stateAdapter,
|
|
133
|
+
writeOperationResult: effectiveConfig.writeOperationResult,
|
|
134
|
+
});
|
|
135
|
+
}, [
|
|
136
|
+
effectiveConfig.bindingContext,
|
|
137
|
+
effectiveConfig.dataBindings,
|
|
138
|
+
effectiveConfig.dataSources,
|
|
139
|
+
effectiveConfig.executeOperation,
|
|
140
|
+
effectiveConfig.operationResults,
|
|
141
|
+
effectiveConfig.stateAdapter,
|
|
142
|
+
effectiveConfig.writeOperationResult,
|
|
143
|
+
node,
|
|
144
|
+
]);
|
|
145
|
+
const [asyncRepeatResult, setAsyncRepeatResult] = React.useState(null);
|
|
146
|
+
const repeatRequestIdRef = React.useRef(0);
|
|
147
|
+
const lastRepeatDiagnosticsKeyRef = React.useRef(null);
|
|
148
|
+
React.useEffect(() => {
|
|
149
|
+
repeatRequestIdRef.current += 1;
|
|
150
|
+
const requestId = repeatRequestIdRef.current;
|
|
151
|
+
const { repeat } = node;
|
|
152
|
+
if (!repeat || repeatSyncResult?.status !== 'pending') {
|
|
153
|
+
setAsyncRepeatResult(null);
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
void (async () => {
|
|
157
|
+
const result = await resolveRuntimeRepeatItemsAsync(repeat, {
|
|
158
|
+
context: effectiveConfig.bindingContext,
|
|
159
|
+
dataBindings: effectiveConfig.dataBindings,
|
|
160
|
+
dataSources: effectiveConfig.dataSources,
|
|
161
|
+
executeOperation: effectiveConfig.executeOperation,
|
|
162
|
+
node,
|
|
163
|
+
operationResults: effectiveConfig.operationResults,
|
|
164
|
+
stateAdapter: effectiveConfig.stateAdapter,
|
|
165
|
+
writeOperationResult: effectiveConfig.writeOperationResult,
|
|
166
|
+
});
|
|
167
|
+
if (repeatRequestIdRef.current !== requestId) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
setAsyncRepeatResult(result);
|
|
171
|
+
})();
|
|
172
|
+
return () => {
|
|
173
|
+
repeatRequestIdRef.current += 1;
|
|
174
|
+
};
|
|
175
|
+
}, [
|
|
176
|
+
effectiveConfig.bindingContext,
|
|
177
|
+
effectiveConfig.dataBindings,
|
|
178
|
+
effectiveConfig.dataSources,
|
|
179
|
+
effectiveConfig.executeOperation,
|
|
180
|
+
effectiveConfig.operationResults,
|
|
181
|
+
effectiveConfig.stateAdapter,
|
|
182
|
+
effectiveConfig.writeOperationResult,
|
|
183
|
+
node,
|
|
184
|
+
repeatSyncResult,
|
|
185
|
+
]);
|
|
186
|
+
const repeatDiagnostics = repeatSyncResult?.status === 'ready'
|
|
187
|
+
? repeatSyncResult.diagnostics
|
|
188
|
+
: asyncRepeatResult?.diagnostics;
|
|
189
|
+
React.useEffect(() => {
|
|
190
|
+
if (!node.repeat || repeatDiagnostics === undefined) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const diagnosticsKey = createRepeatDiagnosticsKey(node.id, repeatDiagnostics);
|
|
194
|
+
if (lastRepeatDiagnosticsKeyRef.current === diagnosticsKey) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
lastRepeatDiagnosticsKeyRef.current = diagnosticsKey;
|
|
198
|
+
effectiveConfig.onDiagnostics?.(repeatDiagnostics);
|
|
199
|
+
}, [effectiveConfig.onDiagnostics, node.repeat, repeatDiagnostics]);
|
|
200
|
+
if (!Component) {
|
|
201
|
+
const diagnostic = getUnknownComponentDiagnostic(node.type, effectiveRegistry);
|
|
202
|
+
return (<View style={styles.errorBox}>
|
|
203
|
+
<Text style={styles.errorTitle}>{diagnostic.title}</Text>
|
|
204
|
+
<Text style={styles.errorText}>{diagnostic.suggestion}</Text>
|
|
205
|
+
<Text style={styles.errorMeta}>{diagnostic.detail}</Text>
|
|
206
|
+
</View>);
|
|
207
|
+
}
|
|
208
|
+
const repeatItems = repeatSyncResult?.status === 'ready' ? repeatSyncResult.items : asyncRepeatResult?.items;
|
|
209
|
+
const shouldRenderRepeatEmptyState = shouldRenderRuntimeRepeatEmptyState({
|
|
210
|
+
diagnostics: repeatDiagnostics,
|
|
211
|
+
items: repeatItems,
|
|
212
|
+
status: repeatSyncResult?.status === 'ready'
|
|
213
|
+
? 'ready'
|
|
214
|
+
: repeatSyncResult?.status === 'pending'
|
|
215
|
+
? 'pending'
|
|
216
|
+
: asyncRepeatResult
|
|
217
|
+
? 'ready'
|
|
218
|
+
: undefined,
|
|
219
|
+
});
|
|
220
|
+
const renderedChildren = node.repeat
|
|
221
|
+
? repeatItems && repeatItems.length > 0
|
|
222
|
+
? repeatItems.flatMap((item, itemIndex) => (node.children ?? []).map((child) => {
|
|
223
|
+
const itemAlias = node.repeat?.itemAlias ?? 'item';
|
|
224
|
+
const repeatKey = resolveRuntimeRepeatItemKey({
|
|
225
|
+
item,
|
|
226
|
+
itemAlias,
|
|
227
|
+
index: itemIndex,
|
|
228
|
+
keyPath: node.repeat?.keyPath,
|
|
229
|
+
});
|
|
230
|
+
return (<RuntimeRenderer key={`${child.id}:${String(repeatKey)}`} node={child} registry={effectiveRegistry} bindingContext={createRuntimeRepeatBindingContext({
|
|
231
|
+
baseContext: effectiveConfig.bindingContext,
|
|
232
|
+
item,
|
|
233
|
+
itemAlias,
|
|
234
|
+
})}/>);
|
|
235
|
+
}))
|
|
236
|
+
: shouldRenderRepeatEmptyState
|
|
237
|
+
? node.repeat.empty?.map((child) => (<RuntimeRenderer key={child.id} node={child} registry={effectiveRegistry}/>))
|
|
238
|
+
: undefined
|
|
239
|
+
: node.children?.map((child) => (<RuntimeRenderer key={child.id} node={child} registry={effectiveRegistry}/>));
|
|
240
|
+
const resolvedProps = resolveRuntimeNodeProps({
|
|
241
|
+
bindingContext: effectiveConfig.bindingContext,
|
|
242
|
+
dataBindings: effectiveConfig.dataBindings,
|
|
243
|
+
dataSources: effectiveConfig.dataSources,
|
|
244
|
+
dbAdapter: effectiveConfig.dbAdapter,
|
|
245
|
+
dbRealtimeAdapter: effectiveConfig.dbRealtimeAdapter,
|
|
246
|
+
node,
|
|
247
|
+
operationResults: effectiveConfig.operationResults,
|
|
248
|
+
resolveNodeProps: effectiveConfig.resolveNodeProps,
|
|
249
|
+
stateAdapter: effectiveConfig.stateAdapter,
|
|
250
|
+
});
|
|
251
|
+
const propsWithActions = wrapRuntimeActionProps({
|
|
252
|
+
props: resolvedProps,
|
|
253
|
+
disableActions: effectiveConfig.disableActions === true,
|
|
254
|
+
handleAction: (action) => {
|
|
255
|
+
void executeRuntimeActionRef.current({ action });
|
|
256
|
+
},
|
|
257
|
+
actionHandlerCache: actionHandlerCacheRef.current,
|
|
258
|
+
functionHandlerCache: functionHandlerCacheRef.current,
|
|
259
|
+
});
|
|
260
|
+
const propsWithEvents = wrapRuntimeEventProps({
|
|
261
|
+
context: effectiveConfig.bindingContext,
|
|
262
|
+
dataBindings: effectiveConfig.dataBindings,
|
|
263
|
+
props: propsWithActions,
|
|
264
|
+
disableActions: effectiveConfig.disableActions === true,
|
|
265
|
+
dispatchComponentEvent: (eventArgs) => dispatchRuntimeEventRef.current(eventArgs),
|
|
266
|
+
node,
|
|
267
|
+
});
|
|
268
|
+
const componentChildren = resolveRenderedChildren({
|
|
269
|
+
propChildren: propsWithEvents.children,
|
|
270
|
+
renderedChildren,
|
|
271
|
+
});
|
|
272
|
+
let content = <Component {...propsWithEvents}>{componentChildren}</Component>;
|
|
273
|
+
if (effectiveConfig.wrapNode) {
|
|
274
|
+
content = effectiveConfig.wrapNode({ node, rendered: content, isRoot });
|
|
275
|
+
}
|
|
276
|
+
return (<RuntimeRendererConfigProvider value={explicitConfig}>{content}</RuntimeRendererConfigProvider>);
|
|
277
|
+
}
|
|
278
|
+
const styles = StyleSheet.create({
|
|
279
|
+
errorBox: {
|
|
280
|
+
borderColor: '#ef4444',
|
|
281
|
+
borderRadius: 8,
|
|
282
|
+
borderWidth: 1,
|
|
283
|
+
margin: 8,
|
|
284
|
+
padding: 8,
|
|
285
|
+
},
|
|
286
|
+
errorTitle: {
|
|
287
|
+
color: '#991b1b',
|
|
288
|
+
fontSize: 13,
|
|
289
|
+
fontWeight: '700',
|
|
290
|
+
marginBottom: 4,
|
|
291
|
+
},
|
|
292
|
+
errorText: {
|
|
293
|
+
color: '#ef4444',
|
|
294
|
+
fontWeight: '600',
|
|
295
|
+
},
|
|
296
|
+
errorMeta: {
|
|
297
|
+
color: '#7f1d1d',
|
|
298
|
+
fontSize: 12,
|
|
299
|
+
marginTop: 4,
|
|
300
|
+
},
|
|
301
|
+
});
|
|
302
|
+
//# sourceMappingURL=RuntimeRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeRenderer.js","sourceRoot":"","sources":["../src/RuntimeRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {\n BindingValue,\n ComponentDataBindingRegistry,\n DataSourceDiagnostic,\n DataSourceRegistry,\n DbAdapter,\n DbRealtimeAdapter,\n StateAdapter,\n UiNode,\n} from '@ankhorage/contracts';\nimport React from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport type { ComponentRegistry } from './registry';\nimport { ZORA_COMPONENT_REGISTRY } from './registry';\nimport {\n getUnknownComponentDiagnostic,\n resolveRenderedChildren,\n resolveRuntimeRegistry,\n} from './rendering';\nimport {\n type RuntimeComponentEventDispatchArgs,\n wrapRuntimeEventProps,\n} from './runtimeActionRegistry';\nimport type {\n RuntimeBindingOperationExecutor,\n RuntimeBindingOperationKey,\n RuntimeBindingOperationResultCache,\n} from './runtimeBindings';\nimport { resolveRuntimeNodeProps, wrapRuntimeActionProps } from './runtimeNodeProps';\nimport {\n mergeRuntimeRendererConfig,\n type RuntimeActionExecutor,\n RuntimeRendererConfigProvider,\n type RuntimeRendererWrapArgs,\n useRuntimeRendererConfig,\n} from './RuntimeRendererConfig';\nimport { dispatchRuntimeComponentEventWithReporting } from './runtimeEventExecution';\nimport {\n createRuntimeRepeatBindingContext,\n resolveRuntimeRepeatItemKey,\n resolveRuntimeRepeatItemsAsync,\n resolveRuntimeRepeatItemsSync,\n} from './runtimeRepeat';\nimport { createRepeatDiagnosticsKey } from './runtimeRepeatDiagnostics';\nimport { shouldRenderRuntimeRepeatEmptyState } from './runtimeRepeatEmptyState';\nimport { createDbPersistActionHandler } from './runtimeDbPersist';\nimport type { RuntimeActionHandlerArgs } from './RuntimeRendererConfig';\n\nexport interface RuntimeRendererProps {\n node: UiNode;\n isRoot?: boolean;\n registry?: ComponentRegistry;\n disableActions?: boolean;\n wrapNode?: (args: RuntimeRendererWrapArgs) => React.ReactNode;\n dbAdapter?: DbAdapter;\n dbRealtimeAdapter?: DbRealtimeAdapter;\n stateAdapter?: StateAdapter;\n bindingContext?: Record<string, unknown>;\n dataSources?: DataSourceRegistry;\n dataBindings?: ComponentDataBindingRegistry;\n operationResults?: RuntimeBindingOperationResultCache;\n executeAction?: RuntimeActionExecutor;\n executeOperation?: RuntimeBindingOperationExecutor;\n onDiagnostics?: (diagnostics: readonly DataSourceDiagnostic[]) => void;\n}\n\nexport function RuntimeRenderer(props: RuntimeRendererProps) {\n const {\n node,\n isRoot = false,\n registry,\n disableActions = false,\n wrapNode,\n dbAdapter,\n dbRealtimeAdapter,\n stateAdapter,\n bindingContext,\n dataSources,\n dataBindings,\n operationResults,\n executeAction,\n executeOperation,\n onDiagnostics,\n } = props;\n const inheritedConfig = useRuntimeRendererConfig();\n const inheritedOperationResults = inheritedConfig.operationResults;\n const [localOperationResults, setLocalOperationResults] =\n React.useState<RuntimeBindingOperationResultCache>({});\n const writeLocalOperationResult = React.useCallback(\n (key: RuntimeBindingOperationKey, value: BindingValue) => {\n setLocalOperationResults((currentResults) => ({\n ...currentResults,\n [key]: value,\n }));\n },\n [],\n );\n const actionHandlerCacheRef = React.useRef(new WeakMap<object, (...args: unknown[]) => void>());\n const functionHandlerCacheRef = React.useRef(\n new WeakMap<(...args: unknown[]) => unknown, (...args: unknown[]) => unknown>(),\n );\n const effectiveOperationResults = React.useMemo(\n () => ({\n ...(inheritedOperationResults ?? {}),\n ...(operationResults ?? {}),\n ...localOperationResults,\n }),\n [inheritedOperationResults, localOperationResults, operationResults],\n );\n const explicitConfig = React.useMemo(\n () => ({\n bindingContext,\n dataBindings,\n dataSources,\n dbAdapter,\n dbRealtimeAdapter,\n disableActions,\n executeAction,\n executeOperation,\n operationResults: effectiveOperationResults,\n onDiagnostics,\n registry,\n stateAdapter,\n wrapNode,\n writeOperationResult: inheritedConfig.writeOperationResult ?? writeLocalOperationResult,\n }),\n [\n bindingContext,\n dataBindings,\n dataSources,\n dbAdapter,\n dbRealtimeAdapter,\n disableActions,\n executeAction,\n effectiveOperationResults,\n executeOperation,\n inheritedConfig.writeOperationResult,\n onDiagnostics,\n registry,\n stateAdapter,\n wrapNode,\n writeLocalOperationResult,\n ],\n );\n const effectiveConfig = React.useMemo(\n () => mergeRuntimeRendererConfig(explicitConfig, inheritedConfig),\n [explicitConfig, inheritedConfig],\n );\n const effectiveActionHandlers = React.useMemo(() => {\n if (!effectiveConfig.dbAdapter) {\n return effectiveConfig.actionHandlers;\n }\n\n return {\n 'db.persist': createDbPersistActionHandler({ dbAdapter: effectiveConfig.dbAdapter }),\n ...(effectiveConfig.actionHandlers ?? {}),\n };\n }, [effectiveConfig.actionHandlers, effectiveConfig.dbAdapter]);\n const executeRuntimeAction = React.useCallback(\n async (actionArgs: RuntimeActionHandlerArgs) => {\n if (effectiveConfig.executeAction) {\n await effectiveConfig.executeAction(actionArgs);\n return;\n }\n\n const handler = effectiveActionHandlers?.[actionArgs.action.type];\n if (handler) {\n await handler(actionArgs);\n }\n },\n [effectiveActionHandlers, effectiveConfig.executeAction],\n );\n const dispatchRuntimeEvent = React.useCallback(\n async (eventArgs: RuntimeComponentEventDispatchArgs) => {\n await dispatchRuntimeComponentEventWithReporting({\n ...eventArgs,\n actionHandlers: effectiveActionHandlers,\n dataBindings: eventArgs.dataBindings ?? effectiveConfig.dataBindings,\n dataSources: eventArgs.dataSources ?? effectiveConfig.dataSources,\n executeAction: effectiveConfig.executeAction ?? executeRuntimeAction,\n executeOperation: eventArgs.executeOperation ?? effectiveConfig.executeOperation,\n onDiagnostics: effectiveConfig.onDiagnostics,\n operationResults: eventArgs.operationResults ?? effectiveConfig.operationResults,\n writeOperationResult:\n eventArgs.writeOperationResult ?? effectiveConfig.writeOperationResult,\n });\n },\n [\n effectiveActionHandlers,\n effectiveConfig.dataBindings,\n effectiveConfig.dataSources,\n effectiveConfig.executeAction,\n effectiveConfig.executeOperation,\n effectiveConfig.onDiagnostics,\n effectiveConfig.operationResults,\n effectiveConfig.writeOperationResult,\n executeRuntimeAction,\n ],\n );\n const executeRuntimeActionRef = React.useRef(executeRuntimeAction);\n const dispatchRuntimeEventRef = React.useRef(dispatchRuntimeEvent);\n const effectiveRegistry = React.useMemo(\n () =>\n resolveRuntimeRegistry({\n propRegistry: registry,\n configRegistry: effectiveConfig.registry,\n fallbackRegistry: ZORA_COMPONENT_REGISTRY,\n }),\n [effectiveConfig.registry, registry],\n );\n const Component = effectiveRegistry[node.type];\n\n React.useEffect(() => {\n executeRuntimeActionRef.current = executeRuntimeAction;\n }, [executeRuntimeAction]);\n\n React.useEffect(() => {\n dispatchRuntimeEventRef.current = dispatchRuntimeEvent;\n }, [dispatchRuntimeEvent]);\n\n const repeatSyncResult = React.useMemo(() => {\n const { repeat } = node;\n if (!repeat) {\n return null;\n }\n\n return resolveRuntimeRepeatItemsSync(repeat, {\n context: effectiveConfig.bindingContext,\n dataBindings: effectiveConfig.dataBindings,\n dataSources: effectiveConfig.dataSources,\n executeOperation: effectiveConfig.executeOperation,\n node,\n operationResults: effectiveConfig.operationResults,\n stateAdapter: effectiveConfig.stateAdapter,\n writeOperationResult: effectiveConfig.writeOperationResult,\n });\n }, [\n effectiveConfig.bindingContext,\n effectiveConfig.dataBindings,\n effectiveConfig.dataSources,\n effectiveConfig.executeOperation,\n effectiveConfig.operationResults,\n effectiveConfig.stateAdapter,\n effectiveConfig.writeOperationResult,\n node,\n ]);\n const [asyncRepeatResult, setAsyncRepeatResult] = React.useState<{\n readonly items: readonly BindingValue[];\n readonly diagnostics: readonly DataSourceDiagnostic[];\n } | null>(null);\n const repeatRequestIdRef = React.useRef(0);\n const lastRepeatDiagnosticsKeyRef = React.useRef<string | null>(null);\n\n React.useEffect(() => {\n repeatRequestIdRef.current += 1;\n const requestId = repeatRequestIdRef.current;\n const { repeat } = node;\n\n if (!repeat || repeatSyncResult?.status !== 'pending') {\n setAsyncRepeatResult(null);\n return undefined;\n }\n\n void (async () => {\n const result = await resolveRuntimeRepeatItemsAsync(repeat, {\n context: effectiveConfig.bindingContext,\n dataBindings: effectiveConfig.dataBindings,\n dataSources: effectiveConfig.dataSources,\n executeOperation: effectiveConfig.executeOperation,\n node,\n operationResults: effectiveConfig.operationResults,\n stateAdapter: effectiveConfig.stateAdapter,\n writeOperationResult: effectiveConfig.writeOperationResult,\n });\n\n if (repeatRequestIdRef.current !== requestId) {\n return;\n }\n\n setAsyncRepeatResult(result);\n })();\n\n return () => {\n repeatRequestIdRef.current += 1;\n };\n }, [\n effectiveConfig.bindingContext,\n effectiveConfig.dataBindings,\n effectiveConfig.dataSources,\n effectiveConfig.executeOperation,\n effectiveConfig.operationResults,\n effectiveConfig.stateAdapter,\n effectiveConfig.writeOperationResult,\n node,\n repeatSyncResult,\n ]);\n const repeatDiagnostics =\n repeatSyncResult?.status === 'ready'\n ? repeatSyncResult.diagnostics\n : asyncRepeatResult?.diagnostics;\n\n React.useEffect(() => {\n if (!node.repeat || repeatDiagnostics === undefined) {\n return;\n }\n\n const diagnosticsKey = createRepeatDiagnosticsKey(node.id, repeatDiagnostics);\n if (lastRepeatDiagnosticsKeyRef.current === diagnosticsKey) {\n return;\n }\n\n lastRepeatDiagnosticsKeyRef.current = diagnosticsKey;\n effectiveConfig.onDiagnostics?.(repeatDiagnostics);\n }, [effectiveConfig.onDiagnostics, node.repeat, repeatDiagnostics]);\n\n if (!Component) {\n const diagnostic = getUnknownComponentDiagnostic(node.type, effectiveRegistry);\n return (\n <View style={styles.errorBox}>\n <Text style={styles.errorTitle}>{diagnostic.title}</Text>\n <Text style={styles.errorText}>{diagnostic.suggestion}</Text>\n <Text style={styles.errorMeta}>{diagnostic.detail}</Text>\n </View>\n );\n }\n\n const repeatItems =\n repeatSyncResult?.status === 'ready' ? repeatSyncResult.items : asyncRepeatResult?.items;\n const shouldRenderRepeatEmptyState = shouldRenderRuntimeRepeatEmptyState({\n diagnostics: repeatDiagnostics,\n items: repeatItems,\n status:\n repeatSyncResult?.status === 'ready'\n ? 'ready'\n : repeatSyncResult?.status === 'pending'\n ? 'pending'\n : asyncRepeatResult\n ? 'ready'\n : undefined,\n });\n const renderedChildren = node.repeat\n ? repeatItems && repeatItems.length > 0\n ? repeatItems.flatMap((item, itemIndex) =>\n (node.children ?? []).map((child) => {\n const itemAlias = node.repeat?.itemAlias ?? 'item';\n const repeatKey = resolveRuntimeRepeatItemKey({\n item,\n itemAlias,\n index: itemIndex,\n keyPath: node.repeat?.keyPath,\n });\n\n return (\n <RuntimeRenderer\n key={`${child.id}:${String(repeatKey)}`}\n node={child}\n registry={effectiveRegistry}\n bindingContext={createRuntimeRepeatBindingContext({\n baseContext: effectiveConfig.bindingContext,\n item,\n itemAlias,\n })}\n />\n );\n }),\n )\n : shouldRenderRepeatEmptyState\n ? node.repeat.empty?.map((child) => (\n <RuntimeRenderer key={child.id} node={child} registry={effectiveRegistry} />\n ))\n : undefined\n : node.children?.map((child) => (\n <RuntimeRenderer key={child.id} node={child} registry={effectiveRegistry} />\n ));\n\n const resolvedProps = resolveRuntimeNodeProps({\n bindingContext: effectiveConfig.bindingContext,\n dataBindings: effectiveConfig.dataBindings,\n dataSources: effectiveConfig.dataSources,\n dbAdapter: effectiveConfig.dbAdapter,\n dbRealtimeAdapter: effectiveConfig.dbRealtimeAdapter,\n node,\n operationResults: effectiveConfig.operationResults,\n resolveNodeProps: effectiveConfig.resolveNodeProps,\n stateAdapter: effectiveConfig.stateAdapter,\n });\n const propsWithActions = wrapRuntimeActionProps({\n props: resolvedProps,\n disableActions: effectiveConfig.disableActions === true,\n handleAction: (action) => {\n void executeRuntimeActionRef.current({ action });\n },\n actionHandlerCache: actionHandlerCacheRef.current,\n functionHandlerCache: functionHandlerCacheRef.current,\n });\n const propsWithEvents = wrapRuntimeEventProps({\n context: effectiveConfig.bindingContext,\n dataBindings: effectiveConfig.dataBindings,\n props: propsWithActions,\n disableActions: effectiveConfig.disableActions === true,\n dispatchComponentEvent: (eventArgs) => dispatchRuntimeEventRef.current(eventArgs),\n node,\n });\n\n const componentChildren = resolveRenderedChildren({\n propChildren: propsWithEvents.children as React.ReactNode,\n renderedChildren,\n });\n\n let content: React.ReactNode = <Component {...propsWithEvents}>{componentChildren}</Component>;\n if (effectiveConfig.wrapNode) {\n content = effectiveConfig.wrapNode({ node, rendered: content, isRoot });\n }\n\n return (\n <RuntimeRendererConfigProvider value={explicitConfig}>{content}</RuntimeRendererConfigProvider>\n );\n}\n\nconst styles = StyleSheet.create({\n errorBox: {\n borderColor: '#ef4444',\n borderRadius: 8,\n borderWidth: 1,\n margin: 8,\n padding: 8,\n },\n errorTitle: {\n color: '#991b1b',\n fontSize: 13,\n fontWeight: '700',\n marginBottom: 4,\n },\n errorText: {\n color: '#ef4444',\n fontWeight: '600',\n },\n errorMeta: {\n color: '#7f1d1d',\n fontSize: 12,\n marginTop: 4,\n },\n});\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Action, ComponentDataBindingRegistry, ComponentEventDto, DataSourceDiagnostic, DataSourceRegistry, DbAdapter, DbRealtimeAdapter, StateAdapter, UiNode } from '@ankhorage/contracts';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { ComponentRegistry } from './registry';
|
|
4
|
+
import type { RuntimeBindingOperationExecutor, RuntimeBindingOperationResultCache, RuntimeBindingOperationResultWriter } from './runtimeBindings';
|
|
5
|
+
export interface RuntimeRendererWrapArgs {
|
|
6
|
+
node: UiNode;
|
|
7
|
+
rendered: React.ReactNode;
|
|
8
|
+
isRoot: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface RuntimeResolveNodePropsArgs {
|
|
11
|
+
node: UiNode;
|
|
12
|
+
props: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export type RuntimeNodePropsResolver = (args: RuntimeResolveNodePropsArgs) => Record<string, unknown>;
|
|
15
|
+
export interface RuntimeActionHandlerArgs {
|
|
16
|
+
action: RuntimeAction;
|
|
17
|
+
event?: ComponentEventDto<string, object>;
|
|
18
|
+
node?: UiNode;
|
|
19
|
+
resolvedPayload?: object;
|
|
20
|
+
}
|
|
21
|
+
export type RuntimeAction = Action | {
|
|
22
|
+
readonly type: string;
|
|
23
|
+
readonly payload?: object;
|
|
24
|
+
};
|
|
25
|
+
export type RuntimeActionHandler = (args: RuntimeActionHandlerArgs) => Promise<void> | void;
|
|
26
|
+
export type RuntimeActionHandlers = Record<string, RuntimeActionHandler>;
|
|
27
|
+
export type RuntimeActionExecutor = RuntimeActionHandler;
|
|
28
|
+
export interface RuntimeRendererConfig {
|
|
29
|
+
disableActions?: boolean;
|
|
30
|
+
registry?: ComponentRegistry;
|
|
31
|
+
wrapNode?: (args: RuntimeRendererWrapArgs) => React.ReactNode;
|
|
32
|
+
resolveNodeProps?: RuntimeNodePropsResolver;
|
|
33
|
+
actionHandlers?: RuntimeActionHandlers;
|
|
34
|
+
dbAdapter?: DbAdapter;
|
|
35
|
+
dbRealtimeAdapter?: DbRealtimeAdapter;
|
|
36
|
+
stateAdapter?: StateAdapter;
|
|
37
|
+
bindingContext?: Record<string, unknown>;
|
|
38
|
+
dataSources?: DataSourceRegistry;
|
|
39
|
+
dataBindings?: ComponentDataBindingRegistry;
|
|
40
|
+
operationResults?: RuntimeBindingOperationResultCache;
|
|
41
|
+
writeOperationResult?: RuntimeBindingOperationResultWriter;
|
|
42
|
+
executeAction?: RuntimeActionExecutor;
|
|
43
|
+
executeOperation?: RuntimeBindingOperationExecutor;
|
|
44
|
+
onDiagnostics?: (diagnostics: readonly DataSourceDiagnostic[]) => void;
|
|
45
|
+
}
|
|
46
|
+
export declare function composeRuntimeRendererWrapNode(innerWrapNode?: RuntimeRendererConfig['wrapNode'], outerWrapNode?: RuntimeRendererConfig['wrapNode']): RuntimeRendererConfig['wrapNode'];
|
|
47
|
+
export declare function composeRuntimeNodePropsResolver(localResolver?: RuntimeRendererConfig['resolveNodeProps'], inheritedResolver?: RuntimeRendererConfig['resolveNodeProps']): RuntimeRendererConfig['resolveNodeProps'];
|
|
48
|
+
export declare function mergeRuntimeRendererConfig(localConfig: RuntimeRendererConfig | undefined, inheritedConfig: RuntimeRendererConfig | undefined): RuntimeRendererConfig;
|
|
49
|
+
export declare function RuntimeRendererConfigProvider(props: {
|
|
50
|
+
value: RuntimeRendererConfig;
|
|
51
|
+
children: React.ReactNode;
|
|
52
|
+
}): React.JSX.Element;
|
|
53
|
+
export declare function useRuntimeRendererConfig(): RuntimeRendererConfig;
|
|
54
|
+
//# sourceMappingURL=RuntimeRendererConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeRendererConfig.d.ts","sourceRoot":"","sources":["../src/RuntimeRendererConfig.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import React, { createContext, useContext } from 'react';
|
|
2
|
+
const EMPTY_RUNTIME_RENDERER_CONFIG = {};
|
|
3
|
+
const RuntimeRendererConfigContext = createContext(EMPTY_RUNTIME_RENDERER_CONFIG);
|
|
4
|
+
export function composeRuntimeRendererWrapNode(innerWrapNode, outerWrapNode) {
|
|
5
|
+
if (!innerWrapNode) {
|
|
6
|
+
return outerWrapNode;
|
|
7
|
+
}
|
|
8
|
+
if (!outerWrapNode) {
|
|
9
|
+
return innerWrapNode;
|
|
10
|
+
}
|
|
11
|
+
return (args) => outerWrapNode({ ...args, rendered: innerWrapNode(args) });
|
|
12
|
+
}
|
|
13
|
+
export function composeRuntimeNodePropsResolver(localResolver, inheritedResolver) {
|
|
14
|
+
if (!localResolver) {
|
|
15
|
+
return inheritedResolver;
|
|
16
|
+
}
|
|
17
|
+
if (!inheritedResolver) {
|
|
18
|
+
return localResolver;
|
|
19
|
+
}
|
|
20
|
+
return (args) => {
|
|
21
|
+
const inheritedProps = inheritedResolver(args);
|
|
22
|
+
return localResolver({ ...args, props: inheritedProps });
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function mergeRuntimeRendererConfig(localConfig, inheritedConfig) {
|
|
26
|
+
if (!localConfig && !inheritedConfig) {
|
|
27
|
+
return EMPTY_RUNTIME_RENDERER_CONFIG;
|
|
28
|
+
}
|
|
29
|
+
const actionHandlers = mergeRecordConfig(inheritedConfig?.actionHandlers, localConfig?.actionHandlers);
|
|
30
|
+
const bindingContext = mergeRecordConfig(inheritedConfig?.bindingContext, localConfig?.bindingContext);
|
|
31
|
+
const operationResults = mergeRecordConfig(inheritedConfig?.operationResults, localConfig?.operationResults);
|
|
32
|
+
return {
|
|
33
|
+
disableActions: localConfig?.disableActions === true || inheritedConfig?.disableActions === true,
|
|
34
|
+
registry: localConfig?.registry ?? inheritedConfig?.registry,
|
|
35
|
+
wrapNode: composeRuntimeRendererWrapNode(localConfig?.wrapNode, inheritedConfig?.wrapNode),
|
|
36
|
+
resolveNodeProps: composeRuntimeNodePropsResolver(localConfig?.resolveNodeProps, inheritedConfig?.resolveNodeProps),
|
|
37
|
+
actionHandlers,
|
|
38
|
+
dbAdapter: localConfig?.dbAdapter ?? inheritedConfig?.dbAdapter,
|
|
39
|
+
dbRealtimeAdapter: localConfig?.dbRealtimeAdapter ?? inheritedConfig?.dbRealtimeAdapter,
|
|
40
|
+
stateAdapter: localConfig?.stateAdapter ?? inheritedConfig?.stateAdapter,
|
|
41
|
+
bindingContext,
|
|
42
|
+
dataSources: localConfig?.dataSources ?? inheritedConfig?.dataSources,
|
|
43
|
+
dataBindings: localConfig?.dataBindings ?? inheritedConfig?.dataBindings,
|
|
44
|
+
operationResults,
|
|
45
|
+
writeOperationResult: localConfig?.writeOperationResult ?? inheritedConfig?.writeOperationResult,
|
|
46
|
+
executeAction: localConfig?.executeAction ?? inheritedConfig?.executeAction,
|
|
47
|
+
executeOperation: localConfig?.executeOperation ?? inheritedConfig?.executeOperation,
|
|
48
|
+
onDiagnostics: localConfig?.onDiagnostics ?? inheritedConfig?.onDiagnostics,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function RuntimeRendererConfigProvider(props) {
|
|
52
|
+
const { value, children } = props;
|
|
53
|
+
const inheritedConfig = useContext(RuntimeRendererConfigContext);
|
|
54
|
+
const mergedConfig = mergeRuntimeRendererConfig(value, inheritedConfig);
|
|
55
|
+
return (<RuntimeRendererConfigContext.Provider value={mergedConfig}>
|
|
56
|
+
{children}
|
|
57
|
+
</RuntimeRendererConfigContext.Provider>);
|
|
58
|
+
}
|
|
59
|
+
export function useRuntimeRendererConfig() {
|
|
60
|
+
return useContext(RuntimeRendererConfigContext);
|
|
61
|
+
}
|
|
62
|
+
function mergeRecordConfig(inherited, local) {
|
|
63
|
+
if (!inherited && !local)
|
|
64
|
+
return undefined;
|
|
65
|
+
return {
|
|
66
|
+
...(inherited ?? {}),
|
|
67
|
+
...(local ?? {}),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=RuntimeRendererConfig.js.map
|