@atproto/lex-schema 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/core/$type.d.ts +2 -2
- package/dist/core/$type.d.ts.map +1 -1
- package/dist/core/$type.js.map +1 -1
- package/dist/core/record-key.d.ts +1 -1
- package/dist/core/record-key.d.ts.map +1 -1
- package/dist/core/record-key.js.map +1 -1
- package/dist/core/schema.d.ts +3 -2
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +1 -1
- package/dist/core/schema.js.map +1 -1
- package/dist/core/standard-schema.d.ts +2 -2
- package/dist/core/standard-schema.d.ts.map +1 -1
- package/dist/core/standard-schema.js.map +1 -1
- package/dist/core/string-format.d.ts +2 -2
- package/dist/core/string-format.d.ts.map +1 -1
- package/dist/core/string-format.js.map +1 -1
- package/dist/core/validation-error.d.ts +1 -1
- package/dist/core/validation-error.d.ts.map +1 -1
- package/dist/core/validation-error.js +1 -1
- package/dist/core/validation-error.js.map +1 -1
- package/dist/core/validator.d.ts +1 -1
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +1 -1
- package/dist/core/validator.js.map +1 -1
- package/dist/helpers.d.ts +2 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +2 -2
- package/dist/helpers.js.map +1 -1
- package/dist/schema/array.d.ts +1 -1
- package/dist/schema/array.d.ts.map +1 -1
- package/dist/schema/array.js +1 -1
- package/dist/schema/array.js.map +1 -1
- package/dist/schema/blob.d.ts +1 -1
- package/dist/schema/blob.d.ts.map +1 -1
- package/dist/schema/blob.js +2 -2
- package/dist/schema/blob.js.map +1 -1
- package/dist/schema/boolean.js +1 -1
- package/dist/schema/boolean.js.map +1 -1
- package/dist/schema/bytes.js +1 -1
- package/dist/schema/bytes.js.map +1 -1
- package/dist/schema/cid.d.ts +1 -1
- package/dist/schema/cid.d.ts.map +1 -1
- package/dist/schema/cid.js +3 -3
- package/dist/schema/cid.js.map +1 -1
- package/dist/schema/custom.js +1 -1
- package/dist/schema/custom.js.map +1 -1
- package/dist/schema/dict.d.ts +1 -1
- package/dist/schema/dict.d.ts.map +1 -1
- package/dist/schema/dict.js +1 -1
- package/dist/schema/dict.js.map +1 -1
- package/dist/schema/discriminated-union.d.ts +1 -1
- package/dist/schema/discriminated-union.d.ts.map +1 -1
- package/dist/schema/discriminated-union.js +2 -1
- package/dist/schema/discriminated-union.js.map +1 -1
- package/dist/schema/enum.js +1 -1
- package/dist/schema/enum.js.map +1 -1
- package/dist/schema/integer.js +1 -1
- package/dist/schema/integer.js.map +1 -1
- package/dist/schema/intersection.d.ts +1 -1
- package/dist/schema/intersection.d.ts.map +1 -1
- package/dist/schema/intersection.js +3 -1
- package/dist/schema/intersection.js.map +1 -1
- package/dist/schema/lex-map.d.ts +1 -1
- package/dist/schema/lex-map.d.ts.map +1 -1
- package/dist/schema/lex-map.js +1 -1
- package/dist/schema/lex-map.js.map +1 -1
- package/dist/schema/lex-value.d.ts +1 -1
- package/dist/schema/lex-value.d.ts.map +1 -1
- package/dist/schema/lex-value.js +1 -1
- package/dist/schema/lex-value.js.map +1 -1
- package/dist/schema/literal.js +1 -1
- package/dist/schema/literal.js.map +1 -1
- package/dist/schema/never.js +1 -1
- package/dist/schema/never.js.map +1 -1
- package/dist/schema/null.js +1 -1
- package/dist/schema/null.js.map +1 -1
- package/dist/schema/nullable.d.ts +1 -1
- package/dist/schema/nullable.d.ts.map +1 -1
- package/dist/schema/nullable.js +1 -1
- package/dist/schema/nullable.js.map +1 -1
- package/dist/schema/object.d.ts +2 -1
- package/dist/schema/object.d.ts.map +1 -1
- package/dist/schema/object.js +1 -1
- package/dist/schema/object.js.map +1 -1
- package/dist/schema/optional.d.ts +2 -1
- package/dist/schema/optional.d.ts.map +1 -1
- package/dist/schema/optional.js +2 -1
- package/dist/schema/optional.js.map +1 -1
- package/dist/schema/params.d.ts +1 -1
- package/dist/schema/params.d.ts.map +1 -1
- package/dist/schema/params.js +1 -1
- package/dist/schema/params.js.map +1 -1
- package/dist/schema/payload.d.ts +3 -2
- package/dist/schema/payload.d.ts.map +1 -1
- package/dist/schema/payload.js +2 -1
- package/dist/schema/payload.js.map +1 -1
- package/dist/schema/permission-set.d.ts +1 -1
- package/dist/schema/permission-set.d.ts.map +1 -1
- package/dist/schema/permission-set.js +1 -0
- package/dist/schema/permission-set.js.map +1 -1
- package/dist/schema/permission.d.ts +1 -1
- package/dist/schema/permission.d.ts.map +1 -1
- package/dist/schema/permission.js.map +1 -1
- package/dist/schema/procedure.d.ts +1 -1
- package/dist/schema/procedure.d.ts.map +1 -1
- package/dist/schema/procedure.js +2 -0
- package/dist/schema/procedure.js.map +1 -1
- package/dist/schema/query.d.ts +1 -1
- package/dist/schema/query.d.ts.map +1 -1
- package/dist/schema/query.js +2 -0
- package/dist/schema/query.js.map +1 -1
- package/dist/schema/record.d.ts +2 -2
- package/dist/schema/record.d.ts.map +1 -1
- package/dist/schema/record.js +1 -1
- package/dist/schema/record.js.map +1 -1
- package/dist/schema/ref.d.ts +1 -1
- package/dist/schema/ref.d.ts.map +1 -1
- package/dist/schema/ref.js +1 -1
- package/dist/schema/ref.js.map +1 -1
- package/dist/schema/refine.d.ts +2 -2
- package/dist/schema/refine.d.ts.map +1 -1
- package/dist/schema/refine.js +1 -1
- package/dist/schema/refine.js.map +1 -1
- package/dist/schema/regexp.js +1 -1
- package/dist/schema/regexp.js.map +1 -1
- package/dist/schema/string.d.ts +2 -2
- package/dist/schema/string.d.ts.map +1 -1
- package/dist/schema/string.js +1 -1
- package/dist/schema/string.js.map +1 -1
- package/dist/schema/subscription.d.ts +3 -2
- package/dist/schema/subscription.d.ts.map +1 -1
- package/dist/schema/subscription.js +2 -0
- package/dist/schema/subscription.js.map +1 -1
- package/dist/schema/token.d.ts +1 -1
- package/dist/schema/token.d.ts.map +1 -1
- package/dist/schema/token.js +1 -1
- package/dist/schema/token.js.map +1 -1
- package/dist/schema/typed-object.d.ts +2 -2
- package/dist/schema/typed-object.d.ts.map +1 -1
- package/dist/schema/typed-object.js +1 -1
- package/dist/schema/typed-object.js.map +1 -1
- package/dist/schema/typed-ref.d.ts +1 -1
- package/dist/schema/typed-ref.d.ts.map +1 -1
- package/dist/schema/typed-ref.js +1 -1
- package/dist/schema/typed-ref.js.map +1 -1
- package/dist/schema/typed-union.d.ts +1 -1
- package/dist/schema/typed-union.d.ts.map +1 -1
- package/dist/schema/typed-union.js +3 -1
- package/dist/schema/typed-union.js.map +1 -1
- package/dist/schema/union.d.ts +1 -1
- package/dist/schema/union.d.ts.map +1 -1
- package/dist/schema/union.js +1 -1
- package/dist/schema/union.js.map +1 -1
- package/dist/schema/unknown.js +1 -1
- package/dist/schema/unknown.js.map +1 -1
- package/dist/schema/with-default.d.ts +1 -1
- package/dist/schema/with-default.d.ts.map +1 -1
- package/dist/schema/with-default.js +1 -1
- package/dist/schema/with-default.js.map +1 -1
- package/package.json +6 -10
- package/src/core/$type.test.ts +0 -24
- package/src/core/$type.ts +0 -199
- package/src/core/record-key.ts +0 -85
- package/src/core/result.ts +0 -15
- package/src/core/schema.ts +0 -412
- package/src/core/standard-schema.test.ts +0 -124
- package/src/core/standard-schema.ts +0 -31
- package/src/core/string-format.ts +0 -411
- package/src/core/types.ts +0 -120
- package/src/core/validation-error.ts +0 -134
- package/src/core/validation-issue.ts +0 -340
- package/src/core/validator.ts +0 -636
- package/src/core.ts +0 -9
- package/src/external.ts +0 -3
- package/src/helpers.test.ts +0 -694
- package/src/helpers.ts +0 -222
- package/src/index.ts +0 -3
- package/src/schema/array.test.ts +0 -251
- package/src/schema/array.ts +0 -126
- package/src/schema/blob.test.ts +0 -733
- package/src/schema/blob.ts +0 -150
- package/src/schema/boolean.test.ts +0 -118
- package/src/schema/boolean.ts +0 -46
- package/src/schema/bytes.test.ts +0 -227
- package/src/schema/bytes.ts +0 -81
- package/src/schema/cid.test.ts +0 -125
- package/src/schema/cid.ts +0 -69
- package/src/schema/custom.test.ts +0 -414
- package/src/schema/custom.ts +0 -106
- package/src/schema/dict.test.ts +0 -181
- package/src/schema/dict.ts +0 -122
- package/src/schema/discriminated-union.test.ts +0 -676
- package/src/schema/discriminated-union.ts +0 -196
- package/src/schema/enum.test.ts +0 -398
- package/src/schema/enum.ts +0 -77
- package/src/schema/integer.test.ts +0 -314
- package/src/schema/integer.ts +0 -86
- package/src/schema/intersection.test.ts +0 -33
- package/src/schema/intersection.ts +0 -113
- package/src/schema/lex-map.test.ts +0 -593
- package/src/schema/lex-map.ts +0 -63
- package/src/schema/lex-value.test.ts +0 -81
- package/src/schema/lex-value.ts +0 -86
- package/src/schema/literal.test.ts +0 -533
- package/src/schema/literal.ts +0 -70
- package/src/schema/never.test.ts +0 -175
- package/src/schema/never.ts +0 -56
- package/src/schema/null.test.ts +0 -80
- package/src/schema/null.ts +0 -49
- package/src/schema/nullable.test.ts +0 -470
- package/src/schema/nullable.ts +0 -74
- package/src/schema/object.test.ts +0 -69
- package/src/schema/object.ts +0 -136
- package/src/schema/optional.test.ts +0 -479
- package/src/schema/optional.ts +0 -92
- package/src/schema/params.test.ts +0 -1118
- package/src/schema/params.ts +0 -371
- package/src/schema/payload.test.ts +0 -340
- package/src/schema/payload.ts +0 -204
- package/src/schema/permission-set.test.ts +0 -613
- package/src/schema/permission-set.ts +0 -86
- package/src/schema/permission.test.ts +0 -537
- package/src/schema/permission.ts +0 -63
- package/src/schema/procedure.test.ts +0 -324
- package/src/schema/procedure.ts +0 -98
- package/src/schema/query.test.ts +0 -348
- package/src/schema/query.ts +0 -86
- package/src/schema/record.test.ts +0 -812
- package/src/schema/record.ts +0 -217
- package/src/schema/ref.test.ts +0 -349
- package/src/schema/ref.ts +0 -103
- package/src/schema/refine.test.ts +0 -579
- package/src/schema/refine.ts +0 -153
- package/src/schema/regexp.test.ts +0 -577
- package/src/schema/regexp.ts +0 -82
- package/src/schema/string.test.ts +0 -773
- package/src/schema/string.ts +0 -229
- package/src/schema/subscription.test.ts +0 -499
- package/src/schema/subscription.ts +0 -108
- package/src/schema/token.test.ts +0 -152
- package/src/schema/token.ts +0 -103
- package/src/schema/typed-object.test.ts +0 -745
- package/src/schema/typed-object.ts +0 -181
- package/src/schema/typed-ref.test.ts +0 -796
- package/src/schema/typed-ref.ts +0 -126
- package/src/schema/typed-union.test.ts +0 -355
- package/src/schema/typed-union.ts +0 -130
- package/src/schema/union.test.ts +0 -191
- package/src/schema/union.ts +0 -89
- package/src/schema/unknown.test.ts +0 -313
- package/src/schema/unknown.ts +0 -47
- package/src/schema/with-default.ts +0 -81
- package/src/schema.ts +0 -43
- package/src/util/array-agg.test.ts +0 -42
- package/src/util/array-agg.ts +0 -44
- package/src/util/assertion-util.ts +0 -1
- package/src/util/if-any.ts +0 -3
- package/src/util/lazy-property.ts +0 -14
- package/src/util/memoize.ts +0 -37
- package/tsconfig.build.json +0 -12
- package/tsconfig.json +0 -7
- package/tsconfig.tests.json +0 -8
package/src/schema/literal.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { Schema, ValidationContext } from '../core.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Schema that only accepts a specific literal value.
|
|
5
|
-
*
|
|
6
|
-
* Validates that the input is exactly equal to the specified value using
|
|
7
|
-
* strict equality (===).
|
|
8
|
-
*
|
|
9
|
-
* @template TValue - The literal type (null, string, number, or boolean)
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```ts
|
|
13
|
-
* const schema = new LiteralSchema('admin')
|
|
14
|
-
* schema.validate('admin') // success
|
|
15
|
-
* schema.validate('user') // fails
|
|
16
|
-
* ```
|
|
17
|
-
*/
|
|
18
|
-
export class LiteralSchema<
|
|
19
|
-
const TValue extends null | string | number | boolean,
|
|
20
|
-
> extends Schema<TValue> {
|
|
21
|
-
readonly type = 'literal' as const
|
|
22
|
-
|
|
23
|
-
constructor(readonly value: TValue) {
|
|
24
|
-
super()
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
validateInContext(input: unknown, ctx: ValidationContext) {
|
|
28
|
-
if (input !== this.value) {
|
|
29
|
-
return ctx.issueInvalidValue(input, [this.value])
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return ctx.success(this.value)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Creates a literal schema that only accepts the exact specified value.
|
|
38
|
-
*
|
|
39
|
-
* Useful for discriminator fields in unions, constant values, or type narrowing.
|
|
40
|
-
*
|
|
41
|
-
* @param value - The exact value that must be matched
|
|
42
|
-
* @returns A new {@link LiteralSchema} instance
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```ts
|
|
46
|
-
* // String literal
|
|
47
|
-
* const roleSchema = l.literal('admin')
|
|
48
|
-
*
|
|
49
|
-
* // Number literal
|
|
50
|
-
* const versionSchema = l.literal(1)
|
|
51
|
-
*
|
|
52
|
-
* // Boolean literal
|
|
53
|
-
* const enabledSchema = l.literal(true)
|
|
54
|
-
*
|
|
55
|
-
* // Null literal
|
|
56
|
-
* const nullSchema = l.literal(null)
|
|
57
|
-
*
|
|
58
|
-
* // In discriminated unions
|
|
59
|
-
* const actionSchema = l.discriminatedUnion('type', [
|
|
60
|
-
* l.object({ type: l.literal('create'), data: l.unknown() }),
|
|
61
|
-
* l.object({ type: l.literal('delete'), id: l.string() }),
|
|
62
|
-
* ])
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
/*@__NO_SIDE_EFFECTS__*/
|
|
66
|
-
export function literal<const V extends null | string | number | boolean>(
|
|
67
|
-
value: V,
|
|
68
|
-
) {
|
|
69
|
-
return new LiteralSchema<V>(value)
|
|
70
|
-
}
|
package/src/schema/never.test.ts
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { never } from './never.js'
|
|
3
|
-
|
|
4
|
-
describe('NeverSchema', () => {
|
|
5
|
-
describe('basic validation', () => {
|
|
6
|
-
const schema = never()
|
|
7
|
-
|
|
8
|
-
it('rejects strings', () => {
|
|
9
|
-
const result = schema.safeParse('string')
|
|
10
|
-
expect(result.success).toBe(false)
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
it('rejects numbers', () => {
|
|
14
|
-
const result = schema.safeParse(42)
|
|
15
|
-
expect(result.success).toBe(false)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('rejects booleans', () => {
|
|
19
|
-
const result = schema.safeParse(true)
|
|
20
|
-
expect(result.success).toBe(false)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('rejects null', () => {
|
|
24
|
-
const result = schema.safeParse(null)
|
|
25
|
-
expect(result.success).toBe(false)
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('rejects undefined', () => {
|
|
29
|
-
const result = schema.safeParse(undefined)
|
|
30
|
-
expect(result.success).toBe(false)
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('rejects objects', () => {
|
|
34
|
-
const result = schema.safeParse({})
|
|
35
|
-
expect(result.success).toBe(false)
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
it('rejects arrays', () => {
|
|
39
|
-
const result = schema.safeParse([])
|
|
40
|
-
expect(result.success).toBe(false)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('rejects empty strings', () => {
|
|
44
|
-
const result = schema.safeParse('')
|
|
45
|
-
expect(result.success).toBe(false)
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
it('rejects zero', () => {
|
|
49
|
-
const result = schema.safeParse(0)
|
|
50
|
-
expect(result.success).toBe(false)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('rejects false', () => {
|
|
54
|
-
const result = schema.safeParse(false)
|
|
55
|
-
expect(result.success).toBe(false)
|
|
56
|
-
})
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
describe('edge cases', () => {
|
|
60
|
-
const schema = never()
|
|
61
|
-
|
|
62
|
-
it('rejects BigInt', () => {
|
|
63
|
-
const result = schema.safeParse(BigInt(123))
|
|
64
|
-
expect(result.success).toBe(false)
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('rejects Symbol', () => {
|
|
68
|
-
const result = schema.safeParse(Symbol('test'))
|
|
69
|
-
expect(result.success).toBe(false)
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
it('rejects functions', () => {
|
|
73
|
-
const result = schema.safeParse(() => {})
|
|
74
|
-
expect(result.success).toBe(false)
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
it('rejects Date objects', () => {
|
|
78
|
-
const result = schema.safeParse(new Date())
|
|
79
|
-
expect(result.success).toBe(false)
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
it('rejects RegExp objects', () => {
|
|
83
|
-
const result = schema.safeParse(/test/)
|
|
84
|
-
expect(result.success).toBe(false)
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('rejects nested objects', () => {
|
|
88
|
-
const result = schema.safeParse({ nested: { value: 'test' } })
|
|
89
|
-
expect(result.success).toBe(false)
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it('rejects nested arrays', () => {
|
|
93
|
-
const result = schema.safeParse([
|
|
94
|
-
[1, 2],
|
|
95
|
-
[3, 4],
|
|
96
|
-
])
|
|
97
|
-
expect(result.success).toBe(false)
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
it('rejects Map objects', () => {
|
|
101
|
-
const result = schema.safeParse(new Map())
|
|
102
|
-
expect(result.success).toBe(false)
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it('rejects Set objects', () => {
|
|
106
|
-
const result = schema.safeParse(new Set())
|
|
107
|
-
expect(result.success).toBe(false)
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('rejects Error objects', () => {
|
|
111
|
-
const result = schema.safeParse(new Error('test'))
|
|
112
|
-
expect(result.success).toBe(false)
|
|
113
|
-
})
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
describe('complex data types', () => {
|
|
117
|
-
const schema = never()
|
|
118
|
-
|
|
119
|
-
it('rejects class instances', () => {
|
|
120
|
-
class TestClass {
|
|
121
|
-
value = 'test'
|
|
122
|
-
}
|
|
123
|
-
const result = schema.safeParse(new TestClass())
|
|
124
|
-
expect(result.success).toBe(false)
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
it('rejects arrays with values', () => {
|
|
128
|
-
const result = schema.safeParse([1, 2, 3, 'four', true])
|
|
129
|
-
expect(result.success).toBe(false)
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
it('rejects objects with properties', () => {
|
|
133
|
-
const result = schema.safeParse({
|
|
134
|
-
name: 'test',
|
|
135
|
-
age: 30,
|
|
136
|
-
active: true,
|
|
137
|
-
})
|
|
138
|
-
expect(result.success).toBe(false)
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
it('rejects Promise objects', () => {
|
|
142
|
-
const result = schema.safeParse(Promise.resolve(42))
|
|
143
|
-
expect(result.success).toBe(false)
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
it('rejects Buffer objects', () => {
|
|
147
|
-
const result = schema.safeParse(Buffer.from('test'))
|
|
148
|
-
expect(result.success).toBe(false)
|
|
149
|
-
})
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
describe('special number values', () => {
|
|
153
|
-
const schema = never()
|
|
154
|
-
|
|
155
|
-
it('rejects NaN', () => {
|
|
156
|
-
const result = schema.safeParse(NaN)
|
|
157
|
-
expect(result.success).toBe(false)
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
it('rejects Infinity', () => {
|
|
161
|
-
const result = schema.safeParse(Infinity)
|
|
162
|
-
expect(result.success).toBe(false)
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
it('rejects negative Infinity', () => {
|
|
166
|
-
const result = schema.safeParse(-Infinity)
|
|
167
|
-
expect(result.success).toBe(false)
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
it('rejects negative zero', () => {
|
|
171
|
-
const result = schema.safeParse(-0)
|
|
172
|
-
expect(result.success).toBe(false)
|
|
173
|
-
})
|
|
174
|
-
})
|
|
175
|
-
})
|
package/src/schema/never.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { Schema, ValidationContext } from '../core.js'
|
|
2
|
-
import { memoizedOptions } from '../util/memoize.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Schema that always fails validation.
|
|
6
|
-
*
|
|
7
|
-
* Represents an impossible type - no value can satisfy this schema.
|
|
8
|
-
* Useful for exhaustiveness checking or marking impossible branches.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* const schema = new NeverSchema()
|
|
13
|
-
* schema.validate(anything) // always fails
|
|
14
|
-
* ```
|
|
15
|
-
*/
|
|
16
|
-
export class NeverSchema extends Schema<never> {
|
|
17
|
-
readonly type = 'never' as const
|
|
18
|
-
|
|
19
|
-
validateInContext(input: unknown, ctx: ValidationContext) {
|
|
20
|
-
return ctx.issueUnexpectedType(input, 'never')
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Creates a never schema that always fails validation.
|
|
26
|
-
*
|
|
27
|
-
* Useful for exhaustiveness checking in TypeScript or marking impossible
|
|
28
|
-
* code paths.
|
|
29
|
-
*
|
|
30
|
-
* @returns A new {@link NeverSchema} instance
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```ts
|
|
34
|
-
* // Exhaustiveness checking
|
|
35
|
-
* type Status = 'active' | 'inactive'
|
|
36
|
-
*
|
|
37
|
-
* function handleStatus(status: Status) {
|
|
38
|
-
* switch (status) {
|
|
39
|
-
* case 'active': return 'Active'
|
|
40
|
-
* case 'inactive': return 'Inactive'
|
|
41
|
-
* default:
|
|
42
|
-
* // TypeScript will error if we miss a case
|
|
43
|
-
* l.never().parse(status)
|
|
44
|
-
* }
|
|
45
|
-
* }
|
|
46
|
-
*
|
|
47
|
-
* // In impossible union branches
|
|
48
|
-
* const schema = l.object({
|
|
49
|
-
* type: l.literal('fixed'),
|
|
50
|
-
* dynamic: l.never(), // This property can never exist
|
|
51
|
-
* })
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
export const never = /*#__PURE__*/ memoizedOptions(function () {
|
|
55
|
-
return new NeverSchema()
|
|
56
|
-
})
|
package/src/schema/null.test.ts
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { nullSchema } from './null.js'
|
|
3
|
-
|
|
4
|
-
describe('NullSchema', () => {
|
|
5
|
-
describe('basic validation', () => {
|
|
6
|
-
const schema = nullSchema()
|
|
7
|
-
|
|
8
|
-
it('validates null', () => {
|
|
9
|
-
const result = schema.safeParse(null)
|
|
10
|
-
expect(result.success).toBe(true)
|
|
11
|
-
if (result.success) {
|
|
12
|
-
expect(result.value).toBe(null)
|
|
13
|
-
}
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
it('rejects strings', () => {
|
|
17
|
-
const result = schema.safeParse('null')
|
|
18
|
-
expect(result.success).toBe(false)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('rejects numbers', () => {
|
|
22
|
-
const result = schema.safeParse(0)
|
|
23
|
-
expect(result.success).toBe(false)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
it('rejects booleans', () => {
|
|
27
|
-
const result = schema.safeParse(false)
|
|
28
|
-
expect(result.success).toBe(false)
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('rejects undefined', () => {
|
|
32
|
-
const result = schema.safeParse(undefined)
|
|
33
|
-
expect(result.success).toBe(false)
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('rejects objects', () => {
|
|
37
|
-
const result = schema.safeParse({})
|
|
38
|
-
expect(result.success).toBe(false)
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('rejects arrays', () => {
|
|
42
|
-
const result = schema.safeParse([])
|
|
43
|
-
expect(result.success).toBe(false)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('rejects empty string', () => {
|
|
47
|
-
const result = schema.safeParse('')
|
|
48
|
-
expect(result.success).toBe(false)
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
describe('edge cases', () => {
|
|
53
|
-
const schema = nullSchema()
|
|
54
|
-
|
|
55
|
-
it('rejects falsy values', () => {
|
|
56
|
-
const result = schema.safeParse(0)
|
|
57
|
-
expect(result.success).toBe(false)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
it('rejects string "null"', () => {
|
|
61
|
-
const result = schema.safeParse('null')
|
|
62
|
-
expect(result.success).toBe(false)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('rejects NaN', () => {
|
|
66
|
-
const result = schema.safeParse(NaN)
|
|
67
|
-
expect(result.success).toBe(false)
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
it('rejects nested null in object', () => {
|
|
71
|
-
const result = schema.safeParse({ value: null })
|
|
72
|
-
expect(result.success).toBe(false)
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
it('rejects nested null in array', () => {
|
|
76
|
-
const result = schema.safeParse([null])
|
|
77
|
-
expect(result.success).toBe(false)
|
|
78
|
-
})
|
|
79
|
-
})
|
|
80
|
-
})
|
package/src/schema/null.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Schema, ValidationContext } from '../core.js'
|
|
2
|
-
import { memoizedOptions } from '../util/memoize.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Schema for validating null values.
|
|
6
|
-
*
|
|
7
|
-
* Only accepts the JavaScript `null` value. Rejects `undefined` and all
|
|
8
|
-
* other values.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* const schema = new NullSchema()
|
|
13
|
-
* schema.validate(null) // success
|
|
14
|
-
* schema.validate(undefined) // fails
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
|
-
export class NullSchema extends Schema<null> {
|
|
18
|
-
readonly type = 'null' as const
|
|
19
|
-
|
|
20
|
-
validateInContext(input: unknown, ctx: ValidationContext) {
|
|
21
|
-
if (input !== null) {
|
|
22
|
-
return ctx.issueUnexpectedType(input, 'null')
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return ctx.success(null)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Creates a null schema that only accepts the null value.
|
|
31
|
-
*
|
|
32
|
-
* Useful for explicitly representing null in union types or optional fields.
|
|
33
|
-
*
|
|
34
|
-
* @returns A new {@link NullSchema} instance
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```ts
|
|
38
|
-
* // Explicit null
|
|
39
|
-
* const nullOnlySchema = l.null()
|
|
40
|
-
*
|
|
41
|
-
* // Nullable string (string or null)
|
|
42
|
-
* const nullableStringSchema = l.union([l.string(), l.null()])
|
|
43
|
-
* ```
|
|
44
|
-
*/
|
|
45
|
-
export const nullSchema = /*#__PURE__*/ memoizedOptions(function () {
|
|
46
|
-
return new NullSchema()
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
export { nullSchema as null }
|