@takazudo/zfb 3.1.0 → 3.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/config.d.ts +28 -3
- package/dist/config.js +23 -12
- package/dist/config.js.map +1 -1
- package/dist/content.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js.map +1 -1
- package/dist/island-boundary.d.ts +2 -2
- package/dist/island-boundary.js +4 -2
- package/dist/island-boundary.js.map +1 -1
- package/dist/island.d.ts +8 -4
- package/dist/island.js +1 -1
- package/dist/island.js.map +1 -1
- package/dist/jsx-types.d.ts +1 -1
- package/dist/jsx-types.js.map +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/slugify.js.map +1 -1
- package/dist/zudo-react/description.d.ts +18 -0
- package/dist/zudo-react/description.js +41 -0
- package/dist/zudo-react/description.js.map +1 -1
- package/dist/zudo-react/dom-bindings.d.ts +2 -1
- package/dist/zudo-react/dom-bindings.js +16 -22
- package/dist/zudo-react/dom-bindings.js.map +1 -1
- package/dist/zudo-react/forms.js.map +1 -1
- package/dist/zudo-react/hydrate.js +20 -30
- package/dist/zudo-react/hydrate.js.map +1 -1
- package/dist/zudo-react/index.d.ts +2 -1
- package/dist/zudo-react/index.js.map +1 -1
- package/dist/zudo-react/jsx-dev-runtime.d.ts +2 -6
- package/dist/zudo-react/jsx-dev-runtime.js +3 -3
- package/dist/zudo-react/jsx-dev-runtime.js.map +1 -1
- package/dist/zudo-react/jsx-runtime.js +2 -2
- package/dist/zudo-react/jsx-runtime.js.map +1 -1
- package/dist/zudo-react/jsx-types.d.ts +59 -23
- package/dist/zudo-react/jsx-types.js.map +1 -1
- package/dist/zudo-react/props-transport.d.ts +2 -0
- package/dist/zudo-react/props-transport.js +42 -14
- package/dist/zudo-react/props-transport.js.map +1 -1
- package/dist/zudo-react/raw-html.d.ts +1 -0
- package/dist/zudo-react/raw-html.js +120 -0
- package/dist/zudo-react/raw-html.js.map +1 -0
- package/dist/zudo-react/reactive.js.map +1 -1
- package/dist/zudo-react/render-html.d.ts +11 -1
- package/dist/zudo-react/render-html.js +83 -56
- package/dist/zudo-react/render-html.js.map +1 -1
- package/dist/zudo-react/root.js +24 -1
- package/dist/zudo-react/root.js.map +1 -1
- package/dist/zudo-react/server.d.ts +2 -0
- package/dist/zudo-react/server.js.map +1 -1
- package/dist/zudo-react/style.d.ts +10 -0
- package/dist/zudo-react/style.js +525 -0
- package/dist/zudo-react/style.js.map +1 -0
- package/dist/zudo-react/testing.d.ts +27 -0
- package/dist/zudo-react/testing.js +117 -0
- package/dist/zudo-react/testing.js.map +1 -0
- package/dist/zudo-react/vocabulary.d.ts +7 -0
- package/dist/zudo-react/vocabulary.js +64 -5
- package/dist/zudo-react/vocabulary.js.map +1 -1
- package/package.json +16 -10
|
@@ -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\");\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"]}
|
|
@@ -5,11 +5,12 @@ import { isReactive, read, styleText, setAttribute, bind, listener } from "./dom
|
|
|
5
5
|
import { createRoot, diagnostic, report, rootPath, storedRoot, } from "./root.js";
|
|
6
6
|
import { subscribe } from "./reactive.js";
|
|
7
7
|
import { batch } from "./scheduler.js";
|
|
8
|
+
import { rawHtmlReserved } from "./raw-html.js";
|
|
8
9
|
import { Show, For, showProps, forProps, keyed, keyPayload, view } from "./structure.js";
|
|
9
|
-
import {
|
|
10
|
+
import { attributeError, commonAttrs, dialectSuggestion, emptyIframeChildren, formProps, htmlAttrs, htmlTags, isDialectProp, reactiveModelSuggestion, svgAttrs, svgTags, voidTags, } from "./vocabulary.js";
|
|
10
11
|
const HTML = "http://www.w3.org/1999/xhtml";
|
|
11
12
|
const SVG = "http://www.w3.org/2000/svg";
|
|
12
|
-
const sensitive = new Set("template noscript xmp
|
|
13
|
+
const sensitive = new Set("template noscript xmp noembed noframes plaintext".split(" "));
|
|
13
14
|
const tableChildren = {
|
|
14
15
|
table: new Set("caption colgroup thead tbody tfoot".split(" ")),
|
|
15
16
|
thead: new Set(["tr"]),
|
|
@@ -174,7 +175,7 @@ function scalar(value, path) {
|
|
|
174
175
|
}
|
|
175
176
|
function validateRawHtml(value, tag, path) {
|
|
176
177
|
if (typeof value !== "string" ||
|
|
177
|
-
|
|
178
|
+
rawHtmlReserved(value, tag) ||
|
|
178
179
|
(tag === "script" && /<\/script/i.test(value)) ||
|
|
179
180
|
(tag === "style" && /<\/style/i.test(value)))
|
|
180
181
|
fail("ZR_RAW_HTML", "setup", "valid rawHtml", typeof value, path);
|
|
@@ -207,6 +208,12 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
207
208
|
const childNamespace = tag === "foreignObject" ? HTML : ownNamespace;
|
|
208
209
|
const element = context.document.createElementNS(ownNamespace, tag);
|
|
209
210
|
const props = desc.props;
|
|
211
|
+
if (tag === "iframe") {
|
|
212
|
+
if (Object.hasOwn(props, "rawHtml"))
|
|
213
|
+
fail("ZR_RAW_HTML", "preflight", "iframe without rawHtml", "rawHtml", path);
|
|
214
|
+
if (!emptyIframeChildren(props.children))
|
|
215
|
+
fail("ZR_UNSUPPORTED_POSITION", "preflight", "empty iframe children", "children", path);
|
|
216
|
+
}
|
|
210
217
|
if (tag === "select" && read(props.multiple) === true)
|
|
211
218
|
fail("ZR_MODEL_UNSUPPORTED", "preflight", "single select", "multiple", path);
|
|
212
219
|
if (voidTags.has(tag) && ("children" in props || "rawHtml" in props))
|
|
@@ -289,24 +296,12 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
289
296
|
fail("ZR_ATTRIBUTE", "setup", "custom element string attribute", name, path);
|
|
290
297
|
if (/^on[a-z]/.test(name) && typeof initial === "function")
|
|
291
298
|
fail("ZR_PROP_DIALECT", "setup", "on:event", name, path);
|
|
299
|
+
const initialError = attributeError(name, initial, custom);
|
|
300
|
+
if (initialError)
|
|
301
|
+
fail("ZR_ATTRIBUTE", "setup", initialError, name, path);
|
|
292
302
|
if (initial != null) {
|
|
293
|
-
if (name === "start" &&
|
|
294
|
-
typeof initial !== "string" &&
|
|
295
|
-
!(typeof initial === "number" && Number.isFinite(initial)))
|
|
296
|
-
fail("ZR_ATTRIBUTE", "setup", "string or finite number", typeof initial, path);
|
|
297
|
-
else if (ownNamespace === SVG &&
|
|
298
|
-
(name === "width" || name === "height") &&
|
|
299
|
-
typeof initial !== "string" &&
|
|
300
|
-
!(typeof initial === "number" && Number.isFinite(initial)))
|
|
301
|
-
fail("ZR_ATTRIBUTE", "setup", "SVG dimension string or number", typeof initial, path);
|
|
302
303
|
if (name === "style")
|
|
303
304
|
styleText(initial);
|
|
304
|
-
else if (booleanAttrs.has(name) && typeof initial !== "boolean")
|
|
305
|
-
fail("ZR_ATTRIBUTE", "setup", "boolean", typeof initial, path);
|
|
306
|
-
else if (typeof initial !== "string" &&
|
|
307
|
-
typeof initial !== "number" &&
|
|
308
|
-
typeof initial !== "boolean")
|
|
309
|
-
fail("ZR_ATTRIBUTE", "setup", "scalar", typeof initial, path);
|
|
310
305
|
setAttribute(element, name, initial);
|
|
311
306
|
}
|
|
312
307
|
if (isReactive(original)) {
|
|
@@ -314,17 +309,9 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
314
309
|
context.operations.push((map, cleanups) => {
|
|
315
310
|
const node = map.get(element);
|
|
316
311
|
const subscription = bind(original, bindingScope, context.options, context.container, path, (value) => {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
!(typeof value === "number" && Number.isFinite(value)))
|
|
321
|
-
throw new TypeError("ZR_ATTRIBUTE: start requires a string or finite number");
|
|
322
|
-
if (ownNamespace === SVG &&
|
|
323
|
-
(name === "width" || name === "height") &&
|
|
324
|
-
value != null &&
|
|
325
|
-
typeof value !== "string" &&
|
|
326
|
-
!(typeof value === "number" && Number.isFinite(value)))
|
|
327
|
-
throw new TypeError(`ZR_ATTRIBUTE: SVG dimension ${name} requires a string or number`);
|
|
312
|
+
const error = attributeError(name, value, custom);
|
|
313
|
+
if (error)
|
|
314
|
+
throw new TypeError(`ZR_ATTRIBUTE: ${name} ${error}`);
|
|
328
315
|
setAttribute(node, name, value);
|
|
329
316
|
}, initial);
|
|
330
317
|
cleanups.push(() => subscription.dispose());
|
|
@@ -371,6 +358,9 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
371
358
|
});
|
|
372
359
|
}
|
|
373
360
|
}
|
|
361
|
+
else if (tag === "iframe") {
|
|
362
|
+
// The iframe document and fallback content are outside owned reconciliation.
|
|
363
|
+
}
|
|
374
364
|
else if (tag === "textarea" &&
|
|
375
365
|
(props.modelValue !== undefined || props.defaultValue !== undefined)) {
|
|
376
366
|
const value = String(read(props.modelValue ?? props.defaultValue));
|
|
@@ -815,7 +805,7 @@ function execute(node, container, options, mode) {
|
|
|
815
805
|
fail("ZR_IDENTITY", "preflight", options.identity.component, "different child component", rootPath(container));
|
|
816
806
|
scope = createScope({
|
|
817
807
|
component: options.identity.component,
|
|
818
|
-
|
|
808
|
+
reporter: (value) => report(options, value),
|
|
819
809
|
protocol,
|
|
820
810
|
build: options.identity.build,
|
|
821
811
|
path: rootPath(container),
|