@formwright/core 0.1.0 → 0.2.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/conditions.ts","../src/validation.ts","../src/providers.ts","../src/model.ts","../src/nodes.ts","../src/form.ts"],"names":["isEmpty"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Condition engine — evaluates the sandboxed JSONLogic-style {@link Condition}\n * algebra from a schema against the current form values.\n *\n * It is pure and synchronous: `getValue` reads a field. When the evaluator is\n * called inside an {@link effect}/{@link computed} and `getValue` reads field\n * signals, the result automatically tracks *only* the fields the condition\n * references — so a `visibleWhen` re-evaluates exactly when its inputs change.\n * Conditions are data, never `eval`.\n */\nimport type { Condition, FieldValue } from \"@formwright/schema\";\n\nexport type ValueGetter = (fieldId: string) => FieldValue;\n\nfunction isOp<K extends string>(cond: unknown, key: K): cond is Record<K, unknown> {\n return typeof cond === \"object\" && cond !== null && key in cond;\n}\n\nfunction toNumber(v: unknown): number {\n return typeof v === \"number\" ? v : Number(v);\n}\n\n/** Evaluate a condition to a value (operands) — see {@link evaluateCondition} for the boolean form. */\nfunction evalNode(cond: Condition, get: ValueGetter): unknown {\n // Literals (string/number/boolean/null/array) pass through.\n if (cond === null || typeof cond !== \"object\") return cond;\n if (Array.isArray(cond)) return cond;\n\n if (isOp(cond, \"var\")) return get(String(cond.var));\n\n if (isOp(cond, \"==\")) {\n const [a, b] = cond[\"==\"] as [Condition, Condition];\n return evalNode(a, get) === evalNode(b, get);\n }\n if (isOp(cond, \"!=\")) {\n const [a, b] = cond[\"!=\"] as [Condition, Condition];\n return evalNode(a, get) !== evalNode(b, get);\n }\n if (isOp(cond, \">\")) {\n const [a, b] = cond[\">\"] as [Condition, Condition];\n return toNumber(evalNode(a, get)) > toNumber(evalNode(b, get));\n }\n if (isOp(cond, \">=\")) {\n const [a, b] = cond[\">=\"] as [Condition, Condition];\n return toNumber(evalNode(a, get)) >= toNumber(evalNode(b, get));\n }\n if (isOp(cond, \"<\")) {\n const [a, b] = cond[\"<\"] as [Condition, Condition];\n return toNumber(evalNode(a, get)) < toNumber(evalNode(b, get));\n }\n if (isOp(cond, \"<=\")) {\n const [a, b] = cond[\"<=\"] as [Condition, Condition];\n return toNumber(evalNode(a, get)) <= toNumber(evalNode(b, get));\n }\n if (isOp(cond, \"in\")) {\n const [a, b] = cond[\"in\"] as [Condition, Condition];\n const needle = evalNode(a, get);\n const haystack = evalNode(b, get);\n if (Array.isArray(haystack)) return haystack.includes(needle as FieldValue);\n if (typeof haystack === \"string\") return haystack.includes(String(needle));\n return false;\n }\n if (isOp(cond, \"not\")) {\n return !truthy(evalNode(cond.not as Condition, get));\n }\n if (isOp(cond, \"and\")) {\n return (cond.and as Condition[]).every((c) => truthy(evalNode(c, get)));\n }\n if (isOp(cond, \"or\")) {\n return (cond.or as Condition[]).some((c) => truthy(evalNode(c, get)));\n }\n\n // Unknown object shape — treat as falsy rather than throwing on malformed schemas.\n return false;\n}\n\nfunction truthy(v: unknown): boolean {\n return Boolean(v);\n}\n\n/** Evaluate a condition to a boolean. `undefined` conditions default to `true`. */\nexport function evaluateCondition(\n cond: Condition | undefined,\n get: ValueGetter,\n fallback = true,\n): boolean {\n if (cond === undefined) return fallback;\n return truthy(evalNode(cond, get));\n}\n\n/** Collect the field ids referenced by a condition (for documentation / codegen). */\nexport function referencedFields(cond: Condition | undefined): string[] {\n const ids = new Set<string>();\n const walk = (c: unknown): void => {\n if (c === null || typeof c !== \"object\") return;\n if (Array.isArray(c)) {\n c.forEach(walk);\n return;\n }\n const rec = c as Record<string, unknown>;\n if (\"var\" in rec) {\n ids.add(String(rec[\"var\"]));\n return;\n }\n for (const v of Object.values(rec)) walk(v);\n };\n if (cond !== undefined) walk(cond);\n return [...ids];\n}\n","/**\n * Field-level validation — turns a declarative {@link ValidationSchema} into a\n * pure validator `(value) => error | null`.\n *\n * This covers the zero-config built-ins. For richer rules, a field can instead\n * carry any Standard-Schema-compatible validator (Zod/Valibot/ArkType); the Form\n * runs whichever is present. Kept dependency-free here so `@formwright/core`\n * ships with no required runtime deps.\n */\nimport type { FieldValue, ValidationSchema } from \"@formwright/schema\";\n\nexport type FieldValidator = (value: FieldValue) => string | null;\n\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst URL = /^https?:\\/\\/[^\\s]+$/;\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction isEmpty(value: FieldValue): boolean {\n return value === undefined || value === null || value === \"\";\n}\n\n/** Compile a declarative validation descriptor into a validator function. */\nexport function compileValidator(schema: ValidationSchema): FieldValidator {\n return (value: FieldValue): string | null => {\n const msg = (fallback: string): string =>\n typeof schema.message === \"string\" ? schema.message : fallback;\n\n if (isEmpty(value)) {\n return schema.required ? msg(\"This field is required\") : null;\n }\n\n if (schema.kind === \"string\" || schema.format) {\n const str = String(value);\n if (schema.minLength !== undefined && str.length < schema.minLength) {\n return msg(`Must be at least ${schema.minLength} characters`);\n }\n if (schema.maxLength !== undefined && str.length > schema.maxLength) {\n return msg(`Must be at most ${schema.maxLength} characters`);\n }\n if (schema.pattern !== undefined && !new RegExp(schema.pattern).test(str)) {\n return msg(\"Invalid format\");\n }\n if (schema.format === \"email\" && !EMAIL.test(str)) return msg(\"Enter a valid email\");\n if (schema.format === \"url\" && !URL.test(str)) return msg(\"Enter a valid URL\");\n if (schema.format === \"uuid\" && !UUID.test(str)) return msg(\"Enter a valid UUID\");\n }\n\n if (schema.kind === \"number\") {\n const num = Number(value);\n if (Number.isNaN(num)) return msg(\"Must be a number\");\n if (schema.min !== undefined && num < schema.min) return msg(`Must be ≥ ${schema.min}`);\n if (schema.max !== undefined && num > schema.max) return msg(`Must be ≤ ${schema.max}`);\n }\n\n return null;\n };\n}\n","/**\n * Provider system — the host app injects integrations (i18n, data fetching,\n * theming) that the schema references via sigils (`{ $t }`, `{ $query }`,\n * `{ $theme }`). Providers expose plain functions (optionally signal-backed),\n * so when a locale changes or a query resolves, only bound nodes update.\n */\nimport type { FieldOption, FieldValue, ProviderRef, Resolvable } from \"@formwright/schema\";\nimport type { ReadSignal } from \"./reactive.js\";\n\nexport interface I18nProvider {\n /** Translate a key with optional interpolation args. */\n t(key: string, args?: Record<string, FieldValue>): string;\n}\n\nexport interface QueryResult<T> {\n readonly data: T | undefined;\n readonly loading: boolean;\n readonly error: unknown;\n}\n\nexport interface QueryProvider {\n /** Return a reactive query result for a key and optional params. */\n query<T = unknown>(key: string, params?: Record<string, unknown>): ReadSignal<QueryResult<T>>;\n}\n\nexport interface ThemeProvider {\n token(name: string): string;\n}\n\nexport interface Providers {\n readonly i18n?: I18nProvider;\n readonly query?: QueryProvider;\n readonly theme?: ThemeProvider;\n readonly [name: string]: unknown;\n}\n\nfunction isProviderRef(value: unknown): value is ProviderRef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (\"$t\" in value || \"$query\" in value || \"$theme\" in value)\n );\n}\n\n/**\n * Resolve a {@link Resolvable} to a concrete value using the available providers.\n * Literals pass through; sigils dispatch to the matching provider. Unresolved\n * refs fall back to a readable string so the form still renders.\n */\nexport function resolve<T extends FieldValue | readonly FieldOption[]>(\n value: Resolvable<T> | undefined,\n providers: Providers | undefined,\n): T | undefined {\n if (value === undefined) return undefined;\n if (!isProviderRef(value)) return value;\n\n if (\"$t\" in value) {\n const i18n = providers?.i18n;\n return (i18n ? i18n.t(value.$t, value.args) : value.$t) as T;\n }\n if (\"$theme\" in value) {\n const theme = providers?.theme;\n return (theme ? theme.token(value.$theme) : value.$theme) as T;\n }\n // $query is async/reactive and resolved by the renderer via resolveQuery.\n return undefined;\n}\n\n/** Resolve a `$query` ref to its reactive result signal, or `null` if not a query ref. */\nexport function resolveQuery(\n value: unknown,\n providers: Providers | undefined,\n): ReadSignal<QueryResult<unknown>> | null {\n if (!isProviderRef(value) || !(\"$query\" in value)) return null;\n const provider = providers?.query;\n if (!provider) return null;\n const spec = value.$query;\n if (typeof spec === \"string\") return provider.query(spec);\n const [key, params] = spec;\n return provider.query(key, params);\n}\n\nexport { isProviderRef };\n","/**\n * Reactive per-field model. Each {@link FieldState} owns the signals for one\n * field — its value, error, and touched flag — plus computed `visible`,\n * `enabled`, and `required` derived from the schema's conditions. The renderer\n * binds directly to these signals, so a change updates only the affected nodes.\n */\nimport type { FieldSchema, FieldValue } from \"@formwright/schema\";\nimport { computed, signal, type ReadSignal, type WriteSignal } from \"./reactive.js\";\nimport { evaluateCondition, type ValueGetter } from \"./conditions.js\";\nimport { compileValidator, type FieldValidator } from \"./validation.js\";\n\n/** Default value for a leaf field with no explicit initial/default. */\nexport function defaultValueFor(type: string): FieldValue {\n switch (type) {\n case \"checkbox\":\n return false;\n case \"number\":\n return undefined;\n default:\n return \"\";\n }\n}\n\nexport class FieldState {\n /** Discriminant for the {@link FieldNode} union (leaf vs group/collection). */\n readonly kind = \"field\" as const;\n readonly id: string;\n readonly schema: FieldSchema;\n readonly value: WriteSignal<FieldValue>;\n readonly error: WriteSignal<string | null>;\n readonly touched: WriteSignal<boolean>;\n readonly visible: ReadSignal<boolean>;\n readonly enabled: ReadSignal<boolean>;\n readonly required: ReadSignal<boolean>;\n\n private readonly validator: FieldValidator | null;\n\n constructor(schema: FieldSchema, initial: FieldValue, getValue: ValueGetter) {\n this.id = schema.id;\n this.schema = schema;\n this.value = signal<FieldValue>(initial);\n this.error = signal<string | null>(null);\n this.touched = signal(false);\n this.validator = schema.validation ? compileValidator(schema.validation) : null;\n\n this.visible = computed(() => evaluateCondition(schema.visibleWhen, getValue, true));\n this.enabled = computed(() => evaluateCondition(schema.enabledWhen, getValue, true));\n this.required = computed(() => {\n if (schema.requiredWhen !== undefined) {\n return evaluateCondition(schema.requiredWhen, getValue, false);\n }\n return schema.validation?.required ?? false;\n });\n }\n\n /** Run validation, store and return the error (or null). Hidden fields never error. */\n validate(): string | null {\n if (!this.visible.peek()) {\n this.error.set(null);\n return null;\n }\n let result: string | null = null;\n if (this.required.peek() && isEmpty(this.value.peek())) {\n result = \"This field is required\";\n } else if (this.validator) {\n result = this.validator(this.value.peek());\n }\n this.error.set(result);\n return result;\n }\n\n reset(value: FieldValue): void {\n this.value.set(value);\n this.error.set(null);\n this.touched.set(false);\n }\n}\n\nfunction isEmpty(value: FieldValue): boolean {\n return value === undefined || value === null || value === \"\";\n}\n","/**\n * Nested field tree — `group` (object) and `collection` (array-of-groups) nodes\n * on top of the leaf {@link FieldState}.\n *\n * Names in conditions resolve **lexically**: a child first looks among its own\n * siblings, then walks up the enclosing {@link Scope} chain to the form root. So\n * a field nested inside a group or a collection row can be hidden by an outer\n * toggle (`{ var: \"showDetails\" }`) *and* by a sibling in the same row — without\n * any path syntax. Hidden fields keep their value in the aggregated payload but\n * are skipped by validation.\n */\nimport type { FieldSchema, FieldValue } from \"@formwright/schema\";\nimport { computed, signal, type ReadSignal, type WriteSignal } from \"./reactive.js\";\nimport { evaluateCondition, type ValueGetter } from \"./conditions.js\";\nimport { FieldState, defaultValueFor } from \"./model.js\";\n\n/** A node in the field tree: a leaf field, a nested object, or a repeatable list. */\nexport type FieldNode = FieldState | GroupNode | CollectionNode;\n\n/** Resolves a referenced field name to its current value, walking enclosing scopes. */\nexport type Scope = ValueGetter;\n\ntype Dict = Record<string, unknown>;\n\n/** Current value of any node (subscribes the caller). */\nfunction nodeValue(node: FieldNode): unknown {\n return node.value.get();\n}\n\n/**\n * Aggregate children into an object. All declared fields are included (hidden\n * fields keep their value in the payload, matching native form behavior); hidden\n * fields are simply skipped by validation, not dropped from the data.\n */\nfunction collectValues(nodes: readonly FieldNode[]): Dict {\n const out: Dict = {};\n for (const node of nodes) out[node.id] = nodeValue(node);\n return out;\n}\n\n/** Build sibling nodes that share `scope`, seeding each from `initial`. */\nfunction buildNodes(\n schemas: readonly FieldSchema[],\n scope: Scope,\n initial: Dict,\n): { nodes: FieldNode[]; byName: Map<string, FieldNode> } {\n const nodes: FieldNode[] = [];\n const byName = new Map<string, FieldNode>();\n for (const schema of schemas) {\n let node: FieldNode;\n if (schema.type === \"group\") {\n node = new GroupNode(schema, scope, asDict(initial[schema.id]));\n } else if (schema.type === \"collection\") {\n node = new CollectionNode(schema, scope, asArray(initial[schema.id]));\n } else {\n const init = initial[schema.id] ?? schema.defaultValue ?? defaultValueFor(schema.type);\n node = new FieldState(schema, init as FieldValue, scope);\n }\n nodes.push(node);\n byName.set(schema.id, node);\n }\n return { nodes, byName };\n}\n\nfunction asDict(v: unknown): Dict {\n return v !== null && typeof v === \"object\" && !Array.isArray(v) ? (v as Dict) : {};\n}\nfunction asArray(v: unknown): Dict[] {\n return Array.isArray(v) ? (v as Dict[]) : [];\n}\n\n/** Reset a sibling list in place from a fresh `initial` object. */\nfunction resetNodes(nodes: readonly FieldNode[], initial: Dict): void {\n for (const node of nodes) {\n if (node.kind === \"field\") {\n const init =\n initial[node.id] ?? node.schema.defaultValue ?? defaultValueFor(node.schema.type);\n node.reset(init as FieldValue);\n } else if (node.kind === \"group\") {\n node.reset(asDict(initial[node.id]));\n } else {\n node.reset(asArray(initial[node.id]));\n }\n }\n}\n\n/** A nested object field: produces `{ ...visible child values }`. */\nexport class GroupNode {\n readonly kind = \"group\" as const;\n readonly id: string;\n readonly schema: FieldSchema;\n readonly children: readonly FieldNode[];\n readonly byName: ReadonlyMap<string, FieldNode>;\n readonly value: ReadSignal<Dict>;\n readonly visible: ReadSignal<boolean>;\n readonly enabled: ReadSignal<boolean>;\n\n /** The scope a child uses: resolve a name among siblings, else delegate upward. */\n readonly scope: Scope;\n\n constructor(schema: FieldSchema, parentScope: Scope, initial: Dict) {\n this.id = schema.id;\n this.schema = schema;\n this.scope = (name) => {\n const child = this.byName.get(name);\n return child ? (nodeValue(child) as FieldValue) : parentScope(name);\n };\n const built = buildNodes(schema.fields ?? [], this.scope, initial);\n this.children = built.nodes;\n this.byName = built.byName;\n this.value = computed(() => collectValues(this.children));\n this.visible = computed(() => evaluateCondition(schema.visibleWhen, parentScope, true));\n this.enabled = computed(() => evaluateCondition(schema.enabledWhen, parentScope, true));\n }\n\n reset(initial: Dict): void {\n resetNodes(this.children, initial);\n }\n}\n\n/** One row of a {@link CollectionNode}: a group with a stable identity key. */\nexport interface CollectionItem {\n readonly key: number;\n readonly group: GroupNode;\n}\n\n/** A repeatable list of object rows: produces `[{ ... }, { ... }]`. */\nexport class CollectionNode {\n readonly kind = \"collection\" as const;\n readonly id: string;\n readonly schema: FieldSchema;\n readonly value: ReadSignal<Dict[]>;\n readonly visible: ReadSignal<boolean>;\n readonly enabled: ReadSignal<boolean>;\n\n private readonly rows: WriteSignal<CollectionItem[]>;\n private readonly parentScope: Scope;\n private readonly itemSchema: FieldSchema;\n private seq = 0;\n\n constructor(schema: FieldSchema, parentScope: Scope, initial: Dict[]) {\n this.id = schema.id;\n this.schema = schema;\n this.parentScope = parentScope;\n // Each row is a group over the collection's child fields; the row carries no\n // visibility condition of its own (that belongs to the whole collection).\n this.itemSchema = { id: schema.id, type: \"group\", fields: schema.fields ?? [] };\n\n const seed = this.seedRows(initial);\n this.rows = signal(seed);\n this.value = computed(() => this.rows.get().map((row) => row.group.value.get()));\n this.visible = computed(() => evaluateCondition(schema.visibleWhen, parentScope, true));\n this.enabled = computed(() => evaluateCondition(schema.enabledWhen, parentScope, true));\n }\n\n /** Reactive list of rows (subscribes the caller to add/remove). */\n get items(): ReadSignal<CollectionItem[]> {\n return this.rows;\n }\n\n private makeItem(initial: Dict): CollectionItem {\n return { key: this.seq++, group: new GroupNode(this.itemSchema, this.parentScope, initial) };\n }\n\n private seedRows(initial: Dict[]): CollectionItem[] {\n const rows = initial.map((row) => this.makeItem(row));\n const min = this.schema.minItems ?? 0;\n while (rows.length < min) rows.push(this.makeItem({}));\n return rows;\n }\n\n /** Append a new empty row, unless `maxItems` is reached. */\n add(): void {\n const max = this.schema.maxItems;\n if (max !== undefined && this.rows.peek().length >= max) return;\n this.rows.update((rows) => [...rows, this.makeItem({})]);\n }\n\n /** Remove the row at `index`, unless `minItems` would be violated. */\n removeAt(index: number): void {\n const min = this.schema.minItems ?? 0;\n if (this.rows.peek().length <= min) return;\n this.rows.update((rows) => rows.filter((_, i) => i !== index));\n }\n\n reset(initial: Dict[]): void {\n this.seq = 0;\n this.rows.set(this.seedRows(initial));\n }\n}\n\n/** Build the top-level field tree for a form, rooted at `rootScope`. */\nexport function buildTree(\n schemas: readonly FieldSchema[],\n initial: Dict,\n): { nodes: FieldNode[]; byName: Map<string, FieldNode>; scope: Scope } {\n let byName: Map<string, FieldNode>;\n const scope: Scope = (name) => {\n const node = byName.get(name);\n return node ? (nodeValue(node) as FieldValue) : undefined;\n };\n const built = buildNodes(schemas, scope, initial);\n byName = built.byName;\n return { nodes: built.nodes, byName, scope };\n}\n\n/** Visit every leaf {@link FieldState} in a node list (descends groups/collections). */\nexport function eachLeaf(nodes: readonly FieldNode[], visit: (leaf: FieldState) => void): void {\n for (const node of nodes) {\n if (node.kind === \"field\") visit(node);\n else if (node.kind === \"group\") eachLeaf(node.children, visit);\n else for (const row of node.items.peek()) eachLeaf(row.group.children, visit);\n }\n}\n\nexport { collectValues, resetNodes };\n","/**\n * The {@link Form} class — Formwright's public, class-based, imperative API.\n *\n * const form = new Form(schema, { email: \"\" }, options);\n * form.mount(document.getElementById(\"root\")!);\n * await form.submit();\n *\n * The instance owns the reactive field graph, validation, the condition engine,\n * provider wiring, and the submission pipeline. It is render-agnostic: `mount`\n * delegates to a registered renderer (e.g. `@formwright/dom`), so the same\n * instance can drive the DOM, a web component, or a framework adapter.\n */\nimport { parseSchema, type FieldValue, type FormSchema } from \"@formwright/schema\";\nimport { batch, computed, signal, untrack, type Dispose, type ReadSignal } from \"./reactive.js\";\nimport { FieldState } from \"./model.js\";\nimport {\n buildTree,\n collectValues,\n eachLeaf,\n resetNodes,\n CollectionNode,\n GroupNode,\n type FieldNode,\n} from \"./nodes.js\";\nimport type { Providers } from \"./providers.js\";\n\n/** Form values — nested for `group` (object) and `collection` (array) fields. */\nexport type FormValues = Record<string, unknown>;\nexport type FormErrors = Record<string, string | null>;\n\n/** A transform applied to values before submission. */\nexport type Transform = (values: FormValues, form: Form) => unknown;\n/** Handlers referenced by name from the schema's `submit` block. */\nexport type SuccessHandler = (result: unknown, form: Form) => void;\nexport type ErrorHandler = (error: unknown, form: Form) => void;\n\nexport interface FormOptions {\n readonly providers?: Providers;\n readonly transforms?: Record<string, Transform>;\n readonly handlers?: Record<string, SuccessHandler | ErrorHandler>;\n /** Override the network send (defaults to `fetch` against `submit.endpoint`). */\n readonly send?: (payload: unknown, form: Form) => Promise<unknown>;\n}\n\n/** Renders a {@link Form} into a host node; returns a disposer. Provided by a renderer package. */\nexport interface FormRenderer {\n mount(form: Form, host: Element): Dispose;\n}\n\ntype EventName = \"submit\" | \"success\" | \"error\" | \"change\";\ntype Listener = (payload: unknown) => void;\n\nlet defaultRenderer: FormRenderer | null = null;\n\n/** Register the renderer used by {@link Form.mount} when none is passed explicitly. */\nexport function setDefaultRenderer(renderer: FormRenderer): void {\n defaultRenderer = renderer;\n}\n\nexport class Form {\n readonly schema: FormSchema;\n readonly options: FormOptions;\n /** Top-level field tree (leaf fields, groups, and collections, in order). */\n readonly tree: readonly FieldNode[];\n readonly order: readonly string[];\n\n /** Reactive snapshot of all field values (nested for groups/collections). */\n readonly values: ReadSignal<FormValues>;\n /** True when the current values differ from the initial values. */\n readonly isDirty: ReadSignal<boolean>;\n /** True when no visible field currently has an error. */\n readonly isValid: ReadSignal<boolean>;\n\n private readonly submitting = signal(false);\n private readonly initialValues: FormValues;\n private readonly initialSnapshot: string;\n private readonly rootByName: ReadonlyMap<string, FieldNode>;\n private readonly listeners = new Map<EventName, Set<Listener>>();\n private disposeRenderer: Dispose | null = null;\n\n constructor(\n schema: FormSchema | unknown,\n initialValues: FormValues = {},\n options: FormOptions = {},\n ) {\n // Always validate: parseSchema passes valid schemas through unchanged and\n // throws a precise SchemaValidationError otherwise (key for LLM-emitted input).\n this.schema = parseSchema(schema);\n this.options = options;\n this.initialValues = initialValues;\n\n const tree = buildTree(this.schema.fields, initialValues);\n this.tree = tree.nodes;\n this.rootByName = tree.byName;\n this.order = this.schema.fields.map((f) => f.id);\n\n this.values = computed(() => collectTree(this.tree));\n this.initialSnapshot = JSON.stringify(untrack(() => this.values.peek()));\n this.isDirty = computed(() => JSON.stringify(this.values.get()) !== this.initialSnapshot);\n this.isValid = computed(() => {\n let valid = true;\n eachLeaf(this.tree, (leaf) => {\n if (leaf.visible.get() && leaf.error.get() !== null) valid = false;\n });\n return valid;\n });\n }\n\n // ---- value access -------------------------------------------------------\n\n /** All leaf fields keyed by dotted path (e.g. `items.name`, `contacts.0.email`). */\n get fields(): ReadonlyMap<string, FieldState> {\n return collectLeaves(this.tree);\n }\n\n /** Resolve a leaf field by dotted path. Top-level ids work directly. */\n field(path: string): FieldState | undefined {\n return resolveLeaf(this.tree, this.rootByName, path);\n }\n\n getValue(path: string): FieldValue {\n return this.field(path)?.value.peek();\n }\n\n setValue(path: string, value: FieldValue): void {\n const field = this.field(path);\n if (field) this.setFieldValue(field, value);\n }\n\n /** Apply a value to a specific leaf node (used by the renderer). */\n setFieldValue(field: FieldState, value: FieldValue): void {\n field.value.set(value);\n field.touched.set(true);\n if (field.error.peek() !== null) field.validate(); // re-validate once shown an error\n this.emit(\"change\", { id: field.id, value });\n }\n\n setError(id: string, error: string | null): void {\n this.field(id)?.error.set(error);\n }\n\n setErrors(errors: FormErrors): void {\n batch(() => {\n for (const [id, error] of Object.entries(errors)) this.setError(id, error);\n });\n }\n\n get isSubmitting(): ReadSignal<boolean> {\n return this.submitting;\n }\n\n // ---- lifecycle ----------------------------------------------------------\n\n /** Validate every (visible) leaf field; returns true when the whole form is valid. */\n validate(): boolean {\n return untrack(() => {\n let ok = true;\n batch(() => {\n eachLeaf(this.tree, (leaf) => {\n if (leaf.validate() !== null) ok = false;\n });\n });\n return ok;\n });\n }\n\n /** Run the submission pipeline: validate → transform → send → onSuccess/onError. */\n async submit(): Promise<unknown> {\n if (!this.validate()) {\n const error = new FormValidationError(this.collectErrors());\n this.runErrorHandler(error);\n this.emit(\"error\", error);\n throw error;\n }\n\n this.submitting.set(true);\n const values = untrack(() => this.values.peek());\n const payload = this.applyTransform(values);\n this.emit(\"submit\", payload);\n\n try {\n const result = await this.send(payload);\n this.runSuccessHandler(result);\n this.emit(\"success\", result);\n return result;\n } catch (error) {\n this.runErrorHandler(error);\n this.emit(\"error\", error);\n throw error;\n } finally {\n this.submitting.set(false);\n }\n }\n\n reset(values: FormValues = this.initialValues): void {\n batch(() => {\n resetNodes(this.tree, values as Record<string, unknown>);\n });\n }\n\n /** Mount into a host element using the given renderer (or the registered default). */\n mount(host: Element, renderer: FormRenderer | null = defaultRenderer): Dispose {\n if (!renderer) {\n throw new Error(\n \"No renderer available. Import '@formwright/dom' or pass a renderer to Form.mount().\",\n );\n }\n this.disposeRenderer?.();\n this.disposeRenderer = renderer.mount(this, host);\n return this.disposeRenderer;\n }\n\n destroy(): void {\n this.disposeRenderer?.();\n this.disposeRenderer = null;\n this.listeners.clear();\n }\n\n // ---- events -------------------------------------------------------------\n\n on(event: EventName, listener: Listener): Dispose {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener);\n return () => set.delete(listener);\n }\n\n private emit(event: EventName, payload: unknown): void {\n const set = this.listeners.get(event);\n if (set) for (const listener of [...set]) listener(payload);\n }\n\n // ---- internals ----------------------------------------------------------\n\n private collectErrors(): FormErrors {\n const errors: FormErrors = {};\n for (const [path, field] of this.fields) errors[path] = field.error.peek();\n return errors;\n }\n\n private applyTransform(values: FormValues): unknown {\n const name = this.schema.submit?.transform;\n const transform = name ? this.options.transforms?.[name] : undefined;\n return transform ? transform(values, this) : values;\n }\n\n private async send(payload: unknown): Promise<unknown> {\n if (this.options.send) return this.options.send(payload, this);\n const endpoint = this.schema.submit?.endpoint;\n if (!endpoint) return payload; // no transport configured: succeed with the payload\n const init: RequestInit = {\n method: endpoint.method,\n headers: { \"content-type\": \"application/json\" },\n };\n if (endpoint.method !== \"GET\") init.body = JSON.stringify(payload);\n const response = await fetch(endpoint.url, init);\n if (!response.ok) throw new Error(`Request failed: ${response.status}`);\n const text = await response.text();\n return text ? JSON.parse(text) : undefined;\n }\n\n private runSuccessHandler(result: unknown): void {\n const name = this.schema.submit?.onSuccess;\n const handler = name ? this.options.handlers?.[name] : undefined;\n (handler as SuccessHandler | undefined)?.(result, this);\n }\n\n private runErrorHandler(error: unknown): void {\n const name = this.schema.submit?.onError;\n const handler = name ? this.options.handlers?.[name] : undefined;\n (handler as ErrorHandler | undefined)?.(error, this);\n }\n}\n\nexport class FormValidationError extends Error {\n readonly errors: FormErrors;\n constructor(errors: FormErrors) {\n super(\"Form validation failed\");\n this.name = \"FormValidationError\";\n this.errors = errors;\n }\n}\n\n/** Aggregate the tree into a nested values object (subscribes to all values). */\nfunction collectTree(tree: readonly FieldNode[]): FormValues {\n return collectValues(tree) as FormValues;\n}\n\n/** Flatten all leaf fields, keyed by dotted path (`group.child`, `coll.0.child`). */\nfunction collectLeaves(tree: readonly FieldNode[]): Map<string, FieldState> {\n const out = new Map<string, FieldState>();\n const walk = (nodes: readonly FieldNode[], prefix: string): void => {\n for (const node of nodes) {\n const path = prefix ? `${prefix}.${node.id}` : node.id;\n if (node.kind === \"field\") out.set(path, node);\n else if (node.kind === \"group\") walk(node.children, path);\n else {\n node.items.peek().forEach((row, i) => walk(row.group.children, `${path}.${i}`));\n }\n }\n };\n walk(tree, \"\");\n return out;\n}\n\n/** Resolve a leaf field by dotted path, descending groups and collection rows. */\nfunction resolveLeaf(\n tree: readonly FieldNode[],\n rootByName: ReadonlyMap<string, FieldNode>,\n path: string,\n): FieldState | undefined {\n const parts = path.split(\".\");\n let node: FieldNode | undefined = rootByName.get(parts[0]!);\n for (let i = 1; i < parts.length && node; i++) {\n const part = parts[i]!;\n if (node instanceof GroupNode) {\n node = node.byName.get(part) as FieldNode | undefined;\n } else if (node instanceof CollectionNode) {\n node = node.items.peek()[Number(part)]?.group;\n } else {\n return undefined;\n }\n }\n return node && node.kind === \"field\" ? node : undefined;\n}\n"]}
1
+ {"version":3,"sources":["../src/conditions.ts","../src/validation.ts","../src/providers.ts","../src/model.ts","../src/nodes.ts","../src/form.ts"],"names":["isEmpty"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Condition engine — evaluates the sandboxed JSONLogic-style {@link Condition}\n * algebra from a schema against the current form values.\n *\n * It is pure and synchronous: `getValue` reads a field. When the evaluator is\n * called inside an {@link effect}/{@link computed} and `getValue` reads field\n * signals, the result automatically tracks *only* the fields the condition\n * references — so a `visibleWhen` re-evaluates exactly when its inputs change.\n * Conditions are data, never `eval`.\n */\nimport type { Condition, FieldValue } from \"@formwright/schema\";\n\nexport type ValueGetter = (fieldId: string) => FieldValue;\n\nfunction isOp<K extends string>(cond: unknown, key: K): cond is Record<K, unknown> {\n return typeof cond === \"object\" && cond !== null && key in cond;\n}\n\nfunction toNumber(v: unknown): number {\n return typeof v === \"number\" ? v : Number(v);\n}\n\n/** Evaluate a condition to a value (operands) — see {@link evaluateCondition} for the boolean form. */\nfunction evalNode(cond: Condition, get: ValueGetter): unknown {\n // Literals (string/number/boolean/null/array) pass through.\n if (cond === null || typeof cond !== \"object\") return cond;\n if (Array.isArray(cond)) return cond;\n\n if (isOp(cond, \"var\")) return get(String(cond.var));\n\n if (isOp(cond, \"==\")) {\n const [a, b] = cond[\"==\"] as [Condition, Condition];\n return evalNode(a, get) === evalNode(b, get);\n }\n if (isOp(cond, \"!=\")) {\n const [a, b] = cond[\"!=\"] as [Condition, Condition];\n return evalNode(a, get) !== evalNode(b, get);\n }\n if (isOp(cond, \">\")) {\n const [a, b] = cond[\">\"] as [Condition, Condition];\n return toNumber(evalNode(a, get)) > toNumber(evalNode(b, get));\n }\n if (isOp(cond, \">=\")) {\n const [a, b] = cond[\">=\"] as [Condition, Condition];\n return toNumber(evalNode(a, get)) >= toNumber(evalNode(b, get));\n }\n if (isOp(cond, \"<\")) {\n const [a, b] = cond[\"<\"] as [Condition, Condition];\n return toNumber(evalNode(a, get)) < toNumber(evalNode(b, get));\n }\n if (isOp(cond, \"<=\")) {\n const [a, b] = cond[\"<=\"] as [Condition, Condition];\n return toNumber(evalNode(a, get)) <= toNumber(evalNode(b, get));\n }\n if (isOp(cond, \"in\")) {\n const [a, b] = cond[\"in\"] as [Condition, Condition];\n const needle = evalNode(a, get);\n const haystack = evalNode(b, get);\n if (Array.isArray(haystack)) return haystack.includes(needle as FieldValue);\n if (typeof haystack === \"string\") return haystack.includes(String(needle));\n return false;\n }\n if (isOp(cond, \"not\")) {\n return !truthy(evalNode(cond.not as Condition, get));\n }\n if (isOp(cond, \"and\")) {\n return (cond.and as Condition[]).every((c) => truthy(evalNode(c, get)));\n }\n if (isOp(cond, \"or\")) {\n return (cond.or as Condition[]).some((c) => truthy(evalNode(c, get)));\n }\n\n // Unknown object shape — treat as falsy rather than throwing on malformed schemas.\n return false;\n}\n\nfunction truthy(v: unknown): boolean {\n return Boolean(v);\n}\n\n/** Evaluate a condition to a boolean. `undefined` conditions default to `true`. */\nexport function evaluateCondition(\n cond: Condition | undefined,\n get: ValueGetter,\n fallback = true,\n): boolean {\n if (cond === undefined) return fallback;\n return truthy(evalNode(cond, get));\n}\n\n/** Collect the field ids referenced by a condition (for documentation / codegen). */\nexport function referencedFields(cond: Condition | undefined): string[] {\n const ids = new Set<string>();\n const walk = (c: unknown): void => {\n if (c === null || typeof c !== \"object\") return;\n if (Array.isArray(c)) {\n c.forEach(walk);\n return;\n }\n const rec = c as Record<string, unknown>;\n if (\"var\" in rec) {\n ids.add(String(rec[\"var\"]));\n return;\n }\n for (const v of Object.values(rec)) walk(v);\n };\n if (cond !== undefined) walk(cond);\n return [...ids];\n}\n","/**\n * Field-level validation — turns a declarative {@link ValidationSchema} into a\n * pure validator `(value) => error | null`.\n *\n * This covers the zero-config built-ins. For richer rules, a field can instead\n * carry any Standard-Schema-compatible validator (Zod/Valibot/ArkType); the Form\n * runs whichever is present. Kept dependency-free here so `@formwright/core`\n * ships with no required runtime deps.\n */\nimport type { FieldValue, ValidationSchema } from \"@formwright/schema\";\n\nexport type FieldValidator = (value: FieldValue) => string | null;\n\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst URL = /^https?:\\/\\/[^\\s]+$/;\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction isEmpty(value: FieldValue): boolean {\n return value === undefined || value === null || value === \"\";\n}\n\ntype Rule = NonNullable<ValidationSchema[\"messages\"]>;\n\n/** Compile a declarative validation descriptor into a validator function. */\nexport function compileValidator(schema: ValidationSchema): FieldValidator {\n const overrides = schema.messages ?? {};\n // A per-rule override wins; then the catch-all `message`; then the built-in default.\n const msg = (rule: keyof Rule, fallback: string): string =>\n overrides[rule] ?? (typeof schema.message === \"string\" ? schema.message : fallback);\n\n return (value: FieldValue): string | null => {\n if (isEmpty(value)) {\n return schema.required ? msg(\"required\", \"This field is required\") : null;\n }\n\n if (schema.kind === \"string\" || schema.format) {\n const str = String(value);\n if (schema.minLength !== undefined && str.length < schema.minLength) {\n return msg(\"minLength\", `Must be at least ${schema.minLength} characters`);\n }\n if (schema.maxLength !== undefined && str.length > schema.maxLength) {\n return msg(\"maxLength\", `Must be at most ${schema.maxLength} characters`);\n }\n if (schema.pattern !== undefined && !new RegExp(schema.pattern).test(str)) {\n return msg(\"pattern\", \"Invalid format\");\n }\n if (schema.format === \"email\" && !EMAIL.test(str))\n return msg(\"format\", \"Enter a valid email\");\n if (schema.format === \"url\" && !URL.test(str)) return msg(\"format\", \"Enter a valid URL\");\n if (schema.format === \"uuid\" && !UUID.test(str)) return msg(\"format\", \"Enter a valid UUID\");\n }\n\n if (schema.kind === \"number\") {\n const num = Number(value);\n if (Number.isNaN(num)) return msg(\"type\", \"Must be a number\");\n if (schema.min !== undefined && num < schema.min)\n return msg(\"min\", `Must be ≥ ${schema.min}`);\n if (schema.max !== undefined && num > schema.max)\n return msg(\"max\", `Must be ≤ ${schema.max}`);\n }\n\n return null;\n };\n}\n\n/** Resolve the message for a missing required value, honoring overrides. */\nexport function requiredMessage(schema: ValidationSchema | undefined): string {\n return (\n schema?.messages?.required ??\n (typeof schema?.message === \"string\" ? schema.message : \"This field is required\")\n );\n}\n","/**\n * Provider system — the host app injects integrations (i18n, data fetching,\n * theming) that the schema references via sigils (`{ $t }`, `{ $query }`,\n * `{ $theme }`). Providers expose plain functions (optionally signal-backed),\n * so when a locale changes or a query resolves, only bound nodes update.\n */\nimport type { FieldOption, FieldValue, ProviderRef, Resolvable } from \"@formwright/schema\";\nimport type { ReadSignal } from \"./reactive.js\";\n\nexport interface I18nProvider {\n /** Translate a key with optional interpolation args. */\n t(key: string, args?: Record<string, FieldValue>): string;\n}\n\nexport interface QueryResult<T> {\n readonly data: T | undefined;\n readonly loading: boolean;\n readonly error: unknown;\n}\n\nexport interface QueryProvider {\n /** Return a reactive query result for a key and optional params. */\n query<T = unknown>(key: string, params?: Record<string, unknown>): ReadSignal<QueryResult<T>>;\n}\n\nexport interface ThemeProvider {\n token(name: string): string;\n}\n\nexport interface Providers {\n readonly i18n?: I18nProvider;\n readonly query?: QueryProvider;\n readonly theme?: ThemeProvider;\n readonly [name: string]: unknown;\n}\n\nfunction isProviderRef(value: unknown): value is ProviderRef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (\"$t\" in value || \"$query\" in value || \"$theme\" in value)\n );\n}\n\n/**\n * Resolve a {@link Resolvable} to a concrete value using the available providers.\n * Literals pass through; sigils dispatch to the matching provider. Unresolved\n * refs fall back to a readable string so the form still renders.\n */\nexport function resolve<T extends FieldValue | readonly FieldOption[]>(\n value: Resolvable<T> | undefined,\n providers: Providers | undefined,\n): T | undefined {\n if (value === undefined) return undefined;\n if (!isProviderRef(value)) return value;\n\n if (\"$t\" in value) {\n const i18n = providers?.i18n;\n return (i18n ? i18n.t(value.$t, value.args) : value.$t) as T;\n }\n if (\"$theme\" in value) {\n const theme = providers?.theme;\n return (theme ? theme.token(value.$theme) : value.$theme) as T;\n }\n // $query is async/reactive and resolved by the renderer via resolveQuery.\n return undefined;\n}\n\n/** Resolve a `$query` ref to its reactive result signal, or `null` if not a query ref. */\nexport function resolveQuery(\n value: unknown,\n providers: Providers | undefined,\n): ReadSignal<QueryResult<unknown>> | null {\n if (!isProviderRef(value) || !(\"$query\" in value)) return null;\n const provider = providers?.query;\n if (!provider) return null;\n const spec = value.$query;\n if (typeof spec === \"string\") return provider.query(spec);\n const [key, params] = spec;\n return provider.query(key, params);\n}\n\nexport { isProviderRef };\n","/**\n * Reactive per-field model. Each {@link FieldState} owns the signals for one\n * field — its value, error, and touched flag — plus computed `visible`,\n * `enabled`, and `required` derived from the schema's conditions. The renderer\n * binds directly to these signals, so a change updates only the affected nodes.\n */\nimport type { FieldSchema, FieldValue } from \"@formwright/schema\";\nimport { computed, signal, type ReadSignal, type WriteSignal } from \"./reactive.js\";\nimport { evaluateCondition, type ValueGetter } from \"./conditions.js\";\nimport { compileValidator, requiredMessage, type FieldValidator } from \"./validation.js\";\n\n/** Default value for a leaf field with no explicit initial/default. */\nexport function defaultValueFor(type: string): FieldValue {\n switch (type) {\n case \"checkbox\":\n return false;\n case \"number\":\n return undefined;\n default:\n return \"\";\n }\n}\n\nlet uidSeq = 0;\n\nexport class FieldState {\n /** Discriminant for the {@link FieldNode} union (leaf vs group/collection). */\n readonly kind = \"field\" as const;\n readonly id: string;\n /** A globally-unique DOM id for the control (collection rows reuse `id`, so this must be unique). */\n readonly domId = `fw-${(uidSeq++).toString(36)}`;\n /** The field's schema — mutable at runtime via {@link patchSchema}. */\n schema: FieldSchema;\n readonly value: WriteSignal<FieldValue>;\n readonly error: WriteSignal<string | null>;\n readonly touched: WriteSignal<boolean>;\n readonly visible: ReadSignal<boolean>;\n readonly enabled: ReadSignal<boolean>;\n readonly required: ReadSignal<boolean>;\n /** Bumps whenever the schema is patched — renderers re-render the field on change. */\n readonly revision: ReadSignal<number>;\n\n private validator: FieldValidator | null;\n private readonly rev = signal(0);\n\n constructor(schema: FieldSchema, initial: FieldValue, getValue: ValueGetter) {\n this.id = schema.id;\n this.schema = schema;\n this.value = signal<FieldValue>(initial);\n this.error = signal<string | null>(null);\n this.touched = signal(false);\n this.validator = schema.validation ? compileValidator(schema.validation) : null;\n this.revision = this.rev;\n\n // Conditions read `this.schema` (not the captured arg) and track `rev`, so a\n // runtime patch re-evaluates visibility/enablement/required automatically.\n this.visible = computed(() => {\n this.rev.get();\n return evaluateCondition(this.schema.visibleWhen, getValue, true);\n });\n this.enabled = computed(() => {\n this.rev.get();\n return evaluateCondition(this.schema.enabledWhen, getValue, true);\n });\n this.required = computed(() => {\n this.rev.get();\n if (this.schema.requiredWhen !== undefined) {\n return evaluateCondition(this.schema.requiredWhen, getValue, false);\n }\n return this.schema.validation?.required ?? false;\n });\n }\n\n /** Merge a partial schema in at runtime (change type, label, options, validation, …). */\n patchSchema(partial: Partial<FieldSchema>): void {\n this.schema = { ...this.schema, ...partial } as FieldSchema;\n this.validator = this.schema.validation ? compileValidator(this.schema.validation) : null;\n this.rev.update((n) => n + 1);\n }\n\n /** Run validation, store and return the error (or null). Hidden fields never error. */\n validate(): string | null {\n if (!this.visible.peek()) {\n this.error.set(null);\n return null;\n }\n let result: string | null = null;\n if (this.required.peek() && isEmpty(this.value.peek())) {\n result = requiredMessage(this.schema.validation);\n } else if (this.validator) {\n result = this.validator(this.value.peek());\n }\n this.error.set(result);\n return result;\n }\n\n reset(value: FieldValue): void {\n this.value.set(value);\n this.error.set(null);\n this.touched.set(false);\n }\n}\n\nfunction isEmpty(value: FieldValue): boolean {\n return value === undefined || value === null || value === \"\";\n}\n","/**\n * Nested field tree — `group` (object) and `collection` (array-of-groups) nodes\n * on top of the leaf {@link FieldState}.\n *\n * Names in conditions resolve **lexically**: a child first looks among its own\n * siblings, then walks up the enclosing {@link Scope} chain to the form root. So\n * a field nested inside a group or a collection row can be hidden by an outer\n * toggle (`{ var: \"showDetails\" }`) *and* by a sibling in the same row — without\n * any path syntax. Hidden fields keep their value in the aggregated payload but\n * are skipped by validation.\n */\nimport type { FieldSchema, FieldValue } from \"@formwright/schema\";\nimport { computed, signal, type ReadSignal, type WriteSignal } from \"./reactive.js\";\nimport { evaluateCondition, type ValueGetter } from \"./conditions.js\";\nimport { FieldState, defaultValueFor } from \"./model.js\";\n\n/** A node in the field tree: a leaf field, a nested object, or a repeatable list. */\nexport type FieldNode = FieldState | GroupNode | CollectionNode;\n\n/** Resolves a referenced field name to its current value, walking enclosing scopes. */\nexport type Scope = ValueGetter;\n\ntype Dict = Record<string, unknown>;\n\n/** Presentational field types carry no value and never appear in the payload. */\nconst PRESENTATIONAL = new Set([\"heading\", \"separator\", \"paragraph\"]);\n\n/** True for fields that render content but contribute nothing to the payload. */\nexport function isPresentational(type: string): boolean {\n return PRESENTATIONAL.has(type);\n}\n\n/** Current value of any node (subscribes the caller). */\nfunction nodeValue(node: FieldNode): unknown {\n return node.value.get();\n}\n\n/**\n * Aggregate children into an object. Hidden fields (whose `visibleWhen` is false)\n * are excluded from the payload — at any depth, including inside groups and\n * collection rows — as are fields flagged `omit`. Hide a field or a whole\n * group/collection and its data drops out of the submitted payload.\n */\nfunction collectValues(nodes: readonly FieldNode[]): Dict {\n const out: Dict = {};\n for (const node of nodes) {\n if (node.schema.omit || isPresentational(node.schema.type)) continue;\n if (!node.visible.get()) continue;\n out[node.id] = nodeValue(node);\n }\n return out;\n}\n\n/** Build sibling nodes that share `scope`, seeding each from `initial`. */\nfunction buildNodes(\n schemas: readonly FieldSchema[],\n scope: Scope,\n initial: Dict,\n): { nodes: FieldNode[]; byName: Map<string, FieldNode> } {\n const nodes: FieldNode[] = [];\n const byName = new Map<string, FieldNode>();\n for (const schema of schemas) {\n let node: FieldNode;\n if (schema.type === \"group\") {\n node = new GroupNode(schema, scope, asDict(initial[schema.id]));\n } else if (schema.type === \"collection\") {\n node = new CollectionNode(schema, scope, asArray(initial[schema.id]));\n } else {\n const init = initial[schema.id] ?? schema.defaultValue ?? defaultValueFor(schema.type);\n node = new FieldState(schema, init as FieldValue, scope);\n }\n nodes.push(node);\n byName.set(schema.id, node);\n }\n return { nodes, byName };\n}\n\nfunction asDict(v: unknown): Dict {\n return v !== null && typeof v === \"object\" && !Array.isArray(v) ? (v as Dict) : {};\n}\nfunction asArray(v: unknown): Dict[] {\n return Array.isArray(v) ? (v as Dict[]) : [];\n}\n\n/** Reset a sibling list in place from a fresh `initial` object. */\nfunction resetNodes(nodes: readonly FieldNode[], initial: Dict): void {\n for (const node of nodes) {\n if (node.kind === \"field\") {\n const init =\n initial[node.id] ?? node.schema.defaultValue ?? defaultValueFor(node.schema.type);\n node.reset(init as FieldValue);\n } else if (node.kind === \"group\") {\n node.reset(asDict(initial[node.id]));\n } else {\n node.reset(asArray(initial[node.id]));\n }\n }\n}\n\n/** A nested object field: produces `{ ...visible child values }`. */\nexport class GroupNode {\n readonly kind = \"group\" as const;\n readonly id: string;\n readonly schema: FieldSchema;\n readonly children: readonly FieldNode[];\n readonly byName: ReadonlyMap<string, FieldNode>;\n readonly value: ReadSignal<Dict>;\n readonly visible: ReadSignal<boolean>;\n readonly enabled: ReadSignal<boolean>;\n\n /** The scope a child uses: resolve a name among siblings, else delegate upward. */\n readonly scope: Scope;\n\n constructor(schema: FieldSchema, parentScope: Scope, initial: Dict) {\n this.id = schema.id;\n this.schema = schema;\n this.scope = (name) => {\n const child = this.byName.get(name);\n return child ? (nodeValue(child) as FieldValue) : parentScope(name);\n };\n const built = buildNodes(schema.fields ?? [], this.scope, initial);\n this.children = built.nodes;\n this.byName = built.byName;\n this.value = computed(() => collectValues(this.children));\n this.visible = computed(() => evaluateCondition(schema.visibleWhen, parentScope, true));\n this.enabled = computed(() => evaluateCondition(schema.enabledWhen, parentScope, true));\n }\n\n reset(initial: Dict): void {\n resetNodes(this.children, initial);\n }\n}\n\n/** One row of a {@link CollectionNode}: a group with a stable identity key. */\nexport interface CollectionItem {\n readonly key: number;\n readonly group: GroupNode;\n}\n\n/** A repeatable list of object rows: produces `[{ ... }, { ... }]`. */\nexport class CollectionNode {\n readonly kind = \"collection\" as const;\n readonly id: string;\n readonly schema: FieldSchema;\n readonly value: ReadSignal<Dict[]>;\n readonly visible: ReadSignal<boolean>;\n readonly enabled: ReadSignal<boolean>;\n\n private readonly rows: WriteSignal<CollectionItem[]>;\n private readonly parentScope: Scope;\n private readonly itemSchema: FieldSchema;\n private seq = 0;\n\n constructor(schema: FieldSchema, parentScope: Scope, initial: Dict[]) {\n this.id = schema.id;\n this.schema = schema;\n this.parentScope = parentScope;\n // Each row is a group over the collection's child fields; the row carries no\n // visibility condition of its own (that belongs to the whole collection).\n this.itemSchema = { id: schema.id, type: \"group\", fields: schema.fields ?? [] };\n\n const seed = this.seedRows(initial);\n this.rows = signal(seed);\n this.value = computed(() => this.rows.get().map((row) => row.group.value.get()));\n this.visible = computed(() => evaluateCondition(schema.visibleWhen, parentScope, true));\n this.enabled = computed(() => evaluateCondition(schema.enabledWhen, parentScope, true));\n }\n\n /** Reactive list of rows (subscribes the caller to add/remove). */\n get items(): ReadSignal<CollectionItem[]> {\n return this.rows;\n }\n\n private makeItem(initial: Dict): CollectionItem {\n return { key: this.seq++, group: new GroupNode(this.itemSchema, this.parentScope, initial) };\n }\n\n private seedRows(initial: Dict[]): CollectionItem[] {\n const rows = initial.map((row) => this.makeItem(row));\n const min = this.schema.minItems ?? 0;\n while (rows.length < min) rows.push(this.makeItem({}));\n return rows;\n }\n\n /** Append a new empty row, unless `maxItems` is reached. */\n add(): void {\n const max = this.schema.maxItems;\n if (max !== undefined && this.rows.peek().length >= max) return;\n this.rows.update((rows) => [...rows, this.makeItem({})]);\n }\n\n /** Remove the row at `index`, unless `minItems` would be violated. */\n removeAt(index: number): void {\n const min = this.schema.minItems ?? 0;\n if (this.rows.peek().length <= min) return;\n this.rows.update((rows) => rows.filter((_, i) => i !== index));\n }\n\n reset(initial: Dict[]): void {\n this.seq = 0;\n this.rows.set(this.seedRows(initial));\n }\n}\n\n/** Build the top-level field tree for a form, rooted at `rootScope`. */\nexport function buildTree(\n schemas: readonly FieldSchema[],\n initial: Dict,\n): { nodes: FieldNode[]; byName: Map<string, FieldNode>; scope: Scope } {\n let byName: Map<string, FieldNode>;\n const scope: Scope = (name) => {\n const node = byName.get(name);\n return node ? (nodeValue(node) as FieldValue) : undefined;\n };\n const built = buildNodes(schemas, scope, initial);\n byName = built.byName;\n return { nodes: built.nodes, byName, scope };\n}\n\n/** Visit every leaf {@link FieldState} in a node list (descends groups/collections). */\nexport function eachLeaf(nodes: readonly FieldNode[], visit: (leaf: FieldState) => void): void {\n for (const node of nodes) {\n if (node.kind === \"field\") visit(node);\n else if (node.kind === \"group\") eachLeaf(node.children, visit);\n else for (const row of node.items.peek()) eachLeaf(row.group.children, visit);\n }\n}\n\nexport { collectValues, resetNodes };\n","/**\n * The {@link Form} class — Formwright's public, class-based, imperative API.\n *\n * const form = new Form(schema, { email: \"\" }, options);\n * form.mount(document.getElementById(\"root\")!);\n * await form.submit();\n *\n * The instance owns the reactive field graph, validation, the condition engine,\n * provider wiring, and the submission pipeline. It is render-agnostic: `mount`\n * delegates to a registered renderer (e.g. `@formwright/dom`), so the same\n * instance can drive the DOM, a web component, or a framework adapter.\n */\nimport {\n parseSchema,\n type FieldSchema,\n type FieldValue,\n type FormSchema,\n} from \"@formwright/schema\";\nimport {\n batch,\n computed,\n effect,\n signal,\n untrack,\n type Dispose,\n type ReadSignal,\n} from \"./reactive.js\";\nimport { FieldState } from \"./model.js\";\nimport {\n buildTree,\n collectValues,\n eachLeaf,\n resetNodes,\n CollectionNode,\n GroupNode,\n type FieldNode,\n} from \"./nodes.js\";\nimport type { Providers } from \"./providers.js\";\n\n/** Form values — nested for `group` (object) and `collection` (array) fields. */\nexport type FormValues = Record<string, unknown>;\nexport type FormErrors = Record<string, string | null>;\n\n/** The outcome of {@link Form.submit} — resolved for both success and failure. */\nexport type SubmitResult =\n | { readonly ok: true; readonly data: unknown }\n | { readonly ok: false; readonly error: unknown; readonly errors?: FormErrors };\n\n/** A transform applied to values before submission. */\nexport type Transform = (values: FormValues, form: Form) => unknown;\n/** Handlers referenced by name from the schema's `submit` block. */\nexport type SuccessHandler = (result: unknown, form: Form) => void;\nexport type ErrorHandler = (error: unknown, form: Form) => void;\n\nexport interface FormOptions {\n readonly providers?: Providers;\n readonly transforms?: Record<string, Transform>;\n readonly handlers?: Record<string, SuccessHandler | ErrorHandler>;\n /** Override the network send (defaults to `fetch` against `submit.endpoint`). */\n readonly send?: (payload: unknown, form: Form) => Promise<unknown>;\n /**\n * Persist entered values under this `localStorage` key and restore them on the\n * next load — so a refresh before submitting keeps the form filled. Cleared on\n * a successful submit.\n */\n readonly persistKey?: string;\n}\n\n/** Renders a {@link Form} into a host node; returns a disposer. Provided by a renderer package. */\nexport interface FormRenderer {\n mount(form: Form, host: Element): Dispose;\n}\n\ntype EventName = \"submit\" | \"success\" | \"error\" | \"change\" | \"action\";\ntype Listener = (payload: unknown) => void;\n\nlet defaultRenderer: FormRenderer | null = null;\n\n/** Register the renderer used by {@link Form.mount} when none is passed explicitly. */\nexport function setDefaultRenderer(renderer: FormRenderer): void {\n defaultRenderer = renderer;\n}\n\nexport class Form {\n readonly schema: FormSchema;\n readonly options: FormOptions;\n /** Top-level field tree (leaf fields, groups, and collections, in order). */\n readonly tree: readonly FieldNode[];\n readonly order: readonly string[];\n\n /** Reactive snapshot of all field values (nested for groups/collections). */\n readonly values: ReadSignal<FormValues>;\n /** True when the current values differ from the initial values. */\n readonly isDirty: ReadSignal<boolean>;\n /** True when no visible field currently has an error. */\n readonly isValid: ReadSignal<boolean>;\n\n private readonly submitting = signal(false);\n private readonly initialValues: FormValues;\n private readonly initialSnapshot: string;\n private readonly rootByName: ReadonlyMap<string, FieldNode>;\n private readonly listeners = new Map<EventName, Set<Listener>>();\n private disposeRenderer: Dispose | null = null;\n private disposePersist: Dispose | null = null;\n\n constructor(\n schema: FormSchema | unknown,\n initialValues: FormValues = {},\n options: FormOptions = {},\n ) {\n // Always validate: parseSchema passes valid schemas through unchanged and\n // throws a precise SchemaValidationError otherwise (key for LLM-emitted input).\n this.schema = parseSchema(schema);\n this.options = options;\n this.initialValues = initialValues;\n\n // Expand `localized` fields into per-locale groups → payload `{ en, ar }`.\n const fields = this.schema.locales?.length\n ? expandLocalized(this.schema.fields, this.schema.locales)\n : this.schema.fields;\n // Restore persisted values (form caching) over the provided initial values.\n const seed = loadPersisted(options.persistKey, initialValues);\n const tree = buildTree(fields, seed);\n this.tree = tree.nodes;\n this.rootByName = tree.byName;\n this.order = fields.map((f) => f.id);\n\n this.values = computed(() => collectTree(this.tree));\n\n // Persist on every change (form caching).\n if (options.persistKey) {\n const key = options.persistKey;\n this.disposePersist = effect(() => {\n const v = this.values.get();\n try {\n localStorage.setItem(key, JSON.stringify(v));\n } catch {\n /* storage unavailable — ignore */\n }\n });\n }\n this.initialSnapshot = JSON.stringify(untrack(() => this.values.peek()));\n this.isDirty = computed(() => JSON.stringify(this.values.get()) !== this.initialSnapshot);\n this.isValid = computed(() => {\n let valid = true;\n eachLeaf(this.tree, (leaf) => {\n if (leaf.visible.get() && leaf.error.get() !== null) valid = false;\n });\n return valid;\n });\n }\n\n // ---- value access -------------------------------------------------------\n\n /** All leaf fields keyed by dotted path (e.g. `items.name`, `contacts.0.email`). */\n get fields(): ReadonlyMap<string, FieldState> {\n return collectLeaves(this.tree);\n }\n\n /** Resolve a leaf field by dotted path. Top-level ids work directly. */\n field(path: string): FieldState | undefined {\n return resolveLeaf(this.tree, this.rootByName, path);\n }\n\n getValue(path: string): FieldValue {\n return this.field(path)?.value.peek();\n }\n\n setValue(path: string, value: FieldValue): void {\n const field = this.field(path);\n if (field) this.setFieldValue(field, value);\n }\n\n /** Apply a value to a specific leaf node (used by the renderer). */\n setFieldValue(field: FieldState, value: FieldValue): void {\n field.value.set(value);\n field.touched.set(true);\n // Real-time, field-by-field validation: validate the edited field on every\n // change so its error shows as you type and clears the moment it's valid.\n field.validate();\n this.emit(\"change\", { id: field.id, value });\n }\n\n setError(id: string, error: string | null): void {\n this.field(id)?.error.set(error);\n }\n\n /** Patch one field's schema at runtime (change type, label, options, validation, …). */\n setFieldSchema(path: string, partial: Partial<FieldSchema>): void {\n this.field(path)?.patchSchema(partial);\n }\n\n /** Patch many fields' schemas at once: `form.patch({ state: { type: \"text\" }, … })`. */\n patch(updates: Record<string, Partial<FieldSchema>>): void {\n batch(() => {\n for (const [path, partial] of Object.entries(updates)) this.setFieldSchema(path, partial);\n });\n }\n\n setErrors(errors: FormErrors): void {\n batch(() => {\n for (const [id, error] of Object.entries(errors)) this.setError(id, error);\n });\n }\n\n get isSubmitting(): ReadSignal<boolean> {\n return this.submitting;\n }\n\n // ---- lifecycle ----------------------------------------------------------\n\n /** Validate every (visible) leaf field; returns true when the whole form is valid. */\n validate(): boolean {\n return untrack(() => {\n let ok = true;\n batch(() => {\n eachLeaf(this.tree, (leaf) => {\n if (leaf.validate() !== null) ok = false;\n });\n });\n return ok;\n });\n }\n\n /**\n * Run the submission pipeline: validate → transform → send → onSuccess/onError.\n * Pass an inline `transform` to shape the final payload, e.g.\n * `form.submit((values) => ({ ...values, source: \"web\" }))`.\n *\n * Always **resolves** with a {@link SubmitResult} — never throws — so you can\n * handle both outcomes from the API in one place:\n * `const res = await form.submit(); res.ok ? res.data : res.error`.\n */\n async submit(transform?: (values: FormValues, form: Form) => unknown): Promise<SubmitResult> {\n if (!this.validate()) {\n const errors = this.collectErrors();\n const error = new FormValidationError(errors);\n this.runErrorHandler(error);\n this.emit(\"error\", error);\n return { ok: false, error, errors };\n }\n\n this.submitting.set(true);\n const values = untrack(() => this.values.peek());\n const named = this.applyTransform(values);\n const payload = transform ? transform(named as FormValues, this) : named;\n this.emit(\"submit\", payload);\n\n try {\n const data = await this.send(payload);\n this.clearPersisted(); // submitted successfully — drop the cached draft\n this.runSuccessHandler(data);\n this.emit(\"success\", data);\n return { ok: true, data };\n } catch (error) {\n this.runErrorHandler(error);\n this.emit(\"error\", error);\n return { ok: false, error };\n } finally {\n this.submitting.set(false);\n }\n }\n\n reset(values: FormValues = this.initialValues): void {\n batch(() => {\n resetNodes(this.tree, values as Record<string, unknown>);\n });\n }\n\n /** Trigger a named form action: runs its handler (from options) and emits \"action\". */\n action(name: string): void {\n const def = this.schema.actions?.find((a) => a.name === name);\n const handler = def?.handler ? this.options.handlers?.[def.handler] : undefined;\n (handler as ((form: Form) => void) | undefined)?.(this);\n this.emit(\"action\", { name });\n }\n\n /** Mount into a host element using the given renderer (or the registered default). */\n mount(host: Element, renderer: FormRenderer | null = defaultRenderer): Dispose {\n if (!renderer) {\n throw new Error(\n \"No renderer available. Import '@formwright/dom' or pass a renderer to Form.mount().\",\n );\n }\n this.disposeRenderer?.();\n this.disposeRenderer = renderer.mount(this, host);\n return this.disposeRenderer;\n }\n\n destroy(): void {\n this.disposeRenderer?.();\n this.disposeRenderer = null;\n this.disposePersist?.();\n this.disposePersist = null;\n this.listeners.clear();\n }\n\n /** Remove the cached draft from `localStorage` (called on a successful submit). */\n private clearPersisted(): void {\n const key = this.options.persistKey;\n if (!key || typeof localStorage === \"undefined\") return;\n try {\n localStorage.removeItem(key);\n } catch {\n /* ignore */\n }\n }\n\n // ---- events -------------------------------------------------------------\n\n on(event: EventName, listener: Listener): Dispose {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener);\n return () => set.delete(listener);\n }\n\n private emit(event: EventName, payload: unknown): void {\n const set = this.listeners.get(event);\n if (set) for (const listener of [...set]) listener(payload);\n }\n\n // ---- internals ----------------------------------------------------------\n\n private collectErrors(): FormErrors {\n const errors: FormErrors = {};\n for (const [path, field] of this.fields) errors[path] = field.error.peek();\n return errors;\n }\n\n private applyTransform(values: FormValues): unknown {\n const name = this.schema.submit?.transform;\n const transform = name ? this.options.transforms?.[name] : undefined;\n return transform ? transform(values, this) : values;\n }\n\n private async send(payload: unknown): Promise<unknown> {\n if (this.options.send) return this.options.send(payload, this);\n const endpoint = this.schema.submit?.endpoint;\n if (!endpoint) return payload; // no transport configured: succeed with the payload\n const init: RequestInit = {\n method: endpoint.method,\n headers: { \"content-type\": \"application/json\" },\n };\n if (endpoint.method !== \"GET\") init.body = JSON.stringify(payload);\n const response = await fetch(endpoint.url, init);\n if (!response.ok) throw new Error(`Request failed: ${response.status}`);\n const text = await response.text();\n return text ? JSON.parse(text) : undefined;\n }\n\n private runSuccessHandler(result: unknown): void {\n const name = this.schema.submit?.onSuccess;\n const handler = name ? this.options.handlers?.[name] : undefined;\n (handler as SuccessHandler | undefined)?.(result, this);\n }\n\n private runErrorHandler(error: unknown): void {\n const name = this.schema.submit?.onError;\n const handler = name ? this.options.handlers?.[name] : undefined;\n (handler as ErrorHandler | undefined)?.(error, this);\n }\n}\n\nexport class FormValidationError extends Error {\n readonly errors: FormErrors;\n constructor(errors: FormErrors) {\n super(\"Form validation failed\");\n this.name = \"FormValidationError\";\n this.errors = errors;\n }\n}\n\n/** Aggregate the tree into a nested values object (subscribes to all values). */\nfunction collectTree(tree: readonly FieldNode[]): FormValues {\n return collectValues(tree) as FormValues;\n}\n\n/** Merge persisted (localStorage) values over the provided initial values. */\nfunction loadPersisted(key: string | undefined, initial: FormValues): FormValues {\n if (!key || typeof localStorage === \"undefined\") return initial;\n try {\n const saved = localStorage.getItem(key);\n if (saved) return { ...initial, ...(JSON.parse(saved) as FormValues) };\n } catch {\n /* corrupt/unavailable — fall back to initial */\n }\n return initial;\n}\n\n/**\n * Rewrite each `localized` field into a group with one child per locale, so its\n * value becomes `{ en: …, ar: … }`. Recurses into groups/collections. Pure data.\n */\nfunction expandLocalized(\n fields: readonly FieldSchema[],\n locales: readonly string[],\n): readonly FieldSchema[] {\n return fields.map((f): FieldSchema => {\n if (f.localized) {\n const leafType = f.type === \"group\" || f.type === \"collection\" ? \"text\" : f.type;\n const child = (loc: string): FieldSchema => {\n const c: Record<string, unknown> = { id: loc, type: leafType, label: loc };\n if (f.placeholder !== undefined) c[\"placeholder\"] = f.placeholder;\n if (f.validation !== undefined) c[\"validation\"] = f.validation;\n if (f.options !== undefined) c[\"options\"] = f.options;\n if (f.widget !== undefined) c[\"widget\"] = f.widget;\n if (f.tooltip !== undefined) c[\"tooltip\"] = f.tooltip;\n return c as unknown as FieldSchema;\n };\n const group: Record<string, unknown> = {\n id: f.id,\n type: \"group\",\n // Keep the `localized` flag so the renderer shows ONE input + a language\n // switcher (instead of one input per locale). Value stays `{ en, ar }`.\n localized: true,\n fields: locales.map(child),\n };\n if (f.defaultLocale !== undefined) group[\"defaultLocale\"] = f.defaultLocale;\n for (const key of [\n \"label\",\n \"visibleWhen\",\n \"enabledWhen\",\n \"class\",\n \"classes\",\n \"help\",\n \"tooltip\",\n ] as const) {\n if (f[key] !== undefined) group[key] = f[key];\n }\n return group as unknown as FieldSchema;\n }\n if (f.fields) return { ...f, fields: expandLocalized(f.fields, locales) };\n return f;\n });\n}\n\n/** Flatten all leaf fields, keyed by dotted path (`group.child`, `coll.0.child`). */\nfunction collectLeaves(tree: readonly FieldNode[]): Map<string, FieldState> {\n const out = new Map<string, FieldState>();\n const walk = (nodes: readonly FieldNode[], prefix: string): void => {\n for (const node of nodes) {\n const path = prefix ? `${prefix}.${node.id}` : node.id;\n if (node.kind === \"field\") out.set(path, node);\n else if (node.kind === \"group\") walk(node.children, path);\n else {\n node.items.peek().forEach((row, i) => walk(row.group.children, `${path}.${i}`));\n }\n }\n };\n walk(tree, \"\");\n return out;\n}\n\n/** Resolve a leaf field by dotted path, descending groups and collection rows. */\nfunction resolveLeaf(\n tree: readonly FieldNode[],\n rootByName: ReadonlyMap<string, FieldNode>,\n path: string,\n): FieldState | undefined {\n const parts = path.split(\".\");\n let node: FieldNode | undefined = rootByName.get(parts[0]!);\n for (let i = 1; i < parts.length && node; i++) {\n const part = parts[i]!;\n if (node instanceof GroupNode) {\n node = node.byName.get(part) as FieldNode | undefined;\n } else if (node instanceof CollectionNode) {\n node = node.items.peek()[Number(part)]?.group;\n } else {\n return undefined;\n }\n }\n return node && node.kind === \"field\" ? node : undefined;\n}\n"]}
package/dist/reactive.cjs CHANGED
@@ -1,169 +1,32 @@
1
1
  'use strict';
2
2
 
3
- // src/reactive.ts
4
- var activeObserver = null;
5
- var batchDepth = 0;
6
- var pendingEffects = /* @__PURE__ */ new Set();
7
- var flushing = false;
8
- function link(source) {
9
- const obs = activeObserver;
10
- if (obs === null) return;
11
- if (!source.observers.has(obs)) {
12
- source.observers.add(obs);
13
- obs.sources.add(source);
14
- }
15
- }
16
- function clearSources(obs) {
17
- for (const src of obs.sources) src.observers.delete(obs);
18
- obs.sources.clear();
19
- }
20
- function flush() {
21
- if (flushing) return;
22
- flushing = true;
23
- try {
24
- while (pendingEffects.size > 0) {
25
- const next = pendingEffects.values().next().value;
26
- pendingEffects.delete(next);
27
- next.run();
28
- }
29
- } finally {
30
- flushing = false;
31
- }
32
- }
33
- var SignalNode = class {
34
- constructor(value) {
35
- this.value = value;
36
- }
37
- value;
38
- observers = /* @__PURE__ */ new Set();
39
- get() {
40
- link(this);
41
- return this.value;
42
- }
43
- peek() {
44
- return this.value;
45
- }
46
- set(next) {
47
- if (Object.is(next, this.value)) return;
48
- this.value = next;
49
- for (const obs of [...this.observers]) obs.notify();
50
- if (batchDepth === 0) flush();
51
- }
52
- update(fn) {
53
- this.set(fn(this.value));
54
- }
55
- };
56
- var ComputedNode = class {
57
- constructor(fn) {
58
- this.fn = fn;
59
- }
60
- fn;
61
- observers = /* @__PURE__ */ new Set();
62
- sources = /* @__PURE__ */ new Set();
63
- value;
64
- dirty = true;
65
- notify() {
66
- if (this.dirty) return;
67
- this.dirty = true;
68
- for (const obs of [...this.observers]) obs.notify();
69
- }
70
- get() {
71
- link(this);
72
- if (this.dirty) this.recompute();
73
- return this.value;
74
- }
75
- peek() {
76
- if (this.dirty) this.recompute();
77
- return this.value;
78
- }
79
- recompute() {
80
- clearSources(this);
81
- const prev = activeObserver;
82
- activeObserver = this;
83
- try {
84
- this.value = this.fn();
85
- this.dirty = false;
86
- } finally {
87
- activeObserver = prev;
88
- }
89
- }
90
- };
91
- var EffectNode = class {
92
- constructor(fn) {
93
- this.fn = fn;
94
- this.run();
95
- }
96
- fn;
97
- sources = /* @__PURE__ */ new Set();
98
- cleanup = void 0;
99
- disposed = false;
100
- notify() {
101
- if (this.disposed) return;
102
- pendingEffects.add(this);
103
- }
104
- run() {
105
- if (this.disposed) return;
106
- this.runCleanup();
107
- clearSources(this);
108
- const prev = activeObserver;
109
- activeObserver = this;
110
- try {
111
- this.cleanup = this.fn();
112
- } finally {
113
- activeObserver = prev;
114
- }
115
- }
116
- runCleanup() {
117
- if (typeof this.cleanup === "function") {
118
- this.cleanup();
119
- this.cleanup = void 0;
120
- }
121
- }
122
- dispose() {
123
- if (this.disposed) return;
124
- this.disposed = true;
125
- this.runCleanup();
126
- clearSources(this);
127
- pendingEffects.delete(this);
128
- }
129
- };
130
- function signal(initial) {
131
- return new SignalNode(initial);
132
- }
133
- function computed(fn) {
134
- return new ComputedNode(fn);
135
- }
136
- function effect(fn) {
137
- const node = new EffectNode(fn);
138
- return () => node.dispose();
139
- }
140
- function untrack(fn) {
141
- const prev = activeObserver;
142
- activeObserver = null;
143
- try {
144
- return fn();
145
- } finally {
146
- activeObserver = prev;
147
- }
148
- }
149
- function batch(fn) {
150
- batchDepth++;
151
- try {
152
- return fn();
153
- } finally {
154
- batchDepth--;
155
- if (batchDepth === 0) flush();
156
- }
157
- }
158
- function isTracking() {
159
- return activeObserver !== null;
160
- }
3
+ var reactive = require('@wright/reactive');
161
4
 
162
- exports.batch = batch;
163
- exports.computed = computed;
164
- exports.effect = effect;
165
- exports.isTracking = isTracking;
166
- exports.signal = signal;
167
- exports.untrack = untrack;
5
+
6
+
7
+ Object.defineProperty(exports, "batch", {
8
+ enumerable: true,
9
+ get: function () { return reactive.batch; }
10
+ });
11
+ Object.defineProperty(exports, "computed", {
12
+ enumerable: true,
13
+ get: function () { return reactive.computed; }
14
+ });
15
+ Object.defineProperty(exports, "effect", {
16
+ enumerable: true,
17
+ get: function () { return reactive.effect; }
18
+ });
19
+ Object.defineProperty(exports, "isTracking", {
20
+ enumerable: true,
21
+ get: function () { return reactive.isTracking; }
22
+ });
23
+ Object.defineProperty(exports, "signal", {
24
+ enumerable: true,
25
+ get: function () { return reactive.signal; }
26
+ });
27
+ Object.defineProperty(exports, "untrack", {
28
+ enumerable: true,
29
+ get: function () { return reactive.untrack; }
30
+ });
168
31
  //# sourceMappingURL=reactive.cjs.map
169
32
  //# sourceMappingURL=reactive.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/reactive.ts"],"names":[],"mappings":"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","file":"reactive.cjs","sourcesContent":["/**\n * Fine-grained reactivity — the engine behind Formwright's surgical DOM updates.\n *\n * This is a small, correct, **zero-dependency** push-pull implementation:\n * - {@link signal} holds a value and the set of observers that read it.\n * - {@link computed} is lazy and cached: it recomputes only when read *after* a\n * dependency changed.\n * - {@link effect} runs immediately and re-runs when any signal/computed it read\n * changes — this is what binds a single value to a single DOM node.\n *\n * Writing a signal marks the dependency graph dirty and synchronously flushes the\n * affected effects (so DOM updates are immediate and deterministic). Only effects\n * that actually read the changed value re-run — there is no diffing and no virtual\n * DOM. The public surface here is intentionally framework-agnostic and swappable\n * (e.g. for `alien-signals`) without touching the rest of the library.\n */\n\nexport interface ReadSignal<T> {\n /** Read the value and subscribe the current effect/computed to changes. */\n get(): T;\n /** Read the value without subscribing. */\n peek(): T;\n}\n\nexport interface WriteSignal<T> extends ReadSignal<T> {\n set(value: T): void;\n update(fn: (prev: T) => T): void;\n}\n\nexport type Dispose = () => void;\n\ninterface Observer {\n /** Sources this observer currently depends on. */\n readonly sources: Set<Source>;\n /** Called when a dependency changed; the observer reacts (recompute or queue). */\n notify(): void;\n}\n\ninterface Source {\n /** Observers currently subscribed to this source. */\n readonly observers: Set<Observer>;\n}\n\nlet activeObserver: Observer | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set<EffectNode>();\nlet flushing = false;\n\nfunction link(source: Source): void {\n const obs = activeObserver;\n if (obs === null) return;\n if (!source.observers.has(obs)) {\n source.observers.add(obs);\n obs.sources.add(source);\n }\n}\n\nfunction clearSources(obs: Observer): void {\n for (const src of obs.sources) src.observers.delete(obs);\n obs.sources.clear();\n}\n\nfunction flush(): void {\n if (flushing) return;\n flushing = true;\n try {\n // Re-check each iteration: running an effect may queue more effects.\n while (pendingEffects.size > 0) {\n const next = pendingEffects.values().next().value as EffectNode;\n pendingEffects.delete(next);\n next.run();\n }\n } finally {\n flushing = false;\n }\n}\n\nclass SignalNode<T> implements Source {\n readonly observers = new Set<Observer>();\n constructor(private value: T) {}\n\n get(): T {\n link(this);\n return this.value;\n }\n\n peek(): T {\n return this.value;\n }\n\n set(next: T): void {\n if (Object.is(next, this.value)) return;\n this.value = next;\n // Snapshot observers: notify() may mutate downstream sets, not ours.\n for (const obs of [...this.observers]) obs.notify();\n if (batchDepth === 0) flush();\n }\n\n update(fn: (prev: T) => T): void {\n this.set(fn(this.value));\n }\n}\n\nclass ComputedNode<T> implements Source, Observer {\n readonly observers = new Set<Observer>();\n readonly sources = new Set<Source>();\n private value!: T;\n private dirty = true;\n\n constructor(private readonly fn: () => T) {}\n\n notify(): void {\n if (this.dirty) return; // already invalidated; observers already notified\n this.dirty = true;\n for (const obs of [...this.observers]) obs.notify();\n }\n\n get(): T {\n link(this);\n if (this.dirty) this.recompute();\n return this.value;\n }\n\n peek(): T {\n if (this.dirty) this.recompute();\n return this.value;\n }\n\n private recompute(): void {\n clearSources(this);\n const prev = activeObserver;\n activeObserver = this;\n try {\n this.value = this.fn();\n this.dirty = false;\n } finally {\n activeObserver = prev;\n }\n }\n}\n\nclass EffectNode implements Observer {\n readonly sources = new Set<Source>();\n private cleanup: (() => void) | void = undefined;\n private disposed = false;\n\n constructor(private readonly fn: () => void | (() => void)) {\n this.run();\n }\n\n notify(): void {\n if (this.disposed) return;\n pendingEffects.add(this);\n }\n\n run(): void {\n if (this.disposed) return;\n this.runCleanup();\n clearSources(this);\n const prev = activeObserver;\n activeObserver = this;\n try {\n this.cleanup = this.fn();\n } finally {\n activeObserver = prev;\n }\n }\n\n private runCleanup(): void {\n if (typeof this.cleanup === \"function\") {\n this.cleanup();\n this.cleanup = undefined;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.runCleanup();\n clearSources(this);\n pendingEffects.delete(this);\n }\n}\n\n/** Create a writable reactive value. */\nexport function signal<T>(initial: T): WriteSignal<T> {\n return new SignalNode(initial);\n}\n\n/** Create a lazily-evaluated, cached derived value. */\nexport function computed<T>(fn: () => T): ReadSignal<T> {\n return new ComputedNode(fn);\n}\n\n/**\n * Run `fn` immediately and again whenever a signal/computed it read changes.\n * `fn` may return a cleanup function, run before each re-run and on dispose.\n * Returns a {@link Dispose} to stop the effect.\n */\nexport function effect(fn: () => void | (() => void)): Dispose {\n const node = new EffectNode(fn);\n return () => node.dispose();\n}\n\n/** Read reactive values inside `fn` without subscribing the current observer. */\nexport function untrack<T>(fn: () => T): T {\n const prev = activeObserver;\n activeObserver = null;\n try {\n return fn();\n } finally {\n activeObserver = prev;\n }\n}\n\n/** Batch multiple writes so effects flush once, after `fn` returns. */\nexport function batch<T>(fn: () => T): T {\n batchDepth++;\n try {\n return fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) flush();\n }\n}\n\n/** True when called inside an effect/computed tracking context. */\nexport function isTracking(): boolean {\n return activeObserver !== null;\n}\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"reactive.cjs","sourcesContent":[]}
@@ -1,45 +1 @@
1
- /**
2
- * Fine-grained reactivity — the engine behind Formwright's surgical DOM updates.
3
- *
4
- * This is a small, correct, **zero-dependency** push-pull implementation:
5
- * - {@link signal} holds a value and the set of observers that read it.
6
- * - {@link computed} is lazy and cached: it recomputes only when read *after* a
7
- * dependency changed.
8
- * - {@link effect} runs immediately and re-runs when any signal/computed it read
9
- * changes — this is what binds a single value to a single DOM node.
10
- *
11
- * Writing a signal marks the dependency graph dirty and synchronously flushes the
12
- * affected effects (so DOM updates are immediate and deterministic). Only effects
13
- * that actually read the changed value re-run — there is no diffing and no virtual
14
- * DOM. The public surface here is intentionally framework-agnostic and swappable
15
- * (e.g. for `alien-signals`) without touching the rest of the library.
16
- */
17
- interface ReadSignal<T> {
18
- /** Read the value and subscribe the current effect/computed to changes. */
19
- get(): T;
20
- /** Read the value without subscribing. */
21
- peek(): T;
22
- }
23
- interface WriteSignal<T> extends ReadSignal<T> {
24
- set(value: T): void;
25
- update(fn: (prev: T) => T): void;
26
- }
27
- type Dispose = () => void;
28
- /** Create a writable reactive value. */
29
- declare function signal<T>(initial: T): WriteSignal<T>;
30
- /** Create a lazily-evaluated, cached derived value. */
31
- declare function computed<T>(fn: () => T): ReadSignal<T>;
32
- /**
33
- * Run `fn` immediately and again whenever a signal/computed it read changes.
34
- * `fn` may return a cleanup function, run before each re-run and on dispose.
35
- * Returns a {@link Dispose} to stop the effect.
36
- */
37
- declare function effect(fn: () => void | (() => void)): Dispose;
38
- /** Read reactive values inside `fn` without subscribing the current observer. */
39
- declare function untrack<T>(fn: () => T): T;
40
- /** Batch multiple writes so effects flush once, after `fn` returns. */
41
- declare function batch<T>(fn: () => T): T;
42
- /** True when called inside an effect/computed tracking context. */
43
- declare function isTracking(): boolean;
44
-
45
- export { type Dispose, type ReadSignal, type WriteSignal, batch, computed, effect, isTracking, signal, untrack };
1
+ export { Dispose, ReadSignal, WriteSignal, batch, computed, effect, isTracking, signal, untrack } from '@wright/reactive';
@@ -1,45 +1 @@
1
- /**
2
- * Fine-grained reactivity — the engine behind Formwright's surgical DOM updates.
3
- *
4
- * This is a small, correct, **zero-dependency** push-pull implementation:
5
- * - {@link signal} holds a value and the set of observers that read it.
6
- * - {@link computed} is lazy and cached: it recomputes only when read *after* a
7
- * dependency changed.
8
- * - {@link effect} runs immediately and re-runs when any signal/computed it read
9
- * changes — this is what binds a single value to a single DOM node.
10
- *
11
- * Writing a signal marks the dependency graph dirty and synchronously flushes the
12
- * affected effects (so DOM updates are immediate and deterministic). Only effects
13
- * that actually read the changed value re-run — there is no diffing and no virtual
14
- * DOM. The public surface here is intentionally framework-agnostic and swappable
15
- * (e.g. for `alien-signals`) without touching the rest of the library.
16
- */
17
- interface ReadSignal<T> {
18
- /** Read the value and subscribe the current effect/computed to changes. */
19
- get(): T;
20
- /** Read the value without subscribing. */
21
- peek(): T;
22
- }
23
- interface WriteSignal<T> extends ReadSignal<T> {
24
- set(value: T): void;
25
- update(fn: (prev: T) => T): void;
26
- }
27
- type Dispose = () => void;
28
- /** Create a writable reactive value. */
29
- declare function signal<T>(initial: T): WriteSignal<T>;
30
- /** Create a lazily-evaluated, cached derived value. */
31
- declare function computed<T>(fn: () => T): ReadSignal<T>;
32
- /**
33
- * Run `fn` immediately and again whenever a signal/computed it read changes.
34
- * `fn` may return a cleanup function, run before each re-run and on dispose.
35
- * Returns a {@link Dispose} to stop the effect.
36
- */
37
- declare function effect(fn: () => void | (() => void)): Dispose;
38
- /** Read reactive values inside `fn` without subscribing the current observer. */
39
- declare function untrack<T>(fn: () => T): T;
40
- /** Batch multiple writes so effects flush once, after `fn` returns. */
41
- declare function batch<T>(fn: () => T): T;
42
- /** True when called inside an effect/computed tracking context. */
43
- declare function isTracking(): boolean;
44
-
45
- export { type Dispose, type ReadSignal, type WriteSignal, batch, computed, effect, isTracking, signal, untrack };
1
+ export { Dispose, ReadSignal, WriteSignal, batch, computed, effect, isTracking, signal, untrack } from '@wright/reactive';
package/dist/reactive.js CHANGED
@@ -1,3 +1,3 @@
1
- export { batch, computed, effect, isTracking, signal, untrack } from './chunk-EZUHEI5F.js';
1
+ export { batch, computed, effect, isTracking, signal, untrack } from './chunk-O4DUMDBU.js';
2
2
  //# sourceMappingURL=reactive.js.map
3
3
  //# sourceMappingURL=reactive.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formwright/core",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Signal-reactive core and the Form class for Formwright.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -31,7 +31,8 @@
31
31
  "module": "./dist/index.js",
32
32
  "types": "./dist/index.d.ts",
33
33
  "dependencies": {
34
- "@formwright/schema": "0.1.0"
34
+ "@formwright/schema": "0.2.0",
35
+ "@wright/reactive": "0.2.0"
35
36
  },
36
37
  "publishConfig": {
37
38
  "access": "public"