@atproto/lex-schema 0.0.0
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/dist/core/$type.d.ts +4 -0
- package/dist/core/$type.d.ts.map +1 -0
- package/dist/core/$type.js +7 -0
- package/dist/core/$type.js.map +1 -0
- package/dist/core/record-key.d.ts +4 -0
- package/dist/core/record-key.d.ts.map +1 -0
- package/dist/core/record-key.js +16 -0
- package/dist/core/record-key.js.map +1 -0
- package/dist/core/result.d.ts +57 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +74 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/string-format.d.ts +31 -0
- package/dist/core/string-format.d.ts.map +1 -0
- package/dist/core/string-format.js +81 -0
- package/dist/core/string-format.js.map +1 -0
- package/dist/core/types.d.ts +19 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core.d.ts +6 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +9 -0
- package/dist/core.js.map +1 -0
- package/dist/external.d.ts +86 -0
- package/dist/external.d.ts.map +1 -0
- package/dist/external.js +171 -0
- package/dist/external.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/schema/_parameters.d.ts +17 -0
- package/dist/schema/_parameters.d.ts.map +1 -0
- package/dist/schema/_parameters.js +20 -0
- package/dist/schema/_parameters.js.map +1 -0
- package/dist/schema/array.d.ts +13 -0
- package/dist/schema/array.d.ts.map +1 -0
- package/dist/schema/array.js +40 -0
- package/dist/schema/array.js.map +1 -0
- package/dist/schema/blob.d.ts +32 -0
- package/dist/schema/blob.d.ts.map +1 -0
- package/dist/schema/blob.js +40 -0
- package/dist/schema/blob.js.map +1 -0
- package/dist/schema/boolean.d.ts +11 -0
- package/dist/schema/boolean.d.ts.map +1 -0
- package/dist/schema/boolean.js +20 -0
- package/dist/schema/boolean.js.map +1 -0
- package/dist/schema/bytes.d.ts +12 -0
- package/dist/schema/bytes.d.ts.map +1 -0
- package/dist/schema/bytes.js +31 -0
- package/dist/schema/bytes.js.map +1 -0
- package/dist/schema/cid.d.ts +13 -0
- package/dist/schema/cid.d.ts.map +1 -0
- package/dist/schema/cid.js +22 -0
- package/dist/schema/cid.js.map +1 -0
- package/dist/schema/custom.d.ts +15 -0
- package/dist/schema/custom.d.ts.map +1 -0
- package/dist/schema/custom.js +22 -0
- package/dist/schema/custom.js.map +1 -0
- package/dist/schema/dict.d.ts +18 -0
- package/dist/schema/dict.d.ts.map +1 -0
- package/dist/schema/dict.js +48 -0
- package/dist/schema/dict.js.map +1 -0
- package/dist/schema/discriminated-union.d.ts +34 -0
- package/dist/schema/discriminated-union.d.ts.map +1 -0
- package/dist/schema/discriminated-union.js +93 -0
- package/dist/schema/discriminated-union.js.map +1 -0
- package/dist/schema/enum.d.ts +7 -0
- package/dist/schema/enum.d.ts.map +1 -0
- package/dist/schema/enum.js +19 -0
- package/dist/schema/enum.js.map +1 -0
- package/dist/schema/integer.d.ts +13 -0
- package/dist/schema/integer.d.ts.map +1 -0
- package/dist/schema/integer.js +32 -0
- package/dist/schema/integer.js.map +1 -0
- package/dist/schema/intersection.d.ts +16 -0
- package/dist/schema/intersection.d.ts.map +1 -0
- package/dist/schema/intersection.js +33 -0
- package/dist/schema/intersection.js.map +1 -0
- package/dist/schema/literal.d.ts +7 -0
- package/dist/schema/literal.d.ts.map +1 -0
- package/dist/schema/literal.js +19 -0
- package/dist/schema/literal.js.map +1 -0
- package/dist/schema/never.d.ts +5 -0
- package/dist/schema/never.d.ts.map +1 -0
- package/dist/schema/never.js +11 -0
- package/dist/schema/never.js.map +1 -0
- package/dist/schema/null.d.ts +7 -0
- package/dist/schema/null.d.ts.map +1 -0
- package/dist/schema/null.js +18 -0
- package/dist/schema/null.js.map +1 -0
- package/dist/schema/object.d.ts +47 -0
- package/dist/schema/object.d.ts.map +1 -0
- package/dist/schema/object.js +89 -0
- package/dist/schema/object.js.map +1 -0
- package/dist/schema/params.d.ts +22 -0
- package/dist/schema/params.d.ts.map +1 -0
- package/dist/schema/params.js +115 -0
- package/dist/schema/params.js.map +1 -0
- package/dist/schema/payload.d.ts +19 -0
- package/dist/schema/payload.d.ts.map +1 -0
- package/dist/schema/payload.js +16 -0
- package/dist/schema/payload.js.map +1 -0
- package/dist/schema/permission-set.d.ts +15 -0
- package/dist/schema/permission-set.d.ts.map +1 -0
- package/dist/schema/permission-set.js +16 -0
- package/dist/schema/permission-set.js.map +1 -0
- package/dist/schema/permission.d.ts +9 -0
- package/dist/schema/permission.d.ts.map +1 -0
- package/dist/schema/permission.js +14 -0
- package/dist/schema/permission.js.map +1 -0
- package/dist/schema/procedure.d.ts +17 -0
- package/dist/schema/procedure.d.ts.map +1 -0
- package/dist/schema/procedure.js +20 -0
- package/dist/schema/procedure.js.map +1 -0
- package/dist/schema/query.d.ts +15 -0
- package/dist/schema/query.d.ts.map +1 -0
- package/dist/schema/query.js +18 -0
- package/dist/schema/query.js.map +1 -0
- package/dist/schema/record.d.ts +37 -0
- package/dist/schema/record.d.ts.map +1 -0
- package/dist/schema/record.js +64 -0
- package/dist/schema/record.js.map +1 -0
- package/dist/schema/ref.d.ts +10 -0
- package/dist/schema/ref.d.ts.map +1 -0
- package/dist/schema/ref.js +36 -0
- package/dist/schema/ref.js.map +1 -0
- package/dist/schema/string.d.ts +24 -0
- package/dist/schema/string.d.ts.map +1 -0
- package/dist/schema/string.js +107 -0
- package/dist/schema/string.js.map +1 -0
- package/dist/schema/subscription.d.ts +16 -0
- package/dist/schema/subscription.d.ts.map +1 -0
- package/dist/schema/subscription.js +18 -0
- package/dist/schema/subscription.js.map +1 -0
- package/dist/schema/token.d.ts +10 -0
- package/dist/schema/token.d.ts.map +1 -0
- package/dist/schema/token.js +36 -0
- package/dist/schema/token.js.map +1 -0
- package/dist/schema/typed-object.d.ts +32 -0
- package/dist/schema/typed-object.d.ts.map +1 -0
- package/dist/schema/typed-object.js +40 -0
- package/dist/schema/typed-object.js.map +1 -0
- package/dist/schema/typed-ref.d.ts +30 -0
- package/dist/schema/typed-ref.d.ts.map +1 -0
- package/dist/schema/typed-ref.js +44 -0
- package/dist/schema/typed-ref.js.map +1 -0
- package/dist/schema/typed-union.d.ts +26 -0
- package/dist/schema/typed-union.d.ts.map +1 -0
- package/dist/schema/typed-union.js +54 -0
- package/dist/schema/typed-union.js.map +1 -0
- package/dist/schema/union.d.ts +9 -0
- package/dist/schema/union.d.ts.map +1 -0
- package/dist/schema/union.js +29 -0
- package/dist/schema/union.js.map +1 -0
- package/dist/schema/unknown-object.d.ts +9 -0
- package/dist/schema/unknown-object.d.ts.map +1 -0
- package/dist/schema/unknown-object.js +16 -0
- package/dist/schema/unknown-object.js.map +1 -0
- package/dist/schema/unknown.d.ts +5 -0
- package/dist/schema/unknown.d.ts.map +1 -0
- package/dist/schema/unknown.js +11 -0
- package/dist/schema/unknown.js.map +1 -0
- package/dist/schema.d.ts +34 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +41 -0
- package/dist/schema.js.map +1 -0
- package/dist/util/array-agg.d.ts +20 -0
- package/dist/util/array-agg.d.ts.map +1 -0
- package/dist/util/array-agg.js +42 -0
- package/dist/util/array-agg.js.map +1 -0
- package/dist/validation/property-key.d.ts +2 -0
- package/dist/validation/property-key.d.ts.map +1 -0
- package/dist/validation/property-key.js +3 -0
- package/dist/validation/property-key.js.map +1 -0
- package/dist/validation/validation-error.d.ts +9 -0
- package/dist/validation/validation-error.d.ts.map +1 -0
- package/dist/validation/validation-error.js +27 -0
- package/dist/validation/validation-error.js.map +1 -0
- package/dist/validation/validation-issue.d.ts +45 -0
- package/dist/validation/validation-issue.d.ts.map +1 -0
- package/dist/validation/validation-issue.js +167 -0
- package/dist/validation/validation-issue.js.map +1 -0
- package/dist/validation/validator.d.ts +113 -0
- package/dist/validation/validator.d.ts.map +1 -0
- package/dist/validation/validator.js +209 -0
- package/dist/validation/validator.js.map +1 -0
- package/dist/validation.d.ts +5 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +8 -0
- package/dist/validation.js.map +1 -0
- package/package.json +45 -0
- package/src/core/$type.ts +19 -0
- package/src/core/record-key.ts +15 -0
- package/src/core/result.ts +73 -0
- package/src/core/string-format.ts +124 -0
- package/src/core/types.ts +22 -0
- package/src/core.ts +5 -0
- package/src/external.ts +365 -0
- package/src/index.ts +3 -0
- package/src/schema/_parameters.ts +26 -0
- package/src/schema/array.ts +51 -0
- package/src/schema/blob.ts +82 -0
- package/src/schema/boolean.ts +24 -0
- package/src/schema/bytes.ts +38 -0
- package/src/schema/cid.ts +27 -0
- package/src/schema/custom.ts +36 -0
- package/src/schema/dict.ts +69 -0
- package/src/schema/discriminated-union.ts +144 -0
- package/src/schema/enum.ts +20 -0
- package/src/schema/integer.ts +41 -0
- package/src/schema/intersection.ts +57 -0
- package/src/schema/literal.ts +20 -0
- package/src/schema/never.ts +14 -0
- package/src/schema/null.ts +20 -0
- package/src/schema/object.test.ts +138 -0
- package/src/schema/object.ts +180 -0
- package/src/schema/params.ts +157 -0
- package/src/schema/payload.ts +53 -0
- package/src/schema/permission-set.ts +22 -0
- package/src/schema/permission.ts +15 -0
- package/src/schema/procedure.ts +35 -0
- package/src/schema/query.ts +28 -0
- package/src/schema/record.ts +106 -0
- package/src/schema/ref.ts +47 -0
- package/src/schema/string.ts +139 -0
- package/src/schema/subscription.ts +35 -0
- package/src/schema/token.ts +41 -0
- package/src/schema/typed-object.ts +64 -0
- package/src/schema/typed-ref.ts +68 -0
- package/src/schema/typed-union.ts +106 -0
- package/src/schema/union.ts +40 -0
- package/src/schema/unknown-object.ts +20 -0
- package/src/schema/unknown.ts +10 -0
- package/src/schema.ts +40 -0
- package/src/util/array-agg.test.ts +41 -0
- package/src/util/array-agg.ts +43 -0
- package/src/validation/property-key.ts +1 -0
- package/src/validation/validation-error.ts +32 -0
- package/src/validation/validation-issue.ts +231 -0
- package/src/validation/validator.ts +361 -0
- package/src/validation.ts +4 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObjectSchema = void 0;
|
|
4
|
+
const lex_data_1 = require("@atproto/lex-data");
|
|
5
|
+
const validation_js_1 = require("../validation.js");
|
|
6
|
+
class ObjectSchema extends validation_js_1.Validator {
|
|
7
|
+
validators;
|
|
8
|
+
options;
|
|
9
|
+
constructor(validators, options) {
|
|
10
|
+
super();
|
|
11
|
+
this.validators = validators;
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
14
|
+
get validatorsMap() {
|
|
15
|
+
const map = new Map(Object.entries(this.validators));
|
|
16
|
+
// Cache the map on the instance (to avoid re-creating it)
|
|
17
|
+
Object.defineProperty(this, 'validatorsMap', {
|
|
18
|
+
value: map,
|
|
19
|
+
writable: false,
|
|
20
|
+
enumerable: false,
|
|
21
|
+
configurable: true,
|
|
22
|
+
});
|
|
23
|
+
return map;
|
|
24
|
+
}
|
|
25
|
+
validateInContext(input, ctx) {
|
|
26
|
+
if (!(0, lex_data_1.isPlainObject)(input)) {
|
|
27
|
+
return ctx.issueInvalidType(input, ['object']);
|
|
28
|
+
}
|
|
29
|
+
// Lazily copy value
|
|
30
|
+
let copy;
|
|
31
|
+
for (const [key, propDef] of this.validatorsMap) {
|
|
32
|
+
if (input[key] === null && this.options.nullable?.includes(key)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const result = ctx.validateChild(input, key, propDef);
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
// Because default values are provided by child validators, we need to
|
|
38
|
+
// run the validator to get the default value and, in case of failure,
|
|
39
|
+
// ignore validation error that were caused by missing keys.
|
|
40
|
+
if (!(key in input)) {
|
|
41
|
+
if (this.options.required?.includes(key)) {
|
|
42
|
+
// Transform into "required key" issue
|
|
43
|
+
return ctx.issueRequiredKey(input, key);
|
|
44
|
+
}
|
|
45
|
+
// Ignore missing non-required key
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
else if (result.value === undefined) {
|
|
51
|
+
// Special case for validators that output "undefined" values (typically
|
|
52
|
+
// UnknownSchema) since they cannot differentiate between "missing key"
|
|
53
|
+
// and "key with undefined value"
|
|
54
|
+
if (!(key in input)) {
|
|
55
|
+
// Input was missing the key (was "undefined")
|
|
56
|
+
if (this.options.required?.includes(key)) {
|
|
57
|
+
return ctx.issueRequiredKey(input, key);
|
|
58
|
+
}
|
|
59
|
+
// Ignore missing non-required key
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// if "key" existed in input (would typically be "undefined"), we keep
|
|
63
|
+
// it as-is by continuing processing as if it was any other value.
|
|
64
|
+
}
|
|
65
|
+
if (result.value !== input[key]) {
|
|
66
|
+
copy ??= { ...input };
|
|
67
|
+
copy[key] = result.value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (this.options.unknownProperties === 'strict') {
|
|
71
|
+
for (const key of Object.keys(input)) {
|
|
72
|
+
if (!this.validatorsMap.has(key)) {
|
|
73
|
+
return ctx.issueInvalidPropertyType(input, key, 'undefined');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (this.options.unknownProperties) {
|
|
78
|
+
const result = this.options.unknownProperties.validateInContext(copy ?? input, ctx, { ignoredKeys: this.validatorsMap });
|
|
79
|
+
if (!result.success)
|
|
80
|
+
return result;
|
|
81
|
+
if (result.value !== input)
|
|
82
|
+
copy = result.value;
|
|
83
|
+
}
|
|
84
|
+
const output = (copy ?? input);
|
|
85
|
+
return ctx.success(output);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.ObjectSchema = ObjectSchema;
|
|
89
|
+
//# sourceMappingURL=object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { Simplify } from '../core.js'\nimport {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { DictSchema } from './dict.js'\n\nexport type ObjectSchemaProperties = { [_ in string]: Validator<any> }\nexport type ObjectSchemaOptions = {\n required?: readonly string[]\n nullable?: readonly string[]\n unknownProperties?: 'strict' | DictSchema\n}\n\nexport type ObjectSchemaNullValue<\n O extends ObjectSchemaOptions,\n K extends string,\n> = O extends { nullable: readonly (infer N extends string)[] }\n ? K extends N\n ? null\n : never\n : never\n\nexport type ObjectSchemaPropertiesOutput<\n P extends ObjectSchemaProperties,\n O extends ObjectSchemaOptions,\n> = O extends { required: readonly (infer R extends string)[] }\n ? {\n -readonly [K in string & keyof P & R]-?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n } & {\n -readonly [K in Exclude<string & keyof P, R>]?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n }\n : {\n -readonly [K in string & keyof P]?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n }\n\n/**\n * Allows to more accurately represent the intersection of two object types\n * where both types may share some keys, and one of them uses an index\n * signature.\n *\n * @see {@link https://www.typescriptlang.org/play/?#code/C4TwDgpgBAglC8UDeUBmB7dAuKByARgIYBOuUAvlAGTJQDaA+lAJYB2UAzsMWwOYC6OVgFcAtvgjEKAKGkATCAGMANiWiL0rLlEI4YsjVuBQA1hBA4uPVrwRQARBnT2Dm7QDdCy4dESE6ZiD8UAD0IVAi4pJQABQcABbowspyUBIORMT2AJSyEAAeYOjExqCQUACSrMCSHErAzJoAPNJQsFAFNaxyHFAASkrFck1WfAA0UMKsJqzoAO6sAHxjrVAAQh35XT39g8TDozYTUzPzSyuLdqtwVKttMYHoqO00j88bnRDdvawQ7pJ3NpQAD860BbRwSHBQLadAA0ix2G91oJ1vDggAfWABcxPF5QOH8aFtci5aRlaAwVDMfIQVKIKo1Yh1RQNZq0Jw4AgkMjkCYoRiIzjcPioyISKTkRayBQqNRQQzaQgAMRpdL01NpclcRignm8EFVWrsKrVchxQVC4XF0SxmSAA Playground link}\n */\ntype Intersect<\n A extends Record<string, unknown>,\n B extends Record<string, unknown>,\n> = B[keyof B] extends never\n ? A\n : keyof A & keyof B extends never\n ? // If A and B don't overlap, just return A & B\n A & B\n : // Otherwise, properly represent the fact that accessing using an\n // index signature could return a value from either A or B\n A & { [K in keyof B]: B[K] | A[keyof A & K] }\n\nexport type ObjectSchemaOutput<\n P extends ObjectSchemaProperties,\n O extends ObjectSchemaOptions,\n> = O extends {\n unknownProperties: Validator<infer D extends Record<string, unknown>>\n}\n ? Simplify<Intersect<ObjectSchemaPropertiesOutput<P, O>, D>>\n : Simplify<ObjectSchemaPropertiesOutput<P, O>>\n\nexport class ObjectSchema<\n const Validators extends ObjectSchemaProperties = any,\n const Options extends ObjectSchemaOptions = any,\n const Output extends ObjectSchemaOutput<\n Validators,\n Options\n > = ObjectSchemaOutput<Validators, Options>,\n> extends Validator<Output> {\n constructor(\n readonly validators: Validators,\n readonly options: Options,\n ) {\n super()\n }\n\n get validatorsMap(): Map<string, Validator> {\n const map = new Map(Object.entries(this.validators))\n\n // Cache the map on the instance (to avoid re-creating it)\n Object.defineProperty(this, 'validatorsMap', {\n value: map,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return map\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, ['object'])\n }\n\n // Lazily copy value\n let copy: undefined | Record<string, unknown>\n\n for (const [key, propDef] of this.validatorsMap) {\n if (input[key] === null && this.options.nullable?.includes(key)) {\n continue\n }\n\n const result = ctx.validateChild(input, key, propDef)\n if (!result.success) {\n // Because default values are provided by child validators, we need to\n // run the validator to get the default value and, in case of failure,\n // ignore validation error that were caused by missing keys.\n if (!(key in input)) {\n if (this.options.required?.includes(key)) {\n // Transform into \"required key\" issue\n return ctx.issueRequiredKey(input, key)\n }\n\n // Ignore missing non-required key\n continue\n }\n\n return result\n } else if (result.value === undefined) {\n // Special case for validators that output \"undefined\" values (typically\n // UnknownSchema) since they cannot differentiate between \"missing key\"\n // and \"key with undefined value\"\n\n if (!(key in input)) {\n // Input was missing the key (was \"undefined\")\n if (this.options.required?.includes(key)) {\n return ctx.issueRequiredKey(input, key)\n }\n\n // Ignore missing non-required key\n continue\n }\n\n // if \"key\" existed in input (would typically be \"undefined\"), we keep\n // it as-is by continuing processing as if it was any other value.\n }\n\n if (result.value !== input[key]) {\n copy ??= { ...input }\n copy[key] = result.value\n }\n }\n\n if (this.options.unknownProperties === 'strict') {\n for (const key of Object.keys(input)) {\n if (!this.validatorsMap.has(key)) {\n return ctx.issueInvalidPropertyType(input, key, 'undefined')\n }\n }\n } else if (this.options.unknownProperties) {\n const result = this.options.unknownProperties.validateInContext(\n copy ?? input,\n ctx,\n { ignoredKeys: this.validatorsMap },\n )\n if (!result.success) return result\n if (result.value !== input) copy = result.value\n }\n\n const output = (copy ?? input) as Output\n\n return ctx.success(output)\n }\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
2
|
+
import { Param } from './_parameters.js';
|
|
3
|
+
import { ObjectSchemaPropertiesOutput } from './object.js';
|
|
4
|
+
export type ParamsSchemaProperties = {
|
|
5
|
+
[_ in string]: Validator<Param>;
|
|
6
|
+
};
|
|
7
|
+
export type ParamsSchemaOptions = {
|
|
8
|
+
required?: readonly string[];
|
|
9
|
+
};
|
|
10
|
+
export type ParamsSchemaOutput<P extends ParamsSchemaProperties, O extends ParamsSchemaOptions> = ObjectSchemaPropertiesOutput<P, O>;
|
|
11
|
+
export type InferParamsSchema<T> = T extends ParamsSchema<infer P, infer O> ? NonNullable<unknown> extends ParamsSchemaOutput<P, O> ? ParamsSchemaOutput<P, O> | undefined : ParamsSchemaOutput<P, O> : never;
|
|
12
|
+
export declare class ParamsSchema<const Validators extends ParamsSchemaProperties = ParamsSchemaProperties, const Options extends ParamsSchemaOptions = ParamsSchemaOptions, Output extends ParamsSchemaOutput<Validators, Options> = ParamsSchemaOutput<Validators, Options>> extends Validator<Output> {
|
|
13
|
+
readonly validators: Validators;
|
|
14
|
+
readonly options: Options;
|
|
15
|
+
readonly lexiconType: "params";
|
|
16
|
+
constructor(validators: Validators, options: Options);
|
|
17
|
+
get validatorsMap(): Map<string, Validator<Param>>;
|
|
18
|
+
validateInContext(input: unknown | undefined, ctx: ValidatorContext): ValidationResult<Output>;
|
|
19
|
+
fromURLSearchParams(urlSearchParams: URLSearchParams): Output;
|
|
20
|
+
toURLSearchParams(input: Output): URLSearchParams;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/schema/params.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,KAAK,EAA4B,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAG1D,MAAM,MAAM,sBAAsB,GAAG;KAClC,CAAC,IAAI,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;CAChC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,kBAAkB,CAC5B,CAAC,SAAS,sBAAsB,EAChC,CAAC,SAAS,mBAAmB,IAC3B,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEtC,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAC7B,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACpC,WAAW,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GACnD,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GACpC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC1B,KAAK,CAAA;AAEX,qBAAa,YAAY,CACvB,KAAK,CAAC,UAAU,SAAS,sBAAsB,GAAG,sBAAsB,EACxE,KAAK,CAAC,OAAO,SAAS,mBAAmB,GAAG,mBAAmB,EAC/D,MAAM,SAAS,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,kBAAkB,CACzE,UAAU,EACV,OAAO,CACR,CACD,SAAQ,SAAS,CAAC,MAAM,CAAC;IAIvB,QAAQ,CAAC,UAAU,EAAE,UAAU;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO;IAJ3B,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAS;gBAG7B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAK3B,IAAI,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAYjD;IAEQ,iBAAiB,CACxB,KAAK,EAAE,OAAO,YAAK,EACnB,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;IAkD3B,mBAAmB,CAAC,eAAe,EAAE,eAAe,GAAG,MAAM;IA6B7D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;CAiBlD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParamsSchema = void 0;
|
|
4
|
+
const lex_data_1 = require("@atproto/lex-data");
|
|
5
|
+
const validation_js_1 = require("../validation.js");
|
|
6
|
+
const _parameters_js_1 = require("./_parameters.js");
|
|
7
|
+
const string_js_1 = require("./string.js");
|
|
8
|
+
class ParamsSchema extends validation_js_1.Validator {
|
|
9
|
+
validators;
|
|
10
|
+
options;
|
|
11
|
+
lexiconType = 'params';
|
|
12
|
+
constructor(validators, options) {
|
|
13
|
+
super();
|
|
14
|
+
this.validators = validators;
|
|
15
|
+
this.options = options;
|
|
16
|
+
}
|
|
17
|
+
get validatorsMap() {
|
|
18
|
+
const map = new Map(Object.entries(this.validators));
|
|
19
|
+
// Cache the map on the instance (to avoid re-creating it)
|
|
20
|
+
Object.defineProperty(this, 'validatorsMap', {
|
|
21
|
+
value: map,
|
|
22
|
+
writable: false,
|
|
23
|
+
enumerable: false,
|
|
24
|
+
configurable: true,
|
|
25
|
+
});
|
|
26
|
+
return map;
|
|
27
|
+
}
|
|
28
|
+
validateInContext(input = {}, ctx) {
|
|
29
|
+
if (!(0, lex_data_1.isPlainObject)(input)) {
|
|
30
|
+
return ctx.issueInvalidType(input, 'object');
|
|
31
|
+
}
|
|
32
|
+
// Lazily copy value
|
|
33
|
+
let copy;
|
|
34
|
+
// Ensure that non-specified params conform to param schema
|
|
35
|
+
for (const key in input) {
|
|
36
|
+
if (this.validatorsMap.has(key))
|
|
37
|
+
continue;
|
|
38
|
+
const result = ctx.validateChild(input, key, _parameters_js_1.paramSchema);
|
|
39
|
+
if (!result.success)
|
|
40
|
+
return result;
|
|
41
|
+
if (result.value !== input[key]) {
|
|
42
|
+
copy ??= { ...input };
|
|
43
|
+
copy[key] = result.value;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (const [key, propDef] of this.validatorsMap) {
|
|
47
|
+
const result = ctx.validateChild(input, key, propDef);
|
|
48
|
+
if (!result.success) {
|
|
49
|
+
// Because default values are provided by child validators, we need to
|
|
50
|
+
// run the validator to get the default value and, in case of failure,
|
|
51
|
+
// ignore validation error that were caused by missing keys.
|
|
52
|
+
if (!(key in input)) {
|
|
53
|
+
if (!this.options.required?.includes(key)) {
|
|
54
|
+
// Ignore missing non-required key
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Transform into "required key" issue
|
|
59
|
+
return ctx.issueRequiredKey(input, key);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
if (result.value !== input[key]) {
|
|
65
|
+
// Copy on write
|
|
66
|
+
copy ??= { ...input };
|
|
67
|
+
copy[key] = result.value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return ctx.success((copy ?? input));
|
|
71
|
+
}
|
|
72
|
+
fromURLSearchParams(urlSearchParams) {
|
|
73
|
+
const params = {};
|
|
74
|
+
for (const [key, value] of urlSearchParams.entries()) {
|
|
75
|
+
const validator = this.validatorsMap.get(key);
|
|
76
|
+
const coerced = validator != null && validator instanceof string_js_1.StringSchema
|
|
77
|
+
? value
|
|
78
|
+
: value === 'true'
|
|
79
|
+
? true
|
|
80
|
+
: value === 'false'
|
|
81
|
+
? false
|
|
82
|
+
: /^-?\d+$/.test(value)
|
|
83
|
+
? Number(value)
|
|
84
|
+
: value;
|
|
85
|
+
if (params[key] === undefined) {
|
|
86
|
+
params[key] = coerced;
|
|
87
|
+
}
|
|
88
|
+
else if (Array.isArray(params[key])) {
|
|
89
|
+
params[key].push(coerced);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
params[key] = [params[key], coerced];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return this.parse(params);
|
|
96
|
+
}
|
|
97
|
+
toURLSearchParams(input) {
|
|
98
|
+
const urlSearchParams = new URLSearchParams();
|
|
99
|
+
if (input !== undefined) {
|
|
100
|
+
for (const [key, value] of Object.entries(input)) {
|
|
101
|
+
if (Array.isArray(value)) {
|
|
102
|
+
for (const v of value) {
|
|
103
|
+
urlSearchParams.append(key, String(v));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (value !== undefined) {
|
|
107
|
+
urlSearchParams.append(key, String(value));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return urlSearchParams;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.ParamsSchema = ParamsSchema;
|
|
115
|
+
//# sourceMappingURL=params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/schema/params.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AACjD,oDAAgF;AAChF,qDAAkE;AAElE,2CAA0C;AAsB1C,MAAa,YAOX,SAAQ,yBAAiB;IAId;IACA;IAJF,WAAW,GAAG,QAAiB,CAAA;IAExC,YACW,UAAsB,EACtB,OAAgB;QAEzB,KAAK,EAAE,CAAA;QAHE,eAAU,GAAV,UAAU,CAAY;QACtB,YAAO,GAAP,OAAO,CAAS;IAG3B,CAAC;IAED,IAAI,aAAa;QACf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QAEpD,0DAA0D;QAC1D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE;YAC3C,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAA;IACZ,CAAC;IAEQ,iBAAiB,CACxB,QAAiB,EAAE,EACnB,GAAqB;QAErB,IAAI,CAAC,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAyC,CAAA;QAE7C,2DAA2D;QAC3D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAQ;YAEzC,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,4BAAW,CAAC,CAAA;YACzD,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAA;YAElC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,IAAI,KAAK,EAAE,GAAG,KAAK,EAAE,CAAA;gBACrB,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAA;YAC1B,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,sEAAsE;gBACtE,sEAAsE;gBACtE,4DAA4D;gBAC5D,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1C,kCAAkC;wBAClC,SAAQ;oBACV,CAAC;yBAAM,CAAC;wBACN,sCAAsC;wBACtC,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;oBACzC,CAAC;gBACH,CAAC;gBAED,OAAO,MAAM,CAAA;YACf,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,gBAAgB;gBAChB,IAAI,KAAK,EAAE,GAAG,KAAK,EAAE,CAAA;gBACrB,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAA;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,KAAK,CAAW,CAAC,CAAA;IAC/C,CAAC;IAED,mBAAmB,CAAC,eAAgC;QAClD,MAAM,MAAM,GAA0B,EAAE,CAAA;QAExC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAE7C,MAAM,OAAO,GACX,SAAS,IAAI,IAAI,IAAI,SAAS,YAAY,wBAAY;gBACpD,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,KAAK,KAAK,MAAM;oBAChB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,KAAK,KAAK,OAAO;wBACjB,CAAC,CAAC,KAAK;wBACP,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;4BACrB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;4BACf,CAAC,CAAC,KAAK,CAAA;YAEjB,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;YACvB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAgB,EAAE,OAAO,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,iBAAiB,CAAC,KAAa;QAC7B,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAE7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;wBACtB,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;oBACxC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC/B,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAA;IACxB,CAAC;CACF;AAlID,oCAkIC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { ValidationResult, Validator, ValidatorContext } from '../validation.js'\nimport { Param, ParamScalar, paramSchema } from './_parameters.js'\nimport { ObjectSchemaPropertiesOutput } from './object.js'\nimport { StringSchema } from './string.js'\n\nexport type ParamsSchemaProperties = {\n [_ in string]: Validator<Param>\n}\n\nexport type ParamsSchemaOptions = {\n required?: readonly string[]\n}\n\nexport type ParamsSchemaOutput<\n P extends ParamsSchemaProperties,\n O extends ParamsSchemaOptions,\n> = ObjectSchemaPropertiesOutput<P, O>\n\nexport type InferParamsSchema<T> =\n T extends ParamsSchema<infer P, infer O>\n ? NonNullable<unknown> extends ParamsSchemaOutput<P, O>\n ? ParamsSchemaOutput<P, O> | undefined\n : ParamsSchemaOutput<P, O>\n : never\n\nexport class ParamsSchema<\n const Validators extends ParamsSchemaProperties = ParamsSchemaProperties,\n const Options extends ParamsSchemaOptions = ParamsSchemaOptions,\n Output extends ParamsSchemaOutput<Validators, Options> = ParamsSchemaOutput<\n Validators,\n Options\n >,\n> extends Validator<Output> {\n readonly lexiconType = 'params' as const\n\n constructor(\n readonly validators: Validators,\n readonly options: Options,\n ) {\n super()\n }\n\n get validatorsMap(): Map<string, Validator<Param>> {\n const map = new Map(Object.entries(this.validators))\n\n // Cache the map on the instance (to avoid re-creating it)\n Object.defineProperty(this, 'validatorsMap', {\n value: map,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return map\n }\n\n override validateInContext(\n input: unknown = {},\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'object')\n }\n\n // Lazily copy value\n let copy: undefined | Record<string, unknown>\n\n // Ensure that non-specified params conform to param schema\n for (const key in input) {\n if (this.validatorsMap.has(key)) continue\n\n const result = ctx.validateChild(input, key, paramSchema)\n if (!result.success) return result\n\n if (result.value !== input[key]) {\n copy ??= { ...input }\n copy[key] = result.value\n }\n }\n\n for (const [key, propDef] of this.validatorsMap) {\n const result = ctx.validateChild(input, key, propDef)\n if (!result.success) {\n // Because default values are provided by child validators, we need to\n // run the validator to get the default value and, in case of failure,\n // ignore validation error that were caused by missing keys.\n if (!(key in input)) {\n if (!this.options.required?.includes(key)) {\n // Ignore missing non-required key\n continue\n } else {\n // Transform into \"required key\" issue\n return ctx.issueRequiredKey(input, key)\n }\n }\n\n return result\n }\n\n if (result.value !== input[key]) {\n // Copy on write\n copy ??= { ...input }\n copy[key] = result.value\n }\n }\n\n return ctx.success((copy ?? input) as Output)\n }\n\n fromURLSearchParams(urlSearchParams: URLSearchParams): Output {\n const params: Record<string, Param> = {}\n\n for (const [key, value] of urlSearchParams.entries()) {\n const validator = this.validatorsMap.get(key)\n\n const coerced: ParamScalar =\n validator != null && validator instanceof StringSchema\n ? value\n : value === 'true'\n ? true\n : value === 'false'\n ? false\n : /^-?\\d+$/.test(value)\n ? Number(value)\n : value\n\n if (params[key] === undefined) {\n params[key] = coerced\n } else if (Array.isArray(params[key])) {\n params[key].push(coerced)\n } else {\n params[key] = [params[key] as ParamScalar, coerced]\n }\n }\n\n return this.parse(params)\n }\n\n toURLSearchParams(input: Output): URLSearchParams {\n const urlSearchParams = new URLSearchParams()\n\n if (input !== undefined) {\n for (const [key, value] of Object.entries(input)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n urlSearchParams.append(key, String(v))\n }\n } else if (value !== undefined) {\n urlSearchParams.append(key, String(value))\n }\n }\n }\n\n return urlSearchParams\n }\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LexValue } from '@atproto/lex-data';
|
|
2
|
+
import { Validator } from '../validation.js';
|
|
3
|
+
export type LexBody<E extends string = any> = E extends `text/${string}` ? string : E extends 'application/json' ? LexValue : Uint8Array;
|
|
4
|
+
export type InferPayloadEncoding<P extends Payload> = P extends Payload<infer E, any> ? E : undefined;
|
|
5
|
+
export type InferPayloadBody<P extends Payload> = P extends Payload<any, infer S> ? S extends Validator<infer V> ? V : P extends Payload<infer E extends string> ? LexBody<E> : undefined : undefined;
|
|
6
|
+
export type PayloadOutput<E extends string | undefined = any, S extends Validator | undefined = any> = E extends string ? S extends Validator<infer V> ? {
|
|
7
|
+
encoding: E;
|
|
8
|
+
body: V;
|
|
9
|
+
} : {
|
|
10
|
+
encoding: E;
|
|
11
|
+
body: LexBody<E>;
|
|
12
|
+
} : void;
|
|
13
|
+
export type PayloadBody<E extends string | undefined> = E extends undefined ? undefined : Validator | undefined;
|
|
14
|
+
export declare class Payload<const Encoding extends string | undefined = string | undefined, const Body extends PayloadBody<Encoding> = PayloadBody<Encoding>> {
|
|
15
|
+
readonly encoding: Encoding;
|
|
16
|
+
readonly schema: Body;
|
|
17
|
+
constructor(encoding: Encoding, schema: Body);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../src/schema/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,QAAQ,MAAM,EAAE,GACpE,MAAM,GACN,CAAC,SAAS,kBAAkB,GAC1B,QAAQ,GACR,UAAU,CAAA;AAEhB,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,OAAO,IAChD,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;AAEjD,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,OAAO,IAC5C,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAC3B,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAC1B,CAAC,GACD,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,GACvC,OAAO,CAAC,CAAC,CAAC,GACV,SAAS,GACb,SAAS,CAAA;AAEf,MAAM,MAAM,aAAa,CACvB,CAAC,SAAS,MAAM,GAAG,SAAS,GAAG,GAAG,EAClC,CAAC,SAAS,SAAS,GAAG,SAAS,GAAG,GAAG,IACnC,CAAC,SAAS,MAAM,GAChB,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAC1B;IACE,QAAQ,EAAE,CAAC,CAAA;IACX,IAAI,EAAE,CAAC,CAAA;CACR,GACD;IACE,QAAQ,EAAE,CAAC,CAAA;IACX,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CACjB,GACH,IAAI,CAAA;AAER,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI,CAAC,SAAS,SAAS,GACvE,SAAS,GACT,SAAS,GAAG,SAAS,CAAA;AAEzB,qBAAa,OAAO,CAClB,KAAK,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EAC9D,KAAK,CAAC,IAAI,SAAS,WAAW,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC;IAG9D,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,MAAM,EAAE,IAAI;gBADZ,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,IAAI;CAMxB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Payload = void 0;
|
|
4
|
+
class Payload {
|
|
5
|
+
encoding;
|
|
6
|
+
schema;
|
|
7
|
+
constructor(encoding, schema) {
|
|
8
|
+
this.encoding = encoding;
|
|
9
|
+
this.schema = schema;
|
|
10
|
+
if (encoding === undefined && schema !== undefined) {
|
|
11
|
+
throw new TypeError('schema cannot be defined when encoding is undefined');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.Payload = Payload;
|
|
16
|
+
//# sourceMappingURL=payload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.js","sourceRoot":"","sources":["../../src/schema/payload.ts"],"names":[],"mappings":";;;AAwCA,MAAa,OAAO;IAKP;IACA;IAFX,YACW,QAAkB,EAClB,MAAY;QADZ,aAAQ,GAAR,QAAQ,CAAU;QAClB,WAAM,GAAN,MAAM,CAAM;QAErB,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;CACF;AAZD,0BAYC","sourcesContent":["import { LexValue } from '@atproto/lex-data'\nimport { Validator } from '../validation.js'\n\nexport type LexBody<E extends string = any> = E extends `text/${string}`\n ? string // Text encodings always yield string bodies\n : E extends 'application/json'\n ? LexValue\n : Uint8Array\n\nexport type InferPayloadEncoding<P extends Payload> =\n P extends Payload<infer E, any> ? E : undefined\n\nexport type InferPayloadBody<P extends Payload> =\n P extends Payload<any, infer S>\n ? S extends Validator<infer V>\n ? V\n : P extends Payload<infer E extends string>\n ? LexBody<E>\n : undefined\n : undefined\n\nexport type PayloadOutput<\n E extends string | undefined = any,\n S extends Validator | undefined = any,\n> = E extends string\n ? S extends Validator<infer V>\n ? {\n encoding: E\n body: V\n }\n : {\n encoding: E\n body: LexBody<E>\n }\n : void\n\nexport type PayloadBody<E extends string | undefined> = E extends undefined\n ? undefined\n : Validator | undefined\n\nexport class Payload<\n const Encoding extends string | undefined = string | undefined,\n const Body extends PayloadBody<Encoding> = PayloadBody<Encoding>,\n> {\n constructor(\n readonly encoding: Encoding,\n readonly schema: Body,\n ) {\n if (encoding === undefined && schema !== undefined) {\n throw new TypeError('schema cannot be defined when encoding is undefined')\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Permission } from './permission.js';
|
|
2
|
+
export type PermissionSetOptions = {
|
|
3
|
+
title?: string;
|
|
4
|
+
'title:lang'?: Record<string, undefined | string>;
|
|
5
|
+
detail?: string;
|
|
6
|
+
'detail:lang'?: Record<string, undefined | string>;
|
|
7
|
+
};
|
|
8
|
+
export declare class PermissionSet<const Nsid extends string = any, const Permissions extends readonly Permission[] = any, const Options extends PermissionSetOptions = any> {
|
|
9
|
+
readonly nsid: Nsid;
|
|
10
|
+
readonly permissions: Permissions;
|
|
11
|
+
readonly options: Options;
|
|
12
|
+
readonly lexiconType: "permission-set";
|
|
13
|
+
constructor(nsid: Nsid, permissions: Permissions, options: Options);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=permission-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-set.d.ts","sourceRoot":"","sources":["../../src/schema/permission-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,CAAA;IACjD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,CAAA;CACnD,CAAA;AAED,qBAAa,aAAa,CACxB,KAAK,CAAC,IAAI,SAAS,MAAM,GAAG,GAAG,EAC/B,KAAK,CAAC,WAAW,SAAS,SAAS,UAAU,EAAE,GAAG,GAAG,EACrD,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG,GAAG;IAK9C,QAAQ,CAAC,IAAI,EAAE,IAAI;IACnB,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO;IAL3B,QAAQ,CAAC,WAAW,EAAG,gBAAgB,CAAS;gBAGrC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO;CAE5B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PermissionSet = void 0;
|
|
4
|
+
class PermissionSet {
|
|
5
|
+
nsid;
|
|
6
|
+
permissions;
|
|
7
|
+
options;
|
|
8
|
+
lexiconType = 'permission-set';
|
|
9
|
+
constructor(nsid, permissions, options) {
|
|
10
|
+
this.nsid = nsid;
|
|
11
|
+
this.permissions = permissions;
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.PermissionSet = PermissionSet;
|
|
16
|
+
//# sourceMappingURL=permission-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-set.js","sourceRoot":"","sources":["../../src/schema/permission-set.ts"],"names":[],"mappings":";;;AASA,MAAa,aAAa;IAQb;IACA;IACA;IALF,WAAW,GAAG,gBAAyB,CAAA;IAEhD,YACW,IAAU,EACV,WAAwB,EACxB,OAAgB;QAFhB,SAAI,GAAJ,IAAI,CAAM;QACV,gBAAW,GAAX,WAAW,CAAa;QACxB,YAAO,GAAP,OAAO,CAAS;IACxB,CAAC;CACL;AAZD,sCAYC","sourcesContent":["import { Permission } from './permission.js'\n\nexport type PermissionSetOptions = {\n title?: string\n 'title:lang'?: Record<string, undefined | string>\n detail?: string\n 'detail:lang'?: Record<string, undefined | string>\n}\n\nexport class PermissionSet<\n const Nsid extends string = any,\n const Permissions extends readonly Permission[] = any,\n const Options extends PermissionSetOptions = any,\n> {\n readonly lexiconType = 'permission-set' as const\n\n constructor(\n readonly nsid: Nsid,\n readonly permissions: Permissions,\n readonly options: Options,\n ) {}\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Params } from './_parameters.js';
|
|
2
|
+
export type PermissionOptions = Params;
|
|
3
|
+
export declare class Permission<const Resource extends string = any, const Options extends PermissionOptions = any> {
|
|
4
|
+
readonly resource: Resource;
|
|
5
|
+
readonly options: Options;
|
|
6
|
+
readonly lexiconType: "permission";
|
|
7
|
+
constructor(resource: Resource, options: Options);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=permission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../src/schema/permission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEtC,qBAAa,UAAU,CACrB,KAAK,CAAC,QAAQ,SAAS,MAAM,GAAG,GAAG,EACnC,KAAK,CAAC,OAAO,SAAS,iBAAiB,GAAG,GAAG;IAK3C,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO;IAJ3B,QAAQ,CAAC,WAAW,EAAG,YAAY,CAAS;gBAGjC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO;CAE5B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Permission = void 0;
|
|
4
|
+
class Permission {
|
|
5
|
+
resource;
|
|
6
|
+
options;
|
|
7
|
+
lexiconType = 'permission';
|
|
8
|
+
constructor(resource, options) {
|
|
9
|
+
this.resource = resource;
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Permission = Permission;
|
|
14
|
+
//# sourceMappingURL=permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/schema/permission.ts"],"names":[],"mappings":";;;AAIA,MAAa,UAAU;IAOV;IACA;IAJF,WAAW,GAAG,YAAqB,CAAA;IAE5C,YACW,QAAkB,EAClB,OAAgB;QADhB,aAAQ,GAAR,QAAQ,CAAU;QAClB,YAAO,GAAP,OAAO,CAAS;IACxB,CAAC;CACL;AAVD,gCAUC","sourcesContent":["import { Params } from './_parameters.js'\n\nexport type PermissionOptions = Params\n\nexport class Permission<\n const Resource extends string = any,\n const Options extends PermissionOptions = any,\n> {\n readonly lexiconType = 'permission' as const\n\n constructor(\n readonly resource: Resource,\n readonly options: Options,\n ) {}\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Nsid } from '../core.js';
|
|
2
|
+
import { Infer } from '../validation.js';
|
|
3
|
+
import { ParamsSchema } from './params.js';
|
|
4
|
+
import { InferPayloadBody, Payload } from './payload.js';
|
|
5
|
+
export type InferProcedureParameters<Q extends Procedure> = Q extends Procedure<any, infer P extends ParamsSchema, any> ? Infer<P> : never;
|
|
6
|
+
export type InferProcedureInputBody<Q extends Procedure> = Q extends Procedure<any, any, infer I extends Payload, any> ? InferPayloadBody<I> : never;
|
|
7
|
+
export type InferProcedureOutputBody<Q extends Procedure> = Q extends Procedure<any, any, any, infer O extends Payload> ? InferPayloadBody<O> : never;
|
|
8
|
+
export declare class Procedure<N extends Nsid = any, P extends ParamsSchema = any, I extends Payload = any, O extends Payload = any, E extends undefined | readonly string[] = any> {
|
|
9
|
+
readonly nsid: N;
|
|
10
|
+
readonly parameters: P;
|
|
11
|
+
readonly input: I;
|
|
12
|
+
readonly output: O;
|
|
13
|
+
readonly errors: E;
|
|
14
|
+
readonly lexiconType: "procedure";
|
|
15
|
+
constructor(nsid: N, parameters: P, input: I, output: O, errors: E);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=procedure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procedure.d.ts","sourceRoot":"","sources":["../../src/schema/procedure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAExD,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,SAAS,IACtD,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,YAAY,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAEhF,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,SAAS,IACrD,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,OAAO,EAAE,GAAG,CAAC,GACvD,gBAAgB,CAAC,CAAC,CAAC,GACnB,KAAK,CAAA;AAEX,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,SAAS,IACtD,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,OAAO,CAAC,GACvD,gBAAgB,CAAC,CAAC,CAAC,GACnB,KAAK,CAAA;AAEX,qBAAa,SAAS,CACpB,CAAC,SAAS,IAAI,GAAG,GAAG,EACpB,CAAC,SAAS,YAAY,GAAG,GAAG,EAC5B,CAAC,SAAS,OAAO,GAAG,GAAG,EACvB,CAAC,SAAS,OAAO,GAAG,GAAG,EACvB,CAAC,SAAS,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG;IAK3C,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChB,QAAQ,CAAC,UAAU,EAAE,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,CAAC;IAPpB,QAAQ,CAAC,WAAW,EAAG,WAAW,CAAS;gBAGhC,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,CAAC,EACb,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,CAAC;CAErB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Procedure = void 0;
|
|
4
|
+
class Procedure {
|
|
5
|
+
nsid;
|
|
6
|
+
parameters;
|
|
7
|
+
input;
|
|
8
|
+
output;
|
|
9
|
+
errors;
|
|
10
|
+
lexiconType = 'procedure';
|
|
11
|
+
constructor(nsid, parameters, input, output, errors) {
|
|
12
|
+
this.nsid = nsid;
|
|
13
|
+
this.parameters = parameters;
|
|
14
|
+
this.input = input;
|
|
15
|
+
this.output = output;
|
|
16
|
+
this.errors = errors;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.Procedure = Procedure;
|
|
20
|
+
//# sourceMappingURL=procedure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procedure.js","sourceRoot":"","sources":["../../src/schema/procedure.ts"],"names":[],"mappings":";;;AAkBA,MAAa,SAAS;IAUT;IACA;IACA;IACA;IACA;IAPF,WAAW,GAAG,WAAoB,CAAA;IAE3C,YACW,IAAO,EACP,UAAa,EACb,KAAQ,EACR,MAAS,EACT,MAAS;QAJT,SAAI,GAAJ,IAAI,CAAG;QACP,eAAU,GAAV,UAAU,CAAG;QACb,UAAK,GAAL,KAAK,CAAG;QACR,WAAM,GAAN,MAAM,CAAG;QACT,WAAM,GAAN,MAAM,CAAG;IACjB,CAAC;CACL;AAhBD,8BAgBC","sourcesContent":["import { Nsid } from '../core.js'\nimport { Infer } from '../validation.js'\nimport { ParamsSchema } from './params.js'\nimport { InferPayloadBody, Payload } from './payload.js'\n\nexport type InferProcedureParameters<Q extends Procedure> =\n Q extends Procedure<any, infer P extends ParamsSchema, any> ? Infer<P> : never\n\nexport type InferProcedureInputBody<Q extends Procedure> =\n Q extends Procedure<any, any, infer I extends Payload, any>\n ? InferPayloadBody<I>\n : never\n\nexport type InferProcedureOutputBody<Q extends Procedure> =\n Q extends Procedure<any, any, any, infer O extends Payload>\n ? InferPayloadBody<O>\n : never\n\nexport class Procedure<\n N extends Nsid = any,\n P extends ParamsSchema = any,\n I extends Payload = any,\n O extends Payload = any,\n E extends undefined | readonly string[] = any,\n> {\n readonly lexiconType = 'procedure' as const\n\n constructor(\n readonly nsid: N,\n readonly parameters: P,\n readonly input: I,\n readonly output: O,\n readonly errors: E,\n ) {}\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Nsid } from '../core.js';
|
|
2
|
+
import { Infer } from '../validation.js';
|
|
3
|
+
import { ParamsSchema } from './params.js';
|
|
4
|
+
import { InferPayloadBody, Payload } from './payload.js';
|
|
5
|
+
export type InferQueryParameters<Q extends Query> = Q extends Query<any, infer P extends ParamsSchema, any> ? Infer<P> : never;
|
|
6
|
+
export type InferQueryOutputBody<Q extends Query> = Q extends Query<any, any, infer O extends Payload> ? InferPayloadBody<O> : never;
|
|
7
|
+
export declare class Query<N extends Nsid = any, P extends ParamsSchema = any, O extends Payload = any, E extends undefined | readonly string[] = any> {
|
|
8
|
+
readonly nsid: N;
|
|
9
|
+
readonly parameters: P;
|
|
10
|
+
readonly output: O;
|
|
11
|
+
readonly errors: E;
|
|
12
|
+
readonly lexiconType: "query";
|
|
13
|
+
constructor(nsid: N, parameters: P, output: O, errors: E);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/schema/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAExD,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,KAAK,IAC9C,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,YAAY,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAE5E,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,KAAK,IAC9C,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,OAAO,CAAC,GAC9C,gBAAgB,CAAC,CAAC,CAAC,GACnB,KAAK,CAAA;AAEX,qBAAa,KAAK,CAChB,CAAC,SAAS,IAAI,GAAG,GAAG,EACpB,CAAC,SAAS,YAAY,GAAG,GAAG,EAC5B,CAAC,SAAS,OAAO,GAAG,GAAG,EACvB,CAAC,SAAS,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG;IAK3C,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChB,QAAQ,CAAC,UAAU,EAAE,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,CAAC;IANpB,QAAQ,CAAC,WAAW,EAAG,OAAO,CAAS;gBAG5B,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,CAAC;CAErB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Query = void 0;
|
|
4
|
+
class Query {
|
|
5
|
+
nsid;
|
|
6
|
+
parameters;
|
|
7
|
+
output;
|
|
8
|
+
errors;
|
|
9
|
+
lexiconType = 'query';
|
|
10
|
+
constructor(nsid, parameters, output, errors) {
|
|
11
|
+
this.nsid = nsid;
|
|
12
|
+
this.parameters = parameters;
|
|
13
|
+
this.output = output;
|
|
14
|
+
this.errors = errors;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.Query = Query;
|
|
18
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/schema/query.ts"],"names":[],"mappings":";;;AAaA,MAAa,KAAK;IASL;IACA;IACA;IACA;IANF,WAAW,GAAG,OAAgB,CAAA;IAEvC,YACW,IAAO,EACP,UAAa,EACb,MAAS,EACT,MAAS;QAHT,SAAI,GAAJ,IAAI,CAAG;QACP,eAAU,GAAV,UAAU,CAAG;QACb,WAAM,GAAN,MAAM,CAAG;QACT,WAAM,GAAN,MAAM,CAAG;IACjB,CAAC;CACL;AAdD,sBAcC","sourcesContent":["import { Nsid } from '../core.js'\nimport { Infer } from '../validation.js'\nimport { ParamsSchema } from './params.js'\nimport { InferPayloadBody, Payload } from './payload.js'\n\nexport type InferQueryParameters<Q extends Query> =\n Q extends Query<any, infer P extends ParamsSchema, any> ? Infer<P> : never\n\nexport type InferQueryOutputBody<Q extends Query> =\n Q extends Query<any, any, infer O extends Payload>\n ? InferPayloadBody<O>\n : never\n\nexport class Query<\n N extends Nsid = any,\n P extends ParamsSchema = any,\n O extends Payload = any,\n E extends undefined | readonly string[] = any,\n> {\n readonly lexiconType = 'query' as const\n\n constructor(\n readonly nsid: N,\n readonly parameters: P,\n readonly output: O,\n readonly errors: E,\n ) {}\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Nsid, RecordKey, Simplify } from '../core.js';
|
|
2
|
+
import { Infer, ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
3
|
+
export type InferRecordKey<R extends RecordSchema> = R extends RecordSchema<infer K, any, any, any> ? RecordKeySchemaOutput<K> : never;
|
|
4
|
+
export declare class RecordSchema<Key extends RecordKey = any, Type extends Nsid = any, Schema extends Validator<object> = any, Output extends Infer<Schema> & {
|
|
5
|
+
$type: Type;
|
|
6
|
+
} = Infer<Schema> & {
|
|
7
|
+
$type: Type;
|
|
8
|
+
}> extends Validator<Output> {
|
|
9
|
+
readonly key: Key;
|
|
10
|
+
readonly $type: Type;
|
|
11
|
+
readonly schema: Schema;
|
|
12
|
+
readonly lexiconType: "record";
|
|
13
|
+
keySchema: RecordKeySchema<Key>;
|
|
14
|
+
constructor(key: Key, $type: Type, schema: Schema);
|
|
15
|
+
isTypeOf<X extends {
|
|
16
|
+
$type?: unknown;
|
|
17
|
+
}>(value: X): value is X extends {
|
|
18
|
+
$type: Type;
|
|
19
|
+
} ? X : never;
|
|
20
|
+
build<X extends Omit<Output, '$type'>>(input: X): Simplify<Omit<X, '$type'> & {
|
|
21
|
+
$type: Type;
|
|
22
|
+
}>;
|
|
23
|
+
$isTypeOf<X extends {
|
|
24
|
+
$type?: unknown;
|
|
25
|
+
}>(value: X): value is X extends {
|
|
26
|
+
$type: Type;
|
|
27
|
+
} ? X : never;
|
|
28
|
+
$build<X extends Omit<Output, '$type'>>(input: X): Omit<X, "$type"> & {
|
|
29
|
+
$type: Type;
|
|
30
|
+
} extends infer T ? { [K in keyof T]: (Omit<X, "$type"> & {
|
|
31
|
+
$type: Type;
|
|
32
|
+
})[K]; } : never;
|
|
33
|
+
validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<Output>;
|
|
34
|
+
}
|
|
35
|
+
export type RecordKeySchemaOutput<Key extends RecordKey> = Key extends 'any' ? string : Key extends 'tid' ? string : Key extends 'nsid' ? Nsid : Key extends `literal:${infer L extends string}` ? L : never;
|
|
36
|
+
export type RecordKeySchema<Key extends RecordKey> = Validator<RecordKeySchemaOutput<Key>>;
|
|
37
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAIzB,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,YAAY,IAC/C,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAC1C,qBAAqB,CAAC,CAAC,CAAC,GACxB,KAAK,CAAA;AAEX,qBAAa,YAAY,CACvB,GAAG,SAAS,SAAS,GAAG,GAAG,EAC3B,IAAI,SAAS,IAAI,GAAG,GAAG,EACvB,MAAM,SAAS,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,EACtC,MAAM,SAAS,KAAK,CAAC,MAAM,CAAC,GAAG;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG;IAC/D,KAAK,EAAE,IAAI,CAAA;CACZ,CACD,SAAQ,SAAS,CAAC,MAAM,CAAC;IAMvB,QAAQ,CAAC,GAAG,EAAE,GAAG;IACjB,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAPzB,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAS;IAExC,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,CAAA;gBAGpB,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,MAAM;IAMzB,QAAQ,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EACpC,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,CAAC,SAAS;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,GAAG,CAAC,GAAG,KAAK;IAIjD,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,KAAK,EAAE,CAAC,GACP,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IAI/C,SAAS,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,EAAE,CAAC;eAVlB,IAAI;;IAcnC,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;eARR,IAAI;;eAAJ,IAAI;;IAYnC,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;CAa5B;AAED,MAAM,MAAM,qBAAqB,CAAC,GAAG,SAAS,SAAS,IAAI,GAAG,SAAS,KAAK,GACxE,MAAM,GACN,GAAG,SAAS,KAAK,GACf,MAAM,GACN,GAAG,SAAS,MAAM,GAChB,IAAI,GACJ,GAAG,SAAS,WAAW,MAAM,CAAC,SAAS,MAAM,EAAE,GAC7C,CAAC,GACD,KAAK,CAAA;AAEf,MAAM,MAAM,eAAe,CAAC,GAAG,SAAS,SAAS,IAAI,SAAS,CAC5D,qBAAqB,CAAC,GAAG,CAAC,CAC3B,CAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RecordSchema = void 0;
|
|
4
|
+
const validation_js_1 = require("../validation.js");
|
|
5
|
+
const literal_js_1 = require("./literal.js");
|
|
6
|
+
const string_js_1 = require("./string.js");
|
|
7
|
+
class RecordSchema extends validation_js_1.Validator {
|
|
8
|
+
key;
|
|
9
|
+
$type;
|
|
10
|
+
schema;
|
|
11
|
+
lexiconType = 'record';
|
|
12
|
+
keySchema;
|
|
13
|
+
constructor(key, $type, schema) {
|
|
14
|
+
super();
|
|
15
|
+
this.key = key;
|
|
16
|
+
this.$type = $type;
|
|
17
|
+
this.schema = schema;
|
|
18
|
+
this.keySchema = recordKey(key);
|
|
19
|
+
}
|
|
20
|
+
isTypeOf(value) {
|
|
21
|
+
return value.$type === this.$type;
|
|
22
|
+
}
|
|
23
|
+
build(input) {
|
|
24
|
+
return { ...input, $type: this.$type };
|
|
25
|
+
}
|
|
26
|
+
$isTypeOf(value) {
|
|
27
|
+
return this.isTypeOf(value);
|
|
28
|
+
}
|
|
29
|
+
$build(input) {
|
|
30
|
+
return this.build(input);
|
|
31
|
+
}
|
|
32
|
+
validateInContext(input, ctx) {
|
|
33
|
+
const result = ctx.validate(input, this.schema);
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
if (this.$type !== result.value.$type) {
|
|
38
|
+
return ctx.issueInvalidPropertyValue(result.value, '$type', [this.$type]);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.RecordSchema = RecordSchema;
|
|
44
|
+
const keySchema = new string_js_1.StringSchema({ minLength: 1 });
|
|
45
|
+
const tidSchema = new string_js_1.StringSchema({ format: 'tid' });
|
|
46
|
+
const nsidSchema = new string_js_1.StringSchema({ format: 'nsid' });
|
|
47
|
+
const selfLiteralSchema = new literal_js_1.LiteralSchema('self');
|
|
48
|
+
function recordKey(key) {
|
|
49
|
+
// @NOTE Use cached instances for common schemas
|
|
50
|
+
if (key === 'any')
|
|
51
|
+
return keySchema;
|
|
52
|
+
if (key === 'tid')
|
|
53
|
+
return tidSchema;
|
|
54
|
+
if (key === 'nsid')
|
|
55
|
+
return nsidSchema;
|
|
56
|
+
if (key.startsWith('literal:')) {
|
|
57
|
+
const value = key.slice(8);
|
|
58
|
+
if (value === 'self')
|
|
59
|
+
return selfLiteralSchema;
|
|
60
|
+
return new literal_js_1.LiteralSchema(value);
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`Unsupported record key type: ${key}`);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":";;;AACA,oDAKyB;AACzB,6CAA4C;AAC5C,2CAA0C;AAO1C,MAAa,YAOX,SAAQ,yBAAiB;IAMd;IACA;IACA;IAPF,WAAW,GAAG,QAAiB,CAAA;IAExC,SAAS,CAAsB;IAE/B,YACW,GAAQ,EACR,KAAW,EACX,MAAc;QAEvB,KAAK,EAAE,CAAA;QAJE,QAAG,GAAH,GAAG,CAAK;QACR,UAAK,GAAL,KAAK,CAAM;QACX,WAAM,GAAN,MAAM,CAAQ;QAGvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,QAAQ,CACN,KAAQ;QAER,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAA;IACnC,CAAC;IAED,KAAK,CACH,KAAQ;QAER,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,SAAS,CAAgC,KAAQ;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAI,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,CAAkC,KAAQ;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,CAAC,CAAA;IAC7B,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAA6B,CAAA;QAE3E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,yBAAyB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3E,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAzDD,oCAyDC;AAgBD,MAAM,SAAS,GAAG,IAAI,wBAAY,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,IAAI,wBAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AACrD,MAAM,UAAU,GAAG,IAAI,wBAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AACvD,MAAM,iBAAiB,GAAG,IAAI,0BAAa,CAAC,MAAM,CAAC,CAAA;AAEnD,SAAS,SAAS,CAAwB,GAAQ;IAChD,gDAAgD;IAChD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,SAAgB,CAAA;IAC1C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,SAAgB,CAAA;IAC1C,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,UAAiB,CAAA;IAC5C,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAA+B,CAAA;QACxD,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,iBAAwB,CAAA;QACrD,OAAO,IAAI,0BAAa,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAA;AACxD,CAAC","sourcesContent":["import { Nsid, RecordKey, Simplify } from '../core.js'\nimport {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { LiteralSchema } from './literal.js'\nimport { StringSchema } from './string.js'\n\nexport type InferRecordKey<R extends RecordSchema> =\n R extends RecordSchema<infer K, any, any, any>\n ? RecordKeySchemaOutput<K>\n : never\n\nexport class RecordSchema<\n Key extends RecordKey = any,\n Type extends Nsid = any,\n Schema extends Validator<object> = any,\n Output extends Infer<Schema> & { $type: Type } = Infer<Schema> & {\n $type: Type\n },\n> extends Validator<Output> {\n readonly lexiconType = 'record' as const\n\n keySchema: RecordKeySchema<Key>\n\n constructor(\n readonly key: Key,\n readonly $type: Type,\n readonly schema: Schema,\n ) {\n super()\n this.keySchema = recordKey(key)\n }\n\n isTypeOf<X extends { $type?: unknown }>(\n value: X,\n ): value is X extends { $type: Type } ? X : never {\n return value.$type === this.$type\n }\n\n build<X extends Omit<Output, '$type'>>(\n input: X,\n ): Simplify<Omit<X, '$type'> & { $type: Type }> {\n return { ...input, $type: this.$type }\n }\n\n $isTypeOf<X extends { $type?: unknown }>(value: X) {\n return this.isTypeOf<X>(value)\n }\n\n $build<X extends Omit<Output, '$type'>>(input: X) {\n return this.build<X>(input)\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n const result = ctx.validate(input, this.schema) as ValidationResult<Output>\n\n if (!result.success) {\n return result\n }\n\n if (this.$type !== result.value.$type) {\n return ctx.issueInvalidPropertyValue(result.value, '$type', [this.$type])\n }\n\n return result\n }\n}\n\nexport type RecordKeySchemaOutput<Key extends RecordKey> = Key extends 'any'\n ? string\n : Key extends 'tid'\n ? string\n : Key extends 'nsid'\n ? Nsid\n : Key extends `literal:${infer L extends string}`\n ? L\n : never\n\nexport type RecordKeySchema<Key extends RecordKey> = Validator<\n RecordKeySchemaOutput<Key>\n>\n\nconst keySchema = new StringSchema({ minLength: 1 })\nconst tidSchema = new StringSchema({ format: 'tid' })\nconst nsidSchema = new StringSchema({ format: 'nsid' })\nconst selfLiteralSchema = new LiteralSchema('self')\n\nfunction recordKey<Key extends RecordKey>(key: Key): RecordKeySchema<Key> {\n // @NOTE Use cached instances for common schemas\n if (key === 'any') return keySchema as any\n if (key === 'tid') return tidSchema as any\n if (key === 'nsid') return nsidSchema as any\n if (key.startsWith('literal:')) {\n const value = key.slice(8) as RecordKeySchemaOutput<Key>\n if (value === 'self') return selfLiteralSchema as any\n return new LiteralSchema(value)\n }\n\n throw new Error(`Unsupported record key type: ${key}`)\n}\n"]}
|