Browse Source

refactor: extract shared Zod registration schema to packages/shared

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
feat/registration-page
npmrun 2 weeks ago
parent
commit
f6ed96efbb
  1. 14
      app/pages/register.vue
  2. 10
      nuxt.config.ts
  3. 23
      packages/shared/auth-schema.ts
  4. 5
      packages/shared/package.json
  5. 19
      server/utils/auth/validation.ts

14
app/pages/register.vue

@ -1,17 +1,7 @@
<script setup lang="ts">
import { z } from 'zod'
import { clientRegisterSchema } from 'shared/auth-schema'
const formSchema = z
.object({
username: z.string().trim().min(3, '用户名至少需要3个字符').max(30),
password: z.string().min(8, '密码至少需要8个字符'),
confirmPassword: z.string(),
captchaText: z.string().min(1, '请输入验证码'),
})
.refine((data) => data.password === data.confirmPassword, {
message: '两次输入的密码不一致',
path: ['confirmPassword'],
})
const formSchema = clientRegisterSchema
const state = reactive({
username: '',

10
nuxt.config.ts

@ -7,6 +7,13 @@ export default defineNuxtConfig({
fonts: false
},
devtools: { enabled: true },
vite: {
resolve: {
alias: {
'shared': new URL('./packages/shared', import.meta.url).pathname
}
}
},
nitro: {
typescript: {
tsConfig: {
@ -16,7 +23,8 @@ export default defineNuxtConfig({
baseUrl: './',
paths: {
'drizzle-pkg': ['./packages/drizzle-pkg/lib'],
'logger': ['./packages/logger/lib']
'logger': ['./packages/logger/lib'],
'shared': ['./packages/shared']
},
}
},

23
packages/shared/auth-schema.ts

@ -0,0 +1,23 @@
import { z } from 'zod'
export const registerSchema = z
.object({
username: z
.string()
.trim()
.min(3, '用户名至少需要3个字符')
.max(30, '用户名最多30个字符'),
password: z.string().min(8, '密码至少需要8个字符'),
confirmPassword: z.string(),
captchaToken: z.string().min(1, '验证码令牌不能为空'),
captchaText: z.string().min(1, '验证码不能为空'),
})
.refine((data) => data.password === data.confirmPassword, {
message: '两次输入的密码不一致',
path: ['confirmPassword'],
})
/** Client-side schema: omits captchaToken (managed by page shell) */
export const clientRegisterSchema = registerSchema.omit({ captchaToken: true })
export type RegisterInput = z.infer<typeof clientRegisterSchema>

5
packages/shared/package.json

@ -0,0 +1,5 @@
{
"name": "shared",
"type": "module",
"private": true
}

19
server/utils/auth/validation.ts

@ -1,18 +1 @@
import { z } from 'zod'
export const registerSchema = z
.object({
username: z
.string()
.trim()
.min(3, '用户名至少需要3个字符')
.max(30, '用户名最多30个字符'),
password: z.string().min(8, '密码至少需要8个字符'),
confirmPassword: z.string(),
captchaToken: z.string().min(1, '验证码令牌不能为空'),
captchaText: z.string().min(1, '验证码不能为空'),
})
.refine((data) => data.password === data.confirmPassword, {
message: '两次输入的密码不一致',
path: ['confirmPassword'],
})
export { registerSchema } from 'shared/auth-schema'

Loading…
Cancel
Save