Skip to content

Commit 5854dea

Browse files
authored
fix(generators): Add main schema to all validators (#2997)
1 parent cab1acd commit 5854dea

7 files changed

Lines changed: 41 additions & 32 deletions

File tree

docs/api/schema/validators.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const queryValidator = addFormats(
4949

5050
## Validation functions
5151

52-
A validation function takes data and validates them against a schema using a validator. They can be used with any validation library. Currently the `getDataValidator` and `getValidator` functions are available for:
52+
A validation function takes data and validates them against a schema using a validator. They can be used with any validation library. Currently the `getValidator` functions are available for:
5353

5454
- [TypeBox schema](./typebox.md#validators) to validate a TypeBox definition using an Ajv validator instance
5555
- [JSON schema](./schema.md#validators) to validate a JSON schema object using an Ajv validator instance
@@ -64,7 +64,7 @@ The following hooks take a [validation function](#validation-functions) and vali
6464

6565
```ts
6666
import { Ajv, schemaHooks } from '@feathersjs/schema'
67-
import { Type, getDataValidator } from '@feathersjs/typebox'
67+
import { Type, getValidator } from '@feathersjs/typebox'
6868
import type { Static } from '@feathersjs/typebox'
6969
import { dataValidator } from '../validators'
7070

@@ -82,7 +82,7 @@ type User = Static<typeof userSchema>
8282
const userDataSchema = Type.Pick(userSchema, ['email', 'password'])
8383

8484
// Returns validation functions for `create`, `update` and `patch`
85-
const userDataValidator = getDataValidator(userDataSchema, dataValidator)
85+
const userDataValidator = getValidator(userDataSchema, dataValidator)
8686

8787
app.service('users').hooks({
8888
before: {

docs/guides/basics/schemas.md

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ First we need to update the `src/services/users/users.schema.js` file with the s
5050

5151
<DatabaseBlock global-id="sql">
5252

53-
```ts{2,17-18,33,43-53,81-85}
53+
```ts{2,17-18,34,44-54,82-86}
5454
// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
5555
import crypto from 'crypto'
5656
import { resolve } from '@feathersjs/schema'
57-
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
57+
import { Type, getValidator, querySyntax } from '@feathersjs/typebox'
5858
import type { Static } from '@feathersjs/typebox'
5959
import { passwordHash } from '@feathersjs/authentication-local'
6060
@@ -73,6 +73,7 @@ export const userSchema = Type.Object(
7373
{ $id: 'User', additionalProperties: false }
7474
)
7575
export type User = Static<typeof userSchema>
76+
export const userValidator = getValidator(userSchema, dataValidator)
7677
export const userResolver = resolve<User, HookContext>({})
7778
7879
export const userExternalResolver = resolve<User, HookContext>({
@@ -90,7 +91,7 @@ export const userDataSchema = Type.Pick(
9091
}
9192
)
9293
export type UserData = Static<typeof userDataSchema>
93-
export const userDataValidator = getDataValidator(userDataSchema, dataValidator)
94+
export const userDataValidator = getValidator(userDataSchema, dataValidator)
9495
export const userDataResolver = resolve<User, HookContext>({
9596
password: passwordHash({ strategy: 'local' }),
9697
avatar: async (value, user) => {
@@ -111,7 +112,7 @@ export const userPatchSchema = Type.Partial(userSchema, {
111112
$id: 'UserPatch'
112113
})
113114
export type UserPatch = Static<typeof userPatchSchema>
114-
export const userPatchValidator = getDataValidator(userPatchSchema, dataValidator)
115+
export const userPatchValidator = getValidator(userPatchSchema, dataValidator)
115116
export const userPatchResolver = resolve<User, HookContext>({
116117
password: passwordHash({ strategy: 'local' })
117118
})
@@ -146,11 +147,11 @@ export const userQueryResolver = resolve<UserQuery, HookContext>({
146147

147148
<DatabaseBlock global-id="mongodb">
148149

149-
```ts{2,17-18,33,43-53,81-85}
150+
```ts{2,17-18,34,44-54,82-86}
150151
// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
151152
import crypto from 'crypto'
152153
import { resolve } from '@feathersjs/schema'
153-
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
154+
import { Type, getValidator, querySyntax } from '@feathersjs/typebox'
154155
import type { Static } from '@feathersjs/typebox'
155156
import { passwordHash } from '@feathersjs/authentication-local'
156157
@@ -169,6 +170,7 @@ export const userSchema = Type.Object(
169170
{ $id: 'User', additionalProperties: false }
170171
)
171172
export type User = Static<typeof userSchema>
173+
export const userValidator = getValidator(userSchema, dataValidator)
172174
export const userResolver = resolve<User, HookContext>({})
173175
174176
export const userExternalResolver = resolve<User, HookContext>({
@@ -186,7 +188,7 @@ export const userDataSchema = Type.Pick(
186188
}
187189
)
188190
export type UserData = Static<typeof userDataSchema>
189-
export const userDataValidator = getDataValidator(userDataSchema, dataValidator)
191+
export const userDataValidator = getValidator(userDataSchema, dataValidator)
190192
export const userDataResolver = resolve<User, HookContext>({
191193
password: passwordHash({ strategy: 'local' }),
192194
avatar: async (value, user) => {
@@ -207,13 +209,13 @@ export const userPatchSchema = Type.Partial(userSchema, {
207209
$id: 'UserPatch'
208210
})
209211
export type UserPatch = Static<typeof userPatchSchema>
210-
export const userPatchValidator = getDataValidator(userPatchSchema, dataValidator)
212+
export const userPatchValidator = getValidator(userPatchSchema, dataValidator)
211213
export const userPatchResolver = resolve<User, HookContext>({
212214
password: passwordHash({ strategy: 'local' })
213215
})
214216
215217
// Schema for allowed query properties
216-
export const userQueryProperties = Type.Pick(userSchema, ['id', 'email', 'githubId'])
218+
export const userQueryProperties = Type.Pick(userSchema, ['_id', 'email', 'githubId'])
217219
export const userQuerySchema = Type.Intersect(
218220
[
219221
querySyntax(userQueryProperties),
@@ -257,10 +259,10 @@ Update the `src/services/messages/messages.schema.js` file like this:
257259

258260
<DatabaseBlock global-id="sql">
259261

260-
```ts{2,8,15-17,23-26,38-44,48,57-60}
262+
```ts{2,8,15-17,24-27,39-45,58-61}
261263
// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
262264
import { resolve, virtual } from '@feathersjs/schema'
263-
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
265+
import { Type, getValidator, querySyntax } from '@feathersjs/typebox'
264266
import type { Static } from '@feathersjs/typebox'
265267
266268
import type { HookContext } from '../../declarations'
@@ -279,6 +281,7 @@ export const messageSchema = Type.Object(
279281
{ $id: 'Message', additionalProperties: false }
280282
)
281283
export type Message = Static<typeof messageSchema>
284+
export const messageValidator = getValidator(messageSchema, dataValidator)
282285
export const messageResolver = resolve<Message, HookContext>({
283286
user: virtual(async (message, context) => {
284287
// Associate the user that sent the message
@@ -293,7 +296,7 @@ export const messageDataSchema = Type.Pick(messageSchema, ['text'], {
293296
$id: 'MessageData'
294297
})
295298
export type MessageData = Static<typeof messageDataSchema>
296-
export const messageDataValidator = getDataValidator(messageDataSchema, dataValidator)
299+
export const messageDataValidator = getValidator(messageDataSchema, dataValidator)
297300
export const messageDataResolver = resolve<Message, HookContext>({
298301
userId: async (_value, _message, context) => {
299302
// Associate the record with the id of the authenticated user
@@ -305,11 +308,11 @@ export const messageDataResolver = resolve<Message, HookContext>({
305308
})
306309
307310
// Schema for updating existing entries
308-
export const messagePatchSchema = Type.Partial(messageDataSchema, {
311+
export const messagePatchSchema = Type.Partial(messageSchema, {
309312
$id: 'MessagePatch'
310313
})
311314
export type MessagePatch = Static<typeof messagePatchSchema>
312-
export const messagePatchValidator = getDataValidator(messagePatchSchema, dataValidator)
315+
export const messagePatchValidator = getValidator(messagePatchSchema, dataValidator)
313316
export const messagePatchResolver = resolve<Message, HookContext>({})
314317
315318
// Schema for allowed query properties
@@ -336,10 +339,10 @@ export const messageQueryResolver = resolve<MessageQuery, HookContext>({})
336339

337340
<DatabaseBlock global-id="mongodb">
338341

339-
```ts{2,8,15-17,23-26,38-44,48,57-60}
342+
```ts{2,8,15-17,24-27,39-45,58-61}
340343
// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
341344
import { resolve, virtual } from '@feathersjs/schema'
342-
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
345+
import { Type, getValidator, querySyntax } from '@feathersjs/typebox'
343346
import type { Static } from '@feathersjs/typebox'
344347
345348
import type { HookContext } from '../../declarations'
@@ -358,6 +361,7 @@ export const messageSchema = Type.Object(
358361
{ $id: 'Message', additionalProperties: false }
359362
)
360363
export type Message = Static<typeof messageSchema>
364+
export const messageValidator = getValidator(messageSchema, dataValidator)
361365
export const messageResolver = resolve<Message, HookContext>({
362366
user: virtual(async (message, context) => {
363367
// Associate the user that sent the message
@@ -372,7 +376,7 @@ export const messageDataSchema = Type.Pick(messageSchema, ['text'], {
372376
$id: 'MessageData'
373377
})
374378
export type MessageData = Static<typeof messageDataSchema>
375-
export const messageDataValidator = getDataValidator(messageDataSchema, dataValidator)
379+
export const messageDataValidator = getValidator(messageDataSchema, dataValidator)
376380
export const messageDataResolver = resolve<Message, HookContext>({
377381
userId: async (_value, _message, context) => {
378382
// Associate the record with the id of the authenticated user
@@ -384,16 +388,16 @@ export const messageDataResolver = resolve<Message, HookContext>({
384388
})
385389
386390
// Schema for updating existing entries
387-
export const messagePatchSchema = Type.Partial(messageDataSchema, {
391+
export const messagePatchSchema = Type.Partial(messageSchema, {
388392
$id: 'MessagePatch'
389393
})
390394
export type MessagePatch = Static<typeof messagePatchSchema>
391-
export const messagePatchValidator = getDataValidator(messagePatchSchema, dataValidator)
395+
export const messagePatchValidator = getValidator(messagePatchSchema, dataValidator)
392396
export const messagePatchResolver = resolve<Message, HookContext>({})
393397
394398
// Schema for allowed query properties
395399
export const messageQueryProperties = Type.Pick(messageSchema,
396-
['_id', 'text', 'createdAt', 'userId']
400+
['_id', 'text', 'createdAt', 'userId']
397401
)
398402
export const messageQuerySchema = Type.Intersect(
399403
[

docs/guides/cli/service.schemas.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ export const nameSchema = Type.Object({
2323
})
2424
// The TypeScript type inferred from the schema
2525
export type Name = Static<typeof nameSchema>
26+
// The validator for the schema
27+
export const nameValidator = getValidator(nameSchema, dataValidator)
2628
// The resolver for the schema
2729
export const nameResolver = resolve<Name, HookContext>({
2830
properties: {}
2931
})
30-
// The validator if it is a schema for data
31-
export const nameValidator = getDataValidator(nameSchema, dataValidator)
3232
```
3333

3434
## Main Schemas and Resolvers
@@ -68,7 +68,7 @@ export const messagesDataSchema = Type.Pick(messagesSchema, ['string'], {
6868
additionalProperties: false
6969
})
7070
export type MessagesData = Static<typeof messagesDataSchema>
71-
export const messagesDataValidator = getDataValidator(messagesDataSchema, dataValidator)
71+
export const messagesDataValidator = getValidator(messagesDataSchema, dataValidator)
7272
export const messagesDataResolver = resolve<Messages, HookContext>({
7373
properties: {}
7474
})

packages/generators/src/authentication/templates/schema.json.tpl.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const ${camelName}Schema = {
4141
}
4242
} as const
4343
export type ${upperName} = FromSchema<typeof ${camelName}Schema>
44+
export const ${camelName}Validator = getValidator(${camelName}Schema, dataValidator)
4445
export const ${camelName}Resolver = resolve<${upperName}, HookContext>({})
4546
4647
export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({

packages/generators/src/authentication/templates/schema.typebox.tpl.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const template = ({
1212
relative
1313
}: AuthenticationGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
1414
import { resolve } from '@feathersjs/schema'
15-
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
15+
import { Type, getValidator, querySyntax } from '@feathersjs/typebox'
1616
import type { Static } from '@feathersjs/typebox'
1717
${localTemplate(authStrategies, `import { passwordHash } from '@feathersjs/authentication-local'`)}
1818
@@ -34,6 +34,7 @@ export const ${camelName}Schema = Type.Object({
3434
.join(',\n')}
3535
},{ $id: '${upperName}', additionalProperties: false })
3636
export type ${upperName} = Static<typeof ${camelName}Schema>
37+
export const ${camelName}Validator = getValidator(${camelName}Schema, dataValidator)
3738
export const ${camelName}Resolver = resolve<${upperName}, HookContext>({})
3839
3940
export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({
@@ -51,7 +52,7 @@ export const ${camelName}DataSchema = Type.Pick(${camelName}Schema, [
5152
{ $id: '${upperName}Data', additionalProperties: false }
5253
)
5354
export type ${upperName}Data = Static<typeof ${camelName}DataSchema>
54-
export const ${camelName}DataValidator = getDataValidator(${camelName}DataSchema, dataValidator)
55+
export const ${camelName}DataValidator = getValidator(${camelName}DataSchema, dataValidator)
5556
export const ${camelName}DataResolver = resolve<${upperName}, HookContext>({
5657
${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)}
5758
})
@@ -61,7 +62,7 @@ export const ${camelName}PatchSchema = Type.Partial(${camelName}Schema, {
6162
$id: '${upperName}Patch'
6263
})
6364
export type ${upperName}Patch = Static<typeof ${camelName}PatchSchema>
64-
export const ${camelName}PatchValidator = getDataValidator(${camelName}PatchSchema, dataValidator)
65+
export const ${camelName}PatchValidator = getValidator(${camelName}PatchSchema, dataValidator)
6566
export const ${camelName}PatchResolver = resolve<${upperName}, HookContext>({
6667
${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)}
6768
})

packages/generators/src/service/templates/schema.json.tpl.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ export const ${camelName}Schema = {
3434
}
3535
} as const
3636
export type ${upperName} = FromSchema<typeof ${camelName}Schema>
37+
export const ${camelName}Validator = getValidator(${camelName}Schema, dataValidator)
3738
export const ${camelName}Resolver = resolve<${upperName}, HookContext>({})
39+
3840
export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({})
3941
4042
// Schema for creating new data

packages/generators/src/service/templates/schema.typebox.tpl.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const template = ({
1111
lib
1212
}: ServiceGeneratorContext) => /* ts */ `// // For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
1313
import { resolve } from '@feathersjs/schema'
14-
import { Type, getDataValidator, getValidator, querySyntax } from '@feathersjs/typebox'
14+
import { Type, getValidator, querySyntax } from '@feathersjs/typebox'
1515
import type { Static } from '@feathersjs/typebox'
1616
1717
import type { HookContext } from '${relative}/declarations'
@@ -25,6 +25,7 @@ export const ${camelName}Schema = Type.Object({
2525
text: Type.String()
2626
}, { $id: '${upperName}', additionalProperties: false })
2727
export type ${upperName} = Static<typeof ${camelName}Schema>
28+
export const ${camelName}Validator = getValidator(${camelName}Schema, dataValidator)
2829
export const ${camelName}Resolver = resolve<${upperName}, HookContext>({})
2930
3031
export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext>({})
@@ -34,15 +35,15 @@ export const ${camelName}DataSchema = Type.Pick(${camelName}Schema, ['text'], {
3435
$id: '${upperName}Data'
3536
})
3637
export type ${upperName}Data = Static<typeof ${camelName}DataSchema>
37-
export const ${camelName}DataValidator = getDataValidator(${camelName}DataSchema, dataValidator)
38+
export const ${camelName}DataValidator = getValidator(${camelName}DataSchema, dataValidator)
3839
export const ${camelName}DataResolver = resolve<${upperName}, HookContext>({})
3940
4041
// Schema for updating existing entries
4142
export const ${camelName}PatchSchema = Type.Partial(${camelName}DataSchema, {
4243
$id: '${upperName}Patch'
4344
})
4445
export type ${upperName}Patch = Static<typeof ${camelName}PatchSchema>
45-
export const ${camelName}PatchValidator = getDataValidator(${camelName}PatchSchema, dataValidator)
46+
export const ${camelName}PatchValidator = getValidator(${camelName}PatchSchema, dataValidator)
4647
export const ${camelName}PatchResolver = resolve<${upperName}, HookContext>({})
4748
4849
// Schema for allowed query properties

0 commit comments

Comments
 (0)