@takazudo/zfb 4.4.0 → 4.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/css.d.ts +45 -0
- package/dist/css.js +137 -0
- package/dist/css.js.map +1 -0
- package/dist/zudo-react/dom-bindings.js +11 -5
- package/dist/zudo-react/dom-bindings.js.map +1 -1
- package/dist/zudo-react/error-boundary-client.d.ts +3 -0
- package/dist/zudo-react/error-boundary-client.js +232 -0
- package/dist/zudo-react/error-boundary-client.js.map +1 -0
- package/dist/zudo-react/error-boundary-type.d.ts +8 -0
- package/dist/zudo-react/error-boundary-type.js +25 -0
- package/dist/zudo-react/error-boundary-type.js.map +1 -0
- package/dist/zudo-react/error-boundary.d.ts +8 -0
- package/dist/zudo-react/error-boundary.js +13 -0
- package/dist/zudo-react/error-boundary.js.map +1 -0
- package/dist/zudo-react/form-recovery.d.ts +2 -0
- package/dist/zudo-react/form-recovery.js +116 -0
- package/dist/zudo-react/form-recovery.js.map +1 -0
- package/dist/zudo-react/forms.d.ts +38 -4
- package/dist/zudo-react/forms.js +143 -172
- package/dist/zudo-react/forms.js.map +1 -1
- package/dist/zudo-react/hydrate.d.ts +68 -0
- package/dist/zudo-react/hydrate.js +177 -89
- package/dist/zudo-react/hydrate.js.map +1 -1
- package/dist/zudo-react/index.d.ts +1 -0
- package/dist/zudo-react/index.js +1 -0
- package/dist/zudo-react/index.js.map +1 -1
- package/dist/zudo-react/render-html.js +55 -10
- package/dist/zudo-react/render-html.js.map +1 -1
- package/dist/zudo-react/scope.d.ts +21 -13
- package/dist/zudo-react/scope.js +141 -113
- package/dist/zudo-react/scope.js.map +1 -1
- package/dist/zudo-react/style.d.ts +0 -1
- package/dist/zudo-react/style.js +11 -503
- package/dist/zudo-react/style.js.map +1 -1
- package/dist/zudo-react/vocabulary.js +12 -49
- package/dist/zudo-react/vocabulary.js.map +1 -1
- package/package.json +11 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/zudo-react/forms.ts"],"names":[],"mappings":"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","sourcesContent":["import { batch } from \"./scheduler.js\";\nimport { isReactive } from \"./dom-bindings.js\";\nimport { subscribe } from \"./reactive.js\";\nimport type { Signal } from \"./reactive-types.js\";\nimport type { RuntimeScope } from \"./scope.js\";\nimport { diagnostic, report, rootPath, type RootOptions } from \"./root.js\";\n\nconst compositionKey = Symbol.for(\"@takazudo/zfb/zudo-react/composition-v1\");\nconst radioOwners = new WeakMap<\n Document,\n Set<{ root: Element; name: string; form: HTMLFormElement | null }>\n>();\ntype Control = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\ntype Model = Signal<string | boolean | null>;\nexport interface FormPlan {\n element: Element;\n props: Readonly<Record<string, unknown>>;\n path: string;\n}\ninterface Binding {\n node: Control;\n model: Model;\n kind: \"text\" | \"textarea\" | \"checkbox\" | \"select\" | \"radio\";\n read(): string | boolean | null;\n write(value: string | boolean | null): void;\n event: \"input\" | \"change\";\n path: string;\n}\nexport class FormError extends TypeError {\n constructor(\n readonly code: string,\n readonly path: string,\n readonly detail: string,\n ) {\n super(`${code}: ${detail} at ${path}`);\n }\n}\nfunction error(code: string, path: string, detail: string): never {\n throw new FormError(code, path, detail);\n}\nfunction writable(value: unknown, path: string): Model {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"$$zudoReactive\" in value) ||\n value.$$zudoReactive !== \"zudo-react.reactive.v1\" ||\n !(\"$$zudoWritable\" in value) ||\n value.$$zudoWritable !== \"zudo-react.writable.v1\"\n )\n error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n let proto = value;\n while (proto) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, \"value\");\n if (descriptor) {\n if (typeof descriptor.set !== \"function\")\n error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n return value as Model;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n}\nfunction kind(node: Element, props: Readonly<Record<string, unknown>>): Binding[\"kind\"] | null {\n if (node.localName === \"textarea\") return \"textarea\";\n if (node.localName === \"select\") return \"select\";\n if (node.localName !== \"input\") return null;\n const type = String(props.type ?? \"text\");\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n return [\"text\", \"search\", \"email\", \"url\", \"tel\", \"password\"].includes(type) ? \"text\" : null;\n}\n// Text input: read/write string .value; listen to input.\nfunction textAdapter(\n node: HTMLInputElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"input\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"text requires string\");\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Textarea: read/write string .value; listen to input.\nfunction textareaAdapter(\n node: HTMLTextAreaElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"input\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"textarea requires string\");\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Checkbox: read/write boolean .checked; listen to change.\nfunction checkboxAdapter(\n node: HTMLInputElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => node.checked,\n write: (value) => {\n if (typeof value !== \"boolean\") error(\"ZR_MODEL_VALUE\", path, \"checkbox requires boolean\");\n if (node.checked !== value) node.checked = value;\n },\n };\n}\n// Single select: read/write string .value after options exist; listen to change.\nfunction selectAdapter(\n node: HTMLSelectElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"select requires string\");\n if (!values(node).includes(value) && !(value === \"\" && node.selectedIndex === -1))\n error(\"ZR_MODEL_VALUE\", path, `select has no option ${value}`);\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Radio group: read selected option or null; write checked; listen to change.\nfunction radioAdapter(node: HTMLInputElement): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => (node.checked ? node.value : null),\n write: (value) => {\n const checked = value === node.value;\n if (node.checked !== checked) node.checked = checked;\n },\n };\n}\nfunction adapterFor(\n kind: Binding[\"kind\"],\n node: Control,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n switch (kind) {\n case \"text\":\n return textAdapter(node as HTMLInputElement, path);\n case \"textarea\":\n return textareaAdapter(node as HTMLTextAreaElement, path);\n case \"checkbox\":\n return checkboxAdapter(node as HTMLInputElement, path);\n case \"select\":\n return selectAdapter(node as HTMLSelectElement, path);\n case \"radio\":\n return radioAdapter(node as HTMLInputElement);\n }\n}\nfunction values(node: HTMLSelectElement): string[] {\n return [...node.options].map((option) => option.value);\n}\nfunction optionValuesFor(group: Binding[]): string[] {\n return group.map((binding) => (binding.node as HTMLInputElement).value);\n}\nexport function prepareForms(\n plans: FormPlan[],\n map: Map<Node, Node>,\n mode: \"hydrate\" | \"mount\",\n container: Element,\n): Binding[] {\n const bindings: Binding[] = [];\n const groupByModel = new Map<Model, Binding[]>();\n const namedRadios = new Map<string, Model>();\n for (const plan of plans) {\n const { props, path } = plan;\n const node = map.get(plan.element) as Element;\n const controlKind = kind(node, props);\n const modelValue = props.modelValue;\n const modelChecked = props.modelChecked;\n const hasValue = modelValue !== undefined;\n const hasChecked = modelChecked !== undefined;\n if (hasValue && hasChecked) error(\"ZR_MODEL_CONFLICT\", path, \"modelValue with modelChecked\");\n if (\n (props.defaultValue !== undefined && props.value !== undefined) ||\n (props.defaultChecked !== undefined && props.checked !== undefined)\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"default with static value or checked\");\n if (\n (hasValue &&\n (props.defaultValue !== undefined ||\n (controlKind !== \"radio\" && props.value !== undefined))) ||\n (hasChecked && (props.defaultChecked !== undefined || props.checked !== undefined))\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"model with default or static value\");\n if (\n props.defaultValue !== undefined &&\n ![\"text\", \"textarea\", \"select\"].includes(controlKind ?? \"\")\n )\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"defaultValue on unsupported control\");\n if (props.defaultChecked !== undefined && ![\"checkbox\", \"radio\"].includes(controlKind ?? \"\"))\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"defaultChecked on unsupported control\");\n if (node.localName === \"select\" && (node as HTMLSelectElement).multiple)\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"select[multiple]\");\n if (hasValue || hasChecked) {\n for (const name of [\"type\", \"multiple\", \"name\", \"form\"])\n if (isReactive(props[name])) error(\"ZR_MODEL_UNSUPPORTED\", path, `reactive ${name} shape`);\n if (\n !controlKind ||\n node.hasAttribute(\"contenteditable\") ||\n (hasChecked && controlKind !== \"checkbox\") ||\n (hasValue && controlKind === \"checkbox\")\n )\n error(\"ZR_MODEL_UNSUPPORTED\", path, node.localName);\n const model = writable(hasValue ? modelValue : modelChecked, path);\n const initial = model.value;\n if (\n controlKind === \"checkbox\"\n ? typeof initial !== \"boolean\"\n : controlKind === \"radio\"\n ? initial !== null && typeof initial !== \"string\"\n : typeof initial !== \"string\"\n )\n error(\"ZR_MODEL_VALUE\", path, \"model has wrong value type\");\n if (controlKind === \"select\") {\n const options = [...(node as HTMLSelectElement).options].map((option) => option.value);\n if (new Set(options).size !== options.length)\n error(\"ZR_MODEL_CONFLICT\", path, \"duplicate select option value\");\n }\n if (controlKind === \"radio\") {\n const radio = node as HTMLInputElement;\n if (!radio.name || typeof props.value !== \"string\")\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"radio requires static name and value\");\n const owners = radioOwners.get(node.ownerDocument);\n if (\n [...(owners ?? [])].some(\n (entry) =>\n entry.root !== container && entry.name === radio.name && entry.form === radio.form,\n )\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"same-name radio owned by another root\");\n const key = `${radio.name}\\u0000${radio.getAttribute(\"form\") ?? \"\"}`;\n const prior = namedRadios.get(key);\n if (prior && prior !== model)\n error(\"ZR_MODEL_CONFLICT\", path, \"same-name radios use different models\");\n namedRadios.set(key, model);\n }\n const binding: Binding = {\n node: node as Control,\n model,\n kind: controlKind!,\n path,\n ...adapterFor(controlKind!, node as Control, path),\n };\n bindings.push(binding);\n const group = groupByModel.get(model) ?? [];\n group.push(binding);\n groupByModel.set(model, group);\n }\n }\n for (const [model, group] of groupByModel) {\n const radios = group.every((binding) => binding.kind === \"radio\");\n if (group.some((binding) => binding.kind === \"radio\") && !radios)\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"radio and non-radio share model\");\n if (radios) {\n const nodes = group.map((binding) => binding.node as HTMLInputElement);\n const names = new Set(\n nodes.map((node) => `${node.name}\\u0000${node.getAttribute(\"form\") ?? \"\"}`),\n );\n const optionValues = nodes.map((node) => node.value);\n if (\n names.size !== 1 ||\n new Set(nodes.map((node) => node.form)).size !== 1 ||\n new Set(optionValues).size !== optionValues.length\n )\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"radio group membership or duplicate value\");\n if (mode === \"mount\" && model.value !== null && !optionValues.includes(model.value as string))\n error(\"ZR_MODEL_VALUE\", group[0]!.path, \"radio model has no option\");\n if (mode === \"hydrate\" && nodes.filter((node) => node.checked).length > 1)\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"multiple checked radios\");\n } else if (\n mode === \"hydrate\" &&\n group.some((binding) => !Object.is(binding.read(), group[0]!.read()))\n )\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"shared model controls disagree\");\n if (radios) {\n for (const binding of group) {\n const originalWrite = binding.write;\n binding.write = (value) => {\n if (value !== null && !optionValuesFor(group).includes(value as string))\n error(\"ZR_MODEL_VALUE\", binding.path, \"radio model has no option\");\n originalWrite(value);\n };\n }\n }\n }\n return bindings;\n}\nexport function reconcileForms(bindings: Binding[], mode: \"hydrate\" | \"mount\"): void {\n const groups = new Map<Model, Binding[]>();\n for (const binding of bindings)\n groups.set(binding.model, [...(groups.get(binding.model) ?? []), binding]);\n if (mode === \"hydrate\")\n batch(() => {\n for (const [model, group] of groups) {\n model.value =\n group[0]!.kind === \"radio\"\n ? (group.find((binding) => binding.read() !== null)?.read() ?? null)\n : group[0]!.read();\n }\n });\n else for (const [model, group] of groups) for (const binding of group) binding.write(model.value);\n}\nexport function activateForms(\n bindings: Binding[],\n scope: RuntimeScope,\n cleanups: Array<() => void>,\n options: RootOptions,\n container: Element,\n): void {\n const byForm = new Map<HTMLFormElement, Binding[]>();\n const owned =\n radioOwners.get(container.ownerDocument) ??\n new Set<{ root: Element; name: string; form: HTMLFormElement | null }>();\n radioOwners.set(container.ownerDocument, owned);\n const registrations: Array<{ root: Element; name: string; form: HTMLFormElement | null }> = [];\n for (const binding of bindings)\n if (binding.kind === \"radio\") {\n const node = binding.node as HTMLInputElement;\n const registration = { root: container, name: node.name, form: node.form };\n registrations.push(registration);\n owned.add(registration);\n }\n cleanups.push(() => {\n for (const registration of registrations) owned.delete(registration);\n });\n for (const binding of bindings) {\n const { node, model } = binding;\n const textual = binding.kind === \"text\" || binding.kind === \"textarea\";\n let composing =\n textual && (node as unknown as Record<symbol, unknown>)[compositionKey] === \"active\";\n let unknown =\n textual &&\n node.ownerDocument.activeElement === node &&\n (node as unknown as Record<symbol, unknown>)[compositionKey] === undefined;\n const update = () => {\n model.value = binding.read();\n };\n const onInput = (event: Event) => {\n if (binding.kind === \"radio\" && !(node as HTMLInputElement).checked) return;\n if (textual && (event as InputEvent).isComposing) composing = true;\n update();\n };\n const onStart = () => {\n composing = true;\n unknown = false;\n };\n const onFinish = () => {\n composing = false;\n unknown = false;\n update();\n };\n node.addEventListener(binding.event, onInput);\n if (textual) {\n node.addEventListener(\"compositionstart\", onStart);\n node.addEventListener(\"compositionend\", onFinish);\n node.addEventListener(\"blur\", onFinish);\n }\n cleanups.push(() => {\n node.removeEventListener(binding.event, onInput);\n if (textual) {\n node.removeEventListener(\"compositionstart\", onStart);\n node.removeEventListener(\"compositionend\", onFinish);\n node.removeEventListener(\"blur\", onFinish);\n }\n });\n const subscription = subscribe(\n () => {\n const value = model.value;\n if (!composing && !unknown) {\n try {\n binding.write(value);\n } catch (failure) {\n if (!(failure instanceof FormError)) throw failure;\n report(\n options,\n diagnostic(\n options,\n failure.code,\n \"update\",\n `${rootPath(container)}${binding.path}`,\n \"valid model update\",\n failure.detail,\n ),\n );\n }\n }\n },\n {\n active: () => scope.active,\n report: (code, actual) =>\n report(\n options,\n diagnostic(\n options,\n code,\n \"update\",\n `${rootPath(container)}${binding.path}`,\n \"valid model update\",\n actual,\n ),\n ),\n },\n );\n subscription.run();\n cleanups.push(() => subscription.dispose());\n const form = node.form;\n if (form) byForm.set(form, [...(byForm.get(form) ?? []), binding]);\n }\n for (const [form, members] of byForm) {\n let active = true;\n const onReset = (event: Event) =>\n queueMicrotask(() => {\n if (!active || event.defaultPrevented) return;\n batch(() => {\n const groups = new Map<Model, Binding[]>();\n for (const binding of members)\n groups.set(binding.model, [...(groups.get(binding.model) ?? []), binding]);\n for (const [model, group] of groups)\n model.value =\n group[0]!.kind === \"radio\"\n ? (group.find((binding) => binding.read() !== null)?.read() ?? null)\n : group[0]!.read();\n });\n });\n form.addEventListener(\"reset\", onReset);\n cleanups.push(() => {\n active = false;\n form.removeEventListener(\"reset\", onReset);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/zudo-react/forms.ts"],"names":[],"mappings":"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","sourcesContent":["import { batch } from \"./scheduler.js\";\nimport { isReactive } from \"./dom-bindings.js\";\nimport { subscribe } from \"./reactive.js\";\nimport type { Signal } from \"./reactive-types.js\";\nimport type { RuntimeScope } from \"./scope.js\";\nimport { diagnostic, report, rootPath, type RootOptions } from \"./root.js\";\n\nconst compositionKey = Symbol.for(\"@takazudo/zfb/zudo-react/composition-v1\");\n// Capture every live model before a first boundary can appear in a later render.\nconst controlOwners = new WeakMap<Document, Set<ControlOwner>>();\nexport interface ControlOwner {\n root: Element;\n name: string;\n form: HTMLFormElement | null;\n binding: Binding;\n scope: RuntimeScope;\n}\ntype Control = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\nexport type Model = Signal<string | boolean | null>;\nexport interface FormPlan {\n element: Element;\n props: Readonly<Record<string, unknown>>;\n path: string;\n}\nexport interface Binding {\n node: Control;\n model: Model;\n group?: Binding[];\n fresh: boolean;\n live: boolean;\n kind: \"text\" | \"textarea\" | \"checkbox\" | \"select\" | \"radio\";\n read(): string | boolean | null;\n write(value: string | boolean | null): void;\n event: \"input\" | \"change\";\n path: string;\n}\nexport class FormError extends TypeError {\n declare readonly code: string;\n declare readonly path: string;\n declare readonly detail: string;\n constructor(code: string, path: string, detail: string) {\n super(`${code}: ${detail} at ${path}`);\n Object.assign(this, { code, path, detail });\n }\n}\n\nfunction error(code: string, path: string, detail: string): never {\n throw new FormError(code, path, detail);\n}\nfunction writable(value: unknown, path: string): Model {\n if (\n isReactive(value) &&\n \"$$zudoWritable\" in value &&\n value.$$zudoWritable === \"zudo-react.writable.v1\"\n ) {\n let proto: object | null = value;\n while (proto) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, \"value\");\n if (descriptor) {\n if (typeof descriptor.set === \"function\") return value as Model;\n break;\n }\n proto = Object.getPrototypeOf(proto);\n }\n }\n return error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n}\n\nfunction kind(node: Element, props: Readonly<Record<string, unknown>>): Binding[\"kind\"] | null {\n if (node.localName === \"textarea\") return \"textarea\";\n if (node.localName === \"select\") return \"select\";\n if (node.localName !== \"input\") return null;\n const type = String(props.type ?? \"text\");\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n return [\"text\", \"search\", \"email\", \"url\", \"tel\", \"password\"].includes(type) ? \"text\" : null;\n}\n// All adapters preserve native input/change events and avoid redundant writes.\nfunction adapterFor(\n kind: Binding[\"kind\"],\n control: Control,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n const node = control as HTMLInputElement;\n const radio = kind === \"radio\";\n const checkbox = kind === \"checkbox\";\n const property = checkbox || radio ? \"checked\" : \"value\";\n return {\n event: kind === \"text\" || kind === \"textarea\" ? \"input\" : \"change\",\n read: () => (radio ? (node.checked ? node.value : null) : node[property]),\n write: (value) => {\n if (!radio) {\n if (typeof value !== (checkbox ? \"boolean\" : \"string\"))\n error(\"ZR_MODEL_VALUE\", path, `${kind} requires ${checkbox ? \"boolean\" : \"string\"}`);\n if (\n kind === \"select\" &&\n !values(control as HTMLSelectElement).includes(value as string) &&\n !(value === \"\" && (control as HTMLSelectElement).selectedIndex === -1)\n )\n error(\"ZR_MODEL_VALUE\", path, `select has no option ${value}`);\n }\n const next = radio ? value === node.value : value;\n if (node[property] !== next) (node as unknown as Record<string, unknown>)[property] = next;\n },\n };\n}\nfunction values(node: HTMLSelectElement): string[] {\n return [...node.options].map((option) => option.value);\n}\nfunction optionValuesFor(group: Binding[]): string[] {\n return group.map((binding) => (binding.node as HTMLInputElement).value);\n}\nfunction groupBindings(bindings: Binding[]): Map<Model, Binding[]> {\n const groups = new Map<Model, Binding[]>();\n for (const binding of bindings) {\n const group = groups.get(binding.model) ?? [];\n group.push(binding);\n groups.set(binding.model, group);\n }\n return groups;\n}\nexport function prepareForms(\n plans: FormPlan[],\n map: Map<Node, Node>,\n mode: \"hydrate\" | \"mount\",\n container: Element,\n replacing: readonly RuntimeScope[] = [],\n parent?: Node | null,\n): Binding[] {\n const recovery = formRecoveries.get(container);\n const state = recovery?.prepare(plans, map, mode, replacing, parent);\n const form = state?.form ?? ((node: HTMLInputElement) => node.form);\n const bindings: Binding[] = [];\n const namedRadios = new Map<string, Model>();\n for (const plan of plans) {\n const { props, path } = plan;\n const node = map.get(plan.element) as Element;\n const controlKind = kind(node, props);\n const modelValue = props.modelValue;\n const modelChecked = props.modelChecked;\n const hasValue = modelValue !== undefined;\n const hasChecked = modelChecked !== undefined;\n if (hasValue && hasChecked) error(\"ZR_MODEL_CONFLICT\", path, \"modelValue with modelChecked\");\n if (\n (props.defaultValue !== undefined && props.value !== undefined) ||\n (props.defaultChecked !== undefined && props.checked !== undefined)\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"default with static value or checked\");\n if (\n (hasValue &&\n (props.defaultValue !== undefined ||\n (controlKind !== \"radio\" && props.value !== undefined))) ||\n (hasChecked && (props.defaultChecked !== undefined || props.checked !== undefined))\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"model with default or static value\");\n if (\n props.defaultValue !== undefined &&\n ![\"text\", \"textarea\", \"select\"].includes(controlKind ?? \"\")\n )\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"defaultValue on unsupported control\");\n if (props.defaultChecked !== undefined && ![\"checkbox\", \"radio\"].includes(controlKind ?? \"\"))\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"defaultChecked on unsupported control\");\n if (node.localName === \"select\" && (node as HTMLSelectElement).multiple)\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"select[multiple]\");\n if (hasValue || hasChecked) {\n for (const name of [\"type\", \"multiple\", \"name\", \"form\"])\n if (isReactive(props[name])) error(\"ZR_MODEL_UNSUPPORTED\", path, `reactive ${name} shape`);\n if (\n !controlKind ||\n node.hasAttribute(\"contenteditable\") ||\n (hasChecked && controlKind !== \"checkbox\") ||\n (hasValue && controlKind === \"checkbox\")\n )\n error(\"ZR_MODEL_UNSUPPORTED\", path, node.localName);\n const model = writable(hasValue ? modelValue : modelChecked, path);\n const initial = model.value;\n if (\n controlKind === \"checkbox\"\n ? typeof initial !== \"boolean\"\n : controlKind === \"radio\"\n ? initial !== null && typeof initial !== \"string\"\n : typeof initial !== \"string\"\n )\n error(\"ZR_MODEL_VALUE\", path, \"model has wrong value type\");\n if (controlKind === \"select\") {\n const options = [...(node as HTMLSelectElement).options].map((option) => option.value);\n if (new Set(options).size !== options.length)\n error(\"ZR_MODEL_CONFLICT\", path, \"duplicate select option value\");\n }\n if (controlKind === \"radio\") {\n const radio = node as HTMLInputElement;\n if (!radio.name || typeof props.value !== \"string\")\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"radio requires static name and value\");\n const owners = controlOwners.get(node.ownerDocument);\n if (\n [...(owners ?? [])].some(\n (entry) =>\n entry.root !== container &&\n entry.binding.kind === \"radio\" &&\n entry.name === radio.name &&\n entry.form === form(radio),\n )\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"same-name radio owned by another root\");\n const key = `${radio.name}\\u0000${radio.getAttribute(\"form\") ?? \"\"}`;\n const prior = namedRadios.get(key);\n if (prior && prior !== model)\n error(\"ZR_MODEL_CONFLICT\", path, \"same-name radios use different models\");\n namedRadios.set(key, model);\n }\n const binding: Binding = {\n node: node as Control,\n model,\n fresh: mode === \"hydrate\" && node === plan.element,\n live: false,\n kind: controlKind!,\n path,\n ...adapterFor(controlKind!, node as Control, path),\n };\n bindings.push(binding);\n }\n }\n const groupByModel = groupBindings(bindings);\n if (recovery) recovery.validate(groupByModel, mode, state!);\n else {\n for (const [model, group] of groupByModel) {\n const radios = group.every((binding) => binding.kind === \"radio\");\n if (group.some((binding) => binding.kind === \"radio\") && !radios)\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"radio and non-radio share model\");\n if (radios) {\n const nodes = group.map((binding) => binding.node as HTMLInputElement);\n const names = new Set(\n nodes.map((node) => `${node.name}\\u0000${node.getAttribute(\"form\") ?? \"\"}`),\n );\n const optionValues = nodes.map((node) => node.value);\n if (\n names.size !== 1 ||\n new Set(nodes.map((node) => node.form)).size !== 1 ||\n new Set(optionValues).size !== optionValues.length\n )\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"radio group membership or duplicate value\");\n if (\n mode === \"mount\" &&\n model.value !== null &&\n !optionValues.includes(model.value as string)\n )\n error(\"ZR_MODEL_VALUE\", group[0]!.path, \"radio model has no option\");\n if (mode === \"hydrate\" && nodes.filter((node) => node.checked).length > 1)\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"multiple checked radios\");\n } else if (\n mode === \"hydrate\" &&\n group.some((binding) => !Object.is(binding.read(), group[0]!.read()))\n )\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"shared model controls disagree\");\n }\n }\n for (const group of groupByModel.values()) {\n if (group[0]!.kind === \"radio\") {\n for (const binding of group) {\n const originalWrite = binding.write;\n binding.write = (value) => {\n if (\n value !== null &&\n !optionValuesFor(formRecoveries.get(container)?.members(binding) ?? group).includes(\n value as string,\n )\n )\n error(\"ZR_MODEL_VALUE\", binding.path, \"radio model has no option\");\n originalWrite(value);\n };\n }\n }\n }\n return bindings;\n}\nexport function reconcileForms(\n bindings: Binding[],\n mode: \"hydrate\" | \"mount\",\n container: Element,\n): void {\n const groups = groupBindings(bindings);\n const recovery = formRecoveries.get(container);\n if (recovery) return recovery.reconcile(groups, mode);\n if (mode === \"hydrate\") readModels(groups);\n else for (const [model, group] of groups) for (const binding of group) binding.write(model.value);\n}\nfunction readModels(groups: Map<Model, Binding[]>): void {\n batch(() => {\n for (const [model, group] of groups)\n model.value =\n group[0]!.kind === \"radio\"\n ? (group.find((binding) => binding.read() !== null)?.read() ?? null)\n : group[0]!.read();\n });\n}\n\nexport function activateForms(\n bindings: Binding[],\n scope: RuntimeScope,\n cleanups: Array<() => void>,\n options: RootOptions,\n container: Element,\n): void {\n const byForm = new Map<HTMLFormElement, Binding[]>();\n const owned = controlOwners.get(container.ownerDocument) ?? new Set<ControlOwner>();\n controlOwners.set(container.ownerDocument, owned);\n const registrations: ControlOwner[] = [];\n for (const binding of bindings) {\n const node = binding.node as HTMLInputElement;\n const registration = {\n root: container,\n name: node.name,\n form: (node.hasAttribute(\"form\")\n ? node.ownerDocument.getElementById(node.getAttribute(\"form\")!)\n : node.closest(\"form\")) as HTMLFormElement | null,\n binding,\n scope,\n };\n registrations.push(registration);\n owned.add(registration);\n }\n cleanups.push(() => {\n for (const registration of registrations) {\n registration.binding.live = false;\n owned.delete(registration);\n }\n });\n for (const binding of bindings) {\n const { node, model } = binding;\n const textual = binding.kind === \"text\" || binding.kind === \"textarea\";\n let composing =\n textual && (node as unknown as Record<symbol, unknown>)[compositionKey] === \"active\";\n let unknown =\n textual &&\n node.ownerDocument.activeElement === node &&\n (node as unknown as Record<symbol, unknown>)[compositionKey] === undefined;\n const update = () => {\n model.value = binding.read();\n };\n const onInput = (event: Event) => {\n if (binding.kind === \"radio\" && !(node as HTMLInputElement).checked) return;\n if (textual && (event as InputEvent).isComposing) composing = true;\n update();\n };\n const onStart = () => {\n composing = true;\n unknown = false;\n };\n const onFinish = () => {\n composing = false;\n unknown = false;\n update();\n };\n const listeners: Array<[string, (event: Event) => void]> = [[binding.event, onInput]];\n if (textual)\n listeners.push(\n [\"compositionstart\", onStart],\n [\"compositionend\", onFinish],\n [\"blur\", onFinish],\n );\n for (const [name, handler] of listeners) node.addEventListener(name, handler);\n cleanups.push(() => {\n for (const [name, handler] of listeners) node.removeEventListener(name, handler);\n });\n const reportUpdate = (code: string, actual: string): void =>\n report(\n options,\n diagnostic(\n options,\n code,\n \"update\",\n `${rootPath(container)}${binding.path}`,\n \"valid model update\",\n actual,\n ),\n );\n const subscription = subscribe(\n () => {\n const value = model.value;\n if (!composing && !unknown) {\n try {\n binding.write(value);\n } catch (failure) {\n if (!(failure instanceof FormError)) throw failure;\n reportUpdate(failure.code, failure.detail);\n }\n }\n },\n {\n active: () => scope.active,\n report: reportUpdate,\n },\n );\n subscription.run();\n binding.live = true;\n cleanups.push(() => subscription.dispose());\n const form = node.form;\n if (form) byForm.set(form, [...(byForm.get(form) ?? []), binding]);\n }\n for (const [form, members] of byForm) {\n let active = true;\n const onReset = (event: Event) =>\n queueMicrotask(() => {\n if (!active || event.defaultPrevented) return;\n // A boundary owns only part of a native radio group. Read all current\n // members after the browser reset, not just this scope's unchecked part.\n // Keep ownership-local listeners so disposing a replaced attempt still\n // cancels its queued reset work.\n const recovery = formRecoveries.get(container);\n const current = recovery\n ? [\n ...new Set(members.flatMap((binding) => recovery.members(binding) ?? [binding])),\n ].filter((binding) => binding.node.form === form)\n : members;\n readModels(groupBindings(current));\n });\n form.addEventListener(\"reset\", onReset);\n cleanups.push(() => {\n active = false;\n form.removeEventListener(\"reset\", onReset);\n });\n }\n}\n\nconst formRecoveries = new WeakMap<Element, FormRecovery>();\nexport interface FormState {\n form(node: HTMLInputElement): Node | null;\n installed: ControlOwner[];\n}\nexport interface FormRecovery {\n prepare(\n plans: FormPlan[],\n map: Map<Node, Node>,\n mode: \"hydrate\" | \"mount\",\n replacing: readonly RuntimeScope[],\n parent?: Node | null,\n ): FormState;\n validate(groups: Map<Model, Binding[]>, mode: \"hydrate\" | \"mount\", state: FormState): void;\n members(binding: Binding): Binding[] | undefined;\n reconcile(groups: Map<Model, Binding[]>, mode: \"hydrate\" | \"mount\"): void;\n}\nexport interface FormHost {\n controlOwners: typeof controlOwners;\n error: typeof error;\n batch: typeof batch;\n}\nexport const formHost = { controlOwners, error, batch, recoveries: formRecoveries };\n"]}
|
|
@@ -1,4 +1,72 @@
|
|
|
1
|
+
import { recoverable } from "./error-boundary-type.js";
|
|
2
|
+
import { prepareForms, formHost, type FormPlan } from "./forms.js";
|
|
1
3
|
import { type Child } from "./description.js";
|
|
4
|
+
import { RuntimeScope } from "./scope.js";
|
|
5
|
+
import { read } from "./dom-bindings.js";
|
|
2
6
|
import { type RootHandle, type RootOptions } from "./root.js";
|
|
7
|
+
import { subscribe, untracked } from "./reactive.js";
|
|
8
|
+
import { enqueue } from "./scheduler.js";
|
|
9
|
+
type Operation = (map: Map<Node, Node>, cleanups: Array<() => void>) => void;
|
|
10
|
+
export interface BuildContext {
|
|
11
|
+
readonly document: Document;
|
|
12
|
+
readonly options: RootOptions;
|
|
13
|
+
readonly container: Element;
|
|
14
|
+
readonly root: RuntimeScope;
|
|
15
|
+
scope: RuntimeScope;
|
|
16
|
+
next: number;
|
|
17
|
+
prefix?: string;
|
|
18
|
+
readonly operations: Operation[];
|
|
19
|
+
readonly forms: FormPlan[];
|
|
20
|
+
readonly formOwners: WeakMap<FormPlan, Owned>;
|
|
21
|
+
readonly opaque: WeakSet<Node>;
|
|
22
|
+
readonly textSlots: WeakSet<Node>;
|
|
23
|
+
readonly displayOnlyTextareas: WeakSet<Node>;
|
|
24
|
+
readonly dynamicRanges: Array<readonly [Comment, Comment]>;
|
|
25
|
+
collectRootRanges: boolean;
|
|
26
|
+
readonly errorRanges: WeakMap<Node, (wants: Node[], has: Node[], i: number, j: number, map: Map<Node, Node>, path: string) => [number, number]>;
|
|
27
|
+
readonly replacements: Array<() => void>;
|
|
28
|
+
}
|
|
29
|
+
export interface Owned {
|
|
30
|
+
scope: RuntimeScope;
|
|
31
|
+
fragment: DocumentFragment;
|
|
32
|
+
operations: Operation[];
|
|
33
|
+
forms: FormPlan[];
|
|
34
|
+
formOwners: WeakMap<FormPlan, Owned>;
|
|
35
|
+
cleanups: Array<() => void>;
|
|
36
|
+
}
|
|
37
|
+
declare function owned(context: BuildContext, name: string, namespace: string, parentTag: string, path: string, factory: () => Child, initial: boolean, kind?: string, parentScope?: RuntimeScope): Owned;
|
|
38
|
+
declare function installOwned(instance: Owned, map: Map<Node, Node>, context: BuildContext, mode: "hydrate" | "mount"): void;
|
|
39
|
+
declare function selfMap(fragment: DocumentFragment): Map<Node, Node>;
|
|
40
|
+
declare class Failure extends Error {
|
|
41
|
+
readonly code: string;
|
|
42
|
+
readonly phase: "setup" | "preflight" | "commit" | "activation";
|
|
43
|
+
readonly expected: string;
|
|
44
|
+
readonly actual: string;
|
|
45
|
+
readonly path: string;
|
|
46
|
+
constructor(code: string, phase: Failure["phase"], expected: string, actual: string, path: string);
|
|
47
|
+
}
|
|
48
|
+
declare function fail(code: string, phase: Failure["phase"], expected: string, actual: string, path: string, fatal?: boolean): never;
|
|
49
|
+
declare function marker(context: BuildContext, parent: Node, kind: string, content: () => void): [Comment, Comment];
|
|
50
|
+
declare function range(start: Node, end: Node): Node[];
|
|
51
|
+
declare function openMarker(node: Node): RegExpExecArray | null;
|
|
52
|
+
declare function matchingClose(nodes: Node[], start: number): number;
|
|
3
53
|
export declare function hydrate(node: Child, container: Element, options: RootOptions): RootHandle | null;
|
|
4
54
|
export declare function mount(node: Child, container: Element, options: RootOptions): RootHandle | null;
|
|
55
|
+
export interface BoundaryHost {
|
|
56
|
+
owned: typeof owned;
|
|
57
|
+
installOwned: typeof installOwned;
|
|
58
|
+
selfMap: typeof selfMap;
|
|
59
|
+
marker: typeof marker;
|
|
60
|
+
range: typeof range;
|
|
61
|
+
fail: typeof fail;
|
|
62
|
+
openMarker: typeof openMarker;
|
|
63
|
+
matchingClose: typeof matchingClose;
|
|
64
|
+
recoverable: typeof recoverable;
|
|
65
|
+
prepareForms: typeof prepareForms;
|
|
66
|
+
read: typeof read;
|
|
67
|
+
subscribe: typeof subscribe;
|
|
68
|
+
untracked: typeof untracked;
|
|
69
|
+
enqueue: typeof enqueue;
|
|
70
|
+
formHost: typeof formHost;
|
|
71
|
+
}
|
|
72
|
+
export {};
|