@atproto/lex-schema 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/core/$type.d.ts +4 -0
  2. package/dist/core/$type.d.ts.map +1 -0
  3. package/dist/core/$type.js +7 -0
  4. package/dist/core/$type.js.map +1 -0
  5. package/dist/core/record-key.d.ts +4 -0
  6. package/dist/core/record-key.d.ts.map +1 -0
  7. package/dist/core/record-key.js +16 -0
  8. package/dist/core/record-key.js.map +1 -0
  9. package/dist/core/result.d.ts +57 -0
  10. package/dist/core/result.d.ts.map +1 -0
  11. package/dist/core/result.js +74 -0
  12. package/dist/core/result.js.map +1 -0
  13. package/dist/core/string-format.d.ts +31 -0
  14. package/dist/core/string-format.d.ts.map +1 -0
  15. package/dist/core/string-format.js +81 -0
  16. package/dist/core/string-format.js.map +1 -0
  17. package/dist/core/types.d.ts +19 -0
  18. package/dist/core/types.d.ts.map +1 -0
  19. package/dist/core/types.js +3 -0
  20. package/dist/core/types.js.map +1 -0
  21. package/dist/core.d.ts +6 -0
  22. package/dist/core.d.ts.map +1 -0
  23. package/dist/core.js +9 -0
  24. package/dist/core.js.map +1 -0
  25. package/dist/external.d.ts +86 -0
  26. package/dist/external.d.ts.map +1 -0
  27. package/dist/external.js +171 -0
  28. package/dist/external.js.map +1 -0
  29. package/dist/index.d.ts +4 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +8 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/schema/_parameters.d.ts +17 -0
  34. package/dist/schema/_parameters.d.ts.map +1 -0
  35. package/dist/schema/_parameters.js +20 -0
  36. package/dist/schema/_parameters.js.map +1 -0
  37. package/dist/schema/array.d.ts +13 -0
  38. package/dist/schema/array.d.ts.map +1 -0
  39. package/dist/schema/array.js +40 -0
  40. package/dist/schema/array.js.map +1 -0
  41. package/dist/schema/blob.d.ts +32 -0
  42. package/dist/schema/blob.d.ts.map +1 -0
  43. package/dist/schema/blob.js +40 -0
  44. package/dist/schema/blob.js.map +1 -0
  45. package/dist/schema/boolean.d.ts +11 -0
  46. package/dist/schema/boolean.d.ts.map +1 -0
  47. package/dist/schema/boolean.js +20 -0
  48. package/dist/schema/boolean.js.map +1 -0
  49. package/dist/schema/bytes.d.ts +12 -0
  50. package/dist/schema/bytes.d.ts.map +1 -0
  51. package/dist/schema/bytes.js +31 -0
  52. package/dist/schema/bytes.js.map +1 -0
  53. package/dist/schema/cid.d.ts +13 -0
  54. package/dist/schema/cid.d.ts.map +1 -0
  55. package/dist/schema/cid.js +22 -0
  56. package/dist/schema/cid.js.map +1 -0
  57. package/dist/schema/custom.d.ts +15 -0
  58. package/dist/schema/custom.d.ts.map +1 -0
  59. package/dist/schema/custom.js +22 -0
  60. package/dist/schema/custom.js.map +1 -0
  61. package/dist/schema/dict.d.ts +18 -0
  62. package/dist/schema/dict.d.ts.map +1 -0
  63. package/dist/schema/dict.js +48 -0
  64. package/dist/schema/dict.js.map +1 -0
  65. package/dist/schema/discriminated-union.d.ts +34 -0
  66. package/dist/schema/discriminated-union.d.ts.map +1 -0
  67. package/dist/schema/discriminated-union.js +93 -0
  68. package/dist/schema/discriminated-union.js.map +1 -0
  69. package/dist/schema/enum.d.ts +7 -0
  70. package/dist/schema/enum.d.ts.map +1 -0
  71. package/dist/schema/enum.js +19 -0
  72. package/dist/schema/enum.js.map +1 -0
  73. package/dist/schema/integer.d.ts +13 -0
  74. package/dist/schema/integer.d.ts.map +1 -0
  75. package/dist/schema/integer.js +32 -0
  76. package/dist/schema/integer.js.map +1 -0
  77. package/dist/schema/intersection.d.ts +16 -0
  78. package/dist/schema/intersection.d.ts.map +1 -0
  79. package/dist/schema/intersection.js +33 -0
  80. package/dist/schema/intersection.js.map +1 -0
  81. package/dist/schema/literal.d.ts +7 -0
  82. package/dist/schema/literal.d.ts.map +1 -0
  83. package/dist/schema/literal.js +19 -0
  84. package/dist/schema/literal.js.map +1 -0
  85. package/dist/schema/never.d.ts +5 -0
  86. package/dist/schema/never.d.ts.map +1 -0
  87. package/dist/schema/never.js +11 -0
  88. package/dist/schema/never.js.map +1 -0
  89. package/dist/schema/null.d.ts +7 -0
  90. package/dist/schema/null.d.ts.map +1 -0
  91. package/dist/schema/null.js +18 -0
  92. package/dist/schema/null.js.map +1 -0
  93. package/dist/schema/object.d.ts +47 -0
  94. package/dist/schema/object.d.ts.map +1 -0
  95. package/dist/schema/object.js +89 -0
  96. package/dist/schema/object.js.map +1 -0
  97. package/dist/schema/params.d.ts +22 -0
  98. package/dist/schema/params.d.ts.map +1 -0
  99. package/dist/schema/params.js +115 -0
  100. package/dist/schema/params.js.map +1 -0
  101. package/dist/schema/payload.d.ts +19 -0
  102. package/dist/schema/payload.d.ts.map +1 -0
  103. package/dist/schema/payload.js +16 -0
  104. package/dist/schema/payload.js.map +1 -0
  105. package/dist/schema/permission-set.d.ts +15 -0
  106. package/dist/schema/permission-set.d.ts.map +1 -0
  107. package/dist/schema/permission-set.js +16 -0
  108. package/dist/schema/permission-set.js.map +1 -0
  109. package/dist/schema/permission.d.ts +9 -0
  110. package/dist/schema/permission.d.ts.map +1 -0
  111. package/dist/schema/permission.js +14 -0
  112. package/dist/schema/permission.js.map +1 -0
  113. package/dist/schema/procedure.d.ts +17 -0
  114. package/dist/schema/procedure.d.ts.map +1 -0
  115. package/dist/schema/procedure.js +20 -0
  116. package/dist/schema/procedure.js.map +1 -0
  117. package/dist/schema/query.d.ts +15 -0
  118. package/dist/schema/query.d.ts.map +1 -0
  119. package/dist/schema/query.js +18 -0
  120. package/dist/schema/query.js.map +1 -0
  121. package/dist/schema/record.d.ts +37 -0
  122. package/dist/schema/record.d.ts.map +1 -0
  123. package/dist/schema/record.js +64 -0
  124. package/dist/schema/record.js.map +1 -0
  125. package/dist/schema/ref.d.ts +10 -0
  126. package/dist/schema/ref.d.ts.map +1 -0
  127. package/dist/schema/ref.js +36 -0
  128. package/dist/schema/ref.js.map +1 -0
  129. package/dist/schema/string.d.ts +24 -0
  130. package/dist/schema/string.d.ts.map +1 -0
  131. package/dist/schema/string.js +107 -0
  132. package/dist/schema/string.js.map +1 -0
  133. package/dist/schema/subscription.d.ts +16 -0
  134. package/dist/schema/subscription.d.ts.map +1 -0
  135. package/dist/schema/subscription.js +18 -0
  136. package/dist/schema/subscription.js.map +1 -0
  137. package/dist/schema/token.d.ts +10 -0
  138. package/dist/schema/token.d.ts.map +1 -0
  139. package/dist/schema/token.js +36 -0
  140. package/dist/schema/token.js.map +1 -0
  141. package/dist/schema/typed-object.d.ts +32 -0
  142. package/dist/schema/typed-object.d.ts.map +1 -0
  143. package/dist/schema/typed-object.js +40 -0
  144. package/dist/schema/typed-object.js.map +1 -0
  145. package/dist/schema/typed-ref.d.ts +30 -0
  146. package/dist/schema/typed-ref.d.ts.map +1 -0
  147. package/dist/schema/typed-ref.js +44 -0
  148. package/dist/schema/typed-ref.js.map +1 -0
  149. package/dist/schema/typed-union.d.ts +26 -0
  150. package/dist/schema/typed-union.d.ts.map +1 -0
  151. package/dist/schema/typed-union.js +54 -0
  152. package/dist/schema/typed-union.js.map +1 -0
  153. package/dist/schema/union.d.ts +9 -0
  154. package/dist/schema/union.d.ts.map +1 -0
  155. package/dist/schema/union.js +29 -0
  156. package/dist/schema/union.js.map +1 -0
  157. package/dist/schema/unknown-object.d.ts +9 -0
  158. package/dist/schema/unknown-object.d.ts.map +1 -0
  159. package/dist/schema/unknown-object.js +16 -0
  160. package/dist/schema/unknown-object.js.map +1 -0
  161. package/dist/schema/unknown.d.ts +5 -0
  162. package/dist/schema/unknown.d.ts.map +1 -0
  163. package/dist/schema/unknown.js +11 -0
  164. package/dist/schema/unknown.js.map +1 -0
  165. package/dist/schema.d.ts +34 -0
  166. package/dist/schema.d.ts.map +1 -0
  167. package/dist/schema.js +41 -0
  168. package/dist/schema.js.map +1 -0
  169. package/dist/util/array-agg.d.ts +20 -0
  170. package/dist/util/array-agg.d.ts.map +1 -0
  171. package/dist/util/array-agg.js +42 -0
  172. package/dist/util/array-agg.js.map +1 -0
  173. package/dist/validation/property-key.d.ts +2 -0
  174. package/dist/validation/property-key.d.ts.map +1 -0
  175. package/dist/validation/property-key.js +3 -0
  176. package/dist/validation/property-key.js.map +1 -0
  177. package/dist/validation/validation-error.d.ts +9 -0
  178. package/dist/validation/validation-error.d.ts.map +1 -0
  179. package/dist/validation/validation-error.js +27 -0
  180. package/dist/validation/validation-error.js.map +1 -0
  181. package/dist/validation/validation-issue.d.ts +45 -0
  182. package/dist/validation/validation-issue.d.ts.map +1 -0
  183. package/dist/validation/validation-issue.js +167 -0
  184. package/dist/validation/validation-issue.js.map +1 -0
  185. package/dist/validation/validator.d.ts +113 -0
  186. package/dist/validation/validator.d.ts.map +1 -0
  187. package/dist/validation/validator.js +209 -0
  188. package/dist/validation/validator.js.map +1 -0
  189. package/dist/validation.d.ts +5 -0
  190. package/dist/validation.d.ts.map +1 -0
  191. package/dist/validation.js +8 -0
  192. package/dist/validation.js.map +1 -0
  193. package/package.json +45 -0
  194. package/src/core/$type.ts +19 -0
  195. package/src/core/record-key.ts +15 -0
  196. package/src/core/result.ts +73 -0
  197. package/src/core/string-format.ts +124 -0
  198. package/src/core/types.ts +22 -0
  199. package/src/core.ts +5 -0
  200. package/src/external.ts +365 -0
  201. package/src/index.ts +3 -0
  202. package/src/schema/_parameters.ts +26 -0
  203. package/src/schema/array.ts +51 -0
  204. package/src/schema/blob.ts +82 -0
  205. package/src/schema/boolean.ts +24 -0
  206. package/src/schema/bytes.ts +38 -0
  207. package/src/schema/cid.ts +27 -0
  208. package/src/schema/custom.ts +36 -0
  209. package/src/schema/dict.ts +69 -0
  210. package/src/schema/discriminated-union.ts +144 -0
  211. package/src/schema/enum.ts +20 -0
  212. package/src/schema/integer.ts +41 -0
  213. package/src/schema/intersection.ts +57 -0
  214. package/src/schema/literal.ts +20 -0
  215. package/src/schema/never.ts +14 -0
  216. package/src/schema/null.ts +20 -0
  217. package/src/schema/object.test.ts +138 -0
  218. package/src/schema/object.ts +180 -0
  219. package/src/schema/params.ts +157 -0
  220. package/src/schema/payload.ts +53 -0
  221. package/src/schema/permission-set.ts +22 -0
  222. package/src/schema/permission.ts +15 -0
  223. package/src/schema/procedure.ts +35 -0
  224. package/src/schema/query.ts +28 -0
  225. package/src/schema/record.ts +106 -0
  226. package/src/schema/ref.ts +47 -0
  227. package/src/schema/string.ts +139 -0
  228. package/src/schema/subscription.ts +35 -0
  229. package/src/schema/token.ts +41 -0
  230. package/src/schema/typed-object.ts +64 -0
  231. package/src/schema/typed-ref.ts +68 -0
  232. package/src/schema/typed-union.ts +106 -0
  233. package/src/schema/union.ts +40 -0
  234. package/src/schema/unknown-object.ts +20 -0
  235. package/src/schema/unknown.ts +10 -0
  236. package/src/schema.ts +40 -0
  237. package/src/util/array-agg.test.ts +41 -0
  238. package/src/util/array-agg.ts +43 -0
  239. package/src/validation/property-key.ts +1 -0
  240. package/src/validation/validation-error.ts +32 -0
  241. package/src/validation/validation-issue.ts +231 -0
  242. package/src/validation/validator.ts +361 -0
  243. package/src/validation.ts +4 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnionSchema = void 0;
4
+ const validation_js_1 = require("../validation.js");
5
+ class UnionSchema extends validation_js_1.Validator {
6
+ validators;
7
+ constructor(validators) {
8
+ super();
9
+ this.validators = validators;
10
+ }
11
+ validateInContext(input, ctx) {
12
+ const failures = [];
13
+ for (const validator of this.validators) {
14
+ const result = ctx.validate(input, validator);
15
+ if (result.success) {
16
+ return result;
17
+ }
18
+ else {
19
+ failures.push(result);
20
+ }
21
+ }
22
+ return {
23
+ success: false,
24
+ error: validation_js_1.ValidationError.fromFailures(failures),
25
+ };
26
+ }
27
+ }
28
+ exports.UnionSchema = UnionSchema;
29
+ //# sourceMappingURL=union.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union.js","sourceRoot":"","sources":["../../src/schema/union.ts"],"names":[],"mappings":";;;AAAA,oDAOyB;AAKzB,MAAa,WAEX,SAAQ,yBAA+B;IACR;IAA/B,YAA+B,UAAa;QAC1C,KAAK,EAAE,CAAA;QADsB,eAAU,GAAV,UAAU,CAAG;IAE5C,CAAC;IAEQ,iBAAiB,CACxB,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 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<\n V extends UnionSchemaValidators = any,\n> extends Validator<UnionSchemaOutput<V>> {\n constructor(protected readonly validators: V) {\n super()\n }\n\n override 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"]}
@@ -0,0 +1,9 @@
1
+ import { LexMap } from '@atproto/lex-data';
2
+ import { ValidationResult, Validator, ValidatorContext } from '../validation';
3
+ export type { LexMap };
4
+ export type UnknownObjectOutput = LexMap;
5
+ export declare class UnknownObjectSchema extends Validator<UnknownObjectOutput> {
6
+ readonly lexiconType: "unknown";
7
+ validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<UnknownObjectOutput>;
8
+ }
9
+ //# sourceMappingURL=unknown-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknown-object.d.ts","sourceRoot":"","sources":["../../src/schema/unknown-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE7E,YAAY,EAAE,MAAM,EAAE,CAAA;AACtB,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAExC,qBAAa,mBAAoB,SAAQ,SAAS,CAAC,mBAAmB,CAAC;IACrE,QAAQ,CAAC,WAAW,EAAG,SAAS,CAAS;IAEhC,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,mBAAmB,CAAC;CAOzC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnknownObjectSchema = void 0;
4
+ const lex_data_1 = require("@atproto/lex-data");
5
+ const validation_1 = require("../validation");
6
+ class UnknownObjectSchema extends validation_1.Validator {
7
+ lexiconType = 'unknown';
8
+ validateInContext(input, ctx) {
9
+ if ((0, lex_data_1.isLexMap)(input)) {
10
+ return ctx.success(input);
11
+ }
12
+ return ctx.issueInvalidType(input, 'unknown');
13
+ }
14
+ }
15
+ exports.UnknownObjectSchema = UnknownObjectSchema;
16
+ //# sourceMappingURL=unknown-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknown-object.js","sourceRoot":"","sources":["../../src/schema/unknown-object.ts"],"names":[],"mappings":";;;AAAA,gDAAoD;AACpD,8CAA6E;AAK7E,MAAa,mBAAoB,SAAQ,sBAA8B;IAC5D,WAAW,GAAG,SAAkB,CAAA;IAEhC,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,IAAI,IAAA,mBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC;CACF;AAbD,kDAaC","sourcesContent":["import { LexMap, isLexMap } from '@atproto/lex-data'\nimport { ValidationResult, Validator, ValidatorContext } from '../validation'\n\nexport type { LexMap }\nexport type UnknownObjectOutput = LexMap\n\nexport class UnknownObjectSchema extends Validator<UnknownObjectOutput> {\n readonly lexiconType = 'unknown' as const\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<UnknownObjectOutput> {\n if (isLexMap(input)) {\n return ctx.success(input)\n }\n\n return ctx.issueInvalidType(input, 'unknown')\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { ValidationResult, Validator, ValidatorContext } from '../validation';
2
+ export declare class UnknownSchema extends Validator<unknown> {
3
+ validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<unknown>;
4
+ }
5
+ //# sourceMappingURL=unknown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknown.d.ts","sourceRoot":"","sources":["../../src/schema/unknown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE7E,qBAAa,aAAc,SAAQ,SAAS,CAAC,OAAO,CAAC;IAC1C,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,OAAO,CAAC;CAG7B"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnknownSchema = void 0;
4
+ const validation_1 = require("../validation");
5
+ class UnknownSchema extends validation_1.Validator {
6
+ validateInContext(input, ctx) {
7
+ return ctx.success(input);
8
+ }
9
+ }
10
+ exports.UnknownSchema = UnknownSchema;
11
+ //# sourceMappingURL=unknown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknown.js","sourceRoot":"","sources":["../../src/schema/unknown.ts"],"names":[],"mappings":";;;AAAA,8CAA6E;AAE7E,MAAa,aAAc,SAAQ,sBAAkB;IAC1C,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF;AAPD,sCAOC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation'\n\nexport class UnknownSchema extends Validator<unknown> {\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<unknown> {\n return ctx.success(input)\n }\n}\n"]}
@@ -0,0 +1,34 @@
1
+ export * from './schema/_parameters.js';
2
+ export * from './schema/array.js';
3
+ export * from './schema/blob.js';
4
+ export * from './schema/boolean.js';
5
+ export * from './schema/bytes.js';
6
+ export * from './schema/cid.js';
7
+ export * from './schema/dict.js';
8
+ export * from './schema/enum.js';
9
+ export * from './schema/integer.js';
10
+ export * from './schema/literal.js';
11
+ export * from './schema/never.js';
12
+ export * from './schema/null.js';
13
+ export * from './schema/object.js';
14
+ export * from './schema/string.js';
15
+ export * from './schema/unknown-object.js';
16
+ export * from './schema/unknown.js';
17
+ export * from './schema/custom.js';
18
+ export * from './schema/discriminated-union.js';
19
+ export * from './schema/intersection.js';
20
+ export * from './schema/ref.js';
21
+ export * from './schema/union.js';
22
+ export * from './schema/params.js';
23
+ export * from './schema/payload.js';
24
+ export * from './schema/permission-set.js';
25
+ export * from './schema/permission.js';
26
+ export * from './schema/procedure.js';
27
+ export * from './schema/query.js';
28
+ export * from './schema/record.js';
29
+ export * from './schema/subscription.js';
30
+ export * from './schema/token.js';
31
+ export * from './schema/typed-object.js';
32
+ export * from './schema/typed-ref.js';
33
+ export * from './schema/typed-union.js';
34
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAA;AAGvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AAGnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AAGjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA"}
package/dist/schema.js ADDED
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ // Utilities (that depend on *and* are used by schemas)
5
+ tslib_1.__exportStar(require("./schema/_parameters.js"), exports);
6
+ // Concrete Types
7
+ tslib_1.__exportStar(require("./schema/array.js"), exports);
8
+ tslib_1.__exportStar(require("./schema/blob.js"), exports);
9
+ tslib_1.__exportStar(require("./schema/boolean.js"), exports);
10
+ tslib_1.__exportStar(require("./schema/bytes.js"), exports);
11
+ tslib_1.__exportStar(require("./schema/cid.js"), exports);
12
+ tslib_1.__exportStar(require("./schema/dict.js"), exports);
13
+ tslib_1.__exportStar(require("./schema/enum.js"), exports);
14
+ tslib_1.__exportStar(require("./schema/integer.js"), exports);
15
+ tslib_1.__exportStar(require("./schema/literal.js"), exports);
16
+ tslib_1.__exportStar(require("./schema/never.js"), exports);
17
+ tslib_1.__exportStar(require("./schema/null.js"), exports);
18
+ tslib_1.__exportStar(require("./schema/object.js"), exports);
19
+ tslib_1.__exportStar(require("./schema/string.js"), exports);
20
+ tslib_1.__exportStar(require("./schema/unknown-object.js"), exports);
21
+ tslib_1.__exportStar(require("./schema/unknown.js"), exports);
22
+ // Composite Types
23
+ tslib_1.__exportStar(require("./schema/custom.js"), exports);
24
+ tslib_1.__exportStar(require("./schema/discriminated-union.js"), exports);
25
+ tslib_1.__exportStar(require("./schema/intersection.js"), exports);
26
+ tslib_1.__exportStar(require("./schema/ref.js"), exports);
27
+ tslib_1.__exportStar(require("./schema/union.js"), exports);
28
+ // Lexicon specific Types
29
+ tslib_1.__exportStar(require("./schema/params.js"), exports);
30
+ tslib_1.__exportStar(require("./schema/payload.js"), exports);
31
+ tslib_1.__exportStar(require("./schema/permission-set.js"), exports);
32
+ tslib_1.__exportStar(require("./schema/permission.js"), exports);
33
+ tslib_1.__exportStar(require("./schema/procedure.js"), exports);
34
+ tslib_1.__exportStar(require("./schema/query.js"), exports);
35
+ tslib_1.__exportStar(require("./schema/record.js"), exports);
36
+ tslib_1.__exportStar(require("./schema/subscription.js"), exports);
37
+ tslib_1.__exportStar(require("./schema/token.js"), exports);
38
+ tslib_1.__exportStar(require("./schema/typed-object.js"), exports);
39
+ tslib_1.__exportStar(require("./schema/typed-ref.js"), exports);
40
+ tslib_1.__exportStar(require("./schema/typed-union.js"), exports);
41
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AACvD,kEAAuC;AAEvC,iBAAiB;AACjB,4DAAiC;AACjC,2DAAgC;AAChC,8DAAmC;AACnC,4DAAiC;AACjC,0DAA+B;AAC/B,2DAAgC;AAChC,2DAAgC;AAChC,8DAAmC;AACnC,8DAAmC;AACnC,4DAAiC;AACjC,2DAAgC;AAChC,6DAAkC;AAClC,6DAAkC;AAClC,qEAA0C;AAC1C,8DAAmC;AAEnC,kBAAkB;AAClB,6DAAkC;AAClC,0EAA+C;AAC/C,mEAAwC;AACxC,0DAA+B;AAC/B,4DAAiC;AAEjC,yBAAyB;AACzB,6DAAkC;AAClC,8DAAmC;AACnC,qEAA0C;AAC1C,iEAAsC;AACtC,gEAAqC;AACrC,4DAAiC;AACjC,6DAAkC;AAClC,mEAAwC;AACxC,4DAAiC;AACjC,mEAAwC;AACxC,gEAAqC;AACrC,kEAAuC","sourcesContent":["// Utilities (that depend on *and* are used by schemas)\nexport * from './schema/_parameters.js'\n\n// Concrete Types\nexport * from './schema/array.js'\nexport * from './schema/blob.js'\nexport * from './schema/boolean.js'\nexport * from './schema/bytes.js'\nexport * from './schema/cid.js'\nexport * from './schema/dict.js'\nexport * from './schema/enum.js'\nexport * from './schema/integer.js'\nexport * from './schema/literal.js'\nexport * from './schema/never.js'\nexport * from './schema/null.js'\nexport * from './schema/object.js'\nexport * from './schema/string.js'\nexport * from './schema/unknown-object.js'\nexport * from './schema/unknown.js'\n\n// Composite Types\nexport * from './schema/custom.js'\nexport * from './schema/discriminated-union.js'\nexport * from './schema/intersection.js'\nexport * from './schema/ref.js'\nexport * from './schema/union.js'\n\n// Lexicon specific Types\nexport * from './schema/params.js'\nexport * from './schema/payload.js'\nexport * from './schema/permission-set.js'\nexport * from './schema/permission.js'\nexport * from './schema/procedure.js'\nexport * from './schema/query.js'\nexport * from './schema/record.js'\nexport * from './schema/subscription.js'\nexport * from './schema/token.js'\nexport * from './schema/typed-object.js'\nexport * from './schema/typed-ref.js'\nexport * from './schema/typed-union.js'\n"]}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Aggregates items in an array based on a comparison function and an aggregation function.
3
+ *
4
+ * @param arr - The input array to aggregate.
5
+ * @param cmp - A comparison function that determines if two items belong to the same group.
6
+ * @param agg - An aggregation function that combines items in a group into a single item.
7
+ * @returns An array of aggregated items.
8
+ * @example
9
+ * ```ts
10
+ * const input = [1, 1, 2, 2, 3, 3, 3]
11
+ * const result = arrayAgg(
12
+ * input,
13
+ * (a, b) => a === b,
14
+ * (items) => { value: items[0], sum: items.reduce((sum, item) => sum + item, 0) },
15
+ * )
16
+ * // result is [{ value: 1, sum: 2 }, { value: 2, sum: 4 }, { value: 3, sum: 6 }]
17
+ * ```
18
+ */
19
+ export declare function arrayAgg<T, O>(arr: readonly T[], cmp: (a: T, b: T) => boolean, agg: (items: [T, ...T[]]) => O): O[];
20
+ //# sourceMappingURL=array-agg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-agg.d.ts","sourceRoot":"","sources":["../../src/util/array-agg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,GAAG,EAAE,SAAS,CAAC,EAAE,EACjB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,EAC5B,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAC7B,CAAC,EAAE,CAoBL"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.arrayAgg = arrayAgg;
4
+ /**
5
+ * Aggregates items in an array based on a comparison function and an aggregation function.
6
+ *
7
+ * @param arr - The input array to aggregate.
8
+ * @param cmp - A comparison function that determines if two items belong to the same group.
9
+ * @param agg - An aggregation function that combines items in a group into a single item.
10
+ * @returns An array of aggregated items.
11
+ * @example
12
+ * ```ts
13
+ * const input = [1, 1, 2, 2, 3, 3, 3]
14
+ * const result = arrayAgg(
15
+ * input,
16
+ * (a, b) => a === b,
17
+ * (items) => { value: items[0], sum: items.reduce((sum, item) => sum + item, 0) },
18
+ * )
19
+ * // result is [{ value: 1, sum: 2 }, { value: 2, sum: 4 }, { value: 3, sum: 6 }]
20
+ * ```
21
+ */
22
+ function arrayAgg(arr, cmp, agg) {
23
+ if (arr.length === 0)
24
+ return [];
25
+ const groups = [[arr[0]]];
26
+ const skipped = Array(arr.length);
27
+ outer: for (let i = 1; i < arr.length; i++) {
28
+ if (skipped[i])
29
+ continue;
30
+ const item = arr[i];
31
+ for (let j = 0; j < groups.length; j++) {
32
+ if (cmp(item, groups[j][0])) {
33
+ groups[j].push(item);
34
+ skipped[i] = true;
35
+ continue outer;
36
+ }
37
+ }
38
+ groups.push([item]);
39
+ }
40
+ return groups.map(agg);
41
+ }
42
+ //# sourceMappingURL=array-agg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-agg.js","sourceRoot":"","sources":["../../src/util/array-agg.ts"],"names":[],"mappings":";;AAkBA,4BAwBC;AA1CD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,QAAQ,CACtB,GAAiB,EACjB,GAA4B,EAC5B,GAA8B;IAE9B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAE/B,MAAM,MAAM,GAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,KAAK,CAAsB,GAAG,CAAC,MAAM,CAAC,CAAA;IAEtD,KAAK,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,CAAC,CAAC;YAAE,SAAQ;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACpB,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;gBACjB,SAAS,KAAK,CAAA;YAChB,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACxB,CAAC","sourcesContent":["/**\n * Aggregates items in an array based on a comparison function and an aggregation function.\n *\n * @param arr - The input array to aggregate.\n * @param cmp - A comparison function that determines if two items belong to the same group.\n * @param agg - An aggregation function that combines items in a group into a single item.\n * @returns An array of aggregated items.\n * @example\n * ```ts\n * const input = [1, 1, 2, 2, 3, 3, 3]\n * const result = arrayAgg(\n * input,\n * (a, b) => a === b,\n * (items) => { value: items[0], sum: items.reduce((sum, item) => sum + item, 0) },\n * )\n * // result is [{ value: 1, sum: 2 }, { value: 2, sum: 4 }, { value: 3, sum: 6 }]\n * ```\n */\nexport function arrayAgg<T, O>(\n arr: readonly T[],\n cmp: (a: T, b: T) => boolean,\n agg: (items: [T, ...T[]]) => O,\n): O[] {\n if (arr.length === 0) return []\n\n const groups: [T, ...T[]][] = [[arr[0]]]\n const skipped = Array<undefined | boolean>(arr.length)\n\n outer: for (let i = 1; i < arr.length; i++) {\n if (skipped[i]) continue\n const item = arr[i]\n for (let j = 0; j < groups.length; j++) {\n if (cmp(item, groups[j][0])) {\n groups[j].push(item)\n skipped[i] = true\n continue outer\n }\n }\n groups.push([item])\n }\n\n return groups.map(agg)\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export type PropertyKey = string | number;
2
+ //# sourceMappingURL=property-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-key.d.ts","sourceRoot":"","sources":["../../src/validation/property-key.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=property-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-key.js","sourceRoot":"","sources":["../../src/validation/property-key.ts"],"names":[],"mappings":"","sourcesContent":["export type PropertyKey = string | number\n"]}
@@ -0,0 +1,9 @@
1
+ import { ResultFailure } from '../core.js';
2
+ import { ValidationIssue } from './validation-issue.js';
3
+ export declare class ValidationError extends Error {
4
+ readonly issues: ValidationIssue[];
5
+ name: string;
6
+ constructor(issues: ValidationIssue[], options?: ErrorOptions);
7
+ static fromFailures(failures: ResultFailure<ValidationError>[]): ValidationError;
8
+ }
9
+ //# sourceMappingURL=validation-error.d.ts.map
@@ -0,0 +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;AACxD,OAAO,EACL,eAAe,EAGhB,MAAM,uBAAuB,CAAA;AAE9B,qBAAa,eAAgB,SAAQ,KAAK;IAItC,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE;IAHpC,IAAI,SAAoB;gBAGb,MAAM,EAAE,eAAe,EAAE,EAClC,OAAO,CAAC,EAAE,YAAY;IAKxB,MAAM,CAAC,YAAY,CACjB,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EAAE,GACzC,eAAe;CAQnB"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationError = void 0;
4
+ const core_js_1 = require("../core.js");
5
+ const validation_issue_js_1 = require("./validation-issue.js");
6
+ class ValidationError extends Error {
7
+ issues;
8
+ name = 'ValidationError';
9
+ constructor(issues, options) {
10
+ super(issues.map(validation_issue_js_1.stringifyIssue).join(', '), options);
11
+ this.issues = issues;
12
+ }
13
+ static fromFailures(failures) {
14
+ if (failures.length === 1)
15
+ return failures[0].error;
16
+ const issues = failures.flatMap(extractFailureIssues);
17
+ return new ValidationError((0, validation_issue_js_1.aggregateIssues)(issues), {
18
+ // Keep the original errors as the cause chain
19
+ cause: failures.map(core_js_1.failureError),
20
+ });
21
+ }
22
+ }
23
+ exports.ValidationError = ValidationError;
24
+ function extractFailureIssues(result) {
25
+ return result.error.issues;
26
+ }
27
+ //# sourceMappingURL=validation-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../src/validation/validation-error.ts"],"names":[],"mappings":";;;AAAA,wCAAwD;AACxD,+DAI8B;AAE9B,MAAa,eAAgB,SAAQ,KAAK;IAI7B;IAHX,IAAI,GAAG,iBAAiB,CAAA;IAExB,YACW,MAAyB,EAClC,OAAsB;QAEtB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oCAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;QAH5C,WAAM,GAAN,MAAM,CAAmB;IAIpC,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,QAA0C;QAE1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;QACrD,OAAO,IAAI,eAAe,CAAC,IAAA,qCAAe,EAAC,MAAM,CAAC,EAAE;YAClD,8CAA8C;YAC9C,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,sBAAY,CAAC;SAClC,CAAC,CAAA;IACJ,CAAC;CACF;AApBD,0CAoBC;AAED,SAAS,oBAAoB,CAAC,MAAsC;IAClE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAA;AAC5B,CAAC","sourcesContent":["import { ResultFailure, failureError } from '../core.js'\nimport {\n ValidationIssue,\n aggregateIssues,\n stringifyIssue,\n} from './validation-issue.js'\n\nexport class ValidationError extends Error {\n name = 'ValidationError'\n\n constructor(\n readonly issues: ValidationIssue[],\n options?: ErrorOptions,\n ) {\n super(issues.map(stringifyIssue).join(', '), options)\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(aggregateIssues(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"]}
@@ -0,0 +1,45 @@
1
+ import { PropertyKey } from './property-key.js';
2
+ export interface Issue<I = unknown> {
3
+ readonly input: I;
4
+ readonly code: string;
5
+ readonly message?: string;
6
+ readonly path: readonly PropertyKey[];
7
+ }
8
+ export interface IssueCustom extends Issue {
9
+ readonly code: 'custom';
10
+ readonly message: string;
11
+ }
12
+ export interface IssueInvalidFormat extends Issue {
13
+ readonly code: 'invalid_format';
14
+ readonly format: string;
15
+ }
16
+ export interface IssueInvalidType extends Issue {
17
+ readonly code: 'invalid_type';
18
+ readonly expected: readonly string[];
19
+ }
20
+ export interface IssueInvalidValue extends Issue {
21
+ readonly code: 'invalid_value';
22
+ readonly values: readonly unknown[];
23
+ }
24
+ export interface IssueRequiredKey extends Issue {
25
+ readonly code: 'required_key';
26
+ readonly key: PropertyKey;
27
+ }
28
+ export interface IssueTooBig extends Issue {
29
+ readonly code: 'too_big';
30
+ readonly maximum: number;
31
+ readonly type: 'array' | 'string' | 'integer' | 'grapheme' | 'bytes' | 'blob';
32
+ readonly actual: number;
33
+ }
34
+ export interface IssueTooSmall extends Issue {
35
+ readonly code: 'too_small';
36
+ readonly minimum: number;
37
+ readonly type: 'array' | 'string' | 'integer' | 'grapheme' | 'bytes';
38
+ readonly actual: number;
39
+ }
40
+ export type ValidationIssue = IssueCustom | IssueInvalidFormat | IssueInvalidType | IssueInvalidValue | IssueRequiredKey | IssueTooBig | IssueTooSmall;
41
+ export declare function stringifyIssue(issue: ValidationIssue): string;
42
+ export declare function stringifyType(value: unknown): string;
43
+ export declare function stringifyValue(value: unknown): string;
44
+ export declare function aggregateIssues(issues: ValidationIssue[]): ValidationIssue[];
45
+ //# sourceMappingURL=validation-issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-issue.d.ts","sourceRoot":"","sources":["../../src/validation/validation-issue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG,OAAO;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAA;CACtC;AAED,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,kBAAmB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAED,MAAM,WAAW,iBAAkB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CACpC;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;CAC1B;AAED,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAA;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,WAAW,GACX,aAAa,CAAA;AAEjB,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAsB7D;AAuDD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAkBpD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAmBrD;AAcD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CA8B5E"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stringifyIssue = stringifyIssue;
4
+ exports.stringifyType = stringifyType;
5
+ exports.stringifyValue = stringifyValue;
6
+ exports.aggregateIssues = aggregateIssues;
7
+ const lex_data_1 = require("@atproto/lex-data");
8
+ const array_agg_js_1 = require("../util/array-agg.js");
9
+ function stringifyIssue(issue) {
10
+ const pathStr = issue.path.length ? ` at ${buildJsonPath(issue.path)}` : '';
11
+ switch (issue.code) {
12
+ case 'invalid_format':
13
+ return `Invalid ${stringifyStringFormat(issue.format)} format${issue.message ? ` (${issue.message})` : ''}${pathStr} (got ${stringifyValue(issue.input)})`;
14
+ case 'invalid_type':
15
+ return `Expected ${oneOf(issue.expected.map(stringifyExpectedType))} value type${pathStr} (got ${stringifyType(issue.input)})`;
16
+ case 'invalid_value':
17
+ return `Expected ${oneOf(issue.values.map(stringifyValue))}${pathStr} (got ${stringifyValue(issue.input)})`;
18
+ case 'required_key':
19
+ return `Missing required key "${String(issue.key)}"${pathStr}`;
20
+ case 'too_big':
21
+ return `${issue.type} too big (maximum ${issue.maximum})${pathStr} (got ${issue.actual})`;
22
+ case 'too_small':
23
+ return `${issue.type} too small (minimum ${issue.minimum})${pathStr} (got ${issue.actual})`;
24
+ case 'custom':
25
+ return `${issue.message}${pathStr}`;
26
+ default:
27
+ // @ts-expect-error fool-proofing
28
+ return `${issue.code} validation error${pathStr}`;
29
+ }
30
+ }
31
+ function stringifyExpectedType(expected) {
32
+ if (expected === '$typed') {
33
+ return 'an object or record which includes a "$type" property';
34
+ }
35
+ return expected;
36
+ }
37
+ function buildJsonPath(path) {
38
+ let jsonPath = '$';
39
+ for (const segment of path) {
40
+ if (typeof segment === 'number') {
41
+ jsonPath += `[${segment}]`;
42
+ }
43
+ else if (/^[a-zA-Z_$][a-zA-Z0-9_]*$/.test(segment)) {
44
+ jsonPath += `.${segment}`;
45
+ }
46
+ else {
47
+ jsonPath += `[${JSON.stringify(segment)}]`;
48
+ }
49
+ }
50
+ return jsonPath;
51
+ }
52
+ function oneOf(arr) {
53
+ if (arr.length === 0)
54
+ return '';
55
+ if (arr.length === 1)
56
+ return arr[0];
57
+ return `one of ${arr.slice(0, -1).join(', ')} or ${arr.at(-1)}`;
58
+ }
59
+ function stringifyStringFormat(format) {
60
+ switch (format) {
61
+ case 'datetime':
62
+ return 'datetime';
63
+ case 'language':
64
+ return 'language';
65
+ case 'at-identifier':
66
+ return `AT identifier`;
67
+ case 'did':
68
+ return `DID`;
69
+ case 'handle':
70
+ return `handle`;
71
+ case 'nsid':
72
+ return `NSID`;
73
+ case 'cid':
74
+ return `CID string`;
75
+ case 'tid':
76
+ return `TID string`;
77
+ case 'record-key':
78
+ return `record key`;
79
+ default:
80
+ return format;
81
+ }
82
+ }
83
+ function stringifyType(value) {
84
+ switch (typeof value) {
85
+ case 'object':
86
+ if (value === null)
87
+ return 'null';
88
+ if (Array.isArray(value))
89
+ return 'array';
90
+ if (lex_data_1.CID.asCID(value))
91
+ return 'cid';
92
+ if (value instanceof Date)
93
+ return 'date';
94
+ if (value instanceof RegExp)
95
+ return 'regexp';
96
+ if (value instanceof Map)
97
+ return 'map';
98
+ if (value instanceof Set)
99
+ return 'set';
100
+ return 'object';
101
+ case 'number':
102
+ if (Number.isInteger(value))
103
+ return 'integer';
104
+ if (Number.isNaN(value))
105
+ return 'NaN';
106
+ return 'float';
107
+ default:
108
+ return typeof value;
109
+ }
110
+ }
111
+ function stringifyValue(value) {
112
+ switch (typeof value) {
113
+ case 'bigint':
114
+ return `${value}n`;
115
+ case 'number':
116
+ case 'string':
117
+ case 'boolean':
118
+ return JSON.stringify(value);
119
+ case 'object':
120
+ if (Array.isArray(value)) {
121
+ return `[${stringifyArray(value, stringifyValue)}]`;
122
+ }
123
+ if ((0, lex_data_1.isPlainObject)(value)) {
124
+ return `{${stringifyArray(Object.entries(value), stringifyObjectEntry)}}`;
125
+ }
126
+ // fallthrough
127
+ default:
128
+ return stringifyType(value);
129
+ }
130
+ }
131
+ function stringifyObjectEntry([key, _value]) {
132
+ return `${JSON.stringify(key)}: ...`;
133
+ }
134
+ function stringifyArray(arr, fn, n = 2) {
135
+ return arr.slice(0, n).map(fn).join(', ') + (arr.length > n ? ', ...' : '');
136
+ }
137
+ function aggregateIssues(issues) {
138
+ // Quick path for common cases
139
+ if (issues.length <= 1)
140
+ return issues;
141
+ if (issues.length === 2 && issues[0].code !== issues[1].code)
142
+ return issues;
143
+ return [
144
+ // Aggregate invalid_type with identical paths
145
+ ...(0, array_agg_js_1.arrayAgg)(issues.filter((issue) => issue.code === 'invalid_type'), (a, b) => comparePropertyPaths(a.path, b.path), (issues) => ({
146
+ ...issues[0],
147
+ expected: Array.from(new Set(issues.flatMap((iss) => iss.expected))),
148
+ })),
149
+ // Aggregate invalid_value with identical paths
150
+ ...(0, array_agg_js_1.arrayAgg)(issues.filter((issue) => issue.code === 'invalid_value'), (a, b) => comparePropertyPaths(a.path, b.path), (issues) => ({
151
+ ...issues[0],
152
+ values: Array.from(new Set(issues.flatMap((iss) => iss.values))),
153
+ })),
154
+ // Pass through other issues
155
+ ...issues.filter((issue) => issue.code !== 'invalid_type' && issue.code !== 'invalid_value'),
156
+ ];
157
+ }
158
+ function comparePropertyPaths(a, b) {
159
+ if (a.length !== b.length)
160
+ return false;
161
+ for (let i = 0; i < a.length; i++) {
162
+ if (a[i] !== b[i])
163
+ return false;
164
+ }
165
+ return true;
166
+ }
167
+ //# sourceMappingURL=validation-issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-issue.js","sourceRoot":"","sources":["../../src/validation/validation-issue.ts"],"names":[],"mappings":"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","sourcesContent":["import { CID, isPlainObject } from '@atproto/lex-data'\nimport { arrayAgg } from '../util/array-agg.js'\nimport { PropertyKey } from './property-key.js'\n\nexport interface Issue<I = unknown> {\n readonly input: I\n readonly code: string\n readonly message?: string\n readonly path: readonly PropertyKey[]\n}\n\nexport interface IssueCustom extends Issue {\n readonly code: 'custom'\n readonly message: string\n}\n\nexport interface IssueInvalidFormat extends Issue {\n readonly code: 'invalid_format'\n readonly format: string\n}\n\nexport interface IssueInvalidType extends Issue {\n readonly code: 'invalid_type'\n readonly expected: readonly string[]\n}\n\nexport interface IssueInvalidValue extends Issue {\n readonly code: 'invalid_value'\n readonly values: readonly unknown[]\n}\n\nexport interface IssueRequiredKey extends Issue {\n readonly code: 'required_key'\n readonly key: PropertyKey\n}\n\nexport interface IssueTooBig extends Issue {\n readonly code: 'too_big'\n readonly maximum: number\n readonly type: 'array' | 'string' | 'integer' | 'grapheme' | 'bytes' | 'blob'\n readonly actual: number\n}\n\nexport interface IssueTooSmall extends Issue {\n readonly code: 'too_small'\n readonly minimum: number\n readonly type: 'array' | 'string' | 'integer' | 'grapheme' | 'bytes'\n readonly actual: number\n}\n\nexport type ValidationIssue =\n | IssueCustom\n | IssueInvalidFormat\n | IssueInvalidType\n | IssueInvalidValue\n | IssueRequiredKey\n | IssueTooBig\n | IssueTooSmall\n\nexport function stringifyIssue(issue: ValidationIssue): string {\n const pathStr = issue.path.length ? ` at ${buildJsonPath(issue.path)}` : ''\n\n switch (issue.code) {\n case 'invalid_format':\n return `Invalid ${stringifyStringFormat(issue.format)} format${issue.message ? ` (${issue.message})` : ''}${pathStr} (got ${stringifyValue(issue.input)})`\n case 'invalid_type':\n return `Expected ${oneOf(issue.expected.map(stringifyExpectedType))} value type${pathStr} (got ${stringifyType(issue.input)})`\n case 'invalid_value':\n return `Expected ${oneOf(issue.values.map(stringifyValue))}${pathStr} (got ${stringifyValue(issue.input)})`\n case 'required_key':\n return `Missing required key \"${String(issue.key)}\"${pathStr}`\n case 'too_big':\n return `${issue.type} too big (maximum ${issue.maximum})${pathStr} (got ${issue.actual})`\n case 'too_small':\n return `${issue.type} too small (minimum ${issue.minimum})${pathStr} (got ${issue.actual})`\n case 'custom':\n return `${issue.message}${pathStr}`\n default:\n // @ts-expect-error fool-proofing\n return `${issue.code} validation error${pathStr}`\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\n return expected\n}\n\nfunction buildJsonPath(path: readonly PropertyKey[]): string {\n let jsonPath = '$'\n for (const segment of path) {\n if (typeof segment === 'number') {\n jsonPath += `[${segment}]`\n } else if (/^[a-zA-Z_$][a-zA-Z0-9_]*$/.test(segment as string)) {\n jsonPath += `.${segment}`\n } else {\n jsonPath += `[${JSON.stringify(segment)}]`\n }\n }\n return jsonPath\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 stringifyStringFormat(format: string): string {\n switch (format) {\n case 'datetime':\n return 'datetime'\n case 'language':\n return 'language'\n case 'at-identifier':\n return `AT identifier`\n case 'did':\n return `DID`\n case 'handle':\n return `handle`\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 format\n }\n}\n\nexport function 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 (CID.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\nexport function 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\nfunction stringifyObjectEntry([key, _value]: [PropertyKey, unknown]): string {\n return `${JSON.stringify(key)}: ...`\n}\n\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\nexport function aggregateIssues(issues: ValidationIssue[]): ValidationIssue[] {\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.code === 'invalid_type'),\n (a, b) => comparePropertyPaths(a.path, b.path),\n (issues) => ({\n ...issues[0],\n expected: 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.code === 'invalid_value'),\n (a, b) => comparePropertyPaths(a.path, b.path),\n (issues) => ({\n ...issues[0],\n values: Array.from(new Set(issues.flatMap((iss) => iss.values))),\n }),\n ),\n // Pass through other issues\n ...issues.filter(\n (issue) =>\n issue.code !== 'invalid_type' && issue.code !== 'invalid_value',\n ),\n ]\n}\n\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"]}