@mosaicoo/form-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +37 -0
  2. package/dist/index.d.ts +8 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +10 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/interop/importer.d.ts +38 -0
  7. package/dist/interop/importer.d.ts.map +1 -0
  8. package/dist/interop/importer.js +29 -0
  9. package/dist/interop/importer.js.map +1 -0
  10. package/dist/interop/legacy/legacy-exporter.d.ts +14 -0
  11. package/dist/interop/legacy/legacy-exporter.d.ts.map +1 -0
  12. package/dist/interop/legacy/legacy-exporter.js +234 -0
  13. package/dist/interop/legacy/legacy-exporter.js.map +1 -0
  14. package/dist/interop/legacy/legacy-importer.d.ts +25 -0
  15. package/dist/interop/legacy/legacy-importer.d.ts.map +1 -0
  16. package/dist/interop/legacy/legacy-importer.js +382 -0
  17. package/dist/interop/legacy/legacy-importer.js.map +1 -0
  18. package/dist/schema/types.d.ts +181 -0
  19. package/dist/schema/types.d.ts.map +1 -0
  20. package/dist/schema/types.js +9 -0
  21. package/dist/schema/types.js.map +1 -0
  22. package/dist/schema/walk.d.ts +27 -0
  23. package/dist/schema/walk.d.ts.map +1 -0
  24. package/dist/schema/walk.js +56 -0
  25. package/dist/schema/walk.js.map +1 -0
  26. package/dist/state/engine.d.ts +93 -0
  27. package/dist/state/engine.d.ts.map +1 -0
  28. package/dist/state/engine.js +358 -0
  29. package/dist/state/engine.js.map +1 -0
  30. package/dist/util/clone.d.ts +6 -0
  31. package/dist/util/clone.d.ts.map +1 -0
  32. package/dist/util/clone.js +18 -0
  33. package/dist/util/clone.js.map +1 -0
  34. package/dist/validation/validate.d.ts +35 -0
  35. package/dist/validation/validate.d.ts.map +1 -0
  36. package/dist/validation/validate.js +113 -0
  37. package/dist/validation/validate.js.map +1 -0
  38. package/package.json +47 -0
@@ -0,0 +1,382 @@
1
+ import { ImportError } from '../importer.js';
2
+ /** Maps legacy input types to Mosaicoo Form field types + data types. */
3
+ const INPUT_TYPE_MAP = {
4
+ textfield: { type: 'text', dataType: 'string' },
5
+ textarea: { type: 'textarea', dataType: 'string' },
6
+ number: { type: 'number', dataType: 'number' },
7
+ password: { type: 'password', dataType: 'string' },
8
+ email: { type: 'email', dataType: 'string' },
9
+ phoneNumber: { type: 'phone', dataType: 'string' },
10
+ url: { type: 'url', dataType: 'string' },
11
+ currency: { type: 'currency', dataType: 'number' },
12
+ checkbox: { type: 'checkbox', dataType: 'boolean' },
13
+ selectboxes: { type: 'checkbox-group', dataType: 'object' },
14
+ select: { type: 'select', dataType: 'string' },
15
+ radio: { type: 'radio', dataType: 'string' },
16
+ datetime: { type: 'datetime', dataType: 'date' },
17
+ day: { type: 'day', dataType: 'string' },
18
+ time: { type: 'time', dataType: 'string' },
19
+ hidden: { type: 'hidden', dataType: 'string' },
20
+ tags: { type: 'tags', dataType: 'array' },
21
+ file: { type: 'file', dataType: 'array' },
22
+ };
23
+ const LAYOUT_CONTAINERS = new Set(['panel', 'fieldset', 'well']);
24
+ export class LegacyImporter {
25
+ id = 'legacy';
26
+ canImport(input) {
27
+ const candidate = this.unwrap(input);
28
+ return (typeof candidate === 'object' &&
29
+ candidate !== null &&
30
+ Array.isArray(candidate.components));
31
+ }
32
+ import(input) {
33
+ const source = this.unwrap(input);
34
+ if (!this.canImport(source)) {
35
+ throw new ImportError('Input is not a recognizable legacy form definition.', this.id);
36
+ }
37
+ const legacy = source;
38
+ const warnings = [];
39
+ const seenKeys = new Set();
40
+ const fields = this.convertList(legacy.components ?? [], warnings, seenKeys);
41
+ const schema = {
42
+ version: 1,
43
+ ...(legacy.name ? { name: legacy.name } : {}),
44
+ ...(legacy.title ? { title: legacy.title } : {}),
45
+ settings: {
46
+ display: legacy.display === 'wizard' ? 'wizard' : 'form',
47
+ // The legacy dialect clears hidden values by default.
48
+ clearOnHide: true,
49
+ },
50
+ fields,
51
+ };
52
+ return { schema, warnings };
53
+ }
54
+ /** Accepts either the raw definition object or its JSON string. */
55
+ unwrap(input) {
56
+ if (typeof input !== 'string')
57
+ return input;
58
+ try {
59
+ return JSON.parse(input);
60
+ }
61
+ catch {
62
+ return input;
63
+ }
64
+ }
65
+ convertList(components, warnings, seenKeys) {
66
+ const out = [];
67
+ for (const component of components) {
68
+ const node = this.convert(component, warnings, seenKeys);
69
+ if (node)
70
+ out.push(node);
71
+ }
72
+ return out;
73
+ }
74
+ convert(component, warnings, seenKeys) {
75
+ const type = component.type ?? '';
76
+ const key = this.resolveKey(component, warnings, seenKeys);
77
+ // -- static nodes -------------------------------------------------------
78
+ if (type === 'button') {
79
+ return this.withCommon(component, warnings, {
80
+ kind: 'static',
81
+ key,
82
+ type: 'button',
83
+ props: { action: component.action ?? 'submit' },
84
+ });
85
+ }
86
+ if (type === 'content' || type === 'htmlelement') {
87
+ return this.withCommon(component, warnings, {
88
+ kind: 'static',
89
+ key,
90
+ type: 'content',
91
+ content: String(component.html ?? component.content ?? ''),
92
+ });
93
+ }
94
+ // -- containers ---------------------------------------------------------
95
+ if (LAYOUT_CONTAINERS.has(type)) {
96
+ return this.withCommon(component, warnings, {
97
+ kind: 'container',
98
+ key,
99
+ type: type === 'well' ? 'panel' : type,
100
+ dataScope: 'inherit',
101
+ children: this.convertList(component.components ?? [], warnings, seenKeys),
102
+ ...(component.title || component.legend
103
+ ? { label: String(component.title ?? component.legend) }
104
+ : {}),
105
+ });
106
+ }
107
+ if (type === 'columns') {
108
+ const children = [];
109
+ const columns = [];
110
+ for (const column of component.columns ?? []) {
111
+ const converted = this.convertList(column.components ?? [], warnings, seenKeys);
112
+ const indices = converted.map((_, i) => children.length + i);
113
+ children.push(...converted);
114
+ columns.push({ width: column.width ?? 6, children: indices });
115
+ }
116
+ return this.withCommon(component, warnings, {
117
+ kind: 'container',
118
+ key,
119
+ type: 'columns',
120
+ dataScope: 'inherit',
121
+ children,
122
+ columns,
123
+ });
124
+ }
125
+ if (type === 'table') {
126
+ // No table layout in the schema yet: flatten cells row by row.
127
+ warnings.push({
128
+ code: 'degraded-layout',
129
+ message: 'Table layout flattened to a sequential container.',
130
+ source: key,
131
+ });
132
+ const tableRows = component
133
+ .rows ?? [];
134
+ const children = this.convertList(tableRows.flat().flatMap((cell) => cell?.components ?? []), warnings, seenKeys);
135
+ return this.withCommon(component, warnings, {
136
+ kind: 'container',
137
+ key,
138
+ type: 'panel',
139
+ dataScope: 'inherit',
140
+ children,
141
+ });
142
+ }
143
+ if (type === 'container') {
144
+ return this.withCommon(component, warnings, {
145
+ kind: 'container',
146
+ key,
147
+ type: 'group',
148
+ dataScope: 'nested',
149
+ children: this.convertList(component.components ?? [], warnings, seenKeys),
150
+ });
151
+ }
152
+ if (type === 'datagrid' || type === 'editgrid') {
153
+ // Row template keys live in their own scope — dedupe locally.
154
+ const rowKeys = new Set();
155
+ const node = this.withCommon(component, warnings, {
156
+ kind: 'container',
157
+ key,
158
+ type: 'datagrid',
159
+ dataScope: 'array',
160
+ children: this.convertList(component.components ?? [], warnings, rowKeys),
161
+ });
162
+ if (Array.isArray(component.defaultValue) && component.defaultValue.length > 0) {
163
+ node.defaultRows = component.defaultValue;
164
+ }
165
+ return node;
166
+ }
167
+ if (type === 'tabs') {
168
+ const tabs = component
169
+ .components ?? [];
170
+ return this.withCommon(component, warnings, {
171
+ kind: 'container',
172
+ key,
173
+ type: 'tabs',
174
+ dataScope: 'inherit',
175
+ children: tabs.map((tab, i) => ({
176
+ kind: 'container',
177
+ key: tab.key || `${key}-tab-${i + 1}`,
178
+ type: 'panel',
179
+ dataScope: 'inherit',
180
+ ...(tab.label ? { label: tab.label } : {}),
181
+ children: this.convertList(tab.components ?? [], warnings, seenKeys),
182
+ })),
183
+ });
184
+ }
185
+ // -- inputs -------------------------------------------------------------
186
+ const mapped = INPUT_TYPE_MAP[type];
187
+ if (mapped) {
188
+ const input = this.withCommon(component, warnings, {
189
+ kind: 'input',
190
+ key,
191
+ type: mapped.type,
192
+ dataType: component.multiple ? 'array' : mapped.dataType,
193
+ validators: this.convertValidators(component, warnings, key),
194
+ ...(component.placeholder ? { placeholder: component.placeholder } : {}),
195
+ ...(component.defaultValue !== undefined && component.defaultValue !== ''
196
+ ? { defaultValue: component.defaultValue }
197
+ : {}),
198
+ ...(component.multiple ? { multiple: true } : {}),
199
+ });
200
+ const options = this.convertOptions(component);
201
+ if (options)
202
+ input.options = options;
203
+ this.applyOptionsSource(component, input, warnings);
204
+ if (component.customDefaultValue || component.calculateValue) {
205
+ warnings.push({
206
+ code: 'unsupported-value-script',
207
+ message: 'Scripted default/calculated value was not imported; supply it via initial data.',
208
+ source: key,
209
+ });
210
+ input.props = {
211
+ ...(input.props ?? {}),
212
+ valueScript: component.customDefaultValue ?? component.calculateValue,
213
+ };
214
+ }
215
+ if (type === 'email' && !input.validators?.some((v) => v.type === 'email')) {
216
+ input.validators = [...(input.validators ?? []), { type: 'email' }];
217
+ }
218
+ if (type === 'hidden')
219
+ input.hidden = true;
220
+ return input;
221
+ }
222
+ // -- unknown ------------------------------------------------------------
223
+ warnings.push({
224
+ code: 'unknown-type',
225
+ message: `Field type "${type}" is not supported yet; rendered as a read-only placeholder.`,
226
+ source: key,
227
+ });
228
+ if (component.input) {
229
+ return this.withCommon(component, warnings, {
230
+ kind: 'input',
231
+ key,
232
+ type: 'unsupported',
233
+ dataType: 'string',
234
+ props: { sourceType: type },
235
+ });
236
+ }
237
+ return this.withCommon(component, warnings, {
238
+ kind: 'static',
239
+ key,
240
+ type: 'unsupported',
241
+ props: { sourceType: type },
242
+ });
243
+ }
244
+ /** Shared members: label, description, hidden/disabled, condition, props. */
245
+ withCommon(component, warnings, node) {
246
+ if (component.label && !node.label) {
247
+ node.label = component.label;
248
+ }
249
+ if (component.description)
250
+ node.description = component.description;
251
+ if (component.tooltip)
252
+ node.tooltip = component.tooltip;
253
+ if (component.hidden)
254
+ node.hidden = true;
255
+ if (component.disabled)
256
+ node.disabled = true;
257
+ const condition = this.convertCondition(component, warnings, node.key);
258
+ if (condition)
259
+ node.conditional = condition;
260
+ const props = { ...(node.props ?? {}) };
261
+ if (component.prefix)
262
+ props['prefix'] = component.prefix;
263
+ if (component.suffix)
264
+ props['suffix'] = component.suffix;
265
+ if (typeof component.rows === 'number')
266
+ props['rows'] = component.rows;
267
+ if (Object.keys(props).length > 0)
268
+ node.props = props;
269
+ return node;
270
+ }
271
+ convertCondition(component, warnings, key) {
272
+ if (component.customConditional) {
273
+ warnings.push({
274
+ code: 'unsupported-condition',
275
+ message: 'Scripted conditional logic is not imported; field stays visible.',
276
+ source: key,
277
+ });
278
+ }
279
+ const legacy = component.conditional;
280
+ if (!legacy || !legacy.when)
281
+ return undefined;
282
+ const show = legacy.show === true || legacy.show === 'true' || legacy.show === undefined;
283
+ return { show, op: 'eq', field: legacy.when, value: legacy.eq };
284
+ }
285
+ convertValidators(component, warnings, key) {
286
+ const legacy = component.validate ?? {};
287
+ const specs = [];
288
+ const message = component.errorLabel ?? legacy.customMessage;
289
+ const withMessage = (spec) => message ? { ...spec, message } : spec;
290
+ if (legacy.required)
291
+ specs.push(withMessage({ type: 'required' }));
292
+ if (typeof legacy.minLength === 'number') {
293
+ specs.push(withMessage({ type: 'minLength', value: legacy.minLength }));
294
+ }
295
+ if (typeof legacy.maxLength === 'number') {
296
+ specs.push(withMessage({ type: 'maxLength', value: legacy.maxLength }));
297
+ }
298
+ if (legacy.pattern)
299
+ specs.push(withMessage({ type: 'pattern', value: legacy.pattern }));
300
+ if (typeof legacy.min === 'number')
301
+ specs.push(withMessage({ type: 'min', value: legacy.min }));
302
+ if (typeof legacy.max === 'number')
303
+ specs.push(withMessage({ type: 'max', value: legacy.max }));
304
+ if (legacy.custom || legacy.json) {
305
+ warnings.push({
306
+ code: 'unsupported-validation',
307
+ message: 'Scripted validation rule was not imported.',
308
+ source: key,
309
+ });
310
+ }
311
+ return specs;
312
+ }
313
+ convertOptions(component) {
314
+ const values = component.data?.values ?? component.values;
315
+ if (!values || values.length === 0)
316
+ return undefined;
317
+ return values.map((v) => ({
318
+ label: String(v.label ?? v.value ?? ''),
319
+ value: (v.value ?? ''),
320
+ }));
321
+ }
322
+ /**
323
+ * Maps dynamic option sources. Stored scripts are never executed: they
324
+ * become a named provider contract the host fulfills, with the original
325
+ * script preserved (props.optionsScript) for reference during migration.
326
+ */
327
+ applyOptionsSource(component, input, warnings) {
328
+ const dataSrc = component.dataSrc;
329
+ if (!dataSrc || dataSrc === 'values')
330
+ return;
331
+ if (dataSrc === 'json' && Array.isArray(component.data?.json)) {
332
+ input.options = component.data.json.map((item) => ({
333
+ label: String(item['label'] ?? item['value'] ?? ''),
334
+ value: (item['value'] ?? ''),
335
+ }));
336
+ return;
337
+ }
338
+ const refreshOn = component.refreshOn ? { refreshOn: component.refreshOn } : {};
339
+ if (dataSrc === 'url' && component.data?.url) {
340
+ input.optionsSource = {
341
+ type: 'remote',
342
+ url: component.data.url,
343
+ ...(component.valueProperty ? { valueKey: component.valueProperty } : {}),
344
+ ...refreshOn,
345
+ };
346
+ return;
347
+ }
348
+ // 'custom', 'resource' and anything else script/backend-specific become a
349
+ // host-provider contract keyed by the field key.
350
+ input.optionsSource = { type: 'provider', name: input.key, ...refreshOn };
351
+ if (component.data?.custom) {
352
+ input.props = { ...(input.props ?? {}), optionsScript: component.data.custom };
353
+ }
354
+ warnings.push({
355
+ code: 'dynamic-options',
356
+ message: `Options of "${input.key}" are ${dataSrc}-driven in the source; register an options provider named "${input.key}" on the renderer.`,
357
+ source: input.key,
358
+ });
359
+ }
360
+ keyCounter = 0;
361
+ resolveKey(component, warnings, seenKeys) {
362
+ let key = component.key || `${component.type ?? 'field'}-${++this.keyCounter}`;
363
+ if (seenKeys.has(key)) {
364
+ const base = key;
365
+ let n = 2;
366
+ while (seenKeys.has(`${base}-${n}`))
367
+ n++;
368
+ key = `${base}-${n}`;
369
+ warnings.push({
370
+ code: 'duplicate-key',
371
+ message: `Duplicate key "${base}" renamed to "${key}".`,
372
+ source: base,
373
+ });
374
+ }
375
+ seenKeys.add(key);
376
+ return key;
377
+ }
378
+ }
379
+ export function createLegacyImporter() {
380
+ return new LegacyImporter();
381
+ }
382
+ //# sourceMappingURL=legacy-importer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-importer.js","sourceRoot":"","sources":["../../../src/interop/legacy/legacy-importer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Mosaicoo Form — schema model.
3
+ *
4
+ * A `FormSchema` is a plain, serializable description of a form: an ordered
5
+ * tree of field nodes plus form-level settings. It carries no behavior — the
6
+ * engine (`state/`) and the validators (`validation/`) interpret it.
7
+ */
8
+ /** Discriminates the three structural families of nodes. */
9
+ export type FieldKind = 'input' | 'container' | 'static';
10
+ /** Primitive shape of the value an input field produces. */
11
+ export type FieldDataType = 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array';
12
+ /** Option entry for choice-based fields (select, radio, checkbox group…). */
13
+ export interface FieldOption {
14
+ label: string;
15
+ value: string | number | boolean;
16
+ }
17
+ /**
18
+ * Dynamic source for a choice field's options — the declarative replacement
19
+ * for script-populated lists. `remote` fetches a URL returning an array;
20
+ * `provider` calls a named function the HOST registers (authenticated APIs,
21
+ * caching, tenant-aware catalogs). The engine never evaluates stored code.
22
+ */
23
+ export type OptionsSource = {
24
+ type: 'remote';
25
+ url: string;
26
+ labelKey?: string;
27
+ valueKey?: string;
28
+ /** Re-resolve when this data path changes (`data` = any change). */
29
+ refreshOn?: string;
30
+ } | {
31
+ type: 'provider';
32
+ name: string;
33
+ args?: Record<string, unknown>;
34
+ /** Re-resolve when this data path changes (`data` = any change). */
35
+ refreshOn?: string;
36
+ };
37
+ /** Request handed to a host-registered options provider. */
38
+ export interface OptionsRequest {
39
+ field: InputField;
40
+ path: string;
41
+ /** Snapshot of the form data at resolution time. */
42
+ data: Record<string, unknown>;
43
+ args?: Record<string, unknown>;
44
+ }
45
+ export type OptionsProviderFn = (request: OptionsRequest) => Promise<FieldOption[]> | FieldOption[];
46
+ /** Named providers the host supplies to resolve `provider` options sources. */
47
+ export type OptionsProviderRegistry = Record<string, OptionsProviderFn>;
48
+ /** Declarative validation rule attached to an input field. */
49
+ export type ValidatorSpec = {
50
+ type: 'required';
51
+ message?: string;
52
+ } | {
53
+ type: 'minLength';
54
+ value: number;
55
+ message?: string;
56
+ } | {
57
+ type: 'maxLength';
58
+ value: number;
59
+ message?: string;
60
+ } | {
61
+ type: 'pattern';
62
+ value: string;
63
+ message?: string;
64
+ } | {
65
+ type: 'min';
66
+ value: number;
67
+ message?: string;
68
+ } | {
69
+ type: 'max';
70
+ value: number;
71
+ message?: string;
72
+ } | {
73
+ type: 'email';
74
+ message?: string;
75
+ } | {
76
+ type: 'custom';
77
+ name: string;
78
+ args?: Record<string, unknown>;
79
+ message?: string;
80
+ };
81
+ /**
82
+ * Conditional visibility rule.
83
+ *
84
+ * `show: true` means "show when the condition matches" (hide otherwise);
85
+ * `show: false` inverts it. `field` is the data path of the field the
86
+ * condition observes.
87
+ */
88
+ export interface Condition {
89
+ show: boolean;
90
+ op: 'eq' | 'neq';
91
+ field: string;
92
+ value: unknown;
93
+ }
94
+ /** Members shared by every node in the tree. */
95
+ export interface BaseField {
96
+ /**
97
+ * Node identifier. For input fields this is also the data key the value is
98
+ * written to (dot-joined with ancestor group keys to form the data path).
99
+ */
100
+ key: string;
101
+ /** Field type id, e.g. `text`, `select`, `panel`. Drives rendering. */
102
+ type: string;
103
+ label?: string;
104
+ description?: string;
105
+ tooltip?: string;
106
+ /** Statically hidden (never rendered, never validated). */
107
+ hidden?: boolean;
108
+ disabled?: boolean;
109
+ /** Conditional visibility evaluated against the current form data. */
110
+ conditional?: Condition;
111
+ /**
112
+ * Open bag for type-specific presentation props (rows, prefix, currency…)
113
+ * and for importers to preserve source details that have no first-class
114
+ * member yet. Never interpreted by the engine itself.
115
+ */
116
+ props?: Record<string, unknown>;
117
+ }
118
+ /** A value-producing field. */
119
+ export interface InputField extends BaseField {
120
+ kind: 'input';
121
+ dataType: FieldDataType;
122
+ placeholder?: string;
123
+ defaultValue?: unknown;
124
+ /** Choice list for select/radio/checkbox-group style fields. */
125
+ options?: FieldOption[];
126
+ /** Dynamic options source; when resolved, takes precedence over `options`. */
127
+ optionsSource?: OptionsSource;
128
+ /** Accepts multiple values (renders/collects an array). */
129
+ multiple?: boolean;
130
+ validators?: ValidatorSpec[];
131
+ }
132
+ /**
133
+ * A grouping node.
134
+ *
135
+ * Layout containers (`panel`, `fieldset`, `columns`…) do not affect the data
136
+ * shape: children write to the same data scope as the container itself.
137
+ * Setting `dataScope: 'nested'` (type `group`) nests children values under
138
+ * this node's `key`; `dataScope: 'array'` (type `datagrid`) collects an
139
+ * array of rows, `children` acting as the row template.
140
+ */
141
+ export interface ContainerField extends BaseField {
142
+ kind: 'container';
143
+ dataScope: 'inherit' | 'nested' | 'array';
144
+ children: FieldNode[];
145
+ /** Initial rows for `array` containers (defaults to one empty row). */
146
+ defaultRows?: Array<Record<string, unknown>>;
147
+ /**
148
+ * Optional column layout: indexes into `children` per column with a
149
+ * relative width (out of 12). When present, renderers lay children out in
150
+ * columns; the flat `children` order remains the source of truth.
151
+ */
152
+ columns?: Array<{
153
+ width: number;
154
+ children: number[];
155
+ }>;
156
+ }
157
+ /** A non-input node: static content, headings, rich text. */
158
+ export interface StaticField extends BaseField {
159
+ kind: 'static';
160
+ /** Sanitized-at-render HTML or plain text content. */
161
+ content?: string;
162
+ }
163
+ export type FieldNode = InputField | ContainerField | StaticField;
164
+ /** Form-level settings. */
165
+ export interface FormSettings {
166
+ /** Presentation mode. `wizard` renders top-level containers as steps. */
167
+ display?: 'form' | 'wizard';
168
+ /** Clear the value of a field from the data when it becomes hidden. */
169
+ clearOnHide?: boolean;
170
+ }
171
+ /** Root document. */
172
+ export interface FormSchema {
173
+ /** Schema model version, for forward migrations. */
174
+ version: 1;
175
+ id?: string;
176
+ name?: string;
177
+ title?: string;
178
+ settings?: FormSettings;
179
+ fields: FieldNode[];
180
+ }
181
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Mosaicoo Form — schema model.
3
+ *
4
+ * A `FormSchema` is a plain, serializable description of a form: an ordered
5
+ * tree of field nodes plus form-level settings. It carries no behavior — the
6
+ * engine (`state/`) and the validators (`validation/`) interpret it.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,27 @@
1
+ import type { FieldNode, FormSchema, InputField } from './types.js';
2
+ /**
3
+ * A node paired with its data path (dot notation, group scopes applied).
4
+ * Inside `array` containers, paths carry a `*` segment per array level
5
+ * (`grid.*.name`) — a *pattern* to be expanded against the runtime data.
6
+ */
7
+ export interface WalkEntry {
8
+ node: FieldNode;
9
+ /** Data path of the node. For layout containers, the path of their scope. */
10
+ path: string;
11
+ parents: FieldNode[];
12
+ }
13
+ /**
14
+ * Depth-first traversal of a schema, yielding every node with its resolved
15
+ * data path. Layout containers pass their scope through; `nested` containers
16
+ * push their key onto the scope.
17
+ */
18
+ export declare function walkSchema(schema: FormSchema): Generator<WalkEntry>;
19
+ /** Every input field of the schema with its data path. */
20
+ export declare function collectInputs(schema: FormSchema): Array<{
21
+ node: InputField;
22
+ path: string;
23
+ parents: FieldNode[];
24
+ }>;
25
+ /** Find a node by its data path (inputs) or key (containers/static). */
26
+ export declare function findByPath(schema: FormSchema, path: string): WalkEntry | undefined;
27
+ //# sourceMappingURL=walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/schema/walk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAMD;;;;GAIG;AACH,wBAAiB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAEpE;AA8BD,0DAA0D;AAC1D,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC,CAQjE;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CACxB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,SAAS,CAMvB"}