@atproto/lex-schema 0.0.4 → 0.0.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 +58 -0
- package/dist/core/$type.d.ts +7 -0
- package/dist/core/$type.d.ts.map +1 -1
- package/dist/core/$type.js.map +1 -1
- package/dist/core/property-key.d.ts.map +1 -0
- package/dist/core/property-key.js.map +1 -0
- package/dist/core/result.d.ts +7 -6
- package/dist/core/result.d.ts.map +1 -1
- package/dist/core/result.js +9 -8
- package/dist/core/result.js.map +1 -1
- package/dist/{validation → core}/schema.d.ts +21 -2
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/{validation → core}/schema.js +25 -2
- package/dist/core/schema.js.map +1 -0
- package/dist/core/string-format.d.ts +37 -26
- package/dist/core/string-format.d.ts.map +1 -1
- package/dist/core/string-format.js +66 -59
- package/dist/core/string-format.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/validation-error.d.ts +19 -0
- package/dist/core/validation-error.d.ts.map +1 -0
- package/dist/{validation → core}/validation-error.js +13 -6
- package/dist/core/validation-error.js.map +1 -0
- package/dist/{validation → core}/validation-issue.d.ts +43 -0
- package/dist/core/validation-issue.d.ts.map +1 -0
- package/dist/{validation → core}/validation-issue.js +55 -2
- package/dist/core/validation-issue.js.map +1 -0
- package/dist/{validation → core}/validator.d.ts +5 -4
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/{validation → core}/validator.js +16 -13
- package/dist/core/validator.js.map +1 -0
- package/dist/core.d.ts +5 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +5 -0
- package/dist/core.js.map +1 -1
- package/dist/external.d.ts +21 -21
- package/dist/external.d.ts.map +1 -1
- package/dist/external.js +39 -55
- package/dist/external.js.map +1 -1
- package/dist/helpers.d.ts +41 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +13 -0
- package/dist/helpers.js.map +1 -0
- package/dist/schema/_parameters.d.ts +1 -1
- package/dist/schema/_parameters.d.ts.map +1 -1
- package/dist/schema/_parameters.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 +2 -2
- package/dist/schema/array.js.map +1 -1
- package/dist/schema/blob.d.ts +2 -1
- package/dist/schema/blob.d.ts.map +1 -1
- package/dist/schema/blob.js +34 -20
- package/dist/schema/blob.js.map +1 -1
- package/dist/schema/boolean.d.ts +1 -1
- package/dist/schema/boolean.d.ts.map +1 -1
- package/dist/schema/boolean.js +2 -2
- package/dist/schema/boolean.js.map +1 -1
- package/dist/schema/bytes.d.ts +1 -1
- package/dist/schema/bytes.d.ts.map +1 -1
- package/dist/schema/bytes.js +2 -2
- 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 +2 -2
- package/dist/schema/cid.js.map +1 -1
- package/dist/schema/custom.d.ts +1 -1
- package/dist/schema/custom.d.ts.map +1 -1
- package/dist/schema/custom.js +3 -3
- 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 +2 -2
- 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 -2
- package/dist/schema/discriminated-union.js.map +1 -1
- package/dist/schema/enum.d.ts +1 -1
- package/dist/schema/enum.d.ts.map +1 -1
- package/dist/schema/enum.js +2 -2
- package/dist/schema/enum.js.map +1 -1
- package/dist/schema/integer.d.ts +1 -1
- package/dist/schema/integer.d.ts.map +1 -1
- package/dist/schema/integer.js +4 -4
- package/dist/schema/integer.js.map +1 -1
- package/dist/schema/intersection.d.ts +1 -2
- package/dist/schema/intersection.d.ts.map +1 -1
- package/dist/schema/intersection.js +2 -2
- package/dist/schema/intersection.js.map +1 -1
- package/dist/schema/literal.d.ts +1 -1
- package/dist/schema/literal.d.ts.map +1 -1
- package/dist/schema/literal.js +2 -2
- package/dist/schema/literal.js.map +1 -1
- package/dist/schema/never.d.ts +1 -1
- package/dist/schema/never.d.ts.map +1 -1
- package/dist/schema/never.js +2 -2
- package/dist/schema/never.js.map +1 -1
- package/dist/schema/null.d.ts +1 -1
- package/dist/schema/null.d.ts.map +1 -1
- package/dist/schema/null.js +2 -2
- 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 +2 -2
- package/dist/schema/nullable.js.map +1 -1
- package/dist/schema/object.d.ts +1 -2
- package/dist/schema/object.d.ts.map +1 -1
- package/dist/schema/object.js +2 -2
- package/dist/schema/object.js.map +1 -1
- package/dist/schema/optional.d.ts +1 -1
- package/dist/schema/optional.d.ts.map +1 -1
- package/dist/schema/optional.js +2 -2
- package/dist/schema/optional.js.map +1 -1
- package/dist/schema/params.d.ts +1 -3
- package/dist/schema/params.d.ts.map +1 -1
- package/dist/schema/params.js +2 -2
- package/dist/schema/params.js.map +1 -1
- package/dist/schema/payload.d.ts +17 -15
- package/dist/schema/payload.d.ts.map +1 -1
- package/dist/schema/payload.js +28 -0
- package/dist/schema/payload.js.map +1 -1
- package/dist/schema/procedure.d.ts +3 -6
- package/dist/schema/procedure.d.ts.map +1 -1
- package/dist/schema/procedure.js +1 -0
- package/dist/schema/procedure.js.map +1 -1
- package/dist/schema/query.d.ts +3 -5
- package/dist/schema/query.d.ts.map +1 -1
- package/dist/schema/query.js +1 -0
- package/dist/schema/query.js.map +1 -1
- package/dist/schema/record.d.ts +14 -14
- package/dist/schema/record.d.ts.map +1 -1
- package/dist/schema/record.js +2 -2
- 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 +2 -2
- package/dist/schema/ref.js.map +1 -1
- package/dist/schema/refine.d.ts +18 -1
- package/dist/schema/refine.d.ts.map +1 -1
- package/dist/schema/refine.js +2 -2
- package/dist/schema/refine.js.map +1 -1
- package/dist/schema/regexp.d.ts +1 -1
- package/dist/schema/regexp.d.ts.map +1 -1
- package/dist/schema/regexp.js +2 -2
- package/dist/schema/regexp.js.map +1 -1
- package/dist/schema/string.d.ts +1 -2
- package/dist/schema/string.d.ts.map +1 -1
- package/dist/schema/string.js +1 -2
- package/dist/schema/string.js.map +1 -1
- package/dist/schema/subscription.d.ts +4 -8
- package/dist/schema/subscription.d.ts.map +1 -1
- 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 +2 -2
- package/dist/schema/token.js.map +1 -1
- package/dist/schema/typed-object.d.ts +8 -8
- package/dist/schema/typed-object.d.ts.map +1 -1
- package/dist/schema/typed-object.js +2 -2
- 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 +2 -2
- package/dist/schema/typed-ref.js.map +1 -1
- package/dist/schema/typed-union.d.ts +2 -3
- package/dist/schema/typed-union.d.ts.map +1 -1
- package/dist/schema/typed-union.js +2 -2
- 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 +3 -6
- package/dist/schema/union.js.map +1 -1
- package/dist/schema/unknown-object.d.ts +1 -2
- package/dist/schema/unknown-object.d.ts.map +1 -1
- package/dist/schema/unknown-object.js +2 -2
- package/dist/schema/unknown-object.js.map +1 -1
- package/dist/schema/unknown.d.ts +1 -1
- package/dist/schema/unknown.d.ts.map +1 -1
- package/dist/schema/unknown.js +2 -2
- package/dist/schema/unknown.js.map +1 -1
- package/dist/util/assertion-util.d.ts +8 -0
- package/dist/util/assertion-util.d.ts.map +1 -0
- package/dist/util/assertion-util.js +31 -0
- package/dist/util/assertion-util.js.map +1 -0
- package/dist/util/memoize.d.ts +3 -0
- package/dist/util/memoize.d.ts.map +1 -0
- package/dist/util/memoize.js +52 -0
- package/dist/util/memoize.js.map +1 -0
- package/package.json +6 -6
- package/src/core/$type.ts +4 -0
- package/src/core/result.ts +9 -8
- package/src/{validation → core}/schema.ts +29 -4
- package/src/core/string-format.ts +88 -68
- package/src/core/types.ts +4 -0
- package/src/{validation → core}/validation-error.ts +14 -6
- package/src/{validation → core}/validation-issue.ts +64 -2
- package/src/{validation → core}/validator.ts +17 -13
- package/src/core.ts +5 -0
- package/src/external.ts +75 -55
- package/src/helpers.test.ts +487 -0
- package/src/helpers.ts +75 -0
- package/src/schema/_parameters.test.ts +1 -0
- package/src/schema/_parameters.ts +1 -1
- package/src/schema/array.test.ts +1 -0
- package/src/schema/array.ts +1 -1
- package/src/schema/blob.test.ts +3 -4
- package/src/schema/blob.ts +32 -24
- package/src/schema/boolean.test.ts +1 -0
- package/src/schema/boolean.ts +1 -1
- package/src/schema/bytes.test.ts +1 -0
- package/src/schema/bytes.ts +1 -1
- package/src/schema/cid.test.ts +1 -0
- package/src/schema/cid.ts +1 -1
- package/src/schema/custom.test.ts +8 -7
- package/src/schema/custom.ts +2 -2
- package/src/schema/dict.test.ts +1 -0
- package/src/schema/dict.ts +1 -1
- package/src/schema/discriminated-union.test.ts +1 -0
- package/src/schema/discriminated-union.ts +1 -1
- package/src/schema/enum.test.ts +1 -0
- package/src/schema/enum.ts +1 -1
- package/src/schema/integer.test.ts +1 -0
- package/src/schema/integer.ts +3 -3
- package/src/schema/intersection.test.ts +1 -0
- package/src/schema/intersection.ts +2 -2
- package/src/schema/literal.test.ts +1 -0
- package/src/schema/literal.ts +1 -1
- package/src/schema/never.test.ts +1 -0
- package/src/schema/never.ts +1 -1
- package/src/schema/null.test.ts +1 -0
- package/src/schema/null.ts +1 -1
- package/src/schema/nullable.test.ts +1 -0
- package/src/schema/nullable.ts +1 -1
- package/src/schema/object.test.ts +1 -0
- package/src/schema/object.ts +3 -3
- package/src/schema/optional.test.ts +1 -0
- package/src/schema/optional.ts +1 -1
- package/src/schema/params.test.ts +1 -0
- package/src/schema/params.ts +3 -10
- package/src/schema/payload.test.ts +1 -0
- package/src/schema/payload.ts +67 -34
- package/src/schema/permission-set.test.ts +37 -36
- package/src/schema/permission.test.ts +1 -0
- package/src/schema/procedure.test.ts +2 -62
- package/src/schema/procedure.ts +8 -20
- package/src/schema/query.test.ts +23 -69
- package/src/schema/query.ts +7 -14
- package/src/schema/record.test.ts +1 -0
- package/src/schema/record.ts +13 -6
- package/src/schema/ref.test.ts +2 -1
- package/src/schema/ref.ts +1 -1
- package/src/schema/refine.test.ts +1 -0
- package/src/schema/refine.ts +19 -2
- package/src/schema/regexp.test.ts +1 -0
- package/src/schema/regexp.ts +1 -1
- package/src/schema/string.test.ts +1 -0
- package/src/schema/string.ts +8 -2
- package/src/schema/subscription.test.ts +31 -93
- package/src/schema/subscription.ts +11 -25
- package/src/schema/token.test.ts +1 -0
- package/src/schema/token.ts +1 -1
- package/src/schema/typed-object.test.ts +1 -0
- package/src/schema/typed-object.ts +10 -5
- package/src/schema/typed-ref.test.ts +1 -0
- package/src/schema/typed-ref.ts +1 -1
- package/src/schema/typed-union.test.ts +1 -0
- package/src/schema/typed-union.ts +4 -4
- package/src/schema/union.test.ts +1 -0
- package/src/schema/union.ts +2 -5
- package/src/schema/unknown-object.test.ts +1 -0
- package/src/schema/unknown-object.ts +1 -2
- package/src/schema/unknown.test.ts +1 -0
- package/src/schema/unknown.ts +1 -1
- package/src/util/array-agg.test.ts +1 -0
- package/src/util/assertion-util.ts +40 -0
- package/src/util/memoize.ts +57 -0
- package/tsconfig.tests.json +2 -2
- package/dist/validation/property-key.d.ts.map +0 -1
- package/dist/validation/property-key.js.map +0 -1
- package/dist/validation/schema.d.ts.map +0 -1
- package/dist/validation/schema.js.map +0 -1
- package/dist/validation/validation-error.d.ts +0 -9
- package/dist/validation/validation-error.d.ts.map +0 -1
- package/dist/validation/validation-error.js.map +0 -1
- package/dist/validation/validation-issue.d.ts.map +0 -1
- package/dist/validation/validation-issue.js.map +0 -1
- package/dist/validation/validator.d.ts.map +0 -1
- package/dist/validation/validator.js.map +0 -1
- package/dist/validation.d.ts +0 -6
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -9
- package/dist/validation.js.map +0 -1
- package/src/validation.ts +0 -5
- /package/dist/{validation → core}/property-key.d.ts +0 -0
- /package/dist/{validation → core}/property-key.js +0 -0
- /package/src/{validation → core}/property-key.ts +0 -0
package/src/schema/boolean.ts
CHANGED
package/src/schema/bytes.test.ts
CHANGED
package/src/schema/bytes.ts
CHANGED
package/src/schema/cid.test.ts
CHANGED
package/src/schema/cid.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import { IssueCustom } from '../core.js'
|
|
2
3
|
import { CustomSchema } from './custom.js'
|
|
3
4
|
|
|
4
5
|
describe('CustomSchema', () => {
|
|
@@ -32,7 +33,7 @@ describe('CustomSchema', () => {
|
|
|
32
33
|
const result = schema.safeParse(123)
|
|
33
34
|
expect(result.success).toBe(false)
|
|
34
35
|
if (!result.success) {
|
|
35
|
-
expect(result.
|
|
36
|
+
expect(result.reason.message).toContain('Custom error message')
|
|
36
37
|
}
|
|
37
38
|
})
|
|
38
39
|
})
|
|
@@ -143,7 +144,7 @@ describe('CustomSchema', () => {
|
|
|
143
144
|
const result = schema.safeParse(123)
|
|
144
145
|
expect(result.success).toBe(false)
|
|
145
146
|
if (!result.success) {
|
|
146
|
-
expect(result.
|
|
147
|
+
expect(result.reason.message).toContain('customField')
|
|
147
148
|
}
|
|
148
149
|
})
|
|
149
150
|
|
|
@@ -157,8 +158,8 @@ describe('CustomSchema', () => {
|
|
|
157
158
|
const result = schema.safeParse(123)
|
|
158
159
|
expect(result.success).toBe(false)
|
|
159
160
|
if (!result.success) {
|
|
160
|
-
expect(result.
|
|
161
|
-
expect(result.
|
|
161
|
+
expect(result.reason.message).toContain('nested')
|
|
162
|
+
expect(result.reason.message).toContain('field')
|
|
162
163
|
}
|
|
163
164
|
})
|
|
164
165
|
})
|
|
@@ -371,7 +372,7 @@ describe('CustomSchema', () => {
|
|
|
371
372
|
|
|
372
373
|
describe('assertion context behavior', () => {
|
|
373
374
|
it('calls assertion with null as this', () => {
|
|
374
|
-
const assertion =
|
|
375
|
+
const assertion = vi.fn(function (
|
|
375
376
|
this: unknown,
|
|
376
377
|
input: unknown,
|
|
377
378
|
): input is string {
|
|
@@ -392,7 +393,7 @@ describe('CustomSchema', () => {
|
|
|
392
393
|
|
|
393
394
|
expect(schema.safeParse('test')).toMatchObject({
|
|
394
395
|
success: false,
|
|
395
|
-
|
|
396
|
+
reason: {
|
|
396
397
|
issues: [
|
|
397
398
|
{ message: 'This is a custom issue' },
|
|
398
399
|
{ message: 'Must be a string' },
|
package/src/schema/custom.ts
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
Schema,
|
|
6
6
|
ValidationResult,
|
|
7
7
|
ValidatorContext,
|
|
8
|
-
} from '../
|
|
8
|
+
} from '../core.js'
|
|
9
9
|
|
|
10
10
|
export type CustomAssertionContext = {
|
|
11
11
|
path: PropertyKey[]
|
|
@@ -33,6 +33,6 @@ export class CustomSchema<T = unknown> extends Schema<T> {
|
|
|
33
33
|
): ValidationResult<T> {
|
|
34
34
|
if (this.assertion.call(null, input, ctx)) return ctx.success(input as T)
|
|
35
35
|
const path = ctx.concatPath(this.path)
|
|
36
|
-
return ctx.
|
|
36
|
+
return ctx.issue(new IssueCustom(path, input, this.message))
|
|
37
37
|
}
|
|
38
38
|
}
|
package/src/schema/dict.test.ts
CHANGED
package/src/schema/dict.ts
CHANGED
package/src/schema/enum.test.ts
CHANGED
package/src/schema/enum.ts
CHANGED
package/src/schema/integer.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Schema, ValidationResult, ValidatorContext } from '../
|
|
1
|
+
import { Schema, ValidationResult, ValidatorContext } from '../core.js'
|
|
2
2
|
|
|
3
3
|
export type IntegerSchemaOptions = {
|
|
4
4
|
default?: number
|
|
@@ -32,8 +32,8 @@ export class IntegerSchema extends Schema<number> {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
|
-
* Simple wrapper around {@link Number.
|
|
35
|
+
* Simple wrapper around {@link Number.isSafeInteger} that acts as a type guard.
|
|
36
36
|
*/
|
|
37
37
|
function isInteger(input: unknown): input is number {
|
|
38
|
-
return Number.
|
|
38
|
+
return Number.isSafeInteger(input)
|
|
39
39
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Simplify } from '../core.js'
|
|
2
1
|
import {
|
|
3
2
|
Infer,
|
|
4
3
|
Schema,
|
|
4
|
+
Simplify,
|
|
5
5
|
ValidationResult,
|
|
6
6
|
ValidatorContext,
|
|
7
|
-
} from '../
|
|
7
|
+
} from '../core.js'
|
|
8
8
|
import { DictSchema } from './dict.js'
|
|
9
9
|
import { ObjectSchema } from './object.js'
|
|
10
10
|
|
package/src/schema/literal.ts
CHANGED
package/src/schema/never.test.ts
CHANGED
package/src/schema/never.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Schema, ValidationFailure, ValidatorContext } from '../
|
|
1
|
+
import { Schema, ValidationFailure, ValidatorContext } from '../core.js'
|
|
2
2
|
|
|
3
3
|
export class NeverSchema extends Schema<never> {
|
|
4
4
|
validateInContext(input: unknown, ctx: ValidatorContext): ValidationFailure {
|
package/src/schema/null.test.ts
CHANGED
package/src/schema/null.ts
CHANGED
package/src/schema/nullable.ts
CHANGED
package/src/schema/object.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { isPlainObject } from '@atproto/lex-data'
|
|
2
|
-
import { WithOptionalProperties } from '../core.js'
|
|
3
|
-
import { lazyProperty } from '../util/lazy-property.js'
|
|
4
2
|
import {
|
|
5
3
|
Infer,
|
|
6
4
|
Schema,
|
|
7
5
|
ValidationResult,
|
|
8
6
|
Validator,
|
|
9
7
|
ValidatorContext,
|
|
10
|
-
|
|
8
|
+
WithOptionalProperties,
|
|
9
|
+
} from '../core.js'
|
|
10
|
+
import { lazyProperty } from '../util/lazy-property.js'
|
|
11
11
|
|
|
12
12
|
export type ObjectSchemaShape = Record<string, Validator>
|
|
13
13
|
|
package/src/schema/optional.ts
CHANGED
package/src/schema/params.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { isPlainObject } from '@atproto/lex-data'
|
|
2
|
-
import { WithOptionalProperties } from '../core.js'
|
|
3
|
-
import { lazyProperty } from '../util/lazy-property.js'
|
|
4
2
|
import {
|
|
5
3
|
Infer,
|
|
6
4
|
Schema,
|
|
7
5
|
ValidationResult,
|
|
8
6
|
Validator,
|
|
9
7
|
ValidatorContext,
|
|
10
|
-
|
|
8
|
+
WithOptionalProperties,
|
|
9
|
+
} from '../core.js'
|
|
10
|
+
import { lazyProperty } from '../util/lazy-property.js'
|
|
11
11
|
import { Param, ParamScalar, paramSchema } from './_parameters.js'
|
|
12
12
|
import { StringSchema } from './string.js'
|
|
13
13
|
|
|
@@ -18,13 +18,6 @@ export type ParamsSchemaOutput<Shape extends ParamsSchemaShape> =
|
|
|
18
18
|
[K in keyof Shape]: Infer<Shape[K]>
|
|
19
19
|
}>
|
|
20
20
|
|
|
21
|
-
export type InferParamsSchema<T> =
|
|
22
|
-
T extends ParamsSchema<infer P>
|
|
23
|
-
? NonNullable<unknown> extends ParamsSchemaOutput<P>
|
|
24
|
-
? ParamsSchemaOutput<P> | undefined // Allow undefined if all params are optional
|
|
25
|
-
: ParamsSchemaOutput<P>
|
|
26
|
-
: never
|
|
27
|
-
|
|
28
21
|
export class ParamsSchema<
|
|
29
22
|
const Shape extends ParamsSchemaShape = ParamsSchemaShape,
|
|
30
23
|
> extends Schema<ParamsSchemaOutput<Shape>> {
|
package/src/schema/payload.ts
CHANGED
|
@@ -1,53 +1,86 @@
|
|
|
1
1
|
import { LexValue } from '@atproto/lex-data'
|
|
2
|
-
import { Infer,
|
|
2
|
+
import { Infer, Schema } from '../core.js'
|
|
3
3
|
|
|
4
|
-
export type
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
export type InferPayload<
|
|
5
|
+
P extends Payload,
|
|
6
|
+
B,
|
|
7
|
+
> = P['encoding'] extends infer E extends string
|
|
8
|
+
? {
|
|
9
|
+
encoding: SchemaEncodingToDataEncoding<E>
|
|
10
|
+
body: InferPayloadBody<P, B>
|
|
11
|
+
}
|
|
12
|
+
: void | undefined
|
|
13
|
+
|
|
14
|
+
export type SchemaEncodingToDataEncoding<E extends string> = E extends '*/*'
|
|
15
|
+
? `${string}/${string}`
|
|
16
|
+
: E extends `${infer T extends string}/*`
|
|
17
|
+
? `${T}/${string}`
|
|
18
|
+
: E
|
|
9
19
|
|
|
10
20
|
export type InferPayloadEncoding<P extends Payload> =
|
|
11
|
-
P extends
|
|
12
|
-
|
|
13
|
-
export type InferPayloadBody<P extends Payload> =
|
|
14
|
-
P extends Payload<any, infer S>
|
|
15
|
-
? S extends Validator
|
|
16
|
-
? Infer<S>
|
|
17
|
-
: P extends Payload<infer E extends string>
|
|
18
|
-
? LexBody<E>
|
|
19
|
-
: undefined
|
|
21
|
+
P['encoding'] extends string
|
|
22
|
+
? SchemaEncodingToDataEncoding<P['encoding']>
|
|
20
23
|
: undefined
|
|
21
24
|
|
|
22
|
-
export type
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
> =
|
|
26
|
-
?
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
: void
|
|
36
|
-
|
|
37
|
-
export type PayloadBody<E extends string | undefined> = E extends undefined
|
|
25
|
+
export type InferPayloadBody<
|
|
26
|
+
P extends Payload,
|
|
27
|
+
B,
|
|
28
|
+
> = P['encoding'] extends undefined
|
|
29
|
+
? undefined // No encoding, no payload
|
|
30
|
+
: P['schema'] extends Schema
|
|
31
|
+
? Infer<P['schema']>
|
|
32
|
+
: P['encoding'] extends `application/json`
|
|
33
|
+
? LexValue
|
|
34
|
+
: B
|
|
35
|
+
|
|
36
|
+
export type PayloadSchema<E extends string | undefined> = E extends undefined
|
|
38
37
|
? undefined
|
|
39
|
-
:
|
|
38
|
+
: Schema | undefined
|
|
40
39
|
|
|
41
40
|
export class Payload<
|
|
42
41
|
const Encoding extends string | undefined = string | undefined,
|
|
43
|
-
const
|
|
42
|
+
const Schema extends PayloadSchema<Encoding> = PayloadSchema<Encoding>,
|
|
44
43
|
> {
|
|
45
44
|
constructor(
|
|
46
45
|
readonly encoding: Encoding,
|
|
47
|
-
readonly schema:
|
|
46
|
+
readonly schema: Schema,
|
|
48
47
|
) {
|
|
49
48
|
if (encoding === undefined && schema !== undefined) {
|
|
50
49
|
throw new TypeError('schema cannot be defined when encoding is undefined')
|
|
51
50
|
}
|
|
52
51
|
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Checks whether the given content-type matches the expected payload schema's
|
|
55
|
+
* encoding.
|
|
56
|
+
*/
|
|
57
|
+
matchesEncoding(contentType: string | undefined): boolean {
|
|
58
|
+
const mime = contentType?.split(';', 1)[0].trim()
|
|
59
|
+
|
|
60
|
+
const { encoding } = this
|
|
61
|
+
|
|
62
|
+
// Handle undefined cases
|
|
63
|
+
if (encoding === undefined) {
|
|
64
|
+
// Expecting no body
|
|
65
|
+
return mime === undefined
|
|
66
|
+
} else if (mime === undefined) {
|
|
67
|
+
// Expecting a body, but got no content-type
|
|
68
|
+
return false
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (encoding === '*/*') {
|
|
72
|
+
return true
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (encoding.endsWith('/*')) {
|
|
76
|
+
return mime.startsWith(encoding.slice(0, -1))
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Invalid: Lexicon can only specify "*/*" or "type/*" wildcards
|
|
80
|
+
if (encoding.includes('*')) {
|
|
81
|
+
return false
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return encoding === mime
|
|
85
|
+
}
|
|
53
86
|
}
|