@atproto/lexicon 0.6.1 → 0.7.0-next.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 (61) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/blob-refs.d.ts +4 -4
  3. package/dist/blob-refs.d.ts.map +1 -1
  4. package/dist/blob-refs.js +20 -46
  5. package/dist/blob-refs.js.map +1 -1
  6. package/dist/index.d.ts +4 -4
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +4 -20
  9. package/dist/index.js.map +1 -1
  10. package/dist/lexicons.d.ts +1 -1
  11. package/dist/lexicons.d.ts.map +1 -1
  12. package/dist/lexicons.js +40 -54
  13. package/dist/lexicons.js.map +1 -1
  14. package/dist/serialize.d.ts.map +1 -1
  15. package/dist/serialize.js +22 -32
  16. package/dist/serialize.js.map +1 -1
  17. package/dist/types.d.ts.map +1 -1
  18. package/dist/types.js +193 -204
  19. package/dist/types.js.map +1 -1
  20. package/dist/util.js +6 -10
  21. package/dist/util.js.map +1 -1
  22. package/dist/validation.d.ts +2 -2
  23. package/dist/validation.d.ts.map +1 -1
  24. package/dist/validation.js +10 -17
  25. package/dist/validation.js.map +1 -1
  26. package/dist/validators/blob.d.ts +2 -2
  27. package/dist/validators/blob.d.ts.map +1 -1
  28. package/dist/validators/blob.js +5 -8
  29. package/dist/validators/blob.js.map +1 -1
  30. package/dist/validators/complex.d.ts +2 -2
  31. package/dist/validators/complex.d.ts.map +1 -1
  32. package/dist/validators/complex.js +20 -26
  33. package/dist/validators/complex.js.map +1 -1
  34. package/dist/validators/formats.d.ts +1 -1
  35. package/dist/validators/formats.d.ts.map +1 -1
  36. package/dist/validators/formats.js +38 -51
  37. package/dist/validators/formats.js.map +1 -1
  38. package/dist/validators/primitives.d.ts +2 -2
  39. package/dist/validators/primitives.d.ts.map +1 -1
  40. package/dist/validators/primitives.js +33 -69
  41. package/dist/validators/primitives.js.map +1 -1
  42. package/dist/validators/xrpc.d.ts +2 -2
  43. package/dist/validators/xrpc.d.ts.map +1 -1
  44. package/dist/validators/xrpc.js +6 -42
  45. package/dist/validators/xrpc.js.map +1 -1
  46. package/{jest.config.js → jest.config.cjs} +8 -1
  47. package/package.json +17 -9
  48. package/src/blob-refs.ts +0 -2
  49. package/src/index.ts +4 -4
  50. package/src/lexicons.ts +4 -4
  51. package/src/serialize.ts +1 -3
  52. package/src/types.ts +1 -3
  53. package/src/validation.ts +4 -4
  54. package/src/validators/blob.ts +3 -3
  55. package/src/validators/complex.ts +5 -5
  56. package/src/validators/formats.ts +3 -4
  57. package/src/validators/primitives.ts +3 -3
  58. package/src/validators/xrpc.ts +8 -4
  59. package/tests/_scaffolds/lexicons.ts +1 -1
  60. package/tests/general.test.ts +5 -5
  61. package/tsconfig.build.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @atproto/lexicon
2
2
 
3
+ ## 0.7.0-next.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`bb7491c`](https://github.com/bluesky-social/atproto/commit/bb7491c29e06181e1d2f8cf6eb454f9bb8ab961b) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24.
8
+
9
+ - [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`07ae5d4`](https://github.com/bluesky-social/atproto/commit/07ae5d4452df51e045e0239da7a04cf0bc154028) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution.
10
+
11
+ Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code.
12
+
13
+ - [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`042df15`](https://github.com/bluesky-social/atproto/commit/042df15087c0e62cd1e715fcbf58852fab875af9) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. Emitted `.d.ts` files now use TypeScript 6's stricter `Uint8Array<ArrayBuffer>` typing in places where Web/Node APIs require buffer-backed (not shared-memory) byte arrays. Consumers compiling against these types on older TypeScript should see no runtime impact, but may need to widen or cast in spots that previously relied on `Uint8Array` defaulting to `<ArrayBufferLike>`.
14
+
15
+ Internal: tsconfig `moduleResolution: "node"` is silenced via `ignoreDeprecations: "6.0"` for now; the proper migration to `node16`/`bundler` resolution is deferred.
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies [[`bb7491c`](https://github.com/bluesky-social/atproto/commit/bb7491c29e06181e1d2f8cf6eb454f9bb8ab961b), [`07ae5d4`](https://github.com/bluesky-social/atproto/commit/07ae5d4452df51e045e0239da7a04cf0bc154028), [`042df15`](https://github.com/bluesky-social/atproto/commit/042df15087c0e62cd1e715fcbf58852fab875af9)]:
20
+ - @atproto/common-web@0.5.0-next.0
21
+ - @atproto/syntax@0.6.0-next.0
22
+
23
+ ## 0.6.2
24
+
25
+ ### Patch Changes
26
+
27
+ - Updated dependencies [[`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`52834ab`](https://github.com/bluesky-social/atproto/commit/52834aba182da8df3611fd9dff924e6c6a3973a7), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd)]:
28
+ - @atproto/syntax@0.5.0
29
+ - @atproto/common-web@0.4.18
30
+
3
31
  ## 0.6.1
4
32
 
5
33
  ### Patch Changes
@@ -2,12 +2,12 @@ import { CID } from 'multiformats/cid';
2
2
  import { z } from 'zod';
3
3
  export declare const typedJsonBlobRef: z.ZodObject<{
4
4
  $type: z.ZodLiteral<"blob">;
5
- ref: z.ZodEffects<z.ZodUnknown, CID, unknown>;
5
+ ref: z.ZodEffects<z.ZodUnknown, CID<unknown, number, number, any>, unknown>;
6
6
  mimeType: z.ZodString;
7
7
  size: z.ZodNumber;
8
8
  }, "strict", z.ZodTypeAny, {
9
9
  $type: "blob";
10
- ref: CID;
10
+ ref: CID<unknown, number, number, any>;
11
11
  mimeType: string;
12
12
  size: number;
13
13
  }, {
@@ -30,12 +30,12 @@ export declare const untypedJsonBlobRef: z.ZodObject<{
30
30
  export type UntypedJsonBlobRef = z.infer<typeof untypedJsonBlobRef>;
31
31
  export declare const jsonBlobRef: z.ZodUnion<[z.ZodObject<{
32
32
  $type: z.ZodLiteral<"blob">;
33
- ref: z.ZodEffects<z.ZodUnknown, CID, unknown>;
33
+ ref: z.ZodEffects<z.ZodUnknown, CID<unknown, number, number, any>, unknown>;
34
34
  mimeType: z.ZodString;
35
35
  size: z.ZodNumber;
36
36
  }, "strict", z.ZodTypeAny, {
37
37
  $type: "blob";
38
- ref: CID;
38
+ ref: CID<unknown, number, number, any>;
39
39
  mimeType: string;
40
40
  size: number;
41
41
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"blob-refs.d.ts","sourceRoot":"","sources":["../src/blob-refs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;EAOlB,CAAA;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D,eAAO,MAAM,kBAAkB;;;;;;;;;EAKpB,CAAA;AACX,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;IAAkD,CAAA;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,qBAAa,OAAO;IAIT,GAAG,EAAE,GAAG;IACR,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,MAAM;IALd,QAAQ,EAAE,WAAW,CAAA;gBAGnB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,WAAW;IAUxB,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;IAO9C,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAQ9C,IAAI,IAAI,WAAW;IAInB,MAAM;CAGP"}
1
+ {"version":3,"file":"blob-refs.d.ts","sourceRoot":"","sources":["../src/blob-refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;EAOlB,CAAA;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D,eAAO,MAAM,kBAAkB;;;;;;;;;EAKpB,CAAA;AACX,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;IAAkD,CAAA;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,qBAAa,OAAO;IAIT,GAAG,EAAE,GAAG;IACR,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,MAAM;IALd,QAAQ,EAAE,WAAW,CAAA;gBAGnB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,WAAW;IAUxB,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;IAO9C,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAQ9C,IAAI,IAAI,WAAW;IAInB,MAAM;CAGP"}
package/dist/blob-refs.js CHANGED
@@ -1,51 +1,26 @@
1
- "use strict";
2
- /* eslint-disable import/no-deprecated */
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.BlobRef = exports.jsonBlobRef = exports.untypedJsonBlobRef = exports.typedJsonBlobRef = void 0;
5
- const cid_1 = require("multiformats/cid");
6
- const zod_1 = require("zod");
7
- const common_web_1 = require("@atproto/common-web");
8
- exports.typedJsonBlobRef = zod_1.z
1
+ import { CID } from 'multiformats/cid';
2
+ import { z } from 'zod';
3
+ import { check, ipldToJson, schema } from '@atproto/common-web';
4
+ export const typedJsonBlobRef = z
9
5
  .object({
10
- $type: zod_1.z.literal('blob'),
11
- ref: common_web_1.schema.cid,
12
- mimeType: zod_1.z.string(),
13
- size: zod_1.z.number(),
6
+ $type: z.literal('blob'),
7
+ ref: schema.cid,
8
+ mimeType: z.string(),
9
+ size: z.number(),
14
10
  })
15
11
  .strict();
16
- exports.untypedJsonBlobRef = zod_1.z
12
+ export const untypedJsonBlobRef = z
17
13
  .object({
18
- cid: zod_1.z.string(),
19
- mimeType: zod_1.z.string(),
14
+ cid: z.string(),
15
+ mimeType: z.string(),
20
16
  })
21
17
  .strict();
22
- exports.jsonBlobRef = zod_1.z.union([exports.typedJsonBlobRef, exports.untypedJsonBlobRef]);
23
- class BlobRef {
18
+ export const jsonBlobRef = z.union([typedJsonBlobRef, untypedJsonBlobRef]);
19
+ export class BlobRef {
24
20
  constructor(ref, mimeType, size, original) {
25
- Object.defineProperty(this, "ref", {
26
- enumerable: true,
27
- configurable: true,
28
- writable: true,
29
- value: ref
30
- });
31
- Object.defineProperty(this, "mimeType", {
32
- enumerable: true,
33
- configurable: true,
34
- writable: true,
35
- value: mimeType
36
- });
37
- Object.defineProperty(this, "size", {
38
- enumerable: true,
39
- configurable: true,
40
- writable: true,
41
- value: size
42
- });
43
- Object.defineProperty(this, "original", {
44
- enumerable: true,
45
- configurable: true,
46
- writable: true,
47
- value: void 0
48
- });
21
+ this.ref = ref;
22
+ this.mimeType = mimeType;
23
+ this.size = size;
49
24
  this.original = original ?? {
50
25
  $type: 'blob',
51
26
  ref,
@@ -54,25 +29,24 @@ class BlobRef {
54
29
  };
55
30
  }
56
31
  static asBlobRef(obj) {
57
- if (common_web_1.check.is(obj, exports.jsonBlobRef)) {
32
+ if (check.is(obj, jsonBlobRef)) {
58
33
  return BlobRef.fromJsonRef(obj);
59
34
  }
60
35
  return null;
61
36
  }
62
37
  static fromJsonRef(json) {
63
- if (common_web_1.check.is(json, exports.typedJsonBlobRef)) {
38
+ if (check.is(json, typedJsonBlobRef)) {
64
39
  return new BlobRef(json.ref, json.mimeType, json.size);
65
40
  }
66
41
  else {
67
- return new BlobRef(cid_1.CID.parse(json.cid), json.mimeType, -1, json);
42
+ return new BlobRef(CID.parse(json.cid), json.mimeType, -1, json);
68
43
  }
69
44
  }
70
45
  ipld() {
71
46
  return this.original;
72
47
  }
73
48
  toJSON() {
74
- return (0, common_web_1.ipldToJson)(this.ipld());
49
+ return ipldToJson(this.ipld());
75
50
  }
76
51
  }
77
- exports.BlobRef = BlobRef;
78
52
  //# sourceMappingURL=blob-refs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"blob-refs.js","sourceRoot":"","sources":["../src/blob-refs.ts"],"names":[],"mappings":";AAAA,yCAAyC;;;AAEzC,0CAAsC;AACtC,6BAAuB;AACvB,oDAA+D;AAElD,QAAA,gBAAgB,GAAG,OAAC;KAC9B,MAAM,CAAC;IACN,KAAK,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACxB,GAAG,EAAE,mBAAM,CAAC,GAAG;IACf,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;CACjB,CAAC;KACD,MAAM,EAAE,CAAA;AAGE,QAAA,kBAAkB,GAAG,OAAC;KAChC,MAAM,CAAC;IACN,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;CACrB,CAAC;KACD,MAAM,EAAE,CAAA;AAGE,QAAA,WAAW,GAAG,OAAC,CAAC,KAAK,CAAC,CAAC,wBAAgB,EAAE,0BAAkB,CAAC,CAAC,CAAA;AAG1E,MAAa,OAAO;IAGlB,YACS,GAAQ,EACR,QAAgB,EAChB,IAAY,EACnB,QAAsB;QAHtB;;;;mBAAO,GAAG;WAAK;QACf;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,IAAI;WAAQ;QALd;;;;;WAAqB;QAQ1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI;YAC1B,KAAK,EAAE,MAAM;YACb,GAAG;YACH,QAAQ;YACR,IAAI;SACL,CAAA;IACH,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,GAAY;QAC3B,IAAI,kBAAK,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAW,CAAC,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAiB;QAClC,IAAI,kBAAK,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAgB,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,OAAO,CAAC,SAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,IAAA,uBAAU,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAChC,CAAC;CACF;AAvCD,0BAuCC","sourcesContent":["/* eslint-disable import/no-deprecated */\n\nimport { CID } from 'multiformats/cid'\nimport { z } from 'zod'\nimport { check, ipldToJson, schema } from '@atproto/common-web'\n\nexport const typedJsonBlobRef = z\n .object({\n $type: z.literal('blob'),\n ref: schema.cid,\n mimeType: z.string(),\n size: z.number(),\n })\n .strict()\nexport type TypedJsonBlobRef = z.infer<typeof typedJsonBlobRef>\n\nexport const untypedJsonBlobRef = z\n .object({\n cid: z.string(),\n mimeType: z.string(),\n })\n .strict()\nexport type UntypedJsonBlobRef = z.infer<typeof untypedJsonBlobRef>\n\nexport const jsonBlobRef = z.union([typedJsonBlobRef, untypedJsonBlobRef])\nexport type JsonBlobRef = z.infer<typeof jsonBlobRef>\n\nexport class BlobRef {\n public original: JsonBlobRef\n\n constructor(\n public ref: CID,\n public mimeType: string,\n public size: number,\n original?: JsonBlobRef,\n ) {\n this.original = original ?? {\n $type: 'blob',\n ref,\n mimeType,\n size,\n }\n }\n\n static asBlobRef(obj: unknown): BlobRef | null {\n if (check.is(obj, jsonBlobRef)) {\n return BlobRef.fromJsonRef(obj)\n }\n return null\n }\n\n static fromJsonRef(json: JsonBlobRef): BlobRef {\n if (check.is(json, typedJsonBlobRef)) {\n return new BlobRef(json.ref, json.mimeType, json.size)\n } else {\n return new BlobRef(CID.parse(json.cid), json.mimeType, -1, json)\n }\n }\n\n ipld(): JsonBlobRef {\n return this.original\n }\n\n toJSON() {\n return ipldToJson(this.ipld())\n }\n}\n"]}
1
+ {"version":3,"file":"blob-refs.js","sourceRoot":"","sources":["../src/blob-refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,GAAG;IACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACjB,CAAC;KACD,MAAM,EAAE,CAAA;AAGX,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC;KACD,MAAM,EAAE,CAAA;AAGX,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAAA;AAG1E,MAAM,OAAO,OAAO;IAGlB,YACS,GAAQ,EACR,QAAgB,EAChB,IAAY,EACnB,QAAsB;QAHf,QAAG,GAAH,GAAG,CAAK;QACR,aAAQ,GAAR,QAAQ,CAAQ;QAChB,SAAI,GAAJ,IAAI,CAAQ;QAGnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI;YAC1B,KAAK,EAAE,MAAM;YACb,GAAG;YACH,QAAQ;YACR,IAAI;SACL,CAAA;IACH,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,GAAY;QAC3B,IAAI,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAiB;QAClC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAChC,CAAC;CACF","sourcesContent":["import { CID } from 'multiformats/cid'\nimport { z } from 'zod'\nimport { check, ipldToJson, schema } from '@atproto/common-web'\n\nexport const typedJsonBlobRef = z\n .object({\n $type: z.literal('blob'),\n ref: schema.cid,\n mimeType: z.string(),\n size: z.number(),\n })\n .strict()\nexport type TypedJsonBlobRef = z.infer<typeof typedJsonBlobRef>\n\nexport const untypedJsonBlobRef = z\n .object({\n cid: z.string(),\n mimeType: z.string(),\n })\n .strict()\nexport type UntypedJsonBlobRef = z.infer<typeof untypedJsonBlobRef>\n\nexport const jsonBlobRef = z.union([typedJsonBlobRef, untypedJsonBlobRef])\nexport type JsonBlobRef = z.infer<typeof jsonBlobRef>\n\nexport class BlobRef {\n public original: JsonBlobRef\n\n constructor(\n public ref: CID,\n public mimeType: string,\n public size: number,\n original?: JsonBlobRef,\n ) {\n this.original = original ?? {\n $type: 'blob',\n ref,\n mimeType,\n size,\n }\n }\n\n static asBlobRef(obj: unknown): BlobRef | null {\n if (check.is(obj, jsonBlobRef)) {\n return BlobRef.fromJsonRef(obj)\n }\n return null\n }\n\n static fromJsonRef(json: JsonBlobRef): BlobRef {\n if (check.is(json, typedJsonBlobRef)) {\n return new BlobRef(json.ref, json.mimeType, json.size)\n } else {\n return new BlobRef(CID.parse(json.cid), json.mimeType, -1, json)\n }\n }\n\n ipld(): JsonBlobRef {\n return this.original\n }\n\n toJSON() {\n return ipldToJson(this.ipld())\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './types';
2
- export * from './lexicons';
3
- export * from './blob-refs';
4
- export * from './serialize';
1
+ export * from './types.js';
2
+ export * from './lexicons.js';
3
+ export * from './blob-refs.js';
4
+ export * from './serialize.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -1,21 +1,5 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./types"), exports);
18
- __exportStar(require("./lexicons"), exports);
19
- __exportStar(require("./blob-refs"), exports);
20
- __exportStar(require("./serialize"), exports);
1
+ export * from './types.js';
2
+ export * from './lexicons.js';
3
+ export * from './blob-refs.js';
4
+ export * from './serialize.js';
21
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,6CAA0B;AAC1B,8CAA2B;AAC3B,8CAA2B","sourcesContent":["export * from './types'\nexport * from './lexicons'\nexport * from './blob-refs'\nexport * from './serialize'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA","sourcesContent":["export * from './types.js'\nexport * from './lexicons.js'\nexport * from './blob-refs.js'\nexport * from './serialize.js'\n"]}
@@ -1,4 +1,4 @@
1
- import { LexUserType, LexiconDoc, ValidationResult } from './types';
1
+ import { LexUserType, LexiconDoc, ValidationResult } from './types.js';
2
2
  /**
3
3
  * A collection of compiled lexicons.
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"lexicons.d.ts","sourceRoot":"","sources":["../src/lexicons.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAEX,UAAU,EAEV,gBAAgB,EAEjB,MAAM,SAAS,CAAA;AAWhB;;GAEG;AACH,qBAAa,QAAS,YAAW,QAAQ,CAAC,UAAU,CAAC;IACnD,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAY;IACzC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAY;gBAE9B,IAAI,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQvC;;;;;;;;;;OAUG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC;IAIzC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAiB1B;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM;IAYlB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAKxC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAK5C;;OAEG;IACH,aAAa,CAAC,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,EAC/D,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,GACnB,OAAO,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;IAiBpC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB;IAkB1D;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAuBhD;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAUpD;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAMnD;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAMpD;;OAEG;IACH,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC;IAMtE;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAI1C"}
1
+ {"version":3,"file":"lexicons.d.ts","sourceRoot":"","sources":["../src/lexicons.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAEX,UAAU,EAEV,gBAAgB,EAEjB,MAAM,YAAY,CAAA;AAWnB;;GAEG;AACH,qBAAa,QAAS,YAAW,QAAQ,CAAC,UAAU,CAAC;IACnD,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAY;IACzC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAY;gBAE9B,IAAI,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQvC;;;;;;;;;;OAUG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC;IAIzC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAiB1B;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM;IAYlB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAKxC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAK5C;;OAEG;IACH,aAAa,CAAC,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,EAC/D,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,GACnB,OAAO,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;IAiBpC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB;IAkB1D;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAuBhD;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAUpD;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAMnD;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAMpD;;OAEG;IACH,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC;IAMtE;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAI1C"}
package/dist/lexicons.js CHANGED
@@ -1,27 +1,14 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Lexicons = void 0;
4
- const types_1 = require("./types");
5
- const util_1 = require("./util");
6
- const validation_1 = require("./validation");
7
- const complex_1 = require("./validators/complex");
1
+ import { InvalidLexiconError, LexiconDefNotFoundError, ValidationError, isObj, } from './types.js';
2
+ import { toLexUri } from './util.js';
3
+ import { assertValidRecord, assertValidXrpcInput, assertValidXrpcMessage, assertValidXrpcOutput, assertValidXrpcParams, } from './validation.js';
4
+ import { object as validateObject } from './validators/complex.js';
8
5
  /**
9
6
  * A collection of compiled lexicons.
10
7
  */
11
- class Lexicons {
8
+ export class Lexicons {
12
9
  constructor(docs) {
13
- Object.defineProperty(this, "docs", {
14
- enumerable: true,
15
- configurable: true,
16
- writable: true,
17
- value: new Map()
18
- });
19
- Object.defineProperty(this, "defs", {
20
- enumerable: true,
21
- configurable: true,
22
- writable: true,
23
- value: new Map()
24
- });
10
+ this.docs = new Map();
11
+ this.defs = new Map();
25
12
  if (docs) {
26
13
  for (const doc of docs) {
27
14
  this.add(doc);
@@ -46,7 +33,7 @@ class Lexicons {
46
33
  * Add a lexicon doc.
47
34
  */
48
35
  add(doc) {
49
- const uri = (0, util_1.toLexUri)(doc.id);
36
+ const uri = toLexUri(doc.id);
50
37
  if (this.docs.has(uri)) {
51
38
  throw new Error(`${uri} has already been registered`);
52
39
  }
@@ -63,7 +50,7 @@ class Lexicons {
63
50
  * Remove a lexicon doc.
64
51
  */
65
52
  remove(uri) {
66
- uri = (0, util_1.toLexUri)(uri);
53
+ uri = toLexUri(uri);
67
54
  const doc = this.docs.get(uri);
68
55
  if (!doc) {
69
56
  throw new Error(`Unable to remove "${uri}": does not exist`);
@@ -77,23 +64,23 @@ class Lexicons {
77
64
  * Get a lexicon doc.
78
65
  */
79
66
  get(uri) {
80
- uri = (0, util_1.toLexUri)(uri);
67
+ uri = toLexUri(uri);
81
68
  return this.docs.get(uri);
82
69
  }
83
70
  /**
84
71
  * Get a definition.
85
72
  */
86
73
  getDef(uri) {
87
- uri = (0, util_1.toLexUri)(uri);
74
+ uri = toLexUri(uri);
88
75
  return this.defs.get(uri);
89
76
  }
90
77
  getDefOrThrow(uri, types) {
91
78
  const def = this.getDef(uri);
92
79
  if (!def) {
93
- throw new types_1.LexiconDefNotFoundError(`Lexicon not found: ${uri}`);
80
+ throw new LexiconDefNotFoundError(`Lexicon not found: ${uri}`);
94
81
  }
95
82
  if (types && !types.includes(def.type)) {
96
- throw new types_1.InvalidLexiconError(`Not a ${types.join(' or ')} lexicon: ${uri}`);
83
+ throw new InvalidLexiconError(`Not a ${types.join(' or ')} lexicon: ${uri}`);
97
84
  }
98
85
  return def;
99
86
  }
@@ -101,88 +88,87 @@ class Lexicons {
101
88
  * Validate a record or object.
102
89
  */
103
90
  validate(lexUri, value) {
104
- if (!(0, types_1.isObj)(value)) {
105
- throw new types_1.ValidationError(`Value must be an object`);
91
+ if (!isObj(value)) {
92
+ throw new ValidationError(`Value must be an object`);
106
93
  }
107
- const lexUriNormalized = (0, util_1.toLexUri)(lexUri);
94
+ const lexUriNormalized = toLexUri(lexUri);
108
95
  const def = this.getDefOrThrow(lexUriNormalized, ['record', 'object']);
109
96
  if (def.type === 'record') {
110
- return (0, complex_1.object)(this, 'Record', def.record, value);
97
+ return validateObject(this, 'Record', def.record, value);
111
98
  }
112
99
  else if (def.type === 'object') {
113
- return (0, complex_1.object)(this, 'Object', def, value);
100
+ return validateObject(this, 'Object', def, value);
114
101
  }
115
102
  else {
116
103
  // shouldn't happen
117
- throw new types_1.InvalidLexiconError('Definition must be a record or object');
104
+ throw new InvalidLexiconError('Definition must be a record or object');
118
105
  }
119
106
  }
120
107
  /**
121
108
  * Validate a record and throw on any error.
122
109
  */
123
110
  assertValidRecord(lexUri, value) {
124
- if (!(0, types_1.isObj)(value)) {
125
- throw new types_1.ValidationError(`Record must be an object`);
111
+ if (!isObj(value)) {
112
+ throw new ValidationError(`Record must be an object`);
126
113
  }
127
114
  if (!('$type' in value)) {
128
- throw new types_1.ValidationError(`Record/$type must be a string`);
115
+ throw new ValidationError(`Record/$type must be a string`);
129
116
  }
130
117
  const { $type } = value;
131
118
  if (typeof $type !== 'string') {
132
- throw new types_1.ValidationError(`Record/$type must be a string`);
119
+ throw new ValidationError(`Record/$type must be a string`);
133
120
  }
134
- const lexUriNormalized = (0, util_1.toLexUri)(lexUri);
135
- if ((0, util_1.toLexUri)($type) !== lexUriNormalized) {
136
- throw new types_1.ValidationError(`Invalid $type: must be ${lexUriNormalized}, got ${$type}`);
121
+ const lexUriNormalized = toLexUri(lexUri);
122
+ if (toLexUri($type) !== lexUriNormalized) {
123
+ throw new ValidationError(`Invalid $type: must be ${lexUriNormalized}, got ${$type}`);
137
124
  }
138
125
  const def = this.getDefOrThrow(lexUriNormalized, ['record']);
139
- return (0, validation_1.assertValidRecord)(this, def, value);
126
+ return assertValidRecord(this, def, value);
140
127
  }
141
128
  /**
142
129
  * Validate xrpc query params and throw on any error.
143
130
  */
144
131
  assertValidXrpcParams(lexUri, value) {
145
- lexUri = (0, util_1.toLexUri)(lexUri);
132
+ lexUri = toLexUri(lexUri);
146
133
  const def = this.getDefOrThrow(lexUri, [
147
134
  'query',
148
135
  'procedure',
149
136
  'subscription',
150
137
  ]);
151
- return (0, validation_1.assertValidXrpcParams)(this, def, value);
138
+ return assertValidXrpcParams(this, def, value);
152
139
  }
153
140
  /**
154
141
  * Validate xrpc input body and throw on any error.
155
142
  */
156
143
  assertValidXrpcInput(lexUri, value) {
157
- lexUri = (0, util_1.toLexUri)(lexUri);
144
+ lexUri = toLexUri(lexUri);
158
145
  const def = this.getDefOrThrow(lexUri, ['procedure']);
159
- return (0, validation_1.assertValidXrpcInput)(this, def, value);
146
+ return assertValidXrpcInput(this, def, value);
160
147
  }
161
148
  /**
162
149
  * Validate xrpc output body and throw on any error.
163
150
  */
164
151
  assertValidXrpcOutput(lexUri, value) {
165
- lexUri = (0, util_1.toLexUri)(lexUri);
152
+ lexUri = toLexUri(lexUri);
166
153
  const def = this.getDefOrThrow(lexUri, ['query', 'procedure']);
167
- return (0, validation_1.assertValidXrpcOutput)(this, def, value);
154
+ return assertValidXrpcOutput(this, def, value);
168
155
  }
169
156
  /**
170
157
  * Validate xrpc subscription message and throw on any error.
171
158
  */
172
159
  assertValidXrpcMessage(lexUri, value) {
173
- lexUri = (0, util_1.toLexUri)(lexUri);
160
+ lexUri = toLexUri(lexUri);
174
161
  const def = this.getDefOrThrow(lexUri, ['subscription']);
175
- return (0, validation_1.assertValidXrpcMessage)(this, def, value);
162
+ return assertValidXrpcMessage(this, def, value);
176
163
  }
177
164
  /**
178
165
  * Resolve a lex uri given a ref
179
166
  */
180
167
  resolveLexUri(lexUri, ref) {
181
- lexUri = (0, util_1.toLexUri)(lexUri);
182
- return (0, util_1.toLexUri)(ref, lexUri);
168
+ lexUri = toLexUri(lexUri);
169
+ return toLexUri(ref, lexUri);
183
170
  }
184
171
  }
185
- exports.Lexicons = Lexicons;
186
172
  function* iterDefs(doc) {
187
173
  for (const defId in doc.defs) {
188
174
  yield [`lex:${doc.id}#${defId}`, doc.defs[defId]];
@@ -197,15 +183,15 @@ function* iterDefs(doc) {
197
183
  function resolveRefUris(obj, baseUri) {
198
184
  for (const k in obj) {
199
185
  if (obj.type === 'ref') {
200
- obj.ref = (0, util_1.toLexUri)(obj.ref, baseUri);
186
+ obj.ref = toLexUri(obj.ref, baseUri);
201
187
  }
202
188
  else if (obj.type === 'union') {
203
- obj.refs = obj.refs.map((ref) => (0, util_1.toLexUri)(ref, baseUri));
189
+ obj.refs = obj.refs.map((ref) => toLexUri(ref, baseUri));
204
190
  }
205
191
  else if (Array.isArray(obj[k])) {
206
192
  obj[k] = obj[k].map((item) => {
207
193
  if (typeof item === 'string') {
208
- return item.startsWith('#') ? (0, util_1.toLexUri)(item, baseUri) : item;
194
+ return item.startsWith('#') ? toLexUri(item, baseUri) : item;
209
195
  }
210
196
  else if (item && typeof item === 'object') {
211
197
  return resolveRefUris(item, baseUri);
@@ -1 +1 @@
1
- {"version":3,"file":"lexicons.js","sourceRoot":"","sources":["../src/lexicons.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n InvalidLexiconError,\n LexRecord,\n LexUserType,\n LexiconDefNotFoundError,\n LexiconDoc,\n ValidationError,\n ValidationResult,\n isObj,\n} from './types'\nimport { toLexUri } from './util'\nimport {\n assertValidRecord,\n assertValidXrpcInput,\n assertValidXrpcMessage,\n assertValidXrpcOutput,\n assertValidXrpcParams,\n} from './validation'\nimport { object as validateObject } from './validators/complex'\n\n/**\n * A collection of compiled lexicons.\n */\nexport class Lexicons implements Iterable<LexiconDoc> {\n docs: Map<string, LexiconDoc> = new Map()\n defs: Map<string, LexUserType> = new Map()\n\n constructor(docs?: Iterable<LexiconDoc>) {\n if (docs) {\n for (const doc of docs) {\n this.add(doc)\n }\n }\n }\n\n /**\n * @example clone a lexicon:\n * ```ts\n * const clone = new Lexicons(originalLexicon)\n * ```\n *\n * @example get docs array:\n * ```ts\n * const docs = Array.from(lexicons)\n * ```\n */\n [Symbol.iterator](): Iterator<LexiconDoc> {\n return this.docs.values()\n }\n\n /**\n * Add a lexicon doc.\n */\n add(doc: LexiconDoc): void {\n const uri = toLexUri(doc.id)\n if (this.docs.has(uri)) {\n throw new Error(`${uri} has already been registered`)\n }\n\n // WARNING\n // mutates the object\n // -prf\n resolveRefUris(doc, uri)\n\n this.docs.set(uri, doc)\n for (const [defUri, def] of iterDefs(doc)) {\n this.defs.set(defUri, def)\n }\n }\n\n /**\n * Remove a lexicon doc.\n */\n remove(uri: string) {\n uri = toLexUri(uri)\n const doc = this.docs.get(uri)\n if (!doc) {\n throw new Error(`Unable to remove \"${uri}\": does not exist`)\n }\n for (const [defUri, _def] of iterDefs(doc)) {\n this.defs.delete(defUri)\n }\n this.docs.delete(uri)\n }\n\n /**\n * Get a lexicon doc.\n */\n get(uri: string): LexiconDoc | undefined {\n uri = toLexUri(uri)\n return this.docs.get(uri)\n }\n\n /**\n * Get a definition.\n */\n getDef(uri: string): LexUserType | undefined {\n uri = toLexUri(uri)\n return this.defs.get(uri)\n }\n\n /**\n * Get a def, throw if not found. Throws on not found.\n */\n getDefOrThrow<T extends LexUserType['type'] = LexUserType['type']>(\n uri: string,\n types?: readonly T[],\n ): Extract<LexUserType, { type: T }>\n getDefOrThrow(\n uri: string,\n types?: readonly LexUserType['type'][],\n ): LexUserType {\n const def = this.getDef(uri)\n if (!def) {\n throw new LexiconDefNotFoundError(`Lexicon not found: ${uri}`)\n }\n if (types && !types.includes(def.type)) {\n throw new InvalidLexiconError(\n `Not a ${types.join(' or ')} lexicon: ${uri}`,\n )\n }\n return def\n }\n\n /**\n * Validate a record or object.\n */\n validate(lexUri: string, value: unknown): ValidationResult {\n if (!isObj(value)) {\n throw new ValidationError(`Value must be an object`)\n }\n\n const lexUriNormalized = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUriNormalized, ['record', 'object'])\n\n if (def.type === 'record') {\n return validateObject(this, 'Record', def.record, value)\n } else if (def.type === 'object') {\n return validateObject(this, 'Object', def, value)\n } else {\n // shouldn't happen\n throw new InvalidLexiconError('Definition must be a record or object')\n }\n }\n\n /**\n * Validate a record and throw on any error.\n */\n assertValidRecord(lexUri: string, value: unknown) {\n if (!isObj(value)) {\n throw new ValidationError(`Record must be an object`)\n }\n if (!('$type' in value)) {\n throw new ValidationError(`Record/$type must be a string`)\n }\n const { $type } = value\n if (typeof $type !== 'string') {\n throw new ValidationError(`Record/$type must be a string`)\n }\n\n const lexUriNormalized = toLexUri(lexUri)\n if (toLexUri($type) !== lexUriNormalized) {\n throw new ValidationError(\n `Invalid $type: must be ${lexUriNormalized}, got ${$type}`,\n )\n }\n\n const def = this.getDefOrThrow(lexUriNormalized, ['record'])\n return assertValidRecord(this, def as LexRecord, value)\n }\n\n /**\n * Validate xrpc query params and throw on any error.\n */\n assertValidXrpcParams(lexUri: string, value: unknown) {\n lexUri = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUri, [\n 'query',\n 'procedure',\n 'subscription',\n ])\n return assertValidXrpcParams(this, def, value)\n }\n\n /**\n * Validate xrpc input body and throw on any error.\n */\n assertValidXrpcInput(lexUri: string, value: unknown) {\n lexUri = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUri, ['procedure'])\n return assertValidXrpcInput(this, def, value)\n }\n\n /**\n * Validate xrpc output body and throw on any error.\n */\n assertValidXrpcOutput(lexUri: string, value: unknown) {\n lexUri = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUri, ['query', 'procedure'])\n return assertValidXrpcOutput(this, def, value)\n }\n\n /**\n * Validate xrpc subscription message and throw on any error.\n */\n assertValidXrpcMessage<T = unknown>(lexUri: string, value: unknown): T {\n lexUri = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUri, ['subscription'])\n return assertValidXrpcMessage(this, def, value) as T\n }\n\n /**\n * Resolve a lex uri given a ref\n */\n resolveLexUri(lexUri: string, ref: string) {\n lexUri = toLexUri(lexUri)\n return toLexUri(ref, lexUri)\n }\n}\n\nfunction* iterDefs(doc: LexiconDoc): Generator<[string, LexUserType]> {\n for (const defId in doc.defs) {\n yield [`lex:${doc.id}#${defId}`, doc.defs[defId]]\n if (defId === 'main') {\n yield [`lex:${doc.id}`, doc.defs[defId]]\n }\n }\n}\n\n// WARNING\n// this method mutates objects\n// -prf\nfunction resolveRefUris(obj: any, baseUri: string): any {\n for (const k in obj) {\n if (obj.type === 'ref') {\n obj.ref = toLexUri(obj.ref, baseUri)\n } else if (obj.type === 'union') {\n obj.refs = obj.refs.map((ref) => toLexUri(ref, baseUri))\n } else if (Array.isArray(obj[k])) {\n obj[k] = obj[k].map((item: any) => {\n if (typeof item === 'string') {\n return item.startsWith('#') ? toLexUri(item, baseUri) : item\n } else if (item && typeof item === 'object') {\n return resolveRefUris(item, baseUri)\n }\n return item\n })\n } else if (obj[k] && typeof obj[k] === 'object') {\n obj[k] = resolveRefUris(obj[k], baseUri)\n }\n }\n return obj\n}\n"]}
1
+ {"version":3,"file":"lexicons.js","sourceRoot":"","sources":["../src/lexicons.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n InvalidLexiconError,\n LexRecord,\n LexUserType,\n LexiconDefNotFoundError,\n LexiconDoc,\n ValidationError,\n ValidationResult,\n isObj,\n} from './types.js'\nimport { toLexUri } from './util.js'\nimport {\n assertValidRecord,\n assertValidXrpcInput,\n assertValidXrpcMessage,\n assertValidXrpcOutput,\n assertValidXrpcParams,\n} from './validation.js'\nimport { object as validateObject } from './validators/complex.js'\n\n/**\n * A collection of compiled lexicons.\n */\nexport class Lexicons implements Iterable<LexiconDoc> {\n docs: Map<string, LexiconDoc> = new Map()\n defs: Map<string, LexUserType> = new Map()\n\n constructor(docs?: Iterable<LexiconDoc>) {\n if (docs) {\n for (const doc of docs) {\n this.add(doc)\n }\n }\n }\n\n /**\n * @example clone a lexicon:\n * ```ts\n * const clone = new Lexicons(originalLexicon)\n * ```\n *\n * @example get docs array:\n * ```ts\n * const docs = Array.from(lexicons)\n * ```\n */\n [Symbol.iterator](): Iterator<LexiconDoc> {\n return this.docs.values()\n }\n\n /**\n * Add a lexicon doc.\n */\n add(doc: LexiconDoc): void {\n const uri = toLexUri(doc.id)\n if (this.docs.has(uri)) {\n throw new Error(`${uri} has already been registered`)\n }\n\n // WARNING\n // mutates the object\n // -prf\n resolveRefUris(doc, uri)\n\n this.docs.set(uri, doc)\n for (const [defUri, def] of iterDefs(doc)) {\n this.defs.set(defUri, def)\n }\n }\n\n /**\n * Remove a lexicon doc.\n */\n remove(uri: string) {\n uri = toLexUri(uri)\n const doc = this.docs.get(uri)\n if (!doc) {\n throw new Error(`Unable to remove \"${uri}\": does not exist`)\n }\n for (const [defUri, _def] of iterDefs(doc)) {\n this.defs.delete(defUri)\n }\n this.docs.delete(uri)\n }\n\n /**\n * Get a lexicon doc.\n */\n get(uri: string): LexiconDoc | undefined {\n uri = toLexUri(uri)\n return this.docs.get(uri)\n }\n\n /**\n * Get a definition.\n */\n getDef(uri: string): LexUserType | undefined {\n uri = toLexUri(uri)\n return this.defs.get(uri)\n }\n\n /**\n * Get a def, throw if not found. Throws on not found.\n */\n getDefOrThrow<T extends LexUserType['type'] = LexUserType['type']>(\n uri: string,\n types?: readonly T[],\n ): Extract<LexUserType, { type: T }>\n getDefOrThrow(\n uri: string,\n types?: readonly LexUserType['type'][],\n ): LexUserType {\n const def = this.getDef(uri)\n if (!def) {\n throw new LexiconDefNotFoundError(`Lexicon not found: ${uri}`)\n }\n if (types && !types.includes(def.type)) {\n throw new InvalidLexiconError(\n `Not a ${types.join(' or ')} lexicon: ${uri}`,\n )\n }\n return def\n }\n\n /**\n * Validate a record or object.\n */\n validate(lexUri: string, value: unknown): ValidationResult {\n if (!isObj(value)) {\n throw new ValidationError(`Value must be an object`)\n }\n\n const lexUriNormalized = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUriNormalized, ['record', 'object'])\n\n if (def.type === 'record') {\n return validateObject(this, 'Record', def.record, value)\n } else if (def.type === 'object') {\n return validateObject(this, 'Object', def, value)\n } else {\n // shouldn't happen\n throw new InvalidLexiconError('Definition must be a record or object')\n }\n }\n\n /**\n * Validate a record and throw on any error.\n */\n assertValidRecord(lexUri: string, value: unknown) {\n if (!isObj(value)) {\n throw new ValidationError(`Record must be an object`)\n }\n if (!('$type' in value)) {\n throw new ValidationError(`Record/$type must be a string`)\n }\n const { $type } = value\n if (typeof $type !== 'string') {\n throw new ValidationError(`Record/$type must be a string`)\n }\n\n const lexUriNormalized = toLexUri(lexUri)\n if (toLexUri($type) !== lexUriNormalized) {\n throw new ValidationError(\n `Invalid $type: must be ${lexUriNormalized}, got ${$type}`,\n )\n }\n\n const def = this.getDefOrThrow(lexUriNormalized, ['record'])\n return assertValidRecord(this, def as LexRecord, value)\n }\n\n /**\n * Validate xrpc query params and throw on any error.\n */\n assertValidXrpcParams(lexUri: string, value: unknown) {\n lexUri = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUri, [\n 'query',\n 'procedure',\n 'subscription',\n ])\n return assertValidXrpcParams(this, def, value)\n }\n\n /**\n * Validate xrpc input body and throw on any error.\n */\n assertValidXrpcInput(lexUri: string, value: unknown) {\n lexUri = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUri, ['procedure'])\n return assertValidXrpcInput(this, def, value)\n }\n\n /**\n * Validate xrpc output body and throw on any error.\n */\n assertValidXrpcOutput(lexUri: string, value: unknown) {\n lexUri = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUri, ['query', 'procedure'])\n return assertValidXrpcOutput(this, def, value)\n }\n\n /**\n * Validate xrpc subscription message and throw on any error.\n */\n assertValidXrpcMessage<T = unknown>(lexUri: string, value: unknown): T {\n lexUri = toLexUri(lexUri)\n const def = this.getDefOrThrow(lexUri, ['subscription'])\n return assertValidXrpcMessage(this, def, value) as T\n }\n\n /**\n * Resolve a lex uri given a ref\n */\n resolveLexUri(lexUri: string, ref: string) {\n lexUri = toLexUri(lexUri)\n return toLexUri(ref, lexUri)\n }\n}\n\nfunction* iterDefs(doc: LexiconDoc): Generator<[string, LexUserType]> {\n for (const defId in doc.defs) {\n yield [`lex:${doc.id}#${defId}`, doc.defs[defId]]\n if (defId === 'main') {\n yield [`lex:${doc.id}`, doc.defs[defId]]\n }\n }\n}\n\n// WARNING\n// this method mutates objects\n// -prf\nfunction resolveRefUris(obj: any, baseUri: string): any {\n for (const k in obj) {\n if (obj.type === 'ref') {\n obj.ref = toLexUri(obj.ref, baseUri)\n } else if (obj.type === 'union') {\n obj.refs = obj.refs.map((ref) => toLexUri(ref, baseUri))\n } else if (Array.isArray(obj[k])) {\n obj[k] = obj[k].map((item: any) => {\n if (typeof item === 'string') {\n return item.startsWith('#') ? toLexUri(item, baseUri) : item\n } else if (item && typeof item === 'object') {\n return resolveRefUris(item, baseUri)\n }\n return item\n })\n } else if (obj[k] && typeof obj[k] === 'object') {\n obj[k] = resolveRefUris(obj[k], baseUri)\n }\n }\n return obj\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,SAAS,EACT,SAAS,EAIV,MAAM,qBAAqB,CAAA;AAG5B;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAA;AAE9B;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;AAKjD;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,QAAQ,KAAG,SAwBzC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,SAAS,KAAG,QA6B1C,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,QAAQ,KAAG,SAEzC,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,KAAK,QAAQ,KAAG,MAE5C,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,SAAS,KAAG,QAE1C,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,QAE7C,CAAA"}
1
+ {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,SAAS,EAIV,MAAM,qBAAqB,CAAA;AAG5B;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAA;AAE9B;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;AAKjD;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,QAAQ,KAAG,SAwBzC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,SAAS,KAAG,QA6B1C,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,QAAQ,KAAG,SAEzC,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,KAAK,QAAQ,KAAG,MAE5C,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,SAAS,KAAG,QAE1C,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,QAE7C,CAAA"}