@atproto/lex-schema 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/core/$type.d.ts +2 -2
- package/dist/core/$type.d.ts.map +1 -1
- package/dist/core/$type.js.map +1 -1
- package/dist/core/record-key.d.ts +1 -1
- package/dist/core/record-key.d.ts.map +1 -1
- package/dist/core/record-key.js.map +1 -1
- package/dist/core/schema.d.ts +3 -2
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +1 -1
- package/dist/core/schema.js.map +1 -1
- package/dist/core/standard-schema.d.ts +2 -2
- package/dist/core/standard-schema.d.ts.map +1 -1
- package/dist/core/standard-schema.js.map +1 -1
- package/dist/core/string-format.d.ts +2 -2
- package/dist/core/string-format.d.ts.map +1 -1
- package/dist/core/string-format.js.map +1 -1
- package/dist/core/validation-error.d.ts +1 -1
- package/dist/core/validation-error.d.ts.map +1 -1
- package/dist/core/validation-error.js +1 -1
- package/dist/core/validation-error.js.map +1 -1
- package/dist/core/validator.d.ts +1 -1
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +1 -1
- package/dist/core/validator.js.map +1 -1
- package/dist/helpers.d.ts +2 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +2 -2
- package/dist/helpers.js.map +1 -1
- package/dist/schema/array.d.ts +1 -1
- package/dist/schema/array.d.ts.map +1 -1
- package/dist/schema/array.js +1 -1
- package/dist/schema/array.js.map +1 -1
- package/dist/schema/blob.d.ts +1 -1
- package/dist/schema/blob.d.ts.map +1 -1
- package/dist/schema/blob.js +2 -2
- package/dist/schema/blob.js.map +1 -1
- package/dist/schema/boolean.js +1 -1
- package/dist/schema/boolean.js.map +1 -1
- package/dist/schema/bytes.js +1 -1
- package/dist/schema/bytes.js.map +1 -1
- package/dist/schema/cid.d.ts +1 -1
- package/dist/schema/cid.d.ts.map +1 -1
- package/dist/schema/cid.js +3 -3
- package/dist/schema/cid.js.map +1 -1
- package/dist/schema/custom.js +1 -1
- package/dist/schema/custom.js.map +1 -1
- package/dist/schema/dict.d.ts +1 -1
- package/dist/schema/dict.d.ts.map +1 -1
- package/dist/schema/dict.js +1 -1
- package/dist/schema/dict.js.map +1 -1
- package/dist/schema/discriminated-union.d.ts +1 -1
- package/dist/schema/discriminated-union.d.ts.map +1 -1
- package/dist/schema/discriminated-union.js +2 -1
- package/dist/schema/discriminated-union.js.map +1 -1
- package/dist/schema/enum.js +1 -1
- package/dist/schema/enum.js.map +1 -1
- package/dist/schema/integer.js +1 -1
- package/dist/schema/integer.js.map +1 -1
- package/dist/schema/intersection.d.ts +1 -1
- package/dist/schema/intersection.d.ts.map +1 -1
- package/dist/schema/intersection.js +3 -1
- package/dist/schema/intersection.js.map +1 -1
- package/dist/schema/lex-map.d.ts +1 -1
- package/dist/schema/lex-map.d.ts.map +1 -1
- package/dist/schema/lex-map.js +1 -1
- package/dist/schema/lex-map.js.map +1 -1
- package/dist/schema/lex-value.d.ts +1 -1
- package/dist/schema/lex-value.d.ts.map +1 -1
- package/dist/schema/lex-value.js +1 -1
- package/dist/schema/lex-value.js.map +1 -1
- package/dist/schema/literal.js +1 -1
- package/dist/schema/literal.js.map +1 -1
- package/dist/schema/never.js +1 -1
- package/dist/schema/never.js.map +1 -1
- package/dist/schema/null.js +1 -1
- package/dist/schema/null.js.map +1 -1
- package/dist/schema/nullable.d.ts +1 -1
- package/dist/schema/nullable.d.ts.map +1 -1
- package/dist/schema/nullable.js +1 -1
- package/dist/schema/nullable.js.map +1 -1
- package/dist/schema/object.d.ts +2 -1
- package/dist/schema/object.d.ts.map +1 -1
- package/dist/schema/object.js +1 -1
- package/dist/schema/object.js.map +1 -1
- package/dist/schema/optional.d.ts +2 -1
- package/dist/schema/optional.d.ts.map +1 -1
- package/dist/schema/optional.js +2 -1
- package/dist/schema/optional.js.map +1 -1
- package/dist/schema/params.d.ts +1 -1
- package/dist/schema/params.d.ts.map +1 -1
- package/dist/schema/params.js +1 -1
- package/dist/schema/params.js.map +1 -1
- package/dist/schema/payload.d.ts +3 -2
- package/dist/schema/payload.d.ts.map +1 -1
- package/dist/schema/payload.js +2 -1
- package/dist/schema/payload.js.map +1 -1
- package/dist/schema/permission-set.d.ts +1 -1
- package/dist/schema/permission-set.d.ts.map +1 -1
- package/dist/schema/permission-set.js +1 -0
- package/dist/schema/permission-set.js.map +1 -1
- package/dist/schema/permission.d.ts +1 -1
- package/dist/schema/permission.d.ts.map +1 -1
- package/dist/schema/permission.js.map +1 -1
- package/dist/schema/procedure.d.ts +1 -1
- package/dist/schema/procedure.d.ts.map +1 -1
- package/dist/schema/procedure.js +2 -0
- package/dist/schema/procedure.js.map +1 -1
- package/dist/schema/query.d.ts +1 -1
- package/dist/schema/query.d.ts.map +1 -1
- package/dist/schema/query.js +2 -0
- package/dist/schema/query.js.map +1 -1
- package/dist/schema/record.d.ts +2 -2
- package/dist/schema/record.d.ts.map +1 -1
- package/dist/schema/record.js +1 -1
- package/dist/schema/record.js.map +1 -1
- package/dist/schema/ref.d.ts +1 -1
- package/dist/schema/ref.d.ts.map +1 -1
- package/dist/schema/ref.js +1 -1
- package/dist/schema/ref.js.map +1 -1
- package/dist/schema/refine.d.ts +2 -2
- package/dist/schema/refine.d.ts.map +1 -1
- package/dist/schema/refine.js +1 -1
- package/dist/schema/refine.js.map +1 -1
- package/dist/schema/regexp.js +1 -1
- package/dist/schema/regexp.js.map +1 -1
- package/dist/schema/string.d.ts +2 -2
- package/dist/schema/string.d.ts.map +1 -1
- package/dist/schema/string.js +1 -1
- package/dist/schema/string.js.map +1 -1
- package/dist/schema/subscription.d.ts +3 -2
- package/dist/schema/subscription.d.ts.map +1 -1
- package/dist/schema/subscription.js +2 -0
- package/dist/schema/subscription.js.map +1 -1
- package/dist/schema/token.d.ts +1 -1
- package/dist/schema/token.d.ts.map +1 -1
- package/dist/schema/token.js +1 -1
- package/dist/schema/token.js.map +1 -1
- package/dist/schema/typed-object.d.ts +2 -2
- package/dist/schema/typed-object.d.ts.map +1 -1
- package/dist/schema/typed-object.js +1 -1
- package/dist/schema/typed-object.js.map +1 -1
- package/dist/schema/typed-ref.d.ts +1 -1
- package/dist/schema/typed-ref.d.ts.map +1 -1
- package/dist/schema/typed-ref.js +1 -1
- package/dist/schema/typed-ref.js.map +1 -1
- package/dist/schema/typed-union.d.ts +1 -1
- package/dist/schema/typed-union.d.ts.map +1 -1
- package/dist/schema/typed-union.js +3 -1
- package/dist/schema/typed-union.js.map +1 -1
- package/dist/schema/union.d.ts +1 -1
- package/dist/schema/union.d.ts.map +1 -1
- package/dist/schema/union.js +1 -1
- package/dist/schema/union.js.map +1 -1
- package/dist/schema/unknown.js +1 -1
- package/dist/schema/unknown.js.map +1 -1
- package/dist/schema/with-default.d.ts +1 -1
- package/dist/schema/with-default.d.ts.map +1 -1
- package/dist/schema/with-default.js +1 -1
- package/dist/schema/with-default.js.map +1 -1
- package/package.json +6 -10
- package/src/core/$type.test.ts +0 -24
- package/src/core/$type.ts +0 -199
- package/src/core/record-key.ts +0 -85
- package/src/core/result.ts +0 -15
- package/src/core/schema.ts +0 -412
- package/src/core/standard-schema.test.ts +0 -124
- package/src/core/standard-schema.ts +0 -31
- package/src/core/string-format.ts +0 -411
- package/src/core/types.ts +0 -120
- package/src/core/validation-error.ts +0 -134
- package/src/core/validation-issue.ts +0 -340
- package/src/core/validator.ts +0 -636
- package/src/core.ts +0 -9
- package/src/external.ts +0 -3
- package/src/helpers.test.ts +0 -694
- package/src/helpers.ts +0 -222
- package/src/index.ts +0 -3
- package/src/schema/array.test.ts +0 -251
- package/src/schema/array.ts +0 -126
- package/src/schema/blob.test.ts +0 -733
- package/src/schema/blob.ts +0 -150
- package/src/schema/boolean.test.ts +0 -118
- package/src/schema/boolean.ts +0 -46
- package/src/schema/bytes.test.ts +0 -227
- package/src/schema/bytes.ts +0 -81
- package/src/schema/cid.test.ts +0 -125
- package/src/schema/cid.ts +0 -69
- package/src/schema/custom.test.ts +0 -414
- package/src/schema/custom.ts +0 -106
- package/src/schema/dict.test.ts +0 -181
- package/src/schema/dict.ts +0 -122
- package/src/schema/discriminated-union.test.ts +0 -676
- package/src/schema/discriminated-union.ts +0 -196
- package/src/schema/enum.test.ts +0 -398
- package/src/schema/enum.ts +0 -77
- package/src/schema/integer.test.ts +0 -314
- package/src/schema/integer.ts +0 -86
- package/src/schema/intersection.test.ts +0 -33
- package/src/schema/intersection.ts +0 -113
- package/src/schema/lex-map.test.ts +0 -593
- package/src/schema/lex-map.ts +0 -63
- package/src/schema/lex-value.test.ts +0 -81
- package/src/schema/lex-value.ts +0 -86
- package/src/schema/literal.test.ts +0 -533
- package/src/schema/literal.ts +0 -70
- package/src/schema/never.test.ts +0 -175
- package/src/schema/never.ts +0 -56
- package/src/schema/null.test.ts +0 -80
- package/src/schema/null.ts +0 -49
- package/src/schema/nullable.test.ts +0 -470
- package/src/schema/nullable.ts +0 -74
- package/src/schema/object.test.ts +0 -69
- package/src/schema/object.ts +0 -136
- package/src/schema/optional.test.ts +0 -479
- package/src/schema/optional.ts +0 -92
- package/src/schema/params.test.ts +0 -1118
- package/src/schema/params.ts +0 -371
- package/src/schema/payload.test.ts +0 -340
- package/src/schema/payload.ts +0 -204
- package/src/schema/permission-set.test.ts +0 -613
- package/src/schema/permission-set.ts +0 -86
- package/src/schema/permission.test.ts +0 -537
- package/src/schema/permission.ts +0 -63
- package/src/schema/procedure.test.ts +0 -324
- package/src/schema/procedure.ts +0 -98
- package/src/schema/query.test.ts +0 -348
- package/src/schema/query.ts +0 -86
- package/src/schema/record.test.ts +0 -812
- package/src/schema/record.ts +0 -217
- package/src/schema/ref.test.ts +0 -349
- package/src/schema/ref.ts +0 -103
- package/src/schema/refine.test.ts +0 -579
- package/src/schema/refine.ts +0 -153
- package/src/schema/regexp.test.ts +0 -577
- package/src/schema/regexp.ts +0 -82
- package/src/schema/string.test.ts +0 -773
- package/src/schema/string.ts +0 -229
- package/src/schema/subscription.test.ts +0 -499
- package/src/schema/subscription.ts +0 -108
- package/src/schema/token.test.ts +0 -152
- package/src/schema/token.ts +0 -103
- package/src/schema/typed-object.test.ts +0 -745
- package/src/schema/typed-object.ts +0 -181
- package/src/schema/typed-ref.test.ts +0 -796
- package/src/schema/typed-ref.ts +0 -126
- package/src/schema/typed-union.test.ts +0 -355
- package/src/schema/typed-union.ts +0 -130
- package/src/schema/union.test.ts +0 -191
- package/src/schema/union.ts +0 -89
- package/src/schema/unknown.test.ts +0 -313
- package/src/schema/unknown.ts +0 -47
- package/src/schema/with-default.ts +0 -81
- package/src/schema.ts +0 -43
- package/src/util/array-agg.test.ts +0 -42
- package/src/util/array-agg.ts +0 -44
- package/src/util/assertion-util.ts +0 -1
- package/src/util/if-any.ts +0 -3
- package/src/util/lazy-property.ts +0 -14
- package/src/util/memoize.ts +0 -37
- package/tsconfig.build.json +0 -12
- package/tsconfig.json +0 -7
- package/tsconfig.tests.json +0 -8
package/src/schema/dict.test.ts
DELETED
|
@@ -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
|
-
})
|
package/src/schema/dict.ts
DELETED
|
@@ -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
|
-
}
|