@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,10 @@
|
|
|
1
|
+
import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
2
|
+
export type RefSchemaGetter<V> = () => Validator<V>;
|
|
3
|
+
export declare class RefSchema<V = any> extends Validator<V> {
|
|
4
|
+
#private;
|
|
5
|
+
readonly lexiconType: "ref";
|
|
6
|
+
constructor(getter: RefSchemaGetter<V>);
|
|
7
|
+
get schema(): Validator<V>;
|
|
8
|
+
validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<V>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/schema/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC,CAAC,CAAC,CAAA;AAEnD,qBAAa,SAAS,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;;IAClD,QAAQ,CAAC,WAAW,EAAG,KAAK,CAAS;gBAIzB,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAStC,IAAI,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAgBzB;IAEQ,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;CAGvB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RefSchema = void 0;
|
|
4
|
+
const validation_js_1 = require("../validation.js");
|
|
5
|
+
class RefSchema extends validation_js_1.Validator {
|
|
6
|
+
lexiconType = 'ref';
|
|
7
|
+
#getter;
|
|
8
|
+
constructor(getter) {
|
|
9
|
+
// @NOTE In order to avoid circular dependency issues, we don't resolve
|
|
10
|
+
// the schema here. Instead, we resolve it lazily when first accessed.
|
|
11
|
+
super();
|
|
12
|
+
this.#getter = getter;
|
|
13
|
+
}
|
|
14
|
+
get schema() {
|
|
15
|
+
const value = this.#getter.call(null);
|
|
16
|
+
// Prevents a getter from depending on itself recursively, also allows GC to
|
|
17
|
+
// clean up the getter function.
|
|
18
|
+
this.#getter = throwAlreadyCalled;
|
|
19
|
+
// Disable the getter and cache the resolved schema on the instance
|
|
20
|
+
Object.defineProperty(this, 'schema', {
|
|
21
|
+
value,
|
|
22
|
+
writable: false,
|
|
23
|
+
enumerable: false,
|
|
24
|
+
configurable: true,
|
|
25
|
+
});
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
validateInContext(input, ctx) {
|
|
29
|
+
return ctx.validate(input, this.schema);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.RefSchema = RefSchema;
|
|
33
|
+
function throwAlreadyCalled() {
|
|
34
|
+
throw new Error('RefSchema getter called multiple times');
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/schema/ref.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAIhF,MAAa,SAAmB,SAAQ,yBAAY;IACzC,WAAW,GAAG,KAAc,CAAA;IAErC,OAAO,CAAoB;IAE3B,YAAY,MAA0B;QACpC,uEAAuE;QACvE,sEAAsE;QAEtE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,MAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAErC,4EAA4E;QAC5E,gCAAgC;QAChC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAA;QAEjC,mEAAmE;QACnE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;YACpC,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;CACF;AAtCD,8BAsCC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;AAC3D,CAAC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport type RefSchemaGetter<V> = () => Validator<V>\n\nexport class RefSchema<V = any> extends Validator<V> {\n readonly lexiconType = 'ref' as const\n\n #getter: RefSchemaGetter<V>\n\n constructor(getter: RefSchemaGetter<V>) {\n // @NOTE In order to avoid circular dependency issues, we don't resolve\n // the schema here. Instead, we resolve it lazily when first accessed.\n\n super()\n\n this.#getter = getter\n }\n\n get schema(): Validator<V> {\n const value = this.#getter.call(null)\n\n // Prevents a getter from depending on itself recursively, also allows GC to\n // clean up the getter function.\n this.#getter = throwAlreadyCalled\n\n // Disable the getter and cache the resolved schema on the instance\n Object.defineProperty(this, 'schema', {\n value,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return value\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<V> {\n return ctx.validate(input, this.schema)\n }\n}\n\nfunction throwAlreadyCalled(): never {\n throw new Error('RefSchema getter called multiple times')\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { InferStringFormat, StringFormat, UnknownString } from '../core.js';
|
|
2
|
+
import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
3
|
+
export type StringSchemaOptions = {
|
|
4
|
+
default?: string;
|
|
5
|
+
knownValues?: readonly string[];
|
|
6
|
+
format?: StringFormat;
|
|
7
|
+
minLength?: number;
|
|
8
|
+
maxLength?: number;
|
|
9
|
+
minGraphemes?: number;
|
|
10
|
+
maxGraphemes?: number;
|
|
11
|
+
};
|
|
12
|
+
export type StringSchemaOutput<Options> = Options extends {
|
|
13
|
+
format: infer F extends StringFormat;
|
|
14
|
+
} ? InferStringFormat<F> : Options extends {
|
|
15
|
+
knownValues: readonly (infer K extends string)[];
|
|
16
|
+
} ? K | UnknownString : string;
|
|
17
|
+
export declare class StringSchema<const Options extends StringSchemaOptions = any> extends Validator<StringSchemaOutput<Options>> {
|
|
18
|
+
readonly options: Options;
|
|
19
|
+
readonly lexiconType: "string";
|
|
20
|
+
constructor(options: Options);
|
|
21
|
+
validateInContext(input: unknown | undefined, ctx: ValidatorContext): ValidationResult<StringSchemaOutput<Options>>;
|
|
22
|
+
}
|
|
23
|
+
export declare function coerceToString(input: unknown): string | null;
|
|
24
|
+
//# sourceMappingURL=string.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/schema/string.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,OAAO,IAEpC,OAAO,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,SAAS,YAAY,CAAA;CAAE,GACpD,iBAAiB,CAAC,CAAC,CAAC,GACpB,OAAO,SAAS;IAAE,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,EAAE,CAAA;CAAE,GAClE,CAAC,GAAG,aAAa,GACjB,MAAM,CAAA;AAEd,qBAAa,YAAY,CACvB,KAAK,CAAC,OAAO,SAAS,mBAAmB,GAAG,GAAG,CAC/C,SAAQ,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAGlC,QAAQ,CAAC,OAAO,EAAE,OAAO;IAFrC,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAS;gBAEnB,OAAO,EAAE,OAAO;IAI5B,iBAAiB,CAExB,KAAK,EAAE,OAAO,YAAuB,EACrC,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;CA6DjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkC5D"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StringSchema = void 0;
|
|
4
|
+
exports.coerceToString = coerceToString;
|
|
5
|
+
const lex_data_1 = require("@atproto/lex-data");
|
|
6
|
+
const core_js_1 = require("../core.js");
|
|
7
|
+
const validation_js_1 = require("../validation.js");
|
|
8
|
+
const token_js_1 = require("./token.js");
|
|
9
|
+
class StringSchema extends validation_js_1.Validator {
|
|
10
|
+
options;
|
|
11
|
+
lexiconType = 'string';
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super();
|
|
14
|
+
this.options = options;
|
|
15
|
+
}
|
|
16
|
+
validateInContext(
|
|
17
|
+
// @NOTE validation will be applied on the default value as well
|
|
18
|
+
input = this.options.default, ctx) {
|
|
19
|
+
const { options } = this;
|
|
20
|
+
const str = coerceToString(input);
|
|
21
|
+
if (str == null) {
|
|
22
|
+
return ctx.issueInvalidType(input, 'string');
|
|
23
|
+
}
|
|
24
|
+
let lazyUtf8Len;
|
|
25
|
+
const { minLength } = options;
|
|
26
|
+
if (minLength != null) {
|
|
27
|
+
if ((lazyUtf8Len ??= (0, lex_data_1.utf8Len)(str)) < minLength) {
|
|
28
|
+
return ctx.issueTooSmall(str, 'string', minLength, lazyUtf8Len);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const { maxLength } = options;
|
|
32
|
+
if (maxLength != null) {
|
|
33
|
+
// Optimization: we can avoid computing the UTF-8 length if the maximum
|
|
34
|
+
// possible length, in bytes, of the input JS string is smaller than the
|
|
35
|
+
// maxLength (in UTF-8 string bytes).
|
|
36
|
+
if (str.length * 3 <= maxLength) {
|
|
37
|
+
// Input string so small it can't possibly exceed maxLength
|
|
38
|
+
}
|
|
39
|
+
else if ((lazyUtf8Len ??= (0, lex_data_1.utf8Len)(str)) > maxLength) {
|
|
40
|
+
return ctx.issueTooBig(str, 'string', maxLength, lazyUtf8Len);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
let lazyGraphLen;
|
|
44
|
+
const { minGraphemes } = options;
|
|
45
|
+
if (minGraphemes != null) {
|
|
46
|
+
// Optimization: avoid counting graphemes if the length check already fails
|
|
47
|
+
if (str.length < minGraphemes) {
|
|
48
|
+
return ctx.issueTooSmall(str, 'grapheme', minGraphemes, str.length);
|
|
49
|
+
}
|
|
50
|
+
else if ((lazyGraphLen ??= (0, lex_data_1.graphemeLen)(str)) < minGraphemes) {
|
|
51
|
+
return ctx.issueTooSmall(str, 'grapheme', minGraphemes, lazyGraphLen);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const { maxGraphemes } = options;
|
|
55
|
+
if (maxGraphemes != null) {
|
|
56
|
+
if ((lazyGraphLen ??= (0, lex_data_1.graphemeLen)(str)) > maxGraphemes) {
|
|
57
|
+
return ctx.issueTooBig(str, 'grapheme', maxGraphemes, lazyGraphLen);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (options.format !== undefined) {
|
|
61
|
+
try {
|
|
62
|
+
// @TODO optimize to avoid throw cost (requires re-writing utilities
|
|
63
|
+
// from @atproto/syntax)
|
|
64
|
+
(0, core_js_1.assertStringFormat)(str, options.format);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const message = err instanceof Error ? err.message : undefined;
|
|
68
|
+
return ctx.issueInvalidFormat(str, options.format, message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return ctx.success(str);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.StringSchema = StringSchema;
|
|
75
|
+
function coerceToString(input) {
|
|
76
|
+
switch (typeof input) {
|
|
77
|
+
case 'string':
|
|
78
|
+
return input;
|
|
79
|
+
case 'object': {
|
|
80
|
+
if (input == null)
|
|
81
|
+
return null;
|
|
82
|
+
// @NOTE Allow using TokenSchema instances in places expecting strings,
|
|
83
|
+
// converting them to their string value.
|
|
84
|
+
if (input instanceof token_js_1.TokenSchema) {
|
|
85
|
+
return input.toString();
|
|
86
|
+
}
|
|
87
|
+
if (input instanceof Date) {
|
|
88
|
+
if (Number.isNaN(input.getTime()))
|
|
89
|
+
return null;
|
|
90
|
+
return input.toISOString();
|
|
91
|
+
}
|
|
92
|
+
if (input instanceof URL) {
|
|
93
|
+
return input.toString();
|
|
94
|
+
}
|
|
95
|
+
const cid = lex_data_1.CID.asCID(input);
|
|
96
|
+
if (cid)
|
|
97
|
+
return cid.toString();
|
|
98
|
+
if (input instanceof String) {
|
|
99
|
+
return input.valueOf();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// falls through
|
|
103
|
+
default:
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/schema/string.ts"],"names":[],"mappings":"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","sourcesContent":["import { CID, graphemeLen, utf8Len } from '@atproto/lex-data'\nimport {\n InferStringFormat,\n StringFormat,\n UnknownString,\n assertStringFormat,\n} from '../core.js'\nimport { ValidationResult, Validator, ValidatorContext } from '../validation.js'\nimport { TokenSchema } from './token.js'\n\nexport type StringSchemaOptions = {\n default?: string\n knownValues?: readonly string[]\n format?: StringFormat\n minLength?: number\n maxLength?: number\n minGraphemes?: number\n maxGraphemes?: number\n}\n\nexport type StringSchemaOutput<Options> =\n //\n Options extends { format: infer F extends StringFormat }\n ? InferStringFormat<F>\n : Options extends { knownValues: readonly (infer K extends string)[] }\n ? K | UnknownString\n : string\n\nexport class StringSchema<\n const Options extends StringSchemaOptions = any,\n> extends Validator<StringSchemaOutput<Options>> {\n readonly lexiconType = 'string' as const\n\n constructor(readonly options: Options) {\n super()\n }\n\n override validateInContext(\n // @NOTE validation will be applied on the default value as well\n input: unknown = this.options.default,\n ctx: ValidatorContext,\n ): ValidationResult<StringSchemaOutput<Options>> {\n const { options } = this\n\n const str = coerceToString(input)\n if (str == null) {\n return ctx.issueInvalidType(input, 'string')\n }\n\n let lazyUtf8Len: number\n\n const { minLength } = options\n if (minLength != null) {\n if ((lazyUtf8Len ??= utf8Len(str)) < minLength) {\n return ctx.issueTooSmall(str, 'string', minLength, lazyUtf8Len)\n }\n }\n\n const { maxLength } = options\n if (maxLength != null) {\n // Optimization: we can avoid computing the UTF-8 length if the maximum\n // possible length, in bytes, of the input JS string is smaller than the\n // maxLength (in UTF-8 string bytes).\n if (str.length * 3 <= maxLength) {\n // Input string so small it can't possibly exceed maxLength\n } else if ((lazyUtf8Len ??= utf8Len(str)) > maxLength) {\n return ctx.issueTooBig(str, 'string', maxLength, lazyUtf8Len)\n }\n }\n\n let lazyGraphLen: number\n\n const { minGraphemes } = options\n if (minGraphemes != null) {\n // Optimization: avoid counting graphemes if the length check already fails\n if (str.length < minGraphemes) {\n return ctx.issueTooSmall(str, 'grapheme', minGraphemes, str.length)\n } else if ((lazyGraphLen ??= graphemeLen(str)) < minGraphemes) {\n return ctx.issueTooSmall(str, 'grapheme', minGraphemes, lazyGraphLen)\n }\n }\n\n const { maxGraphemes } = options\n if (maxGraphemes != null) {\n if ((lazyGraphLen ??= graphemeLen(str)) > maxGraphemes) {\n return ctx.issueTooBig(str, 'grapheme', maxGraphemes, lazyGraphLen)\n }\n }\n\n if (options.format !== undefined) {\n try {\n // @TODO optimize to avoid throw cost (requires re-writing utilities\n // from @atproto/syntax)\n assertStringFormat(str, options.format)\n } catch (err) {\n const message = err instanceof Error ? err.message : undefined\n return ctx.issueInvalidFormat(str, options.format, message)\n }\n }\n\n return ctx.success(str as StringSchemaOutput<Options>)\n }\n}\n\nexport function coerceToString(input: unknown): string | null {\n switch (typeof input) {\n case 'string':\n return input\n case 'object': {\n if (input == null) return null\n\n // @NOTE Allow using TokenSchema instances in places expecting strings,\n // converting them to their string value.\n if (input instanceof TokenSchema) {\n return input.toString()\n }\n\n if (input instanceof Date) {\n if (Number.isNaN(input.getTime())) return null\n return input.toISOString()\n }\n\n if (input instanceof URL) {\n return input.toString()\n }\n\n const cid = CID.asCID(input)\n if (cid) return cid.toString()\n\n if (input instanceof String) {\n return input.valueOf()\n }\n }\n\n // falls through\n default:\n return null\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Infer } from '../validation.js';
|
|
2
|
+
import { ObjectSchema } from './object.js';
|
|
3
|
+
import { ParamsSchema } from './params.js';
|
|
4
|
+
import { RefSchema } from './ref.js';
|
|
5
|
+
import { TypedUnionSchema } from './typed-union.js';
|
|
6
|
+
export type InferSubscriptionParameters<S extends Subscription> = S extends Subscription<any, infer P extends ParamsSchema, any> ? Infer<P> : never;
|
|
7
|
+
export type InferSubscriptionMessage<S extends Subscription> = S extends Subscription<any, any, infer M extends RefSchema | TypedUnionSchema | ObjectSchema> ? Infer<M> : unknown;
|
|
8
|
+
export declare class Subscription<N extends string = any, P extends ParamsSchema = any, M extends undefined | RefSchema | TypedUnionSchema | ObjectSchema = any, E extends undefined | readonly string[] = any> {
|
|
9
|
+
readonly nsid: N;
|
|
10
|
+
readonly parameters: P;
|
|
11
|
+
readonly message: M;
|
|
12
|
+
readonly errors: E;
|
|
13
|
+
readonly type: "subscription";
|
|
14
|
+
constructor(nsid: N, parameters: P, message: M, errors: E);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,YAAY,IAC5D,CAAC,SAAS,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,YAAY,EAAE,GAAG,CAAC,GAC1D,KAAK,CAAC,CAAC,CAAC,GACR,KAAK,CAAA;AAEX,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,YAAY,IACzD,CAAC,SAAS,YAAY,CACpB,GAAG,EACH,GAAG,EACH,MAAM,CAAC,SAAS,SAAS,GAAG,gBAAgB,GAAG,YAAY,CAC5D,GACG,KAAK,CAAC,CAAC,CAAC,GACR,OAAO,CAAA;AAEb,qBAAa,YAAY,CACvB,CAAC,SAAS,MAAM,GAAG,GAAG,EACtB,CAAC,SAAS,YAAY,GAAG,GAAG,EAC5B,CAAC,SAAS,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,YAAY,GAAG,GAAG,EACvE,CAAC,SAAS,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG;IAK3C,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChB,QAAQ,CAAC,UAAU,EAAE,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,CAAC;IANpB,QAAQ,CAAC,IAAI,EAAG,cAAc,CAAS;gBAG5B,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,CAAC,EACb,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,CAAC;CAErB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Subscription = void 0;
|
|
4
|
+
class Subscription {
|
|
5
|
+
nsid;
|
|
6
|
+
parameters;
|
|
7
|
+
message;
|
|
8
|
+
errors;
|
|
9
|
+
type = 'subscription';
|
|
10
|
+
constructor(nsid, parameters, message, errors) {
|
|
11
|
+
this.nsid = nsid;
|
|
12
|
+
this.parameters = parameters;
|
|
13
|
+
this.message = message;
|
|
14
|
+
this.errors = errors;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.Subscription = Subscription;
|
|
18
|
+
//# sourceMappingURL=subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":";;;AAoBA,MAAa,YAAY;IASZ;IACA;IACA;IACA;IANF,IAAI,GAAG,cAAuB,CAAA;IAEvC,YACW,IAAO,EACP,UAAa,EACb,OAAU,EACV,MAAS;QAHT,SAAI,GAAJ,IAAI,CAAG;QACP,eAAU,GAAV,UAAU,CAAG;QACb,YAAO,GAAP,OAAO,CAAG;QACV,WAAM,GAAN,MAAM,CAAG;IACjB,CAAC;CACL;AAdD,oCAcC","sourcesContent":["import { Infer } from '../validation.js'\nimport { ObjectSchema } from './object.js'\nimport { ParamsSchema } from './params.js'\nimport { RefSchema } from './ref.js'\nimport { TypedUnionSchema } from './typed-union.js'\n\nexport type InferSubscriptionParameters<S extends Subscription> =\n S extends Subscription<any, infer P extends ParamsSchema, any>\n ? Infer<P>\n : never\n\nexport type InferSubscriptionMessage<S extends Subscription> =\n S extends Subscription<\n any,\n any,\n infer M extends RefSchema | TypedUnionSchema | ObjectSchema\n >\n ? Infer<M>\n : unknown\n\nexport class Subscription<\n N extends string = any,\n P extends ParamsSchema = any,\n M extends undefined | RefSchema | TypedUnionSchema | ObjectSchema = any,\n E extends undefined | readonly string[] = any,\n> {\n readonly type = 'subscription' as const\n\n constructor(\n readonly nsid: N,\n readonly parameters: P,\n readonly message: M,\n readonly errors: E,\n ) {}\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
2
|
+
export declare class TokenSchema<V extends string = any> extends Validator<V> {
|
|
3
|
+
protected readonly value: V;
|
|
4
|
+
readonly lexiconType: "token";
|
|
5
|
+
constructor(value: V);
|
|
6
|
+
validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<V>;
|
|
7
|
+
toJSON(): string;
|
|
8
|
+
toString(): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/schema/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAGvD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAFvC,QAAQ,CAAC,WAAW,EAAG,OAAO,CAAS;gBAER,KAAK,EAAE,CAAC;IAI9B,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;IAqBtB,MAAM,IAAI,MAAM;IAIhB,QAAQ,IAAI,MAAM;CAGnB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenSchema = void 0;
|
|
4
|
+
const validation_js_1 = require("../validation.js");
|
|
5
|
+
class TokenSchema extends validation_js_1.Validator {
|
|
6
|
+
value;
|
|
7
|
+
lexiconType = 'token';
|
|
8
|
+
constructor(value) {
|
|
9
|
+
super();
|
|
10
|
+
this.value = value;
|
|
11
|
+
}
|
|
12
|
+
validateInContext(input, ctx) {
|
|
13
|
+
if (input === this.value) {
|
|
14
|
+
return ctx.success(this.value);
|
|
15
|
+
}
|
|
16
|
+
// @NOTE: allow using the token instance itself (but convert to the actual
|
|
17
|
+
// token value)
|
|
18
|
+
if (input instanceof TokenSchema && input.value === this.value) {
|
|
19
|
+
return ctx.success(this.value);
|
|
20
|
+
}
|
|
21
|
+
if (typeof input !== 'string') {
|
|
22
|
+
return ctx.issueInvalidType(input, 'token');
|
|
23
|
+
}
|
|
24
|
+
return ctx.issueInvalidValue(input, [this.value]);
|
|
25
|
+
}
|
|
26
|
+
// When using the TokenSchema instance as data, let's serialize it to the
|
|
27
|
+
// token value
|
|
28
|
+
toJSON() {
|
|
29
|
+
return this.value;
|
|
30
|
+
}
|
|
31
|
+
toString() {
|
|
32
|
+
return this.value;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.TokenSchema = TokenSchema;
|
|
36
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/schema/token.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAEhF,MAAa,WAAoC,SAAQ,yBAAY;IAGpC;IAFtB,WAAW,GAAG,OAAgB,CAAA;IAEvC,YAA+B,KAAQ;QACrC,KAAK,EAAE,CAAA;QADsB,UAAK,GAAL,KAAK,CAAG;IAEvC,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QAED,0EAA0E;QAC1E,eAAe;QACf,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/D,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACnD,CAAC;IAED,yEAAyE;IACzE,cAAc;IAEd,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF;AAtCD,kCAsCC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport class TokenSchema<V extends string = any> extends Validator<V> {\n readonly lexiconType = 'token' as const\n\n constructor(protected readonly value: V) {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<V> {\n if (input === this.value) {\n return ctx.success(this.value)\n }\n\n // @NOTE: allow using the token instance itself (but convert to the actual\n // token value)\n if (input instanceof TokenSchema && input.value === this.value) {\n return ctx.success(this.value)\n }\n\n if (typeof input !== 'string') {\n return ctx.issueInvalidType(input, 'token')\n }\n\n return ctx.issueInvalidValue(input, [this.value])\n }\n\n // When using the TokenSchema instance as data, let's serialize it to the\n // token value\n\n toJSON(): string {\n return this.value\n }\n\n toString(): string {\n return this.value\n }\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { $Type, Simplify } from '../core.js';
|
|
2
|
+
import { Infer, ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
3
|
+
export declare class TypedObjectSchema<Type extends $Type = any, Schema extends Validator<Record<string, unknown>> = any, Output extends Infer<Schema> & {
|
|
4
|
+
$type?: Type;
|
|
5
|
+
} = Infer<Schema> & {
|
|
6
|
+
$type?: Type;
|
|
7
|
+
}> extends Validator<Output> {
|
|
8
|
+
readonly $type: Type;
|
|
9
|
+
readonly schema: Schema;
|
|
10
|
+
readonly lexiconType: "object";
|
|
11
|
+
constructor($type: Type, schema: Schema);
|
|
12
|
+
isTypeOf<X extends {
|
|
13
|
+
$type?: unknown;
|
|
14
|
+
}>(value: X): value is X extends {
|
|
15
|
+
$type?: Type;
|
|
16
|
+
} ? X : never;
|
|
17
|
+
build<X extends Omit<Output, '$type'>>(input: X): Simplify<Omit<X, '$type'> & {
|
|
18
|
+
$type: Type;
|
|
19
|
+
}>;
|
|
20
|
+
$isTypeOf<X extends {
|
|
21
|
+
$type?: unknown;
|
|
22
|
+
}>(value: X): value is X extends {
|
|
23
|
+
$type?: Type;
|
|
24
|
+
} ? X : never;
|
|
25
|
+
$build<X extends Omit<Output, '$type'>>(input: X): Omit<X, "$type"> & {
|
|
26
|
+
$type: Type;
|
|
27
|
+
} extends infer T ? { [K in keyof T]: (Omit<X, "$type"> & {
|
|
28
|
+
$type: Type;
|
|
29
|
+
})[K]; } : never;
|
|
30
|
+
validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<Output>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=typed-object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-object.d.ts","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,qBAAa,iBAAiB,CAC5B,IAAI,SAAS,KAAK,GAAG,GAAG,EACxB,MAAM,SAAS,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,EACvD,MAAM,SAAS,KAAK,CAAC,MAAM,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG;IAChE,KAAK,CAAC,EAAE,IAAI,CAAA;CACb,CACD,SAAQ,SAAS,CAAC,MAAM,CAAC;IAIvB,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAJzB,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAS;gBAG7B,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,MAAM;IAKzB,QAAQ,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EACpC,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,CAAC,GAAG,KAAK;IAIlD,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;gBAVjB,IAAI;;IAcpC,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;CAe5B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypedObjectSchema = void 0;
|
|
4
|
+
const lex_data_1 = require("@atproto/lex-data");
|
|
5
|
+
const validation_js_1 = require("../validation.js");
|
|
6
|
+
class TypedObjectSchema extends validation_js_1.Validator {
|
|
7
|
+
$type;
|
|
8
|
+
schema;
|
|
9
|
+
lexiconType = 'object';
|
|
10
|
+
constructor($type, schema) {
|
|
11
|
+
super();
|
|
12
|
+
this.$type = $type;
|
|
13
|
+
this.schema = schema;
|
|
14
|
+
}
|
|
15
|
+
isTypeOf(value) {
|
|
16
|
+
return value.$type === undefined || value.$type === this.$type;
|
|
17
|
+
}
|
|
18
|
+
build(input) {
|
|
19
|
+
return { ...input, $type: this.$type };
|
|
20
|
+
}
|
|
21
|
+
$isTypeOf(value) {
|
|
22
|
+
return this.isTypeOf(value);
|
|
23
|
+
}
|
|
24
|
+
$build(input) {
|
|
25
|
+
return this.build(input);
|
|
26
|
+
}
|
|
27
|
+
validateInContext(input, ctx) {
|
|
28
|
+
if (!(0, lex_data_1.isPlainObject)(input)) {
|
|
29
|
+
return ctx.issueInvalidType(input, 'object');
|
|
30
|
+
}
|
|
31
|
+
if ('$type' in input &&
|
|
32
|
+
input.$type !== undefined &&
|
|
33
|
+
input.$type !== this.$type) {
|
|
34
|
+
return ctx.issueInvalidPropertyValue(input, '$type', [this.$type]);
|
|
35
|
+
}
|
|
36
|
+
return ctx.validate(input, this.schema);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.TypedObjectSchema = TypedObjectSchema;
|
|
40
|
+
//# sourceMappingURL=typed-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-object.js","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AAEjD,oDAKyB;AAEzB,MAAa,iBAMX,SAAQ,yBAAiB;IAId;IACA;IAJF,WAAW,GAAG,QAAiB,CAAA;IAExC,YACW,KAAW,EACX,MAAc;QAEvB,KAAK,EAAE,CAAA;QAHE,UAAK,GAAL,KAAK,CAAM;QACX,WAAM,GAAN,MAAM,CAAQ;IAGzB,CAAC;IAED,QAAQ,CACN,KAAQ;QAER,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAA;IAChE,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,IAAI,CAAC,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAED,IACE,OAAO,IAAI,KAAK;YAChB,KAAK,CAAC,KAAK,KAAK,SAAS;YACzB,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAC1B,CAAC;YACD,OAAO,GAAG,CAAC,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACpE,CAAC;QAED,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAA2B,CAAC,CAAA;IAC9D,CAAC;CACF;AAtDD,8CAsDC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { $Type, Simplify } from '../core.js'\nimport {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport class TypedObjectSchema<\n Type extends $Type = any,\n Schema extends Validator<Record<string, unknown>> = any,\n Output extends Infer<Schema> & { $type?: Type } = Infer<Schema> & {\n $type?: Type\n },\n> extends Validator<Output> {\n readonly lexiconType = 'object' as const\n\n constructor(\n readonly $type: Type,\n readonly schema: Schema,\n ) {\n super()\n }\n\n isTypeOf<X extends { $type?: unknown }>(\n value: X,\n ): value is X extends { $type?: Type } ? X : never {\n return value.$type === undefined || 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 if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'object')\n }\n\n if (\n '$type' in input &&\n input.$type !== undefined &&\n input.$type !== this.$type\n ) {\n return ctx.issueInvalidPropertyValue(input, '$type', [this.$type])\n }\n\n return ctx.validate(input, this.schema as Validator<Output>)\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
2
|
+
export type TypedRefSchemaValidator<V extends {
|
|
3
|
+
$type?: string;
|
|
4
|
+
} = any> = V extends {
|
|
5
|
+
$type?: infer T extends string;
|
|
6
|
+
} ? {
|
|
7
|
+
$type: T;
|
|
8
|
+
} & Validator<V & {
|
|
9
|
+
$type?: T;
|
|
10
|
+
}> : never;
|
|
11
|
+
export type TypedRefGetter<V extends {
|
|
12
|
+
$type?: string;
|
|
13
|
+
} = any> = () => TypedRefSchemaValidator<V>;
|
|
14
|
+
export type TypedRefSchemaOutput<V extends {
|
|
15
|
+
$type?: string;
|
|
16
|
+
} = any> = V extends {
|
|
17
|
+
$type?: infer T extends string;
|
|
18
|
+
} ? V & {
|
|
19
|
+
$type: T;
|
|
20
|
+
} : never;
|
|
21
|
+
export declare class TypedRefSchema<V extends {
|
|
22
|
+
$type?: string;
|
|
23
|
+
} = any> extends Validator<TypedRefSchemaOutput<V>> {
|
|
24
|
+
#private;
|
|
25
|
+
constructor(getter: TypedRefGetter<V>);
|
|
26
|
+
get schema(): TypedRefSchemaValidator<V>;
|
|
27
|
+
get $type(): TypedRefSchemaOutput<V>['$type'];
|
|
28
|
+
validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<TypedRefSchemaOutput<V>>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=typed-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-ref.d.ts","sourceRoot":"","sources":["../../src/schema/typed-ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGhF,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IACpE,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GACxC;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC,GAC3C,KAAK,CAAA;AAEX,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IAC3D,MAAM,uBAAuB,CAAC,CAAC,CAAC,CAAA;AAElC,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IACjE,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GAAG,CAAC,GAAG;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,KAAK,CAAA;AAEzE,qBAAa,cAAc,CACzB,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAClC,SAAQ,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;;gBAG9B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IASrC,IAAI,MAAM,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAgBvC;IAED,IAAI,KAAK,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAE5C;IAEQ,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;CAU7C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypedRefSchema = void 0;
|
|
4
|
+
const validation_js_1 = require("../validation.js");
|
|
5
|
+
class TypedRefSchema extends validation_js_1.Validator {
|
|
6
|
+
#getter;
|
|
7
|
+
constructor(getter) {
|
|
8
|
+
// @NOTE In order to avoid circular dependency issues, we don't resolve
|
|
9
|
+
// the schema here. Instead, we resolve it lazily when first accessed.
|
|
10
|
+
super();
|
|
11
|
+
this.#getter = getter;
|
|
12
|
+
}
|
|
13
|
+
get schema() {
|
|
14
|
+
const value = this.#getter.call(null);
|
|
15
|
+
// Prevents a getter from depending on itself recursively, also allows GC to
|
|
16
|
+
// clean up the getter function.
|
|
17
|
+
this.#getter = throwAlreadyCalled;
|
|
18
|
+
// Cache the resolved schema on the instance
|
|
19
|
+
Object.defineProperty(this, 'schema', {
|
|
20
|
+
value,
|
|
21
|
+
writable: false,
|
|
22
|
+
enumerable: false,
|
|
23
|
+
configurable: true,
|
|
24
|
+
});
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
get $type() {
|
|
28
|
+
return this.schema.$type;
|
|
29
|
+
}
|
|
30
|
+
validateInContext(input, ctx) {
|
|
31
|
+
const result = ctx.validate(input, this.schema);
|
|
32
|
+
if (!result.success)
|
|
33
|
+
return result;
|
|
34
|
+
if (result.value.$type !== this.$type) {
|
|
35
|
+
return ctx.issueInvalidPropertyValue(result.value, '$type', [this.$type]);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.TypedRefSchema = TypedRefSchema;
|
|
41
|
+
function throwAlreadyCalled() {
|
|
42
|
+
throw new Error('TypedRefSchema getter called multiple times');
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=typed-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-ref.js","sourceRoot":"","sources":["../../src/schema/typed-ref.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAchF,MAAa,cAEX,SAAQ,yBAAkC;IAC1C,OAAO,CAAmB;IAE1B,YAAY,MAAyB;QACnC,uEAAuE;QACvE,sEAAsE;QAEtE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,MAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAErC,4EAA4E;QAC5E,gCAAgC;QAChC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAA;QAEjC,4CAA4C;QAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;YACpC,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;IAC1B,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAA;QAElC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,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,MAAmD,CAAA;IAC5D,CAAC;CACF;AAjDD,wCAiDC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;AAChE,CAAC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\n// Basically a RecordSchema or TypedObjectSchema\nexport type TypedRefSchemaValidator<V extends { $type?: string } = any> =\n V extends { $type?: infer T extends string }\n ? { $type: T } & Validator<V & { $type?: T }>\n : never\n\nexport type TypedRefGetter<V extends { $type?: string } = any> =\n () => TypedRefSchemaValidator<V>\n\nexport type TypedRefSchemaOutput<V extends { $type?: string } = any> =\n V extends { $type?: infer T extends string } ? V & { $type: T } : never\n\nexport class TypedRefSchema<\n V extends { $type?: string } = any,\n> extends Validator<TypedRefSchemaOutput<V>> {\n #getter: TypedRefGetter<V>\n\n constructor(getter: TypedRefGetter<V>) {\n // @NOTE In order to avoid circular dependency issues, we don't resolve\n // the schema here. Instead, we resolve it lazily when first accessed.\n\n super()\n\n this.#getter = getter\n }\n\n get schema(): TypedRefSchemaValidator<V> {\n const value = this.#getter.call(null)\n\n // Prevents a getter from depending on itself recursively, also allows GC to\n // clean up the getter function.\n this.#getter = throwAlreadyCalled\n\n // Cache the resolved schema on the instance\n Object.defineProperty(this, 'schema', {\n value,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return value\n }\n\n get $type(): TypedRefSchemaOutput<V>['$type'] {\n return this.schema.$type\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<TypedRefSchemaOutput<V>> {\n const result = ctx.validate(input, this.schema)\n if (!result.success) return result\n\n if (result.value.$type !== this.$type) {\n return ctx.issueInvalidPropertyValue(result.value, '$type', [this.$type])\n }\n\n return result as ValidationResult<TypedRefSchemaOutput<V>>\n }\n}\n\nfunction throwAlreadyCalled(): never {\n throw new Error('TypedRefSchema getter called multiple times')\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Restricted, UnknownString } from '../core.js';
|
|
2
|
+
import { Infer, ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
3
|
+
import { TypedRefSchema, TypedRefSchemaOutput } from './typed-ref.js';
|
|
4
|
+
export type TypedRef<T extends {
|
|
5
|
+
$type?: string;
|
|
6
|
+
}> = TypedRefSchemaOutput<T>;
|
|
7
|
+
export type TypedObject = {
|
|
8
|
+
$type: UnknownString;
|
|
9
|
+
} & {
|
|
10
|
+
[K in string]: Restricted<'Unknown property'>;
|
|
11
|
+
};
|
|
12
|
+
type TypedRefSchemasToUnion<T extends readonly TypedRefSchema[]> = {
|
|
13
|
+
[K in keyof T]: Infer<T[K]>;
|
|
14
|
+
}[number];
|
|
15
|
+
export type TypedUnionSchemaOutput<TypedRefs extends readonly TypedRefSchema[], Closed extends boolean> = Closed extends true ? TypedRefSchemasToUnion<TypedRefs> : TypedRefSchemasToUnion<TypedRefs> | TypedObject;
|
|
16
|
+
export declare class TypedUnionSchema<TypedRefs extends readonly TypedRefSchema[] = any, Closed extends boolean = any> extends Validator<TypedUnionSchemaOutput<TypedRefs, Closed>> {
|
|
17
|
+
protected readonly refs: TypedRefs;
|
|
18
|
+
readonly closed: Closed;
|
|
19
|
+
readonly lexiconType: "union";
|
|
20
|
+
constructor(refs: TypedRefs, closed: Closed);
|
|
21
|
+
protected get refsMap(): Map<unknown, TypedRefs[number]>;
|
|
22
|
+
get $types(): unknown[];
|
|
23
|
+
validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<TypedUnionSchemaOutput<TypedRefs, Closed>>;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=typed-union.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-union.d.ts","sourceRoot":"","sources":["../../src/schema/typed-union.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAErE,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAA;AAE5E,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,GAAG;KAgBlD,CAAC,IAAI,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC;CAC9C,CAAA;AAED,KAAK,sBAAsB,CAAC,CAAC,SAAS,SAAS,cAAc,EAAE,IAAI;KAChE,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5B,CAAC,MAAM,CAAC,CAAA;AAET,MAAM,MAAM,sBAAsB,CAChC,SAAS,SAAS,SAAS,cAAc,EAAE,EAC3C,MAAM,SAAS,OAAO,IACpB,MAAM,SAAS,IAAI,GACnB,sBAAsB,CAAC,SAAS,CAAC,GACjC,sBAAsB,CAAC,SAAS,CAAC,GAAG,WAAW,CAAA;AAEnD,qBAAa,gBAAgB,CAC3B,SAAS,SAAS,SAAS,cAAc,EAAE,GAAG,GAAG,EACjD,MAAM,SAAS,OAAO,GAAG,GAAG,CAC5B,SAAQ,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAI1D,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS;aAClB,MAAM,EAAE,MAAM;IAJhC,QAAQ,CAAC,WAAW,EAAG,OAAO,CAAS;gBAGlB,IAAI,EAAE,SAAS,EAClB,MAAM,EAAE,MAAM;IAShC,SAAS,KAAK,OAAO,oCAapB;IAED,IAAI,MAAM,cAET;IAEQ,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;CAwB/D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypedUnionSchema = void 0;
|
|
4
|
+
const lex_data_1 = require("@atproto/lex-data");
|
|
5
|
+
const validation_js_1 = require("../validation.js");
|
|
6
|
+
class TypedUnionSchema extends validation_js_1.Validator {
|
|
7
|
+
refs;
|
|
8
|
+
closed;
|
|
9
|
+
lexiconType = 'union';
|
|
10
|
+
constructor(refs, closed) {
|
|
11
|
+
// @NOTE In order to avoid circular dependency issues, we don't access the
|
|
12
|
+
// refs's schema (or $type) here. Instead, we access them lazily when first
|
|
13
|
+
// needed.
|
|
14
|
+
super();
|
|
15
|
+
this.refs = refs;
|
|
16
|
+
this.closed = closed;
|
|
17
|
+
}
|
|
18
|
+
get refsMap() {
|
|
19
|
+
const map = new Map();
|
|
20
|
+
for (const ref of this.refs)
|
|
21
|
+
map.set(ref.$type, ref);
|
|
22
|
+
// Cache the map on the instance
|
|
23
|
+
Object.defineProperty(this, 'refsMap', {
|
|
24
|
+
value: map,
|
|
25
|
+
writable: false,
|
|
26
|
+
enumerable: false,
|
|
27
|
+
configurable: true,
|
|
28
|
+
});
|
|
29
|
+
return map;
|
|
30
|
+
}
|
|
31
|
+
get $types() {
|
|
32
|
+
return Array.from(this.refsMap.keys());
|
|
33
|
+
}
|
|
34
|
+
validateInContext(input, ctx) {
|
|
35
|
+
if (!(0, lex_data_1.isPlainObject)(input) || !('$type' in input)) {
|
|
36
|
+
return ctx.issueInvalidType(input, '$typed');
|
|
37
|
+
}
|
|
38
|
+
const { $type } = input;
|
|
39
|
+
const def = this.refsMap.get($type);
|
|
40
|
+
if (def) {
|
|
41
|
+
const result = ctx.validate(input, def);
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
if (this.closed) {
|
|
45
|
+
return ctx.issueInvalidPropertyValue(input, '$type', this.$types);
|
|
46
|
+
}
|
|
47
|
+
if (typeof $type !== 'string') {
|
|
48
|
+
return ctx.issueInvalidPropertyType(input, '$type', 'string');
|
|
49
|
+
}
|
|
50
|
+
return ctx.success(input);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.TypedUnionSchema = TypedUnionSchema;
|
|
54
|
+
//# sourceMappingURL=typed-union.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-union.js","sourceRoot":"","sources":["../../src/schema/typed-union.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AAEjD,oDAKyB;AAmCzB,MAAa,gBAGX,SAAQ,yBAAoD;IAIvC;IACH;IAJT,WAAW,GAAG,OAAgB,CAAA;IAEvC,YACqB,IAAe,EAClB,MAAc;QAE9B,0EAA0E;QAC1E,2EAA2E;QAC3E,UAAU;QAEV,KAAK,EAAE,CAAA;QAPY,SAAI,GAAJ,IAAI,CAAW;QAClB,WAAM,GAAN,MAAM,CAAQ;IAOhC,CAAC;IAED,IAAc,OAAO;QACnB,MAAM,GAAG,GAAG,IAAI,GAAG,EAA8B,CAAA;QACjD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAEpD,gCAAgC;QAChC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE;YACrC,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,IAAI,MAAM;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,IAAI,CAAC,IAAA,wBAAa,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;QAEvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACnC,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACvC,OAAO,MAEN,CAAA;QACH,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACnE,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAkD,CAAC,CAAA;IACxE,CAAC;CACF;AA/DD,4CA+DC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { Restricted, UnknownString } from '../core.js'\nimport {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { TypedRefSchema, TypedRefSchemaOutput } from './typed-ref.js'\n\nexport type TypedRef<T extends { $type?: string }> = TypedRefSchemaOutput<T>\n\nexport type TypedObject = { $type: UnknownString } & {\n // In order to prevent places that expect an open union from accepting an\n // invalid version of the known typed objects, we need to prevent any other\n // properties from being present.\n //\n // For example, if an open union expects:\n // ```ts\n // TypedObject | { $type: 'A'; a: number }\n // ```\n // we don't want it to accept:\n // ```ts\n // { $type: 'A' }\n // ```\n // Which would be the case as `{ $type: 'A' }` is a valid\n // `TypedObject`. By adding an index signature that forbids any\n // property, we ensure that only valid known typed objects can be used.\n [K in string]: Restricted<'Unknown property'>\n}\n\ntype TypedRefSchemasToUnion<T extends readonly TypedRefSchema[]> = {\n [K in keyof T]: Infer<T[K]>\n}[number]\n\nexport type TypedUnionSchemaOutput<\n TypedRefs extends readonly TypedRefSchema[],\n Closed extends boolean,\n> = Closed extends true\n ? TypedRefSchemasToUnion<TypedRefs>\n : TypedRefSchemasToUnion<TypedRefs> | TypedObject\n\nexport class TypedUnionSchema<\n TypedRefs extends readonly TypedRefSchema[] = any,\n Closed extends boolean = any,\n> extends Validator<TypedUnionSchemaOutput<TypedRefs, Closed>> {\n readonly lexiconType = 'union' as const\n\n constructor(\n protected readonly refs: TypedRefs,\n public readonly closed: Closed,\n ) {\n // @NOTE In order to avoid circular dependency issues, we don't access the\n // refs's schema (or $type) here. Instead, we access them lazily when first\n // needed.\n\n super()\n }\n\n protected get refsMap() {\n const map = new Map<unknown, TypedRefs[number]>()\n for (const ref of this.refs) map.set(ref.$type, ref)\n\n // Cache the map on the instance\n Object.defineProperty(this, 'refsMap', {\n value: map,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return map\n }\n\n get $types() {\n return Array.from(this.refsMap.keys())\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<TypedUnionSchemaOutput<TypedRefs, Closed>> {\n if (!isPlainObject(input) || !('$type' in input)) {\n return ctx.issueInvalidType(input, '$typed')\n }\n\n const { $type } = input\n\n const def = this.refsMap.get($type)\n if (def) {\n const result = ctx.validate(input, def)\n return result as ValidationResult<\n TypedUnionSchemaOutput<TypedRefs, Closed>\n >\n }\n\n if (this.closed) {\n return ctx.issueInvalidPropertyValue(input, '$type', this.$types)\n }\n if (typeof $type !== 'string') {\n return ctx.issueInvalidPropertyType(input, '$type', 'string')\n }\n\n return ctx.success(input as TypedUnionSchemaOutput<TypedRefs, Closed>)\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Infer, ValidationResult, Validator, ValidatorContext } from '../validation.js';
|
|
2
|
+
export type UnionSchemaValidators = readonly [Validator, ...Validator[]];
|
|
3
|
+
export type UnionSchemaOutput<V extends readonly Validator[]> = Infer<V[number]>;
|
|
4
|
+
export declare class UnionSchema<V extends UnionSchemaValidators = any> extends Validator<UnionSchemaOutput<V>> {
|
|
5
|
+
protected readonly validators: V;
|
|
6
|
+
constructor(validators: V);
|
|
7
|
+
validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<UnionSchemaOutput<V>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=union.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"union.d.ts","sourceRoot":"","sources":["../../src/schema/union.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAGL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,qBAAqB,GAAG,SAAS,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC,CAAA;AACxE,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,SAAS,SAAS,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAEhF,qBAAa,WAAW,CACtB,CAAC,SAAS,qBAAqB,GAAG,GAAG,CACrC,SAAQ,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC3B,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAAb,UAAU,EAAE,CAAC;IAInC,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAiB1C"}
|