@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.
Files changed (117) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +20 -5
  3. package/dist/ManifestContext.d.ts +16 -0
  4. package/dist/ManifestContext.d.ts.map +1 -0
  5. package/dist/ManifestContext.js +26 -0
  6. package/dist/ManifestContext.js.map +1 -0
  7. package/dist/RuntimeRenderer.d.ts +24 -0
  8. package/dist/RuntimeRenderer.d.ts.map +1 -0
  9. package/dist/RuntimeRenderer.js +302 -0
  10. package/dist/RuntimeRenderer.js.map +1 -0
  11. package/dist/RuntimeRendererConfig.d.ts +54 -0
  12. package/dist/RuntimeRendererConfig.d.ts.map +1 -0
  13. package/dist/RuntimeRendererConfig.js +70 -0
  14. package/dist/RuntimeRendererConfig.js.map +1 -0
  15. package/dist/RuntimeScreen.d.ts +11 -0
  16. package/dist/RuntimeScreen.d.ts.map +1 -0
  17. package/dist/RuntimeScreen.js +59 -0
  18. package/dist/RuntimeScreen.js.map +1 -0
  19. package/dist/appExtensionRegistry.d.ts +3 -0
  20. package/dist/appExtensionRegistry.d.ts.map +1 -0
  21. package/dist/appExtensionRegistry.js +2 -0
  22. package/dist/appExtensionRegistry.js.map +1 -0
  23. package/dist/componentRegistry.d.ts +4 -0
  24. package/dist/componentRegistry.d.ts.map +1 -0
  25. package/dist/componentRegistry.js +6 -0
  26. package/dist/componentRegistry.js.map +1 -0
  27. package/dist/index.d.ts +27 -52
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +16 -30
  30. package/dist/index.js.map +1 -1
  31. package/dist/readme-usage.js +4 -4
  32. package/dist/readme-usage.js.map +1 -1
  33. package/dist/registry.d.ts +7 -0
  34. package/dist/registry.d.ts.map +1 -0
  35. package/dist/registry.js +49 -0
  36. package/dist/registry.js.map +1 -0
  37. package/dist/rendering.d.ts +17 -0
  38. package/dist/rendering.d.ts.map +1 -0
  39. package/dist/rendering.js +24 -0
  40. package/dist/rendering.js.map +1 -0
  41. package/dist/runtimeActionRegistry.d.ts +55 -0
  42. package/dist/runtimeActionRegistry.d.ts.map +1 -0
  43. package/dist/runtimeActionRegistry.js +323 -0
  44. package/dist/runtimeActionRegistry.js.map +1 -0
  45. package/dist/runtimeApiLoaders.d.ts +35 -0
  46. package/dist/runtimeApiLoaders.d.ts.map +1 -0
  47. package/dist/runtimeApiLoaders.js +218 -0
  48. package/dist/runtimeApiLoaders.js.map +1 -0
  49. package/dist/runtimeBindings.d.ts +52 -0
  50. package/dist/runtimeBindings.d.ts.map +1 -0
  51. package/dist/runtimeBindings.js +299 -0
  52. package/dist/runtimeBindings.js.map +1 -0
  53. package/dist/runtimeDataSourceOperations.d.ts +8 -0
  54. package/dist/runtimeDataSourceOperations.d.ts.map +1 -0
  55. package/dist/runtimeDataSourceOperations.js +58 -0
  56. package/dist/runtimeDataSourceOperations.js.map +1 -0
  57. package/dist/runtimeDbPersist.d.ts +34 -0
  58. package/dist/runtimeDbPersist.d.ts.map +1 -0
  59. package/dist/runtimeDbPersist.js +73 -0
  60. package/dist/runtimeDbPersist.js.map +1 -0
  61. package/dist/runtimeEventExecution.d.ts +11 -0
  62. package/dist/runtimeEventExecution.d.ts.map +1 -0
  63. package/dist/runtimeEventExecution.js +17 -0
  64. package/dist/runtimeEventExecution.js.map +1 -0
  65. package/dist/runtimeManifest.d.ts +53 -0
  66. package/dist/runtimeManifest.d.ts.map +1 -0
  67. package/dist/runtimeManifest.js +31 -0
  68. package/dist/runtimeManifest.js.map +1 -0
  69. package/dist/runtimeNodeProps.d.ts +22 -0
  70. package/dist/runtimeNodeProps.d.ts.map +1 -0
  71. package/dist/runtimeNodeProps.js +130 -0
  72. package/dist/runtimeNodeProps.js.map +1 -0
  73. package/dist/runtimeRepeat.d.ts +27 -0
  74. package/dist/runtimeRepeat.d.ts.map +1 -0
  75. package/dist/runtimeRepeat.js +129 -0
  76. package/dist/runtimeRepeat.js.map +1 -0
  77. package/dist/runtimeRepeatDiagnostics.d.ts +3 -0
  78. package/dist/runtimeRepeatDiagnostics.d.ts.map +1 -0
  79. package/dist/runtimeRepeatDiagnostics.js +14 -0
  80. package/dist/runtimeRepeatDiagnostics.js.map +1 -0
  81. package/dist/runtimeRepeatEmptyState.d.ts +7 -0
  82. package/dist/runtimeRepeatEmptyState.d.ts.map +1 -0
  83. package/dist/runtimeRepeatEmptyState.js +10 -0
  84. package/dist/runtimeRepeatEmptyState.js.map +1 -0
  85. package/dist/runtimeScreenLoaders.d.ts +71 -0
  86. package/dist/runtimeScreenLoaders.d.ts.map +1 -0
  87. package/dist/runtimeScreenLoaders.js +309 -0
  88. package/dist/runtimeScreenLoaders.js.map +1 -0
  89. package/dist/runtimeStateAdapter.d.ts +6 -0
  90. package/dist/runtimeStateAdapter.d.ts.map +1 -0
  91. package/dist/runtimeStateAdapter.js +162 -0
  92. package/dist/runtimeStateAdapter.js.map +1 -0
  93. package/package.json +19 -2
  94. package/paradox/badges/npm.svg +3 -3
  95. package/paradox/components.md +72 -0
  96. package/paradox/diagrams/architecture-overview.mmd +135 -1
  97. package/paradox/diagrams/export-graph.mmd +303 -18
  98. package/paradox/diagrams/module-relationships.mmd +98 -1
  99. package/paradox/diagrams/sequences/create-component-event-from-handler-args.mmd +24 -0
  100. package/paradox/diagrams/sequences/execute-db-persist-action.mmd +16 -0
  101. package/paradox/diagrams/sequences/merge-runtime-renderer-config.mmd +11 -0
  102. package/paradox/diagrams/sequences/resolve-db-persist-input.mmd +13 -0
  103. package/paradox/diagrams/sequences/resolve-runtime-action-payload.mmd +8 -0
  104. package/paradox/diagrams/sequences/resolve-runtime-action-value.mmd +5 -0
  105. package/paradox/diagrams/sequences/runtime-renderer-config-provider.mmd +17 -0
  106. package/paradox/diagrams/sequences/runtime-screen.mmd +17 -0
  107. package/paradox/diagrams/sequences/use-manifest-context.mmd +5 -0
  108. package/paradox/diagrams/sequences/use-manifest.mmd +5 -0
  109. package/paradox/diagrams/sequences/use-optional-manifest-context.mmd +5 -0
  110. package/paradox/diagrams/sequences/use-runtime-renderer-config.mmd +5 -0
  111. package/paradox/diagrams/sequences/use-runtime-screen-operation-loaders.mmd +5 -0
  112. package/paradox/diagrams/sequences/validate-runtime-binding-operation-ref.mmd +8 -0
  113. package/paradox/diagrams/sequences/wrap-runtime-event-props.mmd +5 -0
  114. package/paradox/exports.json +3385 -330
  115. package/paradox/exports.md +1051 -38
  116. package/paradox/index.html +8244 -413
  117. package/paradox/paradox.json +10013 -511
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeStateAdapter.js","sourceRoot":"","sources":["../src/runtimeStateAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateAdapter,\n StateAdapterError,\n StateListener,\n StatePath,\n StateResult,\n StateSubscription,\n StateValue,\n} from '@ankhorage/contracts';\n\ntype MutableStateRecord = Record<string, StateValue>;\ntype StateListenerSet = Set<(value: StateValue | undefined) => void>;\n\nexport interface RuntimeMemoryStateAdapterOptions {\n readonly initialState?: Readonly<Record<string, StateValue>>;\n}\n\nexport function createRuntimeMemoryStateAdapter(\n options: RuntimeMemoryStateAdapterOptions = {},\n): StateAdapter {\n let rootState: MutableStateRecord = { ...(options.initialState ?? {}) };\n const listeners = new Map<string, StateListenerSet>();\n\n const emit = (path: StatePath, value: StateValue | undefined) => {\n const pathResult = normalizeStatePath(path);\n if (!pathResult.ok) return;\n\n const listenersForPath = listeners.get(pathPartsToKey(pathResult.parts));\n if (listenersForPath === undefined) return;\n\n for (const listener of listenersForPath) {\n listener(value);\n }\n };\n\n return {\n capabilities: {\n subscriptions: true,\n computed: false,\n persistence: false,\n },\n get<TValue extends StateValue = StateValue>(path: StatePath): StateResult<TValue | undefined> {\n const pathResult = normalizeStatePath(path);\n if (!pathResult.ok) return pathResult;\n\n return createStateDataResult(\n readStatePath(rootState, pathResult.parts) as TValue | undefined,\n );\n },\n set<TValue extends StateValue = StateValue>(path: StatePath, value: TValue): StateResult {\n const pathResult = normalizeStatePath(path);\n if (!pathResult.ok) return pathResult;\n\n const nextStateResult = setStatePath(rootState, pathResult.parts, value);\n if (!nextStateResult.ok) return nextStateResult;\n\n rootState = nextStateResult.data;\n emit(path, value);\n return { ok: true };\n },\n subscribe<TValue extends StateValue = StateValue>(\n path: StatePath,\n listener: StateListener<TValue>,\n ): StateResult<StateSubscription> {\n const pathResult = normalizeStatePath(path);\n if (!pathResult.ok) return pathResult;\n\n const key = pathPartsToKey(pathResult.parts);\n const listenersForPath =\n listeners.get(key) ?? new Set<(value: StateValue | undefined) => void>();\n const wrappedListener = (value: StateValue | undefined) => {\n listener({ path, value: value as TValue | undefined });\n };\n\n listenersForPath.add(wrappedListener);\n listeners.set(key, listenersForPath);\n\n return createStateDataResult({\n unsubscribe() {\n listenersForPath.delete(wrappedListener);\n if (listenersForPath.size === 0) {\n listeners.delete(key);\n }\n },\n });\n },\n delete(path: StatePath): StateResult {\n const pathResult = normalizeStatePath(path);\n if (!pathResult.ok) return pathResult;\n\n const nextStateResult = deleteStatePath(rootState, pathResult.parts);\n if (!nextStateResult.ok) return nextStateResult;\n\n rootState = nextStateResult.data;\n emit(path, undefined);\n return { ok: true };\n },\n };\n}\n\ninterface ResolvedStatePath {\n readonly ok: true;\n readonly parts: readonly string[];\n}\n\ninterface StatePathError {\n readonly ok: false;\n readonly error: StateAdapterError;\n}\n\ntype StatePathResult = ResolvedStatePath | StatePathError;\n\nfunction normalizeStatePath(path: StatePath): StatePathResult {\n const parts = typeof path === 'string' ? path.split('.') : [...path];\n const normalized = parts.map((part) => part.trim()).filter(Boolean);\n\n if (normalized.length === 0) {\n return createStateError('invalid_path', 'State path must contain at least one segment.');\n }\n\n return {\n ok: true,\n parts: normalized,\n };\n}\n\nfunction pathPartsToKey(parts: readonly string[]): string {\n return parts.join('.');\n}\n\nfunction readStatePath(\n source: MutableStateRecord,\n parts: readonly string[],\n): StateValue | undefined {\n let currentValue: StateValue | undefined = source;\n\n for (const part of parts) {\n if (!isStateRecord(currentValue)) {\n return undefined;\n }\n\n currentValue = currentValue[part];\n }\n\n return currentValue;\n}\n\nfunction setStatePath(\n source: MutableStateRecord,\n parts: readonly string[],\n value: StateValue,\n): StateResult<MutableStateRecord> {\n const [head, ...tail] = parts;\n if (head === undefined) {\n return createStateError('invalid_path', 'State path must contain at least one segment.');\n }\n\n if (tail.length === 0) {\n return createStateDataResult({\n ...source,\n [head]: value,\n });\n }\n\n const existing = source[head];\n const child = existing === undefined ? {} : existing;\n if (!isStateRecord(child)) {\n return createStateError(\n 'path_conflict',\n `Cannot set nested state below non-object path segment \"${head}\".`,\n );\n }\n\n const childResult = setStatePath(child, tail, value);\n if (!childResult.ok) return childResult;\n\n return createStateDataResult({\n ...source,\n [head]: childResult.data,\n });\n}\n\nfunction deleteStatePath(\n source: MutableStateRecord,\n parts: readonly string[],\n): StateResult<MutableStateRecord> {\n const [head, ...tail] = parts;\n if (head === undefined) {\n return createStateError('invalid_path', 'State path must contain at least one segment.');\n }\n\n if (tail.length === 0) {\n const nextState: MutableStateRecord = {};\n for (const [key, value] of Object.entries(source)) {\n if (key !== head) {\n nextState[key] = value;\n }\n }\n\n return createStateDataResult(nextState);\n }\n\n const existing = source[head];\n if (existing === undefined) {\n return createStateDataResult(source);\n }\n\n if (!isStateRecord(existing)) {\n return createStateError(\n 'path_conflict',\n `Cannot delete nested state below non-object path segment \"${head}\".`,\n );\n }\n\n const childResult = deleteStatePath(existing, tail);\n if (!childResult.ok) return childResult;\n\n return createStateDataResult({\n ...source,\n [head]: childResult.data,\n });\n}\n\nfunction isStateRecord(value: StateValue | undefined): value is MutableStateRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction createStateError(code: string, message: string): StatePathError {\n const error: StateAdapterError = { code, message };\n return { ok: false, error };\n}\n\nfunction createStateDataResult<TValue>(data: TValue): StateResult<TValue> {\n const result = {\n ok: true,\n data,\n };\n\n return result as StateResult<TValue>;\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ankhorage/runtime",
3
- "version": "0.1.0",
4
- "description": "Platform-neutral runtime contracts and helpers for Ankhorage generated apps.",
3
+ "version": "0.2.0",
4
+ "description": "Platform-neutral runtime renderer, contracts, and helpers for Ankhorage generated apps.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -63,12 +63,29 @@
63
63
  "changeset:status": "changeset status --since=origin/main",
64
64
  "version-packages": "changeset version"
65
65
  },
66
+ "dependencies": {
67
+ "@ankhorage/contracts": "^1.18.3",
68
+ "@ankhorage/data-sources": "^0.5.1",
69
+ "@ankhorage/zora": "^2.8.1"
70
+ },
71
+ "peerDependencies": {
72
+ "react": "19.1.0",
73
+ "react-native": "0.81.5"
74
+ },
66
75
  "devDependencies": {
67
76
  "@ankhorage/devtools": "^1.0.6",
68
77
  "@ankhorage/paradox": "^0.1.10",
69
78
  "@changesets/cli": "^2.31.0",
79
+ "@expo/vector-icons": "^15.0.3",
80
+ "@react-native-picker/picker": "2.11.1",
70
81
  "@types/bun": "^1.3.13",
71
82
  "@types/node": "^25.6.0",
83
+ "@types/react": "^19.2.14",
84
+ "expo": "~54.0.35",
85
+ "expo-font": "~14.0.12",
86
+ "expo-linear-gradient": "^56.0.4",
87
+ "react": "19.1.0",
88
+ "react-native": "0.81.5",
72
89
  "typescript": "^5.9.3"
73
90
  },
74
91
  "sideEffects": false,
@@ -1,7 +1,7 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="90" height="20" role="img" aria-label="npm: v0.0.0">
2
- <title>npm: v0.0.0</title>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="90" height="20" role="img" aria-label="npm: v0.1.1">
2
+ <title>npm: v0.1.1</title>
3
3
  <rect width="38" height="20" fill="#374151"/>
4
4
  <rect x="38" width="52" height="20" fill="#cb3837"/>
5
5
  <text x="19" y="14" fill="#ffffff" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="11" text-anchor="middle">npm</text>
6
- <text x="64" y="14" fill="#ffffff" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="11" text-anchor="middle">v0.0.0</text>
6
+ <text x="64" y="14" fill="#ffffff" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="11" text-anchor="middle">v0.1.1</text>
7
7
  </svg>
@@ -1 +1,73 @@
1
1
  # Components
2
+
3
+ ## ManifestContext
4
+
5
+ Source: `src/ManifestContext.tsx:10:14`
6
+
7
+ Export paths: `src/index.ts`
8
+
9
+ | Prop | Type | Required | Default | Description |
10
+ | -------- | ------------------------------ | -------- | ------- | ----------- |
11
+ | children | `ReactNode` | no | — | |
12
+ | value | `ManifestContextValue \| null` | yes | — | |
13
+
14
+ ## ManifestProvider
15
+
16
+ Source: `src/ManifestContext.tsx:12:1`
17
+
18
+ Export paths: `src/index.ts`
19
+
20
+ | Prop | Type | Required | Default | Description |
21
+ | -------------- | ----------------------------------------- | -------- | ------- | ----------- |
22
+ | activeScreenId | `string \| undefined` | no | — | |
23
+ | children | `React.ReactNode \| undefined` | no | — | |
24
+ | manifest | `AppManifest` | yes | — | |
25
+ | onScreenChange | `(screenId: string) => void \| undefined` | no | — | |
26
+
27
+ ## RuntimeRenderer
28
+
29
+ Source: `src/RuntimeRenderer.tsx:68:1`
30
+
31
+ Export paths: `src/index.ts`
32
+
33
+ | Prop | Type | Required | Default | Description |
34
+ | ----------------- | --------------------------------------------------------------------- | -------- | ------- | ----------- |
35
+ | bindingContext | `Record<string, unknown> \| undefined` | no | — | |
36
+ | dataBindings | `ComponentDataBindingRegistry \| undefined` | no | — | |
37
+ | dataSources | `DataSourceRegistry \| undefined` | no | — | |
38
+ | dbAdapter | `DbAdapter \| undefined` | no | — | |
39
+ | dbRealtimeAdapter | `DbRealtimeAdapter \| undefined` | no | — | |
40
+ | disableActions | `boolean \| undefined` | no | — | |
41
+ | executeAction | `RuntimeActionExecutor \| undefined` | no | — | |
42
+ | executeOperation | `RuntimeBindingOperationExecutor \| undefined` | no | — | |
43
+ | isRoot | `boolean \| undefined` | no | — | |
44
+ | node | `UiNode` | yes | — | |
45
+ | onDiagnostics | `(diagnostics: readonly DataSourceDiagnostic[]) => void \| undefined` | no | — | |
46
+ | operationResults | `RuntimeBindingOperationResultCache \| undefined` | no | — | |
47
+ | registry | `ComponentRegistry \| undefined` | no | — | |
48
+ | stateAdapter | `StateAdapter \| undefined` | no | — | |
49
+ | wrapNode | `(args: RuntimeRendererWrapArgs) => React.ReactNode \| undefined` | no | — | |
50
+
51
+ ## RuntimeRendererConfigProvider
52
+
53
+ Source: `src/RuntimeRendererConfig.tsx:152:1`
54
+
55
+ Export paths: `src/index.ts`
56
+
57
+ | Prop | Type | Required | Default | Description |
58
+ | -------- | ------------------------------ | -------- | ------- | ----------- |
59
+ | children | `React.ReactNode \| undefined` | no | — | |
60
+ | value | `RuntimeRendererConfig` | yes | — | |
61
+
62
+ ## RuntimeScreen
63
+
64
+ Source: `src/RuntimeScreen.tsx:24:1`
65
+
66
+ Export paths: `src/index.ts`
67
+
68
+ | Prop | Type | Required | Default | Description |
69
+ | ------------ | -------------------------------- | -------- | ------- | ----------- |
70
+ | manifest | `AppManifest` | yes | — | |
71
+ | registry | `ComponentRegistry \| undefined` | no | — | |
72
+ | screen | `ScreenSpec` | yes | — | |
73
+ | stateAdapter | `StateAdapter \| undefined` | no | — | |
@@ -4,7 +4,141 @@ graph TD
4
4
  package__ankhorage_runtime --> entrypoint_src_index_ts
5
5
  module_paradox_config_ts["paradox.config.ts"]
6
6
  package__ankhorage_runtime -.-> module_paradox_config_ts
7
+ module_src_appExtensionRegistry_ts["src/appExtensionRegistry.ts"]
8
+ package__ankhorage_runtime -.-> module_src_appExtensionRegistry_ts
9
+ module_src_appExtensionRegistry_ts --> module_src_componentRegistry_ts
10
+ module_src_componentRegistry_ts["src/componentRegistry.ts"]
11
+ package__ankhorage_runtime -.-> module_src_componentRegistry_ts
7
12
  module_src_index_ts["src/index.ts"]
13
+ module_src_ManifestContext_tsx["src/ManifestContext.tsx"]
14
+ package__ankhorage_runtime -.-> module_src_ManifestContext_tsx
15
+ module_src_registry_test_ts["src/registry.test.ts"]
16
+ package__ankhorage_runtime -.-> module_src_registry_test_ts
17
+ module_src_registry_test_ts --> module_src_componentRegistry_ts
18
+ module_src_registry_tsx["src/registry.tsx"]
19
+ package__ankhorage_runtime -.-> module_src_registry_tsx
20
+ module_src_registry_tsx --> module_src_appExtensionRegistry_ts
21
+ module_src_registry_tsx --> module_src_componentRegistry_ts
22
+ module_src_rendering_test_ts["src/rendering.test.ts"]
23
+ package__ankhorage_runtime -.-> module_src_rendering_test_ts
24
+ module_src_rendering_test_ts --> module_src_registry_tsx
25
+ module_src_rendering_test_ts --> module_src_rendering_ts
26
+ module_src_rendering_ts["src/rendering.ts"]
27
+ package__ankhorage_runtime -.-> module_src_rendering_ts
28
+ module_src_rendering_ts --> module_src_registry_tsx
29
+ module_src_runtimeActionRegistry_test_ts["src/runtimeActionRegistry.test.ts"]
30
+ package__ankhorage_runtime -.-> module_src_runtimeActionRegistry_test_ts
31
+ module_src_runtimeActionRegistry_test_ts --> module_src_runtimeActionRegistry_ts
32
+ module_src_runtimeActionRegistry_test_ts --> module_src_runtimeBindings_ts
33
+ module_src_runtimeActionRegistry_ts["src/runtimeActionRegistry.ts"]
34
+ package__ankhorage_runtime -.-> module_src_runtimeActionRegistry_ts
35
+ module_src_runtimeActionRegistry_ts --> module_src_runtimeBindings_ts
36
+ module_src_runtimeActionRegistry_ts --> module_src_RuntimeRendererConfig_tsx
37
+ module_src_runtimeApiLoaders_test_ts["src/runtimeApiLoaders.test.ts"]
38
+ package__ankhorage_runtime -.-> module_src_runtimeApiLoaders_test_ts
39
+ module_src_runtimeApiLoaders_test_ts --> module_src_runtimeApiLoaders_ts
40
+ module_src_runtimeApiLoaders_test_ts --> module_src_runtimeBindings_ts
41
+ module_src_runtimeApiLoaders_test_ts --> module_src_runtimeStateAdapter_ts
42
+ module_src_runtimeApiLoaders_ts["src/runtimeApiLoaders.ts"]
43
+ package__ankhorage_runtime -.-> module_src_runtimeApiLoaders_ts
44
+ module_src_runtimeApiLoaders_ts --> module_src_runtimeStateAdapter_ts
45
+ module_src_runtimeBindings_test_ts["src/runtimeBindings.test.ts"]
46
+ package__ankhorage_runtime -.-> module_src_runtimeBindings_test_ts
47
+ module_src_runtimeBindings_test_ts --> module_src_runtimeBindings_ts
48
+ module_src_runtimeBindings_test_ts --> module_src_runtimeNodeProps_ts
49
+ module_src_runtimeBindings_ts["src/runtimeBindings.ts"]
50
+ package__ankhorage_runtime -.-> module_src_runtimeBindings_ts
51
+ module_src_runtimeDataSourceOperations_test_ts["src/runtimeDataSourceOperations.test.ts"]
52
+ package__ankhorage_runtime -.-> module_src_runtimeDataSourceOperations_test_ts
53
+ module_src_runtimeDataSourceOperations_test_ts --> module_src_runtimeDataSourceOperations_ts
54
+ module_src_runtimeDataSourceOperations_ts["src/runtimeDataSourceOperations.ts"]
55
+ package__ankhorage_runtime -.-> module_src_runtimeDataSourceOperations_ts
56
+ module_src_runtimeDataSourceOperations_ts --> module_src_runtimeBindings_ts
57
+ module_src_runtimeDbPersist_test_ts["src/runtimeDbPersist.test.ts"]
58
+ package__ankhorage_runtime -.-> module_src_runtimeDbPersist_test_ts
59
+ module_src_runtimeDbPersist_test_ts --> module_src_runtimeActionRegistry_ts
60
+ module_src_runtimeDbPersist_test_ts --> module_src_runtimeDbPersist_ts
61
+ module_src_runtimeDbPersist_ts["src/runtimeDbPersist.ts"]
62
+ package__ankhorage_runtime -.-> module_src_runtimeDbPersist_ts
63
+ module_src_runtimeDbPersist_ts --> module_src_RuntimeRendererConfig_tsx
64
+ module_src_runtimeEventExecution_test_ts["src/runtimeEventExecution.test.ts"]
65
+ package__ankhorage_runtime -.-> module_src_runtimeEventExecution_test_ts
66
+ module_src_runtimeEventExecution_test_ts --> module_src_runtimeEventExecution_ts
67
+ module_src_runtimeEventExecution_ts["src/runtimeEventExecution.ts"]
68
+ package__ankhorage_runtime -.-> module_src_runtimeEventExecution_ts
69
+ module_src_runtimeEventExecution_ts --> module_src_runtimeActionRegistry_ts
70
+ module_src_runtimeEventExecution_ts --> module_src_RuntimeRendererConfig_tsx
71
+ module_src_runtimeManifest_ts["src/runtimeManifest.ts"]
72
+ package__ankhorage_runtime -.-> module_src_runtimeManifest_ts
73
+ module_src_runtimeNodeProps_test_ts["src/runtimeNodeProps.test.ts"]
74
+ package__ankhorage_runtime -.-> module_src_runtimeNodeProps_test_ts
75
+ module_src_runtimeNodeProps_test_ts --> module_src_runtimeNodeProps_ts
76
+ module_src_runtimeNodeProps_ts["src/runtimeNodeProps.ts"]
77
+ package__ankhorage_runtime -.-> module_src_runtimeNodeProps_ts
78
+ module_src_runtimeNodeProps_ts --> module_src_runtimeBindings_ts
79
+ module_src_runtimeNodeProps_ts --> module_src_RuntimeRendererConfig_tsx
80
+ module_src_runtimePackageIsolation_test_ts["src/runtimePackageIsolation.test.ts"]
81
+ package__ankhorage_runtime -.-> module_src_runtimePackageIsolation_test_ts
82
+ module_src_RuntimeRenderer_test_ts["src/RuntimeRenderer.test.ts"]
83
+ package__ankhorage_runtime -.-> module_src_RuntimeRenderer_test_ts
84
+ module_src_RuntimeRenderer_test_ts --> module_src_runtimeRepeatEmptyState_ts
85
+ module_src_RuntimeRenderer_tsx["src/RuntimeRenderer.tsx"]
86
+ package__ankhorage_runtime -.-> module_src_RuntimeRenderer_tsx
87
+ module_src_RuntimeRenderer_tsx --> module_src_registry_tsx
88
+ module_src_RuntimeRenderer_tsx --> module_src_rendering_ts
89
+ module_src_RuntimeRenderer_tsx --> module_src_runtimeActionRegistry_ts
90
+ module_src_RuntimeRenderer_tsx --> module_src_runtimeBindings_ts
91
+ module_src_RuntimeRenderer_tsx --> module_src_runtimeDbPersist_ts
92
+ module_src_RuntimeRenderer_tsx --> module_src_runtimeEventExecution_ts
93
+ module_src_RuntimeRenderer_tsx --> module_src_runtimeNodeProps_ts
94
+ module_src_RuntimeRenderer_tsx --> module_src_RuntimeRendererConfig_tsx
95
+ module_src_RuntimeRenderer_tsx --> module_src_runtimeRepeat_ts
96
+ module_src_RuntimeRenderer_tsx --> module_src_runtimeRepeatDiagnostics_ts
97
+ module_src_RuntimeRenderer_tsx --> module_src_runtimeRepeatEmptyState_ts
98
+ module_src_RuntimeRendererConfig_test_tsx["src/RuntimeRendererConfig.test.tsx"]
99
+ package__ankhorage_runtime -.-> module_src_RuntimeRendererConfig_test_tsx
100
+ module_src_RuntimeRendererConfig_test_tsx --> module_src_RuntimeRendererConfig_tsx
101
+ module_src_RuntimeRendererConfig_tsx["src/RuntimeRendererConfig.tsx"]
102
+ package__ankhorage_runtime -.-> module_src_RuntimeRendererConfig_tsx
103
+ module_src_RuntimeRendererConfig_tsx --> module_src_registry_tsx
104
+ module_src_RuntimeRendererConfig_tsx --> module_src_runtimeBindings_ts
105
+ module_src_runtimeRepeat_test_ts["src/runtimeRepeat.test.ts"]
106
+ package__ankhorage_runtime -.-> module_src_runtimeRepeat_test_ts
107
+ module_src_runtimeRepeat_test_ts --> module_src_runtimeActionRegistry_ts
108
+ module_src_runtimeRepeat_test_ts --> module_src_runtimeBindings_ts
109
+ module_src_runtimeRepeat_test_ts --> module_src_runtimeRepeat_ts
110
+ module_src_runtimeRepeat_ts["src/runtimeRepeat.ts"]
111
+ package__ankhorage_runtime -.-> module_src_runtimeRepeat_ts
112
+ module_src_runtimeRepeat_ts --> module_src_runtimeBindings_ts
113
+ module_src_runtimeRepeatDiagnostics_ts["src/runtimeRepeatDiagnostics.ts"]
114
+ package__ankhorage_runtime -.-> module_src_runtimeRepeatDiagnostics_ts
115
+ module_src_runtimeRepeatEmptyState_ts["src/runtimeRepeatEmptyState.ts"]
116
+ package__ankhorage_runtime -.-> module_src_runtimeRepeatEmptyState_ts
117
+ module_src_RuntimeScreen_tsx["src/RuntimeScreen.tsx"]
118
+ package__ankhorage_runtime -.-> module_src_RuntimeScreen_tsx
119
+ module_src_RuntimeScreen_tsx --> module_src_registry_tsx
120
+ module_src_RuntimeScreen_tsx --> module_src_runtimeApiLoaders_ts
121
+ module_src_RuntimeScreen_tsx --> module_src_RuntimeRenderer_tsx
122
+ module_src_RuntimeScreen_tsx --> module_src_RuntimeRendererConfig_tsx
123
+ module_src_RuntimeScreen_tsx --> module_src_runtimeScreenLoaders_ts
124
+ module_src_runtimeScreenLoaders_arrayPath_test_ts["src/runtimeScreenLoaders.arrayPath.test.ts"]
125
+ package__ankhorage_runtime -.-> module_src_runtimeScreenLoaders_arrayPath_test_ts
126
+ module_src_runtimeScreenLoaders_arrayPath_test_ts --> module_src_runtimeBindings_ts
127
+ module_src_runtimeScreenLoaders_arrayPath_test_ts --> module_src_runtimeScreenLoaders_ts
128
+ module_src_runtimeScreenLoaders_test_ts["src/runtimeScreenLoaders.test.ts"]
129
+ package__ankhorage_runtime -.-> module_src_runtimeScreenLoaders_test_ts
130
+ module_src_runtimeScreenLoaders_test_ts --> module_src_runtimeBindings_ts
131
+ module_src_runtimeScreenLoaders_test_ts --> module_src_runtimeScreenLoaders_ts
132
+ module_src_runtimeScreenLoaders_ts["src/runtimeScreenLoaders.ts"]
133
+ package__ankhorage_runtime -.-> module_src_runtimeScreenLoaders_ts
134
+ module_src_runtimeScreenLoaders_ts --> module_src_runtimeBindings_ts
135
+ module_src_runtimeStateAdapter_ts["src/runtimeStateAdapter.ts"]
136
+ package__ankhorage_runtime -.-> module_src_runtimeStateAdapter_ts
137
+ module_src_runtimeStateAdapterConfig_test_ts["src/runtimeStateAdapterConfig.test.ts"]
138
+ package__ankhorage_runtime -.-> module_src_runtimeStateAdapterConfig_test_ts
139
+ module_src_runtimeStateAdapterConfig_test_ts --> module_src_runtimeBindings_ts
140
+ module_src_runtimeStateAdapterConfig_test_ts --> module_src_runtimeNodeProps_ts
141
+ module_src_runtimeStateAdapterConfig_test_ts --> module_src_RuntimeRendererConfig_tsx
8
142
  module_tests_runtime_test_ts["tests/runtime.test.ts"]
9
143
  package__ankhorage_runtime -.-> module_tests_runtime_test_ts
10
- module_tests_runtime_test_ts --> module_src_index_ts
144
+ module_tests_runtime_test_ts --> module_src_runtimeManifest_ts