// Generated by scripts/generate-manifest.mjs. Do not edit by hand. import type { AddOnCompiled } from '../../../../../types.js' type TemplateRecord = Record type TemplateAddOn = TemplateRecord & { integrations?: Array routes?: Array } type TemplateRenderContext = { [key: string]: any packageManager: any projectName: any typescript: any tailwind: any blank: any js: any jsx: any fileRouter: any codeRouter: any routerOnly: any includeExamples: any addOnEnabled: Record addOnOption: Record addOns: Array integrations: Array routes: Array getPackageManagerAddScript: (...args: Array) => string getPackageManagerRunScript: (...args: Array) => string getPackageManagerExecuteScript: (...args: Array) => string relativePath: (...args: Array) => string integrationImportContent: (...args: Array) => string integrationImportCode: (...args: Array) => string | undefined renderTemplate: (content: string) => string ignoreFile: () => never } type TemplateRenderer = (context: TemplateRenderContext) => string | undefined function __escapeXML(value: unknown) { if (value === undefined || value === null) { return '' } return String(value).replace(/[&<>'"]/g, (character) => { switch (character) { case '&': return '&' case '<': return '<' case '>': return '>' case '"': return '"' case "'": return ''' default: return character } }) } export function getManifestTemplateKey(template: string) { let hash = 0x811c9dc5 for (let i = 0; i < template.length; i++) { hash ^= template.charCodeAt(i) hash = Math.imul(hash, 0x01000193) >>> 0 } return `${hash.toString(16).padStart(8, '0')}:${template.length}` } function __render_37b41d11_8011(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("import { useStore } from '@tanstack/react-form'\n\nimport { useFieldContext, useFormContext } from '#/hooks/demo.form-context'\n") if (addOnEnabled.shadcn) { __append("\nimport { Button } from '#/components/ui/button'\nimport { Input } from '#/components/ui/input'\nimport { Textarea as ShadcnTextarea } from '#/components/ui/textarea'\nimport * as ShadcnSelect from '#/components/ui/select'\nimport { Slider as ShadcnSlider } from '#/components/ui/slider'\nimport { Switch as ShadcnSwitch } from '#/components/ui/switch'\nimport { Label } from '#/components/ui/label'\n\nexport function SubscribeButton({ label }: { label: string }) {\n const form = useFormContext()\n return (\n state.isSubmitting}>\n {(isSubmitting) => (\n \n )}\n \n )\n}\n\nfunction ErrorMessages({\n errors,\n}: {\n errors: Array\n}) {\n return (\n <>\n {errors.map((error) => (\n \n {typeof error === 'string' ? error : error.message}\n \n ))}\n \n )\n}\n\nexport function TextField({\n label,\n placeholder,\n}: {\n label: string\n placeholder?: string\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n field.handleChange(e.target.value)}\n />\n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function TextArea({\n label,\n rows = 3,\n}: {\n label: string\n rows?: number\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n field.handleChange(e.target.value)}\n />\n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function Select({\n label,\n values,\n placeholder,\n}: {\n label: string\n values: Array<{ label: string; value: string }>\n placeholder?: string\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n field.handleChange(value)}\n >\n \n \n \n \n \n {label}\n {values.map((value) => (\n \n {value.label}\n \n ))}\n \n \n \n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function Slider({ label }: { label: string }) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n field.handleChange(value[0])}\n />\n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function Switch({ label }: { label: string }) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n
\n field.handleChange(checked)}\n />\n \n
\n {field.state.meta.isTouched && }\n
\n )\n}\n \n") } else { __append("\nexport function SubscribeButton({ label }: { label: string }) {\n const form = useFormContext()\n return (\n state.isSubmitting}>\n {(isSubmitting) => (\n \n {label}\n \n )}\n \n )\n}\n\nfunction ErrorMessages({\n errors,\n}: {\n errors: Array\n}) {\n return (\n <>\n {errors.map((error) => (\n \n {typeof error === 'string' ? error : error.message}\n \n ))}\n \n )\n}\n\nexport function TextField({\n label,\n placeholder,\n}: {\n label: string\n placeholder?: string\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function TextArea({\n label,\n rows = 3,\n}: {\n label: string\n rows?: number\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function Select({\n label,\n values,\n}: {\n label: string\n values: Array<{ label: string; value: string }>\n placeholder?: string\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n field.handleChange(e.target.value)}\n className=\"demo-select\"\n >\n {values.map((value) => (\n \n ))}\n \n {field.state.meta.isTouched && }\n
\n )\n}\n") } __append("\n") return __output } function __render_c8ba0e71_2085(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("import { ") if (fileRouter) { __append("createFileRoute") } else { __append("createRoute") } __append(" } from '@tanstack/react-router'\nimport { z } from 'zod'\n\nimport { useAppForm } from '#/hooks/demo.form'\n\n") if (codeRouter) { __append("\n import type { RootRoute } from '@tanstack/react-router'\n") } else { __append("\nexport const Route = createFileRoute('/demo/form')({\n component: SimpleForm,\n})\n") } __append("\n\nconst schema = z.object({\n title: z.string().min(1, 'Title is required'),\n description: z.string().min(1, 'Description is required'),\n})\n\nfunction SimpleForm() {\n const form = useAppForm({\n defaultValues: {\n title: '',\n description: '',\n },\n validators: {\n onBlur: schema,\n },\n onSubmit: ({ value }) => {\n console.log(value)\n // Show success message\n alert('Form submitted successfully!')\n },\n })\n\n return (\n
\n
\n
\n

TanStack Form

\n

Simple Form

\n

\n A small validated form using the generated field helpers.\n

\n
\n {\n e.preventDefault()\n e.stopPropagation()\n form.handleSubmit()\n }}\n className=\"space-y-6\"\n >\n \n {(field) => }\n \n\n \n {(field) => }\n \n\n
\n \n \n \n
\n \n
\n
\n )\n}\n\n") if (codeRouter) { __append("\nexport default (parentRoute: RootRoute) => createRoute({\n path: '/demo/form/simple',\n component: SimpleForm,\n getParentRoute: () => parentRoute,\n})\n") } __append("\n") return __output } function __render_e5b15f91_6353(context: TemplateRenderContext) { const { packageManager, projectName, typescript, tailwind, blank, js, jsx, fileRouter, codeRouter, routerOnly, includeExamples, addOnEnabled, addOnOption, addOns, integrations, routes, getPackageManagerAddScript, getPackageManagerRunScript, getPackageManagerExecuteScript, relativePath, integrationImportContent, integrationImportCode, renderTemplate, ignoreFile, } = context let __output = '' const __append = (value: unknown) => { if (value !== undefined && value !== null) { __output += String(value) } } __append("import { ") if (fileRouter) { __append("createFileRoute") } else { __append("createRoute") } __append(" } from '@tanstack/react-router'\n\nimport { useAppForm } from '#/hooks/demo.form'\n\n") if (codeRouter) { __append("\nimport type { RootRoute } from '@tanstack/react-router'\n") } else { __append("\nexport const Route = createFileRoute('/demo/form')({\n component: AddressForm,\n})\n") } __append("\n\nfunction AddressForm() {\n const form = useAppForm({\n defaultValues: {\n fullName: '',\n email: '',\n address: {\n street: '',\n city: '',\n state: '',\n zipCode: '',\n country: '',\n },\n phone: '',\n },\n validators: {\n onBlur: ({ value }) => {\n const errors = {\n fields: {},\n } as {\n fields: Record\n }\n if (value.fullName.trim().length === 0) {\n errors.fields.fullName = 'Full name is required'\n }\n return errors\n },\n },\n onSubmit: ({ value }) => {\n console.log(value)\n // Show success message\n alert('Form submitted successfully!')\n },\n })\n\n return (\n
\n
\n
\n

TanStack Form

\n

Address Form

\n

\n Nested fields, field-level validation, and a select input.\n

\n
\n {\n e.preventDefault()\n e.stopPropagation()\n form.handleSubmit()\n }}\n className=\"space-y-6\"\n >\n \n {(field) => }\n \n\n {\n if (!value || value.trim().length === 0) {\n return 'Email is required'\n }\n if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i.test(value)) {\n return 'Invalid email address'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n\n {\n if (!value || value.trim().length === 0) {\n return 'Street address is required'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n\n
\n {\n if (!value || value.trim().length === 0) {\n return 'City is required'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n {\n if (!value || value.trim().length === 0) {\n return 'State is required'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n {\n if (!value || value.trim().length === 0) {\n return 'Zip code is required'\n }\n if (!/^\\d{5}(-\\d{4})?$/.test(value)) {\n return 'Invalid zip code format'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n
\n\n {\n if (!value || value.trim().length === 0) {\n return 'Country is required'\n }\n return undefined\n },\n }}\n >\n {(field) => (\n \n )}\n \n\n {\n if (!value || value.trim().length === 0) {\n return 'Phone number is required'\n }\n if (\n !/^(\\+\\d{1,3})?\\s?\\(?\\d{3}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}$/.test(\n value,\n )\n ) {\n return 'Invalid phone number format'\n }\n return undefined\n },\n }}\n >\n {(field) => (\n \n )}\n \n\n
\n \n \n \n
\n \n
\n
\n )\n}\n\n\n") if (codeRouter) { __append("\nexport default (parentRoute: RootRoute) => createRoute({\n path: '/demo/form/address',\n component: AddressForm,\n getParentRoute: () => parentRoute,\n})\n") } __append("\n") return __output } const templateRenderers: Record = { "37b41d11:8011": __render_37b41d11_8011, "c8ba0e71:2085": __render_c8ba0e71_2085, "e5b15f91:6353": __render_e5b15f91_6353, } export function hasManifestTemplate(template: string) { return getManifestTemplateKey(template) in templateRenderers } export function renderManifestTemplate( template: string, context: TemplateRenderContext, ) { const key = getManifestTemplateKey(template) const renderer = templateRenderers[key] if (!renderer) { throw new Error(`Template ${key} was not precompiled into the manifest`) } return renderer(context) ?? '' } export const addOn = { "name": "Form", "description": "TanStack Form", "phase": "add-on", "type": "add-on", "category": "tanstack", "color": "#EAB308", "priority": 44, "modes": [ "file-router", "code-router" ], "link": "https://tanstack.com/form/latest", "routes": [ { "icon": "ClipboardType", "url": "/demo/form/simple", "name": "Simple Form", "path": "src/routes/demo.form.simple.tsx", "jsName": "FormSimpleDemo" }, { "icon": "ClipboardType", "url": "/demo/form/address", "name": "Address Form", "path": "src/routes/demo.form.address.tsx", "jsName": "FormAddressDemo" } ], "shadcnComponents": [ "button", "select", "input", "textarea", "slider", "switch", "label" ], "id": "form", "version": "0.0.0", "packageAdditions": { "dependencies": { "@tanstack/react-form": "latest", "zod": "^4.3.6" } }, "readmeIsEjs": false, "files": { "src/components/demo.FormComponents.tsx.ejs": "import { useStore } from '@tanstack/react-form'\n\nimport { useFieldContext, useFormContext } from '#/hooks/demo.form-context'\n<% if (addOnEnabled.shadcn) { %>\nimport { Button } from '#/components/ui/button'\nimport { Input } from '#/components/ui/input'\nimport { Textarea as ShadcnTextarea } from '#/components/ui/textarea'\nimport * as ShadcnSelect from '#/components/ui/select'\nimport { Slider as ShadcnSlider } from '#/components/ui/slider'\nimport { Switch as ShadcnSwitch } from '#/components/ui/switch'\nimport { Label } from '#/components/ui/label'\n\nexport function SubscribeButton({ label }: { label: string }) {\n const form = useFormContext()\n return (\n state.isSubmitting}>\n {(isSubmitting) => (\n \n )}\n \n )\n}\n\nfunction ErrorMessages({\n errors,\n}: {\n errors: Array\n}) {\n return (\n <>\n {errors.map((error) => (\n \n {typeof error === 'string' ? error : error.message}\n \n ))}\n \n )\n}\n\nexport function TextField({\n label,\n placeholder,\n}: {\n label: string\n placeholder?: string\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n field.handleChange(e.target.value)}\n />\n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function TextArea({\n label,\n rows = 3,\n}: {\n label: string\n rows?: number\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n field.handleChange(e.target.value)}\n />\n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function Select({\n label,\n values,\n placeholder,\n}: {\n label: string\n values: Array<{ label: string; value: string }>\n placeholder?: string\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n field.handleChange(value)}\n >\n \n \n \n \n \n {label}\n {values.map((value) => (\n \n {value.label}\n \n ))}\n \n \n \n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function Slider({ label }: { label: string }) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n field.handleChange(value[0])}\n />\n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function Switch({ label }: { label: string }) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n
\n field.handleChange(checked)}\n />\n \n
\n {field.state.meta.isTouched && }\n
\n )\n}\n \n<% } else { %>\nexport function SubscribeButton({ label }: { label: string }) {\n const form = useFormContext()\n return (\n state.isSubmitting}>\n {(isSubmitting) => (\n \n {label}\n \n )}\n \n )\n}\n\nfunction ErrorMessages({\n errors,\n}: {\n errors: Array\n}) {\n return (\n <>\n {errors.map((error) => (\n \n {typeof error === 'string' ? error : error.message}\n \n ))}\n \n )\n}\n\nexport function TextField({\n label,\n placeholder,\n}: {\n label: string\n placeholder?: string\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function TextArea({\n label,\n rows = 3,\n}: {\n label: string\n rows?: number\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n {field.state.meta.isTouched && }\n
\n )\n}\n\nexport function Select({\n label,\n values,\n}: {\n label: string\n values: Array<{ label: string; value: string }>\n placeholder?: string\n}) {\n const field = useFieldContext()\n const errors = useStore(field.store, (state) => state.meta.errors)\n\n return (\n
\n \n field.handleChange(e.target.value)}\n className=\"demo-select\"\n >\n {values.map((value) => (\n \n ))}\n \n {field.state.meta.isTouched && }\n
\n )\n}\n<% } %>\n", "src/hooks/demo.form-context.ts": "import { createFormHookContexts } from '@tanstack/react-form'\n\nexport const { fieldContext, useFieldContext, formContext, useFormContext } =\n createFormHookContexts()\n", "src/hooks/demo.form.ts": "import { createFormHook } from '@tanstack/react-form'\n\nimport {\n Select,\n SubscribeButton,\n TextArea,\n TextField,\n} from '../components/demo.FormComponents'\nimport { fieldContext, formContext } from './demo.form-context'\n\nexport const { useAppForm } = createFormHook({\n fieldComponents: {\n TextField,\n Select,\n TextArea,\n },\n formComponents: {\n SubscribeButton,\n },\n fieldContext,\n formContext,\n})\n", "src/routes/demo/form.address.tsx.ejs": "import { <% if (fileRouter) { %>createFileRoute<% } else { %>createRoute<% } %> } from '@tanstack/react-router'\n\nimport { useAppForm } from '#/hooks/demo.form'\n\n<% if (codeRouter) { %>\nimport type { RootRoute } from '@tanstack/react-router'\n<% } else { %>\nexport const Route = createFileRoute('/demo/form')({\n component: AddressForm,\n})\n<% } %>\n\nfunction AddressForm() {\n const form = useAppForm({\n defaultValues: {\n fullName: '',\n email: '',\n address: {\n street: '',\n city: '',\n state: '',\n zipCode: '',\n country: '',\n },\n phone: '',\n },\n validators: {\n onBlur: ({ value }) => {\n const errors = {\n fields: {},\n } as {\n fields: Record\n }\n if (value.fullName.trim().length === 0) {\n errors.fields.fullName = 'Full name is required'\n }\n return errors\n },\n },\n onSubmit: ({ value }) => {\n console.log(value)\n // Show success message\n alert('Form submitted successfully!')\n },\n })\n\n return (\n
\n
\n
\n

TanStack Form

\n

Address Form

\n

\n Nested fields, field-level validation, and a select input.\n

\n
\n {\n e.preventDefault()\n e.stopPropagation()\n form.handleSubmit()\n }}\n className=\"space-y-6\"\n >\n \n {(field) => }\n \n\n {\n if (!value || value.trim().length === 0) {\n return 'Email is required'\n }\n if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i.test(value)) {\n return 'Invalid email address'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n\n {\n if (!value || value.trim().length === 0) {\n return 'Street address is required'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n\n
\n {\n if (!value || value.trim().length === 0) {\n return 'City is required'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n {\n if (!value || value.trim().length === 0) {\n return 'State is required'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n {\n if (!value || value.trim().length === 0) {\n return 'Zip code is required'\n }\n if (!/^\\d{5}(-\\d{4})?$/.test(value)) {\n return 'Invalid zip code format'\n }\n return undefined\n },\n }}\n >\n {(field) => }\n \n
\n\n {\n if (!value || value.trim().length === 0) {\n return 'Country is required'\n }\n return undefined\n },\n }}\n >\n {(field) => (\n \n )}\n \n\n {\n if (!value || value.trim().length === 0) {\n return 'Phone number is required'\n }\n if (\n !/^(\\+\\d{1,3})?\\s?\\(?\\d{3}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}$/.test(\n value,\n )\n ) {\n return 'Invalid phone number format'\n }\n return undefined\n },\n }}\n >\n {(field) => (\n \n )}\n \n\n
\n \n \n \n
\n \n
\n
\n )\n}\n\n\n<% if (codeRouter) { %>\nexport default (parentRoute: RootRoute) => createRoute({\n path: '/demo/form/address',\n component: AddressForm,\n getParentRoute: () => parentRoute,\n})\n<% } %>\n", "src/routes/demo/form.simple.tsx.ejs": "import { <% if (fileRouter) { %>createFileRoute<% } else { %>createRoute<% } %> } from '@tanstack/react-router'\nimport { z } from 'zod'\n\nimport { useAppForm } from '#/hooks/demo.form'\n\n<% if (codeRouter) { %>\n import type { RootRoute } from '@tanstack/react-router'\n<% } else { %>\nexport const Route = createFileRoute('/demo/form')({\n component: SimpleForm,\n})\n<% } %>\n\nconst schema = z.object({\n title: z.string().min(1, 'Title is required'),\n description: z.string().min(1, 'Description is required'),\n})\n\nfunction SimpleForm() {\n const form = useAppForm({\n defaultValues: {\n title: '',\n description: '',\n },\n validators: {\n onBlur: schema,\n },\n onSubmit: ({ value }) => {\n console.log(value)\n // Show success message\n alert('Form submitted successfully!')\n },\n })\n\n return (\n
\n
\n
\n

TanStack Form

\n

Simple Form

\n

\n A small validated form using the generated field helpers.\n

\n
\n {\n e.preventDefault()\n e.stopPropagation()\n form.handleSubmit()\n }}\n className=\"space-y-6\"\n >\n \n {(field) => }\n \n\n \n {(field) => }\n \n\n
\n \n \n \n
\n \n
\n
\n )\n}\n\n<% if (codeRouter) { %>\nexport default (parentRoute: RootRoute) => createRoute({\n path: '/demo/form/simple',\n component: SimpleForm,\n getParentRoute: () => parentRoute,\n})\n<% } %>\n" }, "deletedFiles": [], "smallLogo": "" } satisfies AddOnCompiled