@atproto/lex-schema 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/core/$type.d.ts +6 -3
- package/dist/core/$type.d.ts.map +1 -1
- package/dist/core/$type.js.map +1 -1
- package/dist/schema/blob.d.ts +2 -6
- package/dist/schema/blob.d.ts.map +1 -1
- package/dist/schema/blob.js.map +1 -1
- package/dist/schema/record.d.ts +9 -13
- package/dist/schema/record.d.ts.map +1 -1
- package/dist/schema/record.js +3 -1
- package/dist/schema/record.js.map +1 -1
- package/dist/schema/typed-object.d.ts +8 -12
- package/dist/schema/typed-object.d.ts.map +1 -1
- package/dist/schema/typed-object.js +3 -1
- package/dist/schema/typed-object.js.map +1 -1
- package/package.json +2 -2
- package/src/core/$type.ts +13 -2
- package/src/schema/blob.ts +2 -5
- package/src/schema/record.ts +7 -8
- package/src/schema/typed-object.ts +8 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @atproto/lex-schema
|
|
2
2
|
|
|
3
|
+
## 0.0.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#4501](https://github.com/bluesky-social/atproto/pull/4501) [`2f78893`](https://github.com/bluesky-social/atproto/commit/2f78893ace3bbf14d4bac36837820ddb46658c98) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Export new `$TypedMaybe` type util
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`2f78893`](https://github.com/bluesky-social/atproto/commit/2f78893ace3bbf14d4bac36837820ddb46658c98), [`2f78893`](https://github.com/bluesky-social/atproto/commit/2f78893ace3bbf14d4bac36837820ddb46658c98), [`2f78893`](https://github.com/bluesky-social/atproto/commit/2f78893ace3bbf14d4bac36837820ddb46658c98)]:
|
|
10
|
+
- @atproto/lex-data@0.0.6
|
|
11
|
+
|
|
3
12
|
## 0.0.6
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/dist/core/$type.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { NsidString } from './string-format.js';
|
|
2
|
-
import { OmitKey } from './types.js';
|
|
2
|
+
import { OmitKey, Simplify } from './types.js';
|
|
3
3
|
export type $Type<N extends NsidString = NsidString, H extends string = string> = N extends NsidString ? string extends H ? N | `${N}#${string}` : H extends 'main' ? N : `${N}#${H}` : never;
|
|
4
4
|
export type $TypeOf<O extends {
|
|
5
5
|
$type?: string;
|
|
6
6
|
}> = NonNullable<O['$type']>;
|
|
7
7
|
export declare function $type<N extends NsidString, H extends string>(nsid: N, hash: H): $Type<N, H>;
|
|
8
|
-
export type $Typed<V, T extends string = string> = V & {
|
|
8
|
+
export type $Typed<V, T extends string = string> = Simplify<V & {
|
|
9
9
|
$type: T;
|
|
10
|
-
}
|
|
10
|
+
}>;
|
|
11
|
+
export type $TypedMaybe<V, T extends string = string> = Simplify<V & {
|
|
12
|
+
$type?: T;
|
|
13
|
+
}>;
|
|
11
14
|
export type Un$Typed<V extends {
|
|
12
15
|
$type?: string;
|
|
13
16
|
}> = OmitKey<V, '$type'>;
|
package/dist/core/$type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"$type.d.ts","sourceRoot":"","sources":["../../src/core/$type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"$type.d.ts","sourceRoot":"","sources":["../../src/core/$type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,MAAM,KAAK,CACf,CAAC,SAAS,UAAU,GAAG,UAAU,EACjC,CAAC,SAAS,MAAM,GAAG,MAAM,IACvB,CAAC,SAAS,UAAU,GACpB,MAAM,SAAS,CAAC,GACd,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,EAAE,GACpB,CAAC,SAAS,MAAM,GACd,CAAC,GACD,GAAG,CAAC,IAAI,CAAC,EAAE,GACf,KAAK,CAAA;AAET,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,IAAI,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;AAG3E,wBAAgB,KAAK,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,MAAM,EAC1D,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,CAAC,GACN,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAEb;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CACzD,CAAC,GAAG;IACF,KAAK,EAAE,CAAC,CAAA;CACT,CACF,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAC9D,CAAC,GAAG;IACF,KAAK,CAAC,EAAE,CAAC,CAAA;CACV,CACF,CAAA;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA"}
|
package/dist/core/$type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"$type.js","sourceRoot":"","sources":["../../src/core/$type.ts"],"names":[],"mappings":";;AAiBA,sBAKC;AAND,wBAAwB;AACxB,SAAgB,KAAK,CACnB,IAAO,EACP,IAAO;IAEP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAgB,CAAA;AACpE,CAAC","sourcesContent":["import { NsidString } from './string-format.js'\nimport { OmitKey } from './types.js'\n\nexport type $Type<\n N extends NsidString = NsidString,\n H extends string = string,\n> = N extends NsidString\n ? string extends H\n ? N | `${N}#${string}`\n : H extends 'main'\n ? N\n : `${N}#${H}`\n : never\n\nexport type $TypeOf<O extends { $type?: string }> = NonNullable<O['$type']>\n\n/*@__NO_SIDE_EFFECTS__*/\nexport function $type<N extends NsidString, H extends string>(\n nsid: N,\n hash: H,\n): $Type<N, H> {\n return (hash === 'main' ? nsid : `${nsid}#${hash}`) as $Type<N, H>\n}\n\nexport type $Typed<V, T extends string = string> = V & {
|
|
1
|
+
{"version":3,"file":"$type.js","sourceRoot":"","sources":["../../src/core/$type.ts"],"names":[],"mappings":";;AAiBA,sBAKC;AAND,wBAAwB;AACxB,SAAgB,KAAK,CACnB,IAAO,EACP,IAAO;IAEP,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAgB,CAAA;AACpE,CAAC","sourcesContent":["import { NsidString } from './string-format.js'\nimport { OmitKey, Simplify } from './types.js'\n\nexport type $Type<\n N extends NsidString = NsidString,\n H extends string = string,\n> = N extends NsidString\n ? string extends H\n ? N | `${N}#${string}`\n : H extends 'main'\n ? N\n : `${N}#${H}`\n : never\n\nexport type $TypeOf<O extends { $type?: string }> = NonNullable<O['$type']>\n\n/*@__NO_SIDE_EFFECTS__*/\nexport function $type<N extends NsidString, H extends string>(\n nsid: N,\n hash: H,\n): $Type<N, H> {\n return (hash === 'main' ? nsid : `${nsid}#${hash}`) as $Type<N, H>\n}\n\nexport type $Typed<V, T extends string = string> = Simplify<\n V & {\n $type: T\n }\n>\n\nexport type $TypedMaybe<V, T extends string = string> = Simplify<\n V & {\n $type?: T\n }\n>\n\nexport type Un$Typed<V extends { $type?: string }> = OmitKey<V, '$type'>\n"]}
|
package/dist/schema/blob.d.ts
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import { BlobRef, LegacyBlobRef } from '@atproto/lex-data';
|
|
1
|
+
import { BlobRef, BlobRefValidationOptions, LegacyBlobRef } from '@atproto/lex-data';
|
|
2
2
|
import { Schema, ValidationResult, ValidatorContext } from '../core.js';
|
|
3
|
-
export type BlobSchemaOptions = {
|
|
3
|
+
export type BlobSchemaOptions = BlobRefValidationOptions & {
|
|
4
4
|
/**
|
|
5
5
|
* Whether to allow legacy blob references format
|
|
6
6
|
* @see {@link LegacyBlobRef}
|
|
7
7
|
*/
|
|
8
8
|
allowLegacy?: boolean;
|
|
9
|
-
/**
|
|
10
|
-
* Whether to enforce strict validation on the blob reference (CID version, codec, hash function)
|
|
11
|
-
*/
|
|
12
|
-
strict?: boolean;
|
|
13
9
|
/**
|
|
14
10
|
* List of accepted mime types
|
|
15
11
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../../src/schema/blob.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,aAAa,EAGd,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAEvE,MAAM,MAAM,iBAAiB,GAAG;
|
|
1
|
+
{"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../../src/schema/blob.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,wBAAwB,EACxB,aAAa,EAGd,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAEvE,MAAM,MAAM,iBAAiB,GAAG,wBAAwB,GAAG;IACzD;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;AAEtC,MAAM,MAAM,gBAAgB,CAAC,OAAO,IAAI,OAAO,SAAS;IAAE,WAAW,EAAE,IAAI,CAAA;CAAE,GACzE,OAAO,GAAG,aAAa,GACvB,OAAO,CAAA;AAEX,qBAAa,UAAU,CAAC,CAAC,SAAS,iBAAiB,CAAE,SAAQ,MAAM,CACjE,gBAAgB,CAAC,CAAC,CAAC,CACpB;IACa,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAAV,OAAO,EAAE,CAAC;IAI/B,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IA2BxC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAKnC"}
|
package/dist/schema/blob.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob.js","sourceRoot":"","sources":["../../src/schema/blob.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"blob.js","sourceRoot":"","sources":["../../src/schema/blob.ts"],"names":[],"mappings":";;;AAAA,gDAM0B;AAC1B,wCAAuE;AAwBvE,MAAa,UAAwC,SAAQ,gBAE5D;IACsB;IAArB,YAAqB,OAAU;QAC7B,KAAK,EAAE,CAAA;QADY,YAAO,GAAP,OAAO,CAAG;IAE/B,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,IAAI,GACP,KAAa,EAAE,KAAK,KAAK,SAAS;YACjC,CAAC,CAAC,IAAA,oBAAS,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;gBAC9B,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI;YACR,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI,IAAI,IAAA,0BAAe,EAAC,KAAK,CAAC;gBAC3D,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,CAAA;QAEZ,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC/B,IAAI,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAClD,OAAO,GAAG,CAAC,yBAAyB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;QAChE,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAChC,IAAI,OAAO,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;YAC7D,OAAO,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1D,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,IAA2B,CAAC,CAAA;IACjD,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAClC,CAAC;CACF;AA1CD,gCA0CC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,QAAkB;IACnD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACxC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC","sourcesContent":["import {\n BlobRef,\n BlobRefValidationOptions,\n LegacyBlobRef,\n isBlobRef,\n isLegacyBlobRef,\n} from '@atproto/lex-data'\nimport { Schema, ValidationResult, ValidatorContext } from '../core.js'\n\nexport type BlobSchemaOptions = BlobRefValidationOptions & {\n /**\n * Whether to allow legacy blob references format\n * @see {@link LegacyBlobRef}\n */\n allowLegacy?: boolean\n /**\n * List of accepted mime types\n */\n accept?: string[]\n /**\n * Maximum size in bytes\n */\n maxSize?: number\n}\n\nexport type { BlobRef, LegacyBlobRef }\n\nexport type BlobSchemaOutput<Options> = Options extends { allowLegacy: true }\n ? BlobRef | LegacyBlobRef\n : BlobRef\n\nexport class BlobSchema<O extends BlobSchemaOptions> extends Schema<\n BlobSchemaOutput<O>\n> {\n constructor(readonly options: O) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<BlobSchemaOutput<O>> {\n const blob: null | BlobRef | LegacyBlobRef =\n (input as any)?.$type !== undefined\n ? isBlobRef(input, this.options)\n ? input\n : null\n : this.options.allowLegacy === true && isLegacyBlobRef(input)\n ? input\n : null\n\n if (!blob) {\n return ctx.issueInvalidType(input, 'blob')\n }\n\n const { accept } = this.options\n if (accept && !matchesMime(blob.mimeType, accept)) {\n return ctx.issueInvalidPropertyValue(blob, 'mimeType', accept)\n }\n\n const { maxSize } = this.options\n if (maxSize != null && 'size' in blob && blob.size > maxSize) {\n return ctx.issueTooBig(blob, 'blob', maxSize, blob.size)\n }\n\n return ctx.success(blob as BlobSchemaOutput<O>)\n }\n\n matchesMime(mime: string): boolean {\n const { accept } = this.options\n if (!accept) return true\n return matchesMime(mime, accept)\n }\n}\n\nfunction matchesMime(mime: string, accepted: string[]): boolean {\n if (accepted.includes('*/*')) return true\n if (accepted.includes(mime)) return true\n for (const value of accepted) {\n if (value.endsWith('/*') && mime.startsWith(value.slice(0, -1))) {\n return true\n }\n }\n return false\n}\n"]}
|
package/dist/schema/record.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { Infer, LexiconRecordKey, NsidString, Schema,
|
|
1
|
+
import { $Typed, Infer, LexiconRecordKey, NsidString, Schema, TidString, ValidationResult, Validator, ValidatorContext } from '../core.js';
|
|
2
2
|
import { TypedObject } from './typed-union.js';
|
|
3
3
|
export type InferRecordKey<R extends RecordSchema> = R extends RecordSchema<infer K> ? RecordKeySchemaOutput<K> : never;
|
|
4
4
|
export type RecordSchemaOutput<T extends NsidString, S extends Validator<{
|
|
5
5
|
[k: string]: unknown;
|
|
6
|
-
}>> =
|
|
7
|
-
$type: T;
|
|
8
|
-
} & Omit<Infer<S>, '$type'>>;
|
|
6
|
+
}>> = $Typed<Infer<S>, T>;
|
|
9
7
|
export declare class RecordSchema<K extends LexiconRecordKey = any, T extends NsidString = any, S extends Validator<{
|
|
10
8
|
[k: string]: unknown;
|
|
11
9
|
}> = any> extends Schema<RecordSchemaOutput<T, S>> {
|
|
@@ -17,20 +15,18 @@ export declare class RecordSchema<K extends LexiconRecordKey = any, T extends Ns
|
|
|
17
15
|
isTypeOf<X extends {
|
|
18
16
|
$type?: unknown;
|
|
19
17
|
}>(value: X): value is Exclude<X extends {
|
|
20
|
-
$type?: T;
|
|
21
|
-
} ? X : X & {
|
|
22
|
-
$type?: T;
|
|
23
|
-
}, TypedObject>;
|
|
24
|
-
build<X extends Omit<Infer<S>, '$type'>>(input: X): Simplify<Omit<X, '$type'> & {
|
|
25
18
|
$type: T;
|
|
26
|
-
}>;
|
|
19
|
+
} ? X : $Typed<X, T>, TypedObject>;
|
|
20
|
+
build<X extends Omit<Infer<S>, '$type'>>(input: X): $Typed<Omit<X, '$type'>, T>;
|
|
27
21
|
$isTypeOf<X extends {
|
|
28
22
|
$type?: unknown;
|
|
29
23
|
}>(value: X): value is Exclude<X extends {
|
|
30
|
-
$type
|
|
24
|
+
$type: T;
|
|
31
25
|
} ? X : X & {
|
|
32
|
-
$type
|
|
33
|
-
}
|
|
26
|
+
$type: T;
|
|
27
|
+
} extends infer T_1 ? { [K_1 in keyof T_1]: (X & {
|
|
28
|
+
$type: T;
|
|
29
|
+
})[K_1]; } : never, TypedObject>;
|
|
34
30
|
$build<X extends Omit<Infer<S>, '$type'>>(input: X): Omit<X, "$type"> & {
|
|
35
31
|
$type: T;
|
|
36
32
|
} extends infer T_1 ? { [K_1 in keyof T_1]: (Omit<X, "$type"> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,YAAY,IAC/C,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAEpE,MAAM,MAAM,kBAAkB,CAC5B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,IAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEvB,qBAAa,YAAY,CACvB,CAAC,SAAS,gBAAgB,GAAG,GAAG,EAChC,CAAC,SAAS,UAAU,GAAG,GAAG,EAC1B,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAAG,GAAG,CACnD,SAAQ,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAItC,QAAQ,CAAC,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,CAAC;IALpB,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;gBAGlB,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC;IAMpB,QAAQ,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EACpC,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,OAAO,CAAC,CAAC,SAAS;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC;IAI3E,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,GACP,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAM9B,SAAS,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,EAAE,CAAC;eAZV,CAAC;;;;;;IAgBxC,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;;;;;IAIlD,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAa9C;AAED,MAAM,MAAM,qBAAqB,CAAC,GAAG,SAAS,gBAAgB,IAC5D,GAAG,SAAS,KAAK,GACb,MAAM,GACN,GAAG,SAAS,KAAK,GACf,SAAS,GACT,GAAG,SAAS,MAAM,GAChB,UAAU,GACV,GAAG,SAAS,WAAW,MAAM,CAAC,SAAS,MAAM,EAAE,GAC7C,CAAC,GACD,KAAK,CAAA;AAEjB,MAAM,MAAM,eAAe,CAAC,GAAG,SAAS,gBAAgB,IAAI,MAAM,CAChE,qBAAqB,CAAC,GAAG,CAAC,CAC3B,CAAA"}
|
package/dist/schema/record.js
CHANGED
|
@@ -20,7 +20,9 @@ class RecordSchema extends core_js_1.Schema {
|
|
|
20
20
|
return value.$type === this.$type;
|
|
21
21
|
}
|
|
22
22
|
build(input) {
|
|
23
|
-
return
|
|
23
|
+
return input.$type === this.$type
|
|
24
|
+
? input
|
|
25
|
+
: { ...input, $type: this.$type };
|
|
24
26
|
}
|
|
25
27
|
$isTypeOf(value) {
|
|
26
28
|
return this.isTypeOf(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":";;;AAAA,wCAUmB;AACnB,6CAA4C;AAC5C,2CAA0C;AAW1C,MAAa,YAIX,SAAQ,gBAAgC;IAI7B;IACA;IACA;IALX,SAAS,CAAoB;IAE7B,YACW,GAAM,EACN,KAAQ,EACR,MAAS;QAElB,KAAK,EAAE,CAAA;QAJE,QAAG,GAAH,GAAG,CAAG;QACN,UAAK,GAAL,KAAK,CAAG;QACR,WAAM,GAAN,MAAM,CAAG;QAGlB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,QAAQ,CACN,KAAQ;
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":";;;AAAA,wCAUmB;AACnB,6CAA4C;AAC5C,2CAA0C;AAW1C,MAAa,YAIX,SAAQ,gBAAgC;IAI7B;IACA;IACA;IALX,SAAS,CAAoB;IAE7B,YACW,GAAM,EACN,KAAQ,EACR,MAAS;QAElB,KAAK,EAAE,CAAA;QAJE,QAAG,GAAH,GAAG,CAAG;QACN,UAAK,GAAL,KAAK,CAAG;QACR,WAAM,GAAN,MAAM,CAAG;QAGlB,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,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;YAC/B,CAAC,CAAE,KAAsB;YACzB,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACrC,CAAC;IAED,SAAS,CAAgC,KAAQ;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAI,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,CAAoC,KAAQ;QAChD,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAE/C,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,MAAoD,CAAA;IAC7D,CAAC;CACF;AAtDD,oCAsDC;AAiBD,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,CAChB,GAAQ;IAER,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 {\n $Typed,\n Infer,\n LexiconRecordKey,\n NsidString,\n Schema,\n TidString,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../core.js'\nimport { LiteralSchema } from './literal.js'\nimport { StringSchema } from './string.js'\nimport { TypedObject } from './typed-union.js'\n\nexport type InferRecordKey<R extends RecordSchema> =\n R extends RecordSchema<infer K> ? RecordKeySchemaOutput<K> : never\n\nexport type RecordSchemaOutput<\n T extends NsidString,\n S extends Validator<{ [k: string]: unknown }>,\n> = $Typed<Infer<S>, T>\n\nexport class RecordSchema<\n K extends LexiconRecordKey = any,\n T extends NsidString = any,\n S extends Validator<{ [k: string]: unknown }> = any,\n> extends Schema<RecordSchemaOutput<T, S>> {\n keySchema: RecordKeySchema<K>\n\n constructor(\n readonly key: K,\n readonly $type: T,\n readonly schema: S,\n ) {\n super()\n this.keySchema = recordKey(key)\n }\n\n isTypeOf<X extends { $type?: unknown }>(\n value: X,\n ): value is Exclude<X extends { $type: T } ? X : $Typed<X, T>, TypedObject> {\n return value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): $Typed<Omit<X, '$type'>, T> {\n return input.$type === this.$type\n ? (input as $Typed<X, T>)\n : { ...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<Infer<S>, '$type'>>(input: X) {\n return this.build<X>(input)\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<RecordSchemaOutput<T, S>> {\n const result = ctx.validate(input, this.schema)\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 as ValidationResult<RecordSchemaOutput<T, S>>\n }\n}\n\nexport type RecordKeySchemaOutput<Key extends LexiconRecordKey> =\n Key extends 'any'\n ? string\n : Key extends 'tid'\n ? TidString\n : Key extends 'nsid'\n ? NsidString\n : Key extends `literal:${infer L extends string}`\n ? L\n : never\n\nexport type RecordKeySchema<Key extends LexiconRecordKey> = Schema<\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 LexiconRecordKey>(\n key: Key,\n): 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"]}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { $Type, Infer, Schema,
|
|
1
|
+
import { $Type, $Typed, $TypedMaybe, Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../core.js';
|
|
2
2
|
import { TypedObject } from './typed-union.js';
|
|
3
3
|
export type TypedObjectSchemaOutput<T extends $Type, S extends Validator<{
|
|
4
4
|
[k: string]: unknown;
|
|
5
|
-
}>> =
|
|
6
|
-
$type?: T;
|
|
7
|
-
}>;
|
|
5
|
+
}>> = $TypedMaybe<Infer<S>, T>;
|
|
8
6
|
export declare class TypedObjectSchema<const T extends $Type = any, const S extends Validator<{
|
|
9
7
|
[k: string]: unknown;
|
|
10
8
|
}> = any> extends Schema<TypedObjectSchemaOutput<T, S>> {
|
|
@@ -13,17 +11,15 @@ export declare class TypedObjectSchema<const T extends $Type = any, const S exte
|
|
|
13
11
|
constructor($type: T, schema: S);
|
|
14
12
|
isTypeOf<X extends Record<string, unknown>>(value: X): value is Exclude<X extends {
|
|
15
13
|
$type?: T;
|
|
16
|
-
} ? X : X
|
|
17
|
-
|
|
18
|
-
}, TypedObject>;
|
|
19
|
-
build<X extends Omit<Infer<S>, '$type'>>(input: X): Simplify<Omit<X, '$type'> & {
|
|
20
|
-
$type: T;
|
|
21
|
-
}>;
|
|
14
|
+
} ? X : $TypedMaybe<X, T>, TypedObject>;
|
|
15
|
+
build<X extends Omit<Infer<S>, '$type'>>(input: X): $Typed<Omit<X, '$type'>, T>;
|
|
22
16
|
$isTypeOf<X extends Record<string, unknown>>(value: X): value is Exclude<X extends {
|
|
23
17
|
$type?: T;
|
|
24
18
|
} ? X : X & {
|
|
25
|
-
$type?: T;
|
|
26
|
-
}
|
|
19
|
+
$type?: T | undefined;
|
|
20
|
+
} extends infer T_1 ? { [K in keyof T_1]: (X & {
|
|
21
|
+
$type?: T | undefined;
|
|
22
|
+
})[K]; } : never, TypedObject>;
|
|
27
23
|
$build<X extends Omit<Infer<S>, '$type'>>(input: X): Omit<X, "$type"> & {
|
|
28
24
|
$type: T;
|
|
29
25
|
} extends infer T_1 ? { [K in keyof T_1]: (Omit<X, "$type"> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-object.d.ts","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"typed-object.d.ts","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,MAAM,EACN,WAAW,EACX,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,uBAAuB,CACjC,CAAC,SAAS,KAAK,EACf,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,IAC3C,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAE5B,qBAAa,iBAAiB,CAC5B,KAAK,CAAC,CAAC,SAAS,KAAK,GAAG,GAAG,EAC3B,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAAG,GAAG,CACzD,SAAQ,MAAM,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3C,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,CAAC;gBADT,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC;IAKpB,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,OAAO,CACjB,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAC/C,WAAW,CACZ;IAID,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,GACP,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAM9B,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;gBAd/B,CAAC;;;;;;IAkBvB,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;;;;;IAIlD,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAiBnD"}
|
|
@@ -15,7 +15,9 @@ class TypedObjectSchema extends core_js_1.Schema {
|
|
|
15
15
|
return value.$type === undefined || value.$type === this.$type;
|
|
16
16
|
}
|
|
17
17
|
build(input) {
|
|
18
|
-
return
|
|
18
|
+
return input.$type === this.$type
|
|
19
|
+
? input
|
|
20
|
+
: { ...input, $type: this.$type };
|
|
19
21
|
}
|
|
20
22
|
$isTypeOf(value) {
|
|
21
23
|
return this.isTypeOf(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-object.js","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AACjD,
|
|
1
|
+
{"version":3,"file":"typed-object.js","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AACjD,wCASmB;AAQnB,MAAa,iBAGX,SAAQ,gBAAqC;IAElC;IACA;IAFX,YACW,KAAQ,EACR,MAAS;QAElB,KAAK,EAAE,CAAA;QAHE,UAAK,GAAL,KAAK,CAAG;QACR,WAAM,GAAN,MAAM,CAAG;IAGpB,CAAC;IAED,QAAQ,CACN,KAAQ;QAKR,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAA;IAChE,CAAC;IAED,KAAK,CACH,KAAQ;QAER,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;YAC/B,CAAC,CAAE,KAAsB;YACzB,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACrC,CAAC;IAED,SAAS,CAAoC,KAAQ;QACnD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,CAAoC,KAAQ;QAChD,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,iBAAiB,CACf,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,MAAM,CAErC,CAAA;IACH,CAAC;CACF;AAxDD,8CAwDC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport {\n $Type,\n $Typed,\n $TypedMaybe,\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../core.js'\nimport { TypedObject } from './typed-union.js'\n\nexport type TypedObjectSchemaOutput<\n T extends $Type,\n S extends Validator<{ [k: string]: unknown }>,\n> = $TypedMaybe<Infer<S>, T>\n\nexport class TypedObjectSchema<\n const T extends $Type = any,\n const S extends Validator<{ [k: string]: unknown }> = any,\n> extends Schema<TypedObjectSchemaOutput<T, S>> {\n constructor(\n readonly $type: T,\n readonly schema: S,\n ) {\n super()\n }\n\n isTypeOf<X extends Record<string, unknown>>(\n value: X,\n ): value is Exclude<\n X extends { $type?: T } ? X : $TypedMaybe<X, T>,\n TypedObject\n > {\n return value.$type === undefined || value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): $Typed<Omit<X, '$type'>, T> {\n return input.$type === this.$type\n ? (input as $Typed<X, T>)\n : { ...input, $type: this.$type }\n }\n\n $isTypeOf<X extends Record<string, unknown>>(value: X) {\n return this.isTypeOf(value)\n }\n\n $build<X extends Omit<Infer<S>, '$type'>>(input: X) {\n return this.build<X>(input)\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<TypedObjectSchemaOutput<T, S>> {\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 ValidationResult<\n TypedObjectSchemaOutput<T, S>\n >\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/lex-schema",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Lexicon schema system for AT Lexicons",
|
|
6
6
|
"keywords": [
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"tslib": "^2.8.1",
|
|
39
39
|
"@atproto/syntax": "0.4.2",
|
|
40
|
-
"@atproto/lex-data": "0.0.
|
|
40
|
+
"@atproto/lex-data": "0.0.6"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"vitest": "^4.0.16"
|
package/src/core/$type.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NsidString } from './string-format.js'
|
|
2
|
-
import { OmitKey } from './types.js'
|
|
2
|
+
import { OmitKey, Simplify } from './types.js'
|
|
3
3
|
|
|
4
4
|
export type $Type<
|
|
5
5
|
N extends NsidString = NsidString,
|
|
@@ -22,5 +22,16 @@ export function $type<N extends NsidString, H extends string>(
|
|
|
22
22
|
return (hash === 'main' ? nsid : `${nsid}#${hash}`) as $Type<N, H>
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export type $Typed<V, T extends string = string> =
|
|
25
|
+
export type $Typed<V, T extends string = string> = Simplify<
|
|
26
|
+
V & {
|
|
27
|
+
$type: T
|
|
28
|
+
}
|
|
29
|
+
>
|
|
30
|
+
|
|
31
|
+
export type $TypedMaybe<V, T extends string = string> = Simplify<
|
|
32
|
+
V & {
|
|
33
|
+
$type?: T
|
|
34
|
+
}
|
|
35
|
+
>
|
|
36
|
+
|
|
26
37
|
export type Un$Typed<V extends { $type?: string }> = OmitKey<V, '$type'>
|
package/src/schema/blob.ts
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BlobRef,
|
|
3
|
+
BlobRefValidationOptions,
|
|
3
4
|
LegacyBlobRef,
|
|
4
5
|
isBlobRef,
|
|
5
6
|
isLegacyBlobRef,
|
|
6
7
|
} from '@atproto/lex-data'
|
|
7
8
|
import { Schema, ValidationResult, ValidatorContext } from '../core.js'
|
|
8
9
|
|
|
9
|
-
export type BlobSchemaOptions = {
|
|
10
|
+
export type BlobSchemaOptions = BlobRefValidationOptions & {
|
|
10
11
|
/**
|
|
11
12
|
* Whether to allow legacy blob references format
|
|
12
13
|
* @see {@link LegacyBlobRef}
|
|
13
14
|
*/
|
|
14
15
|
allowLegacy?: boolean
|
|
15
|
-
/**
|
|
16
|
-
* Whether to enforce strict validation on the blob reference (CID version, codec, hash function)
|
|
17
|
-
*/
|
|
18
|
-
strict?: boolean
|
|
19
16
|
/**
|
|
20
17
|
* List of accepted mime types
|
|
21
18
|
*/
|
package/src/schema/record.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
+
$Typed,
|
|
2
3
|
Infer,
|
|
3
4
|
LexiconRecordKey,
|
|
4
5
|
NsidString,
|
|
5
6
|
Schema,
|
|
6
|
-
Simplify,
|
|
7
7
|
TidString,
|
|
8
8
|
ValidationResult,
|
|
9
9
|
Validator,
|
|
@@ -19,7 +19,7 @@ export type InferRecordKey<R extends RecordSchema> =
|
|
|
19
19
|
export type RecordSchemaOutput<
|
|
20
20
|
T extends NsidString,
|
|
21
21
|
S extends Validator<{ [k: string]: unknown }>,
|
|
22
|
-
> =
|
|
22
|
+
> = $Typed<Infer<S>, T>
|
|
23
23
|
|
|
24
24
|
export class RecordSchema<
|
|
25
25
|
K extends LexiconRecordKey = any,
|
|
@@ -39,17 +39,16 @@ export class RecordSchema<
|
|
|
39
39
|
|
|
40
40
|
isTypeOf<X extends { $type?: unknown }>(
|
|
41
41
|
value: X,
|
|
42
|
-
): value is Exclude<
|
|
43
|
-
X extends { $type?: T } ? X : X & { $type?: T },
|
|
44
|
-
TypedObject
|
|
45
|
-
> {
|
|
42
|
+
): value is Exclude<X extends { $type: T } ? X : $Typed<X, T>, TypedObject> {
|
|
46
43
|
return value.$type === this.$type
|
|
47
44
|
}
|
|
48
45
|
|
|
49
46
|
build<X extends Omit<Infer<S>, '$type'>>(
|
|
50
47
|
input: X,
|
|
51
|
-
):
|
|
52
|
-
return
|
|
48
|
+
): $Typed<Omit<X, '$type'>, T> {
|
|
49
|
+
return input.$type === this.$type
|
|
50
|
+
? (input as $Typed<X, T>)
|
|
51
|
+
: { ...input, $type: this.$type }
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
$isTypeOf<X extends { $type?: unknown }>(value: X) {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { isPlainObject } from '@atproto/lex-data'
|
|
2
2
|
import {
|
|
3
3
|
$Type,
|
|
4
|
+
$Typed,
|
|
5
|
+
$TypedMaybe,
|
|
4
6
|
Infer,
|
|
5
7
|
Schema,
|
|
6
|
-
Simplify,
|
|
7
8
|
ValidationResult,
|
|
8
9
|
Validator,
|
|
9
10
|
ValidatorContext,
|
|
@@ -13,7 +14,7 @@ import { TypedObject } from './typed-union.js'
|
|
|
13
14
|
export type TypedObjectSchemaOutput<
|
|
14
15
|
T extends $Type,
|
|
15
16
|
S extends Validator<{ [k: string]: unknown }>,
|
|
16
|
-
> =
|
|
17
|
+
> = $TypedMaybe<Infer<S>, T>
|
|
17
18
|
|
|
18
19
|
export class TypedObjectSchema<
|
|
19
20
|
const T extends $Type = any,
|
|
@@ -29,7 +30,7 @@ export class TypedObjectSchema<
|
|
|
29
30
|
isTypeOf<X extends Record<string, unknown>>(
|
|
30
31
|
value: X,
|
|
31
32
|
): value is Exclude<
|
|
32
|
-
X extends { $type?: T } ? X : X
|
|
33
|
+
X extends { $type?: T } ? X : $TypedMaybe<X, T>,
|
|
33
34
|
TypedObject
|
|
34
35
|
> {
|
|
35
36
|
return value.$type === undefined || value.$type === this.$type
|
|
@@ -37,8 +38,10 @@ export class TypedObjectSchema<
|
|
|
37
38
|
|
|
38
39
|
build<X extends Omit<Infer<S>, '$type'>>(
|
|
39
40
|
input: X,
|
|
40
|
-
):
|
|
41
|
-
return
|
|
41
|
+
): $Typed<Omit<X, '$type'>, T> {
|
|
42
|
+
return input.$type === this.$type
|
|
43
|
+
? (input as $Typed<X, T>)
|
|
44
|
+
: { ...input, $type: this.$type }
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
$isTypeOf<X extends Record<string, unknown>>(value: X) {
|