@streamline-pulse/formkrafter-core 0.2.0 → 0.4.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,7 @@ 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` |
97
98
 
98
99
  ## Shared singleton state
99
100
 
@@ -105,6 +106,23 @@ What this means in practice:
105
106
  - 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
107
  - The same pattern backs the brick registry and the i18n store in `formkrafter-wc`.
107
108
 
109
+ ## Nested forms
110
+
111
+ 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:
112
+
113
+ ```ts
114
+ import { expandSpec, hasNestedForms, services, validateFormData } from '@streamline-pulse/formkrafter-core'
115
+
116
+ services.specSourceService = {
117
+ fetchSpec: async (ref) => (await fetch(`/api/forms/${ref}`)).json(),
118
+ }
119
+
120
+ const full = await expandSpec(spec) // nested-form bricks become labelled groups
121
+ const verdict = validateFormData(full, data) // backend validation sees the complete tree
122
+ ```
123
+
124
+ `fk-form-render` runs this expansion automatically on the frontend — configure the service once at startup.
125
+
108
126
  ## Coming from Form.io
109
127
 
110
128
  `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,7 @@ 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";
package/dist/index.js CHANGED
@@ -90,7 +90,7 @@ function buildValidationSchema(brickSpecs, locale) {
90
90
  };
91
91
  for (const brick of iterateSchemaBricks(brickSpecs)) {
92
92
  const key = brick.configs?.key;
93
- const dataType = brick.dataType;
93
+ const dataType = brick.configs?.multiple === true && brick.dataType === "object" ? "array" : brick.dataType;
94
94
  if (!key || !dataType || dataType === "void")
95
95
  continue;
96
96
  const isRequired = brick.validations?.find((validation2) => validation2.validator === "required");
@@ -649,14 +649,49 @@ 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
+
652
685
  // lib/services/index.ts
653
686
  var GLOBAL_KEY = Symbol.for("formkrafter.core.services");
654
687
  var globalStore = globalThis;
655
688
  var services = globalStore[GLOBAL_KEY] ??= {
656
689
  jsRunnerService: new SandboxJsRunnerService,
657
690
  dataSourceService: new FetchDataSourceService,
658
- fileUploadService: new Base64FileUploadService
691
+ fileUploadService: new Base64FileUploadService,
692
+ specSourceService: new FetchSpecSourceService
659
693
  };
694
+ services.specSourceService ??= new FetchSpecSourceService;
660
695
 
661
696
  // lib/brick/utils.ts
662
697
  var evalBrickCode = (code, data) => {
@@ -1267,14 +1302,29 @@ function convertComponent(component, ctx) {
1267
1302
  })
1268
1303
  ];
1269
1304
  }
1305
+ if (type === "form") {
1306
+ const ref = String(component.form ?? component.path ?? component.src ?? "");
1307
+ ctx.warn(`nested form "${component.key ?? "?"}" references "${ref}" — configure services.specSourceService so it can be resolved`);
1308
+ return [
1309
+ withCommon(component, ctx, {
1310
+ type: "panel",
1311
+ id: "nested-form",
1312
+ name: "Nested form",
1313
+ configs: {
1314
+ uid: ctx.nextUid(),
1315
+ key: component.key ?? ctx.nextUid(),
1316
+ label: component.label,
1317
+ specRef: ref
1318
+ }
1319
+ })
1320
+ ];
1321
+ }
1270
1322
  if (type === "file") {
1271
1323
  const configs = baseConfigs(component, ctx);
1272
1324
  if (component.filePattern && component.filePattern !== "*") {
1273
1325
  configs.accept = component.filePattern;
1274
1326
  }
1275
- if (component.multiple) {
1276
- ctx.warn(`file "${component.key ?? "?"}" allows multiple files — single file kept (multi-file uploads are not supported yet)`);
1277
- }
1327
+ configs.multiple = component.multiple === true;
1278
1328
  if (component.storage === "url" && component.url) {
1279
1329
  configs.uploadUrl = component.url;
1280
1330
  ctx.uploadUrls.set(component.url, (ctx.uploadUrls.get(component.url) ?? 0) + 1);
@@ -1282,7 +1332,7 @@ function convertComponent(component, ctx) {
1282
1332
  return [
1283
1333
  withCommon(component, ctx, {
1284
1334
  type: "input",
1285
- dataType: "object",
1335
+ dataType: component.multiple ? "array" : "object",
1286
1336
  id: "file",
1287
1337
  name: "File",
1288
1338
  configs
@@ -1396,6 +1446,9 @@ function baseConfigs(component, ctx) {
1396
1446
  configs.prefix = component.prefix;
1397
1447
  if (component.suffix)
1398
1448
  configs.suffix = component.suffix;
1449
+ if (typeof component.inputMask === "string" && component.inputMask) {
1450
+ configs.mask = component.inputMask;
1451
+ }
1399
1452
  return configs;
1400
1453
  }
1401
1454
  function withCommon(component, ctx, brick) {
@@ -1533,6 +1586,56 @@ function convertConditional(component, ctx) {
1533
1586
  }
1534
1587
  ];
1535
1588
  }
1589
+ // lib/utils/expand-spec.ts
1590
+ var isNestedForm = (brick) => brick.id === "nested-form" && typeof brick.configs?.specRef === "string";
1591
+ var hasNestedForms = (spec) => {
1592
+ if (!spec)
1593
+ return false;
1594
+ for (const { brick } of iterateBricks(spec)) {
1595
+ if (isNestedForm(brick) && brick.configs?.specRef)
1596
+ return true;
1597
+ }
1598
+ return false;
1599
+ };
1600
+ async function expandSpec(spec, options = {}) {
1601
+ const source = options.specSourceService ?? services.specSourceService;
1602
+ const maxDepth = options.maxDepth ?? 5;
1603
+ const expandBrick = async (brick, seenRefs) => {
1604
+ if (isNestedForm(brick) && brick.configs?.specRef) {
1605
+ const ref = String(brick.configs.specRef);
1606
+ if (seenRefs.includes(ref)) {
1607
+ throw new Error(`Circular nested form reference: ${[...seenRefs, ref].join(" → ")}`);
1608
+ }
1609
+ if (seenRefs.length >= maxDepth) {
1610
+ throw new Error(`Nested forms exceed the maximum depth of ${maxDepth} (${ref})`);
1611
+ }
1612
+ const fetched = await source.fetchSpec(ref);
1613
+ const inlined = await expandBrick(structuredClone(fetched), [
1614
+ ...seenRefs,
1615
+ ref
1616
+ ]);
1617
+ return {
1618
+ type: "panel",
1619
+ id: "group",
1620
+ name: brick.name,
1621
+ configs: {
1622
+ ...brick.configs,
1623
+ label: brick.configs.label ?? inlined.name
1624
+ },
1625
+ styles: brick.styles,
1626
+ rules: brick.rules,
1627
+ children: inlined.children ?? []
1628
+ };
1629
+ }
1630
+ if (!brick.children?.length)
1631
+ return brick;
1632
+ return {
1633
+ ...brick,
1634
+ children: await Promise.all(brick.children.map((child) => expandBrick(child, seenRefs)))
1635
+ };
1636
+ };
1637
+ return expandBrick(structuredClone(spec), []);
1638
+ }
1536
1639
  export {
1537
1640
  validateFormData,
1538
1641
  validateBrickSpecDataDetailed,
@@ -1553,8 +1656,10 @@ export {
1553
1656
  iterateSchemaBricks,
1554
1657
  iterateBricks,
1555
1658
  isLocalizedObject,
1659
+ hasNestedForms,
1556
1660
  getBrickAt,
1557
1661
  getAffectedProperties,
1662
+ expandSpec,
1558
1663
  evalBrickCode,
1559
1664
  duplicateBrick,
1560
1665
  defaultValidationMessage,
@@ -1566,10 +1671,11 @@ export {
1566
1671
  SpecHistory,
1567
1672
  SandboxJsRunnerService,
1568
1673
  JsRunnerServiceImplementation,
1674
+ FetchSpecSourceService,
1569
1675
  FetchDataSourceService,
1570
1676
  Brick,
1571
1677
  Base64FileUploadService
1572
1678
  };
1573
1679
 
1574
- //# debugId=B48CAF1CB5D5782064756E2164756E21
1680
+ //# debugId=9F3E60C895B282CC64756E2164756E21
1575
1681
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,26 +1,28 @@
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/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",
7
- "import type { JSONSchemaType } from \"../validators/json-schema-type\";\nimport { resolveLocalizedText } from \"./localized-text\";\nimport { defaultValidationMessage } from \"../validators/default-messages\";\nimport type { Validator } from \"../validators/validator\";\nimport type { Validation } from \"../validators/validation\";\nimport type { Rule } from \"../rules/rule\";\nimport type { BrickType } from \"./brick-type\";\nimport type { BrickBaseConfigs } from \"./common-brick-props\";\nimport type { BrickStyles } from \"../utils/brick-styles\";\n\nexport interface BrickSpec {\n type: BrickType;\n dataType?: JSONSchemaType;\n id: string;\n name: string;\n category?: string;\n editable?: boolean;\n unWrapData?: boolean;\n isPrivate?: boolean;\n\n validators?: Validator[];\n validations?: Validation[];\n\n rules?: Rule[];\n\n configsForm?: BrickSpec;\n\n configs?: BrickBaseConfigs & Record<string, unknown>;\n styles?: BrickStyles<string>;\n\n children?: BrickSpec[];\n}\n\nexport function* iterateBricks(\n spec?: BrickSpec,\n path = \"0\"\n): Generator<{ brick: BrickSpec; path: string }> {\n if (!spec) return;\n\n yield { brick: spec, path };\n\n for (const [index, child] of (spec.children ?? []).entries()) {\n yield* iterateBricks(child, `${path}.${index}`);\n }\n}\n\nexport function* iterateSchemaBricks(spec?: BrickSpec): Generator<BrickSpec> {\n if (!spec) return;\n\n yield spec;\n\n if (spec.type === \"collection\") return;\n\n for (const child of spec.children ?? []) {\n yield* iterateSchemaBricks(child);\n }\n}\n\nexport function buildValidationSchema(brickSpecs?: BrickSpec, locale?: string) {\n if (!brickSpecs) return;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n const requiredErrorMessage: Record<string, string | undefined> = {};\n const messageOf = (raw: unknown): string | undefined => {\n const resolved = resolveLocalizedText(raw, locale);\n return typeof resolved === \"string\" ? resolved : undefined;\n };\n\n for (const brick of iterateSchemaBricks(brickSpecs)) {\n const key = brick.configs?.key;\n const dataType = brick.dataType;\n\n if (!key || !dataType || dataType === \"void\") continue;\n\n const isRequired = brick.validations?.find(\n (validation) => validation.validator === \"required\"\n );\n\n const property: Record<string, unknown> = {\n type: dataType,\n nullable: !isRequired,\n };\n const messages: Record<string, string> = {\n type: defaultValidationMessage(\"type\", locale),\n };\n\n for (const validation of brick.validations ?? []) {\n const { validator, value } = validation;\n const message =\n messageOf(validation.message) ??\n defaultValidationMessage(validator, locale, value);\n\n if (validator === \"minLength\" && value != null) {\n property.minLength = Number(value);\n messages.minLength = message;\n } else if (validator === \"maxLength\" && value != null) {\n property.maxLength = Number(value);\n messages.maxLength = message;\n } else if (validator === \"min\" && value != null) {\n property.minimum = Number(value);\n messages.minimum = message;\n } else if (validator === \"max\" && value != null) {\n property.maximum = Number(value);\n messages.maximum = message;\n } else if (validator === \"pattern\" && typeof value === \"string\" && value) {\n property.pattern = value;\n messages.pattern = message;\n } else if (validator === \"minItems\" && value != null) {\n property.minItems = Number(value);\n messages.minItems = message;\n } else if (validator === \"maxItems\" && value != null) {\n property.maxItems = Number(value);\n messages.maxItems = message;\n } else if (validator === \"email\") {\n property.format = \"email\";\n messages.format = message;\n } else if (validator === \"url\") {\n property.format = \"uri\";\n messages.format = message;\n }\n }\n\n property.errorMessage = messages;\n\n properties[key] = property;\n\n if (isRequired) {\n required.push(key);\n requiredErrorMessage[key] =\n messageOf(isRequired.message) ??\n defaultValidationMessage(\"required\", locale);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n ...(Object.keys(requiredErrorMessage).length\n ? {\n errorMessage: {\n required: requiredErrorMessage,\n },\n }\n : {}),\n additionalProperties: false,\n };\n}\n",
7
+ "import type { JSONSchemaType } from \"../validators/json-schema-type\";\nimport { resolveLocalizedText } from \"./localized-text\";\nimport { defaultValidationMessage } from \"../validators/default-messages\";\nimport type { Validator } from \"../validators/validator\";\nimport type { Validation } from \"../validators/validation\";\nimport type { Rule } from \"../rules/rule\";\nimport type { BrickType } from \"./brick-type\";\nimport type { BrickBaseConfigs } from \"./common-brick-props\";\nimport type { BrickStyles } from \"../utils/brick-styles\";\n\nexport interface BrickSpec {\n type: BrickType;\n dataType?: JSONSchemaType;\n id: string;\n name: string;\n category?: string;\n editable?: boolean;\n unWrapData?: boolean;\n isPrivate?: boolean;\n\n validators?: Validator[];\n validations?: Validation[];\n\n rules?: Rule[];\n\n configsForm?: BrickSpec;\n\n configs?: BrickBaseConfigs & Record<string, unknown>;\n styles?: BrickStyles<string>;\n\n children?: BrickSpec[];\n}\n\nexport function* iterateBricks(\n spec?: BrickSpec,\n path = \"0\"\n): Generator<{ brick: BrickSpec; path: string }> {\n if (!spec) return;\n\n yield { brick: spec, path };\n\n for (const [index, child] of (spec.children ?? []).entries()) {\n yield* iterateBricks(child, `${path}.${index}`);\n }\n}\n\nexport function* iterateSchemaBricks(spec?: BrickSpec): Generator<BrickSpec> {\n if (!spec) return;\n\n yield spec;\n\n if (spec.type === \"collection\") return;\n\n for (const child of spec.children ?? []) {\n yield* iterateSchemaBricks(child);\n }\n}\n\nexport function buildValidationSchema(brickSpecs?: BrickSpec, locale?: string) {\n if (!brickSpecs) return;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n const requiredErrorMessage: Record<string, string | undefined> = {};\n const messageOf = (raw: unknown): string | undefined => {\n const resolved = resolveLocalizedText(raw, locale);\n return typeof resolved === \"string\" ? resolved : undefined;\n };\n\n for (const brick of iterateSchemaBricks(brickSpecs)) {\n const key = brick.configs?.key;\n const dataType =\n brick.configs?.multiple === true && brick.dataType === \"object\"\n ? \"array\"\n : brick.dataType;\n\n if (!key || !dataType || dataType === \"void\") continue;\n\n const isRequired = brick.validations?.find(\n (validation) => validation.validator === \"required\"\n );\n\n const property: Record<string, unknown> = {\n type: dataType,\n nullable: !isRequired,\n };\n const messages: Record<string, string> = {\n type: defaultValidationMessage(\"type\", locale),\n };\n\n for (const validation of brick.validations ?? []) {\n const { validator, value } = validation;\n const message =\n messageOf(validation.message) ??\n defaultValidationMessage(validator, locale, value);\n\n if (validator === \"minLength\" && value != null) {\n property.minLength = Number(value);\n messages.minLength = message;\n } else if (validator === \"maxLength\" && value != null) {\n property.maxLength = Number(value);\n messages.maxLength = message;\n } else if (validator === \"min\" && value != null) {\n property.minimum = Number(value);\n messages.minimum = message;\n } else if (validator === \"max\" && value != null) {\n property.maximum = Number(value);\n messages.maximum = message;\n } else if (validator === \"pattern\" && typeof value === \"string\" && value) {\n property.pattern = value;\n messages.pattern = message;\n } else if (validator === \"minItems\" && value != null) {\n property.minItems = Number(value);\n messages.minItems = message;\n } else if (validator === \"maxItems\" && value != null) {\n property.maxItems = Number(value);\n messages.maxItems = message;\n } else if (validator === \"email\") {\n property.format = \"email\";\n messages.format = message;\n } else if (validator === \"url\") {\n property.format = \"uri\";\n messages.format = message;\n }\n }\n\n property.errorMessage = messages;\n\n properties[key] = property;\n\n if (isRequired) {\n required.push(key);\n requiredErrorMessage[key] =\n messageOf(isRequired.message) ??\n defaultValidationMessage(\"required\", locale);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n ...(Object.keys(requiredErrorMessage).length\n ? {\n errorMessage: {\n required: requiredErrorMessage,\n },\n }\n : {}),\n additionalProperties: false,\n };\n}\n",
8
8
  "import type { Validator } from \"../validators/validator\";\nimport type { Validation } from \"../validators/validation\";\nimport type { JSONSchemaType } from \"../validators/json-schema-type\";\nimport { type Utils } from \"./utils\";\nimport type { Rule } from \"../rules/rule\";\nimport type { BrickSpec } from \"../utils/brick-spec\";\nimport type { BrickType } from \"../utils/brick-type\";\nimport type { BrickBaseConfigs, CommonBrickProps } from \"../utils/common-brick-props\";\nimport type { BrickMoldDropType } from \"../utils/drop-type\";\n\nexport interface BrickProps<DataType, Configs extends BrickBaseConfigs, Styles>\n extends CommonBrickProps<Configs, Styles> {\n onConfigsChange?: (\n configs: BrickBaseConfigs & Record<string, unknown>,\n uid?: string\n ) => void;\n onStylesChange?: (\n styles: Record<string, unknown>,\n uid?: string\n ) => void;\n data?: DataType;\n dataMap?: Record<string, unknown>;\n rootSpec?: BrickSpec;\n onDataChange?: (value?: DataType) => void;\n onMove?: (from: string, to: string) => void;\n onDuplicate?: (path: string) => void;\n onDelete?: (path: string) => void;\n onAddBrick?: (brickMold: BrickMoldDropType, path: string) => void;\n path: string;\n error?: string;\n disabled?: boolean;\n locale?: string;\n children?: unknown;\n brickSpec?: BrickSpec;\n editable?: boolean;\n validations?: Validation[];\n onValidationsChange?: (validations: Validation[], uid?: string) => void;\n rules?: Rule[];\n onRulesChange?: (rules: Rule[], uid?: string) => void;\n utils: Utils;\n}\n\nexport abstract class Brick<\n DataType,\n Configs extends BrickBaseConfigs,\n Styles extends Record<string, unknown>> {\n readonly type: BrickType;\n readonly dataType: JSONSchemaType;\n readonly id: string;\n readonly name: string;\n readonly configsForm?: BrickSpec;\n readonly category?: string;\n readonly styles?: Styles;\n\n readonly unWrapData: boolean;\n readonly isPrivate: boolean;\n\n readonly validators: Validator[];\n readonly defaultConfigs?: Record<string, unknown>;\n\n constructor(params: {\n type: BrickType;\n dataType: JSONSchemaType;\n id: string;\n name: string;\n configsForm?: BrickSpec;\n category?: string;\n styles?: Styles;\n unWrapData?: boolean;\n isPrivate?: boolean;\n validators?: Validator[];\n defaultConfigs?: Record<string, unknown>;\n }) {\n this.type = params.type;\n this.dataType = params.dataType;\n this.id = params.id;\n this.name = params.name;\n this.configsForm = params.configsForm;\n this.category = params.category;\n this.styles = params.styles;\n this.unWrapData = params.unWrapData ?? false;\n this.isPrivate = params.isPrivate ?? false;\n this.validators = params.validators ?? [];\n this.defaultConfigs = params.defaultConfigs;\n }\n\n abstract render(props: BrickProps<DataType, Configs, Styles>): unknown;\n\n\n abstract renderBuilder(props: BrickProps<DataType, Configs, Styles>): unknown;\n\n abstract getComponent(props: BrickProps<DataType, Configs, Styles>): unknown;\n abstract getComponentWithActions(props: BrickProps<DataType, Configs, Styles>): unknown;\n\n getBrickEmptySpec(): BrickSpec {\n return {\n type: this.type,\n dataType: this.dataType,\n id: this.id,\n name: this.name,\n ...(this.category !== undefined ? { category: this.category } : {}),\n ...(this.configsForm !== undefined ? { configsForm: this.configsForm } : {}),\n ...(this.styles !== undefined ? { styles: this.styles } : {}),\n ...(this.defaultConfigs !== undefined\n ? { configs: { ...this.defaultConfigs } }\n : {}),\n validators: this.validators,\n };\n }\n}",
9
9
  "import jsonLogic from \"json-logic-js\";\nimport { services } from \"../services\";\nimport type { Rule } from \"../rules/rule\";\n\nexport type CommonUtils = object;\n\nexport type InputUtils = CommonUtils;\n\nexport type PanelUtils = CommonUtils;\n\nexport type CollectionUtils = CommonUtils;\n\nexport type ActionUtils = {\n validateForm: () => {\n isValid: boolean;\n };\n} & CommonUtils;\n\nexport type Utils = InputUtils & PanelUtils & CollectionUtils & ActionUtils;\n\nexport const evalBrickCode = (code: string, data?: Record<string, unknown>) => {\n try {\n return services.jsRunnerService.eval(code, { dataMap: data ?? {} });\n } catch (error) {\n return error instanceof Error ? error : new Error(String(error));\n }\n};\n\nconst evalRule = (rule: Rule, dataMap?: Record<string, unknown>): boolean => {\n if (rule.type === \"jsonLogic\") {\n if (rule.logic == null) return false;\n\n return jsonLogic.apply(rule.logic, dataMap) === true;\n }\n\n if (rule.type === \"javaScript\") {\n if (!rule.code) return false;\n\n return evalBrickCode(rule.code, dataMap) === true;\n }\n\n return false;\n};\n\ntype Properties = {\n value?: string;\n required?: boolean;\n hidden?: boolean;\n disabled?: boolean;\n};\n\nconst getActiveRules = (rules?: Rule[], dataMap?: Record<string, unknown>) =>\n rules?.filter((rule) => evalRule(rule, dataMap));\n\nconst getActiveEffect = (rules?: Rule[], dataMap?: Record<string, unknown>) =>\n getActiveRules(rules, dataMap)\n ?.map((rule) => rule.effects)\n .flat()\n .filter((effect) => effect != undefined);\n\nexport const getAffectedProperties = (\n rules?: Rule[],\n dataMap?: Record<string, unknown>\n): Properties => {\n return getActiveEffect(rules, dataMap)\n ?.map((effect) => {\n let value;\n if (effect.property) {\n if (effect.property.type === \"boolean\") value = effect.boolean;\n else if (effect.property.type === \"logic\" && effect.logic != null)\n value = jsonLogic.apply(effect.logic, dataMap);\n else if (effect.property.type === \"code\" && effect.code)\n value = evalBrickCode(effect.code, dataMap);\n else if (effect.property.type === \"string\") value = effect.string;\n\n return {\n [effect.property.target]: value,\n };\n }\n return {};\n })\n .flat()\n .reduce((acc, item) => ({ ...acc, ...item }), {}) ?? { hidden: false };\n};\n",
10
10
  "import { type Options, parse } from \"acorn\";\nimport { runSandboxed } from \"./sandbox_interpreter\";\n\nexport interface JsRunnerService {\n eval(js: string, scope?: Record<string, unknown>): unknown;\n validateJs(js: string, options?: Options): { valide: boolean; error?: Error };\n}\n\nexport class SandboxJsRunnerService 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 return runSandboxed(js, scope);\n }\n}\n\nexport const JsRunnerServiceImplementation = SandboxJsRunnerService;\n",
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
+ "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\";\n\nexport interface Services {\n jsRunnerService: JsRunnerService;\n dataSourceService: DataSourceService;\n fileUploadService: FileUploadService;\n specSourceService: SpecSourceService;\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});\n\nservices.specSourceService ??= new FetchSpecSourceService();\n\nexport { services };\n",
15
16
  "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
17
  "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
18
  "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
19
  "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
20
  "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
21
  "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 if (component.multiple) {\n ctx.warn(\n `file \"${component.key ?? \"?\"}\" allows multiple files — single file kept (multi-file uploads are not supported yet)`\n );\n }\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: \"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"
22
+ "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: 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 === \"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 = 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 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",
23
+ "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
24
  ],
23
- "mappings": "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",
24
- "debugId": "B48CAF1CB5D5782064756E2164756E21",
25
+ "mappings": "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",
26
+ "debugId": "9F3E60C895B282CC64756E2164756E21",
25
27
  "names": []
26
28
  }
@@ -1,10 +1,12 @@
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";
4
5
  export interface Services {
5
6
  jsRunnerService: JsRunnerService;
6
7
  dataSourceService: DataSourceService;
7
8
  fileUploadService: FileUploadService;
9
+ specSourceService: SpecSourceService;
8
10
  }
9
11
  declare const services: Services;
10
12
  export { services };
@@ -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.2.0",
3
+ "version": "0.4.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",