@atproto/lex-schema 0.0.3 → 0.0.5

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.
Files changed (109) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/core/$type.d.ts +7 -0
  3. package/dist/core/$type.d.ts.map +1 -1
  4. package/dist/core/$type.js.map +1 -1
  5. package/dist/core/result.d.ts +7 -6
  6. package/dist/core/result.d.ts.map +1 -1
  7. package/dist/core/result.js +9 -8
  8. package/dist/core/result.js.map +1 -1
  9. package/dist/core/string-format.d.ts +37 -26
  10. package/dist/core/string-format.d.ts.map +1 -1
  11. package/dist/core/string-format.js +66 -59
  12. package/dist/core/string-format.js.map +1 -1
  13. package/dist/core/types.d.ts +3 -0
  14. package/dist/core/types.d.ts.map +1 -1
  15. package/dist/core/types.js.map +1 -1
  16. package/dist/external.d.ts +7 -6
  17. package/dist/external.d.ts.map +1 -1
  18. package/dist/external.js +1 -0
  19. package/dist/external.js.map +1 -1
  20. package/dist/helpers.d.ts +36 -0
  21. package/dist/helpers.d.ts.map +1 -0
  22. package/dist/helpers.js +3 -0
  23. package/dist/helpers.js.map +1 -0
  24. package/dist/schema/blob.d.ts +1 -0
  25. package/dist/schema/blob.d.ts.map +1 -1
  26. package/dist/schema/blob.js +32 -18
  27. package/dist/schema/blob.js.map +1 -1
  28. package/dist/schema/custom.js +1 -1
  29. package/dist/schema/custom.js.map +1 -1
  30. package/dist/schema/integer.js +1 -1
  31. package/dist/schema/integer.js.map +1 -1
  32. package/dist/schema/params.d.ts +0 -1
  33. package/dist/schema/params.d.ts.map +1 -1
  34. package/dist/schema/params.js.map +1 -1
  35. package/dist/schema/payload.d.ts +17 -15
  36. package/dist/schema/payload.d.ts.map +1 -1
  37. package/dist/schema/payload.js +28 -0
  38. package/dist/schema/payload.js.map +1 -1
  39. package/dist/schema/procedure.d.ts +3 -6
  40. package/dist/schema/procedure.d.ts.map +1 -1
  41. package/dist/schema/procedure.js +1 -0
  42. package/dist/schema/procedure.js.map +1 -1
  43. package/dist/schema/query.d.ts +3 -5
  44. package/dist/schema/query.d.ts.map +1 -1
  45. package/dist/schema/query.js +1 -0
  46. package/dist/schema/query.js.map +1 -1
  47. package/dist/schema/record.d.ts +13 -12
  48. package/dist/schema/record.d.ts.map +1 -1
  49. package/dist/schema/record.js.map +1 -1
  50. package/dist/schema/refine.js +1 -1
  51. package/dist/schema/refine.js.map +1 -1
  52. package/dist/schema/subscription.d.ts +4 -7
  53. package/dist/schema/subscription.d.ts.map +1 -1
  54. package/dist/schema/subscription.js.map +1 -1
  55. package/dist/schema/typed-object.d.ts +7 -6
  56. package/dist/schema/typed-object.d.ts.map +1 -1
  57. package/dist/schema/typed-object.js.map +1 -1
  58. package/dist/schema/union.d.ts.map +1 -1
  59. package/dist/schema/union.js +1 -4
  60. package/dist/schema/union.js.map +1 -1
  61. package/dist/util/assertion-util.d.ts +8 -0
  62. package/dist/util/assertion-util.d.ts.map +1 -0
  63. package/dist/util/assertion-util.js +31 -0
  64. package/dist/util/assertion-util.js.map +1 -0
  65. package/dist/validation/schema.d.ts +21 -2
  66. package/dist/validation/schema.d.ts.map +1 -1
  67. package/dist/validation/schema.js +25 -2
  68. package/dist/validation/schema.js.map +1 -1
  69. package/dist/validation/validation-error.d.ts.map +1 -1
  70. package/dist/validation/validation-error.js +3 -3
  71. package/dist/validation/validation-error.js.map +1 -1
  72. package/dist/validation/validation-issue.js +10 -2
  73. package/dist/validation/validation-issue.js.map +1 -1
  74. package/dist/validation/validator.d.ts +4 -3
  75. package/dist/validation/validator.d.ts.map +1 -1
  76. package/dist/validation/validator.js +13 -10
  77. package/dist/validation/validator.js.map +1 -1
  78. package/package.json +2 -2
  79. package/src/core/$type.ts +4 -0
  80. package/src/core/result.ts +9 -8
  81. package/src/core/string-format.ts +88 -68
  82. package/src/core/types.ts +4 -0
  83. package/src/external.ts +9 -8
  84. package/src/helpers.test.ts +486 -0
  85. package/src/helpers.ts +61 -0
  86. package/src/schema/blob.test.ts +2 -4
  87. package/src/schema/blob.ts +31 -23
  88. package/src/schema/custom.test.ts +5 -5
  89. package/src/schema/custom.ts +1 -1
  90. package/src/schema/integer.ts +1 -1
  91. package/src/schema/params.ts +0 -7
  92. package/src/schema/payload.ts +67 -34
  93. package/src/schema/permission-set.test.ts +36 -36
  94. package/src/schema/procedure.test.ts +1 -62
  95. package/src/schema/procedure.ts +8 -20
  96. package/src/schema/query.test.ts +22 -69
  97. package/src/schema/query.ts +7 -14
  98. package/src/schema/record.ts +8 -4
  99. package/src/schema/refine.ts +1 -1
  100. package/src/schema/subscription.test.ts +30 -93
  101. package/src/schema/subscription.ts +11 -24
  102. package/src/schema/typed-object.ts +7 -3
  103. package/src/schema/union.ts +1 -4
  104. package/src/util/assertion-util.ts +40 -0
  105. package/src/validation/schema.ts +29 -4
  106. package/src/validation/validation-error.ts +4 -4
  107. package/src/validation/validation-issue.ts +12 -2
  108. package/src/validation/validator.ts +16 -12
  109. package/tsconfig.tests.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/schema/query.ts"],"names":[],"mappings":";;;AAaA,MAAa,KAAK;IAOL;IACA;IACA;IACA;IAJX,YACW,IAAW,EACX,UAAuB,EACvB,MAAsB,EACtB,MAAe;QAHf,SAAI,GAAJ,IAAI,CAAO;QACX,eAAU,GAAV,UAAU,CAAa;QACvB,WAAM,GAAN,MAAM,CAAgB;QACtB,WAAM,GAAN,MAAM,CAAS;IACvB,CAAC;CACL;AAZD,sBAYC","sourcesContent":["import { NsidString } from '../core.js'\nimport { Infer } from '../validation.js'\nimport { ParamsSchema } from './params.js'\nimport { InferPayloadBody, Payload } from './payload.js'\n\nexport type InferQueryParameters<Q extends Query> =\n Q extends Query<any, infer P extends ParamsSchema, any> ? Infer<P> : never\n\nexport type InferQueryOutputBody<Q extends Query> =\n Q extends Query<any, any, infer O extends Payload>\n ? InferPayloadBody<O>\n : never\n\nexport class Query<\n TNsid extends NsidString = any,\n TParameters extends ParamsSchema = any,\n TOutputPayload extends Payload = any,\n TErrors extends undefined | readonly string[] = any,\n> {\n constructor(\n readonly nsid: TNsid,\n readonly parameters: TParameters,\n readonly output: TOutputPayload,\n readonly errors: TErrors,\n ) {}\n}\n"]}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/schema/query.ts"],"names":[],"mappings":";;;AAIA,MAAa,KAAK;IASL;IACA;IACA;IACA;IANF,IAAI,GAAG,OAAgB,CAAA;IAEhC,YACW,IAAW,EACX,UAAuB,EACvB,MAAsB,EACtB,MAAe;QAHf,SAAI,GAAJ,IAAI,CAAO;QACX,eAAU,GAAV,UAAU,CAAa;QACvB,WAAM,GAAN,MAAM,CAAgB;QACtB,WAAM,GAAN,MAAM,CAAS;IACvB,CAAC;CACL;AAdD,sBAcC","sourcesContent":["import { NsidString } from '../core.js'\nimport { ParamsSchema } from './params.js'\nimport { Payload } from './payload.js'\n\nexport class Query<\n TNsid extends NsidString = NsidString,\n TParameters extends ParamsSchema = ParamsSchema,\n TOutputPayload extends Payload = Payload,\n TErrors extends undefined | readonly string[] = undefined | readonly string[],\n> {\n readonly type = 'query' as const\n\n constructor(\n readonly nsid: TNsid,\n readonly parameters: TParameters,\n readonly output: TOutputPayload,\n readonly errors: TErrors,\n ) {}\n}\n"]}
@@ -1,13 +1,14 @@
1
1
  import { LexiconRecordKey, NsidString, Simplify, TidString } from '../core.js';
2
2
  import { Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
3
+ import { TypedObject } from './typed-union.js';
3
4
  export type InferRecordKey<R extends RecordSchema> = R extends RecordSchema<infer K> ? RecordKeySchemaOutput<K> : never;
4
5
  export type RecordSchemaOutput<T extends NsidString, S extends Validator<{
5
- [_ in string]?: unknown;
6
- }>> = Simplify<Omit<Infer<S>, '$type'> & {
6
+ [k: string]: unknown;
7
+ }>> = Simplify<{
7
8
  $type: T;
8
- }>;
9
+ } & Omit<Infer<S>, '$type'>>;
9
10
  export declare class RecordSchema<K extends LexiconRecordKey = any, T extends NsidString = any, S extends Validator<{
10
- [_ in string]?: unknown;
11
+ [k: string]: unknown;
11
12
  }> = any> extends Schema<RecordSchemaOutput<T, S>> {
12
13
  readonly key: K;
13
14
  readonly $type: T;
@@ -16,21 +17,21 @@ export declare class RecordSchema<K extends LexiconRecordKey = any, T extends Ns
16
17
  constructor(key: K, $type: T, schema: S);
17
18
  isTypeOf<X extends {
18
19
  $type?: unknown;
19
- }>(value: X): value is X extends {
20
- $type: T;
20
+ }>(value: X): value is Exclude<X extends {
21
+ $type?: T;
21
22
  } ? X : X & {
22
- $type: T;
23
- };
23
+ $type?: T;
24
+ }, TypedObject>;
24
25
  build<X extends Omit<Infer<S>, '$type'>>(input: X): Simplify<Omit<X, '$type'> & {
25
26
  $type: T;
26
27
  }>;
27
28
  $isTypeOf<X extends {
28
29
  $type?: unknown;
29
- }>(value: X): value is X extends {
30
- $type: T;
30
+ }>(value: X): value is Exclude<X extends {
31
+ $type?: T;
31
32
  } ? X : X & {
32
- $type: T;
33
- };
33
+ $type?: T;
34
+ }, TypedObject>;
34
35
  $build<X extends Omit<Infer<S>, '$type'>>(input: X): Omit<X, "$type"> & {
35
36
  $type: T;
36
37
  } 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,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC9E,OAAO,EACL,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAIzB,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,YAAY,IAC/C,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAEpE,MAAM,MAAM,kBAAkB,CAC5B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,SAAS,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO;CAAE,CAAC,IAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,CAAA;AAEpD,qBAAa,YAAY,CACvB,CAAC,SAAS,gBAAgB,GAAG,GAAG,EAChC,CAAC,SAAS,UAAU,GAAG,GAAG,EAC1B,CAAC,SAAS,SAAS,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO;CAAE,CAAC,GAAG,GAAG,CACtD,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,CAAC,SAAS;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,CAAC,GAAG;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE;IAIzD,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,GACP,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC;IAI5C,SAAS,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,EAAE,CAAC;eAVlB,CAAC;;eAAsB,CAAC;;IAcvD,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;eARV,CAAC;;eAAD,CAAC;;IAYzC,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"}
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":";;;AACA,oDAMyB;AACzB,6CAA4C;AAC5C,2CAA0C;AAU1C,MAAa,YAIX,SAAQ,sBAAgC;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,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,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;AApDD,oCAoDC;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 { LexiconRecordKey, NsidString, Simplify, TidString } from '../core.js'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { LiteralSchema } from './literal.js'\nimport { StringSchema } from './string.js'\n\nexport type InferRecordKey<R extends RecordSchema> =\n R extends RecordSchema<infer K> ? RecordKeySchemaOutput<K> : never\n\nexport type RecordSchemaOutput<\n T extends NsidString,\n S extends Validator<{ [_ in string]?: unknown }>,\n> = Simplify<Omit<Infer<S>, '$type'> & { $type: T }>\n\nexport class RecordSchema<\n K extends LexiconRecordKey = any,\n T extends NsidString = any,\n S extends Validator<{ [_ in 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 X extends { $type: T } ? X : X & { $type: T } {\n return value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): Simplify<Omit<X, '$type'> & { $type: T }> {\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<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
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":";;;AACA,oDAMyB;AACzB,6CAA4C;AAC5C,2CAA0C;AAW1C,MAAa,YAIX,SAAQ,sBAAgC;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;QAKR,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAA;IACnC,CAAC;IAED,KAAK,CACH,KAAQ;QAER,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,SAAS,CAAgC,KAAQ;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAI,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,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;AAvDD,oCAuDC;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 { LexiconRecordKey, NsidString, Simplify, TidString } from '../core.js'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.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> = Simplify<{ $type: T } & Omit<Infer<S>, '$type'>>\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<\n X extends { $type?: T } ? X : X & { $type?: T },\n TypedObject\n > {\n return value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): Simplify<Omit<X, '$type'> & { $type: T }> {\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<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"]}
@@ -26,7 +26,7 @@ function validateInContextUnbound(input, ctx) {
26
26
  const checkResult = this.refinement.check.call(null, result.value, ctx);
27
27
  if (!checkResult) {
28
28
  const path = ctx.concatPath(this.refinement.path);
29
- return ctx.failure(new validation_js_1.IssueCustom(path, input, this.refinement.message));
29
+ return ctx.issue(new validation_js_1.IssueCustom(path, input, this.refinement.message));
30
30
  }
31
31
  return result;
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"refine.js","sourceRoot":"","sources":["../../src/schema/refine.ts"],"names":[],"mappings":";;AA8CA,wBAiBC;AA/DD,oDAOyB;AAsCzB,wBAAwB;AACxB,SAAgB,MAAM,CACpB,MAAS,EACT,UAAgC;IAEhC,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,6BAA6B;IAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QAC3B,iBAAiB,EAAE;YACjB,8DAA8D;YAC9D,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC5D,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,IAAI;SACnB;KACF,CAAC,CAAA;AACJ,CAAC;AAED,wBAAwB;AACxB,SAAS,wBAAwB,CAK/B,KAAc,EACd,GAAqB;IAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAA;IAElC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACjD,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,2BAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import {\n Infer,\n IssueCustom,\n PropertyKey,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { CustomAssertionContext } from './custom.js'\n\nexport type RefinementCheck<T> = {\n check: (value: T, ctx: CustomAssertionContext) => boolean\n message: string\n path?: PropertyKey | readonly PropertyKey[]\n}\n\nexport type RefinementAssertion<T, Out extends T> = {\n check: (this: null, value: T, ctx: CustomAssertionContext) => value is Out\n message: string\n path?: PropertyKey | readonly PropertyKey[]\n}\n\nexport type InferRefinement<R> =\n R extends RefinementCheck<infer T>\n ? T\n : R extends RefinementAssertion<infer T, any>\n ? T\n : never\n\nexport type Refinement<T = any, Out extends T = T> =\n | RefinementCheck<T>\n | RefinementAssertion<T, Out>\n\nexport function refine<S extends Validator, Out extends Infer<S>>(\n schema: S,\n refinement: RefinementAssertion<Infer<S>, Out>,\n): S & Validator<Out>\nexport function refine<S extends Validator>(\n schema: S,\n refinement: RefinementCheck<Infer<S>>,\n): S\nexport function refine<\n R extends Refinement,\n S extends Validator<InferRefinement<R>>,\n>(schema: S, refinement: R): S\n/*@__NO_SIDE_EFFECTS__*/\nexport function refine<S extends Validator>(\n schema: S,\n refinement: Refinement<Infer<S>>,\n): S {\n // This is basically the same as monkey patching the \"validateInContext\"\n // method to the schema, but done in a way that does not mutate the original\n // schema. This is safe to do because Validators don't update their internal\n // state over their lifetime.\n return Object.create(schema, {\n validateInContext: {\n // We do not use an arrow function to avoid creating a closure\n value: validateInContextUnbound.bind({ schema, refinement }),\n enumerable: false,\n writable: false,\n configurable: true,\n },\n })\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction validateInContextUnbound<S extends Validator>(\n this: {\n schema: S\n refinement: Refinement<Infer<S>>\n },\n input: unknown,\n ctx: ValidatorContext,\n): ValidationResult<Infer<S>> {\n const result = ctx.validate(input, this.schema)\n if (!result.success) return result\n\n const checkResult = this.refinement.check.call(null, result.value, ctx)\n if (!checkResult) {\n const path = ctx.concatPath(this.refinement.path)\n return ctx.failure(new IssueCustom(path, input, this.refinement.message))\n }\n\n return result\n}\n"]}
1
+ {"version":3,"file":"refine.js","sourceRoot":"","sources":["../../src/schema/refine.ts"],"names":[],"mappings":";;AA8CA,wBAiBC;AA/DD,oDAOyB;AAsCzB,wBAAwB;AACxB,SAAgB,MAAM,CACpB,MAAS,EACT,UAAgC;IAEhC,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,6BAA6B;IAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QAC3B,iBAAiB,EAAE;YACjB,8DAA8D;YAC9D,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC5D,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,IAAI;SACnB;KACF,CAAC,CAAA;AACJ,CAAC;AAED,wBAAwB;AACxB,SAAS,wBAAwB,CAK/B,KAAc,EACd,GAAqB;IAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAA;IAElC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACjD,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,2BAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import {\n Infer,\n IssueCustom,\n PropertyKey,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { CustomAssertionContext } from './custom.js'\n\nexport type RefinementCheck<T> = {\n check: (value: T, ctx: CustomAssertionContext) => boolean\n message: string\n path?: PropertyKey | readonly PropertyKey[]\n}\n\nexport type RefinementAssertion<T, Out extends T> = {\n check: (this: null, value: T, ctx: CustomAssertionContext) => value is Out\n message: string\n path?: PropertyKey | readonly PropertyKey[]\n}\n\nexport type InferRefinement<R> =\n R extends RefinementCheck<infer T>\n ? T\n : R extends RefinementAssertion<infer T, any>\n ? T\n : never\n\nexport type Refinement<T = any, Out extends T = T> =\n | RefinementCheck<T>\n | RefinementAssertion<T, Out>\n\nexport function refine<S extends Validator, Out extends Infer<S>>(\n schema: S,\n refinement: RefinementAssertion<Infer<S>, Out>,\n): S & Validator<Out>\nexport function refine<S extends Validator>(\n schema: S,\n refinement: RefinementCheck<Infer<S>>,\n): S\nexport function refine<\n R extends Refinement,\n S extends Validator<InferRefinement<R>>,\n>(schema: S, refinement: R): S\n/*@__NO_SIDE_EFFECTS__*/\nexport function refine<S extends Validator>(\n schema: S,\n refinement: Refinement<Infer<S>>,\n): S {\n // This is basically the same as monkey patching the \"validateInContext\"\n // method to the schema, but done in a way that does not mutate the original\n // schema. This is safe to do because Validators don't update their internal\n // state over their lifetime.\n return Object.create(schema, {\n validateInContext: {\n // We do not use an arrow function to avoid creating a closure\n value: validateInContextUnbound.bind({ schema, refinement }),\n enumerable: false,\n writable: false,\n configurable: true,\n },\n })\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction validateInContextUnbound<S extends Validator>(\n this: {\n schema: S\n refinement: Refinement<Infer<S>>\n },\n input: unknown,\n ctx: ValidatorContext,\n): ValidationResult<Infer<S>> {\n const result = ctx.validate(input, this.schema)\n if (!result.success) return result\n\n const checkResult = this.refinement.check.call(null, result.value, ctx)\n if (!checkResult) {\n const path = ctx.concatPath(this.refinement.path)\n return ctx.issue(new IssueCustom(path, input, this.refinement.message))\n }\n\n return result\n}\n"]}
@@ -1,12 +1,9 @@
1
1
  import { NsidString } from '../core.js';
2
- import { Infer } from '../validation.js';
3
- import { ObjectSchema } from './object.js';
2
+ import { Infer, Schema } from '../validation.js';
4
3
  import { ParamsSchema } from './params.js';
5
- import { RefSchema } from './ref.js';
6
- import { TypedUnionSchema } from './typed-union.js';
7
- export type InferSubscriptionParameters<S extends Subscription> = S extends Subscription<any, infer P extends ParamsSchema, any> ? Infer<P> : never;
8
- export type InferSubscriptionMessage<S extends Subscription> = S extends Subscription<any, any, infer M extends RefSchema | TypedUnionSchema | ObjectSchema> ? Infer<M> : unknown;
9
- export declare class Subscription<TNsid extends NsidString = any, TParameters extends ParamsSchema = any, TMessage extends undefined | RefSchema | TypedUnionSchema | ObjectSchema = any, TErrors extends undefined | readonly string[] = any> {
4
+ export type InferSubscriptionParameters<S extends Subscription> = Infer<S['parameters']>;
5
+ export type InferSubscriptionMessage<S extends Subscription> = Infer<S['message']>;
6
+ export declare class Subscription<TNsid extends NsidString = NsidString, TParameters extends ParamsSchema = ParamsSchema, TMessage extends Schema = Schema, TErrors extends undefined | readonly string[] = undefined | readonly string[]> {
10
7
  readonly nsid: TNsid;
11
8
  readonly parameters: TParameters;
12
9
  readonly message: TMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,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,KAAK,SAAS,UAAU,GAAG,GAAG,EAC9B,WAAW,SAAS,YAAY,GAAG,GAAG,EACtC,QAAQ,SACJ,SAAS,GACT,SAAS,GACT,gBAAgB,GAChB,YAAY,GAAG,GAAG,EACtB,OAAO,SAAS,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG;IAKjD,QAAQ,CAAC,IAAI,EAAE,KAAK;IACpB,QAAQ,CAAC,UAAU,EAAE,WAAW;IAChC,QAAQ,CAAC,OAAO,EAAE,QAAQ;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO;IAN1B,QAAQ,CAAC,IAAI,EAAG,cAAc,CAAS;gBAG5B,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,OAAO;CAE3B"}
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,YAAY,IAAI,KAAK,CACrE,CAAC,CAAC,YAAY,CAAC,CAChB,CAAA;AAED,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,YAAY,IAAI,KAAK,CAClE,CAAC,CAAC,SAAS,CAAC,CACb,CAAA;AAED,qBAAa,YAAY,CACvB,KAAK,SAAS,UAAU,GAAG,UAAU,EACrC,WAAW,SAAS,YAAY,GAAG,YAAY,EAC/C,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,OAAO,SAAS,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE;IAK3E,QAAQ,CAAC,IAAI,EAAE,KAAK;IACpB,QAAQ,CAAC,UAAU,EAAE,WAAW;IAChC,QAAQ,CAAC,OAAO,EAAE,QAAQ;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO;IAN1B,QAAQ,CAAC,IAAI,EAAG,cAAc,CAAS;gBAG5B,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,OAAO;CAE3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":";;;AAqBA,MAAa,YAAY;IAaZ;IACA;IACA;IACA;IANF,IAAI,GAAG,cAAuB,CAAA;IAEvC,YACW,IAAW,EACX,UAAuB,EACvB,OAAiB,EACjB,MAAe;QAHf,SAAI,GAAJ,IAAI,CAAO;QACX,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAU;QACjB,WAAM,GAAN,MAAM,CAAS;IACvB,CAAC;CACL;AAlBD,oCAkBC","sourcesContent":["import { NsidString } from '../core.js'\nimport { 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 TNsid extends NsidString = any,\n TParameters extends ParamsSchema = any,\n TMessage extends\n | undefined\n | RefSchema\n | TypedUnionSchema\n | ObjectSchema = any,\n TErrors extends undefined | readonly string[] = any,\n> {\n readonly type = 'subscription' as const\n\n constructor(\n readonly nsid: TNsid,\n readonly parameters: TParameters,\n readonly message: TMessage,\n readonly errors: TErrors,\n ) {}\n}\n"]}
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":";;;AAYA,MAAa,YAAY;IASZ;IACA;IACA;IACA;IANF,IAAI,GAAG,cAAuB,CAAA;IAEvC,YACW,IAAW,EACX,UAAuB,EACvB,OAAiB,EACjB,MAAe;QAHf,SAAI,GAAJ,IAAI,CAAO;QACX,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAU;QACjB,WAAM,GAAN,MAAM,CAAS;IACvB,CAAC;CACL;AAdD,oCAcC","sourcesContent":["import { NsidString } from '../core.js'\nimport { Infer, Schema } from '../validation.js'\nimport { ParamsSchema } from './params.js'\n\nexport type InferSubscriptionParameters<S extends Subscription> = Infer<\n S['parameters']\n>\n\nexport type InferSubscriptionMessage<S extends Subscription> = Infer<\n S['message']\n>\n\nexport class Subscription<\n TNsid extends NsidString = NsidString,\n TParameters extends ParamsSchema = ParamsSchema,\n TMessage extends Schema = Schema,\n TErrors extends undefined | readonly string[] = undefined | readonly string[],\n> {\n readonly type = 'subscription' as const\n\n constructor(\n readonly nsid: TNsid,\n readonly parameters: TParameters,\n readonly message: TMessage,\n readonly errors: TErrors,\n ) {}\n}\n"]}
@@ -1,29 +1,30 @@
1
1
  import { $Type, Simplify } from '../core.js';
2
2
  import { Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
3
+ import { TypedObject } from './typed-union.js';
3
4
  export type TypedObjectSchemaOutput<T extends $Type, S extends Validator<{
4
- [_ in string]?: unknown;
5
+ [k: string]: unknown;
5
6
  }>> = Simplify<Infer<S> & {
6
7
  $type?: T;
7
8
  }>;
8
9
  export declare class TypedObjectSchema<const T extends $Type = any, const S extends Validator<{
9
- [_ in string]?: unknown;
10
+ [k: string]: unknown;
10
11
  }> = any> extends Schema<TypedObjectSchemaOutput<T, S>> {
11
12
  readonly $type: T;
12
13
  readonly schema: S;
13
14
  constructor($type: T, schema: S);
14
- isTypeOf<X extends Record<string, unknown>>(value: X): value is X extends {
15
+ isTypeOf<X extends Record<string, unknown>>(value: X): value is Exclude<X extends {
15
16
  $type?: T;
16
17
  } ? X : X & {
17
18
  $type?: T;
18
- };
19
+ }, TypedObject>;
19
20
  build<X extends Omit<Infer<S>, '$type'>>(input: X): Simplify<Omit<X, '$type'> & {
20
21
  $type: T;
21
22
  }>;
22
- $isTypeOf<X extends Record<string, unknown>>(value: X): value is X extends {
23
+ $isTypeOf<X extends Record<string, unknown>>(value: X): value is Exclude<X extends {
23
24
  $type?: T;
24
25
  } ? X : X & {
25
26
  $type?: T;
26
- };
27
+ }, TypedObject>;
27
28
  $build<X extends Omit<Infer<S>, '$type'>>(input: X): Omit<X, "$type"> & {
28
29
  $type: T;
29
30
  } 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,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EACL,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,uBAAuB,CACjC,CAAC,SAAS,KAAK,EACf,CAAC,SAAS,SAAS,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO;CAAE,CAAC,IAC9C,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC,CAAA;AAEtC,qBAAa,iBAAiB,CAC5B,KAAK,CAAC,CAAC,SAAS,KAAK,GAAG,GAAG,EAC3B,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO;CAAE,CAAC,GAAG,GAAG,CAC5D,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,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE;IAI3D,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,GACP,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC;IAI5C,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;gBAVrB,CAAC;;gBAAuB,CAAC;;IAczD,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;eARV,CAAC;;eAAD,CAAC;;IAYzC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAiBnD"}
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,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,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,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC,CAAA;AAEtC,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,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,EAC/C,WAAW,CACZ;IAID,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,GACP,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC;IAI5C,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;gBAZ/B,CAAC;;gBAAuB,CAAC;;IAgB/C,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;eARV,CAAC;;eAAD,CAAC;;IAYzC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAiBnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"typed-object.js","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AAEjD,oDAMyB;AAOzB,MAAa,iBAGX,SAAQ,sBAAqC;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;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,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;AAnDD,8CAmDC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { $Type, Simplify } from '../core.js'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport type TypedObjectSchemaOutput<\n T extends $Type,\n S extends Validator<{ [_ in string]?: unknown }>,\n> = Simplify<Infer<S> & { $type?: T }>\n\nexport class TypedObjectSchema<\n const T extends $Type = any,\n const S extends Validator<{ [_ in 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 X extends { $type?: T } ? X : X & { $type?: T } {\n return value.$type === undefined || value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): Simplify<Omit<X, '$type'> & { $type: T }> {\n return { ...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"]}
1
+ {"version":3,"file":"typed-object.js","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AAEjD,oDAMyB;AAQzB,MAAa,iBAGX,SAAQ,sBAAqC;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,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,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;AAtDD,8CAsDC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { $Type, Simplify } from '../core.js'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { TypedObject } from './typed-union.js'\n\nexport type TypedObjectSchemaOutput<\n T extends $Type,\n S extends Validator<{ [k: string]: unknown }>,\n> = Simplify<Infer<S> & { $type?: 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 : X & { $type?: 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 ): Simplify<Omit<X, '$type'> & { $type: T }> {\n return { ...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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"union.d.ts","sourceRoot":"","sources":["../../src/schema/union.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,MAAM,EAGN,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,CAAC,CAAC,SAAS,qBAAqB,GAAG,GAAG,CAAE,SAAQ,MAAM,CAC5E,iBAAiB,CAAC,CAAC,CAAC,CACrB;IACa,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAAb,UAAU,EAAE,CAAC;IAI5C,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAiB1C"}
1
+ {"version":3,"file":"union.d.ts","sourceRoot":"","sources":["../../src/schema/union.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,MAAM,EAGN,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,CAAC,CAAC,SAAS,qBAAqB,GAAG,GAAG,CAAE,SAAQ,MAAM,CAC5E,iBAAiB,CAAC,CAAC,CAAC,CACrB;IACa,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAAb,UAAU,EAAE,CAAC;IAI5C,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAc1C"}
@@ -19,10 +19,7 @@ class UnionSchema extends validation_js_1.Schema {
19
19
  failures.push(result);
20
20
  }
21
21
  }
22
- return {
23
- success: false,
24
- error: validation_js_1.ValidationError.fromFailures(failures),
25
- };
22
+ return ctx.failure(validation_js_1.ValidationError.fromFailures(failures));
26
23
  }
27
24
  }
28
25
  exports.UnionSchema = UnionSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"union.js","sourceRoot":"","sources":["../../src/schema/union.ts"],"names":[],"mappings":";;;AAAA,oDAQyB;AAKzB,MAAa,WAAmD,SAAQ,sBAEvE;IACgC;IAA/B,YAA+B,UAAa;QAC1C,KAAK,EAAE,CAAA;QADsB,eAAU,GAAV,UAAU,CAAG;IAE5C,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,QAAQ,GAAwB,EAAE,CAAA;QAExC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YAC7C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,MAAgD,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAAe,CAAC,YAAY,CAAC,QAAQ,CAAC;SAC9C,CAAA;IACH,CAAC;CACF;AA3BD,kCA2BC","sourcesContent":["import {\n Infer,\n Schema,\n ValidationError,\n ValidationFailure,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport type UnionSchemaValidators = readonly [Validator, ...Validator[]]\nexport type UnionSchemaOutput<V extends readonly Validator[]> = Infer<V[number]>\n\nexport class UnionSchema<V extends UnionSchemaValidators = any> extends Schema<\n UnionSchemaOutput<V>\n> {\n constructor(protected readonly validators: V) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<UnionSchemaOutput<V>> {\n const failures: ValidationFailure[] = []\n\n for (const validator of this.validators) {\n const result = ctx.validate(input, validator)\n if (result.success) {\n return result as ValidationResult<UnionSchemaOutput<V>>\n } else {\n failures.push(result)\n }\n }\n\n return {\n success: false,\n error: ValidationError.fromFailures(failures),\n }\n }\n}\n"]}
1
+ {"version":3,"file":"union.js","sourceRoot":"","sources":["../../src/schema/union.ts"],"names":[],"mappings":";;;AAAA,oDAQyB;AAKzB,MAAa,WAAmD,SAAQ,sBAEvE;IACgC;IAA/B,YAA+B,UAAa;QAC1C,KAAK,EAAE,CAAA;QADsB,eAAU,GAAV,UAAU,CAAG;IAE5C,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,QAAQ,GAAwB,EAAE,CAAA;QAExC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YAC7C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,MAAgD,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,+BAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC5D,CAAC;CACF;AAxBD,kCAwBC","sourcesContent":["import {\n Infer,\n Schema,\n ValidationError,\n ValidationFailure,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport type UnionSchemaValidators = readonly [Validator, ...Validator[]]\nexport type UnionSchemaOutput<V extends readonly Validator[]> = Infer<V[number]>\n\nexport class UnionSchema<V extends UnionSchemaValidators = any> extends Schema<\n UnionSchemaOutput<V>\n> {\n constructor(protected readonly validators: V) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<UnionSchemaOutput<V>> {\n const failures: ValidationFailure[] = []\n\n for (const validator of this.validators) {\n const result = ctx.validate(input, validator)\n if (result.success) {\n return result as ValidationResult<UnionSchemaOutput<V>>\n } else {\n failures.push(result)\n }\n }\n\n return ctx.failure(ValidationError.fromFailures(failures))\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export type AssertFn<T> = <I extends string>(input: I) => asserts input is I & T;
2
+ export type CastFn<T> = <I extends string>(input: I) => I & T;
3
+ export type CheckFn<T> = <I extends string>(input: I) => input is I & T;
4
+ export declare function createAssertFunction<T extends string>(checkFn: (input: string) => input is T, errorMessage?: string): AssertFn<T>;
5
+ export declare function createAssertFunction<T extends string>(checkFn: (input: string) => boolean, errorMessage?: string): AssertFn<T>;
6
+ export declare function createCastFunction<T>(assertFn: AssertFn<T>): CastFn<T>;
7
+ export declare function createCheckFunction<T>(assertFn: AssertFn<T>): CheckFn<T>;
8
+ //# sourceMappingURL=assertion-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertion-util.d.ts","sourceRoot":"","sources":["../../src/util/assertion-util.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAA;AAChF,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAC7D,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,CAAA;AAEvE,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EACnD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC,EACtC,YAAY,CAAC,EAAE,MAAM,GACpB,QAAQ,CAAC,CAAC,CAAC,CAAA;AACd,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EACnD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EACnC,YAAY,CAAC,EAAE,MAAM,GACpB,QAAQ,CAAC,CAAC,CAAC,CAAA;AAWd,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAKtE;AAGD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CASxE"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAssertFunction = createAssertFunction;
4
+ exports.createCastFunction = createCastFunction;
5
+ exports.createCheckFunction = createCheckFunction;
6
+ function createAssertFunction(checkFn, errorMessage = 'Invalid format') {
7
+ return (input) => {
8
+ if (!checkFn(input))
9
+ throw new Error(errorMessage);
10
+ };
11
+ }
12
+ /*@__NO_SIDE_EFFECTS__*/
13
+ function createCastFunction(assertFn) {
14
+ return (input) => {
15
+ assertFn(input);
16
+ return input;
17
+ };
18
+ }
19
+ /*@__NO_SIDE_EFFECTS__ */
20
+ function createCheckFunction(assertFn) {
21
+ return (input) => {
22
+ try {
23
+ assertFn(input);
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ };
30
+ }
31
+ //# sourceMappingURL=assertion-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertion-util.js","sourceRoot":"","sources":["../../src/util/assertion-util.ts"],"names":[],"mappings":";;AAYA,oDAOC;AAGD,gDAKC;AAGD,kDASC;AA3BD,SAAgB,oBAAoB,CAClC,OAAmC,EACnC,YAAY,GAAG,gBAAgB;IAE/B,OAAO,CAAC,KAAa,EAAE,EAAE;QACvB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;IACpD,CAAC,CAAA;AACH,CAAC;AAED,wBAAwB;AACxB,SAAgB,kBAAkB,CAAI,QAAqB;IACzD,OAAO,CAAmB,KAAQ,EAAE,EAAE;QACpC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACf,OAAO,KAAc,CAAA;IACvB,CAAC,CAAA;AACH,CAAC;AAED,yBAAyB;AACzB,SAAgB,mBAAmB,CAAI,QAAqB;IAC1D,OAAO,CAAmB,KAAQ,EAAkB,EAAE;QACpD,IAAI,CAAC;YACH,QAAQ,CAAC,KAAK,CAAC,CAAA;YACf,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,CAAA;AACH,CAAC","sourcesContent":["export type AssertFn<T> = <I extends string>(input: I) => asserts input is I & T\nexport type CastFn<T> = <I extends string>(input: I) => I & T\nexport type CheckFn<T> = <I extends string>(input: I) => input is I & T\n\nexport function createAssertFunction<T extends string>(\n checkFn: (input: string) => input is T,\n errorMessage?: string,\n): AssertFn<T>\nexport function createAssertFunction<T extends string>(\n checkFn: (input: string) => boolean,\n errorMessage?: string,\n): AssertFn<T>\nexport function createAssertFunction<T extends string>(\n checkFn: (input: string) => boolean,\n errorMessage = 'Invalid format',\n): AssertFn<T> {\n return (input: string) => {\n if (!checkFn(input)) throw new Error(errorMessage)\n }\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nexport function createCastFunction<T>(assertFn: AssertFn<T>): CastFn<T> {\n return <I extends string>(input: I) => {\n assertFn(input)\n return input as I & T\n }\n}\n\n/*@__NO_SIDE_EFFECTS__ */\nexport function createCheckFunction<T>(assertFn: AssertFn<T>): CheckFn<T> {\n return <I extends string>(input: I): input is I & T => {\n try {\n assertFn(input)\n return true\n } catch {\n return false\n }\n }\n}\n"]}
@@ -1,10 +1,29 @@
1
1
  import { ValidationOptions, ValidationResult, Validator, ValidatorContext } from './validator.js';
2
- export declare abstract class Schema<Output> implements Validator<Output> {
3
- readonly ['_lex']: {
2
+ export declare abstract class Schema<Output = any> implements Validator<Output> {
3
+ readonly ['__lex']: {
4
4
  output: Output;
5
5
  };
6
6
  abstract validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<Output>;
7
+ /**
8
+ * @note use {@link check}() instead of {@link assert}() if you encounter a
9
+ * `ts(2775)` error and you are not able to fully type the validator. This
10
+ * will typically arise in generic contexts, where the narrowed type is not
11
+ * needed.
12
+ */
7
13
  assert(input: unknown): asserts input is Output;
14
+ /**
15
+ * Alias for {@link assert}(). Most useful in generic contexts where the
16
+ * validator is not exactly typed, allowing to avoid "_Assertions require
17
+ * every name in the call target to be declared with an explicit type
18
+ * annotation. ts(2775)_" errors.
19
+ */
20
+ check(input: unknown): void;
21
+ /**
22
+ * Casts the input (by validating it) to the output type if it matches the
23
+ * schema, otherwise throws. This is the same as calling {@link parse}() with
24
+ * `allowTransform: false`.
25
+ */
26
+ cast<I>(input: I): I & Output;
8
27
  matches(input: unknown): input is Output;
9
28
  ifMatches<I>(input: I): (I & Output) | undefined;
10
29
  parse<I>(input: I, options: ValidationOptions & {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/validation/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,gBAAgB,CAAA;AAEvB,8BAAsB,MAAM,CAAC,MAAM,CAAE,YAAW,SAAS,CAAC,MAAM,CAAC;IAC/D,SAAiB,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAE7C,QAAQ,CAAC,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;IAE3B,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM;IAK/C,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM;IAKxC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,SAAS;IAIhD,KAAK,CAAC,CAAC,EACL,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,iBAAiB,GAAG;QAAE,cAAc,EAAE,KAAK,CAAA;KAAE,GACrD,CAAC,GAAG,MAAM;IACb,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM;IAO1D,SAAS,CAAC,CAAC,EACT,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,iBAAiB,GAAG;QAAE,cAAc,EAAE,KAAK,CAAA;KAAE,GACrD,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC;IAC/B,SAAS,CACP,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAAC,MAAM,CAAC;IAsB3B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM;IAIhD,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM;IAIzC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,SAAS;IAIjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM;IAI3D,UAAU,CACR,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAAC,MAAM,CAAC;CAG5B"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/validation/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,gBAAgB,CAAA;AAEvB,8BAAsB,MAAM,CAAC,MAAM,GAAG,GAAG,CAAE,YAAW,SAAS,CAAC,MAAM,CAAC;IACrE,SAAiB,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAE9C,QAAQ,CAAC,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM;IAK/C;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAI3B;;;;OAIG;IACH,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM;IAI7B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM;IAKxC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,SAAS;IAIhD,KAAK,CAAC,CAAC,EACL,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,iBAAiB,GAAG;QAAE,cAAc,EAAE,KAAK,CAAA;KAAE,GACrD,CAAC,GAAG,MAAM;IACb,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM;IAO1D,SAAS,CAAC,CAAC,EACT,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,iBAAiB,GAAG;QAAE,cAAc,EAAE,KAAK,CAAA;KAAE,GACrD,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC;IAC/B,SAAS,CACP,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAAC,MAAM,CAAC;IAsB3B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM;IAIhD,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM;IAIzC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,SAAS;IAIjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM;IAI3D,UAAU,CACR,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAAC,MAAM,CAAC;CAG5B"}
@@ -3,10 +3,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Schema = void 0;
4
4
  const validator_js_1 = require("./validator.js");
5
5
  class Schema {
6
+ /**
7
+ * @note use {@link check}() instead of {@link assert}() if you encounter a
8
+ * `ts(2775)` error and you are not able to fully type the validator. This
9
+ * will typically arise in generic contexts, where the narrowed type is not
10
+ * needed.
11
+ */
6
12
  assert(input) {
7
13
  const result = this.safeParse(input, { allowTransform: false });
8
14
  if (!result.success)
9
- throw result.error;
15
+ throw result.reason;
16
+ }
17
+ /**
18
+ * Alias for {@link assert}(). Most useful in generic contexts where the
19
+ * validator is not exactly typed, allowing to avoid "_Assertions require
20
+ * every name in the call target to be declared with an explicit type
21
+ * annotation. ts(2775)_" errors.
22
+ */
23
+ check(input) {
24
+ this.assert(input);
25
+ }
26
+ /**
27
+ * Casts the input (by validating it) to the output type if it matches the
28
+ * schema, otherwise throws. This is the same as calling {@link parse}() with
29
+ * `allowTransform: false`.
30
+ */
31
+ cast(input) {
32
+ return this.parse(input, { allowTransform: false });
10
33
  }
11
34
  matches(input) {
12
35
  const result = this.safeParse(input, { allowTransform: false });
@@ -18,7 +41,7 @@ class Schema {
18
41
  parse(input, options) {
19
42
  const result = this.safeParse(input, options);
20
43
  if (!result.success)
21
- throw result.error;
44
+ throw result.reason;
22
45
  return result.value;
23
46
  }
24
47
  safeParse(input, options) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/validation/schema.ts"],"names":[],"mappings":";;;AAAA,iDAKuB;AAEvB,MAAsB,MAAM;IAQ1B,MAAM,CAAC,KAAc;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,MAAM,CAAC,KAAK,CAAA;IACzC,CAAC;IAED,OAAO,CAAC,KAAc;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/D,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED,SAAS,CAAI,KAAQ;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAChD,CAAC;IAOD,KAAK,CAAC,KAAc,EAAE,OAA2B;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,MAAM,CAAC,KAAK,CAAA;QACvC,OAAO,MAAM,CAAC,KAAK,CAAA;IACrB,CAAC;IAUD,SAAS,CACP,KAAc,EACd,OAA2B;QAE3B,OAAO,+BAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC;IAED,yEAAyE;IACzE,4EAA4E;IAC5E,6EAA6E;IAC7E,iEAAiE;IACjE,uEAAuE;IACvE,wEAAwE;IACxE,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,+DAA+D;IAC/D,EAAE;IACF,wFAAwF;IACxF,qGAAqG;IAErG,OAAO,CAAC,KAAc;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;IAED,QAAQ,CAAC,KAAc;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,UAAU,CAAI,KAAQ;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,CAAC,KAAc,EAAE,OAA2B;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC;IAED,UAAU,CACR,KAAc,EACd,OAA2B;QAE3B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvC,CAAC;CACF;AApFD,wBAoFC","sourcesContent":["import {\n ValidationOptions,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from './validator.js'\n\nexport abstract class Schema<Output> implements Validator<Output> {\n declare readonly ['_lex']: { output: Output }\n\n abstract validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Output>\n\n assert(input: unknown): asserts input is Output {\n const result = this.safeParse(input, { allowTransform: false })\n if (!result.success) throw result.error\n }\n\n matches(input: unknown): input is Output {\n const result = this.safeParse(input, { allowTransform: false })\n return result.success\n }\n\n ifMatches<I>(input: I): (I & Output) | undefined {\n return this.matches(input) ? input : undefined\n }\n\n parse<I>(\n input: I,\n options: ValidationOptions & { allowTransform: false },\n ): I & Output\n parse(input: unknown, options?: ValidationOptions): Output\n parse(input: unknown, options?: ValidationOptions): Output {\n const result = this.safeParse(input, options)\n if (!result.success) throw result.error\n return result.value\n }\n\n safeParse<I>(\n input: I,\n options: ValidationOptions & { allowTransform: false },\n ): ValidationResult<I & Output>\n safeParse(\n input: unknown,\n options?: ValidationOptions,\n ): ValidationResult<Output>\n safeParse(\n input: unknown,\n options?: ValidationOptions,\n ): ValidationResult<Output> {\n return ValidatorContext.validate(input, this, options)\n }\n\n // @NOTE The built lexicons namespaces will export utility functions that\n // allow accessing the schema's methods without the need to specify \".main.\"\n // as part of the namespace. This way, a utility for a particular record type\n // can be called like \"app.bsky.feed.post.<utility>()\" instead of\n // \"app.bsky.feed.post.main.<utility>()\". Because those utilities could\n // conflict with other schemas (e.g. if there is a lexicon definition at\n // \"#<utility>\"), those exported utilities will be prefixed with \"$\". In order\n // to be able to consistently call the utilities, when using the \"main\" and\n // non \"main\" definitions, we also expose the same methods with a \"$\" prefix.\n // Thanks to this, both of the following call will be possible:\n //\n // - \"app.bsky.feed.post.$parse(...)\" // calls a utility function created by \"lex build\"\n // - \"app.bsky.feed.defs.postView.$parse(...)\" // uses the alias defined below on the schema instance\n\n $assert(input: unknown): asserts input is Output {\n return this.assert(input)\n }\n\n $matches(input: unknown): input is Output {\n return this.matches(input)\n }\n\n $ifMatches<I>(input: I): (I & Output) | undefined {\n return this.ifMatches(input)\n }\n\n $parse(input: unknown, options?: ValidationOptions): Output {\n return this.parse(input, options)\n }\n\n $safeParse(\n input: unknown,\n options?: ValidationOptions,\n ): ValidationResult<Output> {\n return this.safeParse(input, options)\n }\n}\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/validation/schema.ts"],"names":[],"mappings":";;;AAAA,iDAKuB;AAEvB,MAAsB,MAAM;IAQ1B;;;;;OAKG;IACH,MAAM,CAAC,KAAc;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,MAAM,CAAC,MAAM,CAAA;IAC1C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAI,KAAQ;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,OAAO,CAAC,KAAc;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/D,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED,SAAS,CAAI,KAAQ;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAChD,CAAC;IAOD,KAAK,CAAC,KAAc,EAAE,OAA2B;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,MAAM,CAAC,MAAM,CAAA;QACxC,OAAO,MAAM,CAAC,KAAK,CAAA;IACrB,CAAC;IAUD,SAAS,CACP,KAAc,EACd,OAA2B;QAE3B,OAAO,+BAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC;IAED,yEAAyE;IACzE,4EAA4E;IAC5E,6EAA6E;IAC7E,iEAAiE;IACjE,uEAAuE;IACvE,wEAAwE;IACxE,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,+DAA+D;IAC/D,EAAE;IACF,wFAAwF;IACxF,qGAAqG;IAErG,OAAO,CAAC,KAAc;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;IAED,QAAQ,CAAC,KAAc;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,UAAU,CAAI,KAAQ;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,CAAC,KAAc,EAAE,OAA2B;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC;IAED,UAAU,CACR,KAAc,EACd,OAA2B;QAE3B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvC,CAAC;CACF;AA7GD,wBA6GC","sourcesContent":["import {\n ValidationOptions,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from './validator.js'\n\nexport abstract class Schema<Output = any> implements Validator<Output> {\n declare readonly ['__lex']: { output: Output }\n\n abstract validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Output>\n\n /**\n * @note use {@link check}() instead of {@link assert}() if you encounter a\n * `ts(2775)` error and you are not able to fully type the validator. This\n * will typically arise in generic contexts, where the narrowed type is not\n * needed.\n */\n assert(input: unknown): asserts input is Output {\n const result = this.safeParse(input, { allowTransform: false })\n if (!result.success) throw result.reason\n }\n\n /**\n * Alias for {@link assert}(). Most useful in generic contexts where the\n * validator is not exactly typed, allowing to avoid \"_Assertions require\n * every name in the call target to be declared with an explicit type\n * annotation. ts(2775)_\" errors.\n */\n check(input: unknown): void {\n this.assert(input)\n }\n\n /**\n * Casts the input (by validating it) to the output type if it matches the\n * schema, otherwise throws. This is the same as calling {@link parse}() with\n * `allowTransform: false`.\n */\n cast<I>(input: I): I & Output {\n return this.parse(input, { allowTransform: false })\n }\n\n matches(input: unknown): input is Output {\n const result = this.safeParse(input, { allowTransform: false })\n return result.success\n }\n\n ifMatches<I>(input: I): (I & Output) | undefined {\n return this.matches(input) ? input : undefined\n }\n\n parse<I>(\n input: I,\n options: ValidationOptions & { allowTransform: false },\n ): I & Output\n parse(input: unknown, options?: ValidationOptions): Output\n parse(input: unknown, options?: ValidationOptions): Output {\n const result = this.safeParse(input, options)\n if (!result.success) throw result.reason\n return result.value\n }\n\n safeParse<I>(\n input: I,\n options: ValidationOptions & { allowTransform: false },\n ): ValidationResult<I & Output>\n safeParse(\n input: unknown,\n options?: ValidationOptions,\n ): ValidationResult<Output>\n safeParse(\n input: unknown,\n options?: ValidationOptions,\n ): ValidationResult<Output> {\n return ValidatorContext.validate(input, this, options)\n }\n\n // @NOTE The built lexicons namespaces will export utility functions that\n // allow accessing the schema's methods without the need to specify \".main.\"\n // as part of the namespace. This way, a utility for a particular record type\n // can be called like \"app.bsky.feed.post.<utility>()\" instead of\n // \"app.bsky.feed.post.main.<utility>()\". Because those utilities could\n // conflict with other schemas (e.g. if there is a lexicon definition at\n // \"#<utility>\"), those exported utilities will be prefixed with \"$\". In order\n // to be able to consistently call the utilities, when using the \"main\" and\n // non \"main\" definitions, we also expose the same methods with a \"$\" prefix.\n // Thanks to this, both of the following call will be possible:\n //\n // - \"app.bsky.feed.post.$parse(...)\" // calls a utility function created by \"lex build\"\n // - \"app.bsky.feed.defs.postView.$parse(...)\" // uses the alias defined below on the schema instance\n\n $assert(input: unknown): asserts input is Output {\n return this.assert(input)\n }\n\n $matches(input: unknown): input is Output {\n return this.matches(input)\n }\n\n $ifMatches<I>(input: I): (I & Output) | undefined {\n return this.ifMatches(input)\n }\n\n $parse(input: unknown, options?: ValidationOptions): Output {\n return this.parse(input, options)\n }\n\n $safeParse(\n input: unknown,\n options?: ValidationOptions,\n ): ValidationResult<Output> {\n return this.safeParse(input, options)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validation-error.d.ts","sourceRoot":"","sources":["../../src/validation/validation-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAA;AAExD,OAAO,EACL,KAAK,EAGN,MAAM,uBAAuB,CAAA;AAE9B,qBAAa,eAAgB,SAAQ,KAAK;IACxC,IAAI,SAAoB;IAExB,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;gBAEZ,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY;IAMnD,MAAM,CAAC,YAAY,CACjB,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EAAE,GACzC,eAAe;CAQnB"}
1
+ {"version":3,"file":"validation-error.d.ts","sourceRoot":"","sources":["../../src/validation/validation-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAA;AAEzD,OAAO,EACL,KAAK,EAGN,MAAM,uBAAuB,CAAA;AAE9B,qBAAa,eAAgB,SAAQ,KAAK;IACxC,IAAI,SAAoB;IAExB,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;gBAEZ,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY;IAMnD,MAAM,CAAC,YAAY,CACjB,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EAAE,GACzC,eAAe;CAQnB"}
@@ -14,17 +14,17 @@ class ValidationError extends Error {
14
14
  }
15
15
  static fromFailures(failures) {
16
16
  if (failures.length === 1)
17
- return failures[0].error;
17
+ return (0, core_js_1.failureReason)(failures[0]);
18
18
  const issues = failures.flatMap(extractFailureIssues);
19
19
  return new ValidationError(issues, {
20
20
  // Keep the original errors as the cause chain
21
- cause: failures.map(core_js_1.failureError),
21
+ cause: failures.map(core_js_1.failureReason),
22
22
  });
23
23
  }
24
24
  }
25
25
  exports.ValidationError = ValidationError;
26
26
  function extractFailureIssues(result) {
27
- return result.error.issues;
27
+ return result.reason.issues;
28
28
  }
29
29
  function aggregateIssues(issues) {
30
30
  // Quick path for common cases
@@ -1 +1 @@
1
- {"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../src/validation/validation-error.ts"],"names":[],"mappings":"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","sourcesContent":["import { ResultFailure, failureError } from '../core.js'\nimport { arrayAgg } from '../util/array-agg.js'\nimport {\n Issue,\n IssueInvalidType,\n IssueInvalidValue,\n} from './validation-issue.js'\n\nexport class ValidationError extends Error {\n name = 'ValidationError'\n\n readonly issues: Issue[]\n\n constructor(issues: Issue[], options?: ErrorOptions) {\n const issuesAgg = aggregateIssues(issues)\n super(issuesAgg.join(', '), options)\n this.issues = issuesAgg\n }\n\n static fromFailures(\n failures: ResultFailure<ValidationError>[],\n ): ValidationError {\n if (failures.length === 1) return failures[0].error\n const issues = failures.flatMap(extractFailureIssues)\n return new ValidationError(issues, {\n // Keep the original errors as the cause chain\n cause: failures.map(failureError),\n })\n }\n}\n\nfunction extractFailureIssues(result: ResultFailure<ValidationError>) {\n return result.error.issues\n}\n\nfunction aggregateIssues(issues: Issue[]): Issue[] {\n // Quick path for common cases\n if (issues.length <= 1) return issues\n if (issues.length === 2 && issues[0].code !== issues[1].code) return issues\n\n return [\n // Aggregate invalid_type with identical paths\n ...arrayAgg(\n issues.filter((issue) => issue instanceof IssueInvalidType),\n (a, b) => comparePropertyPaths(a.path, b.path),\n (issues) =>\n new IssueInvalidType(\n issues[0].path,\n issues[0].input,\n Array.from(new Set(issues.flatMap((iss) => iss.expected))),\n ),\n ),\n // Aggregate invalid_value with identical paths\n ...arrayAgg(\n issues.filter((issue) => issue instanceof IssueInvalidValue),\n (a, b) => comparePropertyPaths(a.path, b.path),\n (issues) =>\n new IssueInvalidValue(\n issues[0].path,\n issues[0].input,\n Array.from(new Set(issues.flatMap((iss) => iss.values))),\n ),\n ),\n // Pass through other issues\n ...issues.filter(\n (issue) =>\n !(issue instanceof IssueInvalidType) &&\n !(issue instanceof IssueInvalidValue),\n ),\n ]\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction comparePropertyPaths(\n a: readonly PropertyKey[],\n b: readonly PropertyKey[],\n) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n"]}
1
+ {"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../src/validation/validation-error.ts"],"names":[],"mappings":"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","sourcesContent":["import { ResultFailure, failureReason } from '../core.js'\nimport { arrayAgg } from '../util/array-agg.js'\nimport {\n Issue,\n IssueInvalidType,\n IssueInvalidValue,\n} from './validation-issue.js'\n\nexport class ValidationError extends Error {\n name = 'ValidationError'\n\n readonly issues: Issue[]\n\n constructor(issues: Issue[], options?: ErrorOptions) {\n const issuesAgg = aggregateIssues(issues)\n super(issuesAgg.join(', '), options)\n this.issues = issuesAgg\n }\n\n static fromFailures(\n failures: ResultFailure<ValidationError>[],\n ): ValidationError {\n if (failures.length === 1) return failureReason(failures[0])\n const issues = failures.flatMap(extractFailureIssues)\n return new ValidationError(issues, {\n // Keep the original errors as the cause chain\n cause: failures.map(failureReason),\n })\n }\n}\n\nfunction extractFailureIssues(result: ResultFailure<ValidationError>) {\n return result.reason.issues\n}\n\nfunction aggregateIssues(issues: Issue[]): Issue[] {\n // Quick path for common cases\n if (issues.length <= 1) return issues\n if (issues.length === 2 && issues[0].code !== issues[1].code) return issues\n\n return [\n // Aggregate invalid_type with identical paths\n ...arrayAgg(\n issues.filter((issue) => issue instanceof IssueInvalidType),\n (a, b) => comparePropertyPaths(a.path, b.path),\n (issues) =>\n new IssueInvalidType(\n issues[0].path,\n issues[0].input,\n Array.from(new Set(issues.flatMap((iss) => iss.expected))),\n ),\n ),\n // Aggregate invalid_value with identical paths\n ...arrayAgg(\n issues.filter((issue) => issue instanceof IssueInvalidValue),\n (a, b) => comparePropertyPaths(a.path, b.path),\n (issues) =>\n new IssueInvalidValue(\n issues[0].path,\n issues[0].input,\n Array.from(new Set(issues.flatMap((iss) => iss.values))),\n ),\n ),\n // Pass through other issues\n ...issues.filter(\n (issue) =>\n !(issue instanceof IssueInvalidType) &&\n !(issue instanceof IssueInvalidValue),\n ),\n ]\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction comparePropertyPaths(\n a: readonly PropertyKey[],\n b: readonly PropertyKey[],\n) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n"]}
@@ -171,10 +171,18 @@ function stringifyType(value) {
171
171
  return 'set';
172
172
  return 'object';
173
173
  case 'number':
174
- if (Number.isInteger(value))
174
+ if (Number.isInteger(value) && Number.isSafeInteger(value)) {
175
175
  return 'integer';
176
- if (Number.isNaN(value))
176
+ }
177
+ if (Number.isNaN(value)) {
177
178
  return 'NaN';
179
+ }
180
+ if (value === Infinity) {
181
+ return 'Infinity';
182
+ }
183
+ if (value === -Infinity) {
184
+ return '-Infinity';
185
+ }
178
186
  return 'float';
179
187
  default:
180
188
  return typeof value;
@@ -1 +1 @@
1
- {"version":3,"file":"validation-issue.js","sourceRoot":"","sources":["../../src/validation/validation-issue.ts"],"names":[],"mappings":"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","sourcesContent":["import { asCid, isPlainObject } from '@atproto/lex-data'\nimport { PropertyKey } from './property-key.js'\n\nexport abstract class Issue {\n constructor(\n readonly code: string,\n readonly path: readonly PropertyKey[],\n readonly input: unknown,\n ) {}\n\n abstract toString(): string\n}\n\nexport class IssueCustom extends Issue {\n constructor(\n readonly path: readonly PropertyKey[],\n readonly input: unknown,\n readonly message: string,\n ) {\n super('custom', path, input)\n }\n\n toString() {\n return `${this.message}${stringifyPath(this.path)}`\n }\n}\n\nexport class IssueInvalidFormat extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly format: string,\n readonly message?: string,\n ) {\n super('invalid_format', path, input)\n }\n\n toString() {\n return `Invalid ${this.formatDescription} format${this.message ? ` (${this.message})` : ''}${stringifyPath(this.path)} (got ${stringifyValue(this.input)})`\n }\n\n get formatDescription(): string {\n switch (this.format) {\n case 'at-identifier':\n return `AT identifier`\n case 'did':\n return `DID`\n case 'nsid':\n return `NSID`\n case 'cid':\n return `CID string`\n case 'tid':\n return `TID string`\n case 'record-key':\n return `record key`\n default:\n return this.format\n }\n }\n}\n\nexport class IssueInvalidType extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly expected: readonly string[],\n ) {\n super('invalid_type', path, input)\n }\n\n toString() {\n return `Expected ${oneOf(this.expected.map(stringifyExpectedType))} value type${stringifyPath(this.path)} (got ${stringifyType(this.input)})`\n }\n}\n\nexport class IssueInvalidValue extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly values: readonly unknown[],\n ) {\n super('invalid_value', path, input)\n }\n\n toString() {\n return `Expected ${oneOf(this.values.map(stringifyValue))}${stringifyPath(this.path)} (got ${stringifyValue(this.input)})`\n }\n}\n\nexport class IssueRequiredKey extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly key: PropertyKey,\n ) {\n super('required_key', path, input)\n }\n\n toString() {\n return `Missing required key \"${String(this.key)}\"${stringifyPath(this.path)}`\n }\n}\n\nexport type MeasurableType =\n | 'array'\n | 'string'\n | 'integer'\n | 'grapheme'\n | 'bytes'\n | 'blob'\n\nexport class IssueTooBig extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly maximum: number,\n readonly type: MeasurableType,\n readonly actual: number,\n ) {\n super('too_big', path, input)\n }\n\n toString() {\n return `${this.type} too big (maximum ${this.maximum})${stringifyPath(this.path)} (got ${this.actual})`\n }\n}\n\nexport class IssueTooSmall extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly minimum: number,\n readonly type: MeasurableType,\n readonly actual: number,\n ) {\n super('too_small', path, input)\n }\n\n toString() {\n return `${this.type} too small (minimum ${this.minimum})${stringifyPath(this.path)} (got ${this.actual})`\n }\n}\n\nfunction stringifyExpectedType(expected: string): string {\n if (expected === '$typed') {\n return 'an object or record which includes a \"$type\" property'\n }\n return expected\n}\n\nfunction stringifyPath(path: readonly PropertyKey[]) {\n return ` at ${buildJsonPath(path)}`\n}\n\nfunction buildJsonPath(path: readonly PropertyKey[]): string {\n return `$${path.map(toJsonPathSegment).join('')}`\n}\n\nfunction toJsonPathSegment(segment: PropertyKey): string {\n if (typeof segment === 'number') {\n return `[${segment}]`\n } else if (/^[a-zA-Z_$][a-zA-Z0-9_]*$/.test(segment as string)) {\n return `.${segment}`\n } else {\n return `[${JSON.stringify(segment)}]`\n }\n}\n\nfunction oneOf(arr: readonly string[]): string {\n if (arr.length === 0) return ''\n if (arr.length === 1) return arr[0]\n return `one of ${arr.slice(0, -1).join(', ')} or ${arr.at(-1)}`\n}\n\nfunction stringifyType(value: unknown): string {\n switch (typeof value) {\n case 'object':\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n if (asCid(value)) return 'cid'\n if (value instanceof Date) return 'date'\n if (value instanceof RegExp) return 'regexp'\n if (value instanceof Map) return 'map'\n if (value instanceof Set) return 'set'\n return 'object'\n case 'number':\n if (Number.isInteger(value)) return 'integer'\n if (Number.isNaN(value)) return 'NaN'\n return 'float'\n default:\n return typeof value\n }\n}\n\nfunction stringifyValue(value: unknown): string {\n switch (typeof value) {\n case 'bigint':\n return `${value}n`\n case 'number':\n case 'string':\n case 'boolean':\n return JSON.stringify(value)\n case 'object':\n if (Array.isArray(value)) {\n return `[${stringifyArray(value, stringifyValue)}]`\n }\n if (isPlainObject(value)) {\n return `{${stringifyArray(Object.entries(value), stringifyObjectEntry)}}`\n }\n // fallthrough\n default:\n return stringifyType(value)\n }\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction stringifyObjectEntry([key, _value]: [PropertyKey, unknown]): string {\n return `${JSON.stringify(key)}: ...`\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction stringifyArray<T>(\n arr: readonly T[],\n fn: (item: T) => string,\n n = 2,\n): string {\n return arr.slice(0, n).map(fn).join(', ') + (arr.length > n ? ', ...' : '')\n}\n"]}
1
+ {"version":3,"file":"validation-issue.js","sourceRoot":"","sources":["../../src/validation/validation-issue.ts"],"names":[],"mappings":"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","sourcesContent":["import { asCid, isPlainObject } from '@atproto/lex-data'\nimport { PropertyKey } from './property-key.js'\n\nexport abstract class Issue {\n constructor(\n readonly code: string,\n readonly path: readonly PropertyKey[],\n readonly input: unknown,\n ) {}\n\n abstract toString(): string\n}\n\nexport class IssueCustom extends Issue {\n constructor(\n readonly path: readonly PropertyKey[],\n readonly input: unknown,\n readonly message: string,\n ) {\n super('custom', path, input)\n }\n\n toString() {\n return `${this.message}${stringifyPath(this.path)}`\n }\n}\n\nexport class IssueInvalidFormat extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly format: string,\n readonly message?: string,\n ) {\n super('invalid_format', path, input)\n }\n\n toString() {\n return `Invalid ${this.formatDescription} format${this.message ? ` (${this.message})` : ''}${stringifyPath(this.path)} (got ${stringifyValue(this.input)})`\n }\n\n get formatDescription(): string {\n switch (this.format) {\n case 'at-identifier':\n return `AT identifier`\n case 'did':\n return `DID`\n case 'nsid':\n return `NSID`\n case 'cid':\n return `CID string`\n case 'tid':\n return `TID string`\n case 'record-key':\n return `record key`\n default:\n return this.format\n }\n }\n}\n\nexport class IssueInvalidType extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly expected: readonly string[],\n ) {\n super('invalid_type', path, input)\n }\n\n toString() {\n return `Expected ${oneOf(this.expected.map(stringifyExpectedType))} value type${stringifyPath(this.path)} (got ${stringifyType(this.input)})`\n }\n}\n\nexport class IssueInvalidValue extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly values: readonly unknown[],\n ) {\n super('invalid_value', path, input)\n }\n\n toString() {\n return `Expected ${oneOf(this.values.map(stringifyValue))}${stringifyPath(this.path)} (got ${stringifyValue(this.input)})`\n }\n}\n\nexport class IssueRequiredKey extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly key: PropertyKey,\n ) {\n super('required_key', path, input)\n }\n\n toString() {\n return `Missing required key \"${String(this.key)}\"${stringifyPath(this.path)}`\n }\n}\n\nexport type MeasurableType =\n | 'array'\n | 'string'\n | 'integer'\n | 'grapheme'\n | 'bytes'\n | 'blob'\n\nexport class IssueTooBig extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly maximum: number,\n readonly type: MeasurableType,\n readonly actual: number,\n ) {\n super('too_big', path, input)\n }\n\n toString() {\n return `${this.type} too big (maximum ${this.maximum})${stringifyPath(this.path)} (got ${this.actual})`\n }\n}\n\nexport class IssueTooSmall extends Issue {\n constructor(\n path: readonly PropertyKey[],\n input: unknown,\n readonly minimum: number,\n readonly type: MeasurableType,\n readonly actual: number,\n ) {\n super('too_small', path, input)\n }\n\n toString() {\n return `${this.type} too small (minimum ${this.minimum})${stringifyPath(this.path)} (got ${this.actual})`\n }\n}\n\nfunction stringifyExpectedType(expected: string): string {\n if (expected === '$typed') {\n return 'an object or record which includes a \"$type\" property'\n }\n return expected\n}\n\nfunction stringifyPath(path: readonly PropertyKey[]) {\n return ` at ${buildJsonPath(path)}`\n}\n\nfunction buildJsonPath(path: readonly PropertyKey[]): string {\n return `$${path.map(toJsonPathSegment).join('')}`\n}\n\nfunction toJsonPathSegment(segment: PropertyKey): string {\n if (typeof segment === 'number') {\n return `[${segment}]`\n } else if (/^[a-zA-Z_$][a-zA-Z0-9_]*$/.test(segment as string)) {\n return `.${segment}`\n } else {\n return `[${JSON.stringify(segment)}]`\n }\n}\n\nfunction oneOf(arr: readonly string[]): string {\n if (arr.length === 0) return ''\n if (arr.length === 1) return arr[0]\n return `one of ${arr.slice(0, -1).join(', ')} or ${arr.at(-1)}`\n}\n\nfunction stringifyType(value: unknown): string {\n switch (typeof value) {\n case 'object':\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n if (asCid(value)) return 'cid'\n if (value instanceof Date) return 'date'\n if (value instanceof RegExp) return 'regexp'\n if (value instanceof Map) return 'map'\n if (value instanceof Set) return 'set'\n return 'object'\n case 'number':\n if (Number.isInteger(value) && Number.isSafeInteger(value)) {\n return 'integer'\n }\n if (Number.isNaN(value)) {\n return 'NaN'\n }\n if (value === Infinity) {\n return 'Infinity'\n }\n if (value === -Infinity) {\n return '-Infinity'\n }\n return 'float'\n default:\n return typeof value\n }\n}\n\nfunction stringifyValue(value: unknown): string {\n switch (typeof value) {\n case 'bigint':\n return `${value}n`\n case 'number':\n case 'string':\n case 'boolean':\n return JSON.stringify(value)\n case 'object':\n if (Array.isArray(value)) {\n return `[${stringifyArray(value, stringifyValue)}]`\n }\n if (isPlainObject(value)) {\n return `{${stringifyArray(Object.entries(value), stringifyObjectEntry)}}`\n }\n // fallthrough\n default:\n return stringifyType(value)\n }\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction stringifyObjectEntry([key, _value]: [PropertyKey, unknown]): string {\n return `${JSON.stringify(key)}: ...`\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction stringifyArray<T>(\n arr: readonly T[],\n fn: (item: T) => string,\n n = 2,\n): string {\n return arr.slice(0, n).map(fn).join(', ') + (arr.length > n ? ', ...' : '')\n}\n"]}