Skip to content

Commit

Permalink
fix: make schema classes Macroable
Browse files Browse the repository at this point in the history
Closes: #10
  • Loading branch information
thetutlage committed Jul 11, 2023
1 parent fa3c782 commit 41bd3d5
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 3 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"lint": "eslint . --ext=.ts",
"format": "prettier --write .",
"sync-labels": "github-label-sync --labels .github/labels.json vinejs/vine",
"quick:test": "node --loader=ts-node/esm bin/test.ts"
"quick:test": "node --loader=ts-node/esm --enable-source-maps bin/test.ts"
},
"publishConfig": {
"access": "public",
Expand Down
2 changes: 2 additions & 0 deletions src/schema/base/literal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/

import camelcase from 'camelcase'
import Macroable from '@poppinss/macroable'
import type { LiteralNode, RefsStore } from '@vinejs/compiler/types'

import { OTYPE, COTYPE, PARSE, VALIDATION } from '../../symbols.js'
Expand All @@ -25,6 +26,7 @@ import type {
* Base schema type with only modifiers applicable on all the schema types.
*/
abstract class BaseModifiersType<Output, CamelCaseOutput>
extends Macroable
implements ConstructableSchema<Output, CamelCaseOutput>
{
/**
Expand Down
2 changes: 2 additions & 0 deletions src/schema/base/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@ import type {
ParserOptions,
ConstructableSchema,
} from '../../types.js'
import Macroable from '@poppinss/macroable'

/**
* Base schema type with only modifiers applicable on all the schema types.
*/
export abstract class BaseModifiersType<Output, CamelCaseOutput>
extends Macroable
implements ConstructableSchema<Output, CamelCaseOutput>
{
/**
Expand Down
7 changes: 7 additions & 0 deletions src/schema/enum/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ export class VineEnum<const Values extends readonly unknown[]> extends BaseLiter

#values: Values | ((field: FieldContext) => Values)

/**
* Returns the enum choices
*/
getChoices() {
return this.#values
}

constructor(
values: Values | ((field: FieldContext) => Values),
options?: FieldOptions,
Expand Down
78 changes: 76 additions & 2 deletions tests/integration/validator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
*/

import { test } from '@japa/runner'
import vine from '../../index.js'
import vine, { VineArray, VineBoolean, VineEnum, VineLiteral, VineNumber, VineObject, VineRecord, VineString, VineTuple } from '../../index.js'

Check failure on line 11 in tests/integration/validator.spec.ts

View workflow job for this annotation

GitHub Actions / linux (18.x)

Replace `·VineArray,·VineBoolean,·VineEnum,·VineLiteral,·VineNumber,·VineObject,·VineRecord,·VineString,·VineTuple·` with `⏎··VineArray,⏎··VineBoolean,⏎··VineEnum,⏎··VineLiteral,⏎··VineNumber,⏎··VineObject,⏎··VineRecord,⏎··VineString,⏎··VineTuple,⏎`

Check failure on line 11 in tests/integration/validator.spec.ts

View workflow job for this annotation

GitHub Actions / lint / lint

Replace `·VineArray,·VineBoolean,·VineEnum,·VineLiteral,·VineNumber,·VineObject,·VineRecord,·VineString,·VineTuple·` with `⏎··VineArray,⏎··VineBoolean,⏎··VineEnum,⏎··VineLiteral,⏎··VineNumber,⏎··VineObject,⏎··VineRecord,⏎··VineString,⏎··VineTuple,⏎`

Check failure on line 11 in tests/integration/validator.spec.ts

View workflow job for this annotation

GitHub Actions / test / test_linux (18.16.0)

Replace `·VineArray,·VineBoolean,·VineEnum,·VineLiteral,·VineNumber,·VineObject,·VineRecord,·VineString,·VineTuple·` with `⏎··VineArray,⏎··VineBoolean,⏎··VineEnum,⏎··VineLiteral,⏎··VineNumber,⏎··VineObject,⏎··VineRecord,⏎··VineString,⏎··VineTuple,⏎`

Check failure on line 11 in tests/integration/validator.spec.ts

View workflow job for this annotation

GitHub Actions / windows (18.x)

Replace `·VineArray,·VineBoolean,·VineEnum,·VineLiteral,·VineNumber,·VineObject,·VineRecord,·VineString,·VineTuple·` with `␍⏎··VineArray,␍⏎··VineBoolean,␍⏎··VineEnum,␍⏎··VineLiteral,␍⏎··VineNumber,␍⏎··VineObject,␍⏎··VineRecord,␍⏎··VineString,␍⏎··VineTuple,␍⏎`

Check failure on line 11 in tests/integration/validator.spec.ts

View workflow job for this annotation

GitHub Actions / test / test_linux (20.x)

Replace `·VineArray,·VineBoolean,·VineEnum,·VineLiteral,·VineNumber,·VineObject,·VineRecord,·VineString,·VineTuple·` with `⏎··VineArray,⏎··VineBoolean,⏎··VineEnum,⏎··VineLiteral,⏎··VineNumber,⏎··VineObject,⏎··VineRecord,⏎··VineString,⏎··VineTuple,⏎`

Check failure on line 11 in tests/integration/validator.spec.ts

View workflow job for this annotation

GitHub Actions / windows (19.x)

Replace `·VineArray,·VineBoolean,·VineEnum,·VineLiteral,·VineNumber,·VineObject,·VineRecord,·VineString,·VineTuple·` with `␍⏎··VineArray,␍⏎··VineBoolean,␍⏎··VineEnum,␍⏎··VineLiteral,␍⏎··VineNumber,␍⏎··VineObject,␍⏎··VineRecord,␍⏎··VineString,␍⏎··VineTuple,␍⏎`

Check failure on line 11 in tests/integration/validator.spec.ts

View workflow job for this annotation

GitHub Actions / test / test_windows (18.16.0)

Replace `·VineArray,·VineBoolean,·VineEnum,·VineLiteral,·VineNumber,·VineObject,·VineRecord,·VineString,·VineTuple·` with `␍⏎··VineArray,␍⏎··VineBoolean,␍⏎··VineEnum,␍⏎··VineLiteral,␍⏎··VineNumber,␍⏎··VineObject,␍⏎··VineRecord,␍⏎··VineString,␍⏎··VineTuple,␍⏎`

test.group('Validator', () => {
test.group('Validator | metadata', () => {
test('pass metadata to the validation pipeline', async ({ assert }) => {
assert.plan(2)

Expand Down Expand Up @@ -103,3 +103,77 @@ test.group('Validator', () => {
)
}).throws('Invalid metadata')
})

test.group('Validator | extend schema classes', () => {
test('extend VineString class', ({ assert }) => {
VineString.macro('notPawned' as any, function (value: string) {
return value
})

assert.equal((vine.string() as any).notPawned('foo@bar.com'), 'foo@bar.com')
})

test('extend VineBoolean class', ({ assert }) => {
VineBoolean.macro('isTrue' as any, function () {
return true
})

assert.isTrue((vine.boolean() as any).isTrue())
})

test('extend VineNumber class', ({ assert }) => {
VineNumber.macro('isPrime' as any, function () {
return true
})

assert.isTrue((vine.number() as any).isPrime())
})

test('extend VineObject class', ({ assert }) => {
VineObject.macro('validatesEmail' as any, function (this: VineObject<any, any, any>) {
return 'email' in this.getProperties()
})

assert.isTrue((vine.object({ email: vine.string() }) as any).validatesEmail())
})

test('extend VineArray class', ({ assert }) => {
VineArray.macro('atLeastOne' as any, function (this: VineArray<any>) {
return true
})

assert.isTrue((vine.array(vine.string()) as any).atLeastOne())
})

test('extend VineRecord class', ({ assert }) => {
VineRecord.macro('atLeastOne' as any, function (this: VineRecord<any>) {
return true
})

assert.isTrue((vine.record(vine.string()) as any).atLeastOne())
})

test('extend VineTuple class', ({ assert }) => {
VineTuple.macro('atLeastOne' as any, function (this: VineTuple<any, any, any>) {
return true
})

assert.isTrue((vine.tuple([vine.string()]) as any).atLeastOne())
})

test('extend VineLiteral class', ({ assert }) => {
VineLiteral.macro('isTruthy' as any, function (this: VineLiteral<any>) {
return true
})

assert.isTrue((vine.literal(true) as any).isTruthy())
})

test('extend VineEnum class', ({ assert }) => {
VineEnum.macro('hasMultipleOptions' as any, function (this: VineEnum<any>) {
return this.getChoices().length > 0
})

assert.isTrue((vine.enum(['guest', 'moderator', 'admin']) as any).hasMultipleOptions())
})
})

0 comments on commit 41bd3d5

Please sign in to comment.