@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.
Files changed (263) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/core/$type.d.ts +2 -2
  3. package/dist/core/$type.d.ts.map +1 -1
  4. package/dist/core/$type.js.map +1 -1
  5. package/dist/core/record-key.d.ts +1 -1
  6. package/dist/core/record-key.d.ts.map +1 -1
  7. package/dist/core/record-key.js.map +1 -1
  8. package/dist/core/schema.d.ts +3 -2
  9. package/dist/core/schema.d.ts.map +1 -1
  10. package/dist/core/schema.js +1 -1
  11. package/dist/core/schema.js.map +1 -1
  12. package/dist/core/standard-schema.d.ts +2 -2
  13. package/dist/core/standard-schema.d.ts.map +1 -1
  14. package/dist/core/standard-schema.js.map +1 -1
  15. package/dist/core/string-format.d.ts +2 -2
  16. package/dist/core/string-format.d.ts.map +1 -1
  17. package/dist/core/string-format.js.map +1 -1
  18. package/dist/core/validation-error.d.ts +1 -1
  19. package/dist/core/validation-error.d.ts.map +1 -1
  20. package/dist/core/validation-error.js +1 -1
  21. package/dist/core/validation-error.js.map +1 -1
  22. package/dist/core/validator.d.ts +1 -1
  23. package/dist/core/validator.d.ts.map +1 -1
  24. package/dist/core/validator.js +1 -1
  25. package/dist/core/validator.js.map +1 -1
  26. package/dist/helpers.d.ts +2 -2
  27. package/dist/helpers.d.ts.map +1 -1
  28. package/dist/helpers.js +2 -2
  29. package/dist/helpers.js.map +1 -1
  30. package/dist/schema/array.d.ts +1 -1
  31. package/dist/schema/array.d.ts.map +1 -1
  32. package/dist/schema/array.js +1 -1
  33. package/dist/schema/array.js.map +1 -1
  34. package/dist/schema/blob.d.ts +1 -1
  35. package/dist/schema/blob.d.ts.map +1 -1
  36. package/dist/schema/blob.js +2 -2
  37. package/dist/schema/blob.js.map +1 -1
  38. package/dist/schema/boolean.js +1 -1
  39. package/dist/schema/boolean.js.map +1 -1
  40. package/dist/schema/bytes.js +1 -1
  41. package/dist/schema/bytes.js.map +1 -1
  42. package/dist/schema/cid.d.ts +1 -1
  43. package/dist/schema/cid.d.ts.map +1 -1
  44. package/dist/schema/cid.js +3 -3
  45. package/dist/schema/cid.js.map +1 -1
  46. package/dist/schema/custom.js +1 -1
  47. package/dist/schema/custom.js.map +1 -1
  48. package/dist/schema/dict.d.ts +1 -1
  49. package/dist/schema/dict.d.ts.map +1 -1
  50. package/dist/schema/dict.js +1 -1
  51. package/dist/schema/dict.js.map +1 -1
  52. package/dist/schema/discriminated-union.d.ts +1 -1
  53. package/dist/schema/discriminated-union.d.ts.map +1 -1
  54. package/dist/schema/discriminated-union.js +2 -1
  55. package/dist/schema/discriminated-union.js.map +1 -1
  56. package/dist/schema/enum.js +1 -1
  57. package/dist/schema/enum.js.map +1 -1
  58. package/dist/schema/integer.js +1 -1
  59. package/dist/schema/integer.js.map +1 -1
  60. package/dist/schema/intersection.d.ts +1 -1
  61. package/dist/schema/intersection.d.ts.map +1 -1
  62. package/dist/schema/intersection.js +3 -1
  63. package/dist/schema/intersection.js.map +1 -1
  64. package/dist/schema/lex-map.d.ts +1 -1
  65. package/dist/schema/lex-map.d.ts.map +1 -1
  66. package/dist/schema/lex-map.js +1 -1
  67. package/dist/schema/lex-map.js.map +1 -1
  68. package/dist/schema/lex-value.d.ts +1 -1
  69. package/dist/schema/lex-value.d.ts.map +1 -1
  70. package/dist/schema/lex-value.js +1 -1
  71. package/dist/schema/lex-value.js.map +1 -1
  72. package/dist/schema/literal.js +1 -1
  73. package/dist/schema/literal.js.map +1 -1
  74. package/dist/schema/never.js +1 -1
  75. package/dist/schema/never.js.map +1 -1
  76. package/dist/schema/null.js +1 -1
  77. package/dist/schema/null.js.map +1 -1
  78. package/dist/schema/nullable.d.ts +1 -1
  79. package/dist/schema/nullable.d.ts.map +1 -1
  80. package/dist/schema/nullable.js +1 -1
  81. package/dist/schema/nullable.js.map +1 -1
  82. package/dist/schema/object.d.ts +2 -1
  83. package/dist/schema/object.d.ts.map +1 -1
  84. package/dist/schema/object.js +1 -1
  85. package/dist/schema/object.js.map +1 -1
  86. package/dist/schema/optional.d.ts +2 -1
  87. package/dist/schema/optional.d.ts.map +1 -1
  88. package/dist/schema/optional.js +2 -1
  89. package/dist/schema/optional.js.map +1 -1
  90. package/dist/schema/params.d.ts +1 -1
  91. package/dist/schema/params.d.ts.map +1 -1
  92. package/dist/schema/params.js +1 -1
  93. package/dist/schema/params.js.map +1 -1
  94. package/dist/schema/payload.d.ts +3 -2
  95. package/dist/schema/payload.d.ts.map +1 -1
  96. package/dist/schema/payload.js +2 -1
  97. package/dist/schema/payload.js.map +1 -1
  98. package/dist/schema/permission-set.d.ts +1 -1
  99. package/dist/schema/permission-set.d.ts.map +1 -1
  100. package/dist/schema/permission-set.js +1 -0
  101. package/dist/schema/permission-set.js.map +1 -1
  102. package/dist/schema/permission.d.ts +1 -1
  103. package/dist/schema/permission.d.ts.map +1 -1
  104. package/dist/schema/permission.js.map +1 -1
  105. package/dist/schema/procedure.d.ts +1 -1
  106. package/dist/schema/procedure.d.ts.map +1 -1
  107. package/dist/schema/procedure.js +2 -0
  108. package/dist/schema/procedure.js.map +1 -1
  109. package/dist/schema/query.d.ts +1 -1
  110. package/dist/schema/query.d.ts.map +1 -1
  111. package/dist/schema/query.js +2 -0
  112. package/dist/schema/query.js.map +1 -1
  113. package/dist/schema/record.d.ts +2 -2
  114. package/dist/schema/record.d.ts.map +1 -1
  115. package/dist/schema/record.js +1 -1
  116. package/dist/schema/record.js.map +1 -1
  117. package/dist/schema/ref.d.ts +1 -1
  118. package/dist/schema/ref.d.ts.map +1 -1
  119. package/dist/schema/ref.js +1 -1
  120. package/dist/schema/ref.js.map +1 -1
  121. package/dist/schema/refine.d.ts +2 -2
  122. package/dist/schema/refine.d.ts.map +1 -1
  123. package/dist/schema/refine.js +1 -1
  124. package/dist/schema/refine.js.map +1 -1
  125. package/dist/schema/regexp.js +1 -1
  126. package/dist/schema/regexp.js.map +1 -1
  127. package/dist/schema/string.d.ts +2 -2
  128. package/dist/schema/string.d.ts.map +1 -1
  129. package/dist/schema/string.js +1 -1
  130. package/dist/schema/string.js.map +1 -1
  131. package/dist/schema/subscription.d.ts +3 -2
  132. package/dist/schema/subscription.d.ts.map +1 -1
  133. package/dist/schema/subscription.js +2 -0
  134. package/dist/schema/subscription.js.map +1 -1
  135. package/dist/schema/token.d.ts +1 -1
  136. package/dist/schema/token.d.ts.map +1 -1
  137. package/dist/schema/token.js +1 -1
  138. package/dist/schema/token.js.map +1 -1
  139. package/dist/schema/typed-object.d.ts +2 -2
  140. package/dist/schema/typed-object.d.ts.map +1 -1
  141. package/dist/schema/typed-object.js +1 -1
  142. package/dist/schema/typed-object.js.map +1 -1
  143. package/dist/schema/typed-ref.d.ts +1 -1
  144. package/dist/schema/typed-ref.d.ts.map +1 -1
  145. package/dist/schema/typed-ref.js +1 -1
  146. package/dist/schema/typed-ref.js.map +1 -1
  147. package/dist/schema/typed-union.d.ts +1 -1
  148. package/dist/schema/typed-union.d.ts.map +1 -1
  149. package/dist/schema/typed-union.js +3 -1
  150. package/dist/schema/typed-union.js.map +1 -1
  151. package/dist/schema/union.d.ts +1 -1
  152. package/dist/schema/union.d.ts.map +1 -1
  153. package/dist/schema/union.js +1 -1
  154. package/dist/schema/union.js.map +1 -1
  155. package/dist/schema/unknown.js +1 -1
  156. package/dist/schema/unknown.js.map +1 -1
  157. package/dist/schema/with-default.d.ts +1 -1
  158. package/dist/schema/with-default.d.ts.map +1 -1
  159. package/dist/schema/with-default.js +1 -1
  160. package/dist/schema/with-default.js.map +1 -1
  161. package/package.json +6 -10
  162. package/src/core/$type.test.ts +0 -24
  163. package/src/core/$type.ts +0 -199
  164. package/src/core/record-key.ts +0 -85
  165. package/src/core/result.ts +0 -15
  166. package/src/core/schema.ts +0 -412
  167. package/src/core/standard-schema.test.ts +0 -124
  168. package/src/core/standard-schema.ts +0 -31
  169. package/src/core/string-format.ts +0 -411
  170. package/src/core/types.ts +0 -120
  171. package/src/core/validation-error.ts +0 -134
  172. package/src/core/validation-issue.ts +0 -340
  173. package/src/core/validator.ts +0 -636
  174. package/src/core.ts +0 -9
  175. package/src/external.ts +0 -3
  176. package/src/helpers.test.ts +0 -694
  177. package/src/helpers.ts +0 -222
  178. package/src/index.ts +0 -3
  179. package/src/schema/array.test.ts +0 -251
  180. package/src/schema/array.ts +0 -126
  181. package/src/schema/blob.test.ts +0 -733
  182. package/src/schema/blob.ts +0 -150
  183. package/src/schema/boolean.test.ts +0 -118
  184. package/src/schema/boolean.ts +0 -46
  185. package/src/schema/bytes.test.ts +0 -227
  186. package/src/schema/bytes.ts +0 -81
  187. package/src/schema/cid.test.ts +0 -125
  188. package/src/schema/cid.ts +0 -69
  189. package/src/schema/custom.test.ts +0 -414
  190. package/src/schema/custom.ts +0 -106
  191. package/src/schema/dict.test.ts +0 -181
  192. package/src/schema/dict.ts +0 -122
  193. package/src/schema/discriminated-union.test.ts +0 -676
  194. package/src/schema/discriminated-union.ts +0 -196
  195. package/src/schema/enum.test.ts +0 -398
  196. package/src/schema/enum.ts +0 -77
  197. package/src/schema/integer.test.ts +0 -314
  198. package/src/schema/integer.ts +0 -86
  199. package/src/schema/intersection.test.ts +0 -33
  200. package/src/schema/intersection.ts +0 -113
  201. package/src/schema/lex-map.test.ts +0 -593
  202. package/src/schema/lex-map.ts +0 -63
  203. package/src/schema/lex-value.test.ts +0 -81
  204. package/src/schema/lex-value.ts +0 -86
  205. package/src/schema/literal.test.ts +0 -533
  206. package/src/schema/literal.ts +0 -70
  207. package/src/schema/never.test.ts +0 -175
  208. package/src/schema/never.ts +0 -56
  209. package/src/schema/null.test.ts +0 -80
  210. package/src/schema/null.ts +0 -49
  211. package/src/schema/nullable.test.ts +0 -470
  212. package/src/schema/nullable.ts +0 -74
  213. package/src/schema/object.test.ts +0 -69
  214. package/src/schema/object.ts +0 -136
  215. package/src/schema/optional.test.ts +0 -479
  216. package/src/schema/optional.ts +0 -92
  217. package/src/schema/params.test.ts +0 -1118
  218. package/src/schema/params.ts +0 -371
  219. package/src/schema/payload.test.ts +0 -340
  220. package/src/schema/payload.ts +0 -204
  221. package/src/schema/permission-set.test.ts +0 -613
  222. package/src/schema/permission-set.ts +0 -86
  223. package/src/schema/permission.test.ts +0 -537
  224. package/src/schema/permission.ts +0 -63
  225. package/src/schema/procedure.test.ts +0 -324
  226. package/src/schema/procedure.ts +0 -98
  227. package/src/schema/query.test.ts +0 -348
  228. package/src/schema/query.ts +0 -86
  229. package/src/schema/record.test.ts +0 -812
  230. package/src/schema/record.ts +0 -217
  231. package/src/schema/ref.test.ts +0 -349
  232. package/src/schema/ref.ts +0 -103
  233. package/src/schema/refine.test.ts +0 -579
  234. package/src/schema/refine.ts +0 -153
  235. package/src/schema/regexp.test.ts +0 -577
  236. package/src/schema/regexp.ts +0 -82
  237. package/src/schema/string.test.ts +0 -773
  238. package/src/schema/string.ts +0 -229
  239. package/src/schema/subscription.test.ts +0 -499
  240. package/src/schema/subscription.ts +0 -108
  241. package/src/schema/token.test.ts +0 -152
  242. package/src/schema/token.ts +0 -103
  243. package/src/schema/typed-object.test.ts +0 -745
  244. package/src/schema/typed-object.ts +0 -181
  245. package/src/schema/typed-ref.test.ts +0 -796
  246. package/src/schema/typed-ref.ts +0 -126
  247. package/src/schema/typed-union.test.ts +0 -355
  248. package/src/schema/typed-union.ts +0 -130
  249. package/src/schema/union.test.ts +0 -191
  250. package/src/schema/union.ts +0 -89
  251. package/src/schema/unknown.test.ts +0 -313
  252. package/src/schema/unknown.ts +0 -47
  253. package/src/schema/with-default.ts +0 -81
  254. package/src/schema.ts +0 -43
  255. package/src/util/array-agg.test.ts +0 -42
  256. package/src/util/array-agg.ts +0 -44
  257. package/src/util/assertion-util.ts +0 -1
  258. package/src/util/if-any.ts +0 -3
  259. package/src/util/lazy-property.ts +0 -14
  260. package/src/util/memoize.ts +0 -37
  261. package/tsconfig.build.json +0 -12
  262. package/tsconfig.json +0 -7
  263. 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
- })
@@ -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
- }