@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,181 +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 { integer } from './integer.js'
6
- import { string } from './string.js'
7
-
8
- describe('DictSchema', () => {
9
- const schema = dict(string(), integer())
10
-
11
- it('validates plain objects with valid keys and values', () => {
12
- const result = schema.safeParse({
13
- count: 42,
14
- total: 100,
15
- score: 85,
16
- })
17
- expect(result.success).toBe(true)
18
- })
19
-
20
- it('validates empty objects', () => {
21
- const result = schema.safeParse({})
22
- expect(result.success).toBe(true)
23
- })
24
-
25
- it('rejects non-objects', () => {
26
- const result = schema.safeParse('not an object')
27
- expect(result.success).toBe(false)
28
- })
29
-
30
- it('rejects arrays', () => {
31
- const result = schema.safeParse([1, 2, 3])
32
- expect(result.success).toBe(false)
33
- })
34
-
35
- it('rejects null', () => {
36
- const result = schema.safeParse(null)
37
- expect(result.success).toBe(false)
38
- })
39
-
40
- it('rejects undefined', () => {
41
- const result = schema.safeParse(undefined)
42
- expect(result.success).toBe(false)
43
- })
44
-
45
- it('rejects invalid value types', () => {
46
- const result = schema.safeParse({
47
- count: 'not a number',
48
- })
49
- expect(result.success).toBe(false)
50
- })
51
-
52
- it('rejects when one value is invalid', () => {
53
- const result = schema.safeParse({
54
- count: 42,
55
- invalid: 'string',
56
- total: 100,
57
- })
58
- expect(result.success).toBe(false)
59
- })
60
-
61
- it('validates with enum key schema', () => {
62
- const enumKeySchema = dict(enumSchema(['tag1', 'tag2', 'tag3']), boolean())
63
-
64
- const result = enumKeySchema.safeParse({
65
- tag1: true,
66
- tag2: false,
67
- tag3: true,
68
- })
69
- expect(result.success).toBe(true)
70
- })
71
-
72
- it('rejects invalid keys with enum key schema', () => {
73
- const enumKeySchema = dict(enumSchema(['tag1', 'tag2']), boolean())
74
-
75
- const result = enumKeySchema.safeParse({
76
- tag1: true,
77
- invalidTag: false,
78
- })
79
- expect(result.success).toBe(false)
80
- })
81
-
82
- it('validates nested dict schemas', () => {
83
- const nestedSchema = dict(string(), dict(string(), integer()))
84
-
85
- const result = nestedSchema.safeParse({
86
- group1: { count: 10, total: 20 },
87
- group2: { score: 85 },
88
- })
89
- expect(result.success).toBe(true)
90
- })
91
-
92
- it('validates with string key schema constraints', () => {
93
- const constrainedKeySchema = dict(
94
- string({ minLength: 3, maxLength: 10 }),
95
- integer(),
96
- )
97
-
98
- const result = constrainedKeySchema.safeParse({
99
- abc: 1,
100
- defghij: 2,
101
- })
102
- expect(result.success).toBe(true)
103
- })
104
-
105
- it('rejects keys that do not meet key schema constraints', () => {
106
- const constrainedKeySchema = dict(string({ minLength: 3 }), integer())
107
-
108
- const result = constrainedKeySchema.safeParse({
109
- ab: 1, // too short
110
- })
111
- expect(result.success).toBe(false)
112
- })
113
-
114
- it('validates with value schema constraints', () => {
115
- const constrainedValueSchema = dict(
116
- string(),
117
- integer({ minimum: 0, maximum: 100 }),
118
- )
119
-
120
- const result = constrainedValueSchema.safeParse({
121
- score: 50,
122
- total: 100,
123
- })
124
- expect(result.success).toBe(true)
125
- })
126
-
127
- it('rejects values that do not meet value schema constraints', () => {
128
- const constrainedValueSchema = dict(
129
- string(),
130
- integer({ minimum: 0, maximum: 100 }),
131
- )
132
-
133
- const result = constrainedValueSchema.safeParse({
134
- score: 150, // too high
135
- })
136
- expect(result.success).toBe(false)
137
- })
138
-
139
- it('validates dict with string values', () => {
140
- const stringValueSchema = dict(string(), string())
141
-
142
- const result = stringValueSchema.safeParse({
143
- name: 'Alice',
144
- city: 'New York',
145
- country: 'USA',
146
- })
147
- expect(result.success).toBe(true)
148
- })
149
-
150
- it('validates dict with boolean values', () => {
151
- const booleanValueSchema = dict(string(), boolean())
152
-
153
- const result = booleanValueSchema.safeParse({
154
- enabled: true,
155
- visible: false,
156
- active: true,
157
- })
158
- expect(result.success).toBe(true)
159
- })
160
-
161
- it('handles objects with numeric string keys', () => {
162
- const result = schema.safeParse({
163
- '0': 1,
164
- '1': 2,
165
- '2': 3,
166
- })
167
- expect(result.success).toBe(true)
168
- })
169
-
170
- it('preserves the original object when no transformations occur', () => {
171
- const input = { count: 42, total: 100 }
172
- const result = schema.safeParse(input)
173
-
174
- if (result.success) {
175
- // The implementation returns the same object if no changes are needed
176
- expect(result.value).toBe(input)
177
- } else {
178
- throw new Error('Expected validation to succeed')
179
- }
180
- })
181
- })
@@ -1,122 +0,0 @@
1
- import { isPlainObject } from '@atproto/lex-data'
2
- import {
3
- InferInput,
4
- InferOutput,
5
- Schema,
6
- ValidationContext,
7
- Validator,
8
- } from '../core.js'
9
-
10
- /**
11
- * Schema for validating dictionary/map-like objects with dynamic keys.
12
- *
13
- * Unlike `ObjectSchema` which validates a fixed set of properties, `DictSchema`
14
- * validates objects where any string key is allowed, with both keys and values
15
- * validated against their respective schemas.
16
- *
17
- * @note There is no dictionary in Lexicon schemas. This is a custom extension
18
- * to allow map-like objects when using the lex library programmatically (i.e.
19
- * not code generated from a lexicon schema).
20
- *
21
- * @template TKey - The validator type for dictionary keys (must validate strings)
22
- * @template TValue - The validator type for dictionary values
23
- *
24
- * @example
25
- * ```ts
26
- * const schema = new DictSchema(l.string(), l.integer())
27
- * const result = schema.validate({ a: 1, b: 2, c: 3 })
28
- * ```
29
- */
30
- export class DictSchema<
31
- const TKey extends Validator<string> = any,
32
- const TValue extends Validator = any,
33
- > extends Schema<
34
- Record<InferInput<TKey>, InferInput<TValue>>,
35
- Record<InferInput<TKey>, InferOutput<TValue>>
36
- > {
37
- readonly type = 'dict' as const
38
-
39
- constructor(
40
- readonly keySchema: TKey,
41
- readonly valueSchema: TValue,
42
- ) {
43
- super()
44
- }
45
-
46
- validateInContext(
47
- input: unknown,
48
- ctx: ValidationContext,
49
- options?: { ignoredKeys?: { has(k: string): boolean } },
50
- ) {
51
- if (!isPlainObject(input)) {
52
- return ctx.issueUnexpectedType(input, 'dict')
53
- }
54
-
55
- let copy: undefined | Record<string, unknown>
56
-
57
- for (const key in input) {
58
- if (options?.ignoredKeys?.has(key)) continue
59
-
60
- const keyResult = ctx.validate(key, this.keySchema)
61
- if (!keyResult.success) return keyResult
62
- if (keyResult.value !== key) {
63
- // We can't safely "move" the key to a different name in the output
64
- // object (because there may already be something there), so we issue a
65
- // "required key" error if the key validation changes the key
66
- return ctx.issueRequiredKey(input, key)
67
- }
68
-
69
- const valueResult = ctx.validateChild(input, key, this.valueSchema)
70
- if (!valueResult.success) return valueResult
71
-
72
- if (!Object.is(valueResult.value, input[key])) {
73
- if (ctx.options.mode === 'validate') {
74
- // In "validate" mode, we can't modify the input, so we issue an error
75
- return ctx.issueInvalidPropertyValue(input, key, [valueResult.value])
76
- }
77
-
78
- copy ??= { ...input }
79
- copy[key] = valueResult.value
80
- }
81
- }
82
-
83
- return ctx.success(copy ?? input)
84
- }
85
- }
86
-
87
- /**
88
- * Creates a dictionary schema for validating map-like objects.
89
- *
90
- * Validates objects where all keys match the key schema and all values
91
- * match the value schema. Useful for dynamic key-value mappings.
92
- *
93
- * @param key - Schema to validate each key (must be a string validator)
94
- * @param value - Schema to validate each value
95
- * @returns A new {@link DictSchema} instance
96
- *
97
- * @example
98
- * ```ts
99
- * // String to number mapping
100
- * const scoresSchema = l.dict(l.string(), l.integer())
101
- * scoresSchema.parse({ alice: 100, bob: 85 })
102
- *
103
- * // Constrained keys
104
- * const langSchema = l.dict(
105
- * l.string({ minLength: 2, maxLength: 5 }), // Language codes
106
- * l.string() // Translations
107
- * )
108
- *
109
- * // Complex values
110
- * const usersById = l.dict(
111
- * l.string({ format: 'did' }),
112
- * l.object({ name: l.string(), age: l.integer() })
113
- * )
114
- * ```
115
- */
116
- /*@__NO_SIDE_EFFECTS__*/
117
- export function dict<
118
- const TKey extends Validator<string>,
119
- const TValue extends Validator,
120
- >(key: TKey, value: TValue) {
121
- return new DictSchema<TKey, TValue>(key, value)
122
- }