@ankhorage/runtime 1.1.0 → 2.0.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 (63) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -1
  3. package/dist/RuntimeRenderer.d.ts +2 -2
  4. package/dist/RuntimeRenderer.d.ts.map +1 -1
  5. package/dist/RuntimeRenderer.js +10 -10
  6. package/dist/RuntimeRenderer.js.map +1 -1
  7. package/dist/RuntimeRendererConfig.d.ts +2 -2
  8. package/dist/RuntimeRendererConfig.d.ts.map +1 -1
  9. package/dist/RuntimeRendererConfig.js +1 -1
  10. package/dist/RuntimeRendererConfig.js.map +1 -1
  11. package/dist/RuntimeScreen.d.ts.map +1 -1
  12. package/dist/RuntimeScreen.js +3 -2
  13. package/dist/RuntimeScreen.js.map +1 -1
  14. package/dist/index.d.ts +5 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/runtimeActionRegistry.d.ts +3 -3
  19. package/dist/runtimeActionRegistry.d.ts.map +1 -1
  20. package/dist/runtimeActionRegistry.js +9 -24
  21. package/dist/runtimeActionRegistry.js.map +1 -1
  22. package/dist/runtimeApiOperations.d.ts +8 -0
  23. package/dist/runtimeApiOperations.d.ts.map +1 -0
  24. package/dist/runtimeApiOperations.js +38 -0
  25. package/dist/runtimeApiOperations.js.map +1 -0
  26. package/dist/runtimeApiSelection.d.ts +8 -0
  27. package/dist/runtimeApiSelection.d.ts.map +1 -0
  28. package/dist/runtimeApiSelection.js +50 -0
  29. package/dist/runtimeApiSelection.js.map +1 -0
  30. package/dist/runtimeBindings.d.ts +4 -9
  31. package/dist/runtimeBindings.d.ts.map +1 -1
  32. package/dist/runtimeBindings.js +13 -73
  33. package/dist/runtimeBindings.js.map +1 -1
  34. package/dist/runtimeNodeProps.d.ts +2 -2
  35. package/dist/runtimeNodeProps.d.ts.map +1 -1
  36. package/dist/runtimeNodeProps.js +1 -1
  37. package/dist/runtimeNodeProps.js.map +1 -1
  38. package/dist/runtimeRepeat.d.ts.map +1 -1
  39. package/dist/runtimeRepeat.js +9 -8
  40. package/dist/runtimeRepeat.js.map +1 -1
  41. package/dist/runtimeScreenLoaders.d.ts +2 -2
  42. package/dist/runtimeScreenLoaders.d.ts.map +1 -1
  43. package/dist/runtimeScreenLoaders.js +8 -7
  44. package/dist/runtimeScreenLoaders.js.map +1 -1
  45. package/package.json +6 -6
  46. package/paradox/badges/npm.svg +3 -3
  47. package/paradox/components.md +1 -1
  48. package/paradox/diagrams/architecture-overview.mmd +34 -18
  49. package/paradox/diagrams/export-graph.mmd +18 -12
  50. package/paradox/diagrams/module-relationships.mmd +25 -13
  51. package/paradox/diagrams/sequences/validate-runtime-binding-operation-ref.mmd +9 -6
  52. package/paradox/exports.json +155 -132
  53. package/paradox/exports.md +85 -73
  54. package/paradox/index.html +955 -904
  55. package/paradox/paradox.json +1149 -1357
  56. package/dist/runtimeDataSourceOperations.d.ts +0 -10
  57. package/dist/runtimeDataSourceOperations.d.ts.map +0 -1
  58. package/dist/runtimeDataSourceOperations.js +0 -63
  59. package/dist/runtimeDataSourceOperations.js.map +0 -1
  60. package/dist/runtimeDatabaseOperationExecutor.d.ts +0 -9
  61. package/dist/runtimeDatabaseOperationExecutor.d.ts.map +0 -1
  62. package/dist/runtimeDatabaseOperationExecutor.js +0 -228
  63. package/dist/runtimeDatabaseOperationExecutor.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeNodeProps.js","sourceRoot":"","sources":["../src/runtimeNodeProps.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ComponentDataBindingRegistry,\n DataSourceRegistry,\n DbAdapter,\n DbRealtimeAdapter,\n StateAdapter,\n UiNode,\n} from '@ankhorage/contracts';\n\nimport { resolveRuntimeBindings, type RuntimeBindingOperationResultCache } from './runtimeBindings';\nimport type { RuntimeAction, RuntimeRendererConfig } from './RuntimeRendererConfig';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!isRecord(value)) {\n return false;\n }\n\n const prototype = Reflect.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction hasActionShape(value: unknown): value is RuntimeAction {\n return (\n typeof value === 'object' && value !== null && 'type' in value && typeof value.type === 'string'\n );\n}\n\nfunction isCallbackProp(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === 'function';\n}\n\nfunction isNonEmptyActionId(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction createStringActionPayload(args: unknown[]): { payload?: object } {\n if (args.length === 0) {\n return {};\n }\n\n const [firstArg] = args;\n if (isPlainObject(firstArg)) {\n return { payload: firstArg };\n }\n\n return {\n payload: {\n args,\n },\n };\n}\n\nconst noopRuntimeActionHandler = () => undefined;\n\nfunction resolveImageAssetUrl(value: unknown): string | null {\n if (typeof value === 'string') {\n const url = value.trim();\n return url.length ? url : null;\n }\n\n if (!isRecord(value) || typeof value.kind !== 'string') {\n return null;\n }\n\n if (value.kind === 'url' && typeof value.url === 'string') {\n const url = value.url.trim();\n return url.length ? url : null;\n }\n\n if (value.kind === 'storage' && typeof value.publicUrl === 'string') {\n const publicUrl = value.publicUrl.trim();\n return publicUrl.length ? publicUrl : null;\n }\n\n return null;\n}\n\nexport function resolveRuntimeNodeProps(args: {\n node: UiNode;\n resolveNodeProps?: RuntimeRendererConfig['resolveNodeProps'];\n stateAdapter?: StateAdapter;\n dbAdapter?: DbAdapter;\n dbRealtimeAdapter?: DbRealtimeAdapter;\n bindingContext?: Record<string, unknown>;\n dataSources?: DataSourceRegistry;\n dataBindings?: ComponentDataBindingRegistry;\n operationResults?: RuntimeBindingOperationResultCache;\n}): Record<string, unknown> {\n const { node, resolveNodeProps } = args;\n\n const baseProps: Record<string, unknown> = {\n testID: node.id,\n ...(node.props ?? {}),\n };\n\n if (node.type === 'Image') {\n const resolvedSource = resolveImageAssetUrl(baseProps.source);\n if (resolvedSource !== null) baseProps.source = resolvedSource;\n else delete baseProps.source;\n }\n\n if (node.style) {\n baseProps.style = baseProps.style ? [baseProps.style, node.style] : node.style;\n }\n\n const bindingResult = resolveRuntimeBindings({\n context: args.bindingContext,\n dataBindings: args.dataBindings,\n dataSources: args.dataSources,\n node,\n operationResults: args.operationResults,\n props: baseProps,\n stateAdapter: args.stateAdapter,\n });\n\n return resolveNodeProps\n ? resolveNodeProps({ node, props: bindingResult.props })\n : bindingResult.props;\n}\n\nexport function wrapRuntimeActionProps(args: {\n props: Record<string, unknown>;\n disableActions: boolean;\n handleAction: (action: RuntimeAction) => void;\n actionHandlerCache: WeakMap<object, (...args: unknown[]) => void>;\n functionHandlerCache: WeakMap<(...args: unknown[]) => unknown, (...args: unknown[]) => unknown>;\n}): Record<string, unknown> {\n const { props, disableActions, handleAction, actionHandlerCache, functionHandlerCache } = args;\n const wrappedProps: Record<string, unknown> = { ...props };\n\n Object.keys(wrappedProps).forEach((key) => {\n if (!key.startsWith('on')) {\n return;\n }\n\n const value = wrappedProps[key];\n\n if (disableActions) {\n wrappedProps[key] =\n hasActionShape(value) || isNonEmptyActionId(value) ? noopRuntimeActionHandler : undefined;\n return;\n }\n\n if (hasActionShape(value)) {\n const actionObject = value;\n let actionHandler = actionHandlerCache.get(actionObject);\n if (!actionHandler) {\n actionHandler = () => {\n handleAction(actionObject);\n };\n actionHandlerCache.set(actionObject, actionHandler);\n }\n wrappedProps[key] = actionHandler;\n return;\n }\n\n if (isNonEmptyActionId(value)) {\n const actionId = value.trim();\n wrappedProps[key] = (...handlerArgs: unknown[]) => {\n handleAction({\n type: actionId,\n ...createStringActionPayload(handlerArgs),\n });\n };\n return;\n }\n\n if (isCallbackProp(value)) {\n const handler = value;\n let wrappedHandler = functionHandlerCache.get(handler);\n if (!wrappedHandler) {\n wrappedHandler = (...handlerArgs: unknown[]) => handler(...handlerArgs);\n functionHandlerCache.set(handler, wrappedHandler);\n }\n wrappedProps[key] = wrappedHandler;\n }\n });\n\n return wrappedProps;\n}\n"]}
1
+ {"version":3,"file":"runtimeNodeProps.js","sourceRoot":"","sources":["../src/runtimeNodeProps.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ApiDefinitionList,\n ComponentDataBindingRegistry,\n DbAdapter,\n DbRealtimeAdapter,\n StateAdapter,\n UiNode,\n} from '@ankhorage/contracts';\n\nimport { resolveRuntimeBindings, type RuntimeBindingOperationResultCache } from './runtimeBindings';\nimport type { RuntimeAction, RuntimeRendererConfig } from './RuntimeRendererConfig';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!isRecord(value)) {\n return false;\n }\n\n const prototype = Reflect.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction hasActionShape(value: unknown): value is RuntimeAction {\n return (\n typeof value === 'object' && value !== null && 'type' in value && typeof value.type === 'string'\n );\n}\n\nfunction isCallbackProp(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === 'function';\n}\n\nfunction isNonEmptyActionId(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction createStringActionPayload(args: unknown[]): { payload?: object } {\n if (args.length === 0) {\n return {};\n }\n\n const [firstArg] = args;\n if (isPlainObject(firstArg)) {\n return { payload: firstArg };\n }\n\n return {\n payload: {\n args,\n },\n };\n}\n\nconst noopRuntimeActionHandler = () => undefined;\n\nfunction resolveImageAssetUrl(value: unknown): string | null {\n if (typeof value === 'string') {\n const url = value.trim();\n return url.length ? url : null;\n }\n\n if (!isRecord(value) || typeof value.kind !== 'string') {\n return null;\n }\n\n if (value.kind === 'url' && typeof value.url === 'string') {\n const url = value.url.trim();\n return url.length ? url : null;\n }\n\n if (value.kind === 'storage' && typeof value.publicUrl === 'string') {\n const publicUrl = value.publicUrl.trim();\n return publicUrl.length ? publicUrl : null;\n }\n\n return null;\n}\n\nexport function resolveRuntimeNodeProps(args: {\n node: UiNode;\n resolveNodeProps?: RuntimeRendererConfig['resolveNodeProps'];\n stateAdapter?: StateAdapter;\n dbAdapter?: DbAdapter;\n dbRealtimeAdapter?: DbRealtimeAdapter;\n bindingContext?: Record<string, unknown>;\n apis?: ApiDefinitionList;\n dataBindings?: ComponentDataBindingRegistry;\n operationResults?: RuntimeBindingOperationResultCache;\n}): Record<string, unknown> {\n const { node, resolveNodeProps } = args;\n\n const baseProps: Record<string, unknown> = {\n testID: node.id,\n ...(node.props ?? {}),\n };\n\n if (node.type === 'Image') {\n const resolvedSource = resolveImageAssetUrl(baseProps.source);\n if (resolvedSource !== null) baseProps.source = resolvedSource;\n else delete baseProps.source;\n }\n\n if (node.style) {\n baseProps.style = baseProps.style ? [baseProps.style, node.style] : node.style;\n }\n\n const bindingResult = resolveRuntimeBindings({\n apis: args.apis,\n context: args.bindingContext,\n dataBindings: args.dataBindings,\n node,\n operationResults: args.operationResults,\n props: baseProps,\n stateAdapter: args.stateAdapter,\n });\n\n return resolveNodeProps\n ? resolveNodeProps({ node, props: bindingResult.props })\n : bindingResult.props;\n}\n\nexport function wrapRuntimeActionProps(args: {\n props: Record<string, unknown>;\n disableActions: boolean;\n handleAction: (action: RuntimeAction) => void;\n actionHandlerCache: WeakMap<object, (...args: unknown[]) => void>;\n functionHandlerCache: WeakMap<(...args: unknown[]) => unknown, (...args: unknown[]) => unknown>;\n}): Record<string, unknown> {\n const { props, disableActions, handleAction, actionHandlerCache, functionHandlerCache } = args;\n const wrappedProps: Record<string, unknown> = { ...props };\n\n Object.keys(wrappedProps).forEach((key) => {\n if (!key.startsWith('on')) {\n return;\n }\n\n const value = wrappedProps[key];\n\n if (disableActions) {\n wrappedProps[key] =\n hasActionShape(value) || isNonEmptyActionId(value) ? noopRuntimeActionHandler : undefined;\n return;\n }\n\n if (hasActionShape(value)) {\n const actionObject = value;\n let actionHandler = actionHandlerCache.get(actionObject);\n if (!actionHandler) {\n actionHandler = () => {\n handleAction(actionObject);\n };\n actionHandlerCache.set(actionObject, actionHandler);\n }\n wrappedProps[key] = actionHandler;\n return;\n }\n\n if (isNonEmptyActionId(value)) {\n const actionId = value.trim();\n wrappedProps[key] = (...handlerArgs: unknown[]) => {\n handleAction({\n type: actionId,\n ...createStringActionPayload(handlerArgs),\n });\n };\n return;\n }\n\n if (isCallbackProp(value)) {\n const handler = value;\n let wrappedHandler = functionHandlerCache.get(handler);\n if (!wrappedHandler) {\n wrappedHandler = (...handlerArgs: unknown[]) => handler(...handlerArgs);\n functionHandlerCache.set(handler, wrappedHandler);\n }\n wrappedProps[key] = wrappedHandler;\n }\n });\n\n return wrappedProps;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeRepeat.d.ts","sourceRoot":"","sources":["../src/runtimeRepeat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,MAAM,EACN,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAKL,KAAK,mCAAmC,EACxC,KAAK,+BAA+B,EACrC,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,8BAA+B,SAAQ,+BAA+B;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,oBAAoB,CAAC,EAAE,mCAAmC,CAAC;CACrE;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;IAC5E,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,8BAA8B,GACtC,4BAA4B,CA0C9B;AAED,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CA4DnC;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAK1B;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,GAAG,MAAM,CAiBlB"}
1
+ {"version":3,"file":"runtimeRepeat.d.ts","sourceRoot":"","sources":["../src/runtimeRepeat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,MAAM,EACN,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAIL,KAAK,mCAAmC,EACxC,KAAK,+BAA+B,EACrC,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,8BAA+B,SAAQ,+BAA+B;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,oBAAoB,CAAC,EAAE,mCAAmC,CAAC;CACrE;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;IAC5E,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,8BAA8B,GACtC,4BAA4B,CA0C9B;AAED,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CA4DnC;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAK1B;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,GAAG,MAAM,CAiBlB"}
@@ -1,4 +1,5 @@
1
- import { applyRuntimeBindingDataPath, createRuntimeBindingOperationKey, resolveRuntimeBindingOperationSelection, resolveRuntimeBindingValueSourceSync, } from './runtimeBindings';
1
+ import { resolveRuntimeBindingOperationSelection } from './runtimeApiSelection';
2
+ import { applyRuntimeBindingDataPath, createRuntimeBindingOperationKey, resolveRuntimeBindingValueSourceSync, } from './runtimeBindings';
2
3
  export function resolveRuntimeRepeatItemsSync(repeat, context) {
3
4
  if (repeat.source.kind !== 'operation') {
4
5
  const diagnostics = [];
@@ -27,7 +28,7 @@ export function resolveRuntimeRepeatItemsSync(repeat, context) {
27
28
  status: 'ready',
28
29
  items: [],
29
30
  diagnostics: [
30
- createRepeatDiagnostic(repeat, 'missing-adapter', 'Repeat operation source requires an injected operation executor.'),
31
+ createRepeatDiagnostic(repeat, 'missing-adapter', 'Repeat API operation source requires an injected operation executor.'),
31
32
  ],
32
33
  };
33
34
  }
@@ -46,19 +47,19 @@ export async function resolveRuntimeRepeatItemsAsync(repeat, context) {
46
47
  return {
47
48
  items: [],
48
49
  diagnostics: [
49
- createRepeatDiagnostic(repeat, 'missing-adapter', 'Repeat operation source requires an injected operation executor.'),
50
+ createRepeatDiagnostic(repeat, 'missing-adapter', 'Repeat API operation source requires an injected operation executor.'),
50
51
  ],
51
52
  };
52
53
  }
53
54
  const diagnostics = [];
54
- const selection = resolveRuntimeBindingOperationSelection(repeat.source.operation, context.dataSources, diagnostics);
55
+ const selection = resolveRuntimeBindingOperationSelection(repeat.source.operation, context.apis, diagnostics);
55
56
  if (selection === undefined) {
56
57
  return { items: [], diagnostics };
57
58
  }
58
59
  const result = await context.executeOperation({
59
- operation: repeat.source.operation,
60
- dataSource: selection.dataSource,
60
+ api: selection.api,
61
61
  endpoint: selection.endpoint,
62
+ operation: repeat.source.operation,
62
63
  node: context.node,
63
64
  });
64
65
  diagnostics.push(...(result.diagnostics ?? []));
@@ -106,10 +107,10 @@ function finalizeRuntimeRepeatItems(repeat, value, diagnostics) {
106
107
  }
107
108
  function createRepeatDiagnostic(repeat, code, message) {
108
109
  return {
109
- code,
110
- dataSourceId: repeat.source.kind === 'operation' ? repeat.source.operation.dataSourceId : undefined,
110
+ apiId: repeat.source.kind === 'operation' ? repeat.source.operation.apiId : undefined,
111
111
  endpointId: repeat.source.kind === 'operation' ? repeat.source.operation.endpointId : undefined,
112
112
  operationId: repeat.source.kind === 'operation' ? repeat.source.operation.operationId : undefined,
113
+ code,
113
114
  message,
114
115
  severity: 'error',
115
116
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeRepeat.js","sourceRoot":"","sources":["../src/runtimeRepeat.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n BindingValue,\n DataSourceDiagnostic,\n UiNode,\n UiNodeRepeatSpec,\n} from '@ankhorage/contracts';\n\nimport {\n applyRuntimeBindingDataPath,\n createRuntimeBindingOperationKey,\n resolveRuntimeBindingOperationSelection,\n resolveRuntimeBindingValueSourceSync,\n type RuntimeBindingOperationResultWriter,\n type RuntimeBindingResolutionContext,\n} from './runtimeBindings';\n\nexport interface RuntimeRepeatResolutionContext extends RuntimeBindingResolutionContext {\n readonly node: UiNode;\n readonly writeOperationResult?: RuntimeBindingOperationResultWriter;\n}\n\nexport interface RuntimeRepeatItemsResult {\n readonly items: readonly BindingValue[];\n readonly diagnostics: readonly DataSourceDiagnostic[];\n}\n\nexport interface RuntimeRepeatItemsSyncResult extends RuntimeRepeatItemsResult {\n readonly status: 'ready' | 'pending';\n}\n\nexport function resolveRuntimeRepeatItemsSync(\n repeat: UiNodeRepeatSpec,\n context: RuntimeRepeatResolutionContext,\n): RuntimeRepeatItemsSyncResult {\n if (repeat.source.kind !== 'operation') {\n const diagnostics: DataSourceDiagnostic[] = [];\n const resolved = resolveRuntimeBindingValueSourceSync(repeat.source, context, diagnostics);\n return {\n status: 'ready',\n ...finalizeRuntimeRepeatItems(repeat, resolved, diagnostics),\n };\n }\n\n const operationKey = createRuntimeBindingOperationKey(repeat.source.operation);\n const cached = context.operationResults?.[operationKey];\n if (cached !== undefined) {\n return {\n status: 'ready',\n ...finalizeRuntimeRepeatItems(\n repeat,\n applyRuntimeBindingDataPath(cached, repeat.source.path),\n [],\n ),\n };\n }\n\n if (context.executeOperation !== undefined) {\n return {\n status: 'pending',\n items: [],\n diagnostics: [],\n };\n }\n\n return {\n status: 'ready',\n items: [],\n diagnostics: [\n createRepeatDiagnostic(\n repeat,\n 'missing-adapter',\n 'Repeat operation source requires an injected operation executor.',\n ),\n ],\n };\n}\n\nexport async function resolveRuntimeRepeatItemsAsync(\n repeat: UiNodeRepeatSpec,\n context: RuntimeRepeatResolutionContext,\n): Promise<RuntimeRepeatItemsResult> {\n if (repeat.source.kind !== 'operation') {\n const diagnostics: DataSourceDiagnostic[] = [];\n const resolved = await Promise.resolve(\n resolveRuntimeBindingValueSourceSync(repeat.source, context, diagnostics),\n );\n return finalizeRuntimeRepeatItems(repeat, resolved, diagnostics);\n }\n\n const operationKey = createRuntimeBindingOperationKey(repeat.source.operation);\n const cached = context.operationResults?.[operationKey];\n if (cached !== undefined) {\n return finalizeRuntimeRepeatItems(\n repeat,\n applyRuntimeBindingDataPath(cached, repeat.source.path),\n [],\n );\n }\n\n if (context.executeOperation === undefined) {\n return {\n items: [],\n diagnostics: [\n createRepeatDiagnostic(\n repeat,\n 'missing-adapter',\n 'Repeat operation source requires an injected operation executor.',\n ),\n ],\n };\n }\n\n const diagnostics: DataSourceDiagnostic[] = [];\n const selection = resolveRuntimeBindingOperationSelection(\n repeat.source.operation,\n context.dataSources,\n diagnostics,\n );\n if (selection === undefined) {\n return { items: [], diagnostics };\n }\n\n const result = await context.executeOperation({\n operation: repeat.source.operation,\n dataSource: selection.dataSource,\n endpoint: selection.endpoint,\n node: context.node,\n });\n diagnostics.push(...(result.diagnostics ?? []));\n\n if (!result.ok) {\n return { items: [], diagnostics };\n }\n\n context.writeOperationResult?.(operationKey, result.data);\n return finalizeRuntimeRepeatItems(\n repeat,\n applyRuntimeBindingDataPath(result.data, repeat.source.path),\n diagnostics,\n );\n}\n\nexport function createRuntimeRepeatBindingContext(args: {\n readonly baseContext?: Record<string, unknown>;\n readonly item: BindingValue;\n readonly itemAlias?: string;\n}): Record<string, unknown> {\n return {\n ...(args.baseContext ?? {}),\n [args.itemAlias ?? 'item']: args.item,\n };\n}\n\nexport function resolveRuntimeRepeatItemKey(args: {\n readonly item: BindingValue;\n readonly itemAlias?: string;\n readonly index: number;\n readonly keyPath?: string;\n}): string | number {\n const explicitKey = readRepeatPrimitive(args.item, args.keyPath ?? 'id');\n if (explicitKey !== undefined) {\n return explicitKey;\n }\n\n const fallbackId = readRepeatPrimitive(args.item, 'id');\n if (fallbackId !== undefined) {\n return fallbackId;\n }\n\n const fallbackItemId = readRepeatPrimitive(args.item, 'itemId');\n if (fallbackItemId !== undefined) {\n return fallbackItemId;\n }\n\n return args.index;\n}\n\nfunction finalizeRuntimeRepeatItems(\n repeat: UiNodeRepeatSpec,\n value: BindingValue | undefined,\n diagnostics: readonly DataSourceDiagnostic[],\n): RuntimeRepeatItemsResult {\n if (Array.isArray(value)) {\n return {\n items: value,\n diagnostics,\n };\n }\n\n return {\n items: [],\n diagnostics: [\n ...diagnostics,\n createRepeatDiagnostic(repeat, 'invalid-config', 'Repeat source must resolve to an array.'),\n ],\n };\n}\n\nfunction createRepeatDiagnostic(\n repeat: UiNodeRepeatSpec,\n code: DataSourceDiagnostic['code'],\n message: string,\n): DataSourceDiagnostic {\n return {\n code,\n dataSourceId:\n repeat.source.kind === 'operation' ? repeat.source.operation.dataSourceId : undefined,\n endpointId: repeat.source.kind === 'operation' ? repeat.source.operation.endpointId : undefined,\n operationId:\n repeat.source.kind === 'operation' ? repeat.source.operation.operationId : undefined,\n message,\n severity: 'error',\n };\n}\n\nfunction readRepeatPrimitive(value: BindingValue, path: string): string | number | undefined {\n const resolved = path.split('.').reduce<unknown>((currentValue, part) => {\n if (typeof currentValue !== 'object' || currentValue === null || Array.isArray(currentValue)) {\n return undefined;\n }\n\n return (currentValue as Record<string, unknown>)[part];\n }, value);\n\n if (typeof resolved === 'string' || typeof resolved === 'number') {\n return resolved;\n }\n\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"runtimeRepeat.js","sourceRoot":"","sources":["../src/runtimeRepeat.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n BindingValue,\n DataSourceDiagnostic,\n UiNode,\n UiNodeRepeatSpec,\n} from '@ankhorage/contracts';\n\nimport { resolveRuntimeBindingOperationSelection } from './runtimeApiSelection';\nimport {\n applyRuntimeBindingDataPath,\n createRuntimeBindingOperationKey,\n resolveRuntimeBindingValueSourceSync,\n type RuntimeBindingOperationResultWriter,\n type RuntimeBindingResolutionContext,\n} from './runtimeBindings';\n\nexport interface RuntimeRepeatResolutionContext extends RuntimeBindingResolutionContext {\n readonly node: UiNode;\n readonly writeOperationResult?: RuntimeBindingOperationResultWriter;\n}\n\nexport interface RuntimeRepeatItemsResult {\n readonly items: readonly BindingValue[];\n readonly diagnostics: readonly DataSourceDiagnostic[];\n}\n\nexport interface RuntimeRepeatItemsSyncResult extends RuntimeRepeatItemsResult {\n readonly status: 'ready' | 'pending';\n}\n\nexport function resolveRuntimeRepeatItemsSync(\n repeat: UiNodeRepeatSpec,\n context: RuntimeRepeatResolutionContext,\n): RuntimeRepeatItemsSyncResult {\n if (repeat.source.kind !== 'operation') {\n const diagnostics: DataSourceDiagnostic[] = [];\n const resolved = resolveRuntimeBindingValueSourceSync(repeat.source, context, diagnostics);\n return {\n status: 'ready',\n ...finalizeRuntimeRepeatItems(repeat, resolved, diagnostics),\n };\n }\n\n const operationKey = createRuntimeBindingOperationKey(repeat.source.operation);\n const cached = context.operationResults?.[operationKey];\n if (cached !== undefined) {\n return {\n status: 'ready',\n ...finalizeRuntimeRepeatItems(\n repeat,\n applyRuntimeBindingDataPath(cached, repeat.source.path),\n [],\n ),\n };\n }\n\n if (context.executeOperation !== undefined) {\n return {\n status: 'pending',\n items: [],\n diagnostics: [],\n };\n }\n\n return {\n status: 'ready',\n items: [],\n diagnostics: [\n createRepeatDiagnostic(\n repeat,\n 'missing-adapter',\n 'Repeat API operation source requires an injected operation executor.',\n ),\n ],\n };\n}\n\nexport async function resolveRuntimeRepeatItemsAsync(\n repeat: UiNodeRepeatSpec,\n context: RuntimeRepeatResolutionContext,\n): Promise<RuntimeRepeatItemsResult> {\n if (repeat.source.kind !== 'operation') {\n const diagnostics: DataSourceDiagnostic[] = [];\n const resolved = await Promise.resolve(\n resolveRuntimeBindingValueSourceSync(repeat.source, context, diagnostics),\n );\n return finalizeRuntimeRepeatItems(repeat, resolved, diagnostics);\n }\n\n const operationKey = createRuntimeBindingOperationKey(repeat.source.operation);\n const cached = context.operationResults?.[operationKey];\n if (cached !== undefined) {\n return finalizeRuntimeRepeatItems(\n repeat,\n applyRuntimeBindingDataPath(cached, repeat.source.path),\n [],\n );\n }\n\n if (context.executeOperation === undefined) {\n return {\n items: [],\n diagnostics: [\n createRepeatDiagnostic(\n repeat,\n 'missing-adapter',\n 'Repeat API operation source requires an injected operation executor.',\n ),\n ],\n };\n }\n\n const diagnostics: DataSourceDiagnostic[] = [];\n const selection = resolveRuntimeBindingOperationSelection(\n repeat.source.operation,\n context.apis,\n diagnostics,\n );\n if (selection === undefined) {\n return { items: [], diagnostics };\n }\n\n const result = await context.executeOperation({\n api: selection.api,\n endpoint: selection.endpoint,\n operation: repeat.source.operation,\n node: context.node,\n });\n diagnostics.push(...(result.diagnostics ?? []));\n\n if (!result.ok) {\n return { items: [], diagnostics };\n }\n\n context.writeOperationResult?.(operationKey, result.data);\n return finalizeRuntimeRepeatItems(\n repeat,\n applyRuntimeBindingDataPath(result.data, repeat.source.path),\n diagnostics,\n );\n}\n\nexport function createRuntimeRepeatBindingContext(args: {\n readonly baseContext?: Record<string, unknown>;\n readonly item: BindingValue;\n readonly itemAlias?: string;\n}): Record<string, unknown> {\n return {\n ...(args.baseContext ?? {}),\n [args.itemAlias ?? 'item']: args.item,\n };\n}\n\nexport function resolveRuntimeRepeatItemKey(args: {\n readonly item: BindingValue;\n readonly itemAlias?: string;\n readonly index: number;\n readonly keyPath?: string;\n}): string | number {\n const explicitKey = readRepeatPrimitive(args.item, args.keyPath ?? 'id');\n if (explicitKey !== undefined) {\n return explicitKey;\n }\n\n const fallbackId = readRepeatPrimitive(args.item, 'id');\n if (fallbackId !== undefined) {\n return fallbackId;\n }\n\n const fallbackItemId = readRepeatPrimitive(args.item, 'itemId');\n if (fallbackItemId !== undefined) {\n return fallbackItemId;\n }\n\n return args.index;\n}\n\nfunction finalizeRuntimeRepeatItems(\n repeat: UiNodeRepeatSpec,\n value: BindingValue | undefined,\n diagnostics: readonly DataSourceDiagnostic[],\n): RuntimeRepeatItemsResult {\n if (Array.isArray(value)) {\n return {\n items: value,\n diagnostics,\n };\n }\n\n return {\n items: [],\n diagnostics: [\n ...diagnostics,\n createRepeatDiagnostic(repeat, 'invalid-config', 'Repeat source must resolve to an array.'),\n ],\n };\n}\n\nfunction createRepeatDiagnostic(\n repeat: UiNodeRepeatSpec,\n code: DataSourceDiagnostic['code'],\n message: string,\n): DataSourceDiagnostic {\n return {\n apiId: repeat.source.kind === 'operation' ? repeat.source.operation.apiId : undefined,\n endpointId: repeat.source.kind === 'operation' ? repeat.source.operation.endpointId : undefined,\n operationId:\n repeat.source.kind === 'operation' ? repeat.source.operation.operationId : undefined,\n code,\n message,\n severity: 'error',\n };\n}\n\nfunction readRepeatPrimitive(value: BindingValue, path: string): string | number | undefined {\n const resolved = path.split('.').reduce<unknown>((currentValue, part) => {\n if (typeof currentValue !== 'object' || currentValue === null || Array.isArray(currentValue)) {\n return undefined;\n }\n\n return (currentValue as Record<string, unknown>)[part];\n }, value);\n\n if (typeof resolved === 'string' || typeof resolved === 'number') {\n return resolved;\n }\n\n return undefined;\n}\n"]}
@@ -53,7 +53,7 @@ export declare function completeRuntimeScreenOperationLoaderRequest(args: {
53
53
  };
54
54
  export declare function executeRuntimeScreenOperationLoaders(args: {
55
55
  readonly bindingContext?: Record<string, unknown>;
56
- readonly dataSources?: RuntimeBindingResolutionContext['dataSources'];
56
+ readonly apis?: RuntimeBindingResolutionContext['apis'];
57
57
  readonly executeOperation?: RuntimeBindingOperationExecutor;
58
58
  readonly operationResults?: RuntimeBindingOperationResultCache;
59
59
  readonly screen: ScreenSpec;
@@ -61,7 +61,7 @@ export declare function executeRuntimeScreenOperationLoaders(args: {
61
61
  }): Promise<RuntimeScreenOperationLoaderExecutionResult>;
62
62
  export declare function useRuntimeScreenOperationLoaders(args: {
63
63
  readonly bindingContext?: Record<string, unknown>;
64
- readonly dataSources?: RuntimeBindingResolutionContext['dataSources'];
64
+ readonly apis?: RuntimeBindingResolutionContext['apis'];
65
65
  readonly executeOperation?: RuntimeBindingOperationExecutor;
66
66
  readonly operationResults?: RuntimeBindingOperationResultCache;
67
67
  readonly onDiagnostics?: (diagnostics: readonly DataSourceDiagnostic[]) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeScreenLoaders.d.ts","sourceRoot":"","sources":["../src/runtimeScreenLoaders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtimeScreenLoaders.d.ts","sourceRoot":"","sources":["../src/runtimeScreenLoaders.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { createRuntimeBindingOperationKey, resolveBindingInputMapSync, resolveRuntimeBindingOperationSelection, } from './runtimeBindings';
2
+ import { resolveRuntimeBindingOperationSelection } from './runtimeApiSelection';
3
+ import { createRuntimeBindingOperationKey, resolveBindingInputMapSync, } from './runtimeBindings';
3
4
  const EMPTY_RUNTIME_SCREEN_OPERATION_LOADER_DIAGNOSTICS = Object.freeze([]);
4
5
  const EMPTY_RUNTIME_SCREEN_OPERATION_RESULTS = Object.freeze({});
5
6
  export function resolveScreenOperationLoaders(screen) {
@@ -101,7 +102,7 @@ export async function executeRuntimeScreenOperationLoaders(args) {
101
102
  screenId: args.screen.id,
102
103
  });
103
104
  return executePreparedRuntimeScreenOperationLoaders({
104
- dataSources: args.dataSources,
105
+ apis: args.apis,
105
106
  executeOperation: args.executeOperation,
106
107
  plan,
107
108
  screen: args.screen,
@@ -117,7 +118,7 @@ function executePreparedRuntimeScreenOperationLoaders(args) {
117
118
  });
118
119
  }
119
120
  if (args.executeOperation === undefined) {
120
- diagnostics.push(...args.plan.loaders.map((preparedLoader) => createScreenOperationLoaderDiagnostic(preparedLoader.loader, 'missing-adapter', 'Screen operation loader requires an injected operation executor.')));
121
+ diagnostics.push(...args.plan.loaders.map((preparedLoader) => createScreenOperationLoaderDiagnostic(preparedLoader.loader, 'missing-adapter', 'Screen API operation loader requires an injected operation executor.')));
121
122
  return Promise.resolve({
122
123
  dependencyKey: args.plan.requestKey,
123
124
  diagnostics,
@@ -128,12 +129,12 @@ function executePreparedRuntimeScreenOperationLoaders(args) {
128
129
  return (async () => {
129
130
  const operationResults = {};
130
131
  for (const preparedLoader of args.plan.loaders) {
131
- const selection = resolveRuntimeBindingOperationSelection(preparedLoader.loader.operation, args.dataSources, diagnostics);
132
+ const selection = resolveRuntimeBindingOperationSelection(preparedLoader.loader.operation, args.apis, diagnostics);
132
133
  if (selection === undefined) {
133
134
  continue;
134
135
  }
135
136
  const result = await executeOperation({
136
- dataSource: selection.dataSource,
137
+ api: selection.api,
137
138
  endpoint: selection.endpoint,
138
139
  input: preparedLoader.input,
139
140
  node: args.screen.root,
@@ -174,7 +175,7 @@ export function useRuntimeScreenOperationLoaders(args) {
174
175
  const lifecycleRef = React.useRef(createRuntimeScreenOperationLoaderLifecycle());
175
176
  const executionArgsByRequestKeyRef = React.useRef({});
176
177
  executionArgsByRequestKeyRef.current[requestKey] = {
177
- dataSources: args.dataSources,
178
+ apis: args.apis,
178
179
  executeOperation: args.executeOperation,
179
180
  plan,
180
181
  screen: args.screen,
@@ -275,8 +276,8 @@ function createRuntimeScreenOperationLoaderPlanRequestKey(args) {
275
276
  }
276
277
  function createScreenOperationLoaderDiagnostic(loader, code, message) {
277
278
  return {
279
+ apiId: loader.operation.apiId,
278
280
  code,
279
- dataSourceId: loader.operation.dataSourceId,
280
281
  endpointId: loader.operation.endpointId,
281
282
  operationId: loader.operation.operationId,
282
283
  message,
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeScreenLoaders.js","sourceRoot":"","sources":["../src/runtimeScreenLoaders.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n BindingValue,\n DataSourceDiagnostic,\n OperationScreenDataLoaderDefinition,\n ScreenSpec,\n} from '@ankhorage/contracts';\nimport React from 'react';\n\nimport {\n createRuntimeBindingOperationKey,\n resolveBindingInputMapSync,\n resolveRuntimeBindingOperationSelection,\n type RuntimeBindingOperationExecutor,\n type RuntimeBindingOperationResultCache,\n type RuntimeBindingResolutionContext,\n} from './runtimeBindings';\n\nexport interface RuntimeScreenOperationLoaderState {\n readonly dependencyKey: string;\n readonly diagnostics: readonly DataSourceDiagnostic[];\n readonly operationResults: RuntimeBindingOperationResultCache;\n readonly renderVersion: number;\n}\n\nexport interface RuntimeScreenOperationLoaderExecutionResult {\n readonly dependencyKey: string;\n readonly diagnostics: readonly DataSourceDiagnostic[];\n readonly operationResults: RuntimeBindingOperationResultCache;\n}\n\nexport interface RuntimeScreenOperationLoaderLifecycle {\n readonly activeRequestId: number;\n readonly activeRequestKey: string | null;\n}\n\nconst EMPTY_RUNTIME_SCREEN_OPERATION_LOADER_DIAGNOSTICS = Object.freeze(\n [],\n) as readonly DataSourceDiagnostic[];\nconst EMPTY_RUNTIME_SCREEN_OPERATION_RESULTS = Object.freeze(\n {},\n) as RuntimeBindingOperationResultCache;\n\nexport function resolveScreenOperationLoaders(\n screen: ScreenSpec,\n): readonly OperationScreenDataLoaderDefinition[] {\n return screen.dataLoaders ?? [];\n}\n\nexport function createRuntimeScreenLoaderRequestKey(args: {\n readonly screenId: string;\n readonly loaders: readonly OperationScreenDataLoaderDefinition[];\n readonly bindingContext?: Record<string, unknown>;\n readonly operationResults?: RuntimeBindingOperationResultCache;\n}): string {\n return createRuntimeScreenOperationLoaderPlan({\n bindingContext: args.bindingContext,\n loaders: args.loaders,\n operationResults: args.operationResults,\n screenId: args.screenId,\n }).requestKey;\n}\n\nexport function createRuntimeScreenOperationLoaderLifecycle(): RuntimeScreenOperationLoaderLifecycle {\n return {\n activeRequestId: 0,\n activeRequestKey: null,\n };\n}\n\nexport function createIdleRuntimeScreenOperationLoaderState(args: {\n readonly dependencyKey: string;\n readonly previousState?: RuntimeScreenOperationLoaderState;\n}): RuntimeScreenOperationLoaderState {\n return {\n dependencyKey: args.dependencyKey,\n diagnostics: EMPTY_RUNTIME_SCREEN_OPERATION_LOADER_DIAGNOSTICS,\n operationResults: EMPTY_RUNTIME_SCREEN_OPERATION_RESULTS,\n renderVersion: args.previousState?.renderVersion ?? 0,\n };\n}\n\nexport function createPendingRuntimeScreenOperationLoaderState(args: {\n readonly dependencyKey: string;\n readonly previousState?: RuntimeScreenOperationLoaderState;\n}): RuntimeScreenOperationLoaderState {\n return {\n dependencyKey: args.dependencyKey,\n diagnostics: [],\n operationResults: {},\n renderVersion: (args.previousState?.renderVersion ?? -1) + 1,\n };\n}\n\nexport function beginRuntimeScreenOperationLoaderRequest(args: {\n readonly hasLoaders: boolean;\n readonly lifecycle: RuntimeScreenOperationLoaderLifecycle;\n readonly requestKey: string;\n readonly state: RuntimeScreenOperationLoaderState;\n}): {\n readonly lifecycle: RuntimeScreenOperationLoaderLifecycle;\n readonly requestId?: number;\n readonly shouldExecute: boolean;\n readonly state: RuntimeScreenOperationLoaderState;\n} {\n if (!args.hasLoaders) {\n if (args.lifecycle.activeRequestKey === null) {\n return {\n lifecycle: args.lifecycle,\n shouldExecute: false,\n state: args.state,\n };\n }\n\n return {\n lifecycle: {\n activeRequestId: args.lifecycle.activeRequestId + 1,\n activeRequestKey: null,\n },\n shouldExecute: false,\n state: args.state,\n };\n }\n\n if (args.lifecycle.activeRequestKey === args.requestKey) {\n return {\n lifecycle: args.lifecycle,\n shouldExecute: false,\n state: args.state,\n };\n }\n\n const requestId = args.lifecycle.activeRequestId + 1;\n\n return {\n lifecycle: {\n activeRequestId: requestId,\n activeRequestKey: args.requestKey,\n },\n requestId,\n shouldExecute: true,\n state:\n args.state.dependencyKey === args.requestKey\n ? args.state\n : createPendingRuntimeScreenOperationLoaderState({\n dependencyKey: args.requestKey,\n previousState: args.state,\n }),\n };\n}\n\nexport function completeRuntimeScreenOperationLoaderRequest(args: {\n readonly lifecycle: RuntimeScreenOperationLoaderLifecycle;\n readonly requestId: number;\n readonly result: RuntimeScreenOperationLoaderExecutionResult;\n readonly state: RuntimeScreenOperationLoaderState;\n}): {\n readonly accepted: boolean;\n readonly state: RuntimeScreenOperationLoaderState;\n} {\n if (args.lifecycle.activeRequestId !== args.requestId) {\n return {\n accepted: false,\n state: args.state,\n };\n }\n\n return {\n accepted: true,\n state: {\n dependencyKey: args.result.dependencyKey,\n diagnostics: args.result.diagnostics,\n operationResults: args.result.operationResults,\n renderVersion: args.state.renderVersion,\n },\n };\n}\n\nexport async function executeRuntimeScreenOperationLoaders(args: {\n readonly bindingContext?: Record<string, unknown>;\n readonly dataSources?: RuntimeBindingResolutionContext['dataSources'];\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n readonly operationResults?: RuntimeBindingOperationResultCache;\n readonly screen: ScreenSpec;\n readonly loaders: readonly OperationScreenDataLoaderDefinition[];\n}): Promise<RuntimeScreenOperationLoaderExecutionResult> {\n const plan = createRuntimeScreenOperationLoaderPlan({\n bindingContext: args.bindingContext,\n loaders: args.loaders,\n operationResults: args.operationResults,\n screenId: args.screen.id,\n });\n\n return executePreparedRuntimeScreenOperationLoaders({\n dataSources: args.dataSources,\n executeOperation: args.executeOperation,\n plan,\n screen: args.screen,\n });\n}\n\nfunction executePreparedRuntimeScreenOperationLoaders(args: {\n readonly dataSources?: RuntimeBindingResolutionContext['dataSources'];\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n readonly plan: RuntimeScreenOperationLoaderPlan;\n readonly screen: ScreenSpec;\n}): Promise<RuntimeScreenOperationLoaderExecutionResult> {\n const diagnostics: DataSourceDiagnostic[] = [...args.plan.diagnostics];\n\n if (args.plan.loaders.length === 0) {\n return Promise.resolve({\n dependencyKey: args.plan.requestKey,\n diagnostics,\n operationResults: {},\n });\n }\n\n if (args.executeOperation === undefined) {\n diagnostics.push(\n ...args.plan.loaders.map((preparedLoader) =>\n createScreenOperationLoaderDiagnostic(\n preparedLoader.loader,\n 'missing-adapter',\n 'Screen operation loader requires an injected operation executor.',\n ),\n ),\n );\n\n return Promise.resolve({\n dependencyKey: args.plan.requestKey,\n diagnostics,\n operationResults: {},\n });\n }\n const { executeOperation } = args;\n\n return (async () => {\n const operationResults: Record<string, BindingValue | undefined> = {};\n\n for (const preparedLoader of args.plan.loaders) {\n const selection = resolveRuntimeBindingOperationSelection(\n preparedLoader.loader.operation,\n args.dataSources,\n diagnostics,\n );\n if (selection === undefined) {\n continue;\n }\n\n const result = await executeOperation({\n dataSource: selection.dataSource,\n endpoint: selection.endpoint,\n input: preparedLoader.input,\n node: args.screen.root,\n operation: preparedLoader.loader.operation,\n });\n diagnostics.push(...(result.diagnostics ?? []));\n\n if (!result.ok) {\n continue;\n }\n\n operationResults[preparedLoader.operationKey] = result.data;\n }\n\n return {\n dependencyKey: args.plan.requestKey,\n diagnostics,\n operationResults,\n };\n })();\n}\n\nexport function useRuntimeScreenOperationLoaders(args: {\n readonly bindingContext?: Record<string, unknown>;\n readonly dataSources?: RuntimeBindingResolutionContext['dataSources'];\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n readonly operationResults?: RuntimeBindingOperationResultCache;\n readonly onDiagnostics?: (diagnostics: readonly DataSourceDiagnostic[]) => void;\n readonly screen: ScreenSpec;\n}): RuntimeScreenOperationLoaderState {\n const loaders = React.useMemo(() => resolveScreenOperationLoaders(args.screen), [args.screen]);\n const hasLoaders = loaders.length > 0;\n const plan = React.useMemo(\n () =>\n createRuntimeScreenOperationLoaderPlan({\n bindingContext: args.bindingContext,\n loaders,\n operationResults: args.operationResults,\n screenId: args.screen.id,\n }),\n [args.bindingContext, args.operationResults, args.screen.id, loaders],\n );\n const { requestKey } = plan;\n const emptyState = React.useMemo(\n () =>\n createIdleRuntimeScreenOperationLoaderState({\n dependencyKey: requestKey,\n }),\n [requestKey],\n );\n const [state, setState] = React.useState<RuntimeScreenOperationLoaderState>(() =>\n hasLoaders\n ? createPendingRuntimeScreenOperationLoaderState({ dependencyKey: requestKey })\n : emptyState,\n );\n const effectiveState = hasLoaders ? state : emptyState;\n const lastDiagnosticsKeyRef = React.useRef<string | null>(null);\n const latestStateRef = React.useRef(state);\n const lifecycleRef = React.useRef<RuntimeScreenOperationLoaderLifecycle>(\n createRuntimeScreenOperationLoaderLifecycle(),\n );\n const executionArgsByRequestKeyRef = React.useRef<\n Record<string, RuntimeScreenPreparedExecutionArgs>\n >({});\n\n executionArgsByRequestKeyRef.current[requestKey] = {\n dataSources: args.dataSources,\n executeOperation: args.executeOperation,\n plan,\n screen: args.screen,\n };\n latestStateRef.current = state;\n\n React.useEffect(() => {\n const request = beginRuntimeScreenOperationLoaderRequest({\n hasLoaders,\n lifecycle: lifecycleRef.current,\n requestKey,\n state: latestStateRef.current,\n });\n\n lifecycleRef.current = request.lifecycle;\n\n if (request.state !== latestStateRef.current) {\n setState(request.state);\n }\n\n if (!request.shouldExecute || request.requestId === undefined) {\n return;\n }\n const { requestId } = request;\n\n void (async () => {\n const executionArgs = executionArgsByRequestKeyRef.current[requestKey];\n if (executionArgs === undefined) {\n return;\n }\n\n const result = await executePreparedRuntimeScreenOperationLoaders(executionArgs);\n\n setState((currentState) => {\n const completion = completeRuntimeScreenOperationLoaderRequest({\n lifecycle: lifecycleRef.current,\n requestId,\n result,\n state: currentState,\n });\n\n return completion.accepted ? completion.state : currentState;\n });\n })();\n }, [hasLoaders, requestKey]);\n\n React.useEffect(() => {\n if (effectiveState.diagnostics.length === 0) {\n return;\n }\n\n const diagnosticsKey = stableSerialize(effectiveState.diagnostics);\n if (lastDiagnosticsKeyRef.current === diagnosticsKey) {\n return;\n }\n\n lastDiagnosticsKeyRef.current = diagnosticsKey;\n args.onDiagnostics?.(effectiveState.diagnostics);\n }, [args.onDiagnostics, effectiveState.diagnostics]);\n\n return effectiveState;\n}\n\ninterface PreparedRuntimeScreenOperationLoader {\n readonly input?: BindingValue;\n readonly loader: OperationScreenDataLoaderDefinition;\n readonly operationKey: string;\n}\n\ninterface RuntimeScreenOperationLoaderPlan {\n readonly diagnostics: readonly DataSourceDiagnostic[];\n readonly loaders: readonly PreparedRuntimeScreenOperationLoader[];\n readonly requestKey: string;\n}\n\ninterface RuntimeScreenPreparedExecutionArgs {\n readonly dataSources?: RuntimeBindingResolutionContext['dataSources'];\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n readonly plan: RuntimeScreenOperationLoaderPlan;\n readonly screen: ScreenSpec;\n}\n\nfunction createRuntimeScreenOperationLoaderPlan(args: {\n readonly bindingContext?: Record<string, unknown>;\n readonly loaders: readonly OperationScreenDataLoaderDefinition[];\n readonly operationResults?: RuntimeBindingOperationResultCache;\n readonly screenId: string;\n}): RuntimeScreenOperationLoaderPlan {\n if (args.loaders.length === 0) {\n return {\n diagnostics: EMPTY_RUNTIME_SCREEN_OPERATION_LOADER_DIAGNOSTICS,\n loaders: [],\n requestKey: createRuntimeScreenOperationLoaderIdleKey(args.screenId),\n };\n }\n\n const diagnostics: DataSourceDiagnostic[] = [];\n const preparedLoaders: PreparedRuntimeScreenOperationLoader[] = [];\n const operationKeys = new Set<string>();\n\n for (const loader of args.loaders) {\n const input = resolveBindingInputMapSync(\n loader.input,\n {\n context: args.bindingContext,\n operationResults: args.operationResults,\n },\n diagnostics,\n );\n const operationKey = createRuntimeBindingOperationKey(loader.operation);\n if (operationKeys.has(operationKey)) {\n diagnostics.push(\n createScreenOperationLoaderDiagnostic(\n loader,\n 'duplicate-operation-id',\n `Screen operation loaders must not reuse operation key '${operationKey}' on the same screen.`,\n ),\n );\n continue;\n }\n\n operationKeys.add(operationKey);\n preparedLoaders.push({\n input,\n loader,\n operationKey,\n });\n }\n\n return {\n diagnostics,\n loaders: preparedLoaders,\n requestKey: createRuntimeScreenOperationLoaderPlanRequestKey({\n loaders: preparedLoaders,\n screenId: args.screenId,\n }),\n };\n}\n\nfunction createRuntimeScreenOperationLoaderPlanRequestKey(args: {\n readonly loaders: readonly PreparedRuntimeScreenOperationLoader[];\n readonly screenId: string;\n}): string {\n return stableSerialize({\n loaders: args.loaders.map((loader) => ({\n id: loader.loader.id,\n input: loader.input,\n operation: loader.loader.operation,\n operationKey: loader.operationKey,\n })),\n screenId: args.screenId,\n });\n}\n\nfunction createScreenOperationLoaderDiagnostic(\n loader: OperationScreenDataLoaderDefinition,\n code: DataSourceDiagnostic['code'],\n message: string,\n): DataSourceDiagnostic {\n return {\n code,\n dataSourceId: loader.operation.dataSourceId,\n endpointId: loader.operation.endpointId,\n operationId: loader.operation.operationId,\n message,\n severity: 'error',\n };\n}\n\nfunction createRuntimeScreenOperationLoaderIdleKey(screenId: string): string {\n return `screen:${screenId}:no-operation-loaders`;\n}\n\nfunction stableSerialize(value: unknown): string {\n return JSON.stringify(sortSerializableValue(value));\n}\n\nfunction sortSerializableValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortSerializableValue);\n }\n\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n return Object.keys(value)\n .sort((left, right) => left.localeCompare(right))\n .reduce<Record<string, unknown>>((result, key) => {\n result[key] = sortSerializableValue((value as Record<string, unknown>)[key]);\n return result;\n }, {});\n}\n"]}
1
+ {"version":3,"file":"runtimeScreenLoaders.js","sourceRoot":"","sources":["../src/runtimeScreenLoaders.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n BindingValue,\n DataSourceDiagnostic,\n OperationScreenDataLoaderDefinition,\n ScreenSpec,\n} from '@ankhorage/contracts';\nimport React from 'react';\n\nimport { resolveRuntimeBindingOperationSelection } from './runtimeApiSelection';\nimport {\n createRuntimeBindingOperationKey,\n resolveBindingInputMapSync,\n type RuntimeBindingOperationExecutor,\n type RuntimeBindingOperationResultCache,\n type RuntimeBindingResolutionContext,\n} from './runtimeBindings';\n\nexport interface RuntimeScreenOperationLoaderState {\n readonly dependencyKey: string;\n readonly diagnostics: readonly DataSourceDiagnostic[];\n readonly operationResults: RuntimeBindingOperationResultCache;\n readonly renderVersion: number;\n}\n\nexport interface RuntimeScreenOperationLoaderExecutionResult {\n readonly dependencyKey: string;\n readonly diagnostics: readonly DataSourceDiagnostic[];\n readonly operationResults: RuntimeBindingOperationResultCache;\n}\n\nexport interface RuntimeScreenOperationLoaderLifecycle {\n readonly activeRequestId: number;\n readonly activeRequestKey: string | null;\n}\n\nconst EMPTY_RUNTIME_SCREEN_OPERATION_LOADER_DIAGNOSTICS = Object.freeze(\n [],\n) as readonly DataSourceDiagnostic[];\nconst EMPTY_RUNTIME_SCREEN_OPERATION_RESULTS = Object.freeze(\n {},\n) as RuntimeBindingOperationResultCache;\n\nexport function resolveScreenOperationLoaders(\n screen: ScreenSpec,\n): readonly OperationScreenDataLoaderDefinition[] {\n return screen.dataLoaders ?? [];\n}\n\nexport function createRuntimeScreenLoaderRequestKey(args: {\n readonly screenId: string;\n readonly loaders: readonly OperationScreenDataLoaderDefinition[];\n readonly bindingContext?: Record<string, unknown>;\n readonly operationResults?: RuntimeBindingOperationResultCache;\n}): string {\n return createRuntimeScreenOperationLoaderPlan({\n bindingContext: args.bindingContext,\n loaders: args.loaders,\n operationResults: args.operationResults,\n screenId: args.screenId,\n }).requestKey;\n}\n\nexport function createRuntimeScreenOperationLoaderLifecycle(): RuntimeScreenOperationLoaderLifecycle {\n return {\n activeRequestId: 0,\n activeRequestKey: null,\n };\n}\n\nexport function createIdleRuntimeScreenOperationLoaderState(args: {\n readonly dependencyKey: string;\n readonly previousState?: RuntimeScreenOperationLoaderState;\n}): RuntimeScreenOperationLoaderState {\n return {\n dependencyKey: args.dependencyKey,\n diagnostics: EMPTY_RUNTIME_SCREEN_OPERATION_LOADER_DIAGNOSTICS,\n operationResults: EMPTY_RUNTIME_SCREEN_OPERATION_RESULTS,\n renderVersion: args.previousState?.renderVersion ?? 0,\n };\n}\n\nexport function createPendingRuntimeScreenOperationLoaderState(args: {\n readonly dependencyKey: string;\n readonly previousState?: RuntimeScreenOperationLoaderState;\n}): RuntimeScreenOperationLoaderState {\n return {\n dependencyKey: args.dependencyKey,\n diagnostics: [],\n operationResults: {},\n renderVersion: (args.previousState?.renderVersion ?? -1) + 1,\n };\n}\n\nexport function beginRuntimeScreenOperationLoaderRequest(args: {\n readonly hasLoaders: boolean;\n readonly lifecycle: RuntimeScreenOperationLoaderLifecycle;\n readonly requestKey: string;\n readonly state: RuntimeScreenOperationLoaderState;\n}): {\n readonly lifecycle: RuntimeScreenOperationLoaderLifecycle;\n readonly requestId?: number;\n readonly shouldExecute: boolean;\n readonly state: RuntimeScreenOperationLoaderState;\n} {\n if (!args.hasLoaders) {\n if (args.lifecycle.activeRequestKey === null) {\n return {\n lifecycle: args.lifecycle,\n shouldExecute: false,\n state: args.state,\n };\n }\n\n return {\n lifecycle: {\n activeRequestId: args.lifecycle.activeRequestId + 1,\n activeRequestKey: null,\n },\n shouldExecute: false,\n state: args.state,\n };\n }\n\n if (args.lifecycle.activeRequestKey === args.requestKey) {\n return {\n lifecycle: args.lifecycle,\n shouldExecute: false,\n state: args.state,\n };\n }\n\n const requestId = args.lifecycle.activeRequestId + 1;\n\n return {\n lifecycle: {\n activeRequestId: requestId,\n activeRequestKey: args.requestKey,\n },\n requestId,\n shouldExecute: true,\n state:\n args.state.dependencyKey === args.requestKey\n ? args.state\n : createPendingRuntimeScreenOperationLoaderState({\n dependencyKey: args.requestKey,\n previousState: args.state,\n }),\n };\n}\n\nexport function completeRuntimeScreenOperationLoaderRequest(args: {\n readonly lifecycle: RuntimeScreenOperationLoaderLifecycle;\n readonly requestId: number;\n readonly result: RuntimeScreenOperationLoaderExecutionResult;\n readonly state: RuntimeScreenOperationLoaderState;\n}): {\n readonly accepted: boolean;\n readonly state: RuntimeScreenOperationLoaderState;\n} {\n if (args.lifecycle.activeRequestId !== args.requestId) {\n return {\n accepted: false,\n state: args.state,\n };\n }\n\n return {\n accepted: true,\n state: {\n dependencyKey: args.result.dependencyKey,\n diagnostics: args.result.diagnostics,\n operationResults: args.result.operationResults,\n renderVersion: args.state.renderVersion,\n },\n };\n}\n\nexport async function executeRuntimeScreenOperationLoaders(args: {\n readonly bindingContext?: Record<string, unknown>;\n readonly apis?: RuntimeBindingResolutionContext['apis'];\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n readonly operationResults?: RuntimeBindingOperationResultCache;\n readonly screen: ScreenSpec;\n readonly loaders: readonly OperationScreenDataLoaderDefinition[];\n}): Promise<RuntimeScreenOperationLoaderExecutionResult> {\n const plan = createRuntimeScreenOperationLoaderPlan({\n bindingContext: args.bindingContext,\n loaders: args.loaders,\n operationResults: args.operationResults,\n screenId: args.screen.id,\n });\n\n return executePreparedRuntimeScreenOperationLoaders({\n apis: args.apis,\n executeOperation: args.executeOperation,\n plan,\n screen: args.screen,\n });\n}\n\nfunction executePreparedRuntimeScreenOperationLoaders(args: {\n readonly apis?: RuntimeBindingResolutionContext['apis'];\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n readonly plan: RuntimeScreenOperationLoaderPlan;\n readonly screen: ScreenSpec;\n}): Promise<RuntimeScreenOperationLoaderExecutionResult> {\n const diagnostics: DataSourceDiagnostic[] = [...args.plan.diagnostics];\n\n if (args.plan.loaders.length === 0) {\n return Promise.resolve({\n dependencyKey: args.plan.requestKey,\n diagnostics,\n operationResults: {},\n });\n }\n\n if (args.executeOperation === undefined) {\n diagnostics.push(\n ...args.plan.loaders.map((preparedLoader) =>\n createScreenOperationLoaderDiagnostic(\n preparedLoader.loader,\n 'missing-adapter',\n 'Screen API operation loader requires an injected operation executor.',\n ),\n ),\n );\n\n return Promise.resolve({\n dependencyKey: args.plan.requestKey,\n diagnostics,\n operationResults: {},\n });\n }\n const { executeOperation } = args;\n\n return (async () => {\n const operationResults: Record<string, BindingValue | undefined> = {};\n\n for (const preparedLoader of args.plan.loaders) {\n const selection = resolveRuntimeBindingOperationSelection(\n preparedLoader.loader.operation,\n args.apis,\n diagnostics,\n );\n if (selection === undefined) {\n continue;\n }\n\n const result = await executeOperation({\n api: selection.api,\n endpoint: selection.endpoint,\n input: preparedLoader.input,\n node: args.screen.root,\n operation: preparedLoader.loader.operation,\n });\n diagnostics.push(...(result.diagnostics ?? []));\n\n if (!result.ok) {\n continue;\n }\n\n operationResults[preparedLoader.operationKey] = result.data;\n }\n\n return {\n dependencyKey: args.plan.requestKey,\n diagnostics,\n operationResults,\n };\n })();\n}\n\nexport function useRuntimeScreenOperationLoaders(args: {\n readonly bindingContext?: Record<string, unknown>;\n readonly apis?: RuntimeBindingResolutionContext['apis'];\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n readonly operationResults?: RuntimeBindingOperationResultCache;\n readonly onDiagnostics?: (diagnostics: readonly DataSourceDiagnostic[]) => void;\n readonly screen: ScreenSpec;\n}): RuntimeScreenOperationLoaderState {\n const loaders = React.useMemo(() => resolveScreenOperationLoaders(args.screen), [args.screen]);\n const hasLoaders = loaders.length > 0;\n const plan = React.useMemo(\n () =>\n createRuntimeScreenOperationLoaderPlan({\n bindingContext: args.bindingContext,\n loaders,\n operationResults: args.operationResults,\n screenId: args.screen.id,\n }),\n [args.bindingContext, args.operationResults, args.screen.id, loaders],\n );\n const { requestKey } = plan;\n const emptyState = React.useMemo(\n () =>\n createIdleRuntimeScreenOperationLoaderState({\n dependencyKey: requestKey,\n }),\n [requestKey],\n );\n const [state, setState] = React.useState<RuntimeScreenOperationLoaderState>(() =>\n hasLoaders\n ? createPendingRuntimeScreenOperationLoaderState({ dependencyKey: requestKey })\n : emptyState,\n );\n const effectiveState = hasLoaders ? state : emptyState;\n const lastDiagnosticsKeyRef = React.useRef<string | null>(null);\n const latestStateRef = React.useRef(state);\n const lifecycleRef = React.useRef<RuntimeScreenOperationLoaderLifecycle>(\n createRuntimeScreenOperationLoaderLifecycle(),\n );\n const executionArgsByRequestKeyRef = React.useRef<\n Record<string, RuntimeScreenPreparedExecutionArgs>\n >({});\n\n executionArgsByRequestKeyRef.current[requestKey] = {\n apis: args.apis,\n executeOperation: args.executeOperation,\n plan,\n screen: args.screen,\n };\n latestStateRef.current = state;\n\n React.useEffect(() => {\n const request = beginRuntimeScreenOperationLoaderRequest({\n hasLoaders,\n lifecycle: lifecycleRef.current,\n requestKey,\n state: latestStateRef.current,\n });\n\n lifecycleRef.current = request.lifecycle;\n\n if (request.state !== latestStateRef.current) {\n setState(request.state);\n }\n\n if (!request.shouldExecute || request.requestId === undefined) {\n return;\n }\n const { requestId } = request;\n\n void (async () => {\n const executionArgs = executionArgsByRequestKeyRef.current[requestKey];\n if (executionArgs === undefined) {\n return;\n }\n\n const result = await executePreparedRuntimeScreenOperationLoaders(executionArgs);\n\n setState((currentState) => {\n const completion = completeRuntimeScreenOperationLoaderRequest({\n lifecycle: lifecycleRef.current,\n requestId,\n result,\n state: currentState,\n });\n\n return completion.accepted ? completion.state : currentState;\n });\n })();\n }, [hasLoaders, requestKey]);\n\n React.useEffect(() => {\n if (effectiveState.diagnostics.length === 0) {\n return;\n }\n\n const diagnosticsKey = stableSerialize(effectiveState.diagnostics);\n if (lastDiagnosticsKeyRef.current === diagnosticsKey) {\n return;\n }\n\n lastDiagnosticsKeyRef.current = diagnosticsKey;\n args.onDiagnostics?.(effectiveState.diagnostics);\n }, [args.onDiagnostics, effectiveState.diagnostics]);\n\n return effectiveState;\n}\n\ninterface PreparedRuntimeScreenOperationLoader {\n readonly input?: BindingValue;\n readonly loader: OperationScreenDataLoaderDefinition;\n readonly operationKey: string;\n}\n\ninterface RuntimeScreenOperationLoaderPlan {\n readonly diagnostics: readonly DataSourceDiagnostic[];\n readonly loaders: readonly PreparedRuntimeScreenOperationLoader[];\n readonly requestKey: string;\n}\n\ninterface RuntimeScreenPreparedExecutionArgs {\n readonly apis?: RuntimeBindingResolutionContext['apis'];\n readonly executeOperation?: RuntimeBindingOperationExecutor;\n readonly plan: RuntimeScreenOperationLoaderPlan;\n readonly screen: ScreenSpec;\n}\n\nfunction createRuntimeScreenOperationLoaderPlan(args: {\n readonly bindingContext?: Record<string, unknown>;\n readonly loaders: readonly OperationScreenDataLoaderDefinition[];\n readonly operationResults?: RuntimeBindingOperationResultCache;\n readonly screenId: string;\n}): RuntimeScreenOperationLoaderPlan {\n if (args.loaders.length === 0) {\n return {\n diagnostics: EMPTY_RUNTIME_SCREEN_OPERATION_LOADER_DIAGNOSTICS,\n loaders: [],\n requestKey: createRuntimeScreenOperationLoaderIdleKey(args.screenId),\n };\n }\n\n const diagnostics: DataSourceDiagnostic[] = [];\n const preparedLoaders: PreparedRuntimeScreenOperationLoader[] = [];\n const operationKeys = new Set<string>();\n\n for (const loader of args.loaders) {\n const input = resolveBindingInputMapSync(\n loader.input,\n {\n context: args.bindingContext,\n operationResults: args.operationResults,\n },\n diagnostics,\n );\n const operationKey = createRuntimeBindingOperationKey(loader.operation);\n if (operationKeys.has(operationKey)) {\n diagnostics.push(\n createScreenOperationLoaderDiagnostic(\n loader,\n 'duplicate-operation-id',\n `Screen operation loaders must not reuse operation key '${operationKey}' on the same screen.`,\n ),\n );\n continue;\n }\n\n operationKeys.add(operationKey);\n preparedLoaders.push({\n input,\n loader,\n operationKey,\n });\n }\n\n return {\n diagnostics,\n loaders: preparedLoaders,\n requestKey: createRuntimeScreenOperationLoaderPlanRequestKey({\n loaders: preparedLoaders,\n screenId: args.screenId,\n }),\n };\n}\n\nfunction createRuntimeScreenOperationLoaderPlanRequestKey(args: {\n readonly loaders: readonly PreparedRuntimeScreenOperationLoader[];\n readonly screenId: string;\n}): string {\n return stableSerialize({\n loaders: args.loaders.map((loader) => ({\n id: loader.loader.id,\n input: loader.input,\n operation: loader.loader.operation,\n operationKey: loader.operationKey,\n })),\n screenId: args.screenId,\n });\n}\n\nfunction createScreenOperationLoaderDiagnostic(\n loader: OperationScreenDataLoaderDefinition,\n code: DataSourceDiagnostic['code'],\n message: string,\n): DataSourceDiagnostic {\n return {\n apiId: loader.operation.apiId,\n code,\n endpointId: loader.operation.endpointId,\n operationId: loader.operation.operationId,\n message,\n severity: 'error',\n };\n}\n\nfunction createRuntimeScreenOperationLoaderIdleKey(screenId: string): string {\n return `screen:${screenId}:no-operation-loaders`;\n}\n\nfunction stableSerialize(value: unknown): string {\n return JSON.stringify(sortSerializableValue(value));\n}\n\nfunction sortSerializableValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortSerializableValue);\n }\n\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n return Object.keys(value)\n .sort((left, right) => left.localeCompare(right))\n .reduce<Record<string, unknown>>((result, key) => {\n result[key] = sortSerializableValue((value as Record<string, unknown>)[key]);\n return result;\n }, {});\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ankhorage/runtime",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "Platform-neutral runtime renderer, contracts, and helpers for Ankhorage generated apps.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -60,18 +60,18 @@
60
60
  "version-packages": "changeset version"
61
61
  },
62
62
  "dependencies": {
63
- "@ankhorage/contracts": "^7.4.0",
64
- "@ankhorage/data-sources": "^1.0.0"
63
+ "@ankhorage/contracts": "^8.0.0",
64
+ "@ankhorage/data-sources": "^2.0.0"
65
65
  },
66
66
  "peerDependencies": {
67
67
  "react": "19.1.0",
68
68
  "react-native": "0.81.5"
69
69
  },
70
70
  "devDependencies": {
71
- "@ankhorage/devtools": "^1.0.6",
71
+ "@ankhorage/devtools": "^1.2.1",
72
72
  "@ankhorage/paradox": "^0.1.21",
73
73
  "@changesets/cli": "^2.31.0",
74
- "@types/bun": "^1.3.13",
74
+ "@types/bun": "^1.3.14",
75
75
  "@types/node": "^25.6.0",
76
76
  "@types/react": "^19.2.14",
77
77
  "react": "19.1.0",
@@ -79,5 +79,5 @@
79
79
  "typescript": "^5.9.3"
80
80
  },
81
81
  "sideEffects": false,
82
- "packageManager": "bun@1.3.13"
82
+ "packageManager": "bun@1.3.14"
83
83
  }
@@ -1,7 +1,7 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="90" height="20" role="img" aria-label="npm: v1.0.0">
2
- <title>npm: v1.0.0</title>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="90" height="20" role="img" aria-label="npm: v1.1.0">
2
+ <title>npm: v1.1.0</title>
3
3
  <rect width="38" height="20" fill="#374151"/>
4
4
  <rect x="38" width="52" height="20" fill="#cb3837"/>
5
5
  <text x="19" y="14" fill="#ffffff" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="11" text-anchor="middle">npm</text>
6
- <text x="64" y="14" fill="#ffffff" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="11" text-anchor="middle">v1.0.0</text>
6
+ <text x="64" y="14" fill="#ffffff" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="11" text-anchor="middle">v1.1.0</text>
7
7
  </svg>
@@ -32,9 +32,9 @@ Export paths: `src/index.ts`
32
32
 
33
33
  | Prop | Type | Required | Default | Description |
34
34
  | ----------------- | --------------------------------------------------------------------- | -------- | ------- | ----------- |
35
+ | apis | `ApiDefinitionList \| undefined` | no | — | |
35
36
  | bindingContext | `Record<string, unknown> \| undefined` | no | — | |
36
37
  | dataBindings | `ComponentDataBindingRegistry \| undefined` | no | — | |
37
- | dataSources | `DataSourceRegistry \| undefined` | no | — | |
38
38
  | dbAdapter | `DbAdapter \| undefined` | no | — | |
39
39
  | dbRealtimeAdapter | `DbRealtimeAdapter \| undefined` | no | — | |
40
40
  | disableActions | `boolean \| undefined` | no | — | |
@@ -21,30 +21,40 @@ graph TD
21
21
  module_src_rendering_ts["src/rendering.ts"]
22
22
  package__ankhorage_runtime -.-> module_src_rendering_ts
23
23
  module_src_rendering_ts --> module_src_registry_tsx
24
- module_src_runtimeActionRegistry_test_ts["src/runtimeActionRegistry.test.ts"]
25
- package__ankhorage_runtime -.-> module_src_runtimeActionRegistry_test_ts
26
- module_src_runtimeActionRegistry_test_ts --> module_src_runtimeActionRegistry_ts
27
- module_src_runtimeActionRegistry_test_ts --> module_src_runtimeBindings_ts
24
+ module_src_runtimeActionRegistry_actions_test_ts["src/runtimeActionRegistry.actions.test.ts"]
25
+ package__ankhorage_runtime -.-> module_src_runtimeActionRegistry_actions_test_ts
26
+ module_src_runtimeActionRegistry_actions_test_ts --> module_src_runtimeActionRegistry_ts
27
+ module_src_runtimeActionRegistry_chains_test_ts["src/runtimeActionRegistry.chains.test.ts"]
28
+ package__ankhorage_runtime -.-> module_src_runtimeActionRegistry_chains_test_ts
29
+ module_src_runtimeActionRegistry_chains_test_ts --> module_src_runtimeActionRegistry_ts
30
+ module_src_runtimeActionRegistry_operations_test_ts["src/runtimeActionRegistry.operations.test.ts"]
31
+ package__ankhorage_runtime -.-> module_src_runtimeActionRegistry_operations_test_ts
32
+ module_src_runtimeActionRegistry_operations_test_ts --> module_src_runtimeActionRegistry_ts
33
+ module_src_runtimeActionRegistry_operations_test_ts --> module_src_runtimeBindings_ts
28
34
  module_src_runtimeActionRegistry_ts["src/runtimeActionRegistry.ts"]
29
35
  package__ankhorage_runtime -.-> module_src_runtimeActionRegistry_ts
36
+ module_src_runtimeActionRegistry_ts --> module_src_runtimeApiSelection_ts
30
37
  module_src_runtimeActionRegistry_ts --> module_src_runtimeBindings_ts
31
38
  module_src_runtimeActionRegistry_ts --> module_src_RuntimeRendererConfig_tsx
39
+ module_src_runtimeApiOperations_test_ts["src/runtimeApiOperations.test.ts"]
40
+ package__ankhorage_runtime -.-> module_src_runtimeApiOperations_test_ts
41
+ module_src_runtimeApiOperations_test_ts --> module_src_runtimeApiOperations_ts
42
+ module_src_runtimeApiOperations_ts["src/runtimeApiOperations.ts"]
43
+ package__ankhorage_runtime -.-> module_src_runtimeApiOperations_ts
44
+ module_src_runtimeApiOperations_ts --> module_src_runtimeBindings_ts
45
+ module_src_runtimeApiSelection_test_ts["src/runtimeApiSelection.test.ts"]
46
+ package__ankhorage_runtime -.-> module_src_runtimeApiSelection_test_ts
47
+ module_src_runtimeApiSelection_test_ts --> module_src_runtimeApiSelection_ts
48
+ module_src_runtimeApiSelection_ts["src/runtimeApiSelection.ts"]
49
+ package__ankhorage_runtime -.-> module_src_runtimeApiSelection_ts
32
50
  module_src_runtimeBindings_test_ts["src/runtimeBindings.test.ts"]
33
51
  package__ankhorage_runtime -.-> module_src_runtimeBindings_test_ts
52
+ module_src_runtimeBindings_test_ts --> module_src_runtimeApiSelection_ts
34
53
  module_src_runtimeBindings_test_ts --> module_src_runtimeBindings_ts
35
54
  module_src_runtimeBindings_test_ts --> module_src_runtimeNodeProps_ts
36
55
  module_src_runtimeBindings_ts["src/runtimeBindings.ts"]
37
56
  package__ankhorage_runtime -.-> module_src_runtimeBindings_ts
38
- module_src_runtimeDatabaseOperationExecutor_ts["src/runtimeDatabaseOperationExecutor.ts"]
39
- package__ankhorage_runtime -.-> module_src_runtimeDatabaseOperationExecutor_ts
40
- module_src_runtimeDatabaseOperationExecutor_ts --> module_src_runtimeBindings_ts
41
- module_src_runtimeDataSourceOperations_test_ts["src/runtimeDataSourceOperations.test.ts"]
42
- package__ankhorage_runtime -.-> module_src_runtimeDataSourceOperations_test_ts
43
- module_src_runtimeDataSourceOperations_test_ts --> module_src_runtimeDataSourceOperations_ts
44
- module_src_runtimeDataSourceOperations_ts["src/runtimeDataSourceOperations.ts"]
45
- package__ankhorage_runtime -.-> module_src_runtimeDataSourceOperations_ts
46
- module_src_runtimeDataSourceOperations_ts --> module_src_runtimeBindings_ts
47
- module_src_runtimeDataSourceOperations_ts --> module_src_runtimeDatabaseOperationExecutor_ts
57
+ module_src_runtimeBindings_ts --> module_src_runtimeApiSelection_ts
48
58
  module_src_runtimeDbPersist_test_ts["src/runtimeDbPersist.test.ts"]
49
59
  package__ankhorage_runtime -.-> module_src_runtimeDbPersist_test_ts
50
60
  module_src_runtimeDbPersist_test_ts --> module_src_runtimeActionRegistry_ts
@@ -115,6 +125,7 @@ graph TD
115
125
  module_src_runtimeRepeat_test_ts --> module_src_runtimeRepeat_ts
116
126
  module_src_runtimeRepeat_ts["src/runtimeRepeat.ts"]
117
127
  package__ankhorage_runtime -.-> module_src_runtimeRepeat_ts
128
+ module_src_runtimeRepeat_ts --> module_src_runtimeApiSelection_ts
118
129
  module_src_runtimeRepeat_ts --> module_src_runtimeBindings_ts
119
130
  module_src_runtimeRepeatDiagnostics_ts["src/runtimeRepeatDiagnostics.ts"]
120
131
  package__ankhorage_runtime -.-> module_src_runtimeRepeatDiagnostics_ts
@@ -131,12 +142,17 @@ graph TD
131
142
  package__ankhorage_runtime -.-> module_src_runtimeScreenLoaders_arrayPath_test_ts
132
143
  module_src_runtimeScreenLoaders_arrayPath_test_ts --> module_src_runtimeBindings_ts
133
144
  module_src_runtimeScreenLoaders_arrayPath_test_ts --> module_src_runtimeScreenLoaders_ts
134
- module_src_runtimeScreenLoaders_test_ts["src/runtimeScreenLoaders.test.ts"]
135
- package__ankhorage_runtime -.-> module_src_runtimeScreenLoaders_test_ts
136
- module_src_runtimeScreenLoaders_test_ts --> module_src_runtimeBindings_ts
137
- module_src_runtimeScreenLoaders_test_ts --> module_src_runtimeScreenLoaders_ts
145
+ module_src_runtimeScreenLoaders_execution_test_ts["src/runtimeScreenLoaders.execution.test.ts"]
146
+ package__ankhorage_runtime -.-> module_src_runtimeScreenLoaders_execution_test_ts
147
+ module_src_runtimeScreenLoaders_execution_test_ts --> module_src_runtimeBindings_ts
148
+ module_src_runtimeScreenLoaders_execution_test_ts --> module_src_runtimeScreenLoaders_ts
149
+ module_src_runtimeScreenLoaders_lifecycle_test_ts["src/runtimeScreenLoaders.lifecycle.test.ts"]
150
+ package__ankhorage_runtime -.-> module_src_runtimeScreenLoaders_lifecycle_test_ts
151
+ module_src_runtimeScreenLoaders_lifecycle_test_ts --> module_src_runtimeBindings_ts
152
+ module_src_runtimeScreenLoaders_lifecycle_test_ts --> module_src_runtimeScreenLoaders_ts
138
153
  module_src_runtimeScreenLoaders_ts["src/runtimeScreenLoaders.ts"]
139
154
  package__ankhorage_runtime -.-> module_src_runtimeScreenLoaders_ts
155
+ module_src_runtimeScreenLoaders_ts --> module_src_runtimeApiSelection_ts
140
156
  module_src_runtimeScreenLoaders_ts --> module_src_runtimeBindings_ts
141
157
  module_src_runtimeStateAdapter_ts["src/runtimeStateAdapter.ts"]
142
158
  package__ankhorage_runtime -.-> module_src_runtimeStateAdapter_ts