@atproto/lexicon 0.6.2 → 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.
- package/CHANGELOG.md +20 -0
- package/dist/blob-refs.d.ts +4 -4
- package/dist/blob-refs.js +20 -45
- package/dist/blob-refs.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -20
- package/dist/index.js.map +1 -1
- package/dist/lexicons.d.ts +1 -1
- package/dist/lexicons.d.ts.map +1 -1
- package/dist/lexicons.js +40 -54
- package/dist/lexicons.js.map +1 -1
- package/dist/serialize.js +22 -31
- package/dist/serialize.js.map +1 -1
- package/dist/types.js +193 -203
- package/dist/types.js.map +1 -1
- package/dist/util.js +6 -10
- package/dist/util.js.map +1 -1
- package/dist/validation.d.ts +2 -2
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +10 -17
- package/dist/validation.js.map +1 -1
- package/dist/validators/blob.d.ts +2 -2
- package/dist/validators/blob.d.ts.map +1 -1
- package/dist/validators/blob.js +5 -8
- package/dist/validators/blob.js.map +1 -1
- package/dist/validators/complex.d.ts +2 -2
- package/dist/validators/complex.d.ts.map +1 -1
- package/dist/validators/complex.js +20 -26
- package/dist/validators/complex.js.map +1 -1
- package/dist/validators/formats.d.ts +1 -1
- package/dist/validators/formats.d.ts.map +1 -1
- package/dist/validators/formats.js +38 -50
- package/dist/validators/formats.js.map +1 -1
- package/dist/validators/primitives.d.ts +2 -2
- package/dist/validators/primitives.d.ts.map +1 -1
- package/dist/validators/primitives.js +33 -69
- package/dist/validators/primitives.js.map +1 -1
- package/dist/validators/xrpc.d.ts +2 -2
- package/dist/validators/xrpc.d.ts.map +1 -1
- package/dist/validators/xrpc.js +6 -42
- package/dist/validators/xrpc.js.map +1 -1
- package/{jest.config.js → jest.config.cjs} +8 -1
- package/package.json +17 -9
- package/src/index.ts +4 -4
- package/src/lexicons.ts +4 -4
- package/src/serialize.ts +1 -1
- package/src/types.ts +1 -1
- package/src/validation.ts +4 -4
- package/src/validators/blob.ts +3 -3
- package/src/validators/complex.ts +5 -5
- package/src/validators/formats.ts +3 -2
- package/src/validators/primitives.ts +3 -3
- package/src/validators/xrpc.ts +8 -4
- package/tests/_scaffolds/lexicons.ts +1 -1
- package/tests/general.test.ts +5 -5
- package/tsconfig.build.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
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
|
+
|
|
3
23
|
## 0.6.2
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/dist/blob-refs.d.ts
CHANGED
|
@@ -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
|
}, {
|
package/dist/blob-refs.js
CHANGED
|
@@ -1,50 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const zod_1 = require("zod");
|
|
6
|
-
const common_web_1 = require("@atproto/common-web");
|
|
7
|
-
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
|
|
8
5
|
.object({
|
|
9
|
-
$type:
|
|
10
|
-
ref:
|
|
11
|
-
mimeType:
|
|
12
|
-
size:
|
|
6
|
+
$type: z.literal('blob'),
|
|
7
|
+
ref: schema.cid,
|
|
8
|
+
mimeType: z.string(),
|
|
9
|
+
size: z.number(),
|
|
13
10
|
})
|
|
14
11
|
.strict();
|
|
15
|
-
|
|
12
|
+
export const untypedJsonBlobRef = z
|
|
16
13
|
.object({
|
|
17
|
-
cid:
|
|
18
|
-
mimeType:
|
|
14
|
+
cid: z.string(),
|
|
15
|
+
mimeType: z.string(),
|
|
19
16
|
})
|
|
20
17
|
.strict();
|
|
21
|
-
|
|
22
|
-
class BlobRef {
|
|
18
|
+
export const jsonBlobRef = z.union([typedJsonBlobRef, untypedJsonBlobRef]);
|
|
19
|
+
export class BlobRef {
|
|
23
20
|
constructor(ref, mimeType, size, original) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
writable: true,
|
|
28
|
-
value: ref
|
|
29
|
-
});
|
|
30
|
-
Object.defineProperty(this, "mimeType", {
|
|
31
|
-
enumerable: true,
|
|
32
|
-
configurable: true,
|
|
33
|
-
writable: true,
|
|
34
|
-
value: mimeType
|
|
35
|
-
});
|
|
36
|
-
Object.defineProperty(this, "size", {
|
|
37
|
-
enumerable: true,
|
|
38
|
-
configurable: true,
|
|
39
|
-
writable: true,
|
|
40
|
-
value: size
|
|
41
|
-
});
|
|
42
|
-
Object.defineProperty(this, "original", {
|
|
43
|
-
enumerable: true,
|
|
44
|
-
configurable: true,
|
|
45
|
-
writable: true,
|
|
46
|
-
value: void 0
|
|
47
|
-
});
|
|
21
|
+
this.ref = ref;
|
|
22
|
+
this.mimeType = mimeType;
|
|
23
|
+
this.size = size;
|
|
48
24
|
this.original = original ?? {
|
|
49
25
|
$type: 'blob',
|
|
50
26
|
ref,
|
|
@@ -53,25 +29,24 @@ class BlobRef {
|
|
|
53
29
|
};
|
|
54
30
|
}
|
|
55
31
|
static asBlobRef(obj) {
|
|
56
|
-
if (
|
|
32
|
+
if (check.is(obj, jsonBlobRef)) {
|
|
57
33
|
return BlobRef.fromJsonRef(obj);
|
|
58
34
|
}
|
|
59
35
|
return null;
|
|
60
36
|
}
|
|
61
37
|
static fromJsonRef(json) {
|
|
62
|
-
if (
|
|
38
|
+
if (check.is(json, typedJsonBlobRef)) {
|
|
63
39
|
return new BlobRef(json.ref, json.mimeType, json.size);
|
|
64
40
|
}
|
|
65
41
|
else {
|
|
66
|
-
return new BlobRef(
|
|
42
|
+
return new BlobRef(CID.parse(json.cid), json.mimeType, -1, json);
|
|
67
43
|
}
|
|
68
44
|
}
|
|
69
45
|
ipld() {
|
|
70
46
|
return this.original;
|
|
71
47
|
}
|
|
72
48
|
toJSON() {
|
|
73
|
-
return
|
|
49
|
+
return ipldToJson(this.ipld());
|
|
74
50
|
}
|
|
75
51
|
}
|
|
76
|
-
exports.BlobRef = BlobRef;
|
|
77
52
|
//# sourceMappingURL=blob-refs.js.map
|
package/dist/blob-refs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob-refs.js","sourceRoot":"","sources":["../src/blob-refs.ts"],"names":[],"mappings":"
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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":"
|
|
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"]}
|
package/dist/lexicons.d.ts
CHANGED
package/dist/lexicons.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
80
|
+
throw new LexiconDefNotFoundError(`Lexicon not found: ${uri}`);
|
|
94
81
|
}
|
|
95
82
|
if (types && !types.includes(def.type)) {
|
|
96
|
-
throw new
|
|
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 (!
|
|
105
|
-
throw new
|
|
91
|
+
if (!isObj(value)) {
|
|
92
|
+
throw new ValidationError(`Value must be an object`);
|
|
106
93
|
}
|
|
107
|
-
const lexUriNormalized =
|
|
94
|
+
const lexUriNormalized = toLexUri(lexUri);
|
|
108
95
|
const def = this.getDefOrThrow(lexUriNormalized, ['record', 'object']);
|
|
109
96
|
if (def.type === 'record') {
|
|
110
|
-
return (
|
|
97
|
+
return validateObject(this, 'Record', def.record, value);
|
|
111
98
|
}
|
|
112
99
|
else if (def.type === 'object') {
|
|
113
|
-
return (
|
|
100
|
+
return validateObject(this, 'Object', def, value);
|
|
114
101
|
}
|
|
115
102
|
else {
|
|
116
103
|
// shouldn't happen
|
|
117
|
-
throw new
|
|
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 (!
|
|
125
|
-
throw new
|
|
111
|
+
if (!isObj(value)) {
|
|
112
|
+
throw new ValidationError(`Record must be an object`);
|
|
126
113
|
}
|
|
127
114
|
if (!('$type' in value)) {
|
|
128
|
-
throw new
|
|
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
|
|
119
|
+
throw new ValidationError(`Record/$type must be a string`);
|
|
133
120
|
}
|
|
134
|
-
const lexUriNormalized =
|
|
135
|
-
if (
|
|
136
|
-
throw new
|
|
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
|
|
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 =
|
|
132
|
+
lexUri = toLexUri(lexUri);
|
|
146
133
|
const def = this.getDefOrThrow(lexUri, [
|
|
147
134
|
'query',
|
|
148
135
|
'procedure',
|
|
149
136
|
'subscription',
|
|
150
137
|
]);
|
|
151
|
-
return
|
|
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 =
|
|
144
|
+
lexUri = toLexUri(lexUri);
|
|
158
145
|
const def = this.getDefOrThrow(lexUri, ['procedure']);
|
|
159
|
-
return
|
|
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 =
|
|
152
|
+
lexUri = toLexUri(lexUri);
|
|
166
153
|
const def = this.getDefOrThrow(lexUri, ['query', 'procedure']);
|
|
167
|
-
return
|
|
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 =
|
|
160
|
+
lexUri = toLexUri(lexUri);
|
|
174
161
|
const def = this.getDefOrThrow(lexUri, ['subscription']);
|
|
175
|
-
return
|
|
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 =
|
|
182
|
-
return
|
|
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 =
|
|
186
|
+
obj.ref = toLexUri(obj.ref, baseUri);
|
|
201
187
|
}
|
|
202
188
|
else if (obj.type === 'union') {
|
|
203
|
-
obj.refs = obj.refs.map((ref) =>
|
|
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('#') ?
|
|
194
|
+
return item.startsWith('#') ? toLexUri(item, baseUri) : item;
|
|
209
195
|
}
|
|
210
196
|
else if (item && typeof item === 'object') {
|
|
211
197
|
return resolveRefUris(item, baseUri);
|
package/dist/lexicons.js.map
CHANGED
|
@@ -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":"AAAA,OAAO,EACL,mBAAmB,EAGnB,uBAAuB,EAEvB,eAAe,EAEf,KAAK,GACN,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAElE;;GAEG;AACH,MAAM,OAAO,QAAQ;IAInB,YAAY,IAA2B;QAHvC,SAAI,GAA4B,IAAI,GAAG,EAAE,CAAA;QACzC,SAAI,GAA6B,IAAI,GAAG,EAAE,CAAA;QAGxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAe;QACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,8BAA8B,CAAC,CAAA;QACvD,CAAC;QAED,UAAU;QACV,qBAAqB;QACrB,OAAO;QACP,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAExB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACvB,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,mBAAmB,CAAC,CAAA;QAC9D,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IASD,aAAa,CACX,GAAW,EACX,KAAsC;QAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,uBAAuB,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAA;QAChE,CAAC;QACD,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,mBAAmB,CAC3B,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,EAAE,CAC9C,CAAA;QACH,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,MAAc,EAAE,KAAc;QACrC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAA;QACtD,CAAC;QAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;QAEtE,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC1D,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QACnD,CAAC;aAAM,CAAC;YACN,mBAAmB;YACnB,MAAM,IAAI,mBAAmB,CAAC,uCAAuC,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAAc,EAAE,KAAc;QAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAA;QACvD,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,eAAe,CAAC,+BAA+B,CAAC,CAAA;QAC5D,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,eAAe,CAAC,+BAA+B,CAAC,CAAA;QAC5D,CAAC;QAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,gBAAgB,EAAE,CAAC;YACzC,MAAM,IAAI,eAAe,CACvB,0BAA0B,gBAAgB,SAAS,KAAK,EAAE,CAC3D,CAAA;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC5D,OAAO,iBAAiB,CAAC,IAAI,EAAE,GAAgB,EAAE,KAAK,CAAC,CAAA;IACzD,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,MAAc,EAAE,KAAc;QAClD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;YACrC,OAAO;YACP,WAAW;YACX,cAAc;SACf,CAAC,CAAA;QACF,OAAO,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,MAAc,EAAE,KAAc;QACjD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;QACrD,OAAO,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAC/C,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,MAAc,EAAE,KAAc;QAClD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAA;QAC9D,OAAO,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAc,MAAc,EAAE,KAAc;QAChE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;QACxD,OAAO,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAM,CAAA;IACtD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAAc,EAAE,GAAW;QACvC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzB,OAAO,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAC9B,CAAC;CACF;AAED,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAe;IAChC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,KAAK,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACjD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;AACH,CAAC;AAED,UAAU;AACV,8BAA8B;AAC9B,OAAO;AACP,SAAS,cAAc,CAAC,GAAQ,EAAE,OAAe;IAC/C,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACtC,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;QAC1D,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;gBAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;gBAC9D,CAAC;qBAAM,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5C,OAAO,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;gBACtC,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChD,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC","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"]}
|
package/dist/serialize.js
CHANGED
|
@@ -1,47 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const cid_1 = require("multiformats/cid");
|
|
5
|
-
const common_web_1 = require("@atproto/common-web");
|
|
6
|
-
const blob_refs_1 = require("./blob-refs");
|
|
1
|
+
import { CID } from 'multiformats/cid';
|
|
2
|
+
import { check, ipldToJson, jsonToIpld, } from '@atproto/common-web';
|
|
3
|
+
import { BlobRef, jsonBlobRef } from './blob-refs.js';
|
|
7
4
|
// @NOTE avoiding use of check.is() here only because it makes
|
|
8
5
|
// these implementations slow, and they often live in hot paths.
|
|
9
6
|
/**
|
|
10
7
|
* @deprecated Use `LexValue` from `@atproto/lex-data` instead (which doesn't need conversion to IPLD).
|
|
11
8
|
*/
|
|
12
|
-
const lexToIpld = (val) => {
|
|
9
|
+
export const lexToIpld = (val) => {
|
|
13
10
|
// walk arrays
|
|
14
11
|
if (Array.isArray(val)) {
|
|
15
|
-
return val.map((item) =>
|
|
12
|
+
return val.map((item) => lexToIpld(item));
|
|
16
13
|
}
|
|
17
14
|
// objects
|
|
18
15
|
if (val && typeof val === 'object') {
|
|
19
16
|
// convert blobs, leaving the original encoding so that we don't change CIDs on re-encode
|
|
20
|
-
if (val instanceof
|
|
17
|
+
if (val instanceof BlobRef) {
|
|
21
18
|
return val.original;
|
|
22
19
|
}
|
|
23
20
|
// retain cids & bytes
|
|
24
|
-
if (
|
|
21
|
+
if (CID.asCID(val) || val instanceof Uint8Array) {
|
|
25
22
|
return val;
|
|
26
23
|
}
|
|
27
24
|
// walk plain objects
|
|
28
25
|
const toReturn = {};
|
|
29
26
|
for (const key of Object.keys(val)) {
|
|
30
|
-
toReturn[key] =
|
|
27
|
+
toReturn[key] = lexToIpld(val[key]);
|
|
31
28
|
}
|
|
32
29
|
return toReturn;
|
|
33
30
|
}
|
|
34
31
|
// pass through
|
|
35
32
|
return val;
|
|
36
33
|
};
|
|
37
|
-
exports.lexToIpld = lexToIpld;
|
|
38
34
|
/**
|
|
39
35
|
* @deprecated Use `LexValue` from `@atproto/lex-data` instead instead (which doesn't need conversion to IPLD).
|
|
40
36
|
*/
|
|
41
|
-
const ipldToLex = (val) => {
|
|
37
|
+
export const ipldToLex = (val) => {
|
|
42
38
|
// map arrays
|
|
43
39
|
if (Array.isArray(val)) {
|
|
44
|
-
return val.map((item) =>
|
|
40
|
+
return val.map((item) => ipldToLex(item));
|
|
45
41
|
}
|
|
46
42
|
// objects
|
|
47
43
|
if (val && typeof val === 'object') {
|
|
@@ -49,38 +45,33 @@ const ipldToLex = (val) => {
|
|
|
49
45
|
if ((val['$type'] === 'blob' ||
|
|
50
46
|
(typeof val['cid'] === 'string' &&
|
|
51
47
|
typeof val['mimeType'] === 'string')) &&
|
|
52
|
-
|
|
53
|
-
return
|
|
48
|
+
check.is(val, jsonBlobRef)) {
|
|
49
|
+
return BlobRef.fromJsonRef(val);
|
|
54
50
|
}
|
|
55
51
|
// retain cids, bytes
|
|
56
|
-
if (
|
|
52
|
+
if (CID.asCID(val) || val instanceof Uint8Array) {
|
|
57
53
|
return val;
|
|
58
54
|
}
|
|
59
55
|
// map plain objects
|
|
60
56
|
const toReturn = {};
|
|
61
57
|
for (const key of Object.keys(val)) {
|
|
62
|
-
toReturn[key] =
|
|
58
|
+
toReturn[key] = ipldToLex(val[key]);
|
|
63
59
|
}
|
|
64
60
|
return toReturn;
|
|
65
61
|
}
|
|
66
62
|
// pass through
|
|
67
63
|
return val;
|
|
68
64
|
};
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return (0, common_web_1.ipldToJson)((0, exports.lexToIpld)(val));
|
|
65
|
+
export const lexToJson = (val) => {
|
|
66
|
+
return ipldToJson(lexToIpld(val));
|
|
72
67
|
};
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return JSON.stringify((0, exports.lexToJson)(val));
|
|
68
|
+
export const stringifyLex = (val) => {
|
|
69
|
+
return JSON.stringify(lexToJson(val));
|
|
76
70
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return (0, exports.ipldToLex)((0, common_web_1.jsonToIpld)(val));
|
|
71
|
+
export const jsonToLex = (val) => {
|
|
72
|
+
return ipldToLex(jsonToIpld(val));
|
|
80
73
|
};
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return (0, exports.jsonToLex)(JSON.parse(val));
|
|
74
|
+
export const jsonStringToLex = (val) => {
|
|
75
|
+
return jsonToLex(JSON.parse(val));
|
|
84
76
|
};
|
|
85
|
-
exports.jsonStringToLex = jsonStringToLex;
|
|
86
77
|
//# sourceMappingURL=serialize.js.map
|