@ankhorage/runtime 4.1.1 → 5.0.1

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 (86) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +6 -6
  3. package/dist/RuntimeRenderer.d.ts +7 -7
  4. package/dist/RuntimeRenderer.d.ts.map +1 -1
  5. package/dist/RuntimeRenderer.js +40 -80
  6. package/dist/RuntimeRenderer.js.map +1 -1
  7. package/dist/RuntimeRendererConfig.d.ts +7 -22
  8. package/dist/RuntimeRendererConfig.d.ts.map +1 -1
  9. package/dist/RuntimeRendererConfig.js +5 -8
  10. package/dist/RuntimeRendererConfig.js.map +1 -1
  11. package/dist/RuntimeScreen.d.ts.map +1 -1
  12. package/dist/RuntimeScreen.js +10 -5
  13. package/dist/RuntimeScreen.js.map +1 -1
  14. package/dist/bindings.d.ts +4 -8
  15. package/dist/bindings.d.ts.map +1 -1
  16. package/dist/bindings.js +2 -4
  17. package/dist/bindings.js.map +1 -1
  18. package/dist/index.d.ts +10 -12
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +5 -6
  21. package/dist/index.js.map +1 -1
  22. package/dist/runtimeActionRegistry.d.ts +19 -24
  23. package/dist/runtimeActionRegistry.d.ts.map +1 -1
  24. package/dist/runtimeActionRegistry.js +90 -306
  25. package/dist/runtimeActionRegistry.js.map +1 -1
  26. package/dist/runtimeApiCapabilities.d.ts +11 -0
  27. package/dist/runtimeApiCapabilities.d.ts.map +1 -0
  28. package/dist/runtimeApiCapabilities.js +67 -0
  29. package/dist/runtimeApiCapabilities.js.map +1 -0
  30. package/dist/runtimeBindings.d.ts +28 -17
  31. package/dist/runtimeBindings.d.ts.map +1 -1
  32. package/dist/runtimeBindings.js +157 -197
  33. package/dist/runtimeBindings.js.map +1 -1
  34. package/dist/runtimeCapabilityExecutor.d.ts +8 -0
  35. package/dist/runtimeCapabilityExecutor.d.ts.map +1 -0
  36. package/dist/runtimeCapabilityExecutor.js +21 -0
  37. package/dist/runtimeCapabilityExecutor.js.map +1 -0
  38. package/dist/runtimeEventExecution.d.ts +1 -4
  39. package/dist/runtimeEventExecution.d.ts.map +1 -1
  40. package/dist/runtimeEventExecution.js.map +1 -1
  41. package/dist/runtimeEventOperationLifecycle.d.ts +4 -3
  42. package/dist/runtimeEventOperationLifecycle.d.ts.map +1 -1
  43. package/dist/runtimeEventOperationLifecycle.js +5 -5
  44. package/dist/runtimeEventOperationLifecycle.js.map +1 -1
  45. package/dist/runtimeNodeProps.d.ts +12 -24
  46. package/dist/runtimeNodeProps.d.ts.map +1 -1
  47. package/dist/runtimeNodeProps.js +27 -121
  48. package/dist/runtimeNodeProps.js.map +1 -1
  49. package/dist/runtimeRepeat.d.ts +6 -2
  50. package/dist/runtimeRepeat.d.ts.map +1 -1
  51. package/dist/runtimeRepeat.js +29 -108
  52. package/dist/runtimeRepeat.js.map +1 -1
  53. package/dist/runtimeScreenLoaders.d.ts +27 -42
  54. package/dist/runtimeScreenLoaders.d.ts.map +1 -1
  55. package/dist/runtimeScreenLoaders.js +113 -273
  56. package/dist/runtimeScreenLoaders.js.map +1 -1
  57. package/package.json +10 -4
  58. package/paradox/badges/npm.svg +3 -3
  59. package/paradox/components.md +6 -7
  60. package/paradox/diagrams/architecture-overview.mmd +25 -79
  61. package/paradox/diagrams/export-graph.mmd +67 -105
  62. package/paradox/diagrams/module-relationships.mmd +19 -59
  63. package/paradox/diagrams/sequences/apply-runtime-binding-data-path.mmd +14 -0
  64. package/paradox/diagrams/sequences/create-component-event-from-handler-args.mmd +0 -13
  65. package/paradox/diagrams/sequences/create-runtime-screen-loader-request-key.mmd +5 -0
  66. package/paradox/diagrams/sequences/execute-runtime-binding-invocation.mmd +19 -0
  67. package/paradox/diagrams/sequences/resolve-binding-input-map-sync.mmd +5 -0
  68. package/paradox/diagrams/sequences/resolve-binding-input-map.mmd +5 -0
  69. package/paradox/diagrams/sequences/runtime-screen.mmd +6 -3
  70. package/paradox/diagrams/sequences/use-runtime-screen-operation-loaders.mmd +6 -3
  71. package/paradox/exports.json +610 -848
  72. package/paradox/exports.md +280 -308
  73. package/paradox/index.html +1120 -2266
  74. package/paradox/paradox.json +2724 -5528
  75. package/dist/runtimeApiOperations.d.ts +0 -8
  76. package/dist/runtimeApiOperations.d.ts.map +0 -1
  77. package/dist/runtimeApiOperations.js +0 -38
  78. package/dist/runtimeApiOperations.js.map +0 -1
  79. package/dist/runtimeApiSelection.d.ts +0 -8
  80. package/dist/runtimeApiSelection.d.ts.map +0 -1
  81. package/dist/runtimeApiSelection.js +0 -52
  82. package/dist/runtimeApiSelection.js.map +0 -1
  83. package/dist/runtimeDbPersist.d.ts +0 -34
  84. package/dist/runtimeDbPersist.d.ts.map +0 -1
  85. package/dist/runtimeDbPersist.js +0 -73
  86. package/dist/runtimeDbPersist.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeApiCapabilities.js","sourceRoot":"","sources":["../src/runtimeApiCapabilities.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ApiDefinitionRegistry,\n BindingValue,\n DataSourceDiagnostic,\n} from '@ankhorage/contracts';\nimport type { EndpointTestCredentialResolver, EndpointTestFetch } from '@ankhorage/data-sources';\nimport { testEndpoint } from '@ankhorage/data-sources';\nimport { isRecord } from '@ankhorage/utility/object';\n\nimport type {\n RuntimeCapabilityExecutionArgs,\n RuntimeCapabilityExecutionResult,\n RuntimeCapabilityExecutor,\n} from './runtimeBindings';\n\nexport interface RuntimeApiCapabilityExecutorOptions {\n readonly apis: ApiDefinitionRegistry;\n readonly fetch?: EndpointTestFetch;\n readonly credentialResolver?: EndpointTestCredentialResolver;\n}\n\n/*** Creates the canonical API capability adapter over Runtime's existing data-operation executor. */\nexport function createRuntimeApiCapabilityExecutor(\n options: RuntimeApiCapabilityExecutorOptions,\n): RuntimeCapabilityExecutor {\n return async (args) => executeRuntimeApiCapabilityAsync(args, options);\n}\n\nasync function executeRuntimeApiCapabilityAsync(\n args: RuntimeCapabilityExecutionArgs,\n options: RuntimeApiCapabilityExecutorOptions,\n): Promise<RuntimeCapabilityExecutionResult> {\n const target = resolveApiCapabilityTarget(args.capability, options.apis);\n if (target === undefined) return missingApiCapability(args.capability);\n const values = asBindingValueRecord(args.input);\n if (args.input !== undefined && values === undefined)\n return invalidApiCapabilityInput(args.capability);\n\n const result = await testEndpoint({\n api: target.api,\n credentialResolver: options.credentialResolver,\n endpointId: target.endpointId,\n fetch: options.fetch,\n operationId: target.operationId,\n values,\n });\n return result.ok\n ? { data: result.data ?? null, diagnostics: result.diagnostics, ok: true }\n : { diagnostics: result.diagnostics, ok: false };\n}\n\nfunction resolveApiCapabilityTarget(\n capability: string,\n apis: ApiDefinitionRegistry,\n):\n | {\n readonly api: ApiDefinitionRegistry[string];\n readonly endpointId: string;\n readonly operationId: string;\n }\n | undefined {\n if (!capability.startsWith('api.')) return undefined;\n const target = capability.slice(4);\n const delimiter = target.indexOf('.');\n if (delimiter < 1 || delimiter === target.length - 1) return undefined;\n const apiId = target.slice(0, delimiter);\n const operationId = target.slice(delimiter + 1);\n const api = Object.entries(apis).find(([id]) => id === apiId)?.[1];\n if (api === undefined) return undefined;\n const endpoint = Object.values(api.endpoints).find((candidate) =>\n Object.hasOwn(candidate.operations, operationId),\n );\n return endpoint === undefined ? undefined : { api, endpointId: endpoint.id, operationId };\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 isRecord(value);\n}\n\nfunction missingApiCapability(capability: string): RuntimeCapabilityExecutionResult {\n return {\n diagnostics: [\n {\n code: 'missing-operation',\n message: `API capability '${capability}' does not resolve to a configured API operation.`,\n severity: 'error',\n },\n ],\n ok: false,\n };\n}\n\nfunction invalidApiCapabilityInput(capability: string): RuntimeCapabilityExecutionResult {\n const diagnostic: DataSourceDiagnostic = {\n code: 'invalid-config',\n message: `API capability '${capability}' input must resolve to an object.`,\n severity: 'error',\n };\n return { diagnostics: [diagnostic], ok: false };\n}\n"]}
@@ -1,13 +1,14 @@
1
- import type { ApiDefinition, ApiDefinitionRegistry, BindingInputMap, BindingOperationRef, BindingValue, BindingValueSource, ComponentDataBindingRegistry, ComponentEventDto, DataEndpointConfig, DataSourceDiagnostic, PropBinding, StateAdapter, UiNode } from '@ankhorage/contracts';
2
- export type RuntimeBindingOperationKey = string;
3
- export interface RuntimeBindingOperationExecutionArgs {
4
- readonly operation: BindingOperationRef;
5
- readonly api: ApiDefinition;
6
- readonly endpoint: DataEndpointConfig;
1
+ import type { BindingExpression, BindingInputMap, BindingInvocation, BindingValue, ComponentDataBindingRegistry, ComponentEventDto, DataSourceDiagnostic, PropBinding, StateAdapter, UiNode } from '@ankhorage/contracts';
2
+ import type { Capability } from '@ankhorage/contracts/capability';
3
+ export type RuntimeBindingResultCache = Readonly<Record<string, BindingValue | undefined>>;
4
+ export type RuntimeBindingResultWriter = (slot: string, value: BindingValue) => void;
5
+ export interface RuntimeCapabilityExecutionArgs {
6
+ readonly capability: Capability['id'];
7
7
  readonly input?: BindingValue;
8
8
  readonly node?: UiNode;
9
+ readonly event?: ComponentEventDto<string, object>;
9
10
  }
10
- export type RuntimeBindingOperationExecutionResult = {
11
+ export type RuntimeCapabilityExecutionResult = {
11
12
  readonly ok: true;
12
13
  readonly data: BindingValue;
13
14
  readonly diagnostics?: readonly DataSourceDiagnostic[];
@@ -15,17 +16,16 @@ export type RuntimeBindingOperationExecutionResult = {
15
16
  readonly ok: false;
16
17
  readonly diagnostics: readonly DataSourceDiagnostic[];
17
18
  };
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;
19
+ export type RuntimeCapabilityExecutor = (args: RuntimeCapabilityExecutionArgs) => Promise<RuntimeCapabilityExecutionResult>;
21
20
  export interface RuntimeBindingResolutionContext {
22
21
  readonly context?: Record<string, unknown>;
23
22
  readonly event?: ComponentEventDto<string, object>;
24
23
  readonly stateAdapter?: StateAdapter;
25
- readonly apis?: ApiDefinitionRegistry;
24
+ readonly capabilityValues?: Readonly<Record<string, BindingValue | undefined>>;
26
25
  readonly dataBindings?: ComponentDataBindingRegistry;
27
- readonly operationResults?: RuntimeBindingOperationResultCache;
28
- readonly executeOperation?: RuntimeBindingOperationExecutor;
26
+ readonly resultSlots?: RuntimeBindingResultCache;
27
+ readonly executeCapability?: RuntimeCapabilityExecutor;
28
+ readonly writeResultSlot?: RuntimeBindingResultWriter;
29
29
  }
30
30
  export interface RuntimeBindingResolutionArgs extends RuntimeBindingResolutionContext {
31
31
  readonly node: UiNode;
@@ -35,13 +35,24 @@ export interface RuntimeBindingResolutionResult {
35
35
  readonly props: Record<string, unknown>;
36
36
  readonly diagnostics: readonly DataSourceDiagnostic[];
37
37
  }
38
+ /*** Resolves every property binding through the canonical expression boundary. */
38
39
  export declare function resolveRuntimeBindingsAsync(args: RuntimeBindingResolutionArgs): Promise<RuntimeBindingResolutionResult>;
40
+ /*** Resolves property bindings using only already materialized capability values. */
39
41
  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
+ /*** Resolves one recursive Contracts expression, executing a capability only when needed. */
43
+ export declare function resolveRuntimeBindingExpression(expression: BindingExpression, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): Promise<BindingValue | undefined>;
44
+ /*** Resolves one expression without side effects for synchronous rendering. */
45
+ export declare function resolveRuntimeBindingExpressionSync(expression: BindingExpression, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): BindingValue | undefined;
46
+ /*** Resolves a property binding expression. */
47
+ export declare function resolveRuntimeBindingValue(binding: PropBinding, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): Promise<BindingValue | undefined>;
48
+ /*** Resolves a property binding expression without executing a capability. */
49
+ export declare function resolveRuntimeBindingValueSync(binding: PropBinding, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): BindingValue | undefined;
50
+ /*** Resolves an invocation input map recursively. */
42
51
  export declare function resolveBindingInputMap(input: BindingInputMap | undefined, context: RuntimeBindingResolutionContext, diagnostics?: DataSourceDiagnostic[]): Promise<BindingValue | undefined>;
52
+ /*** Resolves an invocation input map without executing a capability. */
43
53
  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 resolveRuntimeBindingValueSourceSync(source: BindingValueSource, context: RuntimeBindingResolutionContext, diagnostics: DataSourceDiagnostic[]): BindingValue | undefined;
54
+ /*** Invokes one capability and records its structured result under its declared local slot. */
55
+ export declare function executeRuntimeBindingInvocation(invocation: BindingInvocation, context: RuntimeBindingResolutionContext, args?: Pick<RuntimeCapabilityExecutionArgs, 'event' | 'node'>, diagnostics?: DataSourceDiagnostic[]): Promise<RuntimeCapabilityExecutionResult | undefined>;
56
+ /*** Applies a dotted path to a serializable binding value. */
46
57
  export declare function applyRuntimeBindingDataPath(value: BindingValue | undefined, path: string | undefined): BindingValue | undefined;
47
58
  //# sourceMappingURL=runtimeBindings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeBindings.d.ts","sourceRoot":"","sources":["../src/runtimeBindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EAErB,eAAe,EAEf,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAElB,4BAA4B,EAC5B,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,MAAM,EACP,MAAM,sBAAsB,CAAC;AAK9B,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,oCAAoC;IACnD,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,sCAAsC,GAC9C;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACxD,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACvD,CAAC;AAEN,MAAM,MAAM,+BAA+B,GAAG,CAC5C,IAAI,EAAE,oCAAoC,KACvC,OAAO,CAAC,sCAAsC,CAAC,CAAC;AAErD,MAAM,MAAM,kCAAkC,GAAG,QAAQ,CACvD,MAAM,CAAC,0BAA0B,EAAE,YAAY,GAAG,SAAS,CAAC,CAC7D,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,CAChD,GAAG,EAAE,0BAA0B,EAC/B,KAAK,EAAE,YAAY,KAChB,IAAI,CAAC;AAEV,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,4BAA4B,CAAC;IACrD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,kCAAkC,CAAC;IAC/D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,+BAA+B,CAAC;CAC7D;AAED,MAAM,WAAW,4BAA6B,SAAQ,+BAA+B;IACnF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACvD;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,8BAA8B,CAAC,CAWzC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,4BAA4B,GACjC,8BAA8B,CAUhC;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,+BAA+B,EACxC,WAAW,GAAE,oBAAoB,EAAO,GACvC,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,+BAA+B,EACxC,WAAW,GAAE,oBAAoB,EAAO,GACvC,OAAO,CAOT;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,OAAO,EAAE,+BAA+B,EACxC,WAAW,GAAE,oBAAoB,EAAO,GACvC,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAWnC;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,OAAO,EAAE,+BAA+B,EACxC,WAAW,GAAE,oBAAoB,EAAO,GACvC,YAAY,GAAG,SAAS,CAW1B;AAED,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,mBAAmB,GAC7B,0BAA0B,CAE5B;AA4CD,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,+BAA+B,EACxC,WAAW,EAAE,oBAAoB,EAAE,GAClC,YAAY,GAAG,SAAS,CAyB1B;AAqID,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,YAAY,GAAG,SAAS,CAG1B"}
1
+ {"version":3,"file":"runtimeBindings.d.ts","sourceRoot":"","sources":["../src/runtimeBindings.ts"],"names":[],"mappings":"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"}
@@ -1,237 +1,197 @@
1
1
  import { isRecord } from '@ankhorage/utility/object';
2
- import { resolveRuntimeBindingOperationSelection } from './runtimeApiSelection';
2
+ /*** Resolves every property binding through the canonical expression boundary. */
3
3
  export async function resolveRuntimeBindingsAsync(args) {
4
4
  const diagnostics = [];
5
- const resolvedProps = { ...args.props };
6
- const binding = args.dataBindings?.[args.node.id];
7
- for (const [prop, propBinding] of Object.entries(binding?.props ?? {})) {
8
- const value = await resolveRuntimeBindingValue(propBinding, args, diagnostics);
9
- resolvedProps[prop] = value;
5
+ const props = { ...args.props };
6
+ for (const [name, binding] of Object.entries(args.dataBindings?.[args.node.id]?.props ?? {})) {
7
+ props[name] = await resolveRuntimeBindingValue(binding, args, diagnostics);
10
8
  }
11
- return { props: resolvedProps, diagnostics };
9
+ return { props, diagnostics };
12
10
  }
11
+ /*** Resolves property bindings using only already materialized capability values. */
13
12
  export function resolveRuntimeBindings(args) {
14
13
  const diagnostics = [];
15
- const resolvedProps = { ...args.props };
16
- const binding = args.dataBindings?.[args.node.id];
17
- for (const [prop, propBinding] of Object.entries(binding?.props ?? {})) {
18
- resolvedProps[prop] = resolveRuntimeBindingValueSync(propBinding, args, diagnostics);
14
+ const props = { ...args.props };
15
+ for (const [name, binding] of Object.entries(args.dataBindings?.[args.node.id]?.props ?? {})) {
16
+ props[name] = resolveRuntimeBindingValueSync(binding, args, diagnostics);
19
17
  }
20
- return { props: resolvedProps, diagnostics };
18
+ return { props, diagnostics };
21
19
  }
22
- export async function resolveRuntimeBindingValue(binding, context, diagnostics = []) {
23
- const value = await resolveRuntimeBindingValueSource(binding.source, context, diagnostics);
24
- const transformedValue = applyBindingValueTransforms(value, binding.transforms);
25
- if (transformedValue !== undefined)
26
- return transformedValue;
27
- return resolveBindingFallback(binding.fallback, context, diagnostics);
20
+ /*** Resolves one recursive Contracts expression, executing a capability only when needed. */
21
+ export async function resolveRuntimeBindingExpression(expression, context, diagnostics = []) {
22
+ if (isCapabilityReference(expression)) {
23
+ return resolveCapabilityReferenceAsync(expression, context, diagnostics);
24
+ }
25
+ if (expression.kind === 'literal')
26
+ return expression.value;
27
+ if (expression.kind === 'array')
28
+ return resolveArrayAsync(expression.items, context, diagnostics);
29
+ if (expression.kind === 'object')
30
+ return resolveObjectAsync(expression.fields, context, diagnostics);
31
+ if (expression.kind === 'transform') {
32
+ return applyBindingValueTransforms(await resolveRuntimeBindingExpression(expression.value, context, diagnostics), expression.transforms);
33
+ }
34
+ const value = await resolveRuntimeBindingExpression(expression.value, context, diagnostics);
35
+ return value === undefined
36
+ ? resolveRuntimeBindingExpression(expression.fallback, context, diagnostics)
37
+ : value;
38
+ }
39
+ /*** Resolves one expression without side effects for synchronous rendering. */
40
+ export function resolveRuntimeBindingExpressionSync(expression, context, diagnostics = []) {
41
+ if (isCapabilityReference(expression))
42
+ return resolveCapabilityReferenceSync(expression, context, diagnostics);
43
+ if (expression.kind === 'literal')
44
+ return expression.value;
45
+ if (expression.kind === 'array')
46
+ return resolveArraySync(expression.items, context, diagnostics);
47
+ if (expression.kind === 'object')
48
+ return resolveObjectSync(expression.fields, context, diagnostics);
49
+ if (expression.kind === 'transform') {
50
+ return applyBindingValueTransforms(resolveRuntimeBindingExpressionSync(expression.value, context, diagnostics), expression.transforms);
51
+ }
52
+ const value = resolveRuntimeBindingExpressionSync(expression.value, context, diagnostics);
53
+ return value === undefined
54
+ ? resolveRuntimeBindingExpressionSync(expression.fallback, context, diagnostics)
55
+ : value;
28
56
  }
57
+ /*** Resolves a property binding expression. */
58
+ export function resolveRuntimeBindingValue(binding, context, diagnostics = []) {
59
+ return resolveRuntimeBindingExpression(binding.value, context, diagnostics);
60
+ }
61
+ /*** Resolves a property binding expression without executing a capability. */
29
62
  export function resolveRuntimeBindingValueSync(binding, context, diagnostics = []) {
30
- const value = resolveRuntimeBindingValueSourceSync(binding.source, context, diagnostics);
31
- const transformedValue = applyBindingValueTransforms(value, binding.transforms);
32
- if (transformedValue !== undefined)
33
- return transformedValue;
34
- return resolveBindingFallbackSync(binding.fallback, context, diagnostics);
35
- }
36
- export async function resolveBindingInputMap(input, context, diagnostics = []) {
37
- if (input === undefined)
38
- return undefined;
39
- const fields = {};
40
- for (const [key, value] of Object.entries(input)) {
41
- const resolvedValue = await resolveBindingInputValue(value, context, diagnostics);
42
- if (resolvedValue !== undefined)
43
- fields[key] = resolvedValue;
44
- }
45
- return fields;
63
+ return resolveRuntimeBindingExpressionSync(binding.value, context, diagnostics);
46
64
  }
47
- export function resolveBindingInputMapSync(input, context, diagnostics = []) {
48
- if (input === undefined)
49
- return undefined;
50
- const fields = {};
51
- for (const [key, value] of Object.entries(input)) {
52
- const resolvedValue = resolveBindingInputValueSync(value, context, diagnostics);
53
- if (resolvedValue !== undefined)
54
- fields[key] = resolvedValue;
55
- }
56
- return fields;
65
+ /*** Resolves an invocation input map recursively. */
66
+ export function resolveBindingInputMap(input, context, diagnostics = []) {
67
+ return input === undefined
68
+ ? Promise.resolve(undefined)
69
+ : resolveObjectAsync(input, context, diagnostics);
57
70
  }
58
- export function createRuntimeBindingOperationKey(operation) {
59
- return [operation.apiId, operation.endpointId ?? '', operation.operationId].join(':');
71
+ /*** Resolves an invocation input map without executing a capability. */
72
+ export function resolveBindingInputMapSync(input, context, diagnostics = []) {
73
+ return input === undefined ? undefined : resolveObjectSync(input, context, diagnostics);
60
74
  }
61
- async function resolveRuntimeBindingValueSource(source, context, diagnostics) {
62
- if (source.kind !== 'operation') {
63
- return resolveRuntimeBindingValueSourceSync(source, context, diagnostics);
64
- }
65
- const cached = resolveCachedOperationValue(source, context);
66
- if (cached !== undefined)
67
- return cached;
68
- if (context.executeOperation === undefined) {
69
- diagnostics.push(createRuntimeBindingDiagnostic(source.operation, 'missing-adapter', 'API operation binding requires an injected operation executor.'));
75
+ /*** Invokes one capability and records its structured result under its declared local slot. */
76
+ export async function executeRuntimeBindingInvocation(invocation, context, args = {}, diagnostics = []) {
77
+ if (context.executeCapability === undefined) {
78
+ diagnostics.push(createMissingCapabilityExecutorDiagnostic(invocation.capability));
70
79
  return undefined;
71
80
  }
72
- const selection = resolveRuntimeBindingOperationSelection(source.operation, context.apis, diagnostics);
73
- if (selection === undefined)
74
- return undefined;
75
- const result = await context.executeOperation({
76
- api: selection.api,
77
- endpoint: selection.endpoint,
78
- operation: source.operation,
81
+ const input = await resolveBindingInputMap(invocation.input, context, diagnostics);
82
+ const result = await context.executeCapability({
83
+ capability: invocation.capability,
84
+ input,
85
+ ...args,
79
86
  });
80
87
  diagnostics.push(...(result.diagnostics ?? []));
81
- if (!result.ok)
82
- return undefined;
83
- return applyRuntimeBindingDataPath(result.data, source.path);
84
- }
85
- export function resolveRuntimeBindingValueSourceSync(source, context, diagnostics) {
86
- switch (source.kind) {
87
- case 'context':
88
- return asBindingValue(readPath(context.context, source.path));
89
- case 'event':
90
- return asBindingValue(readPath(context.event, source.path));
91
- case 'literal':
92
- return source.value;
93
- case 'operation': {
94
- const cached = resolveCachedOperationValue(source, context);
95
- if (cached !== undefined)
96
- return cached;
97
- diagnostics.push(createRuntimeBindingDiagnostic(source.operation, 'missing-adapter', 'Synchronous API operation bindings require preloaded operation results.'));
98
- return undefined;
99
- }
100
- case 'state': {
101
- const result = context.stateAdapter?.get(source.path);
102
- return result?.ok ? asBindingValue(result.data) : undefined;
103
- }
88
+ if (result.ok && invocation.result !== undefined) {
89
+ context.writeResultSlot?.(invocation.result, result.data);
104
90
  }
91
+ return result;
105
92
  }
106
- function resolveCachedOperationValue(source, context) {
107
- const operationKey = createRuntimeBindingOperationKey(source.operation);
108
- const cachedValue = context.operationResults?.[operationKey];
109
- return applyRuntimeBindingDataPath(cachedValue, source.path);
93
+ /*** Applies a dotted path to a serializable binding value. */
94
+ export function applyRuntimeBindingDataPath(value, path) {
95
+ return path === undefined ? value : asBindingValue(readPath(value, path));
110
96
  }
111
- async function resolveBindingFallback(fallback, context, diagnostics) {
112
- if (fallback === undefined)
113
- return undefined;
114
- if (fallback.value !== undefined)
115
- return fallback.value;
116
- if (fallback.source === undefined)
117
- return undefined;
118
- return resolveRuntimeBindingValueSource(fallback.source, context, diagnostics);
97
+ function isCapabilityReference(expression) {
98
+ return 'capability' in expression;
119
99
  }
120
- function resolveBindingFallbackSync(fallback, context, diagnostics) {
121
- if (fallback === undefined)
122
- return undefined;
123
- if (fallback.value !== undefined)
124
- return fallback.value;
125
- if (fallback.source === undefined)
126
- return undefined;
127
- return resolveRuntimeBindingValueSourceSync(fallback.source, context, diagnostics);
128
- }
129
- async function resolveBindingInputValue(input, context, diagnostics) {
130
- if (input.kind === 'literal')
131
- return input.value;
132
- if (input.kind === 'source') {
133
- const value = await resolveRuntimeBindingValueSource(input.source, context, diagnostics);
134
- return applyBindingValueTransforms(value, input.transforms);
135
- }
136
- if (input.kind === 'array') {
137
- const items = [];
138
- for (const item of input.items) {
139
- const value = await resolveBindingInputValue(item, context, diagnostics);
140
- if (value !== undefined)
141
- items.push(value);
142
- }
143
- return items;
144
- }
145
- const fields = {};
146
- for (const [key, value] of Object.entries(input.fields)) {
147
- const resolvedValue = await resolveBindingInputValue(value, context, diagnostics);
148
- if (resolvedValue !== undefined)
149
- fields[key] = resolvedValue;
150
- }
151
- return fields;
152
- }
153
- function resolveBindingInputValueSync(input, context, diagnostics) {
154
- if (input.kind === 'literal')
155
- return input.value;
156
- if (input.kind === 'source') {
157
- const value = resolveRuntimeBindingValueSourceSync(input.source, context, diagnostics);
158
- return applyBindingValueTransforms(value, input.transforms);
159
- }
160
- if (input.kind === 'array') {
161
- const items = [];
162
- for (const item of input.items) {
163
- const value = resolveBindingInputValueSync(item, context, diagnostics);
164
- if (value !== undefined)
165
- items.push(value);
166
- }
167
- return items;
100
+ async function resolveCapabilityReferenceAsync(reference, context, diagnostics) {
101
+ const cached = resolveCapabilityReferenceSync(reference, context, diagnostics, false);
102
+ if (cached !== undefined || reference.result !== undefined)
103
+ return cached;
104
+ if (context.executeCapability === undefined)
105
+ return cached;
106
+ const result = await context.executeCapability({ capability: reference.capability });
107
+ diagnostics.push(...(result.diagnostics ?? []));
108
+ return result.ok ? applyRuntimeBindingDataPath(result.data, reference.path) : undefined;
109
+ }
110
+ function resolveCapabilityReferenceSync(reference, context, diagnostics, reportMissing = true) {
111
+ const value = reference.result === undefined
112
+ ? resolveReadableCapability(reference.capability, context)
113
+ : context.resultSlots?.[reference.result];
114
+ if (value === undefined && reference.result !== undefined && reportMissing) {
115
+ diagnostics.push({
116
+ code: 'missing-adapter',
117
+ message: `Result slot '${reference.result}' is not available.`,
118
+ severity: 'error',
119
+ });
168
120
  }
169
- const fields = {};
170
- for (const [key, value] of Object.entries(input.fields)) {
171
- const resolvedValue = resolveBindingInputValueSync(value, context, diagnostics);
172
- if (resolvedValue !== undefined)
173
- fields[key] = resolvedValue;
121
+ return applyRuntimeBindingDataPath(value, reference.path);
122
+ }
123
+ function resolveReadableCapability(capability, context) {
124
+ const explicit = context.capabilityValues?.[capability];
125
+ if (explicit !== undefined)
126
+ return explicit;
127
+ if (capability.startsWith('context.'))
128
+ return asBindingValue(readPath(context.context, capability.slice(8)));
129
+ if (context.event?.type === capability)
130
+ return asBindingValue(context.event);
131
+ if (capability.startsWith('state.')) {
132
+ const result = context.stateAdapter?.get(capability.slice(6));
133
+ return result?.ok ? asBindingValue(result.data) : undefined;
174
134
  }
175
- return fields;
176
- }
177
- function createRuntimeBindingDiagnostic(operation, code, message) {
178
- return {
179
- apiId: operation.apiId,
180
- code,
181
- endpointId: operation.endpointId,
182
- message,
183
- operationId: operation.operationId,
184
- severity: 'error',
185
- };
135
+ return asBindingValue(readPath(context.context, capability));
136
+ }
137
+ async function resolveArrayAsync(items, context, diagnostics) {
138
+ const values = await Promise.all(items.map((item) => resolveRuntimeBindingExpression(item, context, diagnostics)));
139
+ return values.filter((value) => value !== undefined);
140
+ }
141
+ function resolveArraySync(items, context, diagnostics) {
142
+ return items
143
+ .map((item) => resolveRuntimeBindingExpressionSync(item, context, diagnostics))
144
+ .filter((value) => value !== undefined);
145
+ }
146
+ async function resolveObjectAsync(fields, context, diagnostics) {
147
+ const entries = await Promise.all(Object.entries(fields).map(async ([key, expression]) => {
148
+ const value = await resolveRuntimeBindingExpression(expression, context, diagnostics);
149
+ return value === undefined ? undefined : [key, value];
150
+ }));
151
+ return Object.fromEntries(entries.filter((entry) => entry !== undefined));
152
+ }
153
+ function resolveObjectSync(fields, context, diagnostics) {
154
+ const entries = Object.entries(fields).map(([key, expression]) => {
155
+ const value = resolveRuntimeBindingExpressionSync(expression, context, diagnostics);
156
+ return value === undefined ? undefined : [key, value];
157
+ });
158
+ return Object.fromEntries(entries.filter((entry) => entry !== undefined));
186
159
  }
187
160
  function applyBindingValueTransforms(value, transforms) {
188
- const bindingValue = asBindingValue(value);
189
- if (typeof bindingValue !== 'string' || transforms === undefined)
190
- return bindingValue;
191
- let currentValue = bindingValue;
192
- for (const transform of transforms) {
193
- if (transform === 'lowercase')
194
- currentValue = currentValue.toLowerCase();
161
+ if (typeof value !== 'string')
162
+ return value;
163
+ return transforms.reduce((current, transform) => {
195
164
  if (transform === 'trim')
196
- currentValue = currentValue.trim();
165
+ return current.trim();
197
166
  if (transform === 'uppercase')
198
- currentValue = currentValue.toUpperCase();
199
- }
200
- return currentValue;
167
+ return current.toUpperCase();
168
+ return current.toLowerCase();
169
+ }, value);
201
170
  }
202
- export function applyRuntimeBindingDataPath(value, path) {
203
- if (path === undefined)
171
+ function createMissingCapabilityExecutorDiagnostic(capability) {
172
+ return {
173
+ code: 'missing-adapter',
174
+ message: `Capability '${capability}' requires an injected capability executor.`,
175
+ severity: 'error',
176
+ };
177
+ }
178
+ function readPath(value, path) {
179
+ if (path.length === 0)
204
180
  return value;
205
- return asBindingValue(readPath(value, path));
206
- }
207
- function readPath(source, path) {
208
- return path.split('.').reduce((currentValue, part) => {
209
- if (Array.isArray(currentValue)) {
210
- if (!isArrayIndexPathPart(part))
211
- return undefined;
212
- return currentValue[Number(part)];
213
- }
214
- if (!isRecord(currentValue))
215
- return undefined;
216
- return currentValue[part];
217
- }, source);
218
- }
219
- function isArrayIndexPathPart(part) {
220
- return /^(0|[1-9]\d*)$/.test(part);
181
+ return path.split('.').reduce((current, part) => {
182
+ if (Array.isArray(current))
183
+ return /^(0|[1-9]\\d*)$/.test(part) ? current[Number(part)] : undefined;
184
+ return isRecord(current) ? current[part] : undefined;
185
+ }, value);
221
186
  }
222
187
  function asBindingValue(value) {
223
188
  return isBindingValue(value) ? value : undefined;
224
189
  }
225
190
  function isBindingValue(value) {
226
- if (value === null)
191
+ if (value === null || ['boolean', 'number', 'string'].includes(typeof value))
227
192
  return true;
228
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
229
- return true;
230
- }
231
193
  if (Array.isArray(value))
232
194
  return value.every(isBindingValue);
233
- if (!isRecord(value))
234
- return false;
235
- return Object.values(value).every(isBindingValue);
195
+ return isRecord(value) && Object.values(value).every(isBindingValue);
236
196
  }
237
197
  //# sourceMappingURL=runtimeBindings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeBindings.js","sourceRoot":"","sources":["../src/runtimeBindings.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ApiDefinition,\n ApiDefinitionRegistry,\n BindingFallback,\n BindingInputMap,\n BindingInputValue,\n BindingOperationRef,\n BindingValue,\n BindingValueSource,\n BindingValueTransform,\n ComponentDataBindingRegistry,\n ComponentEventDto,\n DataEndpointConfig,\n DataSourceDiagnostic,\n PropBinding,\n StateAdapter,\n UiNode,\n} from '@ankhorage/contracts';\nimport { isRecord } from '@ankhorage/utility/object';\n\nimport { resolveRuntimeBindingOperationSelection } from './runtimeApiSelection';\n\nexport type RuntimeBindingOperationKey = string;\n\nexport interface RuntimeBindingOperationExecutionArgs {\n readonly operation: BindingOperationRef;\n readonly api: ApiDefinition;\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 apis?: ApiDefinitionRegistry;\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.apiId, operation.endpointId ?? '', operation.operationId].join(':');\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 source.operation,\n 'missing-adapter',\n 'API operation binding requires an injected operation executor.',\n ),\n );\n return undefined;\n }\n\n const selection = resolveRuntimeBindingOperationSelection(\n source.operation,\n context.apis,\n diagnostics,\n );\n if (selection === undefined) return undefined;\n\n const result = await context.executeOperation({\n api: selection.api,\n endpoint: selection.endpoint,\n operation: source.operation,\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 source.operation,\n 'missing-adapter',\n 'Synchronous API operation bindings require preloaded operation results.',\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\nfunction createRuntimeBindingDiagnostic(\n operation: BindingOperationRef,\n code: DataSourceDiagnostic['code'],\n message: string,\n): DataSourceDiagnostic {\n return {\n apiId: operation.apiId,\n code,\n endpointId: operation.endpointId,\n message,\n operationId: operation.operationId,\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"]}
1
+ {"version":3,"file":"runtimeBindings.js","sourceRoot":"","sources":["../src/runtimeBindings.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n BindingCapabilityReference,\n BindingExpression,\n BindingInputMap,\n BindingInvocation,\n BindingValue,\n BindingValueTransform,\n ComponentDataBindingRegistry,\n ComponentEventDto,\n DataSourceDiagnostic,\n PropBinding,\n StateAdapter,\n UiNode,\n} from '@ankhorage/contracts';\nimport type { Capability } from '@ankhorage/contracts/capability';\nimport { isRecord } from '@ankhorage/utility/object';\n\nexport type RuntimeBindingResultCache = Readonly<Record<string, BindingValue | undefined>>;\nexport type RuntimeBindingResultWriter = (slot: string, value: BindingValue) => void;\n\nexport interface RuntimeCapabilityExecutionArgs {\n readonly capability: Capability['id'];\n readonly input?: BindingValue;\n readonly node?: UiNode;\n readonly event?: ComponentEventDto<string, object>;\n}\n\nexport type RuntimeCapabilityExecutionResult =\n | {\n readonly ok: true;\n readonly data: BindingValue;\n readonly diagnostics?: readonly DataSourceDiagnostic[];\n }\n | { readonly ok: false; readonly diagnostics: readonly DataSourceDiagnostic[] };\n\nexport type RuntimeCapabilityExecutor = (\n args: RuntimeCapabilityExecutionArgs,\n) => Promise<RuntimeCapabilityExecutionResult>;\n\nexport interface RuntimeBindingResolutionContext {\n readonly context?: Record<string, unknown>;\n readonly event?: ComponentEventDto<string, object>;\n readonly stateAdapter?: StateAdapter;\n readonly capabilityValues?: Readonly<Record<string, BindingValue | undefined>>;\n readonly dataBindings?: ComponentDataBindingRegistry;\n readonly resultSlots?: RuntimeBindingResultCache;\n readonly executeCapability?: RuntimeCapabilityExecutor;\n readonly writeResultSlot?: RuntimeBindingResultWriter;\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\n/*** Resolves every property binding through the canonical expression boundary. */\nexport async function resolveRuntimeBindingsAsync(\n args: RuntimeBindingResolutionArgs,\n): Promise<RuntimeBindingResolutionResult> {\n const diagnostics: DataSourceDiagnostic[] = [];\n const props = { ...args.props };\n\n for (const [name, binding] of Object.entries(args.dataBindings?.[args.node.id]?.props ?? {})) {\n props[name] = await resolveRuntimeBindingValue(binding, args, diagnostics);\n }\n\n return { props, diagnostics };\n}\n\n/*** Resolves property bindings using only already materialized capability values. */\nexport function resolveRuntimeBindings(\n args: RuntimeBindingResolutionArgs,\n): RuntimeBindingResolutionResult {\n const diagnostics: DataSourceDiagnostic[] = [];\n const props = { ...args.props };\n\n for (const [name, binding] of Object.entries(args.dataBindings?.[args.node.id]?.props ?? {})) {\n props[name] = resolveRuntimeBindingValueSync(binding, args, diagnostics);\n }\n\n return { props, diagnostics };\n}\n\n/*** Resolves one recursive Contracts expression, executing a capability only when needed. */\nexport async function resolveRuntimeBindingExpression(\n expression: BindingExpression,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): Promise<BindingValue | undefined> {\n if (isCapabilityReference(expression)) {\n return resolveCapabilityReferenceAsync(expression, context, diagnostics);\n }\n if (expression.kind === 'literal') return expression.value;\n if (expression.kind === 'array') return resolveArrayAsync(expression.items, context, diagnostics);\n if (expression.kind === 'object')\n return resolveObjectAsync(expression.fields, context, diagnostics);\n if (expression.kind === 'transform') {\n return applyBindingValueTransforms(\n await resolveRuntimeBindingExpression(expression.value, context, diagnostics),\n expression.transforms,\n );\n }\n\n const value = await resolveRuntimeBindingExpression(expression.value, context, diagnostics);\n return value === undefined\n ? resolveRuntimeBindingExpression(expression.fallback, context, diagnostics)\n : value;\n}\n\n/*** Resolves one expression without side effects for synchronous rendering. */\nexport function resolveRuntimeBindingExpressionSync(\n expression: BindingExpression,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): BindingValue | undefined {\n if (isCapabilityReference(expression))\n return resolveCapabilityReferenceSync(expression, context, diagnostics);\n if (expression.kind === 'literal') return expression.value;\n if (expression.kind === 'array') return resolveArraySync(expression.items, context, diagnostics);\n if (expression.kind === 'object')\n return resolveObjectSync(expression.fields, context, diagnostics);\n if (expression.kind === 'transform') {\n return applyBindingValueTransforms(\n resolveRuntimeBindingExpressionSync(expression.value, context, diagnostics),\n expression.transforms,\n );\n }\n\n const value = resolveRuntimeBindingExpressionSync(expression.value, context, diagnostics);\n return value === undefined\n ? resolveRuntimeBindingExpressionSync(expression.fallback, context, diagnostics)\n : value;\n}\n\n/*** Resolves a property binding expression. */\nexport function resolveRuntimeBindingValue(\n binding: PropBinding,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): Promise<BindingValue | undefined> {\n return resolveRuntimeBindingExpression(binding.value, context, diagnostics);\n}\n\n/*** Resolves a property binding expression without executing a capability. */\nexport function resolveRuntimeBindingValueSync(\n binding: PropBinding,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): BindingValue | undefined {\n return resolveRuntimeBindingExpressionSync(binding.value, context, diagnostics);\n}\n\n/*** Resolves an invocation input map recursively. */\nexport function resolveBindingInputMap(\n input: BindingInputMap | undefined,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): Promise<BindingValue | undefined> {\n return input === undefined\n ? Promise.resolve(undefined)\n : resolveObjectAsync(input, context, diagnostics);\n}\n\n/*** Resolves an invocation input map without executing a capability. */\nexport function resolveBindingInputMapSync(\n input: BindingInputMap | undefined,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[] = [],\n): BindingValue | undefined {\n return input === undefined ? undefined : resolveObjectSync(input, context, diagnostics);\n}\n\n/*** Invokes one capability and records its structured result under its declared local slot. */\nexport async function executeRuntimeBindingInvocation(\n invocation: BindingInvocation,\n context: RuntimeBindingResolutionContext,\n args: Pick<RuntimeCapabilityExecutionArgs, 'event' | 'node'> = {},\n diagnostics: DataSourceDiagnostic[] = [],\n): Promise<RuntimeCapabilityExecutionResult | undefined> {\n if (context.executeCapability === undefined) {\n diagnostics.push(createMissingCapabilityExecutorDiagnostic(invocation.capability));\n return undefined;\n }\n\n const input = await resolveBindingInputMap(invocation.input, context, diagnostics);\n const result = await context.executeCapability({\n capability: invocation.capability,\n input,\n ...args,\n });\n diagnostics.push(...(result.diagnostics ?? []));\n\n if (result.ok && invocation.result !== undefined) {\n context.writeResultSlot?.(invocation.result, result.data);\n }\n\n return result;\n}\n\n/*** Applies a dotted path to a serializable binding value. */\nexport function applyRuntimeBindingDataPath(\n value: BindingValue | undefined,\n path: string | undefined,\n): BindingValue | undefined {\n return path === undefined ? value : asBindingValue(readPath(value, path));\n}\n\nfunction isCapabilityReference(\n expression: BindingExpression,\n): expression is BindingCapabilityReference {\n return 'capability' in expression;\n}\n\nasync function resolveCapabilityReferenceAsync(\n reference: BindingCapabilityReference,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): Promise<BindingValue | undefined> {\n const cached = resolveCapabilityReferenceSync(reference, context, diagnostics, false);\n if (cached !== undefined || reference.result !== undefined) return cached;\n if (context.executeCapability === undefined) return cached;\n\n const result = await context.executeCapability({ capability: reference.capability });\n diagnostics.push(...(result.diagnostics ?? []));\n return result.ok ? applyRuntimeBindingDataPath(result.data, reference.path) : undefined;\n}\n\nfunction resolveCapabilityReferenceSync(\n reference: BindingCapabilityReference,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n reportMissing = true,\n): BindingValue | undefined {\n const value =\n reference.result === undefined\n ? resolveReadableCapability(reference.capability, context)\n : context.resultSlots?.[reference.result];\n if (value === undefined && reference.result !== undefined && reportMissing) {\n diagnostics.push({\n code: 'missing-adapter',\n message: `Result slot '${reference.result}' is not available.`,\n severity: 'error',\n });\n }\n return applyRuntimeBindingDataPath(value, reference.path);\n}\n\nfunction resolveReadableCapability(\n capability: string,\n context: RuntimeBindingResolutionContext,\n): BindingValue | undefined {\n const explicit = context.capabilityValues?.[capability];\n if (explicit !== undefined) return explicit;\n if (capability.startsWith('context.'))\n return asBindingValue(readPath(context.context, capability.slice(8)));\n if (context.event?.type === capability) return asBindingValue(context.event);\n if (capability.startsWith('state.')) {\n const result = context.stateAdapter?.get(capability.slice(6));\n return result?.ok ? asBindingValue(result.data) : undefined;\n }\n return asBindingValue(readPath(context.context, capability));\n}\n\nasync function resolveArrayAsync(\n items: readonly BindingExpression[],\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): Promise<BindingValue> {\n const values = await Promise.all(\n items.map((item) => resolveRuntimeBindingExpression(item, context, diagnostics)),\n );\n return values.filter((value): value is BindingValue => value !== undefined);\n}\n\nfunction resolveArraySync(\n items: readonly BindingExpression[],\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): BindingValue {\n return items\n .map((item) => resolveRuntimeBindingExpressionSync(item, context, diagnostics))\n .filter((value): value is BindingValue => value !== undefined);\n}\n\nasync function resolveObjectAsync(\n fields: Readonly<Record<string, BindingExpression>>,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): Promise<BindingValue> {\n const entries = await Promise.all(\n Object.entries(fields).map(async ([key, expression]) => {\n const value = await resolveRuntimeBindingExpression(expression, context, diagnostics);\n return value === undefined ? undefined : ([key, value] as const);\n }),\n );\n return Object.fromEntries(\n entries.filter((entry): entry is readonly [string, BindingValue] => entry !== undefined),\n );\n}\n\nfunction resolveObjectSync(\n fields: Readonly<Record<string, BindingExpression>>,\n context: RuntimeBindingResolutionContext,\n diagnostics: DataSourceDiagnostic[],\n): BindingValue {\n const entries = Object.entries(fields).map(([key, expression]) => {\n const value = resolveRuntimeBindingExpressionSync(expression, context, diagnostics);\n return value === undefined ? undefined : ([key, value] as const);\n });\n return Object.fromEntries(\n entries.filter((entry): entry is readonly [string, BindingValue] => entry !== undefined),\n );\n}\n\nfunction applyBindingValueTransforms(\n value: BindingValue | undefined,\n transforms: readonly BindingValueTransform[],\n): BindingValue | undefined {\n if (typeof value !== 'string') return value;\n return transforms.reduce((current, transform) => {\n if (transform === 'trim') return current.trim();\n if (transform === 'uppercase') return current.toUpperCase();\n return current.toLowerCase();\n }, value);\n}\n\nfunction createMissingCapabilityExecutorDiagnostic(capability: string): DataSourceDiagnostic {\n return {\n code: 'missing-adapter',\n message: `Capability '${capability}' requires an injected capability executor.`,\n severity: 'error',\n };\n}\n\nfunction readPath(value: unknown, path: string): unknown {\n if (path.length === 0) return value;\n return path.split('.').reduce<unknown>((current, part) => {\n if (Array.isArray(current))\n return /^(0|[1-9]\\\\d*)$/.test(part) ? current[Number(part)] : undefined;\n return isRecord(current) ? current[part] : undefined;\n }, value);\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 || ['boolean', 'number', 'string'].includes(typeof value)) return true;\n if (Array.isArray(value)) return value.every(isBindingValue);\n return isRecord(value) && Object.values(value).every(isBindingValue);\n}\n"]}