From 4ec36ef01e377e06b1797a75446fc421d79414bf Mon Sep 17 00:00:00 2001 From: Florian Laabs Date: Fri, 23 Oct 2026 19:39:47 +0200 Subject: [PATCH 1/5] fix(vue): type bindInput for Input and Textarea in SFC templates Input and Textarea emit string | undefined (defineModel); bindInput declared string only, which vue-tsc reported for . A type test in packages/vue/typecheck checks the bind helpers against the components. Signed-off-by: Florian Laabs --- .changeset/vue-bind-input-types.md | 7 +++++++ packages/vue/src/form/bind.ts | 5 +++-- packages/vue/tsconfig.json | 2 +- packages/vue/typecheck/FormBindings.vue | 24 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 .changeset/vue-bind-input-types.md create mode 100644 packages/vue/typecheck/FormBindings.vue diff --git a/.changeset/vue-bind-input-types.md b/.changeset/vue-bind-input-types.md new file mode 100644 index 0000000..2d243b7 --- /dev/null +++ b/.changeset/vue-bind-input-types.md @@ -0,0 +1,7 @@ +--- +'@wirecore/wirelayer-vue': patch +--- + +`bindInput` from `/form` fits `Input` and `Textarea` in compiled SFC templates: `onUpdate:modelValue` accepts +`string | undefined` (what the components emit) and `modelValue` falls back to `''`, like the React variant. Before, +`` was a vue-tsc error. diff --git a/packages/vue/src/form/bind.ts b/packages/vue/src/form/bind.ts index cf8a133..dc374fe 100644 --- a/packages/vue/src/form/bind.ts +++ b/packages/vue/src/form/bind.ts @@ -4,8 +4,9 @@ import type { CheckedState } from '../components/Checkbox/Checkbox.vue'; /** v-bind for Input and Textarea: `` */ export const bindInput = (field: AnyFieldApi) => ({ name: field.name, - modelValue: field.state.value as string, - 'onUpdate:modelValue': (value: string) => field.handleChange(value), + modelValue: (field.state.value as string | undefined) ?? '', + // Input and Textarea emit string | undefined (defineModel) – the field keeps a string, like in React + 'onUpdate:modelValue': (value: string | undefined) => field.handleChange(value ?? ''), onBlur: field.handleBlur, }); diff --git a/packages/vue/tsconfig.json b/packages/vue/tsconfig.json index 7bbf6cd..d1bd62a 100644 --- a/packages/vue/tsconfig.json +++ b/packages/vue/tsconfig.json @@ -5,5 +5,5 @@ "types": ["node"], "noEmit": true }, - "include": ["src", ".storybook", "vite.config.ts"] + "include": ["src", "typecheck", ".storybook", "vite.config.ts"] } diff --git a/packages/vue/typecheck/FormBindings.vue b/packages/vue/typecheck/FormBindings.vue new file mode 100644 index 0000000..fe14adf --- /dev/null +++ b/packages/vue/typecheck/FormBindings.vue @@ -0,0 +1,24 @@ + + +