@atproto/lex-schema 0.0.8 → 0.0.10
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 +41 -0
- package/LICENSE.txt +1 -1
- package/dist/core/$type.d.ts +11 -0
- package/dist/core/$type.d.ts.map +1 -1
- package/dist/core/$type.js +4 -0
- package/dist/core/$type.js.map +1 -1
- package/dist/core/schema.d.ts +31 -24
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +38 -8
- package/dist/core/schema.js.map +1 -1
- package/dist/core/string-format.d.ts +35 -35
- package/dist/core/string-format.d.ts.map +1 -1
- package/dist/core/string-format.js +49 -91
- package/dist/core/string-format.js.map +1 -1
- package/dist/core/validation-issue.js +1 -1
- package/dist/core/validation-issue.js.map +1 -1
- package/dist/core/validator.d.ts +53 -32
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +18 -22
- package/dist/core/validator.js.map +1 -1
- package/dist/external.d.ts +0 -85
- package/dist/external.d.ts.map +1 -1
- package/dist/external.js +0 -164
- package/dist/external.js.map +1 -1
- package/dist/helpers.d.ts +10 -5
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +3 -3
- package/dist/helpers.js.map +1 -1
- package/dist/schema/array.d.ts +9 -5
- package/dist/schema/array.d.ts.map +1 -1
- package/dist/schema/array.js +14 -5
- package/dist/schema/array.js.map +1 -1
- package/dist/schema/blob.d.ts +9 -7
- package/dist/schema/blob.d.ts.map +1 -1
- package/dist/schema/blob.js +9 -5
- package/dist/schema/blob.js.map +1 -1
- package/dist/schema/boolean.d.ts +3 -7
- package/dist/schema/boolean.d.ts.map +1 -1
- package/dist/schema/boolean.js +6 -7
- package/dist/schema/boolean.js.map +1 -1
- package/dist/schema/bytes.d.ts +3 -2
- package/dist/schema/bytes.d.ts.map +1 -1
- package/dist/schema/bytes.js +7 -3
- package/dist/schema/bytes.js.map +1 -1
- package/dist/schema/cid.d.ts +10 -8
- package/dist/schema/cid.d.ts.map +1 -1
- package/dist/schema/cid.js +5 -1
- package/dist/schema/cid.js.map +1 -1
- package/dist/schema/custom.d.ts +6 -5
- package/dist/schema/custom.d.ts.map +1 -1
- package/dist/schema/custom.js +10 -4
- package/dist/schema/custom.js.map +1 -1
- package/dist/schema/dict.d.ts +8 -8
- package/dist/schema/dict.d.ts.map +1 -1
- package/dist/schema/dict.js +11 -2
- package/dist/schema/dict.js.map +1 -1
- package/dist/schema/discriminated-union.d.ts +21 -14
- package/dist/schema/discriminated-union.d.ts.map +1 -1
- package/dist/schema/discriminated-union.js +7 -0
- package/dist/schema/discriminated-union.js.map +1 -1
- package/dist/schema/enum.d.ts +7 -9
- package/dist/schema/enum.d.ts.map +1 -1
- package/dist/schema/enum.js +8 -4
- package/dist/schema/enum.js.map +1 -1
- package/dist/schema/integer.d.ts +5 -5
- package/dist/schema/integer.d.ts.map +1 -1
- package/dist/schema/integer.js +9 -5
- package/dist/schema/integer.js.map +1 -1
- package/dist/schema/intersection.d.ts +4 -4
- package/dist/schema/intersection.d.ts.map +1 -1
- package/dist/schema/intersection.js +5 -0
- package/dist/schema/intersection.js.map +1 -1
- package/dist/schema/literal.d.ts +6 -9
- package/dist/schema/literal.d.ts.map +1 -1
- package/dist/schema/literal.js +7 -4
- package/dist/schema/literal.js.map +1 -1
- package/dist/schema/never.d.ts +3 -2
- package/dist/schema/never.d.ts.map +1 -1
- package/dist/schema/never.js +5 -1
- package/dist/schema/never.js.map +1 -1
- package/dist/schema/null.d.ts +4 -3
- package/dist/schema/null.d.ts.map +1 -1
- package/dist/schema/null.js +6 -4
- package/dist/schema/null.js.map +1 -1
- package/dist/schema/nullable.d.ts +6 -5
- package/dist/schema/nullable.d.ts.map +1 -1
- package/dist/schema/nullable.js +9 -5
- package/dist/schema/nullable.js.map +1 -1
- package/dist/schema/object.d.ts +10 -8
- package/dist/schema/object.d.ts.map +1 -1
- package/dist/schema/object.js +11 -3
- package/dist/schema/object.js.map +1 -1
- package/dist/schema/optional.d.ts +7 -5
- package/dist/schema/optional.d.ts.map +1 -1
- package/dist/schema/optional.js +14 -6
- package/dist/schema/optional.js.map +1 -1
- package/dist/schema/params.d.ts +24 -13
- package/dist/schema/params.d.ts.map +1 -1
- package/dist/schema/params.js +47 -25
- package/dist/schema/params.js.map +1 -1
- package/dist/schema/payload.d.ts +12 -9
- package/dist/schema/payload.d.ts.map +1 -1
- package/dist/schema/payload.js +11 -0
- package/dist/schema/payload.js.map +1 -1
- package/dist/schema/permission-set.d.ts +1 -0
- package/dist/schema/permission-set.d.ts.map +1 -1
- package/dist/schema/permission-set.js +5 -0
- package/dist/schema/permission-set.js.map +1 -1
- package/dist/schema/permission.d.ts +6 -5
- package/dist/schema/permission.d.ts.map +1 -1
- package/dist/schema/permission.js +5 -0
- package/dist/schema/permission.js.map +1 -1
- package/dist/schema/procedure.d.ts +2 -1
- package/dist/schema/procedure.d.ts.map +1 -1
- package/dist/schema/procedure.js +5 -0
- package/dist/schema/procedure.js.map +1 -1
- package/dist/schema/query.d.ts +2 -1
- package/dist/schema/query.d.ts.map +1 -1
- package/dist/schema/query.js +5 -0
- package/dist/schema/query.js.map +1 -1
- package/dist/schema/record.d.ts +48 -30
- package/dist/schema/record.d.ts.map +1 -1
- package/dist/schema/record.js +12 -9
- package/dist/schema/record.js.map +1 -1
- package/dist/schema/ref.d.ts +9 -6
- package/dist/schema/ref.d.ts.map +1 -1
- package/dist/schema/ref.js +9 -16
- package/dist/schema/ref.js.map +1 -1
- package/dist/schema/refine.d.ts +4 -4
- package/dist/schema/refine.d.ts.map +1 -1
- package/dist/schema/refine.js.map +1 -1
- package/dist/schema/regexp.d.ts +4 -3
- package/dist/schema/regexp.d.ts.map +1 -1
- package/dist/schema/regexp.js +5 -0
- package/dist/schema/regexp.js.map +1 -1
- package/dist/schema/string.d.ts +7 -8
- package/dist/schema/string.d.ts.map +1 -1
- package/dist/schema/string.js +13 -19
- package/dist/schema/string.js.map +1 -1
- package/dist/schema/subscription.d.ts +2 -1
- package/dist/schema/subscription.d.ts.map +1 -1
- package/dist/schema/subscription.js +5 -0
- package/dist/schema/subscription.js.map +1 -1
- package/dist/schema/token.d.ts +6 -5
- package/dist/schema/token.d.ts.map +1 -1
- package/dist/schema/token.js +5 -0
- package/dist/schema/token.js.map +1 -1
- package/dist/schema/typed-object.d.ts +43 -26
- package/dist/schema/typed-object.d.ts.map +1 -1
- package/dist/schema/typed-object.js +6 -3
- package/dist/schema/typed-object.js.map +1 -1
- package/dist/schema/typed-ref.d.ts +16 -25
- package/dist/schema/typed-ref.d.ts.map +1 -1
- package/dist/schema/typed-ref.js +7 -17
- package/dist/schema/typed-ref.js.map +1 -1
- package/dist/schema/typed-union.d.ts +9 -21
- package/dist/schema/typed-union.d.ts.map +1 -1
- package/dist/schema/typed-union.js +15 -11
- package/dist/schema/typed-union.js.map +1 -1
- package/dist/schema/union.d.ts +6 -6
- package/dist/schema/union.d.ts.map +1 -1
- package/dist/schema/union.js +7 -5
- package/dist/schema/union.js.map +1 -1
- package/dist/schema/unknown-object.d.ts +5 -4
- package/dist/schema/unknown-object.d.ts.map +1 -1
- package/dist/schema/unknown-object.js +5 -1
- package/dist/schema/unknown-object.js.map +1 -1
- package/dist/schema/unknown.d.ts +3 -2
- package/dist/schema/unknown.d.ts.map +1 -1
- package/dist/schema/unknown.js +5 -1
- package/dist/schema/unknown.js.map +1 -1
- package/dist/schema/with-default.d.ts +9 -0
- package/dist/schema/with-default.d.ts.map +1 -0
- package/dist/schema/with-default.js +27 -0
- package/dist/schema/with-default.js.map +1 -0
- package/dist/schema.d.ts +2 -2
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -4
- package/dist/schema.js.map +1 -1
- package/dist/util/assertion-util.d.ts +0 -6
- package/dist/util/assertion-util.d.ts.map +1 -1
- package/dist/util/assertion-util.js +0 -28
- package/dist/util/assertion-util.js.map +1 -1
- package/dist/util/memoize.d.ts +2 -2
- package/dist/util/memoize.d.ts.map +1 -1
- package/dist/util/memoize.js +23 -39
- package/dist/util/memoize.js.map +1 -1
- package/package.json +3 -3
- package/src/core/$type.test.ts +20 -0
- package/src/core/$type.ts +30 -0
- package/src/core/schema.ts +86 -38
- package/src/core/string-format.ts +119 -158
- package/src/core/validation-issue.ts +1 -1
- package/src/core/validator.ts +93 -53
- package/src/external.ts +0 -404
- package/src/helpers.test.ts +22 -21
- package/src/helpers.ts +14 -14
- package/src/schema/array.test.ts +38 -40
- package/src/schema/array.ts +35 -13
- package/src/schema/blob.test.ts +21 -21
- package/src/schema/blob.ts +19 -17
- package/src/schema/boolean.test.ts +9 -8
- package/src/schema/boolean.ts +7 -13
- package/src/schema/bytes.test.ts +13 -13
- package/src/schema/bytes.ts +13 -8
- package/src/schema/cid.test.ts +3 -3
- package/src/schema/cid.ts +15 -13
- package/src/schema/custom.test.ts +26 -26
- package/src/schema/custom.ts +20 -13
- package/src/schema/dict.test.ts +21 -39
- package/src/schema/dict.ts +28 -19
- package/src/schema/discriminated-union.test.ts +128 -128
- package/src/schema/discriminated-union.ts +45 -26
- package/src/schema/enum.test.ts +17 -16
- package/src/schema/enum.ts +16 -16
- package/src/schema/integer.test.ts +22 -21
- package/src/schema/integer.ts +12 -9
- package/src/schema/intersection.test.ts +10 -10
- package/src/schema/intersection.ts +17 -14
- package/src/schema/literal.test.ts +35 -34
- package/src/schema/literal.ts +12 -15
- package/src/schema/never.test.ts +5 -5
- package/src/schema/never.ts +7 -2
- package/src/schema/null.test.ts +3 -3
- package/src/schema/null.ts +9 -9
- package/src/schema/nullable.test.ts +31 -42
- package/src/schema/nullable.ts +17 -9
- package/src/schema/object.test.ts +10 -12
- package/src/schema/object.ts +27 -18
- package/src/schema/optional.test.ts +21 -28
- package/src/schema/optional.ts +27 -10
- package/src/schema/params.test.ts +471 -47
- package/src/schema/params.ts +72 -38
- package/src/schema/payload.test.ts +150 -156
- package/src/schema/payload.ts +35 -19
- package/src/schema/permission-set.test.ts +206 -273
- package/src/schema/permission-set.ts +8 -0
- package/src/schema/permission.test.ts +177 -177
- package/src/schema/permission.ts +13 -5
- package/src/schema/procedure.test.ts +183 -242
- package/src/schema/procedure.ts +18 -5
- package/src/schema/query.test.ts +186 -200
- package/src/schema/query.ts +16 -4
- package/src/schema/record.test.ts +121 -101
- package/src/schema/record.ts +74 -40
- package/src/schema/ref.test.ts +101 -118
- package/src/schema/ref.ts +33 -28
- package/src/schema/refine.test.ts +28 -28
- package/src/schema/refine.ts +23 -20
- package/src/schema/regexp.test.ts +29 -33
- package/src/schema/regexp.ts +11 -7
- package/src/schema/string.test.ts +35 -35
- package/src/schema/string.ts +24 -33
- package/src/schema/subscription.test.ts +259 -387
- package/src/schema/subscription.ts +16 -4
- package/src/schema/token.test.ts +47 -324
- package/src/schema/token.ts +14 -7
- package/src/schema/typed-object.test.ts +98 -81
- package/src/schema/typed-object.ts +68 -33
- package/src/schema/typed-ref.test.ts +206 -234
- package/src/schema/typed-ref.ts +40 -42
- package/src/schema/typed-union.test.ts +40 -64
- package/src/schema/typed-union.ts +36 -58
- package/src/schema/union.test.ts +17 -27
- package/src/schema/union.ts +20 -16
- package/src/schema/unknown-object.test.ts +8 -8
- package/src/schema/unknown-object.ts +9 -7
- package/src/schema/unknown.test.ts +4 -4
- package/src/schema/unknown.ts +7 -5
- package/src/schema/with-default.ts +35 -0
- package/src/schema.ts +2 -6
- package/src/util/assertion-util.ts +0 -39
- package/src/util/memoize.ts +26 -46
- package/dist/schema/_parameters.d.ts +0 -17
- package/dist/schema/_parameters.d.ts.map +0 -1
- package/dist/schema/_parameters.js +0 -20
- package/dist/schema/_parameters.js.map +0 -1
- package/src/schema/_parameters.test.ts +0 -417
- package/src/schema/_parameters.ts +0 -26
package/src/schema/params.ts
CHANGED
|
@@ -1,40 +1,58 @@
|
|
|
1
1
|
import { isPlainObject } from '@atproto/lex-data'
|
|
2
2
|
import {
|
|
3
3
|
Infer,
|
|
4
|
+
InferInput,
|
|
5
|
+
InferOutput,
|
|
4
6
|
Schema,
|
|
5
|
-
|
|
7
|
+
ValidationContext,
|
|
6
8
|
Validator,
|
|
7
|
-
ValidatorContext,
|
|
8
9
|
WithOptionalProperties,
|
|
9
10
|
} from '../core.js'
|
|
10
11
|
import { lazyProperty } from '../util/lazy-property.js'
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
import { memoizedOptions } from '../util/memoize.js'
|
|
13
|
+
import { array } from './array.js'
|
|
14
|
+
import { boolean } from './boolean.js'
|
|
15
|
+
import { dict } from './dict.js'
|
|
16
|
+
import { integer } from './integer.js'
|
|
17
|
+
import { optional } from './optional.js'
|
|
18
|
+
import { StringSchema, string } from './string.js'
|
|
19
|
+
import { union } from './union.js'
|
|
20
|
+
|
|
21
|
+
export type ParamScalar = Infer<typeof paramScalarSchema>
|
|
22
|
+
const paramScalarSchema = union([boolean(), integer(), string()])
|
|
23
|
+
|
|
24
|
+
export type Param = Infer<typeof paramSchema>
|
|
25
|
+
export const paramSchema = union([paramScalarSchema, array(paramScalarSchema)])
|
|
26
|
+
|
|
27
|
+
export type Params = Infer<typeof paramsSchema>
|
|
28
|
+
export const paramsSchema = dict(string(), optional(paramSchema))
|
|
29
|
+
|
|
30
|
+
export type ParamsSchemaShape = {
|
|
31
|
+
[x: string]: Validator<Param | undefined>
|
|
32
|
+
}
|
|
15
33
|
|
|
16
|
-
export
|
|
34
|
+
export class ParamsSchema<
|
|
35
|
+
const TShape extends ParamsSchemaShape = ParamsSchemaShape,
|
|
36
|
+
> extends Schema<
|
|
37
|
+
WithOptionalProperties<{
|
|
38
|
+
[K in keyof TShape]: InferInput<TShape[K]>
|
|
39
|
+
}>,
|
|
17
40
|
WithOptionalProperties<{
|
|
18
|
-
[K in keyof
|
|
41
|
+
[K in keyof TShape]: InferOutput<TShape[K]>
|
|
19
42
|
}>
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const Shape extends ParamsSchemaShape = ParamsSchemaShape,
|
|
23
|
-
> extends Schema<ParamsSchemaOutput<Shape>> {
|
|
24
|
-
constructor(readonly validators: Shape) {
|
|
43
|
+
> {
|
|
44
|
+
constructor(readonly shape: TShape) {
|
|
25
45
|
super()
|
|
26
46
|
}
|
|
27
47
|
|
|
28
|
-
get
|
|
29
|
-
const map = new Map(Object.entries(this.
|
|
48
|
+
get shapeValidators(): Map<string, Validator<Param | undefined>> {
|
|
49
|
+
const map = new Map(Object.entries(this.shape))
|
|
30
50
|
|
|
31
|
-
return lazyProperty(this, '
|
|
51
|
+
return lazyProperty(this, 'shapeValidators', map)
|
|
32
52
|
}
|
|
33
53
|
|
|
34
|
-
validateInContext(
|
|
35
|
-
|
|
36
|
-
ctx: ValidatorContext,
|
|
37
|
-
): ValidationResult<ParamsSchemaOutput<Shape>> {
|
|
54
|
+
validateInContext(input: unknown, ctx: ValidationContext) {
|
|
55
|
+
// @TODO BETTER SUPPORT Input/Output
|
|
38
56
|
if (!isPlainObject(input)) {
|
|
39
57
|
return ctx.issueInvalidType(input, 'object')
|
|
40
58
|
}
|
|
@@ -44,18 +62,23 @@ export class ParamsSchema<
|
|
|
44
62
|
|
|
45
63
|
// Ensure that non-specified params conform to param schema
|
|
46
64
|
for (const key in input) {
|
|
47
|
-
if (this.
|
|
65
|
+
if (this.shapeValidators.has(key)) continue
|
|
48
66
|
|
|
49
67
|
const result = ctx.validateChild(input, key, paramSchema)
|
|
50
68
|
if (!result.success) return result
|
|
51
69
|
|
|
52
70
|
if (result.value !== input[key]) {
|
|
71
|
+
if (ctx.options.mode === 'validate') {
|
|
72
|
+
// In "validate" mode, we can't modify the input, so we issue an error
|
|
73
|
+
return ctx.issueInvalidPropertyValue(input, key, [result.value])
|
|
74
|
+
}
|
|
75
|
+
|
|
53
76
|
copy ??= { ...input }
|
|
54
77
|
copy[key] = result.value
|
|
55
78
|
}
|
|
56
79
|
}
|
|
57
80
|
|
|
58
|
-
for (const [key, propDef] of this.
|
|
81
|
+
for (const [key, propDef] of this.shapeValidators) {
|
|
59
82
|
const result = ctx.validateChild(input, key, propDef)
|
|
60
83
|
if (!result.success) {
|
|
61
84
|
if (!(key in input)) {
|
|
@@ -71,26 +94,29 @@ export class ParamsSchema<
|
|
|
71
94
|
continue
|
|
72
95
|
}
|
|
73
96
|
|
|
74
|
-
if (result.value
|
|
97
|
+
if (!Object.is(result.value, input[key])) {
|
|
98
|
+
if (ctx.options.mode === 'validate') {
|
|
99
|
+
// In "validate" mode, we can't modify the input, so we issue an error
|
|
100
|
+
return ctx.issueInvalidPropertyValue(input, key, [result.value])
|
|
101
|
+
}
|
|
102
|
+
|
|
75
103
|
// Copy on write
|
|
76
104
|
copy ??= { ...input }
|
|
77
105
|
copy[key] = result.value
|
|
78
106
|
}
|
|
79
107
|
}
|
|
80
108
|
|
|
81
|
-
return ctx.success(
|
|
109
|
+
return ctx.success(copy ?? input)
|
|
82
110
|
}
|
|
83
111
|
|
|
84
|
-
fromURLSearchParams(
|
|
85
|
-
urlSearchParams: URLSearchParams,
|
|
86
|
-
): ParamsSchemaOutput<Shape> {
|
|
112
|
+
fromURLSearchParams(urlSearchParams: URLSearchParams): InferOutput<this> {
|
|
87
113
|
const params: Record<string, Param> = {}
|
|
88
114
|
|
|
89
115
|
for (const [key, value] of urlSearchParams.entries()) {
|
|
90
|
-
const validator = this.
|
|
116
|
+
const validator = this.shapeValidators.get(key)
|
|
91
117
|
|
|
92
118
|
const coerced: ParamScalar =
|
|
93
|
-
validator
|
|
119
|
+
validator instanceof StringSchema
|
|
94
120
|
? value
|
|
95
121
|
: value === 'true'
|
|
96
122
|
? true
|
|
@@ -112,21 +138,29 @@ export class ParamsSchema<
|
|
|
112
138
|
return this.parse(params)
|
|
113
139
|
}
|
|
114
140
|
|
|
115
|
-
toURLSearchParams(input:
|
|
141
|
+
toURLSearchParams(input: InferInput<this>): URLSearchParams {
|
|
116
142
|
const urlSearchParams = new URLSearchParams()
|
|
117
143
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
urlSearchParams.append(key, String(
|
|
144
|
+
// @NOTE We apply defaults here to ensure that server with different
|
|
145
|
+
// defaults still receive all expected parameters.
|
|
146
|
+
const params = this.parse(input)
|
|
147
|
+
|
|
148
|
+
for (const [key, value] of Object.entries(params)) {
|
|
149
|
+
if (Array.isArray(value)) {
|
|
150
|
+
for (const v of value) {
|
|
151
|
+
urlSearchParams.append(key, String(v))
|
|
126
152
|
}
|
|
153
|
+
} else if (value !== undefined) {
|
|
154
|
+
urlSearchParams.append(key, String(value))
|
|
127
155
|
}
|
|
128
156
|
}
|
|
129
157
|
|
|
130
158
|
return urlSearchParams
|
|
131
159
|
}
|
|
132
160
|
}
|
|
161
|
+
|
|
162
|
+
export const params = /*#__PURE__*/ memoizedOptions(function params<
|
|
163
|
+
const TShape extends ParamsSchemaShape = NonNullable<unknown>,
|
|
164
|
+
>(properties: TShape = {} as TShape) {
|
|
165
|
+
return new ParamsSchema<TShape>(properties)
|
|
166
|
+
})
|