@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":"runtimeApiLoaders.js","sourceRoot":"","sources":["../src/runtimeApiLoaders.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ApiScreenDataLoaderDefinition,\n AppApiCollectionResourceDefinition,\n AppApiDefinition,\n AppDataManifest,\n AppGeneratedApiDefinition,\n StateAdapter,\n StateResult,\n StateValue,\n} from '@ankhorage/contracts';\nimport React from 'react';\n\nimport { createRuntimeMemoryStateAdapter } from './runtimeStateAdapter';\n\nexport type RuntimeApiLoaderMode = 'byId' | 'list' | 'one' | 'random';\n\nexport type RuntimeApiLoaderDefinition = ApiScreenDataLoaderDefinition;\n\nexport interface RuntimeApiLoaderDiagnostic {\n readonly code:\n | 'invalid-record'\n | 'missing-api'\n | 'missing-target-path'\n | 'state-set-failed'\n | 'unsupported-loader';\n readonly message: string;\n readonly apiId?: string;\n readonly targetPath?: string;\n}\n\nexport interface RuntimeApiLoaderExecutionResult {\n readonly diagnostics: readonly RuntimeApiLoaderDiagnostic[];\n}\n\nexport interface RuntimeApiLoaderMaterializationResult {\n readonly state: Readonly<Record<string, StateValue>>;\n readonly diagnostics: readonly RuntimeApiLoaderDiagnostic[];\n}\n\nexport function materializeRuntimeApiLoaderState(args: {\n readonly data?: AppDataManifest;\n readonly loaders: readonly RuntimeApiLoaderDefinition[];\n}): RuntimeApiLoaderMaterializationResult {\n const state: Record<string, StateValue> = {};\n const diagnostics: RuntimeApiLoaderDiagnostic[] = [];\n\n for (const loader of args.loaders) {\n const targetPath = loader.targetPath.trim();\n if (targetPath.length === 0) {\n diagnostics.push({\n code: 'missing-target-path',\n apiId: loader.apiId,\n message: `API loader for ${loader.apiId} must define a target path.`,\n });\n continue;\n }\n\n const api = args.data?.apis?.[loader.apiId];\n const resource = getGeneratedApiCollectionResource(api);\n if (api?.kind !== 'generated' || resource === null) {\n diagnostics.push({\n code: 'missing-api',\n apiId: loader.apiId,\n targetPath,\n message: `Generated API ${loader.apiId} could not be found.`,\n });\n continue;\n }\n\n const selectedValue = selectApiLoaderValue({ api, resource, loader, diagnostics, targetPath });\n if (selectedValue === undefined) {\n continue;\n }\n\n const stateValue = toStateValue(selectedValue);\n if (stateValue === undefined) {\n diagnostics.push({\n code: 'invalid-record',\n apiId: loader.apiId,\n targetPath,\n message: `Generated API ${loader.apiId} produced a value that cannot be represented as runtime state.`,\n });\n continue;\n }\n\n const setResult = writeObjectPath(state, targetPath, stateValue);\n if (!setResult.ok) {\n diagnostics.push({\n code: 'state-set-failed',\n apiId: loader.apiId,\n targetPath,\n message: setResult.error.message,\n });\n }\n }\n\n return { state, diagnostics };\n}\n\nexport function executeRuntimeApiLoaders(args: {\n readonly data?: AppDataManifest;\n readonly loaders: readonly RuntimeApiLoaderDefinition[];\n readonly stateAdapter: StateAdapter;\n}): RuntimeApiLoaderExecutionResult {\n const materialized = materializeRuntimeApiLoaderState({\n data: args.data,\n loaders: args.loaders,\n });\n const diagnostics: RuntimeApiLoaderDiagnostic[] = [...materialized.diagnostics];\n\n for (const [targetPath, value] of flattenStateEntries(materialized.state)) {\n const result = args.stateAdapter.set(targetPath, value);\n if (!result.ok) {\n diagnostics.push({\n code: 'state-set-failed',\n targetPath,\n message: result.error.message,\n });\n }\n }\n\n return { diagnostics };\n}\n\nexport function useRuntimeApiStateLoaders(args: {\n readonly data?: AppDataManifest;\n readonly loaders?: readonly RuntimeApiLoaderDefinition[];\n readonly stateAdapter?: StateAdapter;\n}): {\n readonly diagnostics: readonly RuntimeApiLoaderDiagnostic[];\n readonly stateAdapter: StateAdapter;\n readonly stateVersion: number;\n} {\n const fallbackStateAdapter = React.useMemo(() => createRuntimeMemoryStateAdapter(), []);\n const stateAdapter = args.stateAdapter ?? fallbackStateAdapter;\n const loaders = args.loaders ?? [];\n const [stateVersion, setStateVersion] = React.useState(0);\n const [diagnostics, setDiagnostics] = React.useState<readonly RuntimeApiLoaderDiagnostic[]>([]);\n\n React.useEffect(() => {\n const result = executeRuntimeApiLoaders({\n data: args.data,\n loaders,\n stateAdapter,\n });\n setDiagnostics(result.diagnostics);\n setStateVersion((current) => current + 1);\n }, [args.data, loaders, stateAdapter]);\n\n return {\n diagnostics,\n stateAdapter,\n stateVersion,\n };\n}\n\nfunction getGeneratedApiCollectionResource(\n api: AppApiDefinition | undefined,\n): AppApiCollectionResourceDefinition | null {\n if (api?.kind !== 'generated' || api.resource?.kind !== 'collection') {\n return null;\n }\n\n return api.resource;\n}\n\nfunction selectApiLoaderValue(args: {\n readonly api: AppGeneratedApiDefinition;\n readonly resource: AppApiCollectionResourceDefinition;\n readonly loader: RuntimeApiLoaderDefinition;\n readonly diagnostics: RuntimeApiLoaderDiagnostic[];\n readonly targetPath: string;\n}): unknown {\n const seed = args.resource.seed ?? [];\n const primaryKey = args.resource.collection.primaryKey ?? 'id';\n\n switch (args.loader.mode) {\n case 'list':\n return seed;\n case 'one':\n return seed[0];\n case 'random': {\n const index = deterministicIndex(args.api.id, seed.length);\n return index === undefined ? undefined : seed[index];\n }\n case 'byId': {\n const loaderId = normalizePrimitiveId(args.loader.id);\n if (loaderId === undefined) return undefined;\n\n return seed.find((record) => {\n return normalizePrimitiveId(record[primaryKey]) === loaderId;\n });\n }\n default:\n args.diagnostics.push({\n code: 'unsupported-loader',\n apiId: args.loader.apiId,\n targetPath: args.targetPath,\n message: `API loader mode ${String(args.loader.mode)} is not supported.`,\n });\n return undefined;\n }\n}\n\nfunction normalizePrimitiveId(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return Number.isFinite(value) ? value.toString() : undefined;\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return undefined;\n}\n\nfunction deterministicIndex(apiId: string, length: number): number | undefined {\n if (length === 0) return undefined;\n\n let hash = 0;\n for (const char of apiId) {\n hash = (hash * 31 + char.charCodeAt(0)) % length;\n }\n\n return hash;\n}\n\nfunction writeObjectPath(\n target: Record<string, StateValue>,\n path: string,\n value: StateValue,\n): StateResult {\n const parts = path\n .split('.')\n .map((part) => part.trim())\n .filter(Boolean);\n const [head, ...tail] = parts;\n\n if (head === undefined) {\n return {\n ok: false,\n error: {\n code: 'invalid_path',\n message: 'State target path must contain at least one segment.',\n },\n };\n }\n\n if (tail.length === 0) {\n target[head] = value;\n return { ok: true };\n }\n\n const existing = target[head];\n const child = existing === undefined ? {} : existing;\n if (!isMutableStateRecord(child)) {\n return {\n ok: false,\n error: {\n code: 'path_conflict',\n message: `Cannot set nested state below non-object path segment \"${head}\".`,\n },\n };\n }\n\n target[head] = child;\n return writeObjectPath(child, tail.join('.'), value);\n}\n\nfunction flattenStateEntries(\n source: Readonly<Record<string, StateValue>>,\n prefix = '',\n): readonly (readonly [string, StateValue])[] {\n return Object.entries(source).flatMap(([key, value]) => {\n const path = prefix.length > 0 ? `${prefix}.${key}` : key;\n return [[path, value]] as const;\n });\n}\n\nfunction toStateValue(value: unknown): StateValue | undefined {\n if (value === null) return null;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const items: StateValue[] = [];\n for (const item of value) {\n const stateItem = toStateValue(item);\n if (stateItem === undefined) return undefined;\n items.push(stateItem);\n }\n return items;\n }\n\n if (!isUnknownRecord(value)) return undefined;\n\n const record: Record<string, StateValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const stateEntry = toStateValue(entry);\n if (stateEntry === undefined) return undefined;\n record[key] = stateEntry;\n }\n\n return record;\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n\nfunction isMutableStateRecord(value: StateValue): value is Record<string, StateValue> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,52 @@
1
+ import type { BindingInputMap, BindingOperationRef, BindingValue, BindingValueSource, ComponentDataBindingRegistry, ComponentEventDto, DataEndpointConfig, DataSourceConfig, DataSourceDiagnostic, DataSourceRegistry, PropBinding, StateAdapter, UiNode } from '@ankhorage/contracts';
2
+ export type RuntimeBindingOperationKey = string;
3
+ export interface RuntimeBindingOperationExecutionArgs {
4
+ readonly operation: BindingOperationRef;
5
+ readonly dataSource: DataSourceConfig;
6
+ readonly endpoint?: DataEndpointConfig;
7
+ readonly input?: BindingValue;
8
+ readonly node?: UiNode;
9
+ }
10
+ export type RuntimeBindingOperationExecutionResult = {
11
+ readonly ok: true;
12
+ readonly data: BindingValue;
13
+ readonly diagnostics?: readonly DataSourceDiagnostic[];
14
+ } | {
15
+ readonly ok: false;
16
+ readonly diagnostics: readonly DataSourceDiagnostic[];
17
+ };
18
+ export type RuntimeBindingOperationExecutor = (args: RuntimeBindingOperationExecutionArgs) => Promise<RuntimeBindingOperationExecutionResult>;
19
+ export type RuntimeBindingOperationResultCache = Readonly<Record<RuntimeBindingOperationKey, BindingValue | undefined>>;
20
+ export type RuntimeBindingOperationResultWriter = (key: RuntimeBindingOperationKey, value: BindingValue) => void;
21
+ export interface RuntimeBindingResolutionContext {
22
+ readonly context?: Record<string, unknown>;
23
+ readonly event?: ComponentEventDto<string, object>;
24
+ readonly stateAdapter?: StateAdapter;
25
+ readonly dataSources?: DataSourceRegistry;
26
+ readonly dataBindings?: ComponentDataBindingRegistry;
27
+ readonly operationResults?: RuntimeBindingOperationResultCache;
28
+ readonly executeOperation?: RuntimeBindingOperationExecutor;
29
+ }
30
+ export interface RuntimeBindingResolutionArgs extends RuntimeBindingResolutionContext {
31
+ readonly node: UiNode;
32
+ readonly props: Record<string, unknown>;
33
+ }
34
+ export interface RuntimeBindingResolutionResult {
35
+ readonly props: Record<string, unknown>;
36
+ readonly diagnostics: readonly DataSourceDiagnostic[];
37
+ }
38
+ export declare function resolveRuntimeBindingsAsync(args: RuntimeBindingResolutionArgs): Promise<RuntimeBindingResolutionResult>;
39
+ export declare function resolveRuntimeBindings(args: RuntimeBindingResolutionArgs): RuntimeBindingResolutionResult;
40
+ export declare function resolveRuntimeBindingValue(binding: PropBinding, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): Promise<unknown>;
41
+ export declare function resolveRuntimeBindingValueSync(binding: PropBinding, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): unknown;
42
+ export declare function resolveBindingInputMap(input: BindingInputMap | undefined, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): Promise<BindingValue | undefined>;
43
+ export declare function resolveBindingInputMapSync(input: BindingInputMap | undefined, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): BindingValue | undefined;
44
+ export declare function createRuntimeBindingOperationKey(operation: BindingOperationRef): RuntimeBindingOperationKey;
45
+ export declare function validateRuntimeBindingOperationRef(operation: BindingOperationRef, dataSources: DataSourceRegistry | undefined): readonly DataSourceDiagnostic[];
46
+ export declare function resolveRuntimeBindingValueSourceSync(source: BindingValueSource, context: RuntimeBindingResolutionContext, diagnostics: DataSourceDiagnostic[]): BindingValue | undefined;
47
+ export declare function resolveRuntimeBindingOperationSelection(operation: BindingOperationRef, dataSources: DataSourceRegistry | undefined, diagnostics: DataSourceDiagnostic[]): {
48
+ readonly dataSource: DataSourceConfig;
49
+ readonly endpoint?: DataEndpointConfig;
50
+ } | undefined;
51
+ export declare function applyRuntimeBindingDataPath(value: BindingValue | undefined, path: string | undefined): BindingValue | undefined;
52
+ //# sourceMappingURL=runtimeBindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeBindings.d.ts","sourceRoot":"","sources":["../src/runtimeBindings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,299 @@
1
+ export async function resolveRuntimeBindingsAsync(args) {
2
+ const diagnostics = [];
3
+ const resolvedProps = { ...args.props };
4
+ const binding = args.dataBindings?.[args.node.id];
5
+ for (const [prop, propBinding] of Object.entries(binding?.props ?? {})) {
6
+ const value = await resolveRuntimeBindingValue(propBinding, args, diagnostics);
7
+ resolvedProps[prop] = value;
8
+ }
9
+ return { props: resolvedProps, diagnostics };
10
+ }
11
+ export function resolveRuntimeBindings(args) {
12
+ const diagnostics = [];
13
+ const resolvedProps = { ...args.props };
14
+ const binding = args.dataBindings?.[args.node.id];
15
+ for (const [prop, propBinding] of Object.entries(binding?.props ?? {})) {
16
+ resolvedProps[prop] = resolveRuntimeBindingValueSync(propBinding, args, diagnostics);
17
+ }
18
+ return { props: resolvedProps, diagnostics };
19
+ }
20
+ export async function resolveRuntimeBindingValue(binding, context, diagnostics = []) {
21
+ const value = await resolveRuntimeBindingValueSource(binding.source, context, diagnostics);
22
+ const transformedValue = applyBindingValueTransforms(value, binding.transforms);
23
+ if (transformedValue !== undefined)
24
+ return transformedValue;
25
+ return resolveBindingFallback(binding.fallback, context, diagnostics);
26
+ }
27
+ export function resolveRuntimeBindingValueSync(binding, context, diagnostics = []) {
28
+ const value = resolveRuntimeBindingValueSourceSync(binding.source, context, diagnostics);
29
+ const transformedValue = applyBindingValueTransforms(value, binding.transforms);
30
+ if (transformedValue !== undefined)
31
+ return transformedValue;
32
+ return resolveBindingFallbackSync(binding.fallback, context, diagnostics);
33
+ }
34
+ export async function resolveBindingInputMap(input, context, diagnostics = []) {
35
+ if (input === undefined)
36
+ return undefined;
37
+ const fields = {};
38
+ for (const [key, value] of Object.entries(input)) {
39
+ const resolvedValue = await resolveBindingInputValue(value, context, diagnostics);
40
+ if (resolvedValue !== undefined)
41
+ fields[key] = resolvedValue;
42
+ }
43
+ return fields;
44
+ }
45
+ export function resolveBindingInputMapSync(input, context, diagnostics = []) {
46
+ if (input === undefined)
47
+ return undefined;
48
+ const fields = {};
49
+ for (const [key, value] of Object.entries(input)) {
50
+ const resolvedValue = resolveBindingInputValueSync(value, context, diagnostics);
51
+ if (resolvedValue !== undefined)
52
+ fields[key] = resolvedValue;
53
+ }
54
+ return fields;
55
+ }
56
+ export function createRuntimeBindingOperationKey(operation) {
57
+ return [operation.dataSourceId, operation.endpointId ?? '', operation.operationId].join(':');
58
+ }
59
+ export function validateRuntimeBindingOperationRef(operation, dataSources) {
60
+ const dataSource = dataSources?.[operation.dataSourceId];
61
+ if (dataSource === undefined) {
62
+ return [
63
+ createRuntimeBindingDiagnostic({
64
+ code: 'missing-data-source',
65
+ message: `Data source '${operation.dataSourceId}' could not be found.`,
66
+ operation,
67
+ }),
68
+ ];
69
+ }
70
+ const endpoint = resolveRuntimeBindingEndpoint(operation, dataSource);
71
+ if (endpoint === undefined) {
72
+ return [
73
+ createRuntimeBindingDiagnostic({
74
+ code: 'missing-endpoint',
75
+ dataSourceId: operation.dataSourceId,
76
+ message: `Endpoint '${operation.endpointId ?? '<default>'}' could not be found.`,
77
+ operation,
78
+ }),
79
+ ];
80
+ }
81
+ if (endpoint.operations[operation.operationId] === undefined) {
82
+ return [
83
+ createRuntimeBindingDiagnostic({
84
+ code: 'missing-operation',
85
+ dataSourceId: operation.dataSourceId,
86
+ endpointId: endpoint.id,
87
+ message: `Operation '${operation.operationId}' could not be found.`,
88
+ operation,
89
+ }),
90
+ ];
91
+ }
92
+ return [];
93
+ }
94
+ async function resolveRuntimeBindingValueSource(source, context, diagnostics) {
95
+ if (source.kind !== 'operation') {
96
+ return resolveRuntimeBindingValueSourceSync(source, context, diagnostics);
97
+ }
98
+ const cached = resolveCachedOperationValue(source, context);
99
+ if (cached !== undefined)
100
+ return cached;
101
+ if (context.executeOperation === undefined) {
102
+ diagnostics.push(createRuntimeBindingDiagnostic({
103
+ code: 'missing-adapter',
104
+ message: 'Operation binding requires an injected operation executor.',
105
+ operation: source.operation,
106
+ }));
107
+ return undefined;
108
+ }
109
+ const selection = resolveRuntimeBindingOperationSelection(source.operation, context.dataSources, diagnostics);
110
+ if (selection === undefined)
111
+ return undefined;
112
+ const result = await context.executeOperation({
113
+ operation: source.operation,
114
+ dataSource: selection.dataSource,
115
+ endpoint: selection.endpoint,
116
+ });
117
+ diagnostics.push(...(result.diagnostics ?? []));
118
+ if (!result.ok)
119
+ return undefined;
120
+ return applyRuntimeBindingDataPath(result.data, source.path);
121
+ }
122
+ export function resolveRuntimeBindingValueSourceSync(source, context, diagnostics) {
123
+ switch (source.kind) {
124
+ case 'context':
125
+ return asBindingValue(readPath(context.context, source.path));
126
+ case 'event':
127
+ return asBindingValue(readPath(context.event, source.path));
128
+ case 'literal':
129
+ return source.value;
130
+ case 'operation': {
131
+ const cached = resolveCachedOperationValue(source, context);
132
+ if (cached !== undefined)
133
+ return cached;
134
+ diagnostics.push(createRuntimeBindingDiagnostic({
135
+ code: 'missing-adapter',
136
+ message: 'Synchronous operation bindings require preloaded operation results.',
137
+ operation: source.operation,
138
+ }));
139
+ return undefined;
140
+ }
141
+ case 'state': {
142
+ const result = context.stateAdapter?.get(source.path);
143
+ return result?.ok ? asBindingValue(result.data) : undefined;
144
+ }
145
+ }
146
+ }
147
+ function resolveCachedOperationValue(source, context) {
148
+ const operationKey = createRuntimeBindingOperationKey(source.operation);
149
+ const cachedValue = context.operationResults?.[operationKey];
150
+ return applyRuntimeBindingDataPath(cachedValue, source.path);
151
+ }
152
+ async function resolveBindingFallback(fallback, context, diagnostics) {
153
+ if (fallback === undefined)
154
+ return undefined;
155
+ if (fallback.value !== undefined)
156
+ return fallback.value;
157
+ if (fallback.source === undefined)
158
+ return undefined;
159
+ return resolveRuntimeBindingValueSource(fallback.source, context, diagnostics);
160
+ }
161
+ function resolveBindingFallbackSync(fallback, context, diagnostics) {
162
+ if (fallback === undefined)
163
+ return undefined;
164
+ if (fallback.value !== undefined)
165
+ return fallback.value;
166
+ if (fallback.source === undefined)
167
+ return undefined;
168
+ return resolveRuntimeBindingValueSourceSync(fallback.source, context, diagnostics);
169
+ }
170
+ async function resolveBindingInputValue(input, context, diagnostics) {
171
+ if (input.kind === 'literal')
172
+ return input.value;
173
+ if (input.kind === 'source') {
174
+ const value = await resolveRuntimeBindingValueSource(input.source, context, diagnostics);
175
+ return applyBindingValueTransforms(value, input.transforms);
176
+ }
177
+ if (input.kind === 'array') {
178
+ const items = [];
179
+ for (const item of input.items) {
180
+ const value = await resolveBindingInputValue(item, context, diagnostics);
181
+ if (value !== undefined)
182
+ items.push(value);
183
+ }
184
+ return items;
185
+ }
186
+ const fields = {};
187
+ for (const [key, value] of Object.entries(input.fields)) {
188
+ const resolvedValue = await resolveBindingInputValue(value, context, diagnostics);
189
+ if (resolvedValue !== undefined)
190
+ fields[key] = resolvedValue;
191
+ }
192
+ return fields;
193
+ }
194
+ function resolveBindingInputValueSync(input, context, diagnostics) {
195
+ if (input.kind === 'literal')
196
+ return input.value;
197
+ if (input.kind === 'source') {
198
+ const value = resolveRuntimeBindingValueSourceSync(input.source, context, diagnostics);
199
+ return applyBindingValueTransforms(value, input.transforms);
200
+ }
201
+ if (input.kind === 'array') {
202
+ const items = [];
203
+ for (const item of input.items) {
204
+ const value = resolveBindingInputValueSync(item, context, diagnostics);
205
+ if (value !== undefined)
206
+ items.push(value);
207
+ }
208
+ return items;
209
+ }
210
+ const fields = {};
211
+ for (const [key, value] of Object.entries(input.fields)) {
212
+ const resolvedValue = resolveBindingInputValueSync(value, context, diagnostics);
213
+ if (resolvedValue !== undefined)
214
+ fields[key] = resolvedValue;
215
+ }
216
+ return fields;
217
+ }
218
+ export function resolveRuntimeBindingOperationSelection(operation, dataSources, diagnostics) {
219
+ const validationDiagnostics = validateRuntimeBindingOperationRef(operation, dataSources);
220
+ diagnostics.push(...validationDiagnostics);
221
+ if (validationDiagnostics.length > 0)
222
+ return undefined;
223
+ const dataSource = dataSources?.[operation.dataSourceId];
224
+ if (dataSource === undefined)
225
+ return undefined;
226
+ return {
227
+ dataSource,
228
+ endpoint: resolveRuntimeBindingEndpoint(operation, dataSource),
229
+ };
230
+ }
231
+ function resolveRuntimeBindingEndpoint(operation, dataSource) {
232
+ if (operation.endpointId !== undefined)
233
+ return dataSource.endpoints[operation.endpointId];
234
+ return Object.values(dataSource.endpoints).find((endpoint) => endpoint.operations[operation.operationId] !== undefined);
235
+ }
236
+ function createRuntimeBindingDiagnostic(args) {
237
+ return {
238
+ code: args.code,
239
+ dataSourceId: args.dataSourceId ?? args.operation.dataSourceId,
240
+ endpointId: args.endpointId ?? args.operation.endpointId,
241
+ operationId: args.operation.operationId,
242
+ message: args.message,
243
+ severity: 'error',
244
+ };
245
+ }
246
+ function applyBindingValueTransforms(value, transforms) {
247
+ const bindingValue = asBindingValue(value);
248
+ if (typeof bindingValue !== 'string' || transforms === undefined)
249
+ return bindingValue;
250
+ let currentValue = bindingValue;
251
+ for (const transform of transforms) {
252
+ if (transform === 'lowercase')
253
+ currentValue = currentValue.toLowerCase();
254
+ if (transform === 'trim')
255
+ currentValue = currentValue.trim();
256
+ if (transform === 'uppercase')
257
+ currentValue = currentValue.toUpperCase();
258
+ }
259
+ return currentValue;
260
+ }
261
+ export function applyRuntimeBindingDataPath(value, path) {
262
+ if (path === undefined)
263
+ return value;
264
+ return asBindingValue(readPath(value, path));
265
+ }
266
+ function readPath(source, path) {
267
+ return path.split('.').reduce((currentValue, part) => {
268
+ if (Array.isArray(currentValue)) {
269
+ if (!isArrayIndexPathPart(part))
270
+ return undefined;
271
+ return currentValue[Number(part)];
272
+ }
273
+ if (!isRecord(currentValue))
274
+ return undefined;
275
+ return currentValue[part];
276
+ }, source);
277
+ }
278
+ function isArrayIndexPathPart(part) {
279
+ return /^(0|[1-9]\d*)$/.test(part);
280
+ }
281
+ function asBindingValue(value) {
282
+ return isBindingValue(value) ? value : undefined;
283
+ }
284
+ function isBindingValue(value) {
285
+ if (value === null)
286
+ return true;
287
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
288
+ return true;
289
+ }
290
+ if (Array.isArray(value))
291
+ return value.every(isBindingValue);
292
+ if (!isRecord(value))
293
+ return false;
294
+ return Object.values(value).every(isBindingValue);
295
+ }
296
+ function isRecord(value) {
297
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
298
+ }
299
+ //# sourceMappingURL=runtimeBindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeBindings.js","sourceRoot":"","sources":["../src/runtimeBindings.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n BindingFallback,\n BindingInputMap,\n BindingInputValue,\n BindingOperationRef,\n BindingValue,\n BindingValueSource,\n BindingValueTransform,\n ComponentDataBindingRegistry,\n ComponentEventDto,\n DataEndpointConfig,\n DataSourceConfig,\n DataSourceDiagnostic,\n DataSourceRegistry,\n PropBinding,\n StateAdapter,\n UiNode,\n} from '@ankhorage/contracts';\n\nexport type RuntimeBindingOperationKey = string;\n\nexport interface RuntimeBindingOperationExecutionArgs {\n readonly operation: BindingOperationRef;\n readonly dataSource: DataSourceConfig;\n readonly endpoint?: DataEndpointConfig;\n readonly input?: BindingValue;\n readonly node?: UiNode;\n}\n\nexport type RuntimeBindingOperationExecutionResult =\n | {\n readonly ok: true;\n readonly data: BindingValue;\n readonly diagnostics?: readonly DataSourceDiagnostic[];\n }\n | {\n readonly ok: false;\n readonly diagnostics: readonly DataSourceDiagnostic[];\n };\n\nexport type RuntimeBindingOperationExecutor = (\n args: RuntimeBindingOperationExecutionArgs,\n) => Promise<RuntimeBindingOperationExecutionResult>;\n\nexport type RuntimeBindingOperationResultCache = Readonly<\n Record<RuntimeBindingOperationKey, BindingValue | undefined>\n>;\n\nexport type RuntimeBindingOperationResultWriter = (\n key: RuntimeBindingOperationKey,\n value: BindingValue,\n) => void;\n\nexport interface RuntimeBindingResolutionContext {\n readonly context?: Record<string, unknown>;\n readonly event?: ComponentEventDto<string, object>;\n readonly stateAdapter?: StateAdapter;\n readonly dataSources?: DataSourceRegistry;\n readonly dataBindings?: ComponentDataBindingRegistry;\n readonly operationResults?: RuntimeBindingOperationResultCache;\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n}\n\nexport interface RuntimeBindingResolutionArgs extends RuntimeBindingResolutionContext {\n readonly node: UiNode;\n readonly props: Record<string, unknown>;\n}\n\nexport interface RuntimeBindingResolutionResult {\n readonly props: Record<string, unknown>;\n readonly diagnostics: readonly DataSourceDiagnostic[];\n}\n\nexport async function resolveRuntimeBindingsAsync(\n args: RuntimeBindingResolutionArgs,\n): Promise<RuntimeBindingResolutionResult> {\n const diagnostics: DataSourceDiagnostic[] = [];\n const resolvedProps: Record<string, unknown> = { ...args.props };\n const binding = args.dataBindings?.[args.node.id];\n\n for (const [prop, propBinding] of Object.entries(binding?.props ?? {})) {\n const value = await resolveRuntimeBindingValue(propBinding, args, diagnostics);\n resolvedProps[prop] = value;\n }\n\n return { props: resolvedProps, diagnostics };\n}\n\nexport function resolveRuntimeBindings(\n args: RuntimeBindingResolutionArgs,\n): RuntimeBindingResolutionResult {\n const diagnostics: DataSourceDiagnostic[] = [];\n const resolvedProps: Record<string, unknown> = { ...args.props };\n const binding = args.dataBindings?.[args.node.id];\n\n for (const [prop, propBinding] of Object.entries(binding?.props ?? {})) {\n resolvedProps[prop] = resolveRuntimeBindingValueSync(propBinding, args, diagnostics);\n }\n\n return { props: resolvedProps, diagnostics };\n}\n\nexport async function resolveRuntimeBindingValue(\n binding: PropBinding,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): Promise<unknown> {\n const value = await resolveRuntimeBindingValueSource(binding.source, context, diagnostics);\n const transformedValue = applyBindingValueTransforms(value, binding.transforms);\n\n if (transformedValue !== undefined) return transformedValue;\n\n return resolveBindingFallback(binding.fallback, context, diagnostics);\n}\n\nexport function resolveRuntimeBindingValueSync(\n binding: PropBinding,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): unknown {\n const value = resolveRuntimeBindingValueSourceSync(binding.source, context, diagnostics);\n const transformedValue = applyBindingValueTransforms(value, binding.transforms);\n\n if (transformedValue !== undefined) return transformedValue;\n\n return resolveBindingFallbackSync(binding.fallback, context, diagnostics);\n}\n\nexport async function resolveBindingInputMap(\n input: BindingInputMap | undefined,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): Promise<BindingValue | undefined> {\n if (input === undefined) return undefined;\n\n const fields: Record<string, BindingValue> = {};\n\n for (const [key, value] of Object.entries(input)) {\n const resolvedValue = await resolveBindingInputValue(value, context, diagnostics);\n if (resolvedValue !== undefined) fields[key] = resolvedValue;\n }\n\n return fields;\n}\n\nexport function resolveBindingInputMapSync(\n input: BindingInputMap | undefined,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): BindingValue | undefined {\n if (input === undefined) return undefined;\n\n const fields: Record<string, BindingValue> = {};\n\n for (const [key, value] of Object.entries(input)) {\n const resolvedValue = resolveBindingInputValueSync(value, context, diagnostics);\n if (resolvedValue !== undefined) fields[key] = resolvedValue;\n }\n\n return fields;\n}\n\nexport function createRuntimeBindingOperationKey(\n operation: BindingOperationRef,\n): RuntimeBindingOperationKey {\n return [operation.dataSourceId, operation.endpointId ?? '', operation.operationId].join(':');\n}\n\nexport function validateRuntimeBindingOperationRef(\n operation: BindingOperationRef,\n dataSources: DataSourceRegistry | undefined,\n): readonly DataSourceDiagnostic[] {\n const dataSource = dataSources?.[operation.dataSourceId];\n if (dataSource === undefined) {\n return [\n createRuntimeBindingDiagnostic({\n code: 'missing-data-source',\n message: `Data source '${operation.dataSourceId}' could not be found.`,\n operation,\n }),\n ];\n }\n\n const endpoint = resolveRuntimeBindingEndpoint(operation, dataSource);\n if (endpoint === undefined) {\n return [\n createRuntimeBindingDiagnostic({\n code: 'missing-endpoint',\n dataSourceId: operation.dataSourceId,\n message: `Endpoint '${operation.endpointId ?? '<default>'}' could not be found.`,\n operation,\n }),\n ];\n }\n\n if (endpoint.operations[operation.operationId] === undefined) {\n return [\n createRuntimeBindingDiagnostic({\n code: 'missing-operation',\n dataSourceId: operation.dataSourceId,\n endpointId: endpoint.id,\n message: `Operation '${operation.operationId}' could not be found.`,\n operation,\n }),\n ];\n }\n\n return [];\n}\n\nasync function resolveRuntimeBindingValueSource(\n source: BindingValueSource,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): Promise<BindingValue | undefined> {\n if (source.kind !== 'operation') {\n return resolveRuntimeBindingValueSourceSync(source, context, diagnostics);\n }\n\n const cached = resolveCachedOperationValue(source, context);\n if (cached !== undefined) return cached;\n\n if (context.executeOperation === undefined) {\n diagnostics.push(\n createRuntimeBindingDiagnostic({\n code: 'missing-adapter',\n message: 'Operation binding requires an injected operation executor.',\n operation: source.operation,\n }),\n );\n return undefined;\n }\n\n const selection = resolveRuntimeBindingOperationSelection(\n source.operation,\n context.dataSources,\n diagnostics,\n );\n if (selection === undefined) return undefined;\n\n const result = await context.executeOperation({\n operation: source.operation,\n dataSource: selection.dataSource,\n endpoint: selection.endpoint,\n });\n\n diagnostics.push(...(result.diagnostics ?? []));\n if (!result.ok) return undefined;\n\n return applyRuntimeBindingDataPath(result.data, source.path);\n}\n\nexport function resolveRuntimeBindingValueSourceSync(\n source: BindingValueSource,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): BindingValue | undefined {\n switch (source.kind) {\n case 'context':\n return asBindingValue(readPath(context.context, source.path));\n case 'event':\n return asBindingValue(readPath(context.event, source.path));\n case 'literal':\n return source.value;\n case 'operation': {\n const cached = resolveCachedOperationValue(source, context);\n if (cached !== undefined) return cached;\n diagnostics.push(\n createRuntimeBindingDiagnostic({\n code: 'missing-adapter',\n message: 'Synchronous operation bindings require preloaded operation results.',\n operation: source.operation,\n }),\n );\n return undefined;\n }\n case 'state': {\n const result = context.stateAdapter?.get(source.path);\n return result?.ok ? asBindingValue(result.data) : undefined;\n }\n }\n}\n\nfunction resolveCachedOperationValue(\n source: Extract<BindingValueSource, { readonly kind: 'operation' }>,\n context: RuntimeBindingResolutionContext,\n): BindingValue | undefined {\n const operationKey = createRuntimeBindingOperationKey(source.operation);\n const cachedValue = context.operationResults?.[operationKey];\n\n return applyRuntimeBindingDataPath(cachedValue, source.path);\n}\n\nasync function resolveBindingFallback(\n fallback: BindingFallback | undefined,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): Promise<unknown> {\n if (fallback === undefined) return undefined;\n if (fallback.value !== undefined) return fallback.value;\n if (fallback.source === undefined) return undefined;\n\n return resolveRuntimeBindingValueSource(fallback.source, context, diagnostics);\n}\n\nfunction resolveBindingFallbackSync(\n fallback: BindingFallback | undefined,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): unknown {\n if (fallback === undefined) return undefined;\n if (fallback.value !== undefined) return fallback.value;\n if (fallback.source === undefined) return undefined;\n\n return resolveRuntimeBindingValueSourceSync(fallback.source, context, diagnostics);\n}\n\nasync function resolveBindingInputValue(\n input: BindingInputValue,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): Promise<BindingValue | undefined> {\n if (input.kind === 'literal') return input.value;\n if (input.kind === 'source') {\n const value = await resolveRuntimeBindingValueSource(input.source, context, diagnostics);\n return applyBindingValueTransforms(value, input.transforms);\n }\n\n if (input.kind === 'array') {\n const items: BindingValue[] = [];\n\n for (const item of input.items) {\n const value = await resolveBindingInputValue(item, context, diagnostics);\n if (value !== undefined) items.push(value);\n }\n\n return items;\n }\n\n const fields: Record<string, BindingValue> = {};\n\n for (const [key, value] of Object.entries(input.fields)) {\n const resolvedValue = await resolveBindingInputValue(value, context, diagnostics);\n if (resolvedValue !== undefined) fields[key] = resolvedValue;\n }\n\n return fields;\n}\n\nfunction resolveBindingInputValueSync(\n input: BindingInputValue,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): BindingValue | undefined {\n if (input.kind === 'literal') return input.value;\n if (input.kind === 'source') {\n const value = resolveRuntimeBindingValueSourceSync(input.source, context, diagnostics);\n return applyBindingValueTransforms(value, input.transforms);\n }\n\n if (input.kind === 'array') {\n const items: BindingValue[] = [];\n\n for (const item of input.items) {\n const value = resolveBindingInputValueSync(item, context, diagnostics);\n if (value !== undefined) items.push(value);\n }\n\n return items;\n }\n\n const fields: Record<string, BindingValue> = {};\n\n for (const [key, value] of Object.entries(input.fields)) {\n const resolvedValue = resolveBindingInputValueSync(value, context, diagnostics);\n if (resolvedValue !== undefined) fields[key] = resolvedValue;\n }\n\n return fields;\n}\n\nexport function resolveRuntimeBindingOperationSelection(\n operation: BindingOperationRef,\n dataSources: DataSourceRegistry | undefined,\n diagnostics: DataSourceDiagnostic[],\n): { readonly dataSource: DataSourceConfig; readonly endpoint?: DataEndpointConfig } | undefined {\n const validationDiagnostics = validateRuntimeBindingOperationRef(operation, dataSources);\n diagnostics.push(...validationDiagnostics);\n if (validationDiagnostics.length > 0) return undefined;\n\n const dataSource = dataSources?.[operation.dataSourceId];\n if (dataSource === undefined) return undefined;\n\n return {\n dataSource,\n endpoint: resolveRuntimeBindingEndpoint(operation, dataSource),\n };\n}\n\nfunction resolveRuntimeBindingEndpoint(\n operation: BindingOperationRef,\n dataSource: DataSourceConfig,\n): DataEndpointConfig | undefined {\n if (operation.endpointId !== undefined) return dataSource.endpoints[operation.endpointId];\n\n return Object.values(dataSource.endpoints).find(\n (endpoint) => endpoint.operations[operation.operationId] !== undefined,\n );\n}\n\nfunction createRuntimeBindingDiagnostic(args: {\n readonly code: DataSourceDiagnostic['code'];\n readonly message: string;\n readonly operation: BindingOperationRef;\n readonly dataSourceId?: string;\n readonly endpointId?: string;\n}): DataSourceDiagnostic {\n return {\n code: args.code,\n dataSourceId: args.dataSourceId ?? args.operation.dataSourceId,\n endpointId: args.endpointId ?? args.operation.endpointId,\n operationId: args.operation.operationId,\n message: args.message,\n severity: 'error',\n };\n}\n\nfunction applyBindingValueTransforms(\n value: unknown,\n transforms: readonly BindingValueTransform[] | undefined,\n): BindingValue | undefined {\n const bindingValue = asBindingValue(value);\n if (typeof bindingValue !== 'string' || transforms === undefined) return bindingValue;\n\n let currentValue = bindingValue;\n\n for (const transform of transforms) {\n if (transform === 'lowercase') currentValue = currentValue.toLowerCase();\n if (transform === 'trim') currentValue = currentValue.trim();\n if (transform === 'uppercase') currentValue = currentValue.toUpperCase();\n }\n\n return currentValue;\n}\n\nexport function applyRuntimeBindingDataPath(\n value: BindingValue | undefined,\n path: string | undefined,\n): BindingValue | undefined {\n if (path === undefined) return value;\n return asBindingValue(readPath(value, path));\n}\n\nfunction readPath(source: unknown, path: string): unknown {\n return path.split('.').reduce<unknown>((currentValue, part) => {\n if (Array.isArray(currentValue)) {\n if (!isArrayIndexPathPart(part)) return undefined;\n return currentValue[Number(part)];\n }\n\n if (!isRecord(currentValue)) return undefined;\n return currentValue[part];\n }, source);\n}\n\nfunction isArrayIndexPathPart(part: string): boolean {\n return /^(0|[1-9]\\d*)$/.test(part);\n}\n\nfunction asBindingValue(value: unknown): BindingValue | undefined {\n return isBindingValue(value) ? value : undefined;\n}\n\nfunction isBindingValue(value: unknown): value is BindingValue {\n if (value === null) return true;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return true;\n }\n\n if (Array.isArray(value)) return value.every(isBindingValue);\n if (!isRecord(value)) return false;\n\n return Object.values(value).every(isBindingValue);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { EndpointTestCredentialResolver, EndpointTestFetch } from '@ankhorage/data-sources';
2
+ import type { RuntimeBindingOperationExecutor } from './runtimeBindings';
3
+ export interface RuntimeDataSourceOperationExecutorOptions {
4
+ readonly fetch: EndpointTestFetch;
5
+ readonly credentialResolver?: EndpointTestCredentialResolver;
6
+ }
7
+ export declare function createRuntimeDataSourceOperationExecutor(options: RuntimeDataSourceOperationExecutorOptions): RuntimeBindingOperationExecutor;
8
+ //# sourceMappingURL=runtimeDataSourceOperations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeDataSourceOperations.d.ts","sourceRoot":"","sources":["../src/runtimeDataSourceOperations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjG,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,yCAAyC;IACxD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,8BAA8B,CAAC;CAC9D;AAED,wBAAgB,wCAAwC,CACtD,OAAO,EAAE,yCAAyC,GACjD,+BAA+B,CAqDjC"}
@@ -0,0 +1,58 @@
1
+ import { testEndpoint } from '@ankhorage/data-sources';
2
+ export function createRuntimeDataSourceOperationExecutor(options) {
3
+ return async ({ dataSource, endpoint, input, operation }) => {
4
+ if (endpoint === undefined) {
5
+ return {
6
+ ok: false,
7
+ diagnostics: [
8
+ createRuntimeDataSourceOperationDiagnostic(operation.dataSourceId, operation.endpointId, operation.operationId, `Endpoint '${operation.endpointId ?? '<default>'}' could not be found.`),
9
+ ],
10
+ };
11
+ }
12
+ const values = asBindingValueRecord(input);
13
+ if (input !== undefined && values === undefined) {
14
+ return {
15
+ ok: false,
16
+ diagnostics: [
17
+ createRuntimeDataSourceOperationDiagnostic(operation.dataSourceId, endpoint.id, operation.operationId, 'Operation input must resolve to an object.'),
18
+ ],
19
+ };
20
+ }
21
+ const result = await testEndpoint({
22
+ credentialResolver: options.credentialResolver,
23
+ dataSource,
24
+ endpointId: endpoint.id,
25
+ fetch: options.fetch,
26
+ operationId: operation.operationId,
27
+ values,
28
+ });
29
+ if (!result.ok) {
30
+ return {
31
+ ok: false,
32
+ diagnostics: result.diagnostics,
33
+ };
34
+ }
35
+ return {
36
+ ok: true,
37
+ data: result.data ?? null,
38
+ diagnostics: result.diagnostics,
39
+ };
40
+ };
41
+ }
42
+ function createRuntimeDataSourceOperationDiagnostic(dataSourceId, endpointId, operationId, message) {
43
+ return {
44
+ code: 'invalid-config',
45
+ dataSourceId,
46
+ endpointId,
47
+ operationId,
48
+ message,
49
+ severity: 'error',
50
+ };
51
+ }
52
+ function asBindingValueRecord(value) {
53
+ return isBindingValueRecord(value) ? value : undefined;
54
+ }
55
+ function isBindingValueRecord(value) {
56
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
57
+ }
58
+ //# sourceMappingURL=runtimeDataSourceOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeDataSourceOperations.js","sourceRoot":"","sources":["../src/runtimeDataSourceOperations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AASvD,MAAM,UAAU,wCAAwC,CACtD,OAAkD;IAElD,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;QAC1D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,WAAW,EAAE;oBACX,0CAA0C,CACxC,SAAS,CAAC,YAAY,EACtB,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,WAAW,EACrB,aAAa,SAAS,CAAC,UAAU,IAAI,WAAW,uBAAuB,CACxE;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,WAAW,EAAE;oBACX,0CAA0C,CACxC,SAAS,CAAC,YAAY,EACtB,QAAQ,CAAC,EAAE,EACX,SAAS,CAAC,WAAW,EACrB,4CAA4C,CAC7C;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,UAAU;YACV,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;YACzB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,0CAA0C,CACjD,YAAoB,EACpB,UAA8B,EAC9B,WAAmB,EACnB,OAAe;IAEf,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,YAAY;QACZ,UAAU;QACV,WAAW;QACX,OAAO;QACP,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAA+B;IAE/B,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAA+B;IAE/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import type { BindingValue, DataSourceDiagnostic } from '@ankhorage/contracts';\nimport type { EndpointTestCredentialResolver, EndpointTestFetch } from '@ankhorage/data-sources';\nimport { testEndpoint } from '@ankhorage/data-sources';\n\nimport type { RuntimeBindingOperationExecutor } from './runtimeBindings';\n\nexport interface RuntimeDataSourceOperationExecutorOptions {\n readonly fetch: EndpointTestFetch;\n readonly credentialResolver?: EndpointTestCredentialResolver;\n}\n\nexport function createRuntimeDataSourceOperationExecutor(\n options: RuntimeDataSourceOperationExecutorOptions,\n): RuntimeBindingOperationExecutor {\n return async ({ dataSource, endpoint, input, operation }) => {\n if (endpoint === undefined) {\n return {\n ok: false,\n diagnostics: [\n createRuntimeDataSourceOperationDiagnostic(\n operation.dataSourceId,\n operation.endpointId,\n operation.operationId,\n `Endpoint '${operation.endpointId ?? '<default>'}' could not be found.`,\n ),\n ],\n };\n }\n\n const values = asBindingValueRecord(input);\n if (input !== undefined && values === undefined) {\n return {\n ok: false,\n diagnostics: [\n createRuntimeDataSourceOperationDiagnostic(\n operation.dataSourceId,\n endpoint.id,\n operation.operationId,\n 'Operation input must resolve to an object.',\n ),\n ],\n };\n }\n\n const result = await testEndpoint({\n credentialResolver: options.credentialResolver,\n dataSource,\n endpointId: endpoint.id,\n fetch: options.fetch,\n operationId: operation.operationId,\n values,\n });\n\n if (!result.ok) {\n return {\n ok: false,\n diagnostics: result.diagnostics,\n };\n }\n\n return {\n ok: true,\n data: result.data ?? null,\n diagnostics: result.diagnostics,\n };\n };\n}\n\nfunction createRuntimeDataSourceOperationDiagnostic(\n dataSourceId: string,\n endpointId: string | undefined,\n operationId: string,\n message: string,\n): DataSourceDiagnostic {\n return {\n code: 'invalid-config',\n dataSourceId,\n endpointId,\n operationId,\n message,\n severity: 'error',\n };\n}\n\nfunction asBindingValueRecord(\n value: BindingValue | undefined,\n): Readonly<Record<string, BindingValue>> | undefined {\n return isBindingValueRecord(value) ? value : undefined;\n}\n\nfunction isBindingValueRecord(\n value: BindingValue | undefined,\n): value is Readonly<Record<string, BindingValue>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,34 @@
1
+ import type { DbAdapter, DbAdapterError, DbInsertInput, DbRecord, DbResult } from '@ankhorage/contracts';
2
+ import type { RuntimeActionHandler, RuntimeActionHandlerArgs } from './RuntimeRendererConfig';
3
+ export interface RuntimeDbPersistResult {
4
+ readonly input: DbInsertInput;
5
+ readonly result: DbResult<DbRecord[]>;
6
+ }
7
+ export interface RuntimeDbPersistError {
8
+ readonly code: string;
9
+ readonly message: string;
10
+ }
11
+ export type RuntimeDbPersistExecutionResult = {
12
+ readonly ok: true;
13
+ readonly data: RuntimeDbPersistResult;
14
+ } | {
15
+ readonly ok: false;
16
+ readonly error: RuntimeDbPersistError;
17
+ };
18
+ export declare function createDbPersistActionHandler(args: {
19
+ readonly dbAdapter: DbAdapter;
20
+ readonly onResult?: (result: RuntimeDbPersistExecutionResult) => void;
21
+ }): RuntimeActionHandler;
22
+ export declare function executeDbPersistAction(args: {
23
+ readonly dbAdapter: DbAdapter;
24
+ readonly handlerArgs: RuntimeActionHandlerArgs;
25
+ }): Promise<RuntimeDbPersistExecutionResult>;
26
+ export declare function resolveDbPersistInput(payload: object | undefined): {
27
+ readonly ok: true;
28
+ readonly data: DbInsertInput;
29
+ } | {
30
+ readonly ok: false;
31
+ readonly error: RuntimeDbPersistError;
32
+ };
33
+ export declare function createDbPersistAdapterError(error: RuntimeDbPersistError): DbAdapterError;
34
+ //# sourceMappingURL=runtimeDbPersist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeDbPersist.d.ts","sourceRoot":"","sources":["../src/runtimeDbPersist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,QAAQ,EACR,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAE9F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,+BAA+B,GACvC;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;CACvC,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;CACvC,CAAC;AAON,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,+BAA+B,KAAK,IAAI,CAAC;CACvE,GAAG,oBAAoB,CAOvB;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;CAChD,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAe3C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC7D;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;CACvC,CAsCJ;AAYD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,qBAAqB,GAAG,cAAc,CAKxF"}