@assistant-ui/react-generative-ui 0.0.22 → 0.0.24

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 (74) hide show
  1. package/dist/a2ui/convert.d.ts.map +1 -1
  2. package/dist/a2ui/convert.js +21 -4
  3. package/dist/a2ui/convert.js.map +1 -1
  4. package/dist/constants.d.ts +1 -0
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/constants.js +2 -1
  7. package/dist/constants.js.map +1 -1
  8. package/dist/slack/decodeBlockAction.d.ts.map +1 -1
  9. package/dist/slack/decodeBlockAction.js +64 -26
  10. package/dist/slack/decodeBlockAction.js.map +1 -1
  11. package/dist/slack/fromSlackBlocks.d.ts.map +1 -1
  12. package/dist/slack/fromSlackBlocks.js +23 -0
  13. package/dist/slack/fromSlackBlocks.js.map +1 -1
  14. package/dist/slack/toSlackBlocks.d.ts.map +1 -1
  15. package/dist/slack/toSlackBlocks.js +74 -18
  16. package/dist/slack/toSlackBlocks.js.map +1 -1
  17. package/dist/slack/types.d.ts +20 -1
  18. package/dist/slack/types.d.ts.map +1 -1
  19. package/dist/slack.d.ts +1 -1
  20. package/dist/slack.d.ts.map +1 -1
  21. package/dist/teams/decodeSubmitData.d.ts.map +1 -1
  22. package/dist/teams/decodeSubmitData.js +24 -3
  23. package/dist/teams/decodeSubmitData.js.map +1 -1
  24. package/dist/teams/temporalId.d.ts +5 -0
  25. package/dist/teams/temporalId.d.ts.map +1 -0
  26. package/dist/teams/temporalId.js +28 -0
  27. package/dist/teams/temporalId.js.map +1 -0
  28. package/dist/teams/toAdaptiveCard.d.ts.map +1 -1
  29. package/dist/teams/toAdaptiveCard.js +80 -1
  30. package/dist/teams/toAdaptiveCard.js.map +1 -1
  31. package/dist/teams/toTeamsAttachments.d.ts.map +1 -1
  32. package/dist/teams/toTeamsAttachments.js.map +1 -1
  33. package/dist/teams/types.d.ts +19 -1
  34. package/dist/teams/types.d.ts.map +1 -1
  35. package/dist/teams.d.ts +1 -1
  36. package/dist/teams.d.ts.map +1 -1
  37. package/dist/temporal.d.ts +33 -0
  38. package/dist/temporal.d.ts.map +1 -0
  39. package/dist/temporal.js +153 -0
  40. package/dist/temporal.js.map +1 -0
  41. package/dist/vocabulary/collectFormValues.d.ts +1 -1
  42. package/dist/vocabulary/collectFormValues.d.ts.map +1 -1
  43. package/dist/vocabulary/collectFormValues.js +7 -3
  44. package/dist/vocabulary/collectFormValues.js.map +1 -1
  45. package/dist/vocabulary/data.d.ts +1 -1
  46. package/dist/vocabulary/interactive.d.ts +7 -1
  47. package/dist/vocabulary/interactive.d.ts.map +1 -1
  48. package/dist/vocabulary/interactive.js +116 -12
  49. package/dist/vocabulary/interactive.js.map +1 -1
  50. package/package.json +6 -5
  51. package/src/a2ui/convert.test.ts +223 -14
  52. package/src/a2ui/convert.ts +41 -7
  53. package/src/constants.ts +1 -0
  54. package/src/slack/datePicker.test.ts +612 -0
  55. package/src/slack/decodeBlockAction.ts +114 -41
  56. package/src/slack/fromSlackBlocks.ts +29 -0
  57. package/src/slack/toSlackBlocks.ts +123 -36
  58. package/src/slack/types.ts +24 -0
  59. package/src/slack.ts +2 -0
  60. package/src/teams/decodeSubmitData.test.ts +216 -0
  61. package/src/teams/decodeSubmitData.ts +49 -4
  62. package/src/teams/temporal.test.ts +766 -0
  63. package/src/teams/temporalId.ts +56 -0
  64. package/src/teams/toAdaptiveCard.ts +166 -2
  65. package/src/teams/toTeamsAttachments.ts +4 -1
  66. package/src/teams/types.ts +17 -0
  67. package/src/teams.ts +1 -0
  68. package/src/temporal.test.ts +337 -0
  69. package/src/temporal.ts +263 -0
  70. package/src/vocabulary/collectFormValues.test.ts +198 -1
  71. package/src/vocabulary/collectFormValues.ts +31 -2
  72. package/src/vocabulary/datepicker.dom.test.tsx +1457 -0
  73. package/src/vocabulary/interactive.dom.test.tsx +59 -11
  74. package/src/vocabulary/interactive.tsx +212 -15
@@ -1 +1 @@
1
- {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/a2ui/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,iBAAc;AACnD,OAAO,EAAmB,KAAK,gBAAgB,EAAE,mBAAgB;AAMjE,OAAO,KAAK,EAAE,WAAW,EAAE,4BAAyB;AA0iCpD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE;IACP,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACrC,GACL;IACD,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAEA;AAED,eAAO,MAAM,0BAA0B,GAAI,SAAS,gBAAgB,MAG1D,WAAW,OAAO;;UAqBjB,SAAS,GAAG,IAAI;cAAY,MAAM,EAAE;CAT9C,CAAC"}
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/a2ui/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,iBAAc;AAEnD,OAAO,EAAmB,KAAK,gBAAgB,EAAE,mBAAgB;AAMjE,OAAO,KAAK,EAAE,WAAW,EAAE,4BAAyB;AA2kCpD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE;IACP,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACrC,GACL;IACD,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAEA;AAED,eAAO,MAAM,0BAA0B,GAAI,SAAS,gBAAgB,MAG1D,WAAW,OAAO;;UAqBjB,SAAS,GAAG,IAAI;cAAY,MAAM,EAAE;CAT9C,CAAC"}
@@ -2,6 +2,7 @@ import { ICON_NAMES } from "../ir.js";
2
2
  import { A2UI_SURFACE_ID } from "./types.js";
3
3
  import "./reducer.js";
4
4
  import { decodePointer, resolvePointer } from "./dataModel.js";
5
+ import { classifyTemporal } from "../temporal.js";
5
6
  import { evaluateA2uiValueFunction } from "./valueFunctions.js";
6
7
  //#region src/a2ui/convert.ts
7
8
  const DEPTH_CAP = 32;
@@ -149,7 +150,11 @@ const INPUT_COMPONENTS = /* @__PURE__ */ new Set([
149
150
  "DateTimeInput",
150
151
  "Slider"
151
152
  ]);
152
- const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
153
+ const dateInputType = (value) => {
154
+ const kind = classifyTemporal(value).kind;
155
+ if (kind === "date" || kind === "time") return kind;
156
+ return kind === "floating" || kind === "instant" ? "datetime" : void 0;
157
+ };
153
158
  const finiteNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : void 0;
154
159
  const decimalPlaces = (value) => {
155
160
  const [mantissa = "", exponent = "0"] = String(value).split("e");
@@ -457,16 +462,28 @@ const mappedProps = (node, props, context, scope) => {
457
462
  if (component === "DateTimeInput") {
458
463
  const value = stringProp(props, ["value"]);
459
464
  const shapeValue = name === void 0 ? value : resolvePointer(context.stepModel, name);
460
- if (props["enableTime"] === true || typeof shapeValue === "string" && shapeValue !== "" && !DATE_PATTERN.test(shapeValue)) return {
465
+ const shapeType = typeof shapeValue === "string" ? dateInputType(shapeValue) : void 0;
466
+ let inputType = shapeType ?? "date";
467
+ if ("enableDate" in props || "enableTime" in props) inputType = props["enableTime"] === true ? props["enableDate"] === true ? "datetime" : "time" : "date";
468
+ if (typeof shapeValue === "string" && shapeValue !== "" && shapeType !== inputType) return {
461
469
  $type: "Input",
462
470
  ...value !== void 0 ? { defaultValue: value } : {},
463
471
  ...label !== void 0 ? { label } : {},
464
472
  ...name !== void 0 ? { name } : {}
465
473
  };
466
- const min = stringProp(props, ["min"]);
467
- const max = stringProp(props, ["max"]);
474
+ const bound = (edge) => {
475
+ const boundValue = stringProp(props, [edge]);
476
+ if (boundValue === void 0) return void 0;
477
+ const boundType = dateInputType(boundValue);
478
+ if (boundType === inputType) return boundValue;
479
+ if (inputType === "datetime" && boundType === "date") return `${boundValue}T${edge === "min" ? "00:00" : "23:59:59.999"}`;
480
+ context.warnings.push(`A2UI DateTimeInput "${edge}" of "${boundValue}" is not a ${inputType} value and was dropped.`);
481
+ };
482
+ const min = bound("min");
483
+ const max = bound("max");
468
484
  return {
469
485
  $type: "DatePicker",
486
+ inputType,
470
487
  ...value !== void 0 ? { value } : {},
471
488
  ...min !== void 0 ? { min } : {},
472
489
  ...max !== void 0 ? { max } : {},
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","names":[],"sources":["../../src/a2ui/convert.ts"],"sourcesContent":["import { ICON_NAMES, type UIElement } from \"../ir\";\nimport { A2UI_SURFACE_ID, type A2uiSurfaceState } from \"./types\";\nimport {\n evaluateA2uiValueFunction,\n type ExpressionPart,\n} from \"./valueFunctions\";\nimport { MAX_AUTO_VIVIFY_ARRAY_INDEX } from \"./reducer\";\nimport type { A2uiBinding } from \"./BindingContext\";\nimport { decodePointer, resolvePointer } from \"./dataModel\";\n\nconst DEPTH_CAP = 32;\nconst TEMPLATE_ITEM_CAP = 100;\nconst NODE_BUDGET = 5000;\nconst EVALUATION_BUDGET = 20_000;\n\nconst SUPPORTED_COMPONENTS = new Set([\n \"Text\",\n \"Image\",\n \"Icon\",\n \"Row\",\n \"Column\",\n \"List\",\n \"Card\",\n \"Divider\",\n \"Button\",\n \"TextField\",\n \"CheckBox\",\n \"ChoicePicker\",\n \"DateTimeInput\",\n \"Slider\",\n]);\n\nconst CHILD_LIST_COMPONENTS: ReadonlySet<string> = new Set([\n \"Row\",\n \"Column\",\n \"List\",\n]);\n\nconst ICON_NAME_SET: ReadonlySet<string> = new Set(ICON_NAMES);\nconst ICON_SIZE_SET: ReadonlySet<string> = new Set([\"sm\", \"md\", \"lg\"]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (!isRecord(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst setOwnProperty = (\n target: Record<string, unknown>,\n key: string,\n value: unknown,\n) => {\n if (key === \"__proto__\") {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n } else {\n target[key] = value;\n }\n};\n\nconst FUNCTION_CALL_KEYS: ReadonlySet<string> = new Set([\n \"call\",\n \"args\",\n \"returnType\",\n \"catalogId\",\n]);\n\nconst isFunctionCall = (\n value: unknown,\n): value is {\n readonly call: string;\n readonly args?: Record<string, unknown>;\n} =>\n isPlainObject(value) &&\n typeof value[\"call\"] === \"string\" &&\n (value[\"args\"] === undefined || isPlainObject(value[\"args\"])) &&\n Object.keys(value).every((key) => FUNCTION_CALL_KEYS.has(key));\n\nconst isBinding = (value: unknown): value is { readonly path: string } =>\n isPlainObject(value) &&\n Object.keys(value).length === 1 &&\n typeof value[\"path\"] === \"string\";\n\ntype ChildTemplate = { readonly componentId: string; readonly path: string };\n\nconst childTemplateOf = (children: unknown): ChildTemplate | undefined => {\n const template =\n isPlainObject(children) &&\n Object.keys(children).length === 1 &&\n isPlainObject(children[\"template\"])\n ? children[\"template\"]\n : children;\n return isPlainObject(template) &&\n Object.keys(template).length === 2 &&\n typeof template[\"componentId\"] === \"string\" &&\n typeof template[\"path\"] === \"string\"\n ? { componentId: template[\"componentId\"], path: template[\"path\"] }\n : undefined;\n};\n\nconst bindingPath = (value: unknown): string | undefined =>\n isBinding(value) ? value.path : undefined;\n\ntype Scope = { readonly data: unknown; readonly path: string };\n\nconst pointerIn = (scope: Scope, path: string): string =>\n (path.startsWith(\"/\") ? \"\" : scope.path) +\n decodePointer(path)\n .map((segment) => `/${segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\")}`)\n .join(\"\");\n\nconst setIn = (\n value: unknown,\n segments: readonly string[],\n leaf: unknown,\n): unknown => {\n const [head, ...rest] = segments;\n if (head === undefined) return leaf;\n if (\n /^(0|[1-9]\\d*)$/.test(head) &&\n (Array.isArray(value) || value === undefined || value === null)\n ) {\n const list = Array.isArray(value) ? value : [];\n const index = Number(head);\n if (index >= list.length && index > MAX_AUTO_VIVIFY_ARRAY_INDEX) {\n return value;\n }\n const copy = [...list];\n copy[index] = setIn(copy[index], rest, leaf);\n return copy;\n }\n const copy: Record<string, unknown> = isRecord(value) ? { ...value } : {};\n setOwnProperty(\n copy,\n head,\n setIn(Object.hasOwn(copy, head) ? copy[head] : undefined, rest, leaf),\n );\n return copy;\n};\n\nconst withFieldReferences = (\n value: unknown,\n pointer: string,\n fields: ReadonlyMap<string, unknown>,\n): unknown => {\n if (fields.has(pointer)) return fields.get(pointer);\n let result = value;\n for (const [name, field] of fields) {\n if (name.startsWith(`${pointer}/`)) {\n result = setIn(result, decodePointer(name.slice(pointer.length)), field);\n }\n }\n return result;\n};\n\nconst materializeEntries = (\n value: Record<string, unknown>,\n source: unknown,\n context: ConversionContext,\n evaluate: boolean,\n depth: number,\n positional = false,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n // An action's functionCall runs when the button fires, so only its arguments resolve here.\n const resolved =\n key === \"functionCall\" && isFunctionCall(entry)\n ? {\n ...entry,\n ...(entry.args !== undefined\n ? {\n args: materializeEntries(\n entry.args,\n source,\n context,\n evaluate,\n depth,\n true,\n ),\n }\n : {}),\n }\n : materialize(entry, source, context, evaluate, depth, positional);\n if (resolved !== undefined) {\n setOwnProperty(result, key, resolved);\n }\n }\n return result;\n};\n\nfunction materialize(\n value: unknown,\n source: unknown,\n context: ConversionContext,\n evaluate = true,\n depth = 0,\n positional = false,\n): unknown {\n if (isBinding(value)) {\n const pointer = pointerIn(\n { data: source, path: context.scopePath },\n value.path,\n );\n const resolved = resolvePointer(context.surface.dataModel, pointer);\n context.dependencies?.set(pointer, resolved);\n return resolved;\n }\n if (Array.isArray(value)) {\n const entries = value.map((entry) =>\n materialize(entry, source, context, evaluate, depth, positional),\n );\n return positional\n ? entries\n : entries.filter((entry) => entry !== undefined);\n }\n if (!isPlainObject(value)) return value;\n if (!evaluate || !isFunctionCall(value)) {\n return materializeEntries(\n value,\n source,\n context,\n evaluate,\n depth,\n positional,\n );\n }\n if (!spendEvaluation(context)) return undefined;\n if (depth >= DEPTH_CAP) {\n if (!context.functionDepthWarned) {\n context.warnings.push(\n `A2UI function nesting cap of ${DEPTH_CAP} was reached.`,\n );\n context.functionDepthWarned = true;\n }\n return undefined;\n }\n return evaluateA2uiValueFunction(\n value.call,\n materializeEntries(\n value.args ?? {},\n source,\n context,\n true,\n depth + 1,\n true,\n ),\n {\n resolve: (part) =>\n spendEvaluation(context)\n ? materialize(part, source, context, true, depth + 1)\n : undefined,\n warn: (message) => context.warnings.push(message),\n templates: context.templates,\n },\n );\n}\n\nconst firstDefined = (\n props: Record<string, unknown>,\n keys: readonly string[],\n): unknown => {\n for (const key of keys) {\n if (props[key] !== undefined) return props[key];\n }\n return undefined;\n};\n\nconst stringProp = (\n props: Record<string, unknown>,\n keys: readonly string[],\n): string | undefined => {\n const value = firstDefined(props, keys);\n return typeof value === \"string\" ? value : undefined;\n};\n\nconst sourceSurfaceId = (surface: A2uiSurfaceState): string =>\n (surface as A2uiSurfaceState & { [A2UI_SURFACE_ID]?: string })[\n A2UI_SURFACE_ID\n ] ?? \"\";\n\ntype ConversionContext = {\n readonly surface: A2uiSurfaceState;\n readonly stepModel: unknown;\n readonly surfaceId: string;\n readonly warnings: string[];\n emittedNodes: number;\n depthWarned: boolean;\n budgetWarned: boolean;\n templateCapWarned: boolean;\n evaluations: number;\n evaluationBudgetWarned: boolean;\n functionDepthWarned: boolean;\n readonly templates: Map<string, ExpressionPart[] | null>;\n readonly inputFields: Map<string, unknown>;\n readonly textFields: Map<string, boolean>;\n readonly boundActionEntries: {\n readonly target: Record<string, unknown>;\n readonly key: string;\n readonly pointer: string;\n }[];\n readonly boundUserMessages: {\n readonly action: Record<string, unknown>;\n readonly pointer: string;\n }[];\n readonly keepUnknownComponents: boolean;\n readonly bindings: Map<string, A2uiBinding> | undefined;\n readonly cache: Map<string, CachedComponent> | undefined;\n dependencies: Map<string, unknown> | undefined;\n scopePath: string;\n};\n\ntype CachedComponent = {\n readonly props: Record<string, unknown>;\n readonly mapped: UIElement | undefined;\n readonly dependencies: ReadonlyMap<string, unknown>;\n readonly evaluations: number;\n children?: readonly UIElement[];\n result?: UIElement;\n};\n\nconst BOUND_KEYS = [\"text\", \"value\", \"binding\"] as const;\n\nconst INPUT_COMPONENTS: ReadonlySet<string> = new Set([\n \"TextField\",\n \"CheckBox\",\n \"ChoicePicker\",\n \"DateTimeInput\",\n \"Slider\",\n]);\n\nconst DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst finiteNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst decimalPlaces = (value: number): number => {\n const [mantissa = \"\", exponent = \"0\"] = String(value).split(\"e\");\n return Math.max(0, (mantissa.split(\".\")[1]?.length ?? 0) - Number(exponent));\n};\n\n// A spec slider without `steps` is continuous, so its step leaves at least a hundred divisions and keeps every bound value on the grid.\nconst sliderStep = (\n min: number,\n max: number,\n value: number | undefined,\n steps: unknown,\n): number | undefined => {\n if (max <= min) return undefined;\n if (typeof steps === \"number\" && Number.isInteger(steps) && steps >= 1) {\n return (max - min) / steps;\n }\n const precision = Math.max(\n decimalPlaces(min),\n value === undefined ? 0 : decimalPlaces(value),\n );\n return Math.min(\n 10 ** Math.floor(Math.log10((max - min) / 100)),\n 10 ** -precision,\n );\n};\n\nconst recordBindings = (\n node: Record<string, unknown>,\n props: Record<string, unknown>,\n mapped: UIElement,\n scope: Scope,\n context: ConversionContext,\n) => {\n const component = node[\"component\"];\n const name = mapped[\"name\"];\n const boundKey = BOUND_KEYS.find((key) => node[key] !== undefined);\n const value = boundKey === undefined ? undefined : props[boundKey];\n if (INPUT_COMPONENTS.has(String(component)) && typeof name === \"string\") {\n context.textFields.set(\n name,\n (!context.textFields.has(name) || context.bindings !== undefined) &&\n (component === \"TextField\" || component === \"DateTimeInput\"),\n );\n const field = (fallback: unknown) =>\n fallback === undefined ? { $field: name } : { $field: name, fallback };\n // A single-choice picker collects one string, while the spec binds it to a string list.\n const listValued =\n component === \"ChoicePicker\" &&\n mapped.$type !== \"CheckboxGroup\" &&\n typeof value !== \"string\";\n context.inputFields.set(\n name,\n listValued\n ? [field(Array.isArray(value) ? value[0] : undefined)]\n : field(value),\n );\n }\n const action = mapped.$action;\n const raw = node[\"action\"];\n if (!action || !isRecord(raw)) return;\n const functionCall = action.type === \"a2ui:functionCall\";\n const event = isRecord(raw[\"event\"]) ? raw[\"event\"] : raw;\n const userMessage = event[\"userMessage\"];\n if (!functionCall && isBinding(userMessage)) {\n context.boundUserMessages.push({\n action,\n pointer: pointerIn(scope, userMessage.path),\n });\n }\n const rawEntries = functionCall\n ? isRecord(raw[\"functionCall\"])\n ? raw[\"functionCall\"][\"args\"]\n : undefined\n : event[\"context\"];\n const target = functionCall ? action[\"args\"] : action[\"context\"];\n if (!isRecord(rawEntries) || !isRecord(target)) return;\n for (const [key, entry] of Object.entries(rawEntries)) {\n if (isBinding(entry)) {\n context.boundActionEntries.push({\n target,\n key,\n pointer: pointerIn(scope, entry.path),\n });\n }\n }\n};\n\nconst spendEvaluation = (context: ConversionContext): boolean => {\n if (context.evaluations < EVALUATION_BUDGET) {\n context.evaluations++;\n return true;\n }\n if (!context.evaluationBudgetWarned) {\n context.warnings.push(\n `A2UI function evaluation budget of ${EVALUATION_BUDGET} was reached.`,\n );\n context.evaluationBudgetWarned = true;\n }\n return false;\n};\n\nconst reserveNode = (context: ConversionContext): boolean => {\n if (context.emittedNodes >= NODE_BUDGET) {\n if (!context.budgetWarned) {\n context.warnings.push(`A2UI node budget of ${NODE_BUDGET} was reached.`);\n context.budgetWarned = true;\n }\n return false;\n }\n context.emittedNodes++;\n return true;\n};\n\nconst childReferences = (node: Record<string, unknown>): unknown[] => {\n const children = node[\"children\"];\n const references: unknown[] = Array.isArray(children) ? [...children] : [];\n if (node[\"child\"] !== undefined) references.push(node[\"child\"]);\n if (node[\"component\"] === \"Modal\") {\n references.push(node[\"trigger\"], node[\"content\"]);\n }\n if (node[\"component\"] === \"Tabs\" && Array.isArray(node[\"tabs\"])) {\n for (const tab of node[\"tabs\"]) {\n references.push(isRecord(tab) ? tab[\"child\"] : undefined);\n }\n }\n return references;\n};\n\nconst childrenOf = (\n node: Record<string, unknown>,\n scope: Scope,\n context: ConversionContext,\n depth: number,\n visited: Set<string>,\n): UIElement[] => {\n const result: UIElement[] = [];\n for (const childId of childReferences(node)) {\n if (typeof childId !== \"string\") {\n context.warnings.push(\n `Component \"${String(node[\"id\"] ?? \"\")}\" has a malformed child reference.`,\n );\n continue;\n }\n const child = convertComponent(childId, scope, context, depth + 1, visited);\n if (child) result.push(child);\n }\n return result;\n};\n\nconst textLabel = (\n node: Record<string, unknown>,\n children: readonly UIElement[],\n context: ConversionContext,\n): string | undefined => {\n const references = childReferences(node);\n const [reference] = references;\n const [child] = children;\n if (\n references.length !== 1 ||\n children.length !== 1 ||\n typeof reference !== \"string\" ||\n !child ||\n context.surface.components.get(reference)?.[\"component\"] !== \"Text\"\n ) {\n return undefined;\n }\n const text = child.$type === \"Header\" ? child[\"text\"] : child[\"value\"];\n return typeof text === \"string\" ? text : undefined;\n};\n\nconst mappedAction = (\n node: Record<string, unknown>,\n props: Record<string, unknown>,\n context: ConversionContext,\n): UIElement[\"$action\"] | undefined => {\n const action = props[\"action\"];\n if (action === undefined) return undefined;\n const source = {\n surfaceId: context.surfaceId,\n sourceComponentId: typeof node[\"id\"] === \"string\" ? node[\"id\"] : \"\",\n };\n const event =\n isRecord(action) && isRecord(action[\"event\"]) ? action[\"event\"] : action;\n const actionName =\n typeof event === \"string\"\n ? event\n : isRecord(event) && typeof event[\"name\"] === \"string\"\n ? event[\"name\"]\n : undefined;\n if (actionName) {\n const actionContext = isRecord(event) ? event[\"context\"] : undefined;\n const userMessage = isRecord(event) ? event[\"userMessage\"] : undefined;\n return {\n type: \"a2ui:action\",\n name: actionName,\n ...source,\n ...(typeof userMessage === \"string\" ? { userMessage } : {}),\n ...(actionContext !== undefined ? { context: actionContext } : {}),\n };\n }\n const functionCall = isRecord(action) ? action[\"functionCall\"] : undefined;\n if (isRecord(functionCall) && typeof functionCall[\"call\"] === \"string\") {\n const args = functionCall[\"args\"];\n return {\n type: \"a2ui:functionCall\",\n call: functionCall[\"call\"],\n ...source,\n ...(isRecord(args) ? { args } : {}),\n };\n }\n context.warnings.push(\n `Component \"${String(node[\"id\"] ?? \"\")}\" has a malformed action.`,\n );\n return undefined;\n};\n\nconst choiceOptions = (value: unknown): { label: string; value: string }[] => {\n if (!Array.isArray(value)) return [];\n const options: { label: string; value: string }[] = [];\n for (const option of value) {\n if (\n isRecord(option) &&\n typeof option[\"label\"] === \"string\" &&\n typeof option[\"value\"] === \"string\"\n ) {\n options.push({ label: option[\"label\"], value: option[\"value\"] });\n }\n }\n return options;\n};\n\nconst mappedProps = (\n node: Record<string, unknown>,\n props: Record<string, unknown>,\n context: ConversionContext,\n scope: Scope,\n): UIElement | undefined => {\n const component = node[\"component\"];\n\n if (component === \"Text\") {\n const text = stringProp(props, [\"text\", \"value\"]);\n const variant = props[\"variant\"];\n if (typeof variant === \"string\" && /^h[1-6]$/.test(variant)) {\n return {\n $type: \"Header\",\n ...(text !== undefined ? { text } : {}),\n };\n }\n if (variant === \"caption\") {\n return {\n $type: \"Caption\",\n ...(text !== undefined ? { value: text } : {}),\n };\n }\n return {\n $type: \"Markdown\",\n ...(text !== undefined ? { value: text } : {}),\n };\n }\n\n if (component === \"Image\") {\n const src = stringProp(props, [\"src\", \"url\"]);\n const alt = stringProp(props, [\"alt\", \"altText\", \"description\"]);\n const size = props[\"size\"];\n const round = props[\"round\"];\n return {\n $type: \"Image\",\n ...(src !== undefined ? { src } : {}),\n ...(alt !== undefined ? { alt } : {}),\n ...(typeof size === \"string\" || typeof size === \"number\" ? { size } : {}),\n ...(typeof round === \"boolean\" ? { round } : {}),\n };\n }\n\n if (component === \"Icon\") {\n const name = stringProp(props, [\"name\"]);\n if (!name || !ICON_NAME_SET.has(name)) return undefined;\n const size = props[\"size\"];\n return {\n $type: \"Icon\",\n name,\n ...(typeof size === \"string\" && ICON_SIZE_SET.has(size) ? { size } : {}),\n };\n }\n\n if (component === \"Row\") {\n const gap = props[\"gap\"];\n const align = firstDefined(props, [\"align\", \"alignment\"]);\n const justify = firstDefined(props, [\"justify\", \"distribution\"]);\n return {\n $type: \"Row\",\n ...(typeof gap === \"number\" ? { gap } : {}),\n ...(typeof align === \"string\" ? { align } : {}),\n ...(typeof justify === \"string\" ? { justify } : {}),\n };\n }\n\n if (component === \"Column\") {\n const gap = props[\"gap\"];\n const align = firstDefined(props, [\"align\", \"alignment\"]);\n return {\n $type: \"Col\",\n ...(typeof gap === \"number\" ? { gap } : {}),\n ...(typeof align === \"string\" ? { align } : {}),\n };\n }\n\n if (component === \"List\") {\n const direction = props[\"direction\"];\n const align = props[\"align\"];\n if (direction === \"horizontal\") {\n return {\n $type: \"Row\",\n ...(typeof align === \"string\" ? { align } : {}),\n };\n }\n return { $type: \"ListView\" };\n }\n\n if (component === \"Card\") {\n const title = props[\"title\"];\n const padding = props[\"padding\"];\n const background = props[\"background\"];\n return {\n $type: \"Card\",\n ...(typeof title === \"string\" ? { title } : {}),\n ...(typeof padding === \"number\" ? { padding } : {}),\n ...(typeof background === \"string\" ? { background } : {}),\n };\n }\n\n if (component === \"Divider\") {\n return {\n $type: \"Divider\",\n ...(typeof props[\"flush\"] === \"boolean\" ? { flush: props[\"flush\"] } : {}),\n };\n }\n\n if (component === \"Button\") {\n const label = stringProp(props, [\"label\", \"text\"]);\n const variantStyle =\n props[\"variant\"] === \"primary\"\n ? \"primary\"\n : props[\"variant\"] === \"borderless\"\n ? \"ghost\"\n : undefined;\n const buttonStyle =\n typeof props[\"buttonStyle\"] === \"string\"\n ? props[\"buttonStyle\"]\n : variantStyle;\n const block = props[\"block\"];\n const submit = props[\"submit\"];\n const action = mappedAction(node, props, context);\n return {\n $type: \"Button\",\n ...(label !== undefined ? { label } : {}),\n ...(buttonStyle !== undefined ? { buttonStyle } : {}),\n ...(typeof block === \"boolean\" ? { block } : {}),\n ...(typeof submit === \"boolean\" ? { submit } : {}),\n ...(action ? { $action: action } : {}),\n };\n }\n\n const bound = bindingPath(firstDefined(node, BOUND_KEYS));\n const name = bound === undefined ? undefined : pointerIn(scope, bound);\n const label = stringProp(props, [\"label\"]);\n\n if (component === \"TextField\") {\n const placeholder = stringProp(props, [\"placeholder\"]);\n const inputType =\n props[\"variant\"] === \"obscured\"\n ? \"password\"\n : props[\"variant\"] === \"number\"\n ? \"number\"\n : undefined;\n const multiline =\n typeof props[\"multiline\"] === \"boolean\"\n ? props[\"multiline\"]\n : props[\"variant\"] === \"longText\" ||\n props[\"textFieldType\"] === \"longText\"\n ? true\n : undefined;\n const initial = firstDefined(props, [\"value\", \"text\"]);\n const defaultValue =\n typeof initial === \"string\"\n ? initial\n : typeof initial === \"number\" && Number.isFinite(initial)\n ? String(initial)\n : undefined;\n return {\n $type: \"Input\",\n ...(inputType !== undefined ? { inputType } : {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(multiline !== undefined ? { multiline } : {}),\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n };\n }\n\n if (component === \"CheckBox\") {\n const defaultChecked = firstDefined(props, [\"defaultChecked\", \"value\"]);\n return {\n $type: \"Checkbox\",\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(typeof defaultChecked === \"boolean\" ? { defaultChecked } : {}),\n };\n }\n\n if (component === \"Slider\") {\n const min = finiteNumber(props[\"min\"]) ?? 0;\n const max = finiteNumber(props[\"max\"]);\n if (max === undefined || max < min) return undefined;\n const value = finiteNumber(props[\"value\"]);\n const step = sliderStep(\n min,\n max,\n name === undefined\n ? value\n : finiteNumber(resolvePointer(context.stepModel, name)),\n props[\"steps\"],\n );\n return {\n $type: \"Slider\",\n min,\n max,\n ...(step !== undefined ? { step } : {}),\n ...(value !== undefined ? { defaultValue: value } : {}),\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n };\n }\n\n if (component === \"ChoicePicker\") {\n const options = choiceOptions(props[\"options\"]);\n const value = props[\"value\"];\n const selected =\n typeof value === \"string\"\n ? [value]\n : Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n if (props[\"variant\"] === \"multipleSelection\") {\n return {\n $type: \"CheckboxGroup\",\n options,\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(selected.length > 0 ? { defaultValue: selected } : {}),\n };\n }\n const [defaultValue] = selected;\n return {\n $type: \"RadioGroup\",\n options,\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n };\n }\n\n if (component === \"DateTimeInput\") {\n const value = stringProp(props, [\"value\"]);\n const shapeValue =\n name === undefined ? value : resolvePointer(context.stepModel, name);\n if (\n props[\"enableTime\"] === true ||\n (typeof shapeValue === \"string\" &&\n shapeValue !== \"\" &&\n !DATE_PATTERN.test(shapeValue))\n ) {\n return {\n $type: \"Input\",\n ...(value !== undefined ? { defaultValue: value } : {}),\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n };\n }\n const min = stringProp(props, [\"min\"]);\n const max = stringProp(props, [\"max\"]);\n return {\n $type: \"DatePicker\",\n ...(value !== undefined ? { value } : {}),\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n };\n }\n\n return undefined;\n};\n\nconst convertTemplate = (\n node: Record<string, unknown>,\n template: ChildTemplate,\n scope: Scope,\n context: ConversionContext,\n depth: number,\n visited: Set<string>,\n converted: UIElement | undefined,\n): UIElement | null => {\n if (!reserveNode(context)) return null;\n const container = converted ?? { $type: \"ListView\" };\n const itemized = container.$type === \"ListView\";\n const list = resolvePointer(\n context.surface.dataModel,\n pointerIn(scope, template.path),\n );\n const listPointer = pointerIn(scope, template.path);\n if (!Array.isArray(list)) {\n context.warnings.push(\n `Template on component \"${String(node[\"id\"] ?? \"\")}\" did not resolve to a list.`,\n );\n return { ...container, children: [] };\n }\n const itemCount = Math.min(list.length, TEMPLATE_ITEM_CAP);\n if (list.length > TEMPLATE_ITEM_CAP && !context.templateCapWarned) {\n context.warnings.push(\n `A2UI template expansion was capped at ${TEMPLATE_ITEM_CAP} items.`,\n );\n context.templateCapWarned = true;\n }\n const children: UIElement[] = [];\n for (let index = 0; index < itemCount; index++) {\n if (itemized && !reserveNode(context)) break;\n const child = convertComponent(\n template.componentId,\n { data: list[index], path: `${listPointer}/${index}` },\n context,\n depth + 1,\n visited,\n );\n if (itemized) {\n children.push({\n $type: \"ListViewItem\",\n ...(child ? { children: child } : {}),\n });\n } else if (child) {\n children.push(child);\n }\n }\n return { ...container, children };\n};\n\nfunction convertComponent(\n componentId: string,\n scope: Scope,\n context: ConversionContext,\n depth: number,\n visited: Set<string>,\n): UIElement | null {\n if (depth >= DEPTH_CAP) {\n if (!context.depthWarned) {\n context.warnings.push(`A2UI depth cap of ${DEPTH_CAP} was reached.`);\n context.depthWarned = true;\n }\n return null;\n }\n if (visited.has(componentId)) {\n context.warnings.push(`A2UI component cycle detected at \"${componentId}\".`);\n return null;\n }\n const node = context.surface.components.get(componentId);\n if (!node) {\n context.warnings.push(`A2UI component \"${componentId}\" was not found.`);\n return null;\n }\n const component = node[\"component\"];\n\n visited.add(componentId);\n try {\n if (typeof component !== \"string\") {\n context.warnings.push(\n `Unknown A2UI component \"${String(component ?? \"\")}\" was skipped.`,\n );\n return null;\n }\n const template = childTemplateOf(node[\"children\"]);\n if (\n !SUPPORTED_COMPONENTS.has(component) &&\n !context.keepUnknownComponents &&\n !template\n ) {\n context.warnings.push(\n `Unknown A2UI component \"${component}\" was skipped.`,\n );\n return null;\n }\n const cacheKey = context.cache\n ? JSON.stringify([componentId, scope.path, depth])\n : \"\";\n let cached = context.cache?.get(cacheKey);\n if (\n cached &&\n (context.evaluations + cached.evaluations > EVALUATION_BUDGET ||\n [...cached.dependencies].some(\n ([path, value]) =>\n !Object.is(resolvePointer(context.surface.dataModel, path), value),\n ))\n )\n cached = undefined;\n let props: Record<string, unknown>;\n let mapped: UIElement | undefined;\n if (cached) {\n props = cached.props;\n mapped = cached.mapped;\n context.evaluations += cached.evaluations;\n } else {\n props = {};\n const dependencies = new Map<string, unknown>();\n const evaluations = context.evaluations;\n context.dependencies = dependencies;\n context.scopePath = scope.path;\n for (const [key, value] of Object.entries(node)) {\n if (\n key === \"id\" ||\n key === \"component\" ||\n key === \"children\" ||\n key === \"child\"\n )\n continue;\n const resolved = materialize(\n value,\n scope.data,\n context,\n key !== \"checks\",\n );\n if (resolved !== undefined) setOwnProperty(props, key, resolved);\n }\n context.dependencies = undefined;\n mapped = mappedProps(node, props, context, scope);\n if (context.cache && context.warnings.length === 0 && !mapped?.$action) {\n cached = {\n props,\n mapped,\n dependencies,\n evaluations: context.evaluations - evaluations,\n };\n context.cache.set(cacheKey, cached);\n }\n }\n if (\n mapped &&\n context.bindings &&\n typeof mapped[\"name\"] === \"string\" &&\n INPUT_COMPONENTS.has(component)\n ) {\n const field = mapped.$type === \"Checkbox\" ? \"checked\" : \"value\";\n const defaultField =\n mapped.$type === \"Checkbox\" ? \"defaultChecked\" : \"defaultValue\";\n const fallback =\n mapped.$type === \"Checkbox\"\n ? false\n : mapped.$type === \"CheckboxGroup\"\n ? []\n : mapped.$type === \"Slider\"\n ? mapped[\"min\"]\n : \"\";\n const { [defaultField]: initialValue, ...rest } = mapped;\n mapped = { ...rest, [field]: initialValue ?? mapped[field] ?? fallback };\n context.bindings.set(mapped[\"name\"] as string, {\n value: mapped[field],\n arrayValue:\n component === \"ChoicePicker\" &&\n mapped.$type !== \"CheckboxGroup\" &&\n typeof props[\"value\"] !== \"string\",\n });\n }\n\n if (!mapped && SUPPORTED_COMPONENTS.has(component)) {\n context.warnings.push(\n `A2UI component \"${component}\" could not be mapped and was skipped.`,\n );\n return null;\n }\n const retained =\n !mapped && context.keepUnknownComponents\n ? {\n $type: component,\n ...Object.fromEntries(\n Object.entries(props).filter(([key]) => !key.startsWith(\"$\")),\n ),\n }\n : undefined;\n if (template) {\n return convertTemplate(\n node,\n template,\n scope,\n context,\n depth,\n visited,\n CHILD_LIST_COMPONENTS.has(component) ? mapped : retained,\n );\n }\n if (!reserveNode(context)) return null;\n const converted = mapped ?? retained;\n if (!converted) return null;\n recordBindings(node, props, converted, scope, context);\n const children = childrenOf(node, scope, context, depth, visited);\n if (mapped?.$type === \"Button\" && mapped[\"label\"] === undefined) {\n const label = textLabel(node, children, context);\n if (label !== undefined) return { ...mapped, label };\n }\n const listChildren =\n component === \"List\" && mapped?.$type === \"ListView\"\n ? children.map((child) => ({ $type: \"ListViewItem\", children: child }))\n : children;\n if (\n cached?.result &&\n cached.children?.length === listChildren.length &&\n cached.children.every((child, index) => child === listChildren[index])\n )\n return cached.result;\n const result = {\n ...converted,\n ...(listChildren.length > 0 ? { children: listChildren } : {}),\n };\n if (cached) {\n cached.children = listChildren;\n cached.result = result;\n }\n return result;\n } finally {\n visited.delete(componentId);\n }\n}\n\nexport function convertSurfaceToUISpec(\n surface: A2uiSurfaceState,\n options: {\n readonly keepUnknownComponents?: boolean;\n } = {},\n): {\n spec: UIElement | null;\n warnings: string[];\n} {\n return convertSurface(surface, options.keepUnknownComponents === true);\n}\n\nexport const createLiveSurfaceConverter = (surface: A2uiSurfaceState) => {\n const cache = new Map<string, CachedComponent>();\n const templates = new Map<string, ExpressionPart[] | null>();\n return (dataModel: unknown) => {\n const bindings = new Map<string, A2uiBinding>();\n const converted = convertSurface(\n { ...surface, dataModel, [A2UI_SURFACE_ID]: sourceSurfaceId(surface) },\n false,\n bindings,\n cache,\n templates,\n surface.dataModel,\n );\n return { ...converted, bindings };\n };\n};\n\nfunction convertSurface(\n surface: A2uiSurfaceState & { [A2UI_SURFACE_ID]?: string },\n keepUnknownComponents: boolean,\n bindings?: Map<string, A2uiBinding>,\n cache?: Map<string, CachedComponent>,\n templates = new Map<string, ExpressionPart[] | null>(),\n stepModel: unknown = surface.dataModel,\n): { spec: UIElement | null; warnings: string[] } {\n const warnings: string[] = [];\n if (!surface.components.has(\"root\")) {\n return {\n spec: null,\n warnings: ['A2UI root component \"root\" was not found.'],\n };\n }\n const context: ConversionContext = {\n surface,\n stepModel,\n surfaceId: sourceSurfaceId(surface),\n warnings,\n emittedNodes: 0,\n depthWarned: false,\n budgetWarned: false,\n templateCapWarned: false,\n evaluations: 0,\n evaluationBudgetWarned: false,\n functionDepthWarned: false,\n templates,\n inputFields: new Map(),\n textFields: new Map(),\n boundActionEntries: [],\n boundUserMessages: [],\n keepUnknownComponents,\n bindings,\n cache,\n dependencies: undefined,\n scopePath: \"\",\n };\n try {\n const spec = convertComponent(\n \"root\",\n { data: surface.dataModel, path: \"\" },\n context,\n 0,\n new Set(),\n );\n for (const { target, key, pointer } of context.boundActionEntries) {\n const value = withFieldReferences(\n target[key],\n pointer,\n context.inputFields,\n );\n if (value !== undefined) setOwnProperty(target, key, value);\n }\n for (const { action, pointer } of context.boundUserMessages) {\n if (!context.textFields.get(pointer)) continue;\n const fallback = action[\"userMessage\"];\n setOwnProperty(\n action,\n \"userMessage\",\n typeof fallback === \"string\"\n ? { $field: pointer, fallback }\n : { $field: pointer },\n );\n }\n return { spec, warnings };\n } catch {\n warnings.push(\"A2UI surface conversion encountered malformed input.\");\n return { spec: null, warnings };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","names":[],"sources":["../../src/a2ui/convert.ts"],"sourcesContent":["import { ICON_NAMES, type UIElement } from \"../ir\";\nimport { classifyTemporal } from \"../temporal\";\nimport { A2UI_SURFACE_ID, type A2uiSurfaceState } from \"./types\";\nimport {\n evaluateA2uiValueFunction,\n type ExpressionPart,\n} from \"./valueFunctions\";\nimport { MAX_AUTO_VIVIFY_ARRAY_INDEX } from \"./reducer\";\nimport type { A2uiBinding } from \"./BindingContext\";\nimport { decodePointer, resolvePointer } from \"./dataModel\";\n\nconst DEPTH_CAP = 32;\nconst TEMPLATE_ITEM_CAP = 100;\nconst NODE_BUDGET = 5000;\nconst EVALUATION_BUDGET = 20_000;\n\nconst SUPPORTED_COMPONENTS = new Set([\n \"Text\",\n \"Image\",\n \"Icon\",\n \"Row\",\n \"Column\",\n \"List\",\n \"Card\",\n \"Divider\",\n \"Button\",\n \"TextField\",\n \"CheckBox\",\n \"ChoicePicker\",\n \"DateTimeInput\",\n \"Slider\",\n]);\n\nconst CHILD_LIST_COMPONENTS: ReadonlySet<string> = new Set([\n \"Row\",\n \"Column\",\n \"List\",\n]);\n\nconst ICON_NAME_SET: ReadonlySet<string> = new Set(ICON_NAMES);\nconst ICON_SIZE_SET: ReadonlySet<string> = new Set([\"sm\", \"md\", \"lg\"]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (!isRecord(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst setOwnProperty = (\n target: Record<string, unknown>,\n key: string,\n value: unknown,\n) => {\n if (key === \"__proto__\") {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n } else {\n target[key] = value;\n }\n};\n\nconst FUNCTION_CALL_KEYS: ReadonlySet<string> = new Set([\n \"call\",\n \"args\",\n \"returnType\",\n \"catalogId\",\n]);\n\nconst isFunctionCall = (\n value: unknown,\n): value is {\n readonly call: string;\n readonly args?: Record<string, unknown>;\n} =>\n isPlainObject(value) &&\n typeof value[\"call\"] === \"string\" &&\n (value[\"args\"] === undefined || isPlainObject(value[\"args\"])) &&\n Object.keys(value).every((key) => FUNCTION_CALL_KEYS.has(key));\n\nconst isBinding = (value: unknown): value is { readonly path: string } =>\n isPlainObject(value) &&\n Object.keys(value).length === 1 &&\n typeof value[\"path\"] === \"string\";\n\ntype ChildTemplate = { readonly componentId: string; readonly path: string };\n\nconst childTemplateOf = (children: unknown): ChildTemplate | undefined => {\n const template =\n isPlainObject(children) &&\n Object.keys(children).length === 1 &&\n isPlainObject(children[\"template\"])\n ? children[\"template\"]\n : children;\n return isPlainObject(template) &&\n Object.keys(template).length === 2 &&\n typeof template[\"componentId\"] === \"string\" &&\n typeof template[\"path\"] === \"string\"\n ? { componentId: template[\"componentId\"], path: template[\"path\"] }\n : undefined;\n};\n\nconst bindingPath = (value: unknown): string | undefined =>\n isBinding(value) ? value.path : undefined;\n\ntype Scope = { readonly data: unknown; readonly path: string };\n\nconst pointerIn = (scope: Scope, path: string): string =>\n (path.startsWith(\"/\") ? \"\" : scope.path) +\n decodePointer(path)\n .map((segment) => `/${segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\")}`)\n .join(\"\");\n\nconst setIn = (\n value: unknown,\n segments: readonly string[],\n leaf: unknown,\n): unknown => {\n const [head, ...rest] = segments;\n if (head === undefined) return leaf;\n if (\n /^(0|[1-9]\\d*)$/.test(head) &&\n (Array.isArray(value) || value === undefined || value === null)\n ) {\n const list = Array.isArray(value) ? value : [];\n const index = Number(head);\n if (index >= list.length && index > MAX_AUTO_VIVIFY_ARRAY_INDEX) {\n return value;\n }\n const copy = [...list];\n copy[index] = setIn(copy[index], rest, leaf);\n return copy;\n }\n const copy: Record<string, unknown> = isRecord(value) ? { ...value } : {};\n setOwnProperty(\n copy,\n head,\n setIn(Object.hasOwn(copy, head) ? copy[head] : undefined, rest, leaf),\n );\n return copy;\n};\n\nconst withFieldReferences = (\n value: unknown,\n pointer: string,\n fields: ReadonlyMap<string, unknown>,\n): unknown => {\n if (fields.has(pointer)) return fields.get(pointer);\n let result = value;\n for (const [name, field] of fields) {\n if (name.startsWith(`${pointer}/`)) {\n result = setIn(result, decodePointer(name.slice(pointer.length)), field);\n }\n }\n return result;\n};\n\nconst materializeEntries = (\n value: Record<string, unknown>,\n source: unknown,\n context: ConversionContext,\n evaluate: boolean,\n depth: number,\n positional = false,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n // An action's functionCall runs when the button fires, so only its arguments resolve here.\n const resolved =\n key === \"functionCall\" && isFunctionCall(entry)\n ? {\n ...entry,\n ...(entry.args !== undefined\n ? {\n args: materializeEntries(\n entry.args,\n source,\n context,\n evaluate,\n depth,\n true,\n ),\n }\n : {}),\n }\n : materialize(entry, source, context, evaluate, depth, positional);\n if (resolved !== undefined) {\n setOwnProperty(result, key, resolved);\n }\n }\n return result;\n};\n\nfunction materialize(\n value: unknown,\n source: unknown,\n context: ConversionContext,\n evaluate = true,\n depth = 0,\n positional = false,\n): unknown {\n if (isBinding(value)) {\n const pointer = pointerIn(\n { data: source, path: context.scopePath },\n value.path,\n );\n const resolved = resolvePointer(context.surface.dataModel, pointer);\n context.dependencies?.set(pointer, resolved);\n return resolved;\n }\n if (Array.isArray(value)) {\n const entries = value.map((entry) =>\n materialize(entry, source, context, evaluate, depth, positional),\n );\n return positional\n ? entries\n : entries.filter((entry) => entry !== undefined);\n }\n if (!isPlainObject(value)) return value;\n if (!evaluate || !isFunctionCall(value)) {\n return materializeEntries(\n value,\n source,\n context,\n evaluate,\n depth,\n positional,\n );\n }\n if (!spendEvaluation(context)) return undefined;\n if (depth >= DEPTH_CAP) {\n if (!context.functionDepthWarned) {\n context.warnings.push(\n `A2UI function nesting cap of ${DEPTH_CAP} was reached.`,\n );\n context.functionDepthWarned = true;\n }\n return undefined;\n }\n return evaluateA2uiValueFunction(\n value.call,\n materializeEntries(\n value.args ?? {},\n source,\n context,\n true,\n depth + 1,\n true,\n ),\n {\n resolve: (part) =>\n spendEvaluation(context)\n ? materialize(part, source, context, true, depth + 1)\n : undefined,\n warn: (message) => context.warnings.push(message),\n templates: context.templates,\n },\n );\n}\n\nconst firstDefined = (\n props: Record<string, unknown>,\n keys: readonly string[],\n): unknown => {\n for (const key of keys) {\n if (props[key] !== undefined) return props[key];\n }\n return undefined;\n};\n\nconst stringProp = (\n props: Record<string, unknown>,\n keys: readonly string[],\n): string | undefined => {\n const value = firstDefined(props, keys);\n return typeof value === \"string\" ? value : undefined;\n};\n\nconst sourceSurfaceId = (surface: A2uiSurfaceState): string =>\n (surface as A2uiSurfaceState & { [A2UI_SURFACE_ID]?: string })[\n A2UI_SURFACE_ID\n ] ?? \"\";\n\ntype ConversionContext = {\n readonly surface: A2uiSurfaceState;\n readonly stepModel: unknown;\n readonly surfaceId: string;\n readonly warnings: string[];\n emittedNodes: number;\n depthWarned: boolean;\n budgetWarned: boolean;\n templateCapWarned: boolean;\n evaluations: number;\n evaluationBudgetWarned: boolean;\n functionDepthWarned: boolean;\n readonly templates: Map<string, ExpressionPart[] | null>;\n readonly inputFields: Map<string, unknown>;\n readonly textFields: Map<string, boolean>;\n readonly boundActionEntries: {\n readonly target: Record<string, unknown>;\n readonly key: string;\n readonly pointer: string;\n }[];\n readonly boundUserMessages: {\n readonly action: Record<string, unknown>;\n readonly pointer: string;\n }[];\n readonly keepUnknownComponents: boolean;\n readonly bindings: Map<string, A2uiBinding> | undefined;\n readonly cache: Map<string, CachedComponent> | undefined;\n dependencies: Map<string, unknown> | undefined;\n scopePath: string;\n};\n\ntype CachedComponent = {\n readonly props: Record<string, unknown>;\n readonly mapped: UIElement | undefined;\n readonly dependencies: ReadonlyMap<string, unknown>;\n readonly evaluations: number;\n children?: readonly UIElement[];\n result?: UIElement;\n};\n\nconst BOUND_KEYS = [\"text\", \"value\", \"binding\"] as const;\n\nconst INPUT_COMPONENTS: ReadonlySet<string> = new Set([\n \"TextField\",\n \"CheckBox\",\n \"ChoicePicker\",\n \"DateTimeInput\",\n \"Slider\",\n]);\n\ntype DateInputType = \"date\" | \"datetime\" | \"time\";\n\nconst dateInputType = (value: string): DateInputType | undefined => {\n const kind = classifyTemporal(value).kind;\n if (kind === \"date\" || kind === \"time\") return kind;\n return kind === \"floating\" || kind === \"instant\" ? \"datetime\" : undefined;\n};\n\nconst finiteNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst decimalPlaces = (value: number): number => {\n const [mantissa = \"\", exponent = \"0\"] = String(value).split(\"e\");\n return Math.max(0, (mantissa.split(\".\")[1]?.length ?? 0) - Number(exponent));\n};\n\n// A spec slider without `steps` is continuous, so its step leaves at least a hundred divisions and keeps every bound value on the grid.\nconst sliderStep = (\n min: number,\n max: number,\n value: number | undefined,\n steps: unknown,\n): number | undefined => {\n if (max <= min) return undefined;\n if (typeof steps === \"number\" && Number.isInteger(steps) && steps >= 1) {\n return (max - min) / steps;\n }\n const precision = Math.max(\n decimalPlaces(min),\n value === undefined ? 0 : decimalPlaces(value),\n );\n return Math.min(\n 10 ** Math.floor(Math.log10((max - min) / 100)),\n 10 ** -precision,\n );\n};\n\nconst recordBindings = (\n node: Record<string, unknown>,\n props: Record<string, unknown>,\n mapped: UIElement,\n scope: Scope,\n context: ConversionContext,\n) => {\n const component = node[\"component\"];\n const name = mapped[\"name\"];\n const boundKey = BOUND_KEYS.find((key) => node[key] !== undefined);\n const value = boundKey === undefined ? undefined : props[boundKey];\n if (INPUT_COMPONENTS.has(String(component)) && typeof name === \"string\") {\n context.textFields.set(\n name,\n (!context.textFields.has(name) || context.bindings !== undefined) &&\n (component === \"TextField\" || component === \"DateTimeInput\"),\n );\n const field = (fallback: unknown) =>\n fallback === undefined ? { $field: name } : { $field: name, fallback };\n // A single-choice picker collects one string, while the spec binds it to a string list.\n const listValued =\n component === \"ChoicePicker\" &&\n mapped.$type !== \"CheckboxGroup\" &&\n typeof value !== \"string\";\n context.inputFields.set(\n name,\n listValued\n ? [field(Array.isArray(value) ? value[0] : undefined)]\n : field(value),\n );\n }\n const action = mapped.$action;\n const raw = node[\"action\"];\n if (!action || !isRecord(raw)) return;\n const functionCall = action.type === \"a2ui:functionCall\";\n const event = isRecord(raw[\"event\"]) ? raw[\"event\"] : raw;\n const userMessage = event[\"userMessage\"];\n if (!functionCall && isBinding(userMessage)) {\n context.boundUserMessages.push({\n action,\n pointer: pointerIn(scope, userMessage.path),\n });\n }\n const rawEntries = functionCall\n ? isRecord(raw[\"functionCall\"])\n ? raw[\"functionCall\"][\"args\"]\n : undefined\n : event[\"context\"];\n const target = functionCall ? action[\"args\"] : action[\"context\"];\n if (!isRecord(rawEntries) || !isRecord(target)) return;\n for (const [key, entry] of Object.entries(rawEntries)) {\n if (isBinding(entry)) {\n context.boundActionEntries.push({\n target,\n key,\n pointer: pointerIn(scope, entry.path),\n });\n }\n }\n};\n\nconst spendEvaluation = (context: ConversionContext): boolean => {\n if (context.evaluations < EVALUATION_BUDGET) {\n context.evaluations++;\n return true;\n }\n if (!context.evaluationBudgetWarned) {\n context.warnings.push(\n `A2UI function evaluation budget of ${EVALUATION_BUDGET} was reached.`,\n );\n context.evaluationBudgetWarned = true;\n }\n return false;\n};\n\nconst reserveNode = (context: ConversionContext): boolean => {\n if (context.emittedNodes >= NODE_BUDGET) {\n if (!context.budgetWarned) {\n context.warnings.push(`A2UI node budget of ${NODE_BUDGET} was reached.`);\n context.budgetWarned = true;\n }\n return false;\n }\n context.emittedNodes++;\n return true;\n};\n\nconst childReferences = (node: Record<string, unknown>): unknown[] => {\n const children = node[\"children\"];\n const references: unknown[] = Array.isArray(children) ? [...children] : [];\n if (node[\"child\"] !== undefined) references.push(node[\"child\"]);\n if (node[\"component\"] === \"Modal\") {\n references.push(node[\"trigger\"], node[\"content\"]);\n }\n if (node[\"component\"] === \"Tabs\" && Array.isArray(node[\"tabs\"])) {\n for (const tab of node[\"tabs\"]) {\n references.push(isRecord(tab) ? tab[\"child\"] : undefined);\n }\n }\n return references;\n};\n\nconst childrenOf = (\n node: Record<string, unknown>,\n scope: Scope,\n context: ConversionContext,\n depth: number,\n visited: Set<string>,\n): UIElement[] => {\n const result: UIElement[] = [];\n for (const childId of childReferences(node)) {\n if (typeof childId !== \"string\") {\n context.warnings.push(\n `Component \"${String(node[\"id\"] ?? \"\")}\" has a malformed child reference.`,\n );\n continue;\n }\n const child = convertComponent(childId, scope, context, depth + 1, visited);\n if (child) result.push(child);\n }\n return result;\n};\n\nconst textLabel = (\n node: Record<string, unknown>,\n children: readonly UIElement[],\n context: ConversionContext,\n): string | undefined => {\n const references = childReferences(node);\n const [reference] = references;\n const [child] = children;\n if (\n references.length !== 1 ||\n children.length !== 1 ||\n typeof reference !== \"string\" ||\n !child ||\n context.surface.components.get(reference)?.[\"component\"] !== \"Text\"\n ) {\n return undefined;\n }\n const text = child.$type === \"Header\" ? child[\"text\"] : child[\"value\"];\n return typeof text === \"string\" ? text : undefined;\n};\n\nconst mappedAction = (\n node: Record<string, unknown>,\n props: Record<string, unknown>,\n context: ConversionContext,\n): UIElement[\"$action\"] | undefined => {\n const action = props[\"action\"];\n if (action === undefined) return undefined;\n const source = {\n surfaceId: context.surfaceId,\n sourceComponentId: typeof node[\"id\"] === \"string\" ? node[\"id\"] : \"\",\n };\n const event =\n isRecord(action) && isRecord(action[\"event\"]) ? action[\"event\"] : action;\n const actionName =\n typeof event === \"string\"\n ? event\n : isRecord(event) && typeof event[\"name\"] === \"string\"\n ? event[\"name\"]\n : undefined;\n if (actionName) {\n const actionContext = isRecord(event) ? event[\"context\"] : undefined;\n const userMessage = isRecord(event) ? event[\"userMessage\"] : undefined;\n return {\n type: \"a2ui:action\",\n name: actionName,\n ...source,\n ...(typeof userMessage === \"string\" ? { userMessage } : {}),\n ...(actionContext !== undefined ? { context: actionContext } : {}),\n };\n }\n const functionCall = isRecord(action) ? action[\"functionCall\"] : undefined;\n if (isRecord(functionCall) && typeof functionCall[\"call\"] === \"string\") {\n const args = functionCall[\"args\"];\n return {\n type: \"a2ui:functionCall\",\n call: functionCall[\"call\"],\n ...source,\n ...(isRecord(args) ? { args } : {}),\n };\n }\n context.warnings.push(\n `Component \"${String(node[\"id\"] ?? \"\")}\" has a malformed action.`,\n );\n return undefined;\n};\n\nconst choiceOptions = (value: unknown): { label: string; value: string }[] => {\n if (!Array.isArray(value)) return [];\n const options: { label: string; value: string }[] = [];\n for (const option of value) {\n if (\n isRecord(option) &&\n typeof option[\"label\"] === \"string\" &&\n typeof option[\"value\"] === \"string\"\n ) {\n options.push({ label: option[\"label\"], value: option[\"value\"] });\n }\n }\n return options;\n};\n\nconst mappedProps = (\n node: Record<string, unknown>,\n props: Record<string, unknown>,\n context: ConversionContext,\n scope: Scope,\n): UIElement | undefined => {\n const component = node[\"component\"];\n\n if (component === \"Text\") {\n const text = stringProp(props, [\"text\", \"value\"]);\n const variant = props[\"variant\"];\n if (typeof variant === \"string\" && /^h[1-6]$/.test(variant)) {\n return {\n $type: \"Header\",\n ...(text !== undefined ? { text } : {}),\n };\n }\n if (variant === \"caption\") {\n return {\n $type: \"Caption\",\n ...(text !== undefined ? { value: text } : {}),\n };\n }\n return {\n $type: \"Markdown\",\n ...(text !== undefined ? { value: text } : {}),\n };\n }\n\n if (component === \"Image\") {\n const src = stringProp(props, [\"src\", \"url\"]);\n const alt = stringProp(props, [\"alt\", \"altText\", \"description\"]);\n const size = props[\"size\"];\n const round = props[\"round\"];\n return {\n $type: \"Image\",\n ...(src !== undefined ? { src } : {}),\n ...(alt !== undefined ? { alt } : {}),\n ...(typeof size === \"string\" || typeof size === \"number\" ? { size } : {}),\n ...(typeof round === \"boolean\" ? { round } : {}),\n };\n }\n\n if (component === \"Icon\") {\n const name = stringProp(props, [\"name\"]);\n if (!name || !ICON_NAME_SET.has(name)) return undefined;\n const size = props[\"size\"];\n return {\n $type: \"Icon\",\n name,\n ...(typeof size === \"string\" && ICON_SIZE_SET.has(size) ? { size } : {}),\n };\n }\n\n if (component === \"Row\") {\n const gap = props[\"gap\"];\n const align = firstDefined(props, [\"align\", \"alignment\"]);\n const justify = firstDefined(props, [\"justify\", \"distribution\"]);\n return {\n $type: \"Row\",\n ...(typeof gap === \"number\" ? { gap } : {}),\n ...(typeof align === \"string\" ? { align } : {}),\n ...(typeof justify === \"string\" ? { justify } : {}),\n };\n }\n\n if (component === \"Column\") {\n const gap = props[\"gap\"];\n const align = firstDefined(props, [\"align\", \"alignment\"]);\n return {\n $type: \"Col\",\n ...(typeof gap === \"number\" ? { gap } : {}),\n ...(typeof align === \"string\" ? { align } : {}),\n };\n }\n\n if (component === \"List\") {\n const direction = props[\"direction\"];\n const align = props[\"align\"];\n if (direction === \"horizontal\") {\n return {\n $type: \"Row\",\n ...(typeof align === \"string\" ? { align } : {}),\n };\n }\n return { $type: \"ListView\" };\n }\n\n if (component === \"Card\") {\n const title = props[\"title\"];\n const padding = props[\"padding\"];\n const background = props[\"background\"];\n return {\n $type: \"Card\",\n ...(typeof title === \"string\" ? { title } : {}),\n ...(typeof padding === \"number\" ? { padding } : {}),\n ...(typeof background === \"string\" ? { background } : {}),\n };\n }\n\n if (component === \"Divider\") {\n return {\n $type: \"Divider\",\n ...(typeof props[\"flush\"] === \"boolean\" ? { flush: props[\"flush\"] } : {}),\n };\n }\n\n if (component === \"Button\") {\n const label = stringProp(props, [\"label\", \"text\"]);\n const variantStyle =\n props[\"variant\"] === \"primary\"\n ? \"primary\"\n : props[\"variant\"] === \"borderless\"\n ? \"ghost\"\n : undefined;\n const buttonStyle =\n typeof props[\"buttonStyle\"] === \"string\"\n ? props[\"buttonStyle\"]\n : variantStyle;\n const block = props[\"block\"];\n const submit = props[\"submit\"];\n const action = mappedAction(node, props, context);\n return {\n $type: \"Button\",\n ...(label !== undefined ? { label } : {}),\n ...(buttonStyle !== undefined ? { buttonStyle } : {}),\n ...(typeof block === \"boolean\" ? { block } : {}),\n ...(typeof submit === \"boolean\" ? { submit } : {}),\n ...(action ? { $action: action } : {}),\n };\n }\n\n const bound = bindingPath(firstDefined(node, BOUND_KEYS));\n const name = bound === undefined ? undefined : pointerIn(scope, bound);\n const label = stringProp(props, [\"label\"]);\n\n if (component === \"TextField\") {\n const placeholder = stringProp(props, [\"placeholder\"]);\n const inputType =\n props[\"variant\"] === \"obscured\"\n ? \"password\"\n : props[\"variant\"] === \"number\"\n ? \"number\"\n : undefined;\n const multiline =\n typeof props[\"multiline\"] === \"boolean\"\n ? props[\"multiline\"]\n : props[\"variant\"] === \"longText\" ||\n props[\"textFieldType\"] === \"longText\"\n ? true\n : undefined;\n const initial = firstDefined(props, [\"value\", \"text\"]);\n const defaultValue =\n typeof initial === \"string\"\n ? initial\n : typeof initial === \"number\" && Number.isFinite(initial)\n ? String(initial)\n : undefined;\n return {\n $type: \"Input\",\n ...(inputType !== undefined ? { inputType } : {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(multiline !== undefined ? { multiline } : {}),\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n };\n }\n\n if (component === \"CheckBox\") {\n const defaultChecked = firstDefined(props, [\"defaultChecked\", \"value\"]);\n return {\n $type: \"Checkbox\",\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(typeof defaultChecked === \"boolean\" ? { defaultChecked } : {}),\n };\n }\n\n if (component === \"Slider\") {\n const min = finiteNumber(props[\"min\"]) ?? 0;\n const max = finiteNumber(props[\"max\"]);\n if (max === undefined || max < min) return undefined;\n const value = finiteNumber(props[\"value\"]);\n const step = sliderStep(\n min,\n max,\n name === undefined\n ? value\n : finiteNumber(resolvePointer(context.stepModel, name)),\n props[\"steps\"],\n );\n return {\n $type: \"Slider\",\n min,\n max,\n ...(step !== undefined ? { step } : {}),\n ...(value !== undefined ? { defaultValue: value } : {}),\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n };\n }\n\n if (component === \"ChoicePicker\") {\n const options = choiceOptions(props[\"options\"]);\n const value = props[\"value\"];\n const selected =\n typeof value === \"string\"\n ? [value]\n : Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n if (props[\"variant\"] === \"multipleSelection\") {\n return {\n $type: \"CheckboxGroup\",\n options,\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(selected.length > 0 ? { defaultValue: selected } : {}),\n };\n }\n const [defaultValue] = selected;\n return {\n $type: \"RadioGroup\",\n options,\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n };\n }\n\n if (component === \"DateTimeInput\") {\n const value = stringProp(props, [\"value\"]);\n const shapeValue =\n name === undefined ? value : resolvePointer(context.stepModel, name);\n const shapeType =\n typeof shapeValue === \"string\" ? dateInputType(shapeValue) : undefined;\n let inputType: DateInputType = shapeType ?? \"date\";\n if (\"enableDate\" in props || \"enableTime\" in props) {\n inputType =\n props[\"enableTime\"] === true\n ? props[\"enableDate\"] === true\n ? \"datetime\"\n : \"time\"\n : \"date\";\n }\n if (\n typeof shapeValue === \"string\" &&\n shapeValue !== \"\" &&\n shapeType !== inputType\n ) {\n return {\n $type: \"Input\",\n ...(value !== undefined ? { defaultValue: value } : {}),\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n };\n }\n // The spec types a bound as a date, a time or a date-time whatever the\n // enabled flags are, so a date bound on a datetime control is the range of\n // that whole local day rather than a mismatch.\n const bound = (edge: \"min\" | \"max\"): string | undefined => {\n const boundValue = stringProp(props, [edge]);\n if (boundValue === undefined) return undefined;\n const boundType = dateInputType(boundValue);\n if (boundType === inputType) return boundValue;\n if (inputType === \"datetime\" && boundType === \"date\") {\n return `${boundValue}T${edge === \"min\" ? \"00:00\" : \"23:59:59.999\"}`;\n }\n context.warnings.push(\n `A2UI DateTimeInput \"${edge}\" of \"${boundValue}\" is not a ${inputType} value and was dropped.`,\n );\n return undefined;\n };\n const min = bound(\"min\");\n const max = bound(\"max\");\n return {\n $type: \"DatePicker\",\n inputType,\n ...(value !== undefined ? { value } : {}),\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...(label !== undefined ? { label } : {}),\n ...(name !== undefined ? { name } : {}),\n };\n }\n\n return undefined;\n};\n\nconst convertTemplate = (\n node: Record<string, unknown>,\n template: ChildTemplate,\n scope: Scope,\n context: ConversionContext,\n depth: number,\n visited: Set<string>,\n converted: UIElement | undefined,\n): UIElement | null => {\n if (!reserveNode(context)) return null;\n const container = converted ?? { $type: \"ListView\" };\n const itemized = container.$type === \"ListView\";\n const list = resolvePointer(\n context.surface.dataModel,\n pointerIn(scope, template.path),\n );\n const listPointer = pointerIn(scope, template.path);\n if (!Array.isArray(list)) {\n context.warnings.push(\n `Template on component \"${String(node[\"id\"] ?? \"\")}\" did not resolve to a list.`,\n );\n return { ...container, children: [] };\n }\n const itemCount = Math.min(list.length, TEMPLATE_ITEM_CAP);\n if (list.length > TEMPLATE_ITEM_CAP && !context.templateCapWarned) {\n context.warnings.push(\n `A2UI template expansion was capped at ${TEMPLATE_ITEM_CAP} items.`,\n );\n context.templateCapWarned = true;\n }\n const children: UIElement[] = [];\n for (let index = 0; index < itemCount; index++) {\n if (itemized && !reserveNode(context)) break;\n const child = convertComponent(\n template.componentId,\n { data: list[index], path: `${listPointer}/${index}` },\n context,\n depth + 1,\n visited,\n );\n if (itemized) {\n children.push({\n $type: \"ListViewItem\",\n ...(child ? { children: child } : {}),\n });\n } else if (child) {\n children.push(child);\n }\n }\n return { ...container, children };\n};\n\nfunction convertComponent(\n componentId: string,\n scope: Scope,\n context: ConversionContext,\n depth: number,\n visited: Set<string>,\n): UIElement | null {\n if (depth >= DEPTH_CAP) {\n if (!context.depthWarned) {\n context.warnings.push(`A2UI depth cap of ${DEPTH_CAP} was reached.`);\n context.depthWarned = true;\n }\n return null;\n }\n if (visited.has(componentId)) {\n context.warnings.push(`A2UI component cycle detected at \"${componentId}\".`);\n return null;\n }\n const node = context.surface.components.get(componentId);\n if (!node) {\n context.warnings.push(`A2UI component \"${componentId}\" was not found.`);\n return null;\n }\n const component = node[\"component\"];\n\n visited.add(componentId);\n try {\n if (typeof component !== \"string\") {\n context.warnings.push(\n `Unknown A2UI component \"${String(component ?? \"\")}\" was skipped.`,\n );\n return null;\n }\n const template = childTemplateOf(node[\"children\"]);\n if (\n !SUPPORTED_COMPONENTS.has(component) &&\n !context.keepUnknownComponents &&\n !template\n ) {\n context.warnings.push(\n `Unknown A2UI component \"${component}\" was skipped.`,\n );\n return null;\n }\n const cacheKey = context.cache\n ? JSON.stringify([componentId, scope.path, depth])\n : \"\";\n let cached = context.cache?.get(cacheKey);\n if (\n cached &&\n (context.evaluations + cached.evaluations > EVALUATION_BUDGET ||\n [...cached.dependencies].some(\n ([path, value]) =>\n !Object.is(resolvePointer(context.surface.dataModel, path), value),\n ))\n )\n cached = undefined;\n let props: Record<string, unknown>;\n let mapped: UIElement | undefined;\n if (cached) {\n props = cached.props;\n mapped = cached.mapped;\n context.evaluations += cached.evaluations;\n } else {\n props = {};\n const dependencies = new Map<string, unknown>();\n const evaluations = context.evaluations;\n context.dependencies = dependencies;\n context.scopePath = scope.path;\n for (const [key, value] of Object.entries(node)) {\n if (\n key === \"id\" ||\n key === \"component\" ||\n key === \"children\" ||\n key === \"child\"\n )\n continue;\n const resolved = materialize(\n value,\n scope.data,\n context,\n key !== \"checks\",\n );\n if (resolved !== undefined) setOwnProperty(props, key, resolved);\n }\n context.dependencies = undefined;\n mapped = mappedProps(node, props, context, scope);\n if (context.cache && context.warnings.length === 0 && !mapped?.$action) {\n cached = {\n props,\n mapped,\n dependencies,\n evaluations: context.evaluations - evaluations,\n };\n context.cache.set(cacheKey, cached);\n }\n }\n if (\n mapped &&\n context.bindings &&\n typeof mapped[\"name\"] === \"string\" &&\n INPUT_COMPONENTS.has(component)\n ) {\n const field = mapped.$type === \"Checkbox\" ? \"checked\" : \"value\";\n const defaultField =\n mapped.$type === \"Checkbox\" ? \"defaultChecked\" : \"defaultValue\";\n const fallback =\n mapped.$type === \"Checkbox\"\n ? false\n : mapped.$type === \"CheckboxGroup\"\n ? []\n : mapped.$type === \"Slider\"\n ? mapped[\"min\"]\n : \"\";\n const { [defaultField]: initialValue, ...rest } = mapped;\n mapped = { ...rest, [field]: initialValue ?? mapped[field] ?? fallback };\n context.bindings.set(mapped[\"name\"] as string, {\n value: mapped[field],\n arrayValue:\n component === \"ChoicePicker\" &&\n mapped.$type !== \"CheckboxGroup\" &&\n typeof props[\"value\"] !== \"string\",\n });\n }\n\n if (!mapped && SUPPORTED_COMPONENTS.has(component)) {\n context.warnings.push(\n `A2UI component \"${component}\" could not be mapped and was skipped.`,\n );\n return null;\n }\n const retained =\n !mapped && context.keepUnknownComponents\n ? {\n $type: component,\n ...Object.fromEntries(\n Object.entries(props).filter(([key]) => !key.startsWith(\"$\")),\n ),\n }\n : undefined;\n if (template) {\n return convertTemplate(\n node,\n template,\n scope,\n context,\n depth,\n visited,\n CHILD_LIST_COMPONENTS.has(component) ? mapped : retained,\n );\n }\n if (!reserveNode(context)) return null;\n const converted = mapped ?? retained;\n if (!converted) return null;\n recordBindings(node, props, converted, scope, context);\n const children = childrenOf(node, scope, context, depth, visited);\n if (mapped?.$type === \"Button\" && mapped[\"label\"] === undefined) {\n const label = textLabel(node, children, context);\n if (label !== undefined) return { ...mapped, label };\n }\n const listChildren =\n component === \"List\" && mapped?.$type === \"ListView\"\n ? children.map((child) => ({ $type: \"ListViewItem\", children: child }))\n : children;\n if (\n cached?.result &&\n cached.children?.length === listChildren.length &&\n cached.children.every((child, index) => child === listChildren[index])\n )\n return cached.result;\n const result = {\n ...converted,\n ...(listChildren.length > 0 ? { children: listChildren } : {}),\n };\n if (cached) {\n cached.children = listChildren;\n cached.result = result;\n }\n return result;\n } finally {\n visited.delete(componentId);\n }\n}\n\nexport function convertSurfaceToUISpec(\n surface: A2uiSurfaceState,\n options: {\n readonly keepUnknownComponents?: boolean;\n } = {},\n): {\n spec: UIElement | null;\n warnings: string[];\n} {\n return convertSurface(surface, options.keepUnknownComponents === true);\n}\n\nexport const createLiveSurfaceConverter = (surface: A2uiSurfaceState) => {\n const cache = new Map<string, CachedComponent>();\n const templates = new Map<string, ExpressionPart[] | null>();\n return (dataModel: unknown) => {\n const bindings = new Map<string, A2uiBinding>();\n const converted = convertSurface(\n { ...surface, dataModel, [A2UI_SURFACE_ID]: sourceSurfaceId(surface) },\n false,\n bindings,\n cache,\n templates,\n surface.dataModel,\n );\n return { ...converted, bindings };\n };\n};\n\nfunction convertSurface(\n surface: A2uiSurfaceState & { [A2UI_SURFACE_ID]?: string },\n keepUnknownComponents: boolean,\n bindings?: Map<string, A2uiBinding>,\n cache?: Map<string, CachedComponent>,\n templates = new Map<string, ExpressionPart[] | null>(),\n stepModel: unknown = surface.dataModel,\n): { spec: UIElement | null; warnings: string[] } {\n const warnings: string[] = [];\n if (!surface.components.has(\"root\")) {\n return {\n spec: null,\n warnings: ['A2UI root component \"root\" was not found.'],\n };\n }\n const context: ConversionContext = {\n surface,\n stepModel,\n surfaceId: sourceSurfaceId(surface),\n warnings,\n emittedNodes: 0,\n depthWarned: false,\n budgetWarned: false,\n templateCapWarned: false,\n evaluations: 0,\n evaluationBudgetWarned: false,\n functionDepthWarned: false,\n templates,\n inputFields: new Map(),\n textFields: new Map(),\n boundActionEntries: [],\n boundUserMessages: [],\n keepUnknownComponents,\n bindings,\n cache,\n dependencies: undefined,\n scopePath: \"\",\n };\n try {\n const spec = convertComponent(\n \"root\",\n { data: surface.dataModel, path: \"\" },\n context,\n 0,\n new Set(),\n );\n for (const { target, key, pointer } of context.boundActionEntries) {\n const value = withFieldReferences(\n target[key],\n pointer,\n context.inputFields,\n );\n if (value !== undefined) setOwnProperty(target, key, value);\n }\n for (const { action, pointer } of context.boundUserMessages) {\n if (!context.textFields.get(pointer)) continue;\n const fallback = action[\"userMessage\"];\n setOwnProperty(\n action,\n \"userMessage\",\n typeof fallback === \"string\"\n ? { $field: pointer, fallback }\n : { $field: pointer },\n );\n }\n return { spec, warnings };\n } catch {\n warnings.push(\"A2UI surface conversion encountered malformed input.\");\n return { spec: null, warnings };\n }\n}\n"],"mappings":"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"}
@@ -10,5 +10,6 @@
10
10
  export declare const TYPE_KEY = "$type";
11
11
  export declare const GENERATED_NAME_ATTR = "data-aui-generated-name";
12
12
  export declare const FIELD_NAME_ATTR = "data-aui-field-name";
13
+ export declare const FIELD_VALUE_ATTR = "data-aui-field-value";
13
14
  export declare const CHECKBOX_GROUP_ATTR = "data-aui-checkbox-group";
14
15
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,UAAU,CAAC;AAEhC,eAAO,MAAM,mBAAmB,4BAA4B,CAAC;AAE7D,eAAO,MAAM,eAAe,wBAAwB,CAAC;AAErD,eAAO,MAAM,mBAAmB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,UAAU,CAAC;AAEhC,eAAO,MAAM,mBAAmB,4BAA4B,CAAC;AAE7D,eAAO,MAAM,eAAe,wBAAwB,CAAC;AACrD,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAEvD,eAAO,MAAM,mBAAmB,4BAA4B,CAAC"}
package/dist/constants.js CHANGED
@@ -11,8 +11,9 @@
11
11
  const TYPE_KEY = "$type";
12
12
  const GENERATED_NAME_ATTR = "data-aui-generated-name";
13
13
  const FIELD_NAME_ATTR = "data-aui-field-name";
14
+ const FIELD_VALUE_ATTR = "data-aui-field-value";
14
15
  const CHECKBOX_GROUP_ATTR = "data-aui-checkbox-group";
15
16
  //#endregion
16
- export { CHECKBOX_GROUP_ATTR, FIELD_NAME_ATTR, GENERATED_NAME_ATTR, TYPE_KEY };
17
+ export { CHECKBOX_GROUP_ATTR, FIELD_NAME_ATTR, FIELD_VALUE_ATTR, GENERATED_NAME_ATTR, TYPE_KEY };
17
18
 
18
19
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../src/constants.ts"],"sourcesContent":["/**\n * The wire key naming the component to render.\n *\n * The model emits nodes as flat objects `{ [TYPE_KEY]: name, ...props }`. We\n * use `$type` rather than `type` so a component's own `type` prop (e.g. a\n * button's `type=\"submit\"`) flows through as an ordinary prop without\n * colliding with the discriminator. It mirrors the `$type` discriminator\n * convention used by JSON polymorphism elsewhere.\n */\nexport const TYPE_KEY = \"$type\";\n\nexport const GENERATED_NAME_ATTR = \"data-aui-generated-name\";\n\nexport const FIELD_NAME_ATTR = \"data-aui-field-name\";\n\nexport const CHECKBOX_GROUP_ATTR = \"data-aui-checkbox-group\";\n"],"mappings":";;;;;;;;;;AASA,MAAa,WAAW;AAExB,MAAa,sBAAsB;AAEnC,MAAa,kBAAkB;AAE/B,MAAa,sBAAsB"}
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../src/constants.ts"],"sourcesContent":["/**\n * The wire key naming the component to render.\n *\n * The model emits nodes as flat objects `{ [TYPE_KEY]: name, ...props }`. We\n * use `$type` rather than `type` so a component's own `type` prop (e.g. a\n * button's `type=\"submit\"`) flows through as an ordinary prop without\n * colliding with the discriminator. It mirrors the `$type` discriminator\n * convention used by JSON polymorphism elsewhere.\n */\nexport const TYPE_KEY = \"$type\";\n\nexport const GENERATED_NAME_ATTR = \"data-aui-generated-name\";\n\nexport const FIELD_NAME_ATTR = \"data-aui-field-name\";\nexport const FIELD_VALUE_ATTR = \"data-aui-field-value\";\n\nexport const CHECKBOX_GROUP_ATTR = \"data-aui-checkbox-group\";\n"],"mappings":";;;;;;;;;;AASA,MAAa,WAAW;AAExB,MAAa,sBAAsB;AAEnC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAEhC,MAAa,sBAAsB"}
@@ -1 +1 @@
1
- {"version":3,"file":"decodeBlockAction.d.ts","sourceRoot":"","sources":["../../src/slack/decodeBlockAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAc;AAyGpC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,WAAW,CAAC,EAAE,OAAO,GACpB,MAAM,GAAG,SAAS,CA2CpB"}
1
+ {"version":3,"file":"decodeBlockAction.d.ts","sourceRoot":"","sources":["../../src/slack/decodeBlockAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAc;AA8JpC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,WAAW,CAAC,EAAE,OAAO,GACpB,MAAM,GAAG,SAAS,CA+DpB"}
@@ -1,8 +1,20 @@
1
1
  import { resolveFieldReferences } from "../fieldReferences.js";
2
+ import { formatTemporalUnixSeconds, mergeTemporalMinutes, splitTemporalMinutes } from "../temporal.js";
2
3
  //#region src/slack/decodeBlockAction.ts
3
4
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
4
5
  const optionValue = (value) => isRecord(value) && typeof value["value"] === "string" ? value["value"] : void 0;
5
- const selectedValue = (action) => {
6
+ const selectedValue = (action, field) => {
7
+ if (action["type"] === "datetimepicker" || "selected_date_time" in action) {
8
+ const seconds = action["selected_date_time"];
9
+ return seconds === null ? "" : typeof seconds === "number" ? formatTemporalUnixSeconds(seconds, field?.offset) : void 0;
10
+ }
11
+ if (action["type"] === "timepicker" || "selected_time" in action) {
12
+ const time = action["selected_time"];
13
+ if (time === null) return "";
14
+ const parts = typeof time === "string" ? splitTemporalMinutes(time) : void 0;
15
+ return parts?.date === void 0 ? parts?.time : void 0;
16
+ }
17
+ if (field?.part === "date" && action["selected_date"] === null) return "";
6
18
  const selectedOption = optionValue(action["selected_option"]);
7
19
  const selectedDate = typeof action["selected_date"] === "string" ? action["selected_date"] : void 0;
8
20
  const selectedOptions = Array.isArray(action["selected_options"]) ? action["selected_options"].map(optionValue).filter((value) => value !== void 0) : void 0;
@@ -16,40 +28,58 @@ const fieldMappingsFromBlockId = (blockId) => {
16
28
  try {
17
29
  const parsed = JSON.parse(blockId.slice(mappingStart + 1));
18
30
  if (!Array.isArray(parsed)) return [];
19
- return parsed.flatMap((entry) => Array.isArray(entry) && typeof entry[0] === "string" && typeof entry[1] === "string" ? [[
20
- entry[0],
21
- entry[1],
22
- entry[2] === "Checkbox"
23
- ]] : []);
31
+ return parsed.flatMap((entry) => {
32
+ if (!Array.isArray(entry) || typeof entry[0] !== "string" || typeof entry[1] !== "string") return [];
33
+ return [{
34
+ actionId: entry[0],
35
+ name: entry[1],
36
+ component: typeof entry[2] === "string" ? entry[2] : "",
37
+ ...entry[2] === "DatePicker" && (entry[3] === "time" || entry[3] === "datetime") ? {
38
+ inputType: entry[3],
39
+ ...typeof entry[4] === "string" ? { offset: entry[4] } : {},
40
+ ...(entry[5] === "date" || entry[5] === "time") && Number.isSafeInteger(entry[6]) && entry[6] >= 0 ? {
41
+ part: entry[5],
42
+ pairId: entry[6]
43
+ } : {}
44
+ } : {}
45
+ }];
46
+ });
24
47
  } catch {
25
48
  return [];
26
49
  }
27
50
  };
28
51
  const checkboxValue = (value, name) => Array.isArray(value["selected_options"]) ? value["selected_options"].some((option) => optionValue(option) === name) : void 0;
29
- const stateFieldValue = (value, name, isCheckbox) => {
52
+ const stateFieldValue = (value, field) => {
30
53
  if (!isRecord(value)) return void 0;
31
- if (isCheckbox && value["type"] === "checkboxes") return checkboxValue(value, name);
54
+ if (field.component === "Checkbox" && value["type"] === "checkboxes") return checkboxValue(value, field.name);
32
55
  if (value["type"] === "plain_text_input") return typeof value["value"] === "string" ? value["value"] : void 0;
33
- return selectedValue(value);
56
+ return selectedValue(value, field);
34
57
  };
35
- const fieldValuesFromState = (stateValues) => {
58
+ const fieldValuesFromState = (stateValues, action, actionField) => {
36
59
  const fields = Object.create(null);
37
- if (!isRecord(stateValues)) return fields;
38
- for (const [blockId, rawBlockValues] of Object.entries(stateValues)) {
60
+ const pairs = /* @__PURE__ */ new Map();
61
+ const collect = (raw, field) => {
62
+ const value = stateFieldValue(raw, field);
63
+ if (field.part !== void 0 && field.pairId !== void 0) {
64
+ const pair = pairs.get(field.pairId) ?? {
65
+ name: field.name,
66
+ date: "",
67
+ time: ""
68
+ };
69
+ pair[field.part] = typeof value === "string" ? value : "";
70
+ pairs.set(field.pairId, pair);
71
+ } else if (field.name && value !== void 0) fields[field.name] = value;
72
+ };
73
+ if (isRecord(stateValues)) for (const [blockId, rawBlockValues] of Object.entries(stateValues)) {
39
74
  if (!isRecord(rawBlockValues)) continue;
40
- for (const [actionId, name, isCheckbox] of fieldMappingsFromBlockId(blockId)) {
41
- if (!Object.hasOwn(rawBlockValues, actionId)) continue;
42
- const value = stateFieldValue(rawBlockValues[actionId], name, isCheckbox);
43
- if (value === void 0) continue;
44
- Object.defineProperty(fields, name, {
45
- value,
46
- enumerable: true,
47
- configurable: true,
48
- writable: true
49
- });
50
- }
75
+ for (const field of fieldMappingsFromBlockId(blockId)) if (Object.hasOwn(rawBlockValues, field.actionId)) collect(rawBlockValues[field.actionId], field);
51
76
  }
52
- return fields;
77
+ if (actionField?.inputType !== void 0) collect(action, actionField);
78
+ for (const pair of pairs.values()) if (pair.name) fields[pair.name] = mergeTemporalMinutes(pair.date, pair.time);
79
+ return {
80
+ fields,
81
+ pairs
82
+ };
53
83
  };
54
84
  /**
55
85
  * Decodes one structural entry from a Slack `block_actions` payload.
@@ -74,13 +104,21 @@ function decodeBlockAction(action, stateValues) {
74
104
  } catch {
75
105
  plainValue = rawValue;
76
106
  }
77
- const input = selectedValue(action) ?? plainValue;
107
+ const actionField = typeof action["block_id"] === "string" ? fieldMappingsFromBlockId(action["block_id"]).find((field) => field.actionId === actionId) : void 0;
108
+ const { fields, pairs } = fieldValuesFromState(stateValues, action, actionField);
109
+ let input = selectedValue(action, actionField) ?? plainValue;
110
+ if (actionField?.pairId !== void 0) {
111
+ const pair = pairs.get(actionField.pairId);
112
+ input = pair === void 0 ? "" : mergeTemporalMinutes(pair.date, pair.time);
113
+ if (!input) return void 0;
114
+ }
115
+ if ((action["type"] === "timepicker" || action["type"] === "datetimepicker") && input === void 0) return void 0;
78
116
  const decoded = {
79
117
  ...Object.fromEntries(Object.entries(payload).filter(([key]) => key !== "$input")),
80
118
  type: actionId,
81
119
  ...input !== void 0 ? { $input: input } : {}
82
120
  };
83
- return resolveFieldReferences(decoded, fieldValuesFromState(stateValues));
121
+ return resolveFieldReferences(decoded, fields);
84
122
  } catch {
85
123
  return;
86
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"decodeBlockAction.js","names":[],"sources":["../../src/slack/decodeBlockAction.ts"],"sourcesContent":["import type { Action } from \"../ir\";\nimport { resolveFieldReferences } from \"../fieldReferences\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst optionValue = (value: unknown): string | undefined =>\n isRecord(value) && typeof value[\"value\"] === \"string\"\n ? value[\"value\"]\n : undefined;\n\nconst selectedValue = (action: Record<string, unknown>): unknown => {\n const selectedOption = optionValue(action[\"selected_option\"]);\n const selectedDate =\n typeof action[\"selected_date\"] === \"string\"\n ? action[\"selected_date\"]\n : undefined;\n const selectedOptions = Array.isArray(action[\"selected_options\"])\n ? action[\"selected_options\"]\n .map(optionValue)\n .filter((value): value is string => value !== undefined)\n : undefined;\n const numberInput =\n action[\"type\"] === \"number_input\" && typeof action[\"value\"] === \"string\"\n ? Number(action[\"value\"])\n : undefined;\n return (\n selectedOption ??\n selectedDate ??\n (selectedOptions !== undefined\n ? selectedOptions\n : Number.isFinite(numberInput)\n ? numberInput\n : undefined)\n );\n};\n\nconst fieldMappingsFromBlockId = (\n blockId: string,\n): readonly (readonly [string, string, boolean])[] => {\n if (!/^aui:\\d+:/.test(blockId)) return [];\n const mappingStart = blockId.indexOf(\":\", 4);\n if (mappingStart === -1) return [];\n try {\n const parsed: unknown = JSON.parse(blockId.slice(mappingStart + 1));\n if (!Array.isArray(parsed)) return [];\n return parsed.flatMap((entry): (readonly [string, string, boolean])[] =>\n Array.isArray(entry) &&\n typeof entry[0] === \"string\" &&\n typeof entry[1] === \"string\"\n ? [[entry[0], entry[1], entry[2] === \"Checkbox\"]]\n : [],\n );\n } catch {\n return [];\n }\n};\n\nconst checkboxValue = (\n value: Record<string, unknown>,\n name: string,\n): boolean | undefined =>\n Array.isArray(value[\"selected_options\"])\n ? value[\"selected_options\"].some((option) => optionValue(option) === name)\n : undefined;\n\nconst stateFieldValue = (\n value: unknown,\n name: string,\n isCheckbox: boolean,\n): unknown => {\n if (!isRecord(value)) return undefined;\n if (isCheckbox && value[\"type\"] === \"checkboxes\") {\n return checkboxValue(value, name);\n }\n if (value[\"type\"] === \"plain_text_input\") {\n return typeof value[\"value\"] === \"string\" ? value[\"value\"] : undefined;\n }\n return selectedValue(value);\n};\n\nconst fieldValuesFromState = (\n stateValues: unknown,\n): Record<string, unknown> => {\n const fields: Record<string, unknown> = Object.create(null);\n if (!isRecord(stateValues)) return fields;\n for (const [blockId, rawBlockValues] of Object.entries(stateValues)) {\n if (!isRecord(rawBlockValues)) continue;\n for (const [actionId, name, isCheckbox] of fieldMappingsFromBlockId(\n blockId,\n )) {\n if (!Object.hasOwn(rawBlockValues, actionId)) continue;\n const value = stateFieldValue(rawBlockValues[actionId], name, isCheckbox);\n if (value === undefined) continue;\n Object.defineProperty(fields, name, {\n value,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n }\n return fields;\n};\n\n/**\n * Decodes one structural entry from a Slack `block_actions` payload.\n * `$input` is reserved for the runtime selection: a `$input` key inside the\n * button's JSON `value` payload is dropped rather than spread into the result.\n * `stateValues` is the companion `state.values` object used to resolve named\n * control values referenced by `{ \"$field\": name }` in the action payload.\n */\nexport function decodeBlockAction(\n action: unknown,\n stateValues?: unknown,\n): Action | undefined {\n try {\n if (!isRecord(action) || typeof action[\"action_id\"] !== \"string\") {\n return undefined;\n }\n\n const actionId = action[\"action_id\"];\n if (!actionId) return undefined;\n\n const rawValue = action[\"value\"];\n let payload: Record<string, unknown> = {};\n let plainValue: string | undefined;\n if (action[\"type\"] === \"plain_text_input\" && typeof rawValue === \"string\") {\n plainValue = rawValue;\n } else if (typeof rawValue === \"string\") {\n try {\n const parsed: unknown = JSON.parse(rawValue);\n if (isRecord(parsed)) {\n payload = parsed;\n } else {\n plainValue = rawValue;\n }\n } catch {\n plainValue = rawValue;\n }\n }\n\n const input = selectedValue(action) ?? plainValue;\n\n const decoded = {\n ...Object.fromEntries(\n Object.entries(payload).filter(([key]) => key !== \"$input\"),\n ),\n type: actionId,\n ...(input !== undefined ? { $input: input } : {}),\n };\n return resolveFieldReferences(\n decoded,\n fieldValuesFromState(stateValues),\n ) as Action;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"decodeBlockAction.js","names":[],"sources":["../../src/slack/decodeBlockAction.ts"],"sourcesContent":["import type { Action } from \"../ir\";\nimport { resolveFieldReferences } from \"../fieldReferences\";\nimport {\n formatTemporalUnixSeconds,\n mergeTemporalMinutes,\n splitTemporalMinutes,\n} from \"../temporal\";\nimport type { FieldMapping } from \"./types\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst optionValue = (value: unknown): string | undefined =>\n isRecord(value) && typeof value[\"value\"] === \"string\"\n ? value[\"value\"]\n : undefined;\n\nconst selectedValue = (\n action: Record<string, unknown>,\n field?: FieldMapping,\n): unknown => {\n if (action[\"type\"] === \"datetimepicker\" || \"selected_date_time\" in action) {\n const seconds = action[\"selected_date_time\"];\n return seconds === null\n ? \"\"\n : typeof seconds === \"number\"\n ? formatTemporalUnixSeconds(seconds, field?.offset)\n : undefined;\n }\n if (action[\"type\"] === \"timepicker\" || \"selected_time\" in action) {\n const time = action[\"selected_time\"];\n if (time === null) return \"\";\n const parts =\n typeof time === \"string\" ? splitTemporalMinutes(time) : undefined;\n return parts?.date === undefined ? parts?.time : undefined;\n }\n if (field?.part === \"date\" && action[\"selected_date\"] === null) return \"\";\n const selectedOption = optionValue(action[\"selected_option\"]);\n const selectedDate =\n typeof action[\"selected_date\"] === \"string\"\n ? action[\"selected_date\"]\n : undefined;\n const selectedOptions = Array.isArray(action[\"selected_options\"])\n ? action[\"selected_options\"]\n .map(optionValue)\n .filter((value): value is string => value !== undefined)\n : undefined;\n const numberInput =\n action[\"type\"] === \"number_input\" && typeof action[\"value\"] === \"string\"\n ? Number(action[\"value\"])\n : undefined;\n return (\n selectedOption ??\n selectedDate ??\n (selectedOptions !== undefined\n ? selectedOptions\n : Number.isFinite(numberInput)\n ? numberInput\n : undefined)\n );\n};\n\nconst fieldMappingsFromBlockId = (blockId: string): readonly FieldMapping[] => {\n if (!/^aui:\\d+:/.test(blockId)) return [];\n const mappingStart = blockId.indexOf(\":\", 4);\n if (mappingStart === -1) return [];\n try {\n const parsed: unknown = JSON.parse(blockId.slice(mappingStart + 1));\n if (!Array.isArray(parsed)) return [];\n return parsed.flatMap((entry): FieldMapping[] => {\n if (\n !Array.isArray(entry) ||\n typeof entry[0] !== \"string\" ||\n typeof entry[1] !== \"string\"\n )\n return [];\n return [\n {\n actionId: entry[0],\n name: entry[1],\n component: typeof entry[2] === \"string\" ? entry[2] : \"\",\n ...(entry[2] === \"DatePicker\" &&\n (entry[3] === \"time\" || entry[3] === \"datetime\")\n ? {\n inputType: entry[3],\n ...(typeof entry[4] === \"string\" ? { offset: entry[4] } : {}),\n ...((entry[5] === \"date\" || entry[5] === \"time\") &&\n Number.isSafeInteger(entry[6]) &&\n entry[6] >= 0\n ? { part: entry[5], pairId: entry[6] }\n : {}),\n }\n : {}),\n },\n ];\n });\n } catch {\n return [];\n }\n};\n\nconst checkboxValue = (\n value: Record<string, unknown>,\n name: string,\n): boolean | undefined =>\n Array.isArray(value[\"selected_options\"])\n ? value[\"selected_options\"].some((option) => optionValue(option) === name)\n : undefined;\n\nconst stateFieldValue = (value: unknown, field: FieldMapping): unknown => {\n if (!isRecord(value)) return undefined;\n if (field.component === \"Checkbox\" && value[\"type\"] === \"checkboxes\") {\n return checkboxValue(value, field.name);\n }\n if (value[\"type\"] === \"plain_text_input\") {\n return typeof value[\"value\"] === \"string\" ? value[\"value\"] : undefined;\n }\n return selectedValue(value, field);\n};\n\nconst fieldValuesFromState = (\n stateValues: unknown,\n action: Record<string, unknown>,\n actionField: FieldMapping | undefined,\n) => {\n const fields: Record<string, unknown> = Object.create(null);\n const pairs = new Map<number, { name: string; date: string; time: string }>();\n const collect = (raw: unknown, field: FieldMapping) => {\n const value = stateFieldValue(raw, field);\n if (field.part !== undefined && field.pairId !== undefined) {\n const pair = pairs.get(field.pairId) ?? {\n name: field.name,\n date: \"\",\n time: \"\",\n };\n pair[field.part] = typeof value === \"string\" ? value : \"\";\n pairs.set(field.pairId, pair);\n } else if (field.name && value !== undefined) {\n fields[field.name] = value;\n }\n };\n if (isRecord(stateValues)) {\n for (const [blockId, rawBlockValues] of Object.entries(stateValues)) {\n if (!isRecord(rawBlockValues)) continue;\n for (const field of fieldMappingsFromBlockId(blockId)) {\n if (Object.hasOwn(rawBlockValues, field.actionId))\n collect(rawBlockValues[field.actionId], field);\n }\n }\n }\n if (actionField?.inputType !== undefined) collect(action, actionField);\n for (const pair of pairs.values()) {\n if (pair.name)\n fields[pair.name] = mergeTemporalMinutes(pair.date, pair.time);\n }\n return { fields, pairs };\n};\n\n/**\n * Decodes one structural entry from a Slack `block_actions` payload.\n * `$input` is reserved for the runtime selection: a `$input` key inside the\n * button's JSON `value` payload is dropped rather than spread into the result.\n * `stateValues` is the companion `state.values` object used to resolve named\n * control values referenced by `{ \"$field\": name }` in the action payload.\n */\nexport function decodeBlockAction(\n action: unknown,\n stateValues?: unknown,\n): Action | undefined {\n try {\n if (!isRecord(action) || typeof action[\"action_id\"] !== \"string\") {\n return undefined;\n }\n\n const actionId = action[\"action_id\"];\n if (!actionId) return undefined;\n\n const rawValue = action[\"value\"];\n let payload: Record<string, unknown> = {};\n let plainValue: string | undefined;\n if (action[\"type\"] === \"plain_text_input\" && typeof rawValue === \"string\") {\n plainValue = rawValue;\n } else if (typeof rawValue === \"string\") {\n try {\n const parsed: unknown = JSON.parse(rawValue);\n if (isRecord(parsed)) {\n payload = parsed;\n } else {\n plainValue = rawValue;\n }\n } catch {\n plainValue = rawValue;\n }\n }\n\n const actionField =\n typeof action[\"block_id\"] === \"string\"\n ? fieldMappingsFromBlockId(action[\"block_id\"]).find(\n (field) => field.actionId === actionId,\n )\n : undefined;\n const { fields, pairs } = fieldValuesFromState(\n stateValues,\n action,\n actionField,\n );\n let input = selectedValue(action, actionField) ?? plainValue;\n if (actionField?.pairId !== undefined) {\n const pair = pairs.get(actionField.pairId);\n input =\n pair === undefined ? \"\" : mergeTemporalMinutes(pair.date, pair.time);\n if (!input) return undefined;\n }\n if (\n (action[\"type\"] === \"timepicker\" ||\n action[\"type\"] === \"datetimepicker\") &&\n input === undefined\n )\n return undefined;\n\n const decoded = {\n ...Object.fromEntries(\n Object.entries(payload).filter(([key]) => key !== \"$input\"),\n ),\n type: actionId,\n ...(input !== undefined ? { $input: input } : {}),\n };\n return resolveFieldReferences(decoded, fields) as Action;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fromSlackBlocks.d.ts","sourceRoot":"","sources":["../../src/slack/fromSlackBlocks.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,qBAAqB,EAA0B,mBAAgB;AA2qB7E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,qBAAqB,CAqCtE"}
1
+ {"version":3,"file":"fromSlackBlocks.d.ts","sourceRoot":"","sources":["../../src/slack/fromSlackBlocks.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,qBAAqB,EAA0B,mBAAgB;AAusB7E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,qBAAqB,CAqCtE"}
@@ -1,3 +1,4 @@
1
+ import { formatTemporalUnixSeconds } from "../temporal.js";
1
2
  import { copyBounded } from "../convert/copyBounded.js";
2
3
  import "./constants.js";
3
4
  //#region src/slack/fromSlackBlocks.ts
@@ -194,6 +195,21 @@ const actionElementFrom = (element, warnings) => {
194
195
  case "button": return buttonFrom(element);
195
196
  case "static_select": return selectFrom(element, warnings);
196
197
  case "datepicker": return datePickerFrom(element);
198
+ case "timepicker": return {
199
+ $type: "DatePicker",
200
+ inputType: "time",
201
+ ...typeof element["initial_time"] === "string" ? { value: element["initial_time"] } : {},
202
+ $action: decodeAction(element["action_id"], element["value"])
203
+ };
204
+ case "datetimepicker": {
205
+ const value = typeof element["initial_date_time"] === "number" ? formatTemporalUnixSeconds(element["initial_date_time"]) : void 0;
206
+ return {
207
+ $type: "DatePicker",
208
+ inputType: "datetime",
209
+ ...value !== void 0 ? { value } : {},
210
+ $action: decodeAction(element["action_id"], element["value"])
211
+ };
212
+ }
197
213
  case "checkboxes": return Array.isArray(element["options"]) && element["options"].length > 1 ? checkboxGroupFrom(element, warnings) : checkboxFrom(element);
198
214
  case "radio_buttons": return radioGroupFrom(element, warnings);
199
215
  }
@@ -204,6 +220,13 @@ const actionsFrom = (block, warnings) => {
204
220
  };
205
221
  const inputFrom = (block, warnings) => {
206
222
  const element = block["element"];
223
+ if (isRecord(element) && (element["type"] === "timepicker" || element["type"] === "datetimepicker")) {
224
+ const picker = actionElementFrom(element, warnings);
225
+ return picker ? [{
226
+ ...picker,
227
+ label: textOf(block["label"])
228
+ }] : [];
229
+ }
207
230
  if (!isRecord(element) || element["type"] !== "plain_text_input") {
208
231
  warn(warnings, "dropped", "Input", "Unknown input element type was dropped.");
209
232
  return [];