@streamline-pulse/formkrafter-core 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -94,6 +94,8 @@ services.jsRunnerService = new UnsafeEvalJsRunnerService()
94
94
  | `services.jsRunnerService` | AST sandbox | you need full JS in a trusted context |
95
95
  | `services.dataSourceService` | `fetch` + per-URL/headers cache | auth, base URL, retry policy:<br/>`new FetchDataSourceService({ credentials: 'include', headers: {...} })` |
96
96
  | `services.fileUploadService` | base64 data-URL | real uploads: `new UrlFileUploadService({ url, headers, credentials })` — multipart POST + `remove()` on delete; the brick-level `uploadUrl` config overrides the default URL |
97
+ | `services.specSourceService` | `fetch` the ref as a URL (`FetchSpecSourceService`, with `baseUrl`/headers/caching) | nested forms loaded from your own store: `fetchSpec(ref)` returns a `BrickSpec` |
98
+ | `services.optionSourceService` | `fetch` the ref as a URL (`FetchOptionSourceService`, with `baseUrl`/headers/caching) | shared option catalogs (`optionsSource: "catalog"` + `optionsRef`) served from your own store: `fetchOptions(ref)` returns the option list |
97
99
 
98
100
  ## Shared singleton state
99
101
 
@@ -105,6 +107,23 @@ What this means in practice:
105
107
  - Every FormKrafter instance on the page shares the same services, brick registry, and chrome translations. That is the intended behavior for host-level configuration; per-form differences belong in the spec, not in services.
106
108
  - The same pattern backs the brick registry and the i18n store in `formkrafter-wc`.
107
109
 
110
+ ## Nested forms
111
+
112
+ A `nested-form` brick references another form through its `specRef` config. `expandSpec` resolves every reference (cycle detection, depth limit) and returns a plain spec the whole synchronous pipeline consumes unchanged:
113
+
114
+ ```ts
115
+ import { expandSpec, hasNestedForms, services, validateFormData } from '@streamline-pulse/formkrafter-core'
116
+
117
+ services.specSourceService = {
118
+ fetchSpec: async (ref) => (await fetch(`/api/forms/${ref}`)).json(),
119
+ }
120
+
121
+ const full = await expandSpec(spec) // nested-form bricks become labelled groups
122
+ const verdict = validateFormData(full, data) // backend validation sees the complete tree
123
+ ```
124
+
125
+ `fk-form-render` runs this expansion automatically on the frontend — configure the service once at startup.
126
+
108
127
  ## Coming from Form.io
109
128
 
110
129
  `convertFormioForm(form)` turns a Form.io form definition into a FormKrafter spec — fields, layout (panels, columns, tabs, data grids, wizard → stepper), validations and simple `show/when/eq` conditionals included:
@@ -13,6 +13,7 @@ export interface FormioComponent {
13
13
  multiple?: boolean;
14
14
  prefix?: string;
15
15
  suffix?: string;
16
+ inputMask?: string;
16
17
  html?: string;
17
18
  content?: string;
18
19
  legend?: string;
package/dist/index.d.ts CHANGED
@@ -26,3 +26,9 @@ export { SpecHistory } from "./ops/history";
26
26
  export type { Operation } from "fast-json-patch";
27
27
  export { convertFormioForm } from "./compat/formio";
28
28
  export type { FormioForm, FormioComponent, FormioConversionResult } from "./compat/formio";
29
+ export { expandSpec, hasNestedForms } from "./utils/expand-spec";
30
+ export type { ExpandSpecOptions } from "./utils/expand-spec";
31
+ export { FetchSpecSourceService } from "./services/spec_source_service";
32
+ export type { SpecSourceService, FetchSpecSourceDefaults } from "./services/spec_source_service";
33
+ export { FetchOptionSourceService } from "./services/option_source_service";
34
+ export type { OptionSourceService, FetchOptionSourceDefaults } from "./services/option_source_service";
package/dist/index.js CHANGED
@@ -649,14 +649,84 @@ class UrlFileUploadService {
649
649
  }
650
650
  }
651
651
 
652
+ // lib/services/spec_source_service.ts
653
+ class FetchSpecSourceService {
654
+ defaults;
655
+ cache = new Map;
656
+ constructor(defaults = {}) {
657
+ this.defaults = defaults;
658
+ }
659
+ resolveUrl(ref) {
660
+ if (/^https?:\/\//.test(ref) || !this.defaults.baseUrl)
661
+ return ref;
662
+ return `${this.defaults.baseUrl.replace(/\/$/, "")}/${ref.replace(/^\//, "")}`;
663
+ }
664
+ fetchSpec(ref) {
665
+ const url = this.resolveUrl(ref);
666
+ let pending = this.cache.get(url);
667
+ if (!pending) {
668
+ const fetchImplementation = this.defaults.fetch ?? globalThis.fetch.bind(globalThis);
669
+ pending = fetchImplementation(url, {
670
+ headers: this.defaults.headers,
671
+ credentials: this.defaults.credentials
672
+ }).then(async (response) => {
673
+ if (!response.ok) {
674
+ throw new Error(`Failed to load spec "${ref}" (${response.status})`);
675
+ }
676
+ return await response.json();
677
+ });
678
+ pending.catch(() => this.cache.delete(url));
679
+ this.cache.set(url, pending);
680
+ }
681
+ return pending;
682
+ }
683
+ }
684
+
685
+ // lib/services/option_source_service.ts
686
+ class FetchOptionSourceService {
687
+ defaults;
688
+ cache = new Map;
689
+ constructor(defaults = {}) {
690
+ this.defaults = defaults;
691
+ }
692
+ resolveUrl(ref) {
693
+ if (/^https?:\/\//.test(ref) || !this.defaults.baseUrl)
694
+ return ref;
695
+ return `${this.defaults.baseUrl.replace(/\/$/, "")}/${ref.replace(/^\//, "")}`;
696
+ }
697
+ fetchOptions(ref) {
698
+ const url = this.resolveUrl(ref);
699
+ let pending = this.cache.get(url);
700
+ if (!pending) {
701
+ const fetchImplementation = this.defaults.fetch ?? globalThis.fetch.bind(globalThis);
702
+ pending = fetchImplementation(url, {
703
+ headers: this.defaults.headers,
704
+ credentials: this.defaults.credentials
705
+ }).then(async (response) => {
706
+ if (!response.ok) {
707
+ throw new Error(`Failed to load options "${ref}" (${response.status})`);
708
+ }
709
+ return await response.json();
710
+ });
711
+ pending.catch(() => this.cache.delete(url));
712
+ this.cache.set(url, pending);
713
+ }
714
+ return pending;
715
+ }
716
+ }
717
+
652
718
  // lib/services/index.ts
653
719
  var GLOBAL_KEY = Symbol.for("formkrafter.core.services");
654
720
  var globalStore = globalThis;
655
721
  var services = globalStore[GLOBAL_KEY] ??= {
656
722
  jsRunnerService: new SandboxJsRunnerService,
657
723
  dataSourceService: new FetchDataSourceService,
658
- fileUploadService: new Base64FileUploadService
724
+ fileUploadService: new Base64FileUploadService,
725
+ specSourceService: new FetchSpecSourceService,
726
+ optionSourceService: new FetchOptionSourceService
659
727
  };
728
+ services.specSourceService ??= new FetchSpecSourceService;
729
+ services.optionSourceService ??= new FetchOptionSourceService;
660
730
 
661
731
  // lib/brick/utils.ts
662
732
  var evalBrickCode = (code, data) => {
@@ -1247,7 +1317,7 @@ function convertComponent(component, ctx) {
1247
1317
  configs: {
1248
1318
  ...baseConfigs(component, ctx),
1249
1319
  optionsSource: "static",
1250
- options: staticOptions(component.values)
1320
+ options: emitOptions(staticOptions(component.values), component, ctx)
1251
1321
  }
1252
1322
  })
1253
1323
  ];
@@ -1262,7 +1332,24 @@ function convertComponent(component, ctx) {
1262
1332
  configs: {
1263
1333
  ...baseConfigs(component, ctx),
1264
1334
  optionsSource: "static",
1265
- options: staticOptions(component.values)
1335
+ options: emitOptions(staticOptions(component.values), component, ctx)
1336
+ }
1337
+ })
1338
+ ];
1339
+ }
1340
+ if (type === "form") {
1341
+ const ref = String(component.form ?? component.path ?? component.src ?? "");
1342
+ ctx.warn(`nested form "${component.key ?? "?"}" references "${ref}" — configure services.specSourceService so it can be resolved`);
1343
+ return [
1344
+ withCommon(component, ctx, {
1345
+ type: "panel",
1346
+ id: "nested-form",
1347
+ name: "Nested form",
1348
+ configs: {
1349
+ uid: ctx.nextUid(),
1350
+ key: component.key ?? ctx.nextUid(),
1351
+ label: component.label,
1352
+ specRef: ref
1266
1353
  }
1267
1354
  })
1268
1355
  ];
@@ -1327,13 +1414,13 @@ function convertSelect(component, ctx) {
1327
1414
  configs.searchParam = component.searchField;
1328
1415
  } else if (component.dataSrc === "json" && Array.isArray(component.data?.json)) {
1329
1416
  configs.optionsSource = "static";
1330
- configs.options = jsonOptions(component, ctx);
1417
+ configs.options = emitOptions(jsonOptions(component, ctx), component, ctx);
1331
1418
  } else {
1332
1419
  if (component.dataSrc && !["values", "json", ""].includes(component.dataSrc)) {
1333
1420
  ctx.warn(`select "${component.key ?? "?"}" uses dataSrc "${component.dataSrc}" — converted to static options`);
1334
1421
  }
1335
1422
  configs.optionsSource = "static";
1336
- configs.options = staticOptions(component.data?.values ?? component.values);
1423
+ configs.options = emitOptions(staticOptions(component.data?.values ?? component.values), component, ctx);
1337
1424
  }
1338
1425
  return withCommon(component, ctx, {
1339
1426
  type: "input",
@@ -1371,6 +1458,16 @@ function staticOptions(values) {
1371
1458
  value: String(option.value ?? option.label ?? "")
1372
1459
  }));
1373
1460
  }
1461
+ var LARGE_OPTIONS_THRESHOLD = 100;
1462
+ function emitOptions(list, component, ctx) {
1463
+ if (list.length > LARGE_OPTIONS_THRESHOLD) {
1464
+ ctx.warn(`"${component.key ?? "?"}" embeds ${list.length} static options — consider optionsSource "remote" or a shared catalog (optionsSource "catalog" + optionsRef) to keep the spec small`);
1465
+ }
1466
+ const compactable = list.length > 0 && list.every((option) => option.label === option.value && option.value !== "" && option.value === option.value.trim() && !option.value.includes(`
1467
+ `));
1468
+ return compactable ? list.map((option) => option.value).join(`
1469
+ `) : list;
1470
+ }
1374
1471
  function baseConfigs(component, ctx) {
1375
1472
  const configs = {
1376
1473
  uid: ctx.nextUid(),
@@ -1394,6 +1491,9 @@ function baseConfigs(component, ctx) {
1394
1491
  configs.prefix = component.prefix;
1395
1492
  if (component.suffix)
1396
1493
  configs.suffix = component.suffix;
1494
+ if (typeof component.inputMask === "string" && component.inputMask) {
1495
+ configs.mask = component.inputMask;
1496
+ }
1397
1497
  return configs;
1398
1498
  }
1399
1499
  function withCommon(component, ctx, brick) {
@@ -1531,6 +1631,56 @@ function convertConditional(component, ctx) {
1531
1631
  }
1532
1632
  ];
1533
1633
  }
1634
+ // lib/utils/expand-spec.ts
1635
+ var isNestedForm = (brick) => brick.id === "nested-form" && typeof brick.configs?.specRef === "string";
1636
+ var hasNestedForms = (spec) => {
1637
+ if (!spec)
1638
+ return false;
1639
+ for (const { brick } of iterateBricks(spec)) {
1640
+ if (isNestedForm(brick) && brick.configs?.specRef)
1641
+ return true;
1642
+ }
1643
+ return false;
1644
+ };
1645
+ async function expandSpec(spec, options = {}) {
1646
+ const source = options.specSourceService ?? services.specSourceService;
1647
+ const maxDepth = options.maxDepth ?? 5;
1648
+ const expandBrick = async (brick, seenRefs) => {
1649
+ if (isNestedForm(brick) && brick.configs?.specRef) {
1650
+ const ref = String(brick.configs.specRef);
1651
+ if (seenRefs.includes(ref)) {
1652
+ throw new Error(`Circular nested form reference: ${[...seenRefs, ref].join(" → ")}`);
1653
+ }
1654
+ if (seenRefs.length >= maxDepth) {
1655
+ throw new Error(`Nested forms exceed the maximum depth of ${maxDepth} (${ref})`);
1656
+ }
1657
+ const fetched = await source.fetchSpec(ref);
1658
+ const inlined = await expandBrick(structuredClone(fetched), [
1659
+ ...seenRefs,
1660
+ ref
1661
+ ]);
1662
+ return {
1663
+ type: "panel",
1664
+ id: "group",
1665
+ name: brick.name,
1666
+ configs: {
1667
+ ...brick.configs,
1668
+ label: brick.configs.label ?? inlined.name
1669
+ },
1670
+ styles: brick.styles,
1671
+ rules: brick.rules,
1672
+ children: inlined.children ?? []
1673
+ };
1674
+ }
1675
+ if (!brick.children?.length)
1676
+ return brick;
1677
+ return {
1678
+ ...brick,
1679
+ children: await Promise.all(brick.children.map((child) => expandBrick(child, seenRefs)))
1680
+ };
1681
+ };
1682
+ return expandBrick(structuredClone(spec), []);
1683
+ }
1534
1684
  export {
1535
1685
  validateFormData,
1536
1686
  validateBrickSpecDataDetailed,
@@ -1551,8 +1701,10 @@ export {
1551
1701
  iterateSchemaBricks,
1552
1702
  iterateBricks,
1553
1703
  isLocalizedObject,
1704
+ hasNestedForms,
1554
1705
  getBrickAt,
1555
1706
  getAffectedProperties,
1707
+ expandSpec,
1556
1708
  evalBrickCode,
1557
1709
  duplicateBrick,
1558
1710
  defaultValidationMessage,
@@ -1564,10 +1716,12 @@ export {
1564
1716
  SpecHistory,
1565
1717
  SandboxJsRunnerService,
1566
1718
  JsRunnerServiceImplementation,
1719
+ FetchSpecSourceService,
1720
+ FetchOptionSourceService,
1567
1721
  FetchDataSourceService,
1568
1722
  Brick,
1569
1723
  Base64FileUploadService
1570
1724
  };
1571
1725
 
1572
- //# debugId=889DCABFD85A92E164756E2164756E21
1726
+ //# debugId=5B1C4474681AF83564756E2164756E21
1573
1727
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../lib/utils/localized-text.ts", "../lib/validators/default-messages.ts", "../lib/utils/brick-spec.ts", "../lib/brick/brick.ts", "../lib/brick/utils.ts", "../lib/services/js_runner_service.ts", "../lib/services/sandbox_interpreter.ts", "../lib/services/data_source_service.ts", "../lib/services/file_upload_service.ts", "../lib/services/index.ts", "../lib/validators/validator.ts", "../lib/services/unsafe_js_runner_service.ts", "../lib/ops/pointer.ts", "../lib/utils/fast-json-patch.ts", "../lib/ops/ops.ts", "../lib/ops/history.ts", "../lib/compat/formio.ts"],
3
+ "sources": ["../lib/utils/localized-text.ts", "../lib/validators/default-messages.ts", "../lib/utils/brick-spec.ts", "../lib/brick/brick.ts", "../lib/brick/utils.ts", "../lib/services/js_runner_service.ts", "../lib/services/sandbox_interpreter.ts", "../lib/services/data_source_service.ts", "../lib/services/file_upload_service.ts", "../lib/services/spec_source_service.ts", "../lib/services/option_source_service.ts", "../lib/services/index.ts", "../lib/validators/validator.ts", "../lib/services/unsafe_js_runner_service.ts", "../lib/ops/pointer.ts", "../lib/utils/fast-json-patch.ts", "../lib/ops/ops.ts", "../lib/ops/history.ts", "../lib/compat/formio.ts", "../lib/utils/expand-spec.ts"],
4
4
  "sourcesContent": [
5
5
  "export type LocalizedText = string | Record<string, string>;\n\nexport function isLocalizedObject(\n value: unknown\n): value is Record<string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every((entry) => typeof entry === \"string\")\n );\n}\n\nexport function resolveLocalizedText(value: unknown, locale?: string): unknown {\n if (!isLocalizedObject(value)) return value;\n\n if (locale && value[locale] !== undefined) return value[locale];\n\n return Object.values(value)[0];\n}\n\nexport function resolveLocalizedRecord<T extends Record<string, unknown>>(\n record: T | undefined,\n locale?: string\n): T | undefined {\n if (!record) return record;\n\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n resolved[key] = resolveLocalizedText(value, locale);\n }\n\n return resolved as T;\n}\n",
6
6
  "const DEFAULT_MESSAGES: Record<string, Record<string, string>> = {\n en: {\n required: \"This field is required\",\n minLength: \"Must be at least {value} characters\",\n maxLength: \"Must be at most {value} characters\",\n min: \"Must be at least {value}\",\n max: \"Must be at most {value}\",\n pattern: \"Invalid format\",\n minItems: \"Select at least {value} item(s)\",\n maxItems: \"Select at most {value} item(s)\",\n email: \"Invalid email address\",\n url: \"Invalid URL\",\n type: \"Invalid value\",\n custom: \"Invalid value\",\n },\n fr: {\n required: \"Ce champ est obligatoire\",\n minLength: \"Minimum {value} caractères\",\n maxLength: \"Maximum {value} caractères\",\n min: \"Minimum {value}\",\n max: \"Maximum {value}\",\n pattern: \"Format invalide\",\n minItems: \"Sélectionnez au moins {value} élément(s)\",\n maxItems: \"Sélectionnez au plus {value} élément(s)\",\n email: \"Adresse email invalide\",\n url: \"URL invalide\",\n type: \"Valeur invalide\",\n custom: \"Valeur invalide\",\n },\n};\n\nexport function registerValidationMessages(\n locale: string,\n messages: Record<string, string>\n): void {\n DEFAULT_MESSAGES[locale] = { ...DEFAULT_MESSAGES[locale], ...messages };\n}\n\nexport function defaultValidationMessage(\n validator: string,\n locale?: string,\n value?: unknown\n): string {\n const pack = DEFAULT_MESSAGES[locale ?? \"en\"] ?? DEFAULT_MESSAGES.en;\n const template =\n pack[validator] ?? DEFAULT_MESSAGES.en[validator] ?? \"Invalid value\";\n\n return template.replace(\"{value}\", String(value ?? \"\"));\n}\n",
@@ -11,16 +11,19 @@
11
11
  "import { parse } from \"acorn\";\n\ninterface AstNode {\n type: string;\n [key: string]: unknown;\n}\n\nconst FORBIDDEN_PROPS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nconst MAX_STEPS = 100_000;\n\nclass ReturnSignal {\n constructor(readonly value: unknown) {}\n}\n\ntype Scope = Map<string, unknown>;\n\ninterface Ctx {\n steps: number;\n scopes: Scope[];\n}\n\nconst lookup = (ctx: Ctx, name: string): unknown => {\n for (let i = ctx.scopes.length - 1; i >= 0; i--) {\n if (ctx.scopes[i].has(name)) return ctx.scopes[i].get(name);\n }\n\n throw new Error(`Unknown identifier \"${name}\"`);\n};\n\nconst declareVar = (ctx: Ctx, name: string, value: unknown): void => {\n ctx.scopes[ctx.scopes.length - 1].set(name, value);\n};\n\nconst assign = (ctx: Ctx, name: string, value: unknown): void => {\n for (let i = ctx.scopes.length - 1; i >= 0; i--) {\n if (ctx.scopes[i].has(name)) {\n ctx.scopes[i].set(name, value);\n return;\n }\n }\n\n throw new Error(`Cannot assign to unknown identifier \"${name}\"`);\n};\n\nconst guardProp = (prop: unknown): string | number => {\n if (typeof prop === \"number\") return prop;\n\n const name = String(prop);\n if (FORBIDDEN_PROPS.has(name)) {\n throw new Error(`Access to \"${name}\" is not allowed`);\n }\n\n return name;\n};\n\nconst memberTarget = (\n ctx: Ctx,\n node: AstNode\n): { object: unknown; prop: string | number; optional: boolean } => {\n const object = evalNode(ctx, node.object as AstNode);\n const prop = node.computed\n ? guardProp(evalNode(ctx, node.property as AstNode))\n : guardProp((node.property as AstNode).name);\n\n return { object, prop, optional: node.optional === true };\n};\n\nconst readMember = (ctx: Ctx, node: AstNode): unknown => {\n const { object, prop, optional } = memberTarget(ctx, node);\n\n if (object === null || object === undefined) {\n if (optional) return undefined;\n throw new Error(`Cannot read \"${String(prop)}\" of ${String(object)}`);\n }\n\n return (object as Record<string | number, unknown>)[prop];\n};\n\nconst evalNode = (ctx: Ctx, node: AstNode): unknown => {\n if (++ctx.steps > MAX_STEPS) {\n throw new Error(\"Sandbox execution budget exceeded\");\n }\n\n switch (node.type) {\n case \"Program\":\n case \"BlockStatement\": {\n for (const statement of node.body as AstNode[]) {\n const result = evalNode(ctx, statement);\n if (result instanceof ReturnSignal) return result;\n }\n return undefined;\n }\n case \"ReturnStatement\":\n return new ReturnSignal(\n node.argument ? evalNode(ctx, node.argument as AstNode) : undefined\n );\n case \"IfStatement\": {\n if (evalNode(ctx, node.test as AstNode)) {\n return evalNode(ctx, node.consequent as AstNode);\n }\n if (node.alternate) return evalNode(ctx, node.alternate as AstNode);\n return undefined;\n }\n case \"VariableDeclaration\": {\n for (const declaration of node.declarations as AstNode[]) {\n const id = declaration.id as AstNode;\n if (id.type !== \"Identifier\") {\n throw new Error(\"Only simple variable names are supported\");\n }\n declareVar(\n ctx,\n id.name as string,\n declaration.init ? evalNode(ctx, declaration.init as AstNode) : undefined\n );\n }\n return undefined;\n }\n case \"ExpressionStatement\":\n evalNode(ctx, node.expression as AstNode);\n return undefined;\n case \"Literal\":\n return node.value;\n case \"TemplateLiteral\": {\n const quasis = node.quasis as AstNode[];\n const expressions = node.expressions as AstNode[];\n let text = \"\";\n quasis.forEach((quasi, index) => {\n text += (quasi.value as { cooked?: string }).cooked ?? \"\";\n if (index < expressions.length) {\n text += String(evalNode(ctx, expressions[index]));\n }\n });\n return text;\n }\n case \"Identifier\":\n return lookup(ctx, node.name as string);\n case \"ThisExpression\":\n return undefined;\n case \"ChainExpression\":\n return evalNode(ctx, node.expression as AstNode);\n case \"MemberExpression\":\n return readMember(ctx, node);\n case \"CallExpression\": {\n const callee = node.callee as AstNode;\n const args: unknown[] = [];\n for (const argument of node.arguments as AstNode[]) {\n if (argument.type === \"SpreadElement\") {\n const spread = evalNode(ctx, argument.argument as AstNode);\n if (Array.isArray(spread)) args.push(...spread);\n } else {\n args.push(evalNode(ctx, argument));\n }\n }\n\n if (callee.type === \"MemberExpression\") {\n const { object, prop, optional } = memberTarget(ctx, callee);\n if (object === null || object === undefined) {\n if (optional || node.optional === true) return undefined;\n throw new Error(`Cannot call \"${String(prop)}\" of ${String(object)}`);\n }\n\n const fn = (object as Record<string | number, unknown>)[prop];\n if (typeof fn !== \"function\") {\n if (node.optional === true && fn == null) return undefined;\n throw new Error(`\"${String(prop)}\" is not a function`);\n }\n if (fn === Function || fn === eval) {\n throw new Error(\"This function is not allowed\");\n }\n\n return (fn as (...values: unknown[]) => unknown).apply(object, args);\n }\n\n const fn = evalNode(ctx, callee);\n if (typeof fn !== \"function\") {\n if (node.optional === true && fn == null) return undefined;\n throw new Error(\"Value is not a function\");\n }\n if (fn === Function || fn === eval) {\n throw new Error(\"This function is not allowed\");\n }\n\n return (fn as (...values: unknown[]) => unknown)(...args);\n }\n case \"ArrowFunctionExpression\": {\n const params = node.params as AstNode[];\n const body = node.body as AstNode;\n const capturedScopes = [...ctx.scopes];\n\n return (...args: unknown[]): unknown => {\n const callScope: Scope = new Map();\n params.forEach((param, index) => {\n if (param.type !== \"Identifier\") {\n throw new Error(\"Only simple parameters are supported\");\n }\n callScope.set(param.name as string, args[index]);\n });\n\n const callCtx: Ctx = {\n steps: ctx.steps,\n scopes: [...capturedScopes, callScope],\n };\n const result = evalNode(callCtx, body);\n ctx.steps = callCtx.steps;\n\n if (result instanceof ReturnSignal) return result.value;\n return node.expression === true ? result : undefined;\n };\n }\n case \"BinaryExpression\": {\n const left = evalNode(ctx, node.left as AstNode) as never;\n const right = evalNode(ctx, node.right as AstNode) as never;\n switch (node.operator) {\n case \"===\": return left === right;\n case \"!==\": return left !== right;\n case \"==\": return left == right;\n case \"!=\": return left != right;\n case \"<\": return left < right;\n case \"<=\": return left <= right;\n case \">\": return left > right;\n case \">=\": return left >= right;\n case \"+\": return (left as number) + (right as number);\n case \"-\": return (left as number) - (right as number);\n case \"*\": return (left as number) * (right as number);\n case \"/\": return (left as number) / (right as number);\n case \"%\": return (left as number) % (right as number);\n case \"**\": return (left as number) ** (right as number);\n default:\n throw new Error(`Unsupported operator \"${String(node.operator)}\"`);\n }\n }\n case \"LogicalExpression\": {\n const left = evalNode(ctx, node.left as AstNode);\n switch (node.operator) {\n case \"&&\": return left && evalNode(ctx, node.right as AstNode);\n case \"||\": return left || evalNode(ctx, node.right as AstNode);\n case \"??\": return left ?? evalNode(ctx, node.right as AstNode);\n default:\n throw new Error(`Unsupported operator \"${String(node.operator)}\"`);\n }\n }\n case \"UnaryExpression\": {\n const argument = evalNode(ctx, node.argument as AstNode);\n switch (node.operator) {\n case \"!\": return !argument;\n case \"-\": return -(argument as number);\n case \"+\": return +(argument as number);\n case \"typeof\": return typeof argument;\n default:\n throw new Error(`Unsupported operator \"${String(node.operator)}\"`);\n }\n }\n case \"ConditionalExpression\":\n return evalNode(ctx, node.test as AstNode)\n ? evalNode(ctx, node.consequent as AstNode)\n : evalNode(ctx, node.alternate as AstNode);\n case \"AssignmentExpression\": {\n const target = node.left as AstNode;\n if (target.type !== \"Identifier\" || node.operator !== \"=\") {\n throw new Error(\"Only simple assignments are supported\");\n }\n const value = evalNode(ctx, node.right as AstNode);\n assign(ctx, target.name as string, value);\n return value;\n }\n case \"ArrayExpression\": {\n const values: unknown[] = [];\n for (const element of node.elements as Array<AstNode | null>) {\n if (!element) continue;\n if (element.type === \"SpreadElement\") {\n const spread = evalNode(ctx, element.argument as AstNode);\n if (Array.isArray(spread)) values.push(...spread);\n } else {\n values.push(evalNode(ctx, element));\n }\n }\n return values;\n }\n case \"ObjectExpression\": {\n const result: Record<string, unknown> = {};\n for (const property of node.properties as AstNode[]) {\n if (property.type === \"SpreadElement\") {\n const spread = evalNode(ctx, property.argument as AstNode);\n if (spread && typeof spread === \"object\") {\n for (const [key, value] of Object.entries(spread)) {\n result[String(guardProp(key))] = value;\n }\n }\n continue;\n }\n\n const keyNode = property.key as AstNode;\n const key = property.computed\n ? guardProp(evalNode(ctx, keyNode))\n : guardProp(\n keyNode.type === \"Identifier\" ? keyNode.name : keyNode.value\n );\n result[String(key)] = evalNode(ctx, property.value as AstNode);\n }\n return result;\n }\n default:\n throw new Error(`Unsupported syntax: ${node.type}`);\n }\n};\n\nconst SAFE_BUILTINS: Record<string, unknown> = {\n undefined,\n NaN,\n Infinity,\n Math,\n JSON,\n Number,\n String,\n Boolean,\n Array,\n Object,\n Date,\n parseInt,\n parseFloat,\n isNaN,\n isFinite,\n};\n\nexport function runSandboxed(\n code: string,\n globals: Record<string, unknown> = {}\n): unknown {\n const ast = parse(code, {\n ecmaVersion: \"latest\",\n allowReturnOutsideFunction: true,\n }) as unknown as AstNode;\n\n const ctx: Ctx = {\n steps: 0,\n scopes: [\n new Map(Object.entries({ ...SAFE_BUILTINS, ...globals })),\n new Map(),\n ],\n };\n\n const result = evalNode(ctx, ast);\n return result instanceof ReturnSignal ? result.value : undefined;\n}\n",
12
12
  "export interface DataSourceRequestOptions {\n headers?: Record<string, string>;\n}\n\nexport interface DataSourceServiceDefaults {\n credentials?: \"omit\" | \"same-origin\" | \"include\";\n headers?: Record<string, string>;\n}\n\nexport interface DataSourceService {\n fetchOptions(\n url: string,\n options?: DataSourceRequestOptions\n ): Promise<unknown[]>;\n}\n\nexport class FetchDataSourceService implements DataSourceService {\n private cache = new Map<string, Promise<unknown[]>>();\n\n constructor(private readonly defaults: DataSourceServiceDefaults = {}) {}\n\n fetchOptions(\n url: string,\n options?: DataSourceRequestOptions\n ): Promise<unknown[]> {\n const headers = { ...this.defaults.headers, ...options?.headers };\n const init: Record<string, unknown> = {};\n if (Object.keys(headers).length) init.headers = headers;\n if (this.defaults.credentials) init.credentials = this.defaults.credentials;\n\n const key = `${url}|${JSON.stringify(init)}`;\n let pending = this.cache.get(key);\n\n if (!pending) {\n pending = fetch(url, Object.keys(init).length ? (init as never) : undefined)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`Data source request failed (${response.status}): ${url}`);\n }\n return response.json();\n })\n .then((json: unknown) => (Array.isArray(json) ? json : []))\n .catch((error: unknown) => {\n this.cache.delete(key);\n throw error;\n });\n\n this.cache.set(key, pending);\n }\n\n return pending;\n }\n}\n",
13
13
  "export interface FileLike {\n name: string;\n type: string;\n size: number;\n arrayBuffer(): Promise<ArrayBuffer>;\n}\n\nexport interface UploadedFile {\n name: string;\n type: string;\n size: number;\n url: string;\n}\n\nexport interface FileUploadOptions {\n url?: string;\n headers?: Record<string, string>;\n}\n\nexport interface FileUploadService {\n upload(file: FileLike, options?: FileUploadOptions): Promise<UploadedFile>;\n remove?(file: UploadedFile, options?: FileUploadOptions): Promise<void>;\n}\n\nexport class Base64FileUploadService implements FileUploadService {\n async upload(file: FileLike): Promise<UploadedFile> {\n const encode = (globalThis as { btoa?: (raw: string) => string }).btoa;\n if (!encode) throw new Error(\"No base64 encoder available\");\n\n const bytes = new Uint8Array(await file.arrayBuffer());\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n\n return {\n name: file.name,\n type: file.type,\n size: file.size,\n url: `data:${file.type};base64,${encode(binary)}`,\n };\n }\n}\n\nexport interface UrlFileUploadDefaults {\n url?: string;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n fieldName?: string;\n fetch?: typeof fetch;\n}\n\nexport class UrlFileUploadService implements FileUploadService {\n constructor(private readonly defaults: UrlFileUploadDefaults = {}) {}\n\n private get fetchImplementation(): typeof fetch {\n return this.defaults.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n private resolveUrl(options?: FileUploadOptions): string {\n const url = options?.url ?? this.defaults.url;\n if (!url) {\n throw new Error(\n \"No upload URL configured — set it on the brick (uploadUrl) or on UrlFileUploadService\"\n );\n }\n return url;\n }\n\n private mergedHeaders(options?: FileUploadOptions): Record<string, string> {\n return { ...this.defaults.headers, ...options?.headers };\n }\n\n async upload(\n file: FileLike,\n options?: FileUploadOptions\n ): Promise<UploadedFile> {\n const url = this.resolveUrl(options);\n\n const blob =\n typeof Blob !== \"undefined\" && file instanceof Blob\n ? file\n : new Blob([await file.arrayBuffer()], { type: file.type });\n\n const body = new FormData();\n body.append(this.defaults.fieldName ?? \"file\", blob, file.name);\n\n const response = await this.fetchImplementation(url, {\n method: \"POST\",\n body,\n headers: this.mergedHeaders(options),\n credentials: this.defaults.credentials,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed (${response.status})`);\n }\n\n const payload = (await response.json().catch(() => ({}))) as Record<\n string,\n unknown\n >;\n const uploadedUrl =\n payload.url ?? payload.path ?? payload.location ?? payload.href;\n\n return {\n name: file.name,\n type: file.type,\n size: file.size,\n url: typeof uploadedUrl === \"string\" ? uploadedUrl : \"\",\n };\n }\n\n async remove(file: UploadedFile, options?: FileUploadOptions): Promise<void> {\n if (!file.url) return;\n\n const target = /^https?:\\/\\//.test(file.url)\n ? file.url\n : this.resolveUrl(options);\n\n const response = await this.fetchImplementation(target, {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n ...this.mergedHeaders(options),\n },\n credentials: this.defaults.credentials,\n body: JSON.stringify({ url: file.url, name: file.name }),\n });\n\n if (!response.ok) {\n throw new Error(`Delete failed (${response.status})`);\n }\n }\n}\n",
14
- "import {\n SandboxJsRunnerService,\n type JsRunnerService,\n} from \"./js_runner_service\";\nimport {\n FetchDataSourceService,\n type DataSourceService,\n} from \"./data_source_service\";\nimport {\n Base64FileUploadService,\n type FileUploadService,\n} from \"./file_upload_service\";\n\nexport interface Services {\n jsRunnerService: JsRunnerService;\n dataSourceService: DataSourceService;\n fileUploadService: FileUploadService;\n}\n\nconst GLOBAL_KEY = Symbol.for(\"formkrafter.core.services\");\nconst globalStore = globalThis as unknown as Record<symbol, Services | undefined>;\n\nconst services: Services = (globalStore[GLOBAL_KEY] ??= {\n jsRunnerService: new SandboxJsRunnerService(),\n dataSourceService: new FetchDataSourceService(),\n fileUploadService: new Base64FileUploadService(),\n});\n\nexport { services };\n",
14
+ "import type { BrickSpec } from \"../utils/brick-spec\";\n\nexport interface SpecSourceService {\n fetchSpec(ref: string): Promise<BrickSpec>;\n}\n\nexport interface FetchSpecSourceDefaults {\n baseUrl?: string;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n fetch?: typeof fetch;\n}\n\nexport class FetchSpecSourceService implements SpecSourceService {\n private cache = new Map<string, Promise<BrickSpec>>();\n\n constructor(private readonly defaults: FetchSpecSourceDefaults = {}) {}\n\n private resolveUrl(ref: string): string {\n if (/^https?:\\/\\//.test(ref) || !this.defaults.baseUrl) return ref;\n return `${this.defaults.baseUrl.replace(/\\/$/, \"\")}/${ref.replace(/^\\//, \"\")}`;\n }\n\n fetchSpec(ref: string): Promise<BrickSpec> {\n const url = this.resolveUrl(ref);\n\n let pending = this.cache.get(url);\n if (!pending) {\n const fetchImplementation =\n this.defaults.fetch ?? globalThis.fetch.bind(globalThis);\n\n pending = fetchImplementation(url, {\n headers: this.defaults.headers,\n credentials: this.defaults.credentials,\n }).then(async (response) => {\n if (!response.ok) {\n throw new Error(`Failed to load spec \"${ref}\" (${response.status})`);\n }\n return (await response.json()) as BrickSpec;\n });\n\n pending.catch(() => this.cache.delete(url));\n this.cache.set(url, pending);\n }\n\n return pending;\n }\n}\n",
15
+ "export interface OptionSourceService {\n fetchOptions(ref: string): Promise<unknown>;\n}\n\nexport interface FetchOptionSourceDefaults {\n baseUrl?: string;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n fetch?: typeof fetch;\n}\n\nexport class FetchOptionSourceService implements OptionSourceService {\n private cache = new Map<string, Promise<unknown>>();\n\n constructor(private readonly defaults: FetchOptionSourceDefaults = {}) {}\n\n private resolveUrl(ref: string): string {\n if (/^https?:\\/\\//.test(ref) || !this.defaults.baseUrl) return ref;\n return `${this.defaults.baseUrl.replace(/\\/$/, \"\")}/${ref.replace(/^\\//, \"\")}`;\n }\n\n fetchOptions(ref: string): Promise<unknown> {\n const url = this.resolveUrl(ref);\n\n let pending = this.cache.get(url);\n if (!pending) {\n const fetchImplementation =\n this.defaults.fetch ?? globalThis.fetch.bind(globalThis);\n\n pending = fetchImplementation(url, {\n headers: this.defaults.headers,\n credentials: this.defaults.credentials,\n }).then(async (response) => {\n if (!response.ok) {\n throw new Error(`Failed to load options \"${ref}\" (${response.status})`);\n }\n return (await response.json()) as unknown;\n });\n\n pending.catch(() => this.cache.delete(url));\n this.cache.set(url, pending);\n }\n\n return pending;\n }\n}\n",
16
+ "import {\n SandboxJsRunnerService,\n type JsRunnerService,\n} from \"./js_runner_service\";\nimport {\n FetchDataSourceService,\n type DataSourceService,\n} from \"./data_source_service\";\nimport {\n Base64FileUploadService,\n type FileUploadService,\n} from \"./file_upload_service\";\nimport {\n FetchSpecSourceService,\n type SpecSourceService,\n} from \"./spec_source_service\";\nimport {\n FetchOptionSourceService,\n type OptionSourceService,\n} from \"./option_source_service\";\n\nexport interface Services {\n jsRunnerService: JsRunnerService;\n dataSourceService: DataSourceService;\n fileUploadService: FileUploadService;\n specSourceService: SpecSourceService;\n optionSourceService: OptionSourceService;\n}\n\nconst GLOBAL_KEY = Symbol.for(\"formkrafter.core.services\");\nconst globalStore = globalThis as unknown as Record<symbol, Services | undefined>;\n\nconst services: Services = (globalStore[GLOBAL_KEY] ??= {\n jsRunnerService: new SandboxJsRunnerService(),\n dataSourceService: new FetchDataSourceService(),\n fileUploadService: new Base64FileUploadService(),\n specSourceService: new FetchSpecSourceService(),\n optionSourceService: new FetchOptionSourceService(),\n});\n\nservices.specSourceService ??= new FetchSpecSourceService();\nservices.optionSourceService ??= new FetchOptionSourceService();\n\nexport { services };\n",
15
17
  "import { Ajv, type ErrorObject, type ValidateFunction } from \"ajv\";\nimport ajvErrors from \"ajv-errors\";\nimport addFormats from \"ajv-formats\";\nimport type { BrickSpec } from \"../utils/brick-spec\";\nimport { buildValidationSchema, iterateSchemaBricks } from \"../utils/brick-spec\";\nimport { resolveLocalizedText } from \"../utils/localized-text\";\nimport { defaultValidationMessage } from \"./default-messages\";\nimport { evalBrickCode, getAffectedProperties } from \"../brick/utils\";\n\nconst ajv = new Ajv({ allErrors: true });\naddFormats(ajv, [\"email\", \"uri\"]);\najvErrors(ajv);\n\nconst validatorCache = new WeakMap<BrickSpec, Map<string, ValidateFunction>>();\n\nexport type Validator =\n | \"required\"\n | \"minLength\"\n | \"maxLength\"\n | \"min\"\n | \"max\"\n | \"pattern\"\n | \"minItems\"\n | \"maxItems\"\n | \"email\"\n | \"url\"\n | \"custom\";\n\nexport type ValidationResult = {\n valid: boolean;\n errors: Record<string, string>;\n};\n\nconst compiledValidator = (\n brickSpec: BrickSpec,\n locale?: string\n): ValidateFunction | undefined => {\n let byLocale = validatorCache.get(brickSpec);\n if (!byLocale) {\n byLocale = new Map();\n validatorCache.set(brickSpec, byLocale);\n }\n\n const cacheKey = locale ?? \"\";\n let validate = byLocale.get(cacheKey);\n\n if (!validate) {\n const schema = buildValidationSchema(brickSpec, locale);\n if (!schema) return undefined;\n\n try {\n validate = ajv.compile(schema);\n } catch {\n return undefined;\n }\n byLocale.set(cacheKey, validate);\n }\n\n return validate;\n};\n\nconst customErrors = (\n brickSpec: BrickSpec,\n data: unknown,\n locale?: string\n): Record<string, string> => {\n const errors: Record<string, string> = {};\n const dataMap = (data ?? {}) as Record<string, unknown>;\n\n for (const brick of iterateSchemaBricks(brickSpec)) {\n const key = brick.configs?.key;\n if (!key) continue;\n\n for (const validation of brick.validations ?? []) {\n if (validation.validator !== \"custom\" || !validation.customValidator) {\n continue;\n }\n\n const result = evalBrickCode(\n `const value = dataMap?.[${JSON.stringify(key)}];\\n${validation.customValidator}`,\n dataMap\n );\n\n if (result === true || result === undefined || result === null) continue;\n if (key in errors) continue;\n\n if (typeof result === \"string\") errors[key] = result;\n else if (result instanceof Error) errors[key] = result.message;\n else {\n const resolved = resolveLocalizedText(validation.message, locale);\n errors[key] =\n typeof resolved === \"string\"\n ? resolved\n : defaultValidationMessage(\"custom\", locale);\n }\n }\n }\n\n return errors;\n};\n\nconst keyOfError = (error: ErrorObject): string | undefined => {\n if (error.keyword === \"required\") {\n return (error.params as { missingProperty?: string }).missingProperty;\n }\n\n if (error.keyword === \"errorMessage\") {\n const inner = (error.params as { errors?: ErrorObject[] }).errors?.[0];\n return inner ? keyOfError(inner) : undefined;\n }\n\n return error.instancePath.split(\"/\").filter(Boolean)[0];\n};\n\nconst hiddenKeys = (\n brickSpec: BrickSpec,\n dataMap: Record<string, unknown> | undefined\n): Set<string> => {\n const hidden = new Set<string>();\n\n const walk = (brick: BrickSpec, parentHidden: boolean) => {\n const isHidden =\n parentHidden ||\n (brick.rules?.length\n ? getAffectedProperties(brick.rules, dataMap).hidden === true\n : false);\n\n const key = brick.configs?.key;\n if (isHidden && key) hidden.add(key);\n\n if (brick.type === \"collection\") return;\n for (const child of brick.children ?? []) walk(child, isHidden);\n };\n\n walk(brickSpec, false);\n return hidden;\n};\n\nexport const validateBrickSpecDataDetailed = (\n brickSpec: BrickSpec,\n data: unknown,\n locale?: string\n): ValidationResult => {\n const errors: Record<string, string> = {};\n const validate = compiledValidator(brickSpec, locale);\n\n if (validate && !validate(data)) {\n for (const error of validate.errors ?? []) {\n const key = keyOfError(error);\n if (key && !(key in errors) && error.message) {\n errors[key] = error.message;\n }\n }\n }\n\n for (const [key, message] of Object.entries(customErrors(brickSpec, data, locale))) {\n if (!(key in errors)) errors[key] = message;\n }\n\n const dataMap =\n typeof data === \"object\" && data !== null\n ? (data as Record<string, unknown>)\n : undefined;\n for (const key of hiddenKeys(brickSpec, dataMap)) {\n delete errors[key];\n }\n\n return { valid: Object.keys(errors).length === 0, errors };\n};\n\nexport const validateBrickSpecData = (\n brickSpec: BrickSpec,\n data: unknown,\n locale?: string\n): boolean => validateBrickSpecDataDetailed(brickSpec, data, locale).valid;\n\nconst stripEmpty = (data: unknown): Record<string, unknown> => {\n if (typeof data !== \"object\" || data === null) return {};\n\n return Object.fromEntries(\n Object.entries(data as Record<string, unknown>).filter(\n ([, value]) => value !== \"\" && value !== null && value !== undefined\n )\n );\n};\n\nconst rowSpecCache = new WeakMap<BrickSpec, BrickSpec>();\n\nconst rowSpecOf = (collection: BrickSpec): BrickSpec => {\n let rowSpec = rowSpecCache.get(collection);\n\n if (!rowSpec) {\n rowSpec = {\n type: \"panel\",\n id: \"collection-row\",\n name: \"Row\",\n configs: { key: `${collection.configs?.key ?? \"collection\"}_row` },\n children: collection.children ?? [],\n };\n rowSpecCache.set(collection, rowSpec);\n }\n\n return rowSpec;\n};\n\nexport const validateFormData = (\n brickSpec: BrickSpec,\n data: unknown,\n locale?: string\n): ValidationResult => {\n const present = stripEmpty(data);\n const errors = {\n ...validateBrickSpecDataDetailed(brickSpec, present, locale).errors,\n };\n\n for (const brick of iterateSchemaBricks(brickSpec)) {\n if (brick.type !== \"collection\") continue;\n\n const key = brick.configs?.key;\n if (!key) continue;\n\n const rows = present[key];\n if (!Array.isArray(rows)) continue;\n\n const rowSpec = rowSpecOf(brick);\n rows.forEach((row, index) => {\n const rowResult = validateFormData(rowSpec, row, locale);\n for (const [field, message] of Object.entries(rowResult.errors)) {\n const prefixed = `${key}[${index}].${field}`;\n if (!(prefixed in errors)) errors[prefixed] = message;\n }\n });\n }\n\n return { valid: Object.keys(errors).length === 0, errors };\n};\n",
16
18
  "import { type Options, parse } from \"acorn\";\nimport type { JsRunnerService } from \"./js_runner_service\";\n\nexport class UnsafeEvalJsRunnerService implements JsRunnerService {\n validateJs(\n js: string,\n options: Options = { ecmaVersion: \"latest\", allowReturnOutsideFunction: true }\n ): { valide: boolean; error?: Error } {\n try {\n parse(js, options);\n return { valide: true };\n } catch (error) {\n return {\n valide: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n eval(js: string, scope: Record<string, unknown> = {}): unknown {\n const prelude = Object.entries(scope)\n .map(([name, value]) => `const ${name} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const fn = `(() => {${prelude}\\n${js}})();`;\n\n const validation = this.validateJs(fn, { ecmaVersion: \"latest\" });\n if (!validation.valide) throw validation.error;\n\n return eval(fn);\n }\n}\n",
17
19
  "import type { BrickSpec } from \"../utils/brick-spec\";\n\nexport function pointerFromPath(path: string): string {\n return path\n .split(\".\")\n .slice(1)\n .map((segment) => `/children/${segment}`)\n .join(\"\");\n}\n\nexport function pointerOfUid(spec: BrickSpec, uid: string): string | undefined {\n if (spec.configs?.uid === uid) return \"\";\n\n for (const [index, child] of (spec.children ?? []).entries()) {\n const childPointer = pointerOfUid(child, uid);\n if (childPointer !== undefined) return `/children/${index}${childPointer}`;\n }\n\n return undefined;\n}\n\nexport function getBrickAt(spec: BrickSpec, path: string): BrickSpec | undefined {\n let current: BrickSpec | undefined = spec;\n\n for (const segment of path.split(\".\").slice(1)) {\n current = current?.children?.[Number(segment)];\n }\n\n return current;\n}\n",
18
20
  "import * as fastJsonPatchModule from \"fast-json-patch\";\n\ntype FastJsonPatchApi = {\n applyPatch: typeof fastJsonPatchModule.applyPatch;\n};\n\nconst fastJsonPatch: FastJsonPatchApi =\n (fastJsonPatchModule as unknown as { default?: FastJsonPatchApi }).default ??\n fastJsonPatchModule;\n\nexport const applyPatch = fastJsonPatch.applyPatch;\nexport type { Operation } from \"fast-json-patch\";\n",
19
21
  "import { applyPatch, type Operation } from \"../utils/fast-json-patch\";\nimport type { BrickSpec } from \"../utils/brick-spec\";\nimport type { BrickBaseConfigs } from \"../utils/common-brick-props\";\nimport type { BrickStyles } from \"../utils/brick-styles\";\nimport type { Validation } from \"../validators/validation\";\nimport type { Rule } from \"../rules/rule\";\nimport { getBrickAt, pointerFromPath, pointerOfUid } from \"./pointer\";\n\nexport type SpecUpdate = {\n spec: BrickSpec;\n patches: Operation[];\n inverse: Operation[];\n};\n\nconst apply = (\n spec: BrickSpec,\n patches: Operation[],\n inverse: Operation[]\n): SpecUpdate => ({\n spec: applyPatch(spec, patches, true, false).newDocument,\n patches,\n inverse,\n});\n\nconst requireBrickAt = (spec: BrickSpec, path: string): BrickSpec => {\n const brick = getBrickAt(spec, path);\n if (!brick) throw new Error(`No brick at path \"${path}\"`);\n return brick;\n};\n\nconst requireBrickByUid = (\n spec: BrickSpec,\n uid: string\n): { pointer: string; brick: BrickSpec } => {\n const pointer = pointerOfUid(spec, uid);\n if (pointer === undefined) throw new Error(`No brick with uid \"${uid}\"`);\n\n let brick = spec;\n for (const segment of pointer.split(\"/children/\").slice(1)) {\n brick = brick.children![Number(segment)];\n }\n\n return { pointer, brick };\n};\n\nconst toJsonValue = <T>(value: T): T => JSON.parse(JSON.stringify(value));\n\nexport function addBrick(\n spec: BrickSpec,\n brick: BrickSpec,\n parentPath: string,\n index?: number\n): SpecUpdate {\n const parent = requireBrickAt(spec, parentPath);\n const parentPointer = pointerFromPath(parentPath);\n const value = toJsonValue(brick);\n\n if (!parent.children) {\n const pointer = `${parentPointer}/children`;\n return apply(\n spec,\n [{ op: \"add\", path: pointer, value: [value] }],\n [{ op: \"remove\", path: pointer }]\n );\n }\n\n const position = Math.min(index ?? parent.children.length, parent.children.length);\n const pointer = `${parentPointer}/children/${position}`;\n\n return apply(\n spec,\n [{ op: \"add\", path: pointer, value }],\n [{ op: \"remove\", path: pointer }]\n );\n}\n\nexport function removeBrick(spec: BrickSpec, path: string): SpecUpdate {\n if (path === \"0\") throw new Error(\"Cannot remove the root brick\");\n\n const brick = requireBrickAt(spec, path);\n const pointer = pointerFromPath(path);\n\n return apply(\n spec,\n [{ op: \"remove\", path: pointer }],\n [{ op: \"add\", path: pointer, value: brick }]\n );\n}\n\nexport function moveBrick(spec: BrickSpec, from: string, to: string): SpecUpdate {\n if (from === \"0\" || to === \"0\") throw new Error(\"Cannot move the root brick\");\n\n const brick = requireBrickAt(spec, from);\n\n const fromSegments = from.split(\".\").map(Number);\n const toSegments = to.split(\".\").map(Number);\n const parentLength = fromSegments.length - 1;\n const fromIndex = fromSegments[parentLength];\n\n const sharesFromParent =\n toSegments.length > parentLength &&\n fromSegments.slice(0, parentLength).every((segment, i) => segment === toSegments[i]);\n\n const adjusted = [...toSegments];\n if (sharesFromParent) {\n if (adjusted[parentLength] === fromIndex && adjusted.length > fromSegments.length) {\n throw new Error(`Cannot move a brick into its own subtree (\"${from}\" → \"${to}\")`);\n }\n if (adjusted[parentLength] > fromIndex) adjusted[parentLength] -= 1;\n }\n\n const fromPointer = pointerFromPath(from);\n const toPointer = pointerFromPath(adjusted.join(\".\"));\n\n return apply(\n spec,\n [\n { op: \"remove\", path: fromPointer },\n { op: \"add\", path: toPointer, value: brick },\n ],\n [\n { op: \"remove\", path: toPointer },\n { op: \"add\", path: fromPointer, value: brick },\n ]\n );\n}\n\nconst withFreshUids = (brick: BrickSpec): BrickSpec => ({\n ...brick,\n ...(brick.configs\n ? { configs: { ...brick.configs, uid: crypto.randomUUID() } }\n : {}),\n ...(brick.children ? { children: brick.children.map(withFreshUids) } : {}),\n});\n\nexport function duplicateBrick(spec: BrickSpec, path: string): SpecUpdate {\n if (path === \"0\") throw new Error(\"Cannot duplicate the root brick\");\n\n const brick = requireBrickAt(spec, path);\n const segments = path.split(\".\");\n const nextIndex = Number(segments[segments.length - 1]) + 1;\n const pointer = pointerFromPath(\n [...segments.slice(0, -1), String(nextIndex)].join(\".\")\n );\n\n const copy = withFreshUids(toJsonValue(brick));\n\n return apply(\n spec,\n [{ op: \"add\", path: pointer, value: copy }],\n [{ op: \"remove\", path: pointer }]\n );\n}\n\nconst setBrickSection = (\n spec: BrickSpec,\n brickPointer: string,\n section: \"configs\" | \"styles\" | \"validations\" | \"rules\",\n value: unknown,\n previous: unknown\n): SpecUpdate => {\n const pointer = `${brickPointer}/${section}`;\n\n if (previous === undefined) {\n return apply(\n spec,\n [{ op: \"add\", path: pointer, value }],\n [{ op: \"remove\", path: pointer }]\n );\n }\n\n return apply(\n spec,\n [{ op: \"replace\", path: pointer, value }],\n [{ op: \"replace\", path: pointer, value: previous }]\n );\n};\n\nexport function updateBrickConfigs(\n spec: BrickSpec,\n uid: string,\n configs: BrickBaseConfigs & Record<string, unknown>\n): SpecUpdate {\n const { pointer, brick } = requireBrickByUid(spec, uid);\n const merged = { ...brick.configs, ...configs };\n\n return setBrickSection(spec, pointer, \"configs\", merged, brick.configs);\n}\n\nexport function updateBrickStyles(\n spec: BrickSpec,\n uid: string,\n styles: BrickStyles<string>\n): SpecUpdate {\n const { pointer, brick } = requireBrickByUid(spec, uid);\n const merged = { ...brick.styles, ...styles };\n\n return setBrickSection(spec, pointer, \"styles\", merged, brick.styles);\n}\n\nexport function updateBrickValidations(\n spec: BrickSpec,\n uid: string,\n validations: Validation[]\n): SpecUpdate {\n const { pointer, brick } = requireBrickByUid(spec, uid);\n\n return setBrickSection(spec, pointer, \"validations\", validations, brick.validations);\n}\n\nexport function updateBrickRules(\n spec: BrickSpec,\n uid: string,\n rules: Rule[]\n): SpecUpdate {\n const { pointer, brick } = requireBrickByUid(spec, uid);\n\n return setBrickSection(spec, pointer, \"rules\", rules, brick.rules);\n}\n",
20
22
  "import { applyPatch, type Operation } from \"../utils/fast-json-patch\";\nimport type { BrickSpec } from \"../utils/brick-spec\";\nimport type { SpecUpdate } from \"./ops\";\n\ntype HistoryEntry = {\n patches: Operation[];\n inverse: Operation[];\n};\n\nexport class SpecHistory {\n private past: HistoryEntry[] = [];\n private future: HistoryEntry[] = [];\n\n record(update: SpecUpdate): void {\n this.past.push({ patches: update.patches, inverse: update.inverse });\n this.future = [];\n }\n\n get canUndo(): boolean {\n return this.past.length > 0;\n }\n\n get canRedo(): boolean {\n return this.future.length > 0;\n }\n\n undo(spec: BrickSpec): BrickSpec | undefined {\n const entry = this.past.pop();\n if (!entry) return undefined;\n\n this.future.push(entry);\n\n return applyPatch(spec, entry.inverse, true, false).newDocument;\n }\n\n redo(spec: BrickSpec): BrickSpec | undefined {\n const entry = this.future.pop();\n if (!entry) return undefined;\n\n this.past.push(entry);\n\n return applyPatch(spec, entry.patches, true, false).newDocument;\n }\n\n clear(): void {\n this.past = [];\n this.future = [];\n }\n}\n",
21
- "import type { BrickSpec } from \"../utils/brick-spec\";\nimport type { Validation } from \"../validators/validation\";\nimport type { Rule } from \"../rules/rule\";\n\nexport interface FormioComponent {\n type?: string;\n key?: string;\n label?: string;\n title?: string;\n placeholder?: string;\n description?: string;\n tooltip?: string;\n defaultValue?: unknown;\n disabled?: boolean;\n hidden?: boolean;\n multiple?: boolean;\n prefix?: string;\n suffix?: string;\n html?: string;\n content?: string;\n legend?: string;\n input?: boolean;\n tableView?: boolean;\n components?: FormioComponent[];\n columns?: Array<{ components?: FormioComponent[]; width?: number }>;\n values?: Array<{ label?: string; value?: string }>;\n data?: {\n values?: Array<{ label?: string; value?: string }>;\n json?: Array<Record<string, unknown>>;\n url?: string;\n };\n dataSrc?: string;\n valueProperty?: string;\n template?: string;\n searchField?: string;\n storage?: string;\n url?: string;\n filePattern?: string;\n logic?: Array<{\n name?: string;\n trigger?: { type?: string; javascript?: string; simple?: unknown };\n actions?: Array<{\n name?: string;\n type?: string;\n state?: boolean;\n property?: { value?: string; type?: string };\n }>;\n }>;\n validate?: {\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n min?: number;\n max?: number;\n step?: number | string;\n pattern?: string;\n custom?: string;\n customMessage?: string;\n };\n conditional?: {\n show?: boolean | string;\n when?: string | null;\n eq?: unknown;\n };\n customConditional?: string;\n enableTime?: boolean;\n enableDate?: boolean;\n [extra: string]: unknown;\n}\n\nexport interface FormioForm {\n display?: string;\n title?: string;\n name?: string;\n components?: FormioComponent[];\n [extra: string]: unknown;\n}\n\nexport interface FormioConversionResult {\n spec: BrickSpec;\n warnings: string[];\n}\n\ntype Converter = {\n nextUid: () => string;\n warn: (message: string) => void;\n uploadUrls: Map<string, number>;\n};\n\nconst INPUT_TYPE_MAP: Record<\n string,\n { id: string; dataType: BrickSpec[\"dataType\"]; name: string }\n> = {\n textfield: { id: \"text\", dataType: \"string\", name: \"Text\" },\n textarea: { id: \"textarea\", dataType: \"string\", name: \"Text area\" },\n number: { id: \"number\", dataType: \"number\", name: \"Number\" },\n currency: { id: \"number\", dataType: \"number\", name: \"Currency\" },\n password: { id: \"password\", dataType: \"string\", name: \"Password\" },\n email: { id: \"email\", dataType: \"string\", name: \"Email\" },\n url: { id: \"url\", dataType: \"string\", name: \"URL\" },\n phoneNumber: { id: \"phone\", dataType: \"string\", name: \"Phone\" },\n day: { id: \"date\", dataType: \"string\", name: \"Date\" },\n time: { id: \"time\", dataType: \"string\", name: \"Time\" },\n checkbox: { id: \"checkbox\", dataType: \"boolean\", name: \"Checkbox\" },\n hidden: { id: \"hidden\", dataType: \"string\", name: \"Hidden\" },\n tags: { id: \"tags\", dataType: \"array\", name: \"Tags\" },\n radio: { id: \"radio\", dataType: \"string\", name: \"Radio\" },\n signature: { id: \"signature\", dataType: \"string\", name: \"Signature\" },\n address: { id: \"address\", dataType: \"string\", name: \"Address\" },\n};\n\nexport function convertFormioForm(form: FormioForm): FormioConversionResult {\n const warnings: string[] = [];\n let counter = 0;\n const ctx: Converter = {\n nextUid: () => `fio-${++counter}`,\n warn: (message) => warnings.push(message),\n uploadUrls: new Map(),\n };\n\n let children = convertComponents(form.components ?? [], ctx);\n\n if (form.display === \"wizard\") {\n children = [\n {\n type: \"panel\",\n id: \"stepper\",\n name: \"Wizard\",\n configs: {\n uid: ctx.nextUid(),\n key: \"steps\",\n validateSteps: true,\n allowStepClick: true,\n showSubmit: true,\n },\n children,\n },\n ];\n }\n\n const spec: BrickSpec = {\n type: \"panel\",\n id: \"column\",\n name: form.title ?? \"Form\",\n configs: { uid: ctx.nextUid(), key: form.name ?? \"form\" },\n children,\n };\n\n for (const [url, count] of ctx.uploadUrls) {\n warnings.push(\n `${count} file component(s) store uploads at \"${url}\" (kept as the uploadUrl config) — configure services.fileUploadService with UrlFileUploadService to upload there`\n );\n }\n\n return { spec, warnings };\n}\n\nfunction convertComponents(\n components: FormioComponent[],\n ctx: Converter\n): BrickSpec[] {\n const bricks: BrickSpec[] = [];\n for (const component of components) {\n bricks.push(...convertComponent(component, ctx));\n }\n return bricks;\n}\n\nfunction convertComponent(\n component: FormioComponent,\n ctx: Converter\n): BrickSpec[] {\n const type = component.type ?? \"textfield\";\n\n if (type === \"button\") {\n ctx.warn(\n `button \"${component.key ?? component.label ?? \"?\"}\" skipped — FormKrafter renders its own submit action`\n );\n return [];\n }\n\n if (type === \"content\" || type === \"htmlelement\") {\n return [\n withCommon(component, ctx, {\n type: \"output\",\n dataType: \"void\",\n id: \"content\",\n name: \"Content\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n content: String(component.html ?? component.content ?? \"\"),\n },\n }),\n ];\n }\n\n if (type === \"panel\" || type === \"fieldset\" || type === \"well\") {\n return [\n withCommon(component, ctx, {\n type: \"panel\",\n id: \"group\",\n name: component.title ?? component.legend ?? \"Group\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n label: component.title ?? component.legend ?? component.label,\n },\n children: convertComponents(component.components ?? [], ctx),\n }),\n ];\n }\n\n if (type === \"container\") {\n ctx.warn(\n `container \"${component.key ?? \"?\"}\" flattened — FormKrafter stores data flat outside collections`\n );\n return [\n {\n type: \"panel\",\n id: \"group\",\n name: \"Group\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n label: component.label,\n },\n children: convertComponents(component.components ?? [], ctx),\n },\n ];\n }\n\n if (type === \"columns\") {\n return [\n {\n type: \"panel\",\n id: \"row\",\n name: \"Row\",\n configs: { uid: ctx.nextUid(), key: component.key ?? ctx.nextUid() },\n children: (component.columns ?? []).map((column) => ({\n type: \"panel\" as const,\n id: \"column\",\n name: \"Column\",\n configs: { uid: ctx.nextUid(), key: ctx.nextUid() },\n children: convertComponents(column.components ?? [], ctx),\n })),\n },\n ];\n }\n\n if (type === \"tabs\") {\n return [\n {\n type: \"panel\",\n id: \"tabs\",\n name: \"Tabs\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n validateTabs: false,\n },\n children: (component.components ?? []).map((tab) => ({\n type: \"panel\" as const,\n id: \"group\",\n name: tab.label ?? \"Tab\",\n configs: {\n uid: ctx.nextUid(),\n key: tab.key ?? ctx.nextUid(),\n label: tab.label,\n },\n children: convertComponents(tab.components ?? [], ctx),\n })),\n },\n ];\n }\n\n if (type === \"datagrid\" || type === \"editgrid\") {\n if (type === \"editgrid\") {\n ctx.warn(\n `editgrid \"${component.key ?? \"?\"}\" converted to a data-grid — row templates are not preserved`\n );\n }\n return [\n withCommon(component, ctx, {\n type: \"collection\",\n dataType: \"array\",\n id: \"data-grid\",\n name: \"Data grid\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n label: component.label,\n },\n children: convertComponents(component.components ?? [], ctx),\n }),\n ];\n }\n\n if (type === \"datetime\") {\n const dateOnly = component.enableTime === false;\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: \"string\",\n id: dateOnly ? \"date\" : \"datetime\",\n name: dateOnly ? \"Date\" : \"Date & time\",\n configs: baseConfigs(component, ctx),\n }),\n ];\n }\n\n if (type === \"select\") {\n return [convertSelect(component, ctx)];\n }\n\n if (type === \"selectboxes\") {\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: \"array\",\n id: \"select-boxes\",\n name: \"Select boxes\",\n configs: {\n ...baseConfigs(component, ctx),\n optionsSource: \"static\",\n options: staticOptions(component.values),\n },\n }),\n ];\n }\n\n if (type === \"radio\") {\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: \"string\",\n id: \"radio\",\n name: \"Radio\",\n configs: {\n ...baseConfigs(component, ctx),\n optionsSource: \"static\",\n options: staticOptions(component.values),\n },\n }),\n ];\n }\n\n if (type === \"file\") {\n const configs = baseConfigs(component, ctx);\n if (component.filePattern && component.filePattern !== \"*\") {\n configs.accept = component.filePattern;\n }\n configs.multiple = component.multiple === true;\n if (component.storage === \"url\" && component.url) {\n configs.uploadUrl = component.url;\n ctx.uploadUrls.set(\n component.url,\n (ctx.uploadUrls.get(component.url) ?? 0) + 1\n );\n }\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: component.multiple ? \"array\" : \"object\",\n id: \"file\",\n name: \"File\",\n configs,\n }),\n ];\n }\n\n const mapped = INPUT_TYPE_MAP[type];\n if (mapped) {\n if (type === \"day\") {\n ctx.warn(\n `day \"${component.key ?? \"?\"}\" approximated with a date input`\n );\n }\n if (type === \"currency\") {\n ctx.warn(\n `currency \"${component.key ?? \"?\"}\" converted to a number with a prefix`\n );\n }\n const configs = baseConfigs(component, ctx);\n if (type === \"currency\" && !configs.prefix) {\n configs.prefix = String(component.currency ?? \"$\");\n }\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: mapped.dataType,\n id: mapped.id,\n name: mapped.name,\n configs,\n }),\n ];\n }\n\n ctx.warn(\n `unsupported component type \"${type}\" (key \"${component.key ?? \"?\"}\") skipped`\n );\n return [];\n}\n\nfunction convertSelect(component: FormioComponent, ctx: Converter): BrickSpec {\n const multiple = component.multiple === true;\n const configs = baseConfigs(component, ctx);\n\n if (component.dataSrc === \"url\" && component.data?.url) {\n configs.optionsSource = \"remote\";\n configs.optionsUrl = component.data.url;\n if (component.valueProperty) configs.valueKey = component.valueProperty;\n const templateKey = labelKeyFromTemplate(component.template);\n if (templateKey) configs.labelKey = templateKey;\n if (component.searchField) configs.searchParam = component.searchField;\n } else if (component.dataSrc === \"json\" && Array.isArray(component.data?.json)) {\n configs.optionsSource = \"static\";\n configs.options = jsonOptions(component, ctx);\n } else {\n if (component.dataSrc && ![\"values\", \"json\", \"\"].includes(component.dataSrc)) {\n ctx.warn(\n `select \"${component.key ?? \"?\"}\" uses dataSrc \"${component.dataSrc}\" — converted to static options`\n );\n }\n configs.optionsSource = \"static\";\n configs.options = staticOptions(component.data?.values ?? component.values);\n }\n\n return withCommon(component, ctx, {\n type: \"input\",\n dataType: multiple ? \"array\" : \"string\",\n id: multiple ? \"multi-select\" : \"select\",\n name: multiple ? \"Multi select\" : \"Select\",\n configs,\n });\n}\n\nfunction jsonOptions(\n component: FormioComponent,\n ctx: Converter\n): Array<{ label: string; value: string }> {\n const items = component.data?.json ?? [];\n const labelKey = labelKeyFromTemplate(component.template) ?? \"label\";\n let valueKey = component.valueProperty;\n if (!valueKey) {\n const first = items[0] ?? {};\n valueKey = \"value\" in first ? \"value\" : labelKey;\n if (valueKey === labelKey) {\n ctx.warn(\n `select \"${component.key ?? \"?\"}\" has no valueProperty — option labels are used as values`\n );\n }\n }\n return items.map((item) => ({\n label: String(item[labelKey] ?? item[valueKey!] ?? \"\"),\n value: String(item[valueKey!] ?? item[labelKey] ?? \"\"),\n }));\n}\n\nfunction labelKeyFromTemplate(template?: string): string | undefined {\n if (!template) return undefined;\n const match = /item\\.([a-zA-Z0-9_.]+)/.exec(template);\n return match?.[1];\n}\n\nfunction staticOptions(\n values?: Array<{ label?: string; value?: string }>\n): Array<{ label: string; value: string }> {\n return (values ?? []).map((option) => ({\n label: String(option.label ?? option.value ?? \"\"),\n value: String(option.value ?? option.label ?? \"\"),\n }));\n}\n\nfunction baseConfigs(\n component: FormioComponent,\n ctx: Converter\n): Record<string, unknown> & { uid: string; key: string } {\n const configs: Record<string, unknown> & { uid: string; key: string } = {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n };\n if (component.label) configs.label = component.label;\n if (component.placeholder) configs.placeholder = component.placeholder;\n if (component.description) configs.description = component.description;\n if (component.defaultValue !== undefined && component.defaultValue !== \"\") {\n configs.defaultValue = component.defaultValue;\n }\n if (component.validate?.step != null && component.validate.step !== \"\") {\n configs.step = component.validate.step;\n }\n if (component.disabled) configs.disabled = true;\n if (component.prefix) configs.prefix = component.prefix;\n if (component.suffix) configs.suffix = component.suffix;\n return configs;\n}\n\nfunction withCommon(\n component: FormioComponent,\n ctx: Converter,\n brick: BrickSpec\n): BrickSpec {\n const validations = convertValidations(component, ctx);\n if (validations.length) brick.validations = validations;\n\n const conditionalRules = convertConditional(component, ctx);\n const rules = [...conditionalRules];\n\n if (component.hidden && conditionalRules.length === 0) {\n rules.push({\n name: \"always hidden\",\n type: \"jsonLogic\",\n logic: true,\n effects: [\n { property: { target: \"hidden\", type: \"boolean\" }, boolean: true },\n ],\n });\n }\n\n rules.push(...convertLogic(component, ctx));\n\n if (rules.length) brick.rules = rules;\n\n return brick;\n}\n\nfunction convertLogic(component: FormioComponent, ctx: Converter): Rule[] {\n const rules: Rule[] = [];\n\n for (const logic of component.logic ?? []) {\n const trigger = logic.trigger;\n if (trigger?.type !== \"javascript\" || !trigger.javascript) {\n ctx.warn(\n `logic \"${logic.name ?? \"?\"}\" on \"${component.key ?? \"?\"}\" skipped — only javascript triggers are converted`\n );\n continue;\n }\n\n const effects = [];\n for (const action of logic.actions ?? []) {\n if (action.type === \"property\" && action.property?.value) {\n effects.push({\n property: {\n target: action.property.value,\n type: \"boolean\" as const,\n },\n boolean: action.state === true,\n });\n } else {\n ctx.warn(\n `logic action \"${action.name ?? action.type ?? \"?\"}\" on \"${component.key ?? \"?\"}\" skipped — only property actions are converted`\n );\n }\n }\n if (!effects.length) continue;\n\n rules.push({\n name: logic.name ?? `formio logic (${component.key ?? \"?\"})`,\n type: \"javaScript\",\n code: [\n \"const data = dataMap;\",\n \"const row = dataMap;\",\n \"let result = false;\",\n trigger.javascript,\n \"return result === true;\",\n ].join(\"\\n\"),\n effects,\n });\n }\n\n return rules;\n}\n\nfunction convertValidations(\n component: FormioComponent,\n ctx: Converter\n): Validation[] {\n const source = component.validate ?? {};\n const validations: Validation[] = [];\n const message = source.customMessage;\n\n const push = (validation: Validation) => {\n if (message) validation.message = message;\n validations.push(validation);\n };\n\n const bound = (raw: unknown): number | undefined => {\n if (raw == null || raw === \"\" || raw === false) return undefined;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : undefined;\n };\n\n if (source.required) push({ validator: \"required\" });\n const minLength = bound(source.minLength);\n if (minLength !== undefined) push({ validator: \"minLength\", value: minLength });\n const maxLength = bound(source.maxLength);\n if (maxLength !== undefined) push({ validator: \"maxLength\", value: maxLength });\n const min = bound(source.min);\n if (min !== undefined) push({ validator: \"min\", value: min });\n const max = bound(source.max);\n if (max !== undefined) push({ validator: \"max\", value: max });\n if (source.pattern) push({ validator: \"pattern\", value: source.pattern });\n if (component.type === \"email\") push({ validator: \"email\" });\n if (component.type === \"url\") push({ validator: \"url\" });\n\n if (source.custom) {\n ctx.warn(\n `validate.custom on \"${component.key ?? \"?\"}\" converted automatically — review the generated custom validator`\n );\n validations.push({\n validator: \"custom\",\n customValidator: [\n \"const input = value;\",\n \"const data = dataMap;\",\n \"const row = dataMap;\",\n \"let valid = true;\",\n source.custom,\n \"return valid;\",\n ].join(\"\\n\"),\n });\n }\n\n return validations;\n}\n\nfunction convertConditional(\n component: FormioComponent,\n ctx: Converter\n): Rule[] {\n if (component.customConditional) {\n ctx.warn(\n `customConditional on \"${component.key ?? \"?\"}\" skipped — rewrite it as a FormKrafter rule`\n );\n }\n\n const conditional = component.conditional;\n if (!conditional || !conditional.when) return [];\n\n const show = conditional.show === true || conditional.show === \"true\";\n const comparison = {\n [show ? \"!=\" : \"==\"]: [{ var: conditional.when }, conditional.eq],\n };\n\n return [\n {\n name: `formio conditional (${conditional.when})`,\n type: \"jsonLogic\",\n logic: comparison as Rule[\"logic\"],\n effects: [\n { property: { target: \"hidden\", type: \"boolean\" }, boolean: true },\n ],\n },\n ];\n}\n"
23
+ "import type { BrickSpec } from \"../utils/brick-spec\";\nimport type { Validation } from \"../validators/validation\";\nimport type { Rule } from \"../rules/rule\";\n\nexport interface FormioComponent {\n type?: string;\n key?: string;\n label?: string;\n title?: string;\n placeholder?: string;\n description?: string;\n tooltip?: string;\n defaultValue?: unknown;\n disabled?: boolean;\n hidden?: boolean;\n multiple?: boolean;\n prefix?: string;\n suffix?: string;\n inputMask?: string;\n html?: string;\n content?: string;\n legend?: string;\n input?: boolean;\n tableView?: boolean;\n components?: FormioComponent[];\n columns?: Array<{ components?: FormioComponent[]; width?: number }>;\n values?: Array<{ label?: string; value?: string }>;\n data?: {\n values?: Array<{ label?: string; value?: string }>;\n json?: Array<Record<string, unknown>>;\n url?: string;\n };\n dataSrc?: string;\n valueProperty?: string;\n template?: string;\n searchField?: string;\n storage?: string;\n url?: string;\n filePattern?: string;\n logic?: Array<{\n name?: string;\n trigger?: { type?: string; javascript?: string; simple?: unknown };\n actions?: Array<{\n name?: string;\n type?: string;\n state?: boolean;\n property?: { value?: string; type?: string };\n }>;\n }>;\n validate?: {\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n min?: number;\n max?: number;\n step?: number | string;\n pattern?: string;\n custom?: string;\n customMessage?: string;\n };\n conditional?: {\n show?: boolean | string;\n when?: string | null;\n eq?: unknown;\n };\n customConditional?: string;\n enableTime?: boolean;\n enableDate?: boolean;\n [extra: string]: unknown;\n}\n\nexport interface FormioForm {\n display?: string;\n title?: string;\n name?: string;\n components?: FormioComponent[];\n [extra: string]: unknown;\n}\n\nexport interface FormioConversionResult {\n spec: BrickSpec;\n warnings: string[];\n}\n\ntype Converter = {\n nextUid: () => string;\n warn: (message: string) => void;\n uploadUrls: Map<string, number>;\n};\n\nconst INPUT_TYPE_MAP: Record<\n string,\n { id: string; dataType: BrickSpec[\"dataType\"]; name: string }\n> = {\n textfield: { id: \"text\", dataType: \"string\", name: \"Text\" },\n textarea: { id: \"textarea\", dataType: \"string\", name: \"Text area\" },\n number: { id: \"number\", dataType: \"number\", name: \"Number\" },\n currency: { id: \"number\", dataType: \"number\", name: \"Currency\" },\n password: { id: \"password\", dataType: \"string\", name: \"Password\" },\n email: { id: \"email\", dataType: \"string\", name: \"Email\" },\n url: { id: \"url\", dataType: \"string\", name: \"URL\" },\n phoneNumber: { id: \"phone\", dataType: \"string\", name: \"Phone\" },\n day: { id: \"date\", dataType: \"string\", name: \"Date\" },\n time: { id: \"time\", dataType: \"string\", name: \"Time\" },\n checkbox: { id: \"checkbox\", dataType: \"boolean\", name: \"Checkbox\" },\n hidden: { id: \"hidden\", dataType: \"string\", name: \"Hidden\" },\n tags: { id: \"tags\", dataType: \"array\", name: \"Tags\" },\n radio: { id: \"radio\", dataType: \"string\", name: \"Radio\" },\n signature: { id: \"signature\", dataType: \"string\", name: \"Signature\" },\n address: { id: \"address\", dataType: \"string\", name: \"Address\" },\n};\n\nexport function convertFormioForm(form: FormioForm): FormioConversionResult {\n const warnings: string[] = [];\n let counter = 0;\n const ctx: Converter = {\n nextUid: () => `fio-${++counter}`,\n warn: (message) => warnings.push(message),\n uploadUrls: new Map(),\n };\n\n let children = convertComponents(form.components ?? [], ctx);\n\n if (form.display === \"wizard\") {\n children = [\n {\n type: \"panel\",\n id: \"stepper\",\n name: \"Wizard\",\n configs: {\n uid: ctx.nextUid(),\n key: \"steps\",\n validateSteps: true,\n allowStepClick: true,\n showSubmit: true,\n },\n children,\n },\n ];\n }\n\n const spec: BrickSpec = {\n type: \"panel\",\n id: \"column\",\n name: form.title ?? \"Form\",\n configs: { uid: ctx.nextUid(), key: form.name ?? \"form\" },\n children,\n };\n\n for (const [url, count] of ctx.uploadUrls) {\n warnings.push(\n `${count} file component(s) store uploads at \"${url}\" (kept as the uploadUrl config) — configure services.fileUploadService with UrlFileUploadService to upload there`\n );\n }\n\n return { spec, warnings };\n}\n\nfunction convertComponents(\n components: FormioComponent[],\n ctx: Converter\n): BrickSpec[] {\n const bricks: BrickSpec[] = [];\n for (const component of components) {\n bricks.push(...convertComponent(component, ctx));\n }\n return bricks;\n}\n\nfunction convertComponent(\n component: FormioComponent,\n ctx: Converter\n): BrickSpec[] {\n const type = component.type ?? \"textfield\";\n\n if (type === \"button\") {\n ctx.warn(\n `button \"${component.key ?? component.label ?? \"?\"}\" skipped — FormKrafter renders its own submit action`\n );\n return [];\n }\n\n if (type === \"content\" || type === \"htmlelement\") {\n return [\n withCommon(component, ctx, {\n type: \"output\",\n dataType: \"void\",\n id: \"content\",\n name: \"Content\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n content: String(component.html ?? component.content ?? \"\"),\n },\n }),\n ];\n }\n\n if (type === \"panel\" || type === \"fieldset\" || type === \"well\") {\n return [\n withCommon(component, ctx, {\n type: \"panel\",\n id: \"group\",\n name: component.title ?? component.legend ?? \"Group\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n label: component.title ?? component.legend ?? component.label,\n },\n children: convertComponents(component.components ?? [], ctx),\n }),\n ];\n }\n\n if (type === \"container\") {\n ctx.warn(\n `container \"${component.key ?? \"?\"}\" flattened — FormKrafter stores data flat outside collections`\n );\n return [\n {\n type: \"panel\",\n id: \"group\",\n name: \"Group\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n label: component.label,\n },\n children: convertComponents(component.components ?? [], ctx),\n },\n ];\n }\n\n if (type === \"columns\") {\n return [\n {\n type: \"panel\",\n id: \"row\",\n name: \"Row\",\n configs: { uid: ctx.nextUid(), key: component.key ?? ctx.nextUid() },\n children: (component.columns ?? []).map((column) => ({\n type: \"panel\" as const,\n id: \"column\",\n name: \"Column\",\n configs: { uid: ctx.nextUid(), key: ctx.nextUid() },\n children: convertComponents(column.components ?? [], ctx),\n })),\n },\n ];\n }\n\n if (type === \"tabs\") {\n return [\n {\n type: \"panel\",\n id: \"tabs\",\n name: \"Tabs\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n validateTabs: false,\n },\n children: (component.components ?? []).map((tab) => ({\n type: \"panel\" as const,\n id: \"group\",\n name: tab.label ?? \"Tab\",\n configs: {\n uid: ctx.nextUid(),\n key: tab.key ?? ctx.nextUid(),\n label: tab.label,\n },\n children: convertComponents(tab.components ?? [], ctx),\n })),\n },\n ];\n }\n\n if (type === \"datagrid\" || type === \"editgrid\") {\n if (type === \"editgrid\") {\n ctx.warn(\n `editgrid \"${component.key ?? \"?\"}\" converted to a data-grid — row templates are not preserved`\n );\n }\n return [\n withCommon(component, ctx, {\n type: \"collection\",\n dataType: \"array\",\n id: \"data-grid\",\n name: \"Data grid\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n label: component.label,\n },\n children: convertComponents(component.components ?? [], ctx),\n }),\n ];\n }\n\n if (type === \"datetime\") {\n const dateOnly = component.enableTime === false;\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: \"string\",\n id: dateOnly ? \"date\" : \"datetime\",\n name: dateOnly ? \"Date\" : \"Date & time\",\n configs: baseConfigs(component, ctx),\n }),\n ];\n }\n\n if (type === \"select\") {\n return [convertSelect(component, ctx)];\n }\n\n if (type === \"selectboxes\") {\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: \"array\",\n id: \"select-boxes\",\n name: \"Select boxes\",\n configs: {\n ...baseConfigs(component, ctx),\n optionsSource: \"static\",\n options: emitOptions(staticOptions(component.values), component, ctx),\n },\n }),\n ];\n }\n\n if (type === \"radio\") {\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: \"string\",\n id: \"radio\",\n name: \"Radio\",\n configs: {\n ...baseConfigs(component, ctx),\n optionsSource: \"static\",\n options: emitOptions(staticOptions(component.values), component, ctx),\n },\n }),\n ];\n }\n\n if (type === \"form\") {\n const ref = String(\n component.form ?? component.path ?? component.src ?? \"\"\n );\n ctx.warn(\n `nested form \"${component.key ?? \"?\"}\" references \"${ref}\" — configure services.specSourceService so it can be resolved`\n );\n return [\n withCommon(component, ctx, {\n type: \"panel\",\n id: \"nested-form\",\n name: \"Nested form\",\n configs: {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n label: component.label,\n specRef: ref,\n },\n }),\n ];\n }\n\n if (type === \"file\") {\n const configs = baseConfigs(component, ctx);\n if (component.filePattern && component.filePattern !== \"*\") {\n configs.accept = component.filePattern;\n }\n configs.multiple = component.multiple === true;\n if (component.storage === \"url\" && component.url) {\n configs.uploadUrl = component.url;\n ctx.uploadUrls.set(\n component.url,\n (ctx.uploadUrls.get(component.url) ?? 0) + 1\n );\n }\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: component.multiple ? \"array\" : \"object\",\n id: \"file\",\n name: \"File\",\n configs,\n }),\n ];\n }\n\n const mapped = INPUT_TYPE_MAP[type];\n if (mapped) {\n if (type === \"day\") {\n ctx.warn(\n `day \"${component.key ?? \"?\"}\" approximated with a date input`\n );\n }\n if (type === \"currency\") {\n ctx.warn(\n `currency \"${component.key ?? \"?\"}\" converted to a number with a prefix`\n );\n }\n const configs = baseConfigs(component, ctx);\n if (type === \"currency\" && !configs.prefix) {\n configs.prefix = String(component.currency ?? \"$\");\n }\n return [\n withCommon(component, ctx, {\n type: \"input\",\n dataType: mapped.dataType,\n id: mapped.id,\n name: mapped.name,\n configs,\n }),\n ];\n }\n\n ctx.warn(\n `unsupported component type \"${type}\" (key \"${component.key ?? \"?\"}\") skipped`\n );\n return [];\n}\n\nfunction convertSelect(component: FormioComponent, ctx: Converter): BrickSpec {\n const multiple = component.multiple === true;\n const configs = baseConfigs(component, ctx);\n\n if (component.dataSrc === \"url\" && component.data?.url) {\n configs.optionsSource = \"remote\";\n configs.optionsUrl = component.data.url;\n if (component.valueProperty) configs.valueKey = component.valueProperty;\n const templateKey = labelKeyFromTemplate(component.template);\n if (templateKey) configs.labelKey = templateKey;\n if (component.searchField) configs.searchParam = component.searchField;\n } else if (component.dataSrc === \"json\" && Array.isArray(component.data?.json)) {\n configs.optionsSource = \"static\";\n configs.options = emitOptions(jsonOptions(component, ctx), component, ctx);\n } else {\n if (component.dataSrc && ![\"values\", \"json\", \"\"].includes(component.dataSrc)) {\n ctx.warn(\n `select \"${component.key ?? \"?\"}\" uses dataSrc \"${component.dataSrc}\" — converted to static options`\n );\n }\n configs.optionsSource = \"static\";\n configs.options = emitOptions(staticOptions(component.data?.values ?? component.values), component, ctx);\n }\n\n return withCommon(component, ctx, {\n type: \"input\",\n dataType: multiple ? \"array\" : \"string\",\n id: multiple ? \"multi-select\" : \"select\",\n name: multiple ? \"Multi select\" : \"Select\",\n configs,\n });\n}\n\nfunction jsonOptions(\n component: FormioComponent,\n ctx: Converter\n): Array<{ label: string; value: string }> {\n const items = component.data?.json ?? [];\n const labelKey = labelKeyFromTemplate(component.template) ?? \"label\";\n let valueKey = component.valueProperty;\n if (!valueKey) {\n const first = items[0] ?? {};\n valueKey = \"value\" in first ? \"value\" : labelKey;\n if (valueKey === labelKey) {\n ctx.warn(\n `select \"${component.key ?? \"?\"}\" has no valueProperty — option labels are used as values`\n );\n }\n }\n return items.map((item) => ({\n label: String(item[labelKey] ?? item[valueKey!] ?? \"\"),\n value: String(item[valueKey!] ?? item[labelKey] ?? \"\"),\n }));\n}\n\nfunction labelKeyFromTemplate(template?: string): string | undefined {\n if (!template) return undefined;\n const match = /item\\.([a-zA-Z0-9_.]+)/.exec(template);\n return match?.[1];\n}\n\nfunction staticOptions(\n values?: Array<{ label?: string; value?: string }>\n): Array<{ label: string; value: string }> {\n return (values ?? []).map((option) => ({\n label: String(option.label ?? option.value ?? \"\"),\n value: String(option.value ?? option.label ?? \"\"),\n }));\n}\n\nconst LARGE_OPTIONS_THRESHOLD = 100;\n\nfunction emitOptions(\n list: Array<{ label: string; value: string }>,\n component: FormioComponent,\n ctx: Converter\n): string | Array<{ label: string; value: string }> {\n if (list.length > LARGE_OPTIONS_THRESHOLD) {\n ctx.warn(\n `\"${component.key ?? \"?\"}\" embeds ${list.length} static options — consider optionsSource \"remote\" or a shared catalog (optionsSource \"catalog\" + optionsRef) to keep the spec small`\n );\n }\n\n const compactable =\n list.length > 0 &&\n list.every(\n (option) =>\n option.label === option.value &&\n option.value !== \"\" &&\n option.value === option.value.trim() &&\n !option.value.includes(\"\\n\")\n );\n\n return compactable ? list.map((option) => option.value).join(\"\\n\") : list;\n}\n\nfunction baseConfigs(\n component: FormioComponent,\n ctx: Converter\n): Record<string, unknown> & { uid: string; key: string } {\n const configs: Record<string, unknown> & { uid: string; key: string } = {\n uid: ctx.nextUid(),\n key: component.key ?? ctx.nextUid(),\n };\n if (component.label) configs.label = component.label;\n if (component.placeholder) configs.placeholder = component.placeholder;\n if (component.description) configs.description = component.description;\n if (component.defaultValue !== undefined && component.defaultValue !== \"\") {\n configs.defaultValue = component.defaultValue;\n }\n if (component.validate?.step != null && component.validate.step !== \"\") {\n configs.step = component.validate.step;\n }\n if (component.disabled) configs.disabled = true;\n if (component.prefix) configs.prefix = component.prefix;\n if (component.suffix) configs.suffix = component.suffix;\n if (typeof component.inputMask === \"string\" && component.inputMask) {\n configs.mask = component.inputMask;\n }\n return configs;\n}\n\nfunction withCommon(\n component: FormioComponent,\n ctx: Converter,\n brick: BrickSpec\n): BrickSpec {\n const validations = convertValidations(component, ctx);\n if (validations.length) brick.validations = validations;\n\n const conditionalRules = convertConditional(component, ctx);\n const rules = [...conditionalRules];\n\n if (component.hidden && conditionalRules.length === 0) {\n rules.push({\n name: \"always hidden\",\n type: \"jsonLogic\",\n logic: true,\n effects: [\n { property: { target: \"hidden\", type: \"boolean\" }, boolean: true },\n ],\n });\n }\n\n rules.push(...convertLogic(component, ctx));\n\n if (rules.length) brick.rules = rules;\n\n return brick;\n}\n\nfunction convertLogic(component: FormioComponent, ctx: Converter): Rule[] {\n const rules: Rule[] = [];\n\n for (const logic of component.logic ?? []) {\n const trigger = logic.trigger;\n if (trigger?.type !== \"javascript\" || !trigger.javascript) {\n ctx.warn(\n `logic \"${logic.name ?? \"?\"}\" on \"${component.key ?? \"?\"}\" skipped — only javascript triggers are converted`\n );\n continue;\n }\n\n const effects = [];\n for (const action of logic.actions ?? []) {\n if (action.type === \"property\" && action.property?.value) {\n effects.push({\n property: {\n target: action.property.value,\n type: \"boolean\" as const,\n },\n boolean: action.state === true,\n });\n } else {\n ctx.warn(\n `logic action \"${action.name ?? action.type ?? \"?\"}\" on \"${component.key ?? \"?\"}\" skipped — only property actions are converted`\n );\n }\n }\n if (!effects.length) continue;\n\n rules.push({\n name: logic.name ?? `formio logic (${component.key ?? \"?\"})`,\n type: \"javaScript\",\n code: [\n \"const data = dataMap;\",\n \"const row = dataMap;\",\n \"let result = false;\",\n trigger.javascript,\n \"return result === true;\",\n ].join(\"\\n\"),\n effects,\n });\n }\n\n return rules;\n}\n\nfunction convertValidations(\n component: FormioComponent,\n ctx: Converter\n): Validation[] {\n const source = component.validate ?? {};\n const validations: Validation[] = [];\n const message = source.customMessage;\n\n const push = (validation: Validation) => {\n if (message) validation.message = message;\n validations.push(validation);\n };\n\n const bound = (raw: unknown): number | undefined => {\n if (raw == null || raw === \"\" || raw === false) return undefined;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : undefined;\n };\n\n if (source.required) push({ validator: \"required\" });\n const minLength = bound(source.minLength);\n if (minLength !== undefined) push({ validator: \"minLength\", value: minLength });\n const maxLength = bound(source.maxLength);\n if (maxLength !== undefined) push({ validator: \"maxLength\", value: maxLength });\n const min = bound(source.min);\n if (min !== undefined) push({ validator: \"min\", value: min });\n const max = bound(source.max);\n if (max !== undefined) push({ validator: \"max\", value: max });\n if (source.pattern) push({ validator: \"pattern\", value: source.pattern });\n if (component.type === \"email\") push({ validator: \"email\" });\n if (component.type === \"url\") push({ validator: \"url\" });\n\n if (source.custom) {\n ctx.warn(\n `validate.custom on \"${component.key ?? \"?\"}\" converted automatically — review the generated custom validator`\n );\n validations.push({\n validator: \"custom\",\n customValidator: [\n \"const input = value;\",\n \"const data = dataMap;\",\n \"const row = dataMap;\",\n \"let valid = true;\",\n source.custom,\n \"return valid;\",\n ].join(\"\\n\"),\n });\n }\n\n return validations;\n}\n\nfunction convertConditional(\n component: FormioComponent,\n ctx: Converter\n): Rule[] {\n if (component.customConditional) {\n ctx.warn(\n `customConditional on \"${component.key ?? \"?\"}\" skipped — rewrite it as a FormKrafter rule`\n );\n }\n\n const conditional = component.conditional;\n if (!conditional || !conditional.when) return [];\n\n const show = conditional.show === true || conditional.show === \"true\";\n const comparison = {\n [show ? \"!=\" : \"==\"]: [{ var: conditional.when }, conditional.eq],\n };\n\n return [\n {\n name: `formio conditional (${conditional.when})`,\n type: \"jsonLogic\",\n logic: comparison as Rule[\"logic\"],\n effects: [\n { property: { target: \"hidden\", type: \"boolean\" }, boolean: true },\n ],\n },\n ];\n}\n",
24
+ "import type { BrickSpec } from \"./brick-spec\";\nimport { iterateBricks } from \"./brick-spec\";\nimport { services } from \"../services\";\nimport type { SpecSourceService } from \"../services/spec_source_service\";\n\nexport interface ExpandSpecOptions {\n specSourceService?: SpecSourceService;\n maxDepth?: number;\n}\n\nconst isNestedForm = (brick: BrickSpec): boolean =>\n brick.id === \"nested-form\" && typeof brick.configs?.specRef === \"string\";\n\nexport const hasNestedForms = (spec?: BrickSpec): boolean => {\n if (!spec) return false;\n for (const { brick } of iterateBricks(spec)) {\n if (isNestedForm(brick) && brick.configs?.specRef) return true;\n }\n return false;\n};\n\nexport async function expandSpec(\n spec: BrickSpec,\n options: ExpandSpecOptions = {}\n): Promise<BrickSpec> {\n const source = options.specSourceService ?? services.specSourceService;\n const maxDepth = options.maxDepth ?? 5;\n\n const expandBrick = async (\n brick: BrickSpec,\n seenRefs: string[]\n ): Promise<BrickSpec> => {\n if (isNestedForm(brick) && brick.configs?.specRef) {\n const ref = String(brick.configs.specRef);\n\n if (seenRefs.includes(ref)) {\n throw new Error(\n `Circular nested form reference: ${[...seenRefs, ref].join(\" → \")}`\n );\n }\n if (seenRefs.length >= maxDepth) {\n throw new Error(\n `Nested forms exceed the maximum depth of ${maxDepth} (${ref})`\n );\n }\n\n const fetched = await source.fetchSpec(ref);\n const inlined = await expandBrick(structuredClone(fetched), [\n ...seenRefs,\n ref,\n ]);\n\n return {\n type: \"panel\",\n id: \"group\",\n name: brick.name,\n configs: {\n ...brick.configs,\n label: brick.configs.label ?? inlined.name,\n },\n styles: brick.styles,\n rules: brick.rules,\n children: inlined.children ?? [],\n };\n }\n\n if (!brick.children?.length) return brick;\n\n return {\n ...brick,\n children: await Promise.all(\n brick.children.map((child) => expandBrick(child, seenRefs))\n ),\n };\n };\n\n return expandBrick(structuredClone(spec), []);\n}\n"
22
25
  ],
23
- "mappings": "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",
24
- "debugId": "889DCABFD85A92E164756E2164756E21",
26
+ "mappings": "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",
27
+ "debugId": "5B1C4474681AF83564756E2164756E21",
25
28
  "names": []
26
29
  }
@@ -1,10 +1,14 @@
1
1
  import { type JsRunnerService } from "./js_runner_service";
2
2
  import { type DataSourceService } from "./data_source_service";
3
3
  import { type FileUploadService } from "./file_upload_service";
4
+ import { type SpecSourceService } from "./spec_source_service";
5
+ import { type OptionSourceService } from "./option_source_service";
4
6
  export interface Services {
5
7
  jsRunnerService: JsRunnerService;
6
8
  dataSourceService: DataSourceService;
7
9
  fileUploadService: FileUploadService;
10
+ specSourceService: SpecSourceService;
11
+ optionSourceService: OptionSourceService;
8
12
  }
9
13
  declare const services: Services;
10
14
  export { services };
@@ -0,0 +1,16 @@
1
+ export interface OptionSourceService {
2
+ fetchOptions(ref: string): Promise<unknown>;
3
+ }
4
+ export interface FetchOptionSourceDefaults {
5
+ baseUrl?: string;
6
+ headers?: Record<string, string>;
7
+ credentials?: RequestCredentials;
8
+ fetch?: typeof fetch;
9
+ }
10
+ export declare class FetchOptionSourceService implements OptionSourceService {
11
+ private readonly defaults;
12
+ private cache;
13
+ constructor(defaults?: FetchOptionSourceDefaults);
14
+ private resolveUrl;
15
+ fetchOptions(ref: string): Promise<unknown>;
16
+ }
@@ -0,0 +1,17 @@
1
+ import type { BrickSpec } from "../utils/brick-spec";
2
+ export interface SpecSourceService {
3
+ fetchSpec(ref: string): Promise<BrickSpec>;
4
+ }
5
+ export interface FetchSpecSourceDefaults {
6
+ baseUrl?: string;
7
+ headers?: Record<string, string>;
8
+ credentials?: RequestCredentials;
9
+ fetch?: typeof fetch;
10
+ }
11
+ export declare class FetchSpecSourceService implements SpecSourceService {
12
+ private readonly defaults;
13
+ private cache;
14
+ constructor(defaults?: FetchSpecSourceDefaults);
15
+ private resolveUrl;
16
+ fetchSpec(ref: string): Promise<BrickSpec>;
17
+ }
@@ -0,0 +1,8 @@
1
+ import type { BrickSpec } from "./brick-spec";
2
+ import type { SpecSourceService } from "../services/spec_source_service";
3
+ export interface ExpandSpecOptions {
4
+ specSourceService?: SpecSourceService;
5
+ maxDepth?: number;
6
+ }
7
+ export declare const hasNestedForms: (spec?: BrickSpec) => boolean;
8
+ export declare function expandSpec(spec: BrickSpec, options?: ExpandSpecOptions): Promise<BrickSpec>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamline-pulse/formkrafter-core",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Framework-agnostic core for FormKrafter: form specs, RFC 6902 ops with undo/redo, Ajv validation, sandboxed rules engine and injectable services",
5
5
  "license": "MIT",
6
6
  "type": "module",