@atproto/lex-schema 0.1.4 → 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 +24 -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,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
- }
@@ -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
- })
@@ -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
- })
@@ -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
- })
@@ -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 }