@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
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { integer } from './integer.js'
|
|
3
|
-
import { withDefault } from './with-default.js'
|
|
4
|
-
|
|
5
|
-
describe('IntegerSchema', () => {
|
|
6
|
-
describe('basic validation', () => {
|
|
7
|
-
const schema = integer()
|
|
8
|
-
|
|
9
|
-
it('validates integers', () => {
|
|
10
|
-
const result = schema.safeParse(42)
|
|
11
|
-
expect(result.success).toBe(true)
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it('validates zero', () => {
|
|
15
|
-
const result = schema.safeParse(0)
|
|
16
|
-
expect(result.success).toBe(true)
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
it('validates negative integers', () => {
|
|
20
|
-
const result = schema.safeParse(-42)
|
|
21
|
-
expect(result.success).toBe(true)
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
it('validates large integers', () => {
|
|
25
|
-
const result = schema.safeParse(Number.MAX_SAFE_INTEGER)
|
|
26
|
-
expect(result.success).toBe(true)
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('validates small integers', () => {
|
|
30
|
-
const result = schema.safeParse(Number.MIN_SAFE_INTEGER)
|
|
31
|
-
expect(result.success).toBe(true)
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
it('rejects floats', () => {
|
|
35
|
-
const result = schema.safeParse(3.14)
|
|
36
|
-
expect(result.success).toBe(false)
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('rejects strings', () => {
|
|
40
|
-
const result = schema.safeParse('42')
|
|
41
|
-
expect(result.success).toBe(false)
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
it('rejects booleans', () => {
|
|
45
|
-
const result = schema.safeParse(true)
|
|
46
|
-
expect(result.success).toBe(false)
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('rejects null', () => {
|
|
50
|
-
const result = schema.safeParse(null)
|
|
51
|
-
expect(result.success).toBe(false)
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
it('rejects undefined', () => {
|
|
55
|
-
const result = schema.safeParse(undefined)
|
|
56
|
-
expect(result.success).toBe(false)
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
it('rejects objects', () => {
|
|
60
|
-
const result = schema.safeParse({})
|
|
61
|
-
expect(result.success).toBe(false)
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it('rejects arrays', () => {
|
|
65
|
-
const result = schema.safeParse([42])
|
|
66
|
-
expect(result.success).toBe(false)
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
it('rejects NaN', () => {
|
|
70
|
-
const result = schema.safeParse(NaN)
|
|
71
|
-
expect(result.success).toBe(false)
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it('rejects Infinity', () => {
|
|
75
|
-
const result = schema.safeParse(Infinity)
|
|
76
|
-
expect(result.success).toBe(false)
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
it('rejects -Infinity', () => {
|
|
80
|
-
const result = schema.safeParse(-Infinity)
|
|
81
|
-
expect(result.success).toBe(false)
|
|
82
|
-
})
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
describe('default value', () => {
|
|
86
|
-
const schema = withDefault(integer(), 10)
|
|
87
|
-
|
|
88
|
-
it('uses default when undefined is provided', () => {
|
|
89
|
-
const result = schema.safeParse(undefined)
|
|
90
|
-
expect(result).toMatchObject({
|
|
91
|
-
success: true,
|
|
92
|
-
value: 10,
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('does not use default when explicit value is provided', () => {
|
|
97
|
-
const result = schema.safeParse(20)
|
|
98
|
-
expect(result).toMatchObject({
|
|
99
|
-
success: true,
|
|
100
|
-
value: 20,
|
|
101
|
-
})
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('does not use default when zero is provided', () => {
|
|
105
|
-
const result = schema.safeParse(0)
|
|
106
|
-
expect(result.success).toBe(true)
|
|
107
|
-
if (result.success) {
|
|
108
|
-
expect(result.value).toBe(0)
|
|
109
|
-
}
|
|
110
|
-
})
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
describe('minimum constraint', () => {
|
|
114
|
-
const schema = integer({ minimum: 10 })
|
|
115
|
-
|
|
116
|
-
it('accepts values equal to minimum', () => {
|
|
117
|
-
const result = schema.safeParse(10)
|
|
118
|
-
expect(result.success).toBe(true)
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
it('accepts values greater than minimum', () => {
|
|
122
|
-
const result = schema.safeParse(20)
|
|
123
|
-
expect(result.success).toBe(true)
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
it('rejects values less than minimum', () => {
|
|
127
|
-
const result = schema.safeParse(5)
|
|
128
|
-
expect(result.success).toBe(false)
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
it('rejects zero when minimum is positive', () => {
|
|
132
|
-
const result = schema.safeParse(0)
|
|
133
|
-
expect(result.success).toBe(false)
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
it('rejects negative values when minimum is positive', () => {
|
|
137
|
-
const result = schema.safeParse(-10)
|
|
138
|
-
expect(result.success).toBe(false)
|
|
139
|
-
})
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
describe('maximum constraint', () => {
|
|
143
|
-
const schema = integer({ maximum: 100 })
|
|
144
|
-
|
|
145
|
-
it('accepts values equal to maximum', () => {
|
|
146
|
-
const result = schema.safeParse(100)
|
|
147
|
-
expect(result.success).toBe(true)
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
it('accepts values less than maximum', () => {
|
|
151
|
-
const result = schema.safeParse(50)
|
|
152
|
-
expect(result.success).toBe(true)
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
it('rejects values greater than maximum', () => {
|
|
156
|
-
const result = schema.safeParse(150)
|
|
157
|
-
expect(result.success).toBe(false)
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
it('accepts zero when maximum is positive', () => {
|
|
161
|
-
const result = schema.safeParse(0)
|
|
162
|
-
expect(result.success).toBe(true)
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
it('accepts negative values when maximum is positive', () => {
|
|
166
|
-
const result = schema.safeParse(-10)
|
|
167
|
-
expect(result.success).toBe(true)
|
|
168
|
-
})
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
describe('minimum and maximum constraints', () => {
|
|
172
|
-
const schema = integer({ minimum: 10, maximum: 100 })
|
|
173
|
-
|
|
174
|
-
it('accepts values within range', () => {
|
|
175
|
-
const result = schema.safeParse(50)
|
|
176
|
-
expect(result.success).toBe(true)
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
it('accepts minimum value', () => {
|
|
180
|
-
const result = schema.safeParse(10)
|
|
181
|
-
expect(result.success).toBe(true)
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
it('accepts maximum value', () => {
|
|
185
|
-
const result = schema.safeParse(100)
|
|
186
|
-
expect(result.success).toBe(true)
|
|
187
|
-
})
|
|
188
|
-
|
|
189
|
-
it('rejects values below minimum', () => {
|
|
190
|
-
const result = schema.safeParse(5)
|
|
191
|
-
expect(result.success).toBe(false)
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
it('rejects values above maximum', () => {
|
|
195
|
-
const result = schema.safeParse(150)
|
|
196
|
-
expect(result.success).toBe(false)
|
|
197
|
-
})
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
describe('negative range constraints', () => {
|
|
201
|
-
const schema = integer({ minimum: -100, maximum: -10 })
|
|
202
|
-
|
|
203
|
-
it('accepts negative values within range', () => {
|
|
204
|
-
const result = schema.safeParse(-50)
|
|
205
|
-
expect(result.success).toBe(true)
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
it('accepts minimum negative value', () => {
|
|
209
|
-
const result = schema.safeParse(-100)
|
|
210
|
-
expect(result.success).toBe(true)
|
|
211
|
-
})
|
|
212
|
-
|
|
213
|
-
it('accepts maximum negative value', () => {
|
|
214
|
-
const result = schema.safeParse(-10)
|
|
215
|
-
expect(result.success).toBe(true)
|
|
216
|
-
})
|
|
217
|
-
|
|
218
|
-
it('rejects values below minimum', () => {
|
|
219
|
-
const result = schema.safeParse(-150)
|
|
220
|
-
expect(result.success).toBe(false)
|
|
221
|
-
})
|
|
222
|
-
|
|
223
|
-
it('rejects values above maximum', () => {
|
|
224
|
-
const result = schema.safeParse(-5)
|
|
225
|
-
expect(result.success).toBe(false)
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
it('rejects zero', () => {
|
|
229
|
-
const result = schema.safeParse(0)
|
|
230
|
-
expect(result.success).toBe(false)
|
|
231
|
-
})
|
|
232
|
-
|
|
233
|
-
it('rejects positive values', () => {
|
|
234
|
-
const result = schema.safeParse(10)
|
|
235
|
-
expect(result.success).toBe(false)
|
|
236
|
-
})
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
describe('zero constraints', () => {
|
|
240
|
-
const schema = integer({ minimum: 0, maximum: 0 })
|
|
241
|
-
|
|
242
|
-
it('accepts zero', () => {
|
|
243
|
-
const result = schema.safeParse(0)
|
|
244
|
-
expect(result.success).toBe(true)
|
|
245
|
-
})
|
|
246
|
-
|
|
247
|
-
it('rejects positive values', () => {
|
|
248
|
-
const result = schema.safeParse(1)
|
|
249
|
-
expect(result.success).toBe(false)
|
|
250
|
-
})
|
|
251
|
-
|
|
252
|
-
it('rejects negative values', () => {
|
|
253
|
-
const result = schema.safeParse(-1)
|
|
254
|
-
expect(result.success).toBe(false)
|
|
255
|
-
})
|
|
256
|
-
})
|
|
257
|
-
|
|
258
|
-
describe('combined with default value', () => {
|
|
259
|
-
const schema = withDefault(integer({ minimum: 10, maximum: 100 }), 50)
|
|
260
|
-
|
|
261
|
-
it('uses default when undefined is provided', () => {
|
|
262
|
-
const result = schema.safeParse(undefined)
|
|
263
|
-
expect(result.success).toBe(true)
|
|
264
|
-
if (result.success) {
|
|
265
|
-
expect(result.value).toBe(50)
|
|
266
|
-
}
|
|
267
|
-
})
|
|
268
|
-
|
|
269
|
-
it('validates explicit values with constraints', () => {
|
|
270
|
-
const result = schema.safeParse(75)
|
|
271
|
-
expect(result.success).toBe(true)
|
|
272
|
-
})
|
|
273
|
-
|
|
274
|
-
it('rejects explicit values outside constraints', () => {
|
|
275
|
-
const result = schema.safeParse(5)
|
|
276
|
-
expect(result.success).toBe(false)
|
|
277
|
-
})
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
describe('edge cases', () => {
|
|
281
|
-
it('handles minimum of 0', () => {
|
|
282
|
-
const schema = integer({ minimum: 0 })
|
|
283
|
-
expect(schema.safeParse(0).success).toBe(true)
|
|
284
|
-
expect(schema.safeParse(-1).success).toBe(false)
|
|
285
|
-
expect(schema.safeParse(1).success).toBe(true)
|
|
286
|
-
})
|
|
287
|
-
|
|
288
|
-
it('handles maximum of 0', () => {
|
|
289
|
-
const schema = integer({ maximum: 0 })
|
|
290
|
-
expect(schema.safeParse(0).success).toBe(true)
|
|
291
|
-
expect(schema.safeParse(1).success).toBe(false)
|
|
292
|
-
expect(schema.safeParse(-1).success).toBe(true)
|
|
293
|
-
})
|
|
294
|
-
|
|
295
|
-
it('handles very large ranges', () => {
|
|
296
|
-
const schema = integer({
|
|
297
|
-
minimum: Number.MIN_SAFE_INTEGER,
|
|
298
|
-
maximum: Number.MAX_SAFE_INTEGER,
|
|
299
|
-
})
|
|
300
|
-
expect(schema.safeParse(Number.MIN_SAFE_INTEGER).success).toBe(true)
|
|
301
|
-
expect(schema.safeParse(Number.MAX_SAFE_INTEGER).success).toBe(true)
|
|
302
|
-
expect(schema.safeParse(0).success).toBe(true)
|
|
303
|
-
})
|
|
304
|
-
|
|
305
|
-
it('allows unconstrained schema', () => {
|
|
306
|
-
const schema = integer()
|
|
307
|
-
expect(schema.safeParse(Number.MIN_SAFE_INTEGER).success).toBe(true)
|
|
308
|
-
expect(schema.safeParse(Number.MAX_SAFE_INTEGER).success).toBe(true)
|
|
309
|
-
expect(schema.safeParse(0).success).toBe(true)
|
|
310
|
-
expect(schema.safeParse(-999999).success).toBe(true)
|
|
311
|
-
expect(schema.safeParse(999999).success).toBe(true)
|
|
312
|
-
})
|
|
313
|
-
})
|
|
314
|
-
})
|
package/src/schema/integer.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { Schema, ValidationContext } from '../core.js'
|
|
2
|
-
import { memoizedOptions } from '../util/memoize.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Configuration options for integer schema validation.
|
|
6
|
-
*
|
|
7
|
-
* @property minimum - Minimum allowed value (inclusive)
|
|
8
|
-
* @property maximum - Maximum allowed value (inclusive)
|
|
9
|
-
*/
|
|
10
|
-
export type IntegerSchemaOptions = {
|
|
11
|
-
minimum?: number
|
|
12
|
-
maximum?: number
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Schema for validating integer values with optional range constraints.
|
|
17
|
-
*
|
|
18
|
-
* Only accepts safe integers (values that can be exactly represented in JavaScript).
|
|
19
|
-
* Use {@link IntegerSchemaOptions} to constrain the allowed range.
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* ```ts
|
|
23
|
-
* const schema = new IntegerSchema({ minimum: 0, maximum: 100 })
|
|
24
|
-
* const result = schema.validate(42)
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export class IntegerSchema extends Schema<number> {
|
|
28
|
-
readonly type = 'integer' as const
|
|
29
|
-
|
|
30
|
-
constructor(readonly options?: IntegerSchemaOptions) {
|
|
31
|
-
super()
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
validateInContext(input: unknown, ctx: ValidationContext) {
|
|
35
|
-
if (!isInteger(input)) {
|
|
36
|
-
return ctx.issueUnexpectedType(input, 'integer')
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (this.options?.minimum != null && input < this.options.minimum) {
|
|
40
|
-
return ctx.issueTooSmall(input, 'integer', this.options.minimum, input)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (this.options?.maximum != null && input > this.options.maximum) {
|
|
44
|
-
return ctx.issueTooBig(input, 'integer', this.options.maximum, input)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return ctx.success(input)
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Simple wrapper around {@link Number.isSafeInteger} that acts as a type guard.
|
|
53
|
-
*/
|
|
54
|
-
function isInteger(input: unknown): input is number {
|
|
55
|
-
return Number.isSafeInteger(input)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Creates an integer schema with optional minimum and maximum constraints.
|
|
60
|
-
*
|
|
61
|
-
* Validates that the input is a safe integer (can be exactly represented in JavaScript)
|
|
62
|
-
* and optionally falls within a specified range.
|
|
63
|
-
*
|
|
64
|
-
* @param options - Optional configuration for minimum and maximum values
|
|
65
|
-
* @returns A new {@link IntegerSchema} instance
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* ```ts
|
|
69
|
-
* // Basic integer
|
|
70
|
-
* const countSchema = l.integer()
|
|
71
|
-
*
|
|
72
|
-
* // With minimum value
|
|
73
|
-
* const positiveSchema = l.integer({ minimum: 1 })
|
|
74
|
-
*
|
|
75
|
-
* // With range constraints
|
|
76
|
-
* const percentSchema = l.integer({ minimum: 0, maximum: 100 })
|
|
77
|
-
*
|
|
78
|
-
* // Age validation
|
|
79
|
-
* const ageSchema = l.integer({ minimum: 0, maximum: 150 })
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
export const integer = /*#__PURE__*/ memoizedOptions(function (
|
|
83
|
-
options?: IntegerSchemaOptions,
|
|
84
|
-
) {
|
|
85
|
-
return new IntegerSchema(options)
|
|
86
|
-
})
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { boolean } from './boolean.js'
|
|
3
|
-
import { dict } from './dict.js'
|
|
4
|
-
import { enumSchema } from './enum.js'
|
|
5
|
-
import { intersection } from './intersection.js'
|
|
6
|
-
import { object } from './object.js'
|
|
7
|
-
import { string } from './string.js'
|
|
8
|
-
|
|
9
|
-
describe('IntersectionSchema', () => {
|
|
10
|
-
const schema = intersection(
|
|
11
|
-
object({
|
|
12
|
-
title: string(),
|
|
13
|
-
}),
|
|
14
|
-
dict(enumSchema(['tag1', 'tag2']), boolean()),
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
it('validates extra properties with the provided validator', () => {
|
|
18
|
-
const result = schema.safeParse({
|
|
19
|
-
title: 'My Post',
|
|
20
|
-
tag1: true,
|
|
21
|
-
tag2: false,
|
|
22
|
-
})
|
|
23
|
-
expect(result.success).toBe(true)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
it('rejects extra properties that fail the provided validator', () => {
|
|
27
|
-
const result = schema.safeParse({
|
|
28
|
-
title: 'My Post',
|
|
29
|
-
tag1: 'not a boolean',
|
|
30
|
-
})
|
|
31
|
-
expect(result.success).toBe(false)
|
|
32
|
-
})
|
|
33
|
-
})
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
InferInput,
|
|
3
|
-
InferOutput,
|
|
4
|
-
Schema,
|
|
5
|
-
Simplify,
|
|
6
|
-
ValidationContext,
|
|
7
|
-
} from '../core.js'
|
|
8
|
-
import { DictSchema } from './dict.js'
|
|
9
|
-
import { ObjectSchema } from './object.js'
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Type utility for computing the intersection of two object types.
|
|
13
|
-
*
|
|
14
|
-
* Allows to more accurately represent the intersection of two object types
|
|
15
|
-
* where both types may share some keys, and one of them uses an index
|
|
16
|
-
* signature.
|
|
17
|
-
*
|
|
18
|
-
* @template A - First object type (typically from ObjectSchema)
|
|
19
|
-
* @template B - Second object type (typically from DictSchema)
|
|
20
|
-
*
|
|
21
|
-
* @see {@link https://www.typescriptlang.org/play/?#code/C4TwDgpgBAglC8UDeUBmB7dAuKByARgIYBOuUAvlAGTJQDaA+lAJYB2UAzsMWwOYC6OVgFcAtvgjEKAKGkATCAGMANiWiL0rLlEI4YsjVuBQA1hBA4uPVrwRQARBnT2Dm7QDdCy4dESE6ZiD8UAD0IVAi4pJQABQcABbowspyUBIORMT2AJSyEAAeYOjExqCQUACSrMCSHErAzJoAPNJQsFAFNaxyHFAASkrFck1WfAA0UMKsJqzoAO6sAHxjrVAAQh35XT39g8TDozYTUzPzSyuLdqtwVKttMYHoqO00j88bnRDdvawQ7pJ3NpQAD860BbRwSHBQLadAA0ix2G91oJ1vDggAfWABcxPF5QOH8aFtci5aRlaAwVDMfIQVKIKo1Yh1RQNZq0Jw4AgkMjkCYoRiIzjcPioyISKTkRayBQqNRQQzaQgAMRpdL01NpclcRignm8EFVWrsKrVchxQVC4XF0SxmSAA Playground link}
|
|
22
|
-
*/
|
|
23
|
-
export type Intersect<A, B> = B[keyof B] extends never
|
|
24
|
-
? A
|
|
25
|
-
: keyof A & keyof B extends never
|
|
26
|
-
? // If A and B don't overlap, just return A & B
|
|
27
|
-
A & B
|
|
28
|
-
: // Otherwise, properly represent the fact that accessing using an
|
|
29
|
-
// index signature could return a value from either A or B
|
|
30
|
-
A & { [K in keyof B]: B[K] | A[keyof A & K] }
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Schema for combining an object schema with a dictionary schema.
|
|
34
|
-
*
|
|
35
|
-
* Validates that the input matches both the fixed object shape and allows
|
|
36
|
-
* additional properties that match the dictionary schema. Properties defined
|
|
37
|
-
* in the object schema are validated by the object, and remaining properties
|
|
38
|
-
* are validated by the dictionary.
|
|
39
|
-
*
|
|
40
|
-
* @template Left - The ObjectSchema type for fixed properties
|
|
41
|
-
* @template Right - The DictSchema type for additional properties
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```ts
|
|
45
|
-
* const schema = new IntersectionSchema(
|
|
46
|
-
* l.object({ name: l.string() }),
|
|
47
|
-
* l.dict(l.string(), l.integer())
|
|
48
|
-
* )
|
|
49
|
-
* // Validates: { name: 'test', score: 100, count: 5 }
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export class IntersectionSchema<
|
|
53
|
-
const Left extends ObjectSchema = any,
|
|
54
|
-
const Right extends DictSchema = any,
|
|
55
|
-
> extends Schema<
|
|
56
|
-
Simplify<Intersect<InferInput<Left>, InferInput<Right>>>,
|
|
57
|
-
Simplify<Intersect<InferOutput<Left>, InferOutput<Right>>>
|
|
58
|
-
> {
|
|
59
|
-
readonly type = 'intersection' as const
|
|
60
|
-
|
|
61
|
-
constructor(
|
|
62
|
-
protected readonly left: Left,
|
|
63
|
-
protected readonly right: Right,
|
|
64
|
-
) {
|
|
65
|
-
super()
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
validateInContext(input: unknown, ctx: ValidationContext) {
|
|
69
|
-
const leftResult = ctx.validate(input, this.left)
|
|
70
|
-
if (!leftResult.success) return leftResult
|
|
71
|
-
|
|
72
|
-
return this.right.validateInContext(leftResult.value, ctx, {
|
|
73
|
-
ignoredKeys: this.left.validatorsMap,
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Creates an intersection schema combining fixed object properties with dynamic dictionary properties.
|
|
80
|
-
*
|
|
81
|
-
* Useful for objects that have a known set of properties plus additional
|
|
82
|
-
* arbitrary properties that follow a pattern.
|
|
83
|
-
*
|
|
84
|
-
* @param left - Object schema defining the fixed, known properties
|
|
85
|
-
* @param right - Dictionary schema for validating additional properties
|
|
86
|
-
* @returns A new {@link IntersectionSchema} instance
|
|
87
|
-
*
|
|
88
|
-
* @example
|
|
89
|
-
* ```ts
|
|
90
|
-
* // Object with fixed and dynamic properties
|
|
91
|
-
* const configSchema = l.intersection(
|
|
92
|
-
* l.object({
|
|
93
|
-
* version: l.integer(),
|
|
94
|
-
* name: l.string(),
|
|
95
|
-
* }),
|
|
96
|
-
* l.dict(l.string(), l.string()) // Additional string properties
|
|
97
|
-
* )
|
|
98
|
-
*
|
|
99
|
-
* configSchema.parse({
|
|
100
|
-
* version: 1,
|
|
101
|
-
* name: 'my-config',
|
|
102
|
-
* customField: 'value',
|
|
103
|
-
* anotherField: 'another',
|
|
104
|
-
* })
|
|
105
|
-
* ```
|
|
106
|
-
*/
|
|
107
|
-
/*@__NO_SIDE_EFFECTS__*/
|
|
108
|
-
export function intersection<
|
|
109
|
-
const Left extends ObjectSchema,
|
|
110
|
-
const Right extends DictSchema,
|
|
111
|
-
>(left: Left, right: Right) {
|
|
112
|
-
return new IntersectionSchema<Left, Right>(left, right)
|
|
113
|
-
}
|