├── .eslintignore ├── .eslintrc.cjs ├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── commercial_support.md │ └── feature_request.md ├── .gitignore ├── .npmignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── .vscode └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── buymeacoffee.webp ├── github.png ├── graphics ├── emoji.png ├── logo.png └── logo.svg ├── issue.bat ├── ko-fi.png ├── logo.svg ├── package.json ├── pnpm-lock.yaml ├── src ├── app.d.ts ├── app.html ├── hooks.server.ts ├── hooks.ts ├── lib │ ├── actionResult.ts │ ├── adapters │ │ ├── adapters.ts │ │ ├── arktype.ts │ │ ├── classvalidator.ts │ │ ├── effect.ts │ │ ├── index.ts │ │ ├── joi-to-json-schema │ │ │ └── index.ts │ │ ├── joi.ts │ │ ├── schemasafe.ts │ │ ├── simple-schema │ │ │ └── index.ts │ │ ├── superform.ts │ │ ├── superstruct.ts │ │ ├── typeSchema.ts │ │ ├── typebox.ts │ │ ├── valibot.ts │ │ ├── vine.ts │ │ ├── yup-to-json-schema │ │ │ ├── converters │ │ │ │ ├── array.ts │ │ │ │ ├── boolean.ts │ │ │ │ ├── common.ts │ │ │ │ ├── date.ts │ │ │ │ ├── index.ts │ │ │ │ ├── lazy.ts │ │ │ │ ├── mixed.ts │ │ │ │ ├── number.ts │ │ │ │ ├── object.ts │ │ │ │ ├── string.ts │ │ │ │ └── tuple.ts │ │ │ ├── index.ts │ │ │ ├── methods │ │ │ │ └── index.ts │ │ │ └── types.ts │ │ ├── yup.ts │ │ ├── zod.ts │ │ └── zod4.ts │ ├── client │ │ ├── SuperDebug.svelte │ │ ├── clipboardCopy.js │ │ ├── customValidity.ts │ │ ├── elements.ts │ │ ├── flash.ts │ │ ├── form.ts │ │ ├── index.ts │ │ ├── proxies.ts │ │ └── superForm.ts │ ├── defaults.ts │ ├── errors.ts │ ├── formData.ts │ ├── index.ts │ ├── jsonSchema │ │ ├── constraints.ts │ │ ├── index.ts │ │ ├── schemaDefaults.ts │ │ ├── schemaHash.ts │ │ ├── schemaInfo.ts │ │ └── schemaShape.ts │ ├── justClone.ts │ ├── memoize.ts │ ├── server │ │ └── index.ts │ ├── stringPath.ts │ ├── superStruct.ts │ ├── superValidate.ts │ ├── traversal.ts │ └── utils.ts ├── routes │ ├── (v1) │ │ ├── +layout.svelte │ │ ├── +page.server.ts │ │ ├── +page.svelte │ │ ├── +page.ts │ │ ├── Navigation.svelte │ │ ├── crud │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── dates │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ ├── empty-proxy │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── files │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── multiple │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── multiple2 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schemas.ts │ │ ├── nested-validation │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── TagForm.svelte │ │ │ └── schema.ts │ │ ├── nested │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ ├── posted │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── properly-nested │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── Form.svelte │ │ │ ├── TextField.svelte │ │ │ ├── TextInput.svelte │ │ │ └── schemas.ts │ │ ├── proxies │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── ProxyField.svelte │ │ ├── record │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schemas.ts │ │ ├── redirected │ │ │ └── +page.svelte │ │ ├── reset │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schemas.ts │ │ ├── snapshot │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ ├── spa │ │ │ ├── +layout.server.ts │ │ │ ├── +layout.svelte │ │ │ ├── +page.svelte │ │ │ ├── without-zod │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── zod-page-ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── +page.ts │ │ │ │ └── schema.ts │ │ │ └── zod │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ ├── super-debug │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── extensive-usage-cases │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ ├── superforms-plain │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ ├── tainted │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── multiple-tainted │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schemas.ts │ │ │ ├── programmatically │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ └── schema.ts │ │ ├── test │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── login │ │ │ │ └── +server.ts │ │ ├── tests │ │ │ ├── _empty │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── array-component │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── AutoComplete.svelte │ │ │ │ └── schema.ts │ │ │ ├── array-error-tainted │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── array-level-error-2 │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ ├── bound-component │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── input-field.svelte │ │ │ │ └── schemas.ts │ │ │ ├── checkbox-validation │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── Checkbox.svelte │ │ │ │ └── schemas.ts │ │ │ ├── custom-validity │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── datetime-local │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── default-object │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── delayed-validation │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── schema.ts │ │ │ │ ├── tadpole.svg │ │ │ │ └── username │ │ │ │ │ └── +server.ts │ │ │ ├── events │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── flash-onerror │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── issue-142 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── issue-159 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schemas.ts │ │ │ ├── issue-161 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── issue-164-2 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── FormBar.svelte │ │ │ │ ├── FormFoo.svelte │ │ │ │ └── schemas.ts │ │ │ ├── issue-164-3 │ │ │ │ ├── +page.svelte │ │ │ │ └── [viewOrEdit] │ │ │ │ │ ├── +page.server.ts │ │ │ │ │ └── +page.svelte │ │ │ ├── issue-164-4 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── Form.svelte │ │ │ ├── issue-164 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── Form.svelte │ │ │ │ └── schemas.ts │ │ │ ├── issue-176 │ │ │ │ └── +page.svelte │ │ │ ├── issue-194 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── issue-195 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── issue-196 │ │ │ │ └── +page.svelte │ │ │ ├── issue-208 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── UserType.ts │ │ │ │ └── schema.ts │ │ │ ├── issue-227 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── endpoint │ │ │ │ │ └── +server.ts │ │ │ ├── issue-230 │ │ │ │ ├── +layout.svelte │ │ │ │ ├── +page.server.ts │ │ │ │ └── normal-form │ │ │ │ │ ├── +page.server.ts │ │ │ │ │ └── +page.svelte │ │ │ ├── issue-233 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── issue-235 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── issue-260 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── utils.ts │ │ │ ├── issue-266 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── issue-270 │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ ├── issue-298 │ │ │ │ └── +page.svelte │ │ │ ├── missing-data-validate │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── multiselect-2 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── multiselect │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schemas.ts │ │ │ ├── no-enhance │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ ├── no-js-dropdown │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ ├── non-enhance │ │ │ │ └── reset │ │ │ │ │ ├── +page.server.ts │ │ │ │ │ ├── +page.svelte │ │ │ │ │ └── schemas.ts │ │ │ ├── proxy-in-proxy │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── rate-limiter │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── redirect-same-route │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── redirect-submitting │ │ │ │ ├── +layout.svelte │ │ │ │ ├── +page.svelte │ │ │ │ ├── +page.ts │ │ │ │ ├── [uuid] │ │ │ │ │ ├── +page.server.ts │ │ │ │ │ └── +page.svelte │ │ │ │ └── styles.css │ │ │ ├── refine-in-generics │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schemas.ts │ │ │ ├── refine-validation-2 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── refine-validation │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── reset-component-2 │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── Form.svelte │ │ │ │ ├── TextField.svelte │ │ │ │ └── schema.ts │ │ │ ├── reset-component │ │ │ │ ├── +page.svelte │ │ │ │ ├── +page.ts │ │ │ │ ├── Form.svelte │ │ │ │ └── schema.ts │ │ │ ├── resetting-form-problem │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schemas.ts │ │ │ ├── rex │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── scroll-into-view │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── spa-schema-transform │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── spa-submit │ │ │ │ ├── +page.svelte │ │ │ │ └── +page.ts │ │ │ ├── spa-values-disappearing │ │ │ │ ├── +page.svelte │ │ │ │ └── +page.ts │ │ │ ├── sten │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ ├── strict-mode │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── superform-c │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── tainted-array │ │ │ │ └── +page.svelte │ │ │ ├── tainted-proxy │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ └── unions │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schemas.ts │ │ ├── timers │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ ├── url │ │ │ ├── +page.server.ts │ │ │ └── +page.svelte │ │ └── users.ts │ ├── (v2) │ │ └── v2 │ │ │ ├── +layout.svelte │ │ │ ├── +page.svelte │ │ │ ├── Navigation.svelte │ │ │ ├── _empty │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── allow-files │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── app-error │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── json │ │ │ │ └── +server.ts │ │ │ ├── plain │ │ │ │ └── +server.ts │ │ │ └── schema.ts │ │ │ ├── arktype │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── array-errors2 │ │ │ └── +page.svelte │ │ │ ├── array-proxy │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── ArrayField.svelte │ │ │ └── schema.ts │ │ │ ├── bigint │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── boolean-same-union │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── capture-files │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── catchall │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── class-validator │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── component-regen │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── Form.svelte │ │ │ ├── Input.svelte │ │ │ ├── TextField.svelte │ │ │ └── global.css │ │ │ ├── component-sf-type │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── Form.svelte │ │ │ └── schema.ts │ │ │ ├── components │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── Form.svelte │ │ │ ├── TextField.svelte │ │ │ └── schema.ts │ │ │ ├── custom-tainted-dialog │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── custom-validity │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── customrequest-validate │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── customrequest │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── FileInput.svelte │ │ │ └── schema.ts │ │ │ ├── debounce-username │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── check │ │ │ │ └── [username] │ │ │ │ │ └── +server.ts │ │ │ ├── schema.ts │ │ │ ├── spinner.svg │ │ │ └── usernames.ts │ │ │ ├── defaults-fail │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── discord │ │ │ └── array-remove │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ ├── FieldComponent.svelte │ │ │ │ ├── schema.ts │ │ │ │ └── users.ts │ │ │ ├── discriminated-union │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── dynamic-validators │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── effect │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── empty-enum │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── file-component │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── FileInput.svelte │ │ │ └── schema.ts │ │ │ ├── files-proxy │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── form-result-type │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── formsnap │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── Field.svelte │ │ │ └── schema.ts │ │ │ ├── goto-onupdated │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── schema.ts │ │ │ └── thanks │ │ │ │ └── +page.svelte │ │ │ ├── id-incorrect │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── index-errors │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-309-unions │ │ │ ├── +page.svelte │ │ │ ├── create │ │ │ │ └── +page.svelte │ │ │ ├── form.svelte │ │ │ ├── text-input.svelte │ │ │ ├── update │ │ │ │ └── +page.svelte │ │ │ └── user-schema.ts │ │ │ ├── issue-332-arrays │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-337-checkboxes │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── CheckBox.svelte │ │ │ └── schema.ts │ │ │ ├── issue-345 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── CheckboxComponent.svelte │ │ │ ├── CheckboxField.svelte │ │ │ └── schema.ts │ │ │ ├── issue-356 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── Header.svelte │ │ │ └── schema.ts │ │ │ ├── issue-358 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-360 │ │ │ ├── +page.svelte │ │ │ ├── schema.ts │ │ │ ├── second-target │ │ │ │ └── +page.svelte │ │ │ └── target │ │ │ │ ├── +page.svelte │ │ │ │ └── +page.ts │ │ │ ├── issue-366 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-368 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-374 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-398 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-455 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-464 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── CheckboxGroup.svelte │ │ │ └── schema.ts │ │ │ ├── issue-466 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-467 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── shared.ts │ │ │ ├── issue-470 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-484 │ │ │ ├── +layout.ts │ │ │ ├── +page.svelte │ │ │ ├── schemas.ts │ │ │ └── zodPage.svelte │ │ │ ├── issue-485 │ │ │ ├── +layout.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-500 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── FixedForm.svelte │ │ │ ├── Form.svelte │ │ │ └── schema.ts │ │ │ ├── issue-562 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schemas.ts │ │ │ ├── issue-574 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-583 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── issue-588 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── json-schema-description │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── letters │ │ │ ├── [category] │ │ │ │ ├── +page.server.ts │ │ │ │ └── +page.svelte │ │ │ └── schema.ts │ │ │ ├── mixed-forms │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── modify-reset │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── multiple-files │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── multistep-client │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── multistep-server │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── nested-files │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── nested-generic │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── cmpt-with-generic-shared.svelte │ │ │ ├── cmpt-with-generic.svelte │ │ │ └── schema.ts │ │ │ ├── nested-traverse │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── nested-validation-valibot │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── TagForm.svelte │ │ │ └── schema.ts │ │ │ ├── on-change-event │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── onchange-target │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── oninput-errors │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── posted │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── redirect-login │ │ │ ├── +layout.svelte │ │ │ ├── +page.svelte │ │ │ └── login │ │ │ │ ├── +page.server.ts │ │ │ │ ├── +page.svelte │ │ │ │ └── schema.ts │ │ │ ├── redirect │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── reset-errors │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── return-multiple-forms │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── schemasafe-types │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── simple-tainted │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── snapshot-proxy │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── NumberInput.svelte │ │ │ └── schema.ts │ │ │ ├── spa-action-2 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── classify │ │ │ │ ├── +page.server.ts │ │ │ │ └── schema.ts │ │ │ ├── spa-clearonsubmit │ │ │ ├── +page.svelte │ │ │ ├── schema.ts │ │ │ └── spinner.svg │ │ │ ├── spa-error │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── schema.ts │ │ │ └── spinner.svg │ │ │ ├── step-form │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── submit-enter │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── submit-json │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── submit-prog │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── superstruct │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── syncflash │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── tainted-array │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── tainted-component │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── Button.svelte │ │ │ └── schema.ts │ │ │ ├── tainted-history │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── tainted-null-random │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── timeproxy │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── transport │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── trim-fields │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── typebox │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── union-component │ │ │ ├── +page.svelte │ │ │ ├── +page.ts │ │ │ ├── global.css │ │ │ ├── input.svelte │ │ │ ├── schemas.ts │ │ │ └── union.svelte │ │ │ ├── unions │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── unknown-in-schema │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ ├── FormCmptAge.svelte │ │ │ └── schema.ts │ │ │ ├── valibot-dates │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── valibot-nullable │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── valibot-transform │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── valibot │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── validate-update │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── validate │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── validators-clear │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── validity-objects │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── vine │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── zod-discriminated │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ ├── zod4 │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ │ │ └── zodmini │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── schema.ts │ ├── +layout.server.ts │ ├── +layout.svelte │ └── RecordId.ts └── tests │ ├── JSONSchema.test.ts │ ├── data.ts │ ├── errors.test.ts │ ├── formData.test.ts │ ├── legacy │ ├── compare.test.ts │ ├── errors.test.ts │ ├── index.test.ts │ ├── paths.test-d.ts │ ├── proxies.test.ts │ └── strict.test.ts │ ├── mockSvelte.ts │ ├── superForm.test.ts │ ├── superValidate.test.ts │ └── zodUnion.test.ts ├── static ├── event-flowchart.png ├── favicon.svg ├── normalize.css └── sakura.css ├── svelte.config.js ├── tsconfig.check.json ├── tsconfig.json ├── types-exist.js └── vite.config.ts /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | /dist 10 | 11 | # Ignore files for PNPM, NPM and YARN 12 | pnpm-lock.yaml 13 | package-lock.json 14 | yarn.lock 15 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [ciscoheat] 4 | ko_fi: ciscoheat 5 | # custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: When something doesn't work as expected 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 9 | - [ ] Before posting an issue, read the [FAQ](https://superforms.rocks/faq) and search the previous issues. 10 | 11 | **Description** 12 | A clear and concise description of what the bug is, and, unless obvious, what you expected instead. 13 | 14 | **If applicable, a MRE** 15 | Use this template project to create a minimal reproducible example that you can link to here: https://sveltelab.dev/github.com/ciscoheat/superforms-examples/tree/zod (right click to open in a new tab) 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | --- 8 | 9 | **Is your feature request related to a problem? Please describe.** 10 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 11 | 12 | **Describe the solution you'd like** 13 | A clear and concise description of what you want to happen. 14 | 15 | **Describe alternatives you've considered** 16 | A clear and concise description of any alternative solutions or features you've considered. 17 | 18 | **Additional context** 19 | Add any other context or screenshots about the feature request here. 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /dist 5 | /.svelte-kit 6 | /package 7 | .env 8 | .env.* 9 | !.env.example 10 | vite.config.js.timestamp-* 11 | vite.config.ts.timestamp-* 12 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /src/routes 2 | /src/tests 3 | /static 4 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /buymeacoffee.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ciscoheat/sveltekit-superforms/b02f5d0070e8729c2b926069383dadfa342d8f2d/buymeacoffee.webp -------------------------------------------------------------------------------- /github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ciscoheat/sveltekit-superforms/b02f5d0070e8729c2b926069383dadfa342d8f2d/github.png -------------------------------------------------------------------------------- /graphics/emoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ciscoheat/sveltekit-superforms/b02f5d0070e8729c2b926069383dadfa342d8f2d/graphics/emoji.png -------------------------------------------------------------------------------- /graphics/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ciscoheat/sveltekit-superforms/b02f5d0070e8729c2b926069383dadfa342d8f2d/graphics/logo.png -------------------------------------------------------------------------------- /issue.bat: -------------------------------------------------------------------------------- 1 | pushd src\routes\(v2)\v2\%1 || EXIT /B 1 2 | rm +layout.svelte 3 | grep -rl . | xargs sed -i "s#'sveltekit-superforms'#'$lib/index.js'#g" 4 | grep -rl . | xargs sed -i -E "s#import \{ ([a-z]+) \} from 'sveltekit-superforms/adapters'#import { \1 } from '$lib/adapters/\1.js'#g" 5 | grep -rl . | xargs sed -i -E "s#import \{ ([a-z]+)Client \} from 'sveltekit-superforms/adapters'#import { \1Client } from '$lib/adapters/\1.js'#g" 6 | popd 7 | -------------------------------------------------------------------------------- /ko-fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ciscoheat/sveltekit-superforms/b02f5d0070e8729c2b926069383dadfa342d8f2d/ko-fi.png -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | interface PageData { 8 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 9 | flash?: any; 10 | } 11 | // interface Platform {} 12 | namespace Superforms { 13 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 14 | type Message = any; 15 | } 16 | } 17 | } 18 | 19 | export {}; 20 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | 15 | %sveltekit.head% 16 | 17 | 18 |
%sveltekit.body%
19 | 20 | 21 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import { error, type Handle } from '@sveltejs/kit'; 2 | 3 | export const handle: Handle = async ({ event, resolve }) => { 4 | if (event.request.method === 'POST' && event.request.url.includes('?throw-hooks-error')) { 5 | error(403, { 6 | message: 'Hooks error' 7 | }); 8 | } 9 | 10 | return await resolve(event); 11 | }; 12 | -------------------------------------------------------------------------------- /src/hooks.ts: -------------------------------------------------------------------------------- 1 | import type { Transport } from '@sveltejs/kit'; 2 | import { Decimal } from 'decimal.js'; 3 | import { RecordId } from './routes/RecordId.js'; 4 | 5 | export const transport: Transport = { 6 | Decimal: { 7 | encode: (value) => value instanceof Decimal && value.toString(), 8 | decode: (str) => new Decimal(str) 9 | }, 10 | RecordId: { 11 | encode: (record) => record instanceof RecordId && [record.id, record.tb], 12 | decode: ([id, tb]) => new RecordId(id, tb) 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /src/lib/adapters/yup-to-json-schema/converters/boolean.ts: -------------------------------------------------------------------------------- 1 | import type { Converter, Meta } from '../types.js'; 2 | import commonConverter from './common.js'; 3 | 4 | const booleanConverter: Converter = (description, converters) => { 5 | const jsonSchema = commonConverter(description, converters); 6 | const meta: Meta = description.meta || {}; 7 | return Object.assign(jsonSchema, meta.jsonSchema); 8 | }; 9 | 10 | export default booleanConverter; 11 | -------------------------------------------------------------------------------- /src/lib/adapters/yup-to-json-schema/converters/date.ts: -------------------------------------------------------------------------------- 1 | import type { Converter, Meta } from '../types.js'; 2 | import commonConverter from './common.js'; 3 | 4 | const dateConverter: Converter = (description, converters) => { 5 | const jsonSchema = commonConverter(description, converters); 6 | const meta: Meta = description.meta || {}; 7 | 8 | jsonSchema.type = 'string'; 9 | jsonSchema.format = 'date-time'; 10 | 11 | return Object.assign(jsonSchema, meta.jsonSchema); 12 | }; 13 | 14 | export default dateConverter; 15 | -------------------------------------------------------------------------------- /src/lib/adapters/yup-to-json-schema/converters/lazy.ts: -------------------------------------------------------------------------------- 1 | import type { Converter, Meta } from '../types.js'; 2 | import commonConverter from './common.js'; 3 | 4 | /* lazy is kind on an intermediate type. If you call schema.describe() with any argument, even schema.describe({}) which this library does by default, then the lazy functions always try to resolve to their return types. Because we always call schema.describe({}) or schema.describe(ResolveOptions) this is mostly unused but should still be here and return an empty type if it does exist in the schema description for some reason */ 5 | const lazyConverter: Converter = (description, converters) => { 6 | const jsonSchema = commonConverter(description, converters); 7 | const meta: Meta = description.meta || {}; 8 | return Object.assign(jsonSchema, meta.jsonSchema); 9 | }; 10 | 11 | export default lazyConverter; 12 | -------------------------------------------------------------------------------- /src/lib/adapters/yup-to-json-schema/index.ts: -------------------------------------------------------------------------------- 1 | export { convertSchema } from './converters/index.js'; 2 | export { extendSchema } from './methods/index.js'; 3 | -------------------------------------------------------------------------------- /src/lib/client/flash.ts: -------------------------------------------------------------------------------- 1 | import { browser } from '$app/environment'; 2 | import type { FormOptions } from './superForm.js'; 3 | 4 | export function cancelFlash, M>(options: FormOptions) { 5 | if (!options.flashMessage || !browser) return; 6 | if (!shouldSyncFlash(options)) return; 7 | 8 | document.cookie = `flash=; Max-Age=0; Path=${options.flashMessage.cookiePath ?? '/'};`; 9 | } 10 | 11 | export function shouldSyncFlash, M>(options: FormOptions) { 12 | if (!options.flashMessage || !browser) return false; 13 | return options.syncFlashMessage; 14 | } 15 | -------------------------------------------------------------------------------- /src/lib/jsonSchema/index.ts: -------------------------------------------------------------------------------- 1 | export type { JSONSchema7 as JSONSchema } from 'json-schema'; 2 | -------------------------------------------------------------------------------- /src/lib/memoize.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error No type information exists 2 | import baseMemoize from 'memoize-weak'; 3 | 4 | const wrap = , U>(fn: (...args: T) => U) => { 5 | return (...args: T): U => fn(...args); 6 | }; 7 | 8 | const memoize = baseMemoize as typeof wrap; 9 | 10 | export { memoize }; 11 | -------------------------------------------------------------------------------- /src/lib/server/index.ts: -------------------------------------------------------------------------------- 1 | // Backwards compatibility, everything should be imported from top-level in v2. 2 | // Duplicated in client/index.ts, because "server" path cannot be imported on client. 3 | 4 | export { defaults, defaultValues } from '../defaults.js'; 5 | export { actionResult } from '../actionResult.js'; 6 | 7 | export { 8 | superValidate, 9 | message, 10 | setMessage, 11 | setError, 12 | withFiles, 13 | removeFiles, 14 | type SuperValidated, 15 | type TaintedFields, 16 | type ValidationErrors 17 | } from '../superValidate.js'; 18 | 19 | export type { Infer, InferIn, Schema } from '../adapters/adapters.js'; 20 | -------------------------------------------------------------------------------- /src/routes/(v1)/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/routes/(v1)/+page.ts: -------------------------------------------------------------------------------- 1 | import type { PageLoad } from './$types.js'; 2 | 3 | export const load = (async ({ data }) => { 4 | return data; 5 | }) satisfies PageLoad; 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/empty-proxy/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { fail } from '@sveltejs/kit'; 5 | import { z } from 'zod'; 6 | 7 | const schema = z.object({ 8 | string: z.string().min(2).nullable(), 9 | num: z.number().min(1).nullable().default(NaN), 10 | string2: z.string().min(2).optional() 11 | }); 12 | 13 | export const load = async () => { 14 | const form = await superValidate({ string: 'A', string2: 'B' }, zod(schema)); 15 | return { form }; 16 | }; 17 | 18 | export const actions = { 19 | default: async ({ request }) => { 20 | const form = await superValidate(request, zod(schema)); 21 | console.log('POST', form); 22 | 23 | if (!form.valid) return fail(400, { form }); 24 | 25 | return message(form, 'Posted OK!'); 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /src/routes/(v1)/multiple2/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({}); 4 | -------------------------------------------------------------------------------- /src/routes/(v1)/nested-validation/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | name: z.string().min(1, 'Name is too short'), 6 | tags: z 7 | .object({ 8 | id: z.number().int().min(3), 9 | name: z.string().min(2) 10 | }) 11 | .array() 12 | }) 13 | .refine((data) => data); 14 | -------------------------------------------------------------------------------- /src/routes/(v1)/nested/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | tags: z 6 | .object({ 7 | id: z.number().int().min(3), 8 | name: z.string().min(2) 9 | }) 10 | .array(), 11 | redirect: z.boolean() 12 | }) 13 | .refine((data) => data); 14 | -------------------------------------------------------------------------------- /src/routes/(v1)/properly-nested/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | import { schema } from './schemas.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = (async () => { 8 | const form = await superValidate(zod(schema), { 9 | errors: true 10 | }); 11 | return { form }; 12 | }) satisfies PageServerLoad; 13 | 14 | export const actions = { 15 | default: async (event) => { 16 | const formData = await event.request.formData(); 17 | const form = await superValidate(formData, zod(schema)); 18 | console.dir(form, { depth: 5 }); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Posted!'); 23 | } 24 | } satisfies Actions; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/properly-nested/+page.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |

Super-nested form

9 | 10 |
11 | -------------------------------------------------------------------------------- /src/routes/(v1)/properly-nested/TextField.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 14 | 15 | 25 | {#if $errors}{$errors}{/if} 26 | 27 | 32 | -------------------------------------------------------------------------------- /src/routes/(v1)/properly-nested/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | address: z.string().min(2), 6 | city: z.string().min(2), 7 | agree: z.boolean(), 8 | roles: z.string().min(1).array().optional(), 9 | luckyNumber: z.number(), 10 | tags: z 11 | .object({ 12 | name: z.string().min(2) 13 | }) 14 | .array() 15 | .min(1) 16 | .default([{ name: 'tag1' }, { name: '2' }]) 17 | }); 18 | 19 | export type Schema = typeof schema; 20 | -------------------------------------------------------------------------------- /src/routes/(v1)/proxies/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { z } from 'zod'; 6 | 7 | const schema = z.object({ 8 | bool: z.boolean() 9 | }); 10 | 11 | export const load = (async () => { 12 | const form = await superValidate(zod(schema)); 13 | return { form }; 14 | }) satisfies PageServerLoad; 15 | 16 | export const actions = { 17 | default: async ({ request }) => { 18 | const formData = await request.formData(); 19 | const form = await superValidate(formData, zod(schema)); 20 | console.log('POST', form); 21 | 22 | return { form }; 23 | } 24 | } satisfies Actions; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/record/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | import { schema } from './schemas.js'; 5 | 6 | export const load = (async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }) satisfies PageServerLoad; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | const form = await superValidate(formData, zod(schema)); 15 | console.log('POST', form); 16 | 17 | return { form }; 18 | } 19 | } satisfies Actions; 20 | -------------------------------------------------------------------------------- /src/routes/(v1)/record/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | data: z.record(z.number()).default({ first: 1, second: 2 }) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/redirected/+page.svelte: -------------------------------------------------------------------------------- 1 |

Redirect page

2 | 3 |

You are redirected here because of a checkbox.

4 | 5 |

Back to start

6 | 7 |

Back to test

8 | -------------------------------------------------------------------------------- /src/routes/(v1)/reset/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schemas.js'; 6 | 7 | export const load = (async (event) => { 8 | const form = await superValidate(event, zod(schema)); 9 | return { form }; 10 | }) satisfies PageServerLoad; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const data = await request.formData(); 15 | const form = await superValidate(data, zod(schema)); 16 | console.log('POST', form); 17 | 18 | return { form }; 19 | } 20 | } satisfies Actions; 21 | -------------------------------------------------------------------------------- /src/routes/(v1)/reset/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | points: z.number().int() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v1)/spa/+layout.server.ts: -------------------------------------------------------------------------------- 1 | export const ssr = false; 2 | -------------------------------------------------------------------------------- /src/routes/(v1)/spa/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 |

Superforms SPA

12 | 13 | 14 |

Page status: {$page.status}

15 | 16 | 17 | 18 | 24 | -------------------------------------------------------------------------------- /src/routes/(v1)/spa/+page.svelte: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ciscoheat/sveltekit-superforms/b02f5d0070e8729c2b926069383dadfa342d8f2d/src/routes/(v1)/spa/+page.svelte -------------------------------------------------------------------------------- /src/routes/(v1)/spa/without-zod/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | tags: z 6 | .object({ 7 | id: z.number().int().min(3), 8 | name: z.string().min(2) 9 | }) 10 | .array(), 11 | redirect: z.boolean(), 12 | random: z.string() 13 | }) 14 | .refine((data) => data); 15 | 16 | export type Schema = typeof schema; 17 | -------------------------------------------------------------------------------- /src/routes/(v1)/spa/zod-page-ts/+page.ts: -------------------------------------------------------------------------------- 1 | import { schema } from './schema.js'; 2 | import { superValidate } from '$lib/client/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | const defaultData = { 6 | tags: [ 7 | { id: 1, name: 'A' }, 8 | { id: 2, name: 'Bb' }, 9 | { id: 3, name: 'Cc' }, 10 | { id: 4, name: 'Dd' } 11 | ], 12 | redirect: false, 13 | random: '4117' 14 | }; 15 | 16 | export const load = async (event) => { 17 | console.log('SPA load'); 18 | const form = await superValidate(defaultData, zod(schema), { errors: false }); 19 | 20 | return { 21 | form, 22 | useZod: event.url.searchParams.has('zod') 23 | }; 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/spa/zod-page-ts/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | tags: z 6 | .object({ 7 | id: z.number().int().min(3), 8 | name: z.string().min(2) 9 | }) 10 | .array(), 11 | redirect: z.boolean(), 12 | random: z.string().optional() 13 | }) 14 | .refine((data) => data); 15 | -------------------------------------------------------------------------------- /src/routes/(v1)/spa/zod/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | tags: z 6 | .object({ 7 | id: z.number().int().min(3), 8 | name: z.string().min(2) 9 | }) 10 | .array(), 11 | redirect: z.boolean(), 12 | random: z.string() 13 | }) 14 | .refine((data) => data); 15 | -------------------------------------------------------------------------------- /src/routes/(v1)/superforms-plain/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema)); 18 | console.log('POST', form); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Posted OK!'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/superforms-plain/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tainted/multiple-tainted/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schemas.js'; 6 | import { fail } from '@sveltejs/kit'; 7 | 8 | export const load = (async (event) => { 9 | const form = await superValidate(event, zod(schema)); 10 | return { form }; 11 | }) satisfies PageServerLoad; 12 | 13 | export const actions = { 14 | default: async (event) => { 15 | const formData = await event.request.formData(); 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | return form.valid ? { form } : fail(400, { form }); 20 | } 21 | } satisfies Actions; 22 | -------------------------------------------------------------------------------- /src/routes/(v1)/tainted/multiple-tainted/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string(), 5 | city: z.string(), 6 | age: z.number().min(1) 7 | }); 8 | -------------------------------------------------------------------------------- /src/routes/(v1)/tainted/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | tags: z 6 | .object({ 7 | id: z.number().int().min(3), 8 | name: z.string().min(2) 9 | }) 10 | .array() 11 | }) 12 | .refine((data) => data); 13 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/_empty/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema)); 18 | console.log('POST', form); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Posted OK!'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/_empty/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/array-component/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema)); 18 | console.dir(form, { depth: 5 }); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'OK:' + form.data.sub.tags); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/array-component/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | sub: z.object({ 5 | tags: z.string().min(2).array().min(2) 6 | }) 7 | }); 8 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/array-error-tainted/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | days: z.number().min(0).max(6).array().min(1) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/bound-component/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schemas.js'; 6 | 7 | export const load = (async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }) satisfies PageServerLoad; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | const form = await superValidate(formData, zod(schema)); 16 | console.log('POST', form); 17 | 18 | return { form, test: 123 }; 19 | } 20 | } satisfies Actions; 21 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/bound-component/input-field.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 12 | {#if errors}{errors}{/if} 13 | 14 | 20 | 21 | 26 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/bound-component/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z 5 | .string() 6 | .min(2) 7 | .regex(/^[A-Z]/, 'should start with a capital letter'), 8 | email: z.string().email() 9 | }); 10 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/checkbox-validation/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schemas.js'; 6 | 7 | export const load = (async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }) satisfies PageServerLoad; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | const form = await superValidate(formData, zod(schema)); 16 | console.log('POST', form); 17 | 18 | return { form }; 19 | } 20 | } satisfies Actions; 21 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/checkbox-validation/Checkbox.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | {label} 8 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/checkbox-validation/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | isAccredited: z.literal(true) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/custom-validity/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | import type { Actions } from './$types.js'; 7 | 8 | export const load = async () => { 9 | const form = await superValidate(zod(schema)); 10 | return { form }; 11 | }; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | console.log(formData); 17 | 18 | const form = await superValidate(formData, zod(schema)); 19 | console.log('POST', form); 20 | 21 | if (!form.valid) return fail(400, { form }); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | } satisfies Actions; 26 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/custom-validity/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email(), 6 | number: z.number().min(10), 7 | info: z.string().min(1), 8 | menu: z.enum(['first', 'second', 'third']).default('' as 'first'), 9 | radio: z.number().min(1), 10 | text: z.string().min(1), 11 | accept: z.literal(true).default(false as true) 12 | }); 13 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/datetime-local/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schema.js'; 6 | import { fail } from '@sveltejs/kit'; 7 | 8 | export const load = (async () => { 9 | const form = await superValidate(zod(schema)); 10 | return { form }; 11 | }) satisfies PageServerLoad; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | console.log(formData); 17 | 18 | const form = await superValidate(formData, zod(schema)); 19 | console.log('POST', form); 20 | 21 | if (!form.valid) return fail(400, { form }); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | } satisfies Actions; 26 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/datetime-local/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | emptyUndef: z.number().optional(), 5 | number2: z.number().nullable(), 6 | emptyZero: z.number().optional(), 7 | date: z 8 | .date() 9 | .min(new Date('2021-01-01')) 10 | .max(new Date('2023-07-01'), 'Max date: 2023-07-01') 11 | .optional() 12 | }); 13 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/default-object/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { postSchema } from './schema.js'; 6 | import { fail } from '@sveltejs/kit'; 7 | 8 | export const load = (async () => { 9 | const form = await superValidate(zod(postSchema)); 10 | return { form }; 11 | }) satisfies PageServerLoad; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | const form = await superValidate(formData, zod(postSchema)); 17 | 18 | console.dir(form, { depth: 6 }); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Posted OK!'); 23 | } 24 | } satisfies Actions; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/default-object/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const questionSchema = z.object({ 4 | text: z.string().min(2, 'Ask a longer question.'), 5 | generated: z.boolean() 6 | }); 7 | 8 | const questionArraySchema = z 9 | .array(questionSchema) 10 | .min(1, { message: 'Must have at least one question' }); 11 | 12 | export const postSchema = z.object({ 13 | questions: questionArraySchema 14 | }); 15 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/delayed-validation/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const basicSchema = z 4 | .object({ 5 | name: z.string().min(2), 6 | username: z.string().min(2) 7 | }) 8 | .transform((data) => data); 9 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/delayed-validation/tadpole.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/events/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema)); 18 | console.log('POST', form); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Posted OK!'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/events/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/flash-onerror/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schema.js'; 6 | import { error } from '@sveltejs/kit'; 7 | 8 | export const load = (async () => { 9 | const form = await superValidate(zod(schema)); 10 | return { form }; 11 | }) satisfies PageServerLoad; 12 | 13 | export const actions = { 14 | default: async () => { 15 | throw error(500); 16 | } 17 | } satisfies Actions; 18 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/flash-onerror/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-142/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | name: z.string().min(1).default('form'), 6 | password: z.string().min(8).default('123123123'), 7 | confirmedPassword: z.string().default('123123123') 8 | }) 9 | // comment out superRefine and form error works again 10 | .superRefine(({ confirmedPassword, password }, ctx) => { 11 | if (confirmedPassword !== password) { 12 | ctx.addIssue({ 13 | code: 'custom', 14 | message: 'Passwords must match', 15 | path: ['confirmedPassword'] 16 | }); 17 | } 18 | }); 19 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-159/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const overallValidation = (data: { name: string; email: string }): boolean => { 4 | const result = !!data.name || !!data.email; 5 | console.log('overallValidation result:', result); 6 | return result; 7 | }; 8 | 9 | export const editPageSchema = z 10 | .object({ 11 | name: z.string().min(1, 'Name is required'), 12 | email: z.string().email({ message: 'Invalid email address' }) 13 | }) 14 | .refine(overallValidation, 'Ouchie everything is wrong...'); 15 | 16 | export type EditPageFormData = z.infer; 17 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-161/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | persons: z.array(z.object({ name: z.string().min(1) })) 6 | }) 7 | .refine((data) => (data.persons?.length ?? 0) >= 2, { 8 | message: 'Need at least two persons' 9 | }); 10 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-164-2/FormBar.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 |
14 | FormBar 15 |
16 | {#if $message} 17 |
{$message}
18 | {/if} 19 | 20 | 21 | 22 | 23 |
24 | 25 |
26 |
27 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-164-2/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-164-3/+page.svelte: -------------------------------------------------------------------------------- 1 | Start here 2 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-164-3/[viewOrEdit]/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { z } from 'zod'; 5 | 6 | const schema = z.object({ 7 | name: z.string().min(1, 'Cannot be empty') 8 | }); 9 | 10 | export const load = async () => { 11 | const initialData = { 12 | name: 'Testing' 13 | }; 14 | const form = await superValidate(initialData, zod(schema)); 15 | console.log('🚀 ~ file: +page.server.ts:13 /issue-164-3', form); 16 | 17 | return { form }; 18 | }; 19 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-164-4/+page.svelte: -------------------------------------------------------------------------------- 1 | 19 | 20 | 21 | 22 | {#if isOpen} 23 |
{ 25 | isOpen = false; 26 | }} 27 | /> 28 | {:else} 29 | 37 | {/if} 38 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-164/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { z } from 'zod'; 5 | 6 | const schema = z.object({ 7 | name: z.string(), 8 | email: z.string().email() 9 | }); 10 | 11 | export const load = async () => { 12 | const form = await superValidate( 13 | { 14 | name: 'Bob', 15 | email: 'test@example.com' 16 | }, 17 | zod(schema) 18 | ); 19 | return { 20 | form 21 | }; 22 | }; 23 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-164/+page.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 |
isEditing: {isEditing}
18 | {#if isEditing} 19 | toggleEdit(false)} /> 20 | {:else} 21 | 22 | {/if} 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-164/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-194/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schema.js'; 6 | import { fail } from '@sveltejs/kit'; 7 | 8 | export const load = (async () => { 9 | const form = await superValidate(zod(schema)); 10 | console.log('🚀 ~ file: +page.server.ts:8 ~ load ~ form:', form); 11 | 12 | return { form }; 13 | }) satisfies PageServerLoad; 14 | 15 | export const actions = { 16 | default: async ({ request }) => { 17 | const formData = await request.formData(); 18 | console.log(formData); 19 | 20 | const form = await superValidate(formData, zod(schema)); 21 | console.log('POST', form); 22 | 23 | if (!form.valid) return fail(400, { form }); 24 | } 25 | } satisfies Actions; 26 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-194/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | things: z.set(z.number()).default(new Set([2, 3])) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-195/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | emaillist: z.boolean().optional().default(true) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-208/UserType.ts: -------------------------------------------------------------------------------- 1 | export enum UserType { 2 | WORKER = 'worker', 3 | MANAGER = 'manager' 4 | } 5 | 6 | export enum NumberType { 7 | WORKER = 1, 8 | MANAGER = 10 9 | } 10 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-208/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-227/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { z } from 'zod'; 5 | 6 | const schema = z.object({ 7 | name: z.string().default('Hello world!'), 8 | email: z.string().email() 9 | }); 10 | 11 | export const load = async () => { 12 | // Server API: 13 | const form = await superValidate(zod(schema)); 14 | 15 | // Always return { form } in load and form actions. 16 | return { form }; 17 | }; 18 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-227/endpoint/+server.ts: -------------------------------------------------------------------------------- 1 | import type { RequestHandler } from './$types.js'; 2 | 3 | export const POST: RequestHandler = async () => { 4 | return new Response('Body limit response', { status: 413 }); 5 | }; 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-230/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { fail } from '@sveltejs/kit'; 5 | import { z } from 'zod'; 6 | 7 | const schema = z.object({ 8 | name: z.string().min(1), 9 | email: z.string().email() 10 | }); 11 | 12 | ///// Form actions ///// 13 | 14 | export const actions = { 15 | default: async ({ request }) => { 16 | const form = await superValidate(request, zod(schema)); 17 | 18 | console.log('POST', form); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Form posted successfully!'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-230/normal-form/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions } from './$types.js'; 2 | 3 | export const actions: Actions = { 4 | default: async ({ request }) => { 5 | // Data here 6 | const formData = await request.formData(); 7 | console.log(formData); 8 | 9 | return { success: true }; 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-230/normal-form/+page.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | This is +page.svelte, in the slot of Layout
Try Submitting the form below - which is a normal 10 | Svelte Form Action use:enhance 11 |
12 | 13 | 14 | 15 | 16 | {#if form?.success}Posted!{/if} 17 | 18 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-233/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { schema1, schema2 } from './schema.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | export const load = async () => { 6 | const [form1, form2] = await Promise.all([ 7 | superValidate( 8 | { 9 | age: '42', 10 | value: '50000' 11 | }, 12 | zod(schema1) 13 | ), 14 | superValidate(zod(schema2)) 15 | ]); 16 | 17 | return { form1, form2 }; 18 | }; 19 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-233/+page.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 |
15 | 16 | 17 |
18 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-233/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const age = z 4 | .any() 5 | .refine((val) => { 6 | const parsed = parseInt(val, 10); 7 | return parsed >= 18 && parsed <= 55; 8 | }) 9 | .default('31'); 10 | 11 | const value = z 12 | .any() 13 | .refine((val) => { 14 | const parsed = parseInt(val, 10); 15 | return parsed >= 0 && parsed <= 1000000; 16 | }) 17 | .default('3456'); 18 | 19 | export const schema1 = z.object({ 20 | age, 21 | value 22 | }); 23 | 24 | export const schema2 = z.object({ 25 | age, 26 | value 27 | }); 28 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-235/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | import type { Actions, PageServerLoad } from './$types.js'; 7 | import { exampleSchema } from './schema.js'; 8 | 9 | ///// Load function ///// 10 | 11 | export const load: PageServerLoad = async () => { 12 | const form = await superValidate(zod(exampleSchema)); 13 | return { form }; 14 | }; 15 | 16 | ///// Form actions ///// 17 | 18 | export const actions: Actions = { 19 | default: async ({ request }) => { 20 | const form = await superValidate(request, zod(exampleSchema)); 21 | 22 | console.log('POST', form); 23 | 24 | if (!form.valid) return fail(400, { form }); 25 | 26 | return message(form, 'Form posted successfully!'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-235/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const exampleSchema = z.object({ 4 | radioGroup: z.boolean().default(false), 5 | checkbox: z.boolean() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-260/utils.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | 7 | export type Message = { 8 | type: 'success' | 'error'; 9 | text: string; 10 | }; 11 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-266/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { fail } from '@sveltejs/kit'; 5 | import { schema } from './schema.js'; 6 | 7 | import type { Actions, PageServerLoad } from './$types.js'; 8 | 9 | ///// Load function ///// 10 | 11 | export const load: PageServerLoad = async () => { 12 | const form = await superValidate(zod(schema)); 13 | return { form }; 14 | }; 15 | 16 | ///// Form actions ///// 17 | 18 | export const actions: Actions = { 19 | default: async ({ request }) => { 20 | const form = await superValidate(request, zod(schema)); 21 | 22 | console.log('POST', form); 23 | 24 | if (!form.valid) return fail(400, { form }); 25 | 26 | return message(form, 'Form posted successfully!'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/issue-266/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | business_id: z.string(), 5 | shareholders: z 6 | .object({ 7 | first_name: z.string().optional(), 8 | middle_name: z.string().optional(), 9 | id_issuance_date: z.coerce.date().max(new Date()).optional() 10 | }) 11 | .array() 12 | .min(1) 13 | }); 14 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/missing-data-validate/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema)); 18 | console.log('POST', form); 19 | 20 | if (!form.valid) { 21 | form.message = 'Failed on server.'; 22 | return fail(400, { form }); 23 | } 24 | 25 | return message(form, 'Posted OK!'); 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/missing-data-validate/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | age: z.number().min(30), 5 | name: z.string().min(1) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/multiselect-2/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | email: z.string().email().nullable(), 5 | name: z.string().nullable(), 6 | group: z 7 | .object({ 8 | id: z.number(), 9 | name: z.string(), 10 | start_date: z.date(), 11 | end_date: z.date(), 12 | course_id: z.number() 13 | }) 14 | .array() 15 | }); 16 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/multiselect/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const optionsSchema = z 4 | .enum(['option_1', 'option_2', 'option_3', 'option_4']) 5 | .default('option_1'); 6 | 7 | export const formSchema = z.object({ 8 | multiselect: optionsSchema.array(), 9 | select: optionsSchema 10 | }); 11 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/non-enhance/reset/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schemas.js'; 6 | import { fail } from '@sveltejs/kit'; 7 | 8 | export const load = (async () => { 9 | const form = await superValidate(zod(schema)); 10 | return { form }; 11 | }) satisfies PageServerLoad; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted ok!'); 22 | } 23 | } satisfies Actions; 24 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/non-enhance/reset/+page.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | {#if $message}

{$message}

{/if} 16 | 17 |
18 | 19 | {#if $errors.name}{$errors.name}{/if} 20 |
21 | 22 |
23 |
24 | 25 | 33 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/non-enhance/reset/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/proxy-in-proxy/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema)); 18 | console.log('POST', form); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Posted OK!'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/proxy-in-proxy/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | date: z.date() 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/rate-limiter/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email(), 6 | subject: z.string().min(1), 7 | message: z.string().min(1) 8 | }); 9 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/redirect-same-route/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1).default('Test') 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/redirect-submitting/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 |
7 | 8 |
9 |
10 | 11 | 29 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/redirect-submitting/+page.ts: -------------------------------------------------------------------------------- 1 | // since there's no dynamic data here, we can prerender 2 | // it so that it gets served as a static asset in production 3 | export const prerender = true; 4 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/refine-in-generics/+page.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 |
16 | {$form.passwordConfirm} 17 | 18 |
19 | 20 | 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/refine-in-generics/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const RegisterSchema = z 4 | .object({ 5 | username: z.string().optional(), 6 | email: z.string().min(5, 'error message').email(), 7 | password: z.string().min(8, 'error message'), 8 | passwordConfirm: z.string() 9 | }) 10 | .refine((data) => data.password === data.passwordConfirm, { 11 | message: 'Passwords not equal', 12 | path: ['password_control'] 13 | }); 14 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/refine-validation-2/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { fail } from '@sveltejs/kit'; 5 | import { userSchema } from './schema.js'; 6 | 7 | import type { Actions, PageServerLoad } from './$types.js'; 8 | 9 | ///// Load function ///// 10 | 11 | export const load: PageServerLoad = async () => { 12 | const form = await superValidate(zod(userSchema)); 13 | return { form }; 14 | }; 15 | 16 | ///// Form actions ///// 17 | 18 | export const actions: Actions = { 19 | default: async ({ request }) => { 20 | const form = await superValidate(request, zod(userSchema)); 21 | 22 | console.log('POST', form); 23 | 24 | if (!form.valid) return fail(400, { form }); 25 | 26 | return message(form, 'Form posted successfully!'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/refine-validation-2/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | export const userSchema = z 3 | .object({ 4 | salutationId: z.number().positive(), 5 | //.default('' as unknown as number), 6 | name: z.string().min(1), 7 | email: z.string().email(), 8 | confirmEmail: z.string().email() 9 | }) 10 | .refine( 11 | (data) => { 12 | console.log('REFINE', data); 13 | return data.email == data.confirmEmail; 14 | }, 15 | { 16 | message: 'Email doesnt match', 17 | path: ['confirmEmail'] 18 | } 19 | ); 20 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/refine-validation/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | import { schema } from './schema.js'; 7 | 8 | ///// Load function ///// 9 | 10 | export const load = async () => { 11 | const form = await superValidate(zod(schema)); 12 | return { form }; 13 | }; 14 | 15 | ///// Form actions ///// 16 | 17 | export const actions = { 18 | default: async ({ request }) => { 19 | const form = await superValidate(request, zod(schema)); 20 | 21 | console.log('POST', form); 22 | 23 | if (!form.valid) return fail(400, { form }); 24 | 25 | return message(form, 'Form posted successfully!'); 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/refine-validation/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | name: z.string().min(1), 6 | secondName: z.string().min(1) 7 | }) 8 | .refine(({ name, secondName }) => name === secondName, { 9 | message: 'Names must be the same', 10 | path: ['secondName'] 11 | }); 12 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/reset-component-2/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const registerSchema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | 8 | export const profileSchema = z.object({ 9 | name: z.string().min(2), 10 | age: z.coerce.number().gte(16).default(18) 11 | }); 12 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/reset-component/+page.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 |

Main page

10 | 11 | {#if formVisible} 12 |
13 | {/if} 14 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/reset-component/+page.ts: -------------------------------------------------------------------------------- 1 | export const ssr = false; 2 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/reset-component/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/resetting-form-problem/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1, { 5 | message: 'Enter your name' 6 | }), 7 | email: z.string().email(), 8 | password: z.string().min(6, { 9 | message: 'Your password must be at least 6 characters long' 10 | }), 11 | confirmPassword: z.string().min(6, { 12 | message: 'Confirm your password' 13 | }) 14 | }); 15 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/scroll-into-view/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | import { schema } from './schema.js'; 6 | import { fail } from '@sveltejs/kit'; 7 | 8 | export const load = (async () => { 9 | const form = await superValidate(zod(schema)); 10 | return { form }; 11 | }) satisfies PageServerLoad; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | console.log(formData); 17 | 18 | const form = await superValidate(formData, zod(schema)); 19 | console.log('POST', form); 20 | 21 | if (!form.valid) return fail(400, { form }); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | } satisfies Actions; 26 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/scroll-into-view/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/spa-schema-transform/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1).trim(), 5 | email: z 6 | .string() 7 | .email() 8 | .transform((email) => { 9 | console.log('Transforming email:', email); 10 | return 'always-same@email.com'; 11 | }) 12 | }); 13 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/spa-submit/+page.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | import { superValidate } from '$lib/client/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | 5 | const schema = z.object({ 6 | title: z.string().min(3) 7 | }); 8 | 9 | export const load = async () => { 10 | const form = await superValidate(zod(schema)); 11 | return { form }; 12 | }; 13 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/spa-values-disappearing/+page.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/client/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { z } from 'zod'; 5 | 6 | export const _schema = z.object({ 7 | name: z.string().min(1) 8 | }); 9 | 10 | export const load = async () => { 11 | console.log('+page.ts load'); 12 | const form = await superValidate(zod(_schema)); 13 | return { form }; 14 | }; 15 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/strict-mode/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema), { strict: true }); 18 | console.log('POST', form); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Posted OK!'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/strict-mode/+page.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | {#if $errors.name}{$errors.name}{/if} 12 |
13 | 14 |
15 |
16 | 17 | 26 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/strict-mode/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/superform-c/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { fail } from '@sveltejs/kit'; 2 | import type { Actions, PageServerLoad } from './$types.js'; 3 | import { schema } from './schema.js'; 4 | import { message, superValidate } from '$lib/server/index.js'; 5 | import { zod } from '$lib/adapters/zod.js'; 6 | 7 | export const load = (async () => { 8 | const form = await superValidate(zod(schema)); 9 | 10 | return { form }; 11 | }) satisfies PageServerLoad; 12 | 13 | export const actions: Actions = { 14 | default: async ({ request }) => { 15 | const form = await superValidate(request, zod(schema)); 16 | console.log('POST', form); 17 | 18 | if (!form.valid) { 19 | return fail(400, { form }); 20 | } 21 | 22 | return message(form, 'Success'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/superform-c/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | name1: z.string().default('jack'), 6 | name2: z.string().default('jack') 7 | }) 8 | .refine( 9 | ({ name1, name2 }) => { 10 | return name1.toLowerCase() === name2.toLowerCase(); 11 | }, 12 | { 13 | message: 'Name 2 Should Match Name 1', 14 | path: ['name2'] 15 | } 16 | ); 17 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/tainted-proxy/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema)); 18 | console.log('POST', form); 19 | 20 | if (!form.valid) return fail(400, { form }); 21 | 22 | return message(form, 'Posted OK!'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/tainted-proxy/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | user: z.object({ 5 | name: z.string().min(1) 6 | }) 7 | }); 8 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/unions/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | import { schema } from './schemas.js'; 5 | 6 | export const load = (async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }) satisfies PageServerLoad; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | const form = await superValidate(formData, zod(schema)); 15 | console.log('POST', form); 16 | 17 | return { form }; 18 | } 19 | } satisfies Actions; 20 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/unions/+page.svelte: -------------------------------------------------------------------------------- 1 | 20 | 21 | 22 | 23 |
24 | 25 |
26 | 27 | 32 | -------------------------------------------------------------------------------- /src/routes/(v1)/tests/unions/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | references: z 5 | .object({ 6 | id: z.string().nonempty({ message: 'This field is required.' }), 7 | value: z.string().nonempty({ message: 'This field is required.' }) 8 | }) 9 | .or(z.object({ id: z.string().max(0), value: z.string().max(0) })) 10 | .array() 11 | .default([{ id: '', value: '' }]) 12 | }); 13 | 14 | export const schema2 = z.object({ 15 | references: z 16 | .object({ 17 | id: z.string().nonempty({ message: 'This field is required.' }), 18 | value: z.string().nonempty({ message: 'This field is required.' }) 19 | }) 20 | .array() 21 | .default([{ id: '', value: '' }]) 22 | }); 23 | -------------------------------------------------------------------------------- /src/routes/(v1)/timers/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/server/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | 4 | import { schema } from './schema.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | 7 | export const load = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | await new Promise((r) => setTimeout(r, 9000)); 15 | const form = await superValidate(request, zod(schema)); 16 | 17 | if (!form.valid) return fail(400, { form }); 18 | 19 | return message(form, 'Posted OK!'); 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v1)/timers/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1).default('Name') 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v1)/users.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | // See https://zod.dev/?id=primitives for schema syntax 4 | export const userSchema = z.object({ 5 | id: z.string().regex(/^\d+$/), 6 | name: z.string().min(2), 7 | email: z.string().email() 8 | }); 9 | 10 | type UserDB = z.infer[]; 11 | 12 | // Set a global variable to preserve DB when Vite reloads. 13 | //const g = globalThis as unknown as { users: UserDB }; 14 | 15 | // Let's worry about id collisions later 16 | export const userId = () => String(Math.random()).slice(2); 17 | 18 | // A simple user "database" 19 | export const users: UserDB = [ 20 | { 21 | id: userId(), 22 | name: 'Important Customer', 23 | email: 'important@example.com' 24 | }, 25 | { 26 | id: userId(), 27 | name: 'Super Customer', 28 | email: 'super@example.com' 29 | } 30 | ]; 31 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/+page.svelte: -------------------------------------------------------------------------------- 1 |

Superforms v2

2 | 3 |

Pick a test from the menu.

4 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/_empty/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/_empty/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/allow-files/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { removeFiles, message, superValidate } from '$lib/server/index.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema), { 17 | allowFiles: true 18 | }); 19 | console.log('POST', form); 20 | 21 | if (!form.valid) { 22 | form.data.avatar = null; 23 | return fail(400, removeFiles({ form })); 24 | } 25 | 26 | return message(form, 'Posted OK!'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/allow-files/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | avatar: z 5 | .instanceof(File, { message: 'Please upload a file.' }) 6 | .refine((f) => f.size < 10_000, 'Max 10Kb upload size.') 7 | .nullable() 8 | }); 9 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/app-error/json/+server.ts: -------------------------------------------------------------------------------- 1 | import { json } from '@sveltejs/kit'; 2 | import type { RequestHandler } from './$types.js'; 3 | 4 | export const POST: RequestHandler = async () => { 5 | return json({ code: 'rate_limited', status: 429 }, { status: 430 }); 6 | }; 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/app-error/plain/+server.ts: -------------------------------------------------------------------------------- 1 | import { text } from '@sveltejs/kit'; 2 | import type { RequestHandler } from './$types.js'; 3 | 4 | export const POST: RequestHandler = async () => { 5 | return text('Nope', { status: 417 }); 6 | }; 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/app-error/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const userSchema = z.object({ 4 | name: z.string(), 5 | exception: z.enum(['error', 'exception', 'json', 'plain']) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/arktype/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { arktype } from '$lib/adapters/arktype.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | const defaults = { name: '', email: '' }; 7 | 8 | export const load = async () => { 9 | const form = await superValidate(arktype(schema, { defaults })); 10 | return { form }; 11 | }; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | console.log(formData); 17 | 18 | const form = await superValidate(formData, arktype(schema, { defaults })); 19 | console.log(form); 20 | 21 | if (!form.valid) return fail(400, { form }); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/arktype/schema.ts: -------------------------------------------------------------------------------- 1 | import { type } from 'arktype'; 2 | 3 | export const schema = type({ 4 | name: 'string>=2', 5 | email: 'string.email' 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/array-proxy/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/array-proxy/+page.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/array-proxy/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | tags: z.array(z.string().min(1)).nonempty() 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/bigint/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'A big number: ' + form.data.number); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/bigint/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | number: z.bigint().min(BigInt(1000000), 'A BIG number please!') 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/boolean-same-union/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/boolean-same-union/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | active: z.boolean().optional(), 5 | interval: z.union([z.literal(1), z.literal(5), z.literal(10), z.literal(15)]) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/capture-files/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/capture-files/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | image: z.instanceof(File, { message: 'Please upload a file.' }).nullable(), 5 | undefImage: z.instanceof(File, { message: 'Please upload a file.' }), 6 | images: z.instanceof(File, { message: 'Please upload files.' }).array() 7 | }); 8 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/catchall/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const form = await superValidate(request, zod(schema)); 14 | 15 | if (!form.valid) return fail(400, { form }); 16 | 17 | return message(form, 'Sum:' + (form.data['score'] + form.data['stats'])); 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/catchall/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z 4 | .object({ 5 | name: z.string().min(1) 6 | }) 7 | .catchall(z.number().int()); 8 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/class-validator/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { classvalidator } from '$lib/adapters/classvalidator.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | const defaults = new schema(); 7 | 8 | export const load = async () => { 9 | const form = await superValidate(classvalidator(schema, { defaults })); 10 | return { form }; 11 | }; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | console.log(formData); 17 | 18 | const form = await superValidate(formData, classvalidator(schema, { defaults })); 19 | console.log(form); 20 | 21 | if (!form.valid) return fail(400, { form }); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/class-validator/schema.ts: -------------------------------------------------------------------------------- 1 | import { IsEmail, IsString, MinLength } from 'class-validator'; 2 | 3 | class ClassValidatorSchema { 4 | @IsString() 5 | @MinLength(2) 6 | name: string = ''; 7 | 8 | @IsString() 9 | @IsEmail() 10 | email: string = ''; 11 | } 12 | 13 | export const schema = ClassValidatorSchema; 14 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/component-regen/+page.server.ts: -------------------------------------------------------------------------------- 1 | export async function load() { 2 | return { 3 | name: 'TypeScript' 4 | }; 5 | } 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/component-regen/+page.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 |
32 | 33 | {#each data.items as row, index (row)} 34 |
35 |
36 | 37 |
38 |
39 | {/each} 40 | 41 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/component-regen/Input.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/component-regen/TextField.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/component-sf-type/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { three } from './schema.js'; 4 | 5 | export const load = async () => { 6 | const form = await superValidate(zod(three)); 7 | return { form }; 8 | }; 9 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/component-sf-type/+page.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 |

Component with different types

11 | 12 |
13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/component-sf-type/Form.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/component-sf-type/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const three = z.object({ 4 | a: z.string(), 5 | b: z.string(), 6 | c: z.string() 7 | }); 8 | 9 | export const two = z.object({ 10 | a: z.string(), 11 | b: z.string() 12 | }); 13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/components/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const registerSchema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | 8 | export const profileSchema = z.object({ 9 | name: z.string().min(2), 10 | age: z.number().gte(16).default(18) 11 | }); 12 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/custom-tainted-dialog/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/custom-tainted-dialog/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/custom-validity/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const form = await superValidate(request, zod(schema)); 14 | console.log(form); 15 | 16 | if (!form.valid) return fail(400, { form }); 17 | 18 | return message(form, 'Form posted successfully!'); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/custom-validity/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/customrequest-validate/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | console.log('=================================================================='); 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const form = await superValidate(formData, zod(schema)); 18 | console.log(form); 19 | 20 | form.message = 'Form posted!'; 21 | 22 | if (!form.valid) return fail(400, { form }); 23 | 24 | return { form }; 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/customrequest-validate/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/customrequest/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message, withFiles } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema), { allowFiles: true }); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, withFiles({ form })); 20 | 21 | return message(form, 'Form posted successfully!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/customrequest/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | track: z.instanceof(File, { message: 'Please upload a file.' }) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/debounce-username/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | username: z 5 | .string() 6 | .min(3, 'Must be at least three characters.') 7 | .regex(/^[a-z]+$/, 'Must use only a-z characters.') 8 | }); 9 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/debounce-username/spinner.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/debounce-username/usernames.ts: -------------------------------------------------------------------------------- 1 | export const takenUsernames = [ 2 | 'Alpha', 3 | 'Bravo', 4 | 'Charlie', 5 | 'Delta', 6 | 'Echo', 7 | 'Foxtrot', 8 | 'Golf', 9 | 'Hotel', 10 | 'India', 11 | 'Juliet', 12 | 'Kilo', 13 | 'Lima', 14 | 'Mike', 15 | 'November', 16 | 'Oscar', 17 | 'Papa', 18 | 'Quebec', 19 | 'Romeo', 20 | 'Sierra', 21 | 'Tango', 22 | 'Uniform', 23 | 'Victor', 24 | 'Whiskey', 25 | 'Xray', 26 | 'Yankee', 27 | 'Zulu' 28 | ].map((n) => n.toLowerCase()); 29 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/defaults-fail/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/index.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema, defaults } from './schema.js'; 5 | 6 | import type { Actions, PageServerLoad } from './$types.js'; 7 | 8 | export const load: PageServerLoad = async () => { 9 | const form = await superValidate(zod(schema, { defaults })); 10 | return { form }; 11 | }; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const form = await superValidate(request, zod(schema, { defaults })); 16 | 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Form posted successfully!'); 22 | } 23 | } satisfies Actions; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/defaults-fail/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email(), 6 | nested: z.object({ 7 | name: z.string().min(1), 8 | email: z.string().email() 9 | }) 10 | }); 11 | 12 | export const defaults = { 13 | name: 'dname', 14 | email: 'd@example.com', 15 | // Removing nested object below fixes error. 16 | // As does not giving Zod {defaults}. 17 | nested: { 18 | name: 'dname', 19 | email: 'd@example.com' 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/discord/array-remove/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const emailSchema = z.object({ 4 | type: z.string().optional(), 5 | email: z.string().email() 6 | }); 7 | 8 | export const schema = z.object({ 9 | name: z.string().min(1), 10 | emails: z.array(emailSchema) 11 | }); 12 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/discriminated-union/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.discriminatedUnion('type', [ 4 | z.object({ 5 | type: z.literal('empty') 6 | }), 7 | z.object({ 8 | type: z.literal('extra'), 9 | roleId: z.string() 10 | }) 11 | ]); 12 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/dynamic-validators/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/dynamic-validators/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/effect/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { effect } from '$lib/adapters/effect.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(effect(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, effect(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/effect/schema.ts: -------------------------------------------------------------------------------- 1 | import { Schema } from 'effect'; 2 | 3 | const emailRegex = /^[^@]+@[^@]+\.[^@]+$/; 4 | 5 | export const schema = Schema.Struct({ 6 | name: Schema.String.annotations({ default: 'Hello world!' }), 7 | email: Schema.String.pipe( 8 | Schema.filter((s) => emailRegex.test(s) || 'must be a valid email', { 9 | jsonSchema: {} 10 | }) 11 | ) 12 | }); 13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/empty-enum/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const fishes = ['trout', 'tuna', 'shark'] as const; 4 | 5 | export const schema = z.object({ 6 | fish: z.enum(fishes), 7 | moreFish: z.enum(fishes) 8 | }); 9 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/file-component/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message, withFiles } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema), { allowFiles: true }); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, withFiles({ form })); 20 | 21 | return message(form, 'Form posted successfully!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/file-component/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email(), 6 | track: z.instanceof(File, { message: 'Please upload a file.' }) 7 | }); 8 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/files-proxy/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate, withFiles } from '$lib/server/index.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | console.log('======================================================'); 14 | 15 | const formData = await request.formData(); 16 | console.dir(formData, { depth: 10 }); 17 | 18 | const form = await superValidate(formData, zod(schema), { allowFiles: true }); 19 | console.dir(form, { depth: 10 }); 20 | 21 | if (!form.valid) return fail(400, withFiles({ form })); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/files-proxy/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | images: z 5 | .custom() 6 | .refine((f) => f instanceof File && f.size < 100000, 'Max 100Kb upload size.') 7 | .array(), 8 | image: z 9 | .instanceof(File, { message: 'Please upload a file.' }) 10 | .refine((f) => f.size < 100000, 'Max 100Kb upload size.') 11 | .optional() 12 | }); 13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/form-result-type/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | dir: z 5 | .enum(['', 'north', 'south', 'east', 'west']) 6 | .refine((dir) => dir != '', 'No direction specified') 7 | }); 8 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/formsnap/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/formsnap/+page.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 | 14 |
15 | 16 |
17 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/formsnap/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | /* 4 | type T = { 5 | flavors: ('vanilla' | 'chocolate' | 'cookies and cream' | 'strawberry')[]; 6 | toppings: ('sprinkles' | 'hot fudge' | 'whipped cream' | 'cherry')[]; 7 | }; 8 | */ 9 | 10 | export const schema = z.object({ 11 | flavors: z.enum(['vanilla', 'chocolate', 'cookies and cream', 'strawberry']).array(), 12 | toppings: z.enum(['sprinkles', 'hot fudge', 'whipped cream', 'cherry']).array() 13 | }); 14 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/goto-onupdated/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | 9 | const { data } = form; 10 | 11 | return { form: data }; 12 | }; 13 | 14 | export const actions = { 15 | default: async ({ request }) => { 16 | const form = await superValidate(request, zod(schema)); 17 | 18 | if (!form.valid) { 19 | return fail(400, { 20 | form 21 | }); 22 | } 23 | 24 | return { form }; 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/goto-onupdated/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/goto-onupdated/thanks/+page.svelte: -------------------------------------------------------------------------------- 1 |

Thanks!

2 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/id-incorrect/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | 3 | import { superValidate, message } from '$lib/index.js'; 4 | import { zod } from '$lib/adapters/zod.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | import { schema } from './schema.js'; 7 | 8 | export const load: PageServerLoad = async () => { 9 | return { form: await superValidate(zod(schema)) }; 10 | }; 11 | 12 | export const actions: Actions = { 13 | default: async ({ request }) => { 14 | const form = await superValidate(request, zod(schema)); 15 | console.log(form); 16 | 17 | if (!form.valid) return fail(400, { form }); 18 | 19 | return message(form, 'Form posted successfully!'); 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/id-incorrect/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/index-errors/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/index-errors/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const itemSchema = z.object({ 4 | name: z.string() 5 | }); 6 | 7 | export const schema = z.object({ 8 | instances: z.array(itemSchema) 9 | }); 10 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-309-unions/+page.svelte: -------------------------------------------------------------------------------- 1 | Create 2 | Update 3 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-309-unions/create/+page.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | Back 11 | 12 |
13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-309-unions/form.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-309-unions/text-input.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | 14 | 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-309-unions/update/+page.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | Back 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-309-unions/user-schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const createUserSchema = z.object({ 4 | email: z.string(), 5 | pw: z.string() 6 | }); 7 | 8 | export const updateUserSchema = createUserSchema.extend({ 9 | id: z.string() 10 | }); 11 | 12 | export const unionizedSchema = z.union([createUserSchema, updateUserSchema]); 13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-332-arrays/+page.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-332-arrays/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().default('Hello world!'), 5 | testArray: z.object({ foo: z.string() }).array(), 6 | nested: z.object({ 7 | arr: z.object({ foo: z.string() }).array() 8 | }) 9 | }); 10 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-337-checkboxes/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-337-checkboxes/CheckBox.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-337-checkboxes/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | accept: z.boolean(), 5 | extra: z.number().positive().optional().default(0) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-345/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | console.log('Loading...'); 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const form = await superValidate(request, zod(schema)); 15 | console.log(form); 16 | 17 | if (!form.valid) return fail(400, { form }); 18 | 19 | return message(form, 'Form posted successfully!'); 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-345/CheckboxComponent.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-345/CheckboxField.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 19 | 20 | 21 | {description} 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-345/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | checkbox: z.boolean().optional() 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-356/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { fail } from '@sveltejs/kit'; 2 | import { superValidate } from '$lib/index.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | import { schema } from './schema.js'; 5 | 6 | export const actions = { 7 | default: async ({ request }) => { 8 | const form = await superValidate(request, zod(schema)); 9 | console.log(form); 10 | 11 | if (!form.valid) { 12 | // Again, return { form } and things will just work. 13 | return fail(400, { form }); 14 | } 15 | 16 | // TODO: Do something with the validated form.data 17 | 18 | // Yep, return { form } here too 19 | return { form }; 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-358/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | const db = { name: 'Default Defaulto', email: 'example@example.com' }; 7 | 8 | export const load = async () => { 9 | const form = await superValidate(db, zod(schema)); 10 | 11 | console.log('Load ran ' + JSON.stringify(db)); 12 | return { form }; 13 | }; 14 | 15 | export const actions = { 16 | default: async ({ request }) => { 17 | const form = await superValidate(request, zod(schema)); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | // Forgot to update email 22 | db.name = form.data.name; 23 | 24 | return message(form, 'Form posted successfully!'); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-358/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-360/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({}); 4 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-360/second-target/+page.svelte: -------------------------------------------------------------------------------- 1 |

Second redirect successful

2 | Go home 3 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-360/target/+page.svelte: -------------------------------------------------------------------------------- 1 |

First redirect target

2 | Go home 3 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-360/target/+page.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from '@sveltejs/kit'; 2 | 3 | export function load() { 4 | redirect(303, '/v2/issue-360/second-target'); 5 | } 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-366/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { valibot } from '$lib/adapters/valibot.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { userSchema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(valibot(userSchema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, valibot(userSchema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-368/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const form = await superValidate(request, zod(schema)); 14 | console.log(form); 15 | 16 | if (!form.valid) return fail(400, { form }); 17 | 18 | return message(form, 'Form posted successfully!'); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-368/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(5), 5 | email: z.string().email().default('test@test.com') 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-374/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const form = await superValidate(request, zod(schema)); 14 | console.log(form); 15 | 16 | if (!form.valid) return fail(400, { form }); 17 | 18 | return message(form, 'Form posted successfully!'); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-374/+page.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 |

Reusable Zod schemas

16 | 17 |
18 | 19 |
20 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-374/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const otherSchema1 = z.string(); 4 | const otherSchema2 = z.object({ 5 | value: z.string() 6 | }); 7 | 8 | export const schema = z.object({ 9 | obj1: otherSchema1, 10 | obj2: otherSchema1, 11 | 12 | obj3: otherSchema2, 13 | obj4: otherSchema2 14 | }); 15 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-398/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { fail, message, superValidate } from '$lib/index.js'; 2 | import type { PageServerLoad } from './$types.js'; 3 | import { zod } from '$lib/adapters/zod.js'; 4 | import { schema } from './schema.js'; 5 | import type { Actions } from '@sveltejs/kit'; 6 | 7 | export const load: PageServerLoad = async () => { 8 | const form = await superValidate(zod(schema)); 9 | return { form }; 10 | }; 11 | 12 | export const actions: Actions = { 13 | async default({ request }) { 14 | const form = await superValidate(request, zod(schema), { allowFiles: true }); 15 | console.log('🚀 ~ default ~ form:', form); 16 | 17 | if (!form.valid) { 18 | return fail(400, { form }); 19 | } 20 | return message(form, 'Posted OK!'); 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-398/+page.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | 18 |
19 | 20 | {#if $errors.file}{$errors.file}{/if} 21 | 22 |
23 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-398/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | file: z.instanceof(File).refine((f) => f.size < 100_000, 'Max 100 kB upload size.') 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-455/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | 3 | import { superValidate, message } from '$lib/index.js'; 4 | import { zod } from '$lib/adapters/zod.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | import { schema } from './schema.js'; 7 | 8 | export const load: PageServerLoad = async () => { 9 | return { 10 | form: await superValidate(zod(schema)) 11 | }; 12 | }; 13 | 14 | export const actions: Actions = { 15 | default: async ({ request }) => { 16 | const form = await superValidate(request, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Form posted successfully!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-455/schema.ts: -------------------------------------------------------------------------------- 1 | import i18next from 'i18next'; 2 | import { z } from 'zod'; 3 | // @ts-expect-error Need to use .mjs, explanation: https://stackoverflow.com/a/77108389/70894 4 | import { zodI18nMap } from 'zod-i18n-map/dist/index.mjs'; 5 | import translation from 'zod-i18n-map/locales/es/zod.json?raw'; 6 | 7 | i18next.init({ 8 | lng: 'es', 9 | resources: { 10 | es: { zod: JSON.parse(translation) } 11 | } 12 | }); 13 | z.setErrorMap(zodI18nMap); 14 | 15 | export const schema = z.object({ 16 | name: z.string().min(2), 17 | email: z.string().email() 18 | }); 19 | 20 | /* 21 | const data = schema.safeParse({ name: '', email: '' }); 22 | if (!data.success) { 23 | console.dir(data.error.flatten(), { depth: 10 }); //debug 24 | } 25 | */ 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-464/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { superValidate } from '$lib/index.js'; 3 | import { schema } from './schema.js'; 4 | 5 | export const load = async () => { 6 | const form = await superValidate(zod(schema)); 7 | return { form }; 8 | }; 9 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-464/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | testArray: z.number().array(), 5 | testStr: z.string().array().optional() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-466/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { schema } from './schema.js'; 4 | 5 | export const load = async () => { 6 | const form = await superValidate(zod(schema)); 7 | return { 8 | form 9 | }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const form = await superValidate(request, zod(schema)); 15 | return { 16 | form 17 | }; 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-466/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-467/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { setError, superValidate } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { Schema1, Schema2 } from './shared.js'; 4 | 5 | export async function load({ url }) { 6 | const triggerError = url.searchParams.has('error'); 7 | const form1 = await superValidate(zod(Schema1)); 8 | const form2 = await superValidate(zod(Schema2)); 9 | 10 | console.log('=====', url.toString()); 11 | 12 | console.log('🚀 ~ load ~ triggerError:', triggerError); 13 | 14 | if (triggerError) { 15 | setError(form1, 'value1', 'bad value1'); 16 | } 17 | 18 | console.log('🚀 ~ load ~ form1:', form1); 19 | 20 | return { form1, form2 }; 21 | } 22 | 23 | export const actions = {}; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-467/+page.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |

{$errors1.value1 || 'NO ERROR'}

12 | 13 |
14 | Trigger error 15 |
16 | Remove error 17 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-467/shared.ts: -------------------------------------------------------------------------------- 1 | import { object, string, z } from 'zod'; 2 | 3 | export const Schema1 = object({ 4 | value1: string().min(1) 5 | }); 6 | 7 | export type Schema1 = z.infer; 8 | 9 | export const Schema2 = object({ 10 | value2: string().min(1) 11 | }); 12 | 13 | export type Schema2 = z.infer; 14 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-470/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | 3 | import { superValidate, message } from '$lib/index.js'; 4 | import { zod } from '$lib/adapters/zod.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | import { schema } from './schema.js'; 7 | 8 | export const load: PageServerLoad = async () => { 9 | return { form: await superValidate(zod(schema)) }; 10 | }; 11 | 12 | export const actions: Actions = { 13 | default: async ({ request }) => { 14 | const form = await superValidate(request, zod(schema)); 15 | console.log(form); 16 | 17 | if (!form.valid) return fail(400, { form }); 18 | 19 | return message(form, 'Form posted successfully!'); 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-470/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | value: z.number().nullable() 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-484/+layout.ts: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | export const ssr = false; 3 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-484/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | import type { JSONSchema } from '$lib/index.js'; 3 | 4 | export const loginZodSchema = z.object({ 5 | name: z.string().min(5).default('Superform'), 6 | email: z.string().email() 7 | }); 8 | 9 | export const loginJSONSchema = { 10 | type: 'object', 11 | properties: { 12 | name: { type: 'string', minLength: 5, default: 'Superform' }, 13 | email: { type: 'string', format: 'email' } 14 | }, 15 | required: ['name', 'email'], 16 | additionalProperties: false, 17 | $schema: 'http://json-schema.org/draft-07/schema#' 18 | } as const satisfies JSONSchema; 19 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-485/+layout.ts: -------------------------------------------------------------------------------- 1 | export const ssr = false; 2 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-485/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-500/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const inviteUserToGroupSchema = z.object({ 4 | username: z.string().min(2) 5 | }); 6 | 7 | export const modifyGroupAccessSchema = z.object({ 8 | users: z 9 | .object({ 10 | username: z.string().min(2), 11 | remove: z.boolean() 12 | }) 13 | .array() 14 | }); 15 | 16 | export const fixedModifyGroupAccessSchema = z.object({ 17 | users: z 18 | .object({ 19 | username: z.string().min(2), 20 | removed: z.boolean() 21 | }) 22 | .array() 23 | }); 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-562/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { Schema } from './schemas.js'; 2 | import { superValidate } from '$lib/index.js'; 3 | import { valibot } from '$lib/adapters/valibot.js'; 4 | 5 | export const load = async () => { 6 | const initialData = { 7 | date: new Date() 8 | }; 9 | 10 | const form = await superValidate(initialData, valibot(Schema)); 11 | 12 | return { 13 | form 14 | }; 15 | }; 16 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-562/+page.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 |

{$form.date.getTime()}

24 | 25 | 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-562/schemas.ts: -------------------------------------------------------------------------------- 1 | import * as v from 'valibot'; 2 | 3 | export const Schema = v.object({ 4 | date: v.date() 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-574/schema.ts: -------------------------------------------------------------------------------- 1 | import type { JSONSchema } from '$lib/index.js'; 2 | 3 | export const schema = { 4 | type: 'object', 5 | additionalProperties: false, 6 | required: ['arr'], 7 | properties: { 8 | arr: { 9 | type: 'array', 10 | items: { 11 | type: 'object', 12 | additionalProperties: false, 13 | required: ['arr'], 14 | properties: { 15 | arr: { 16 | type: 'array', 17 | items: { 18 | type: 'object', 19 | additionalProperties: false, 20 | properties: { 21 | tryInvalidValue: { 22 | type: 'string', 23 | minLength: 5 24 | } 25 | } 26 | } 27 | } 28 | } 29 | } 30 | } 31 | } 32 | } as const satisfies JSONSchema; 33 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-588/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | 3 | import { superValidate, message } from '$lib/index.js'; 4 | import { zod } from '$lib/adapters/zod.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | import { schema } from './schema.js'; 7 | 8 | export const load: PageServerLoad = async () => { 9 | return { form: await superValidate(zod(schema)), count: Math.random().toString().slice(2) }; 10 | }; 11 | 12 | export const actions: Actions = { 13 | default: async ({ request }) => { 14 | const form = await superValidate(request, zod(schema)); 15 | console.log(form); 16 | 17 | if (!form.valid) return fail(400, { form }); 18 | 19 | return message(form, 'Form posted successfully!'); 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/issue-588/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/json-schema-description/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { schemasafe } from '$lib/adapters/schemasafe.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const adapter = schemasafe(schema); 8 | const form = await superValidate(adapter); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const formData = await request.formData(); 15 | console.log(formData); 16 | 17 | const adapter = schemasafe(schema, { descriptionAsErrors: true }); 18 | const form = await superValidate(formData, adapter); 19 | console.log(form); 20 | 21 | if (!form.valid) return fail(400, { form }); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/json-schema-description/schema.ts: -------------------------------------------------------------------------------- 1 | import type { JSONSchema } from '$lib/index.js'; 2 | 3 | export const schema = { 4 | $schema: 'http://json-schema.org/draft-07/schema#', 5 | type: 'object', 6 | required: ['description'], 7 | properties: { 8 | description: { 9 | type: 'string', 10 | description: 'a string at least 10 character(s) long', 11 | minLength: 10 12 | } 13 | }, 14 | additionalProperties: false 15 | } as const satisfies JSONSchema; 16 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/letters/[category]/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/server/index.js'; 2 | import { fail, redirect } from '@sveltejs/kit'; 3 | import { generateSchema } from '../schema.js'; 4 | 5 | import type { Actions, PageServerLoad } from './$types.js'; 6 | 7 | ///// Load function ///// 8 | 9 | export const load: PageServerLoad = async ({ params: { category } }) => { 10 | const form = await superValidate(generateSchema(category)); 11 | return { form }; 12 | }; 13 | 14 | ///// Form actions ///// 15 | 16 | export const actions: Actions = { 17 | default: async ({ request, params: { category } }) => { 18 | const form = await superValidate(request, generateSchema(category)); 19 | 20 | console.log('POST', form); 21 | 22 | if (!form.valid) return fail(400, { form }); 23 | 24 | throw redirect(307, '/v2/letters/qwerty'); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/letters/schema.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { z } from 'zod'; 3 | 4 | export const generateSchema = (category: string) => 5 | zod(z.object(Object.fromEntries([...category].map((q) => [q, z.string().min(1)])))); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/mixed-forms/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/mixed-forms/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/modify-reset/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/modify-reset/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/multiple-files/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { removeFiles, message, superValidate } from '$lib/server/index.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.dir(formData, { depth: 10 }); 15 | 16 | const form = await superValidate(formData, zod(schema), { allowFiles: true }); 17 | console.dir(form, { depth: 10 }); 18 | 19 | if (!form.valid) return fail(400, removeFiles({ form })); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/multiple-files/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | images: z 5 | .custom() 6 | .refine((f) => f instanceof File && f.size < 10000, 'Max 10Kb upload size.') 7 | .array() 8 | }); 9 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/multistep-client/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { schemaStep2 as lastStep } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | // Create the form with the last step, to get all default values 8 | const form = await superValidate(zod(lastStep)); 9 | return { form }; 10 | }; 11 | 12 | export const actions = { 13 | default: async ({ request }) => { 14 | const form = await superValidate(request, zod(lastStep)); 15 | 16 | console.log(form); 17 | 18 | if (!form.valid) return fail(400, { form }); 19 | 20 | return message(form, 'Form posted successfully!'); 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/multistep-client/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schemaStep1 = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | 7 | export const schemaStep2 = schemaStep1.extend({ 8 | email: z.string().email() 9 | }); 10 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/multistep-server/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schemaStep1 = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | 7 | export const schemaStep2 = schemaStep1.extend({ 8 | email: z.string().email() 9 | }); 10 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/nested-files/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | image: z 5 | .custom() 6 | .nullable() 7 | .optional() 8 | .refine((f) => f instanceof File && f.size < 10000, 'Max 10Kb upload size.'), 9 | images: z 10 | .custom() 11 | .refine((f) => f instanceof File && f.size < 10000, 'Max 10Kb upload size.') 12 | .array() 13 | }); 14 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/nested-generic/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate } from '$lib/superValidate.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { schema } from './schema.js'; 4 | 5 | export const load = async () => { 6 | const form = await superValidate(zod(schema), { 7 | defaults: { email: 'hello@21risk.com', name: 'hello-word?' } 8 | }); 9 | 10 | // Always return { form } in load functions 11 | return { form }; 12 | }; 13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/nested-generic/+page.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |

Let's reproduce an issue here

6 | 7 |
8 | 9 | 10 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/nested-generic/cmpt-with-generic-shared.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | 10 |

Value in nested field...

11 | 12 |

{name}

13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/nested-generic/cmpt-with-generic.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/nested-generic/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().default('Hello world!'), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/nested-traverse/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const deficitForm = z.object({ 4 | grade: z.number().min(0).max(100).nullable().default(null), 5 | comments: z.string().optional() 6 | }); 7 | 8 | const sideData = z.object({ 9 | left: deficitForm, 10 | right: deficitForm 11 | }); 12 | 13 | export const nerveForm = z.object({ 14 | motor: sideData, 15 | sensory: sideData, 16 | dysesthesia: sideData 17 | }); 18 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/nested-validation-valibot/schema.ts: -------------------------------------------------------------------------------- 1 | import { array, integer, minLength, minValue, number, object, pipe, string } from 'valibot'; 2 | 3 | /* 4 | export const schema2 = z 5 | .object({ 6 | name: z.string().min(1, 'Name is too short'), 7 | tags: z 8 | .object({ 9 | id: z.number().int().min(3), 10 | name: z.string().min(2) 11 | }) 12 | .array() 13 | }) 14 | .refine((data) => data); 15 | */ 16 | 17 | export const schema = object({ 18 | name: pipe(string(), minLength(1, 'Name is too short')), 19 | tags: array( 20 | object({ 21 | id: pipe(number(), integer(), minValue(3)), 22 | name: pipe(string(), minLength(2)) 23 | }) 24 | ) 25 | }); 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/on-change-event/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/on-change-event/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email(), 6 | agree: z.literal(true).default(false as true) 7 | }); 8 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/onchange-target/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/onchange-target/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/oninput-errors/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/oninput-errors/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/posted/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const form = await superValidate(request, zod(schema)); 14 | console.log(form); 15 | 16 | if (!form.valid) return fail(400, { form }); 17 | 18 | return message(form, 'Form posted successfully!'); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/posted/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/redirect-login/+layout.svelte: -------------------------------------------------------------------------------- 1 | 27 | 28 |

{JSON.stringify($flash)}

29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/redirect-login/+page.svelte: -------------------------------------------------------------------------------- 1 |

Please login here.

2 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/redirect-login/login/schema.ts: -------------------------------------------------------------------------------- 1 | import z from 'zod'; 2 | 3 | export const login_schema = z.object({ 4 | email: z.string().email(), 5 | password: z.string() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/redirect/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { VERSION, redirect } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async () => { 13 | if (VERSION.startsWith('2')) redirect(303, '/'); 14 | else throw redirect(303, '/'); 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/redirect/+page.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | {#if $message}

{$message}

{/if} 17 | 18 |
19 |
20 | 21 |
22 | {#if $submitting}
SUBMITTING
{/if} 23 |
24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/redirect/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/reset-errors/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | 3 | import { superValidate, message } from '$lib/index.js'; 4 | import { zod } from '$lib/adapters/zod.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | import { schema } from './schema.js'; 7 | 8 | export const load: PageServerLoad = async () => { 9 | return { form: await superValidate(zod(schema)) }; 10 | }; 11 | 12 | export const actions: Actions = { 13 | default: async ({ request }) => { 14 | const form = await superValidate(request, zod(schema)); 15 | console.log(form); 16 | 17 | if (!form.valid) return fail(400, { form }); 18 | 19 | return message(form, 'Form posted successfully!'); 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/reset-errors/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/return-multiple-forms/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | email: z.string().email() 5 | }); 6 | 7 | export const other = z.object({ 8 | provider: z.string() 9 | }); 10 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/schemasafe-types/schema.ts: -------------------------------------------------------------------------------- 1 | import type { JSONSchema } from '$lib/index.js'; 2 | 3 | // Define outside the load function so the adapter can be cached 4 | export const schema = { 5 | type: 'object', 6 | properties: { 7 | name: { type: 'string', default: '', minLength: 3 }, 8 | email: { type: 'string', format: 'email' } 9 | }, 10 | required: ['email'], 11 | additionalProperties: false, 12 | $schema: 'http://json-schema.org/draft-07/schema#' 13 | } satisfies JSONSchema; 14 | 15 | export const constSchema = { 16 | type: 'object', 17 | properties: { 18 | name: { type: 'string', default: '', minLength: 3 }, 19 | email: { type: 'string', format: 'email' } 20 | }, 21 | required: ['email'], 22 | additionalProperties: false, 23 | $schema: 'http://json-schema.org/draft-07/schema#' 24 | } as const satisfies JSONSchema; 25 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/simple-tainted/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { message, superValidate } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | 9 | // Always return { form } in load functions 10 | return { form }; 11 | }; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const form = await superValidate(request, zod(schema)); 16 | console.log(form); 17 | 18 | if (!form.valid) { 19 | // Again, return { form } and things will just work. 20 | return fail(400, { form }); 21 | } 22 | 23 | // TODO: Do something with the validated form.data 24 | 25 | return message(form, 'Form posted successfully!'); 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/simple-tainted/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | // Define at the top-level so it stays in memory and the adapter can be cached 4 | export const schema = z.object({ 5 | name: z.object({ 6 | value: z.string().min(5) 7 | }), 8 | email: z.object({ 9 | value: z.string().email() 10 | }) 11 | }); 12 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/snapshot-proxy/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/snapshot-proxy/NumberInput.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 14 | 15 | 16 | 17 | 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/snapshot-proxy/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | score: z.number() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/spa-action-2/+page.server.ts: -------------------------------------------------------------------------------- 1 | export const load = async () => { 2 | const entries = [ 3 | { id: 1, name: 'Number one' }, 4 | { id: 2, name: 'Number two' }, 5 | { id: 3, name: 'Number three' } 6 | ]; 7 | return { entries }; 8 | }; 9 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/spa-action-2/classify/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { valibot } from '$lib/adapters/valibot.js'; 2 | import { fail, superValidate } from '$lib/index.js'; 3 | import { classifySchema } from './schema.js'; 4 | 5 | export const actions = { 6 | default: async ({ request }) => { 7 | await new Promise((res) => setTimeout(res, 500)); 8 | 9 | const form = await superValidate(request, valibot(classifySchema)); 10 | console.log(form); 11 | 12 | if (!form.valid) return fail(400, { form }); 13 | 14 | return { form, posted: form.data.id }; 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/spa-action-2/classify/schema.ts: -------------------------------------------------------------------------------- 1 | import * as v from 'valibot'; 2 | 3 | export const classifySchema = v.object({ 4 | id: v.pipe(v.number(), v.minValue(1)), 5 | name: v.string() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/spa-clearonsubmit/schema.ts: -------------------------------------------------------------------------------- 1 | import { object, string, email, minLength, pipe } from 'valibot'; 2 | 3 | export const schema = object({ 4 | name: pipe(string(), minLength(2)), 5 | email: pipe(string(), email()) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/spa-clearonsubmit/spinner.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/spa-error/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { arktype } from '$lib/adapters/arktype.js'; 2 | import { message, superValidate } from '$lib/index.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import type { PageServerLoad } from './$types.js'; 5 | import { schema } from './schema.js'; 6 | 7 | const defaults = { 8 | name: '', 9 | email: '' 10 | }; 11 | 12 | export const load = (async () => { 13 | return { 14 | form: superValidate(arktype(schema, { defaults })) 15 | }; 16 | }) satisfies PageServerLoad; 17 | 18 | export const actions = { 19 | default: async ({ request }) => { 20 | const form = await superValidate(request, arktype(schema, { defaults })); 21 | if (!form.valid) { 22 | return fail(400, { form }); 23 | } 24 | 25 | return message(form, 'Form posted successfully!'); 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/spa-error/schema.ts: -------------------------------------------------------------------------------- 1 | import { type } from 'arktype'; 2 | 3 | export const schema = type({ 4 | name: 'string>=2', 5 | email: 'string.email' 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/spa-error/spinner.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/step-form/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/step-form/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | points: z.number().int().min(0).max(5), 6 | email: z.string().email() 7 | }); 8 | 9 | export const step1 = schema.pick({ 10 | name: true 11 | }); 12 | 13 | export const step2 = schema.pick({ 14 | points: true 15 | }); 16 | 17 | export const step3 = schema.pick({ 18 | email: true 19 | }); 20 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/submit-enter/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, setError } from '$lib/server/index.js'; 2 | import { schema } from './schema.js'; 3 | 4 | import type { Actions, PageServerLoad } from './$types.js'; 5 | import { zod } from '$lib/adapters/zod.js'; 6 | 7 | ///// Load function ///// 8 | 9 | export const load: PageServerLoad = async () => { 10 | const form = await superValidate(zod(schema)); 11 | return { form }; 12 | }; 13 | 14 | ///// Form actions ///// 15 | 16 | export const actions: Actions = { 17 | default: async ({ request }) => { 18 | const form = await superValidate(request, zod(schema)); 19 | 20 | console.log('POST', form); 21 | 22 | return setError(form, 'name', 'some error'); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/submit-enter/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | password: z.string().min(1) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/submit-json/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/submit-json/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/submit-prog/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted:' + form.data.name); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/submit-prog/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/superstruct/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superstruct } from '$lib/adapters/superstruct.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | const defaults = { name: '', email: '' }; 7 | 8 | export const load = async () => { 9 | const form = await superValidate(superstruct(schema, { defaults })); 10 | return { form }; 11 | }; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | console.log(formData); 17 | 18 | const form = await superValidate(formData, superstruct(schema, { defaults })); 19 | console.log(form); 20 | 21 | if (!form.valid) return fail(400, { form }); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/superstruct/schema.ts: -------------------------------------------------------------------------------- 1 | import { object, string, size, define } from 'superstruct'; 2 | 3 | const email = () => define('email', (value) => String(value).includes('@')); 4 | 5 | export const schema = object({ 6 | name: size(string(), 2, 100), 7 | email: email() 8 | }); 9 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/syncflash/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2).default('OK') 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/tainted-array/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | details: z 5 | .object({ 6 | name: z.string(), 7 | email: z.string().email() 8 | }) 9 | .array() 10 | }); 11 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/tainted-component/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/tainted-component/Button.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/tainted-component/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/tainted-history/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const form = await superValidate(request, zod(schema)); 14 | console.log(form); 15 | 16 | if (!form.valid) return fail(400, { form }); 17 | 18 | return message(form, 'Form posted successfully!'); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/tainted-history/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/tainted-null-random/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { schema } from './schema.js'; 3 | import { superValidate } from '$lib/superValidate.js'; 4 | 5 | export const load = async () => { 6 | const form = await superValidate( 7 | { 8 | foo: { 9 | name: 'Superform rocks', 10 | link: 'https://example.com' 11 | } 12 | }, 13 | zod(schema) 14 | ); 15 | return { form }; 16 | }; 17 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/tainted-null-random/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | foo: z 5 | .object({ 6 | name: z.string(), 7 | link: z.string().url().optional(), 8 | other: z.string().optional() 9 | }) 10 | .nullable() 11 | }); 12 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/timeproxy/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/timeproxy/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | time: z.date(), 5 | datetime: z.date() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/transport/schema.ts: -------------------------------------------------------------------------------- 1 | import { Decimal } from 'decimal.js'; 2 | import { z } from 'zod'; 3 | import { RecordId } from '../../../RecordId.js'; 4 | 5 | export const schema = z.object({ 6 | id: z.instanceof(RecordId).default(new RecordId(123, 'test')), 7 | name: z.string().min(2), 8 | luckyNumber: z 9 | .instanceof(Decimal) 10 | .refine((d) => d.greaterThanOrEqualTo(1), 'Lucky number must be >= 1') 11 | .default(new Decimal(0)) 12 | }); 13 | 14 | export type Schema = z.infer; 15 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/trim-fields/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/trim-fields/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2).trim(), 5 | direction: z 6 | .enum(['north', 'south', 'east', 'west']) 7 | .default('south') 8 | .transform((dir) => (dir == 'west' ? 'east' : dir)) 9 | }); 10 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/typebox/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { typebox } from '$lib/adapters/typebox.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(typebox(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, typebox(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/typebox/schema.ts: -------------------------------------------------------------------------------- 1 | import { Type } from '@sinclair/typebox'; 2 | 3 | export const schema = Type.Object({ 4 | name: Type.String({ minLength: 2 }), 5 | email: Type.String({ format: 'email' }) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/union-component/+page.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/union-component/+page.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { superValidate } from '$lib/index.js'; 3 | import { schema } from './schemas.js'; 4 | 5 | export const load = async () => { 6 | const form = await superValidate(zod(schema)); 7 | 8 | return { form }; 9 | }; 10 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/union-component/input.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 |

{superForm.isTainted()}

13 |

{field}

14 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/union-component/schemas.ts: -------------------------------------------------------------------------------- 1 | import type { Infer } from '$lib/index.js'; 2 | import { z } from 'zod'; 3 | 4 | export const eventSchema = z.object({ 5 | name: z.string(), 6 | desc: z.string().nullable() 7 | }); 8 | 9 | export const eventTemplateSchema = z.object({ 10 | name: z.string(), 11 | id: z.string() 12 | }); 13 | 14 | export const admissionSchema = z.object({ 15 | name: z.string() 16 | }); 17 | 18 | export const schema = z.union([eventTemplateSchema, eventSchema, admissionSchema]); 19 | 20 | export type UnionSchema = 21 | | Infer 22 | | Infer 23 | | Infer; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/union-component/union.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {superForm.isTainted()} 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/unions/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/unions/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schemaUnion = z.union([ 4 | z.object({ 5 | name: z.string().min(1) 6 | }), 7 | z.object({ 8 | number: z.number().int() 9 | }) 10 | ]); 11 | 12 | export const schema = z.object({ 13 | name: z.string().min(1), 14 | entity: z 15 | .discriminatedUnion('type', [ 16 | z.object({ type: z.literal('person'), DOB: z.date() }), 17 | z.object({ type: z.literal('corporate'), taxId: z.string().min(5) }) 18 | ]) 19 | .default({ type: 'person', DOB: new Date() }) 20 | }); 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/unknown-in-schema/+page.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/unknown-in-schema/FormCmptAge.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 19 | 20 | {$value.toExponential()} 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/unknown-in-schema/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string(), 5 | age: z.number(), 6 | homePlanet: z.unknown() 7 | }); 8 | 9 | export const anySchema = z.object({ 10 | name: z.string(), 11 | age: z.any() 12 | }); 13 | 14 | export const userSchema = z.object({ 15 | name: z.string(), 16 | options: z 17 | .array( 18 | z.object({ 19 | color: z.string().trim().nullable(), 20 | value: z.string().trim() 21 | }) 22 | ) 23 | .default([]) 24 | }); 25 | 26 | /** 27 | * 28 | * Expected type 29 | * ---------------- 30 | name: string; 31 | options: { 32 | value: string; 33 | color: string | null; 34 | }[]; 35 | * 36 | */ 37 | export type UserSchemaInffered = z.infer; 38 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/valibot-dates/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { schema } from './schema.js'; 2 | import { fail } from '@sveltejs/kit'; 3 | import { superValidate } from '$lib/index.js'; 4 | import { valibot } from '$lib/adapters/valibot.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(valibot(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | test: async (event) => { 13 | const formData = await event.request.formData(); 14 | console.log('🚀 ~ test: ~ formData:', formData); 15 | const form = await superValidate(formData, valibot(schema)); 16 | console.log(form); 17 | if (!form.valid) return fail(400, { form }); 18 | return { form }; 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/valibot-dates/schema.ts: -------------------------------------------------------------------------------- 1 | import { date, minLength, object, pipe, string } from 'valibot'; 2 | 3 | export const schema = object({ 4 | date: date(), 5 | missing: pipe(string(), minLength(1)) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/valibot-nullable/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { valibot } from '$lib/adapters/valibot.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(valibot(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const form = await superValidate(request, valibot(schema)); 14 | console.log(form); 15 | 16 | if (!form.valid) return fail(400, { form }); 17 | 18 | return message(form, 'Form posted successfully!'); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/valibot-nullable/schema.ts: -------------------------------------------------------------------------------- 1 | import { object, string, minLength, email, nullable, pipe } from 'valibot'; 2 | 3 | export const schema = object({ 4 | name: nullable(pipe(string(), minLength(1))), 5 | email: pipe(string(), email()) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/valibot-transform/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { Actions, PageServerLoad } from './$types.js'; 2 | 3 | import { superValidate, message } from '$lib/index.js'; 4 | import { valibot } from '$lib/adapters/valibot.js'; 5 | import { fail } from '@sveltejs/kit'; 6 | import { schema } from './schema.js'; 7 | 8 | export const load: PageServerLoad = async () => { 9 | return { form: await superValidate(valibot(schema)) }; 10 | }; 11 | 12 | export const actions: Actions = { 13 | default: async ({ request }) => { 14 | const form = await superValidate(request, valibot(schema)); 15 | console.log(form); 16 | 17 | if (!form.valid) return fail(400, { form }); 18 | 19 | return message(form, 'Form posted successfully!'); 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/valibot-transform/schema.ts: -------------------------------------------------------------------------------- 1 | import { object, string, optional, pipe, transform, boolean } from 'valibot'; 2 | 3 | export const schema = pipe( 4 | object({ 5 | is_appointment: boolean(), 6 | is_emergency: boolean(), 7 | priority: string(), 8 | name: optional(string(), 'Hello world!') 9 | }), 10 | transform((input) => { 11 | if (!input.is_appointment) input.is_emergency = false; 12 | if (input.is_emergency) input.priority = 'Urgent'; 13 | else input.priority = 'Normal'; 14 | console.log(input); 15 | return input; 16 | }) 17 | ); 18 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/valibot/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { valibot } from '$lib/adapters/valibot.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { schema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(valibot(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const form = await superValidate(request, valibot(schema)); 14 | console.log(form); 15 | 16 | if (!form.valid) return fail(400, { form }); 17 | 18 | return message(form, 'Form posted successfully!'); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/valibot/schema.ts: -------------------------------------------------------------------------------- 1 | import { object, string, minLength, email, pipe } from 'valibot'; 2 | 3 | export const schema = object({ 4 | name: pipe(string(), minLength(2)), 5 | email: pipe(string(), email()) 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/validate-update/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/validate-update/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/validate/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/validate/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(1) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/validators-clear/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log('POST', form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/validators-clear/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(5) 5 | }); 6 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/validity-objects/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate( 8 | { 9 | priceRules: [ 10 | { 11 | priceCategory: { value: '' } 12 | } 13 | ] 14 | }, 15 | zod(schema), 16 | { errors: false } 17 | ); 18 | return { form }; 19 | }; 20 | 21 | export const actions = { 22 | default: async ({ request }) => { 23 | const formData = await request.formData(); 24 | console.log(formData); 25 | 26 | const form = await superValidate(formData, zod(schema)); 27 | console.log(form); 28 | 29 | if (!form.valid) return fail(400, { form }); 30 | 31 | return message(form, 'Posted OK!'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/validity-objects/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const schema = z.object({ 4 | priceRules: z 5 | .array( 6 | z.object({ 7 | priceCategory: z.object({ 8 | value: z.string().min(2) 9 | }) 10 | }) 11 | ) 12 | .min(2) 13 | }); 14 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/vine/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { vine } from '$lib/adapters/vine.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | const defaults = { name: '', email: '' }; 7 | 8 | export const load = async () => { 9 | const form = await superValidate(vine(schema, { defaults })); 10 | return { form }; 11 | }; 12 | 13 | export const actions = { 14 | default: async ({ request }) => { 15 | const formData = await request.formData(); 16 | console.log(formData); 17 | 18 | const form = await superValidate(formData, vine(schema, { defaults })); 19 | console.log(form); 20 | 21 | if (!form.valid) return fail(400, { form }); 22 | 23 | return message(form, 'Posted OK!'); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/vine/schema.ts: -------------------------------------------------------------------------------- 1 | import Vine from '@vinejs/vine'; 2 | 3 | export const schema = Vine.object({ 4 | name: Vine.string().minLength(2), 5 | email: Vine.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/zod-discriminated/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { superValidate, message } from '$lib/index.js'; 2 | import { zod } from '$lib/adapters/zod.js'; 3 | import { fail } from '@sveltejs/kit'; 4 | import { UserProfileZodSchema } from './schema.js'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate( 8 | { 9 | name: 'Programmer', 10 | email: 'cocplayout@gmail.com' 11 | }, 12 | zod(UserProfileZodSchema) 13 | ); 14 | 15 | return { form }; 16 | }; 17 | 18 | export const actions = { 19 | default: async ({ request }) => { 20 | const form = await superValidate(request, zod(UserProfileZodSchema)); 21 | console.log(form); 22 | 23 | if (!form.valid) return fail(400, { form }); 24 | 25 | return message(form, 'Form posted successfully!'); 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/zod4/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod4.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/zod4/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod/v4'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().min(2), 5 | email: z.string().email() 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/zodmini/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { zod } from '$lib/adapters/zod4.js'; 2 | import { message, superValidate } from '$lib/server/index.js'; 3 | import { schema } from './schema.js'; 4 | import { fail } from '@sveltejs/kit'; 5 | 6 | export const load = async () => { 7 | const form = await superValidate(zod(schema)); 8 | return { form }; 9 | }; 10 | 11 | export const actions = { 12 | default: async ({ request }) => { 13 | const formData = await request.formData(); 14 | console.log(formData); 15 | 16 | const form = await superValidate(formData, zod(schema)); 17 | console.log(form); 18 | 19 | if (!form.valid) return fail(400, { form }); 20 | 21 | return message(form, 'Posted OK!'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/routes/(v2)/v2/zodmini/schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod/v4-mini'; 2 | 3 | export const schema = z.object({ 4 | name: z.string().check(z.minLength(2, 'Name is too short')), 5 | email: z.email('Invalid email') 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/+layout.server.ts: -------------------------------------------------------------------------------- 1 | export { load } from 'sveltekit-flash-message/server'; 2 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | Superforms testing grounds 16 | 17 | {#if $flash} 18 | {@const bg = $flash.type == 'success' || $flash.type == 'ok' ? '#3D9970' : '#FF4136'} 19 |
{$flash.message}
20 | {/if} 21 | 22 | 23 | 24 | 31 | -------------------------------------------------------------------------------- /src/routes/RecordId.ts: -------------------------------------------------------------------------------- 1 | export class RecordId { 2 | public readonly id: number; 3 | public readonly tb: string; 4 | 5 | constructor(id: number, tb: string) { 6 | if (!id) throw new Error('id is required'); 7 | if (!tb) throw new Error('tb is required'); 8 | this.id = id; 9 | this.tb = tb; 10 | } 11 | 12 | public toString() { 13 | return `${this.id} for table ${this.tb}`; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /static/event-flowchart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ciscoheat/sveltekit-superforms/b02f5d0070e8729c2b926069383dadfa342d8f2d/static/event-flowchart.png -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | //csrf: { checkOrigin: false } // for ngrok 16 | } 17 | }; 18 | 19 | export default config; 20 | -------------------------------------------------------------------------------- /tsconfig.check.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["src/routes/(v2)/v2/components/**"] 4 | } 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "resolveJsonModule": true, 11 | "skipLibCheck": true, 12 | "sourceMap": true, 13 | "strict": true, 14 | "module": "NodeNext", 15 | "moduleResolution": "NodeNext" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /types-exist.js: -------------------------------------------------------------------------------- 1 | import { readdirSync, existsSync } from 'fs'; 2 | 3 | const path = './dist/adapters/'; 4 | 5 | // Sometimes, valibot types doesn't generate 6 | const js = readdirSync(path) 7 | .filter((f) => f.endsWith('.js')) 8 | .map((f) => path + f.slice(0, -2) + 'd.ts'); 9 | 10 | // The other file using the Prettify type 11 | js.push('./dist/client/proxies.d.ts'); 12 | 13 | for (const file of js) { 14 | if (!existsSync(file)) { 15 | console.error('Missing type definition:', file); 16 | process.exit(1); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()], 6 | test: { 7 | include: ['src/**/*.{test,spec}.{js,ts}'] 8 | }, 9 | define: { 10 | SUPERFORMS_LEGACY: true 11 | }, 12 | css: { 13 | preprocessorOptions: { 14 | scss: { 15 | api: `modern` 16 | } 17 | } 18 | } 19 | }); 20 | --------------------------------------------------------------------------------