├── .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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------