@atproto/lex-json 0.0.16 → 0.1.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 CHANGED
@@ -1,5 +1,24 @@
1
1
  # @atproto/lex-json
2
2
 
3
+ ## 0.1.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/lex-data@0.1.0-next.0
21
+
3
22
  ## 0.0.16
4
23
 
5
24
  ### Patch Changes
package/dist/blob.js CHANGED
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseTypedBlobRef = parseTypedBlobRef;
4
- const lex_data_1 = require("@atproto/lex-data");
5
- const link_js_1 = require("./link.js");
1
+ import { isTypedBlobRef, } from '@atproto/lex-data';
2
+ import { parseLexLink } from './link.js';
6
3
  /**
7
4
  * Parses a blob reference from a JSON object.
8
5
  *
@@ -37,7 +34,7 @@ const link_js_1 = require("./link.js");
37
34
  * // result is undefined
38
35
  * ```
39
36
  */
40
- function parseTypedBlobRef(input, options) {
37
+ export function parseTypedBlobRef(input, options) {
41
38
  if (input.$type !== 'blob')
42
39
  return undefined;
43
40
  const ref = input?.ref;
@@ -48,14 +45,14 @@ function parseTypedBlobRef(input, options) {
48
45
  // jsonToLex), the `ref` property may either be a LexMap with a $link
49
46
  // property, or it may already be a CID instance.
50
47
  if ('$link' in ref) {
51
- const cid = (0, link_js_1.parseLexLink)(ref);
48
+ const cid = parseLexLink(ref);
52
49
  if (!cid)
53
50
  return undefined;
54
51
  const blob = { ...input, ref: cid };
55
- if ((0, lex_data_1.isTypedBlobRef)(blob, options))
52
+ if (isTypedBlobRef(blob, options))
56
53
  return blob;
57
54
  }
58
- if ((0, lex_data_1.isTypedBlobRef)(input)) {
55
+ if (isTypedBlobRef(input)) {
59
56
  return input;
60
57
  }
61
58
  return undefined;
package/dist/blob.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"blob.js","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":";;AA0CA,8CA2BC;AArED,gDAK0B;AAC1B,uCAAwC;AAExC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,SAAgB,iBAAiB,CAC/B,KAAa,EACb,OAA6B;IAE7B,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,SAAS,CAAA;IAE5C,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAA;IACtB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAErD,8EAA8E;IAC9E,oEAAoE;IACpE,qEAAqE;IACrE,iDAAiD;IAEjD,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAA;QAE1B,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;QACnC,IAAI,IAAA,yBAAc,EAAC,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,IAAI,CAAA;IAChD,CAAC;IAED,IAAI,IAAA,yBAAc,EAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["import {\n BlobRefCheckOptions,\n LexMap,\n TypedBlobRef,\n isTypedBlobRef,\n} from '@atproto/lex-data'\nimport { parseLexLink } from './link.js'\n\n/**\n * Parses a blob reference from a JSON object.\n *\n * In the AT Protocol, blobs are referenced using a specific object structure\n * with `$type: 'blob'`, a `ref` property containing a CID link, and metadata\n * like `mimeType` and `size`. This function validates and parses such objects\n * into `BlobRef` instances.\n *\n * The function handles both cases where the `ref` property is:\n * - A `{$link: string}` object (when parsing from JSON)\n * - Already a `Cid` instance (when the parent object has been partially converted)\n *\n * @param input - A Lex map potentially representing a blob reference\n * @param options - Optional blob reference validation options\n * @returns The parsed `BlobRef` if the input is a valid blob reference,\n * or `undefined` if the input is not a valid blob representation\n *\n * @example\n * ```typescript\n * // Parse a blob reference from JSON\n * const blobRef = parseTypedBlobRef({\n * $type: 'blob',\n * ref: { $link: 'bafyreib2rxk3rybloqtqwbo' },\n * mimeType: 'image/png',\n * size: 12345\n * })\n *\n * // blobRef.ref is a Cid instance\n *\n * // Returns undefined for non-blob objects\n * const result = parseTypedBlobRef({ foo: 'bar' })\n * // result is undefined\n * ```\n */\nexport function parseTypedBlobRef(\n input: LexMap,\n options?: BlobRefCheckOptions,\n): TypedBlobRef | undefined {\n if (input.$type !== 'blob') return undefined\n\n const ref = input?.ref\n if (!ref || typeof ref !== 'object') return undefined\n\n // @NOTE Because json to lex conversion can be performed both in a depth-first\n // manner (e.g. via lexParse) or in a breadth-first manner (e.g. via\n // jsonToLex), the `ref` property may either be a LexMap with a $link\n // property, or it may already be a CID instance.\n\n if ('$link' in ref) {\n const cid = parseLexLink(ref)\n if (!cid) return undefined\n\n const blob = { ...input, ref: cid }\n if (isTypedBlobRef(blob, options)) return blob\n }\n\n if (isTypedBlobRef(input)) {\n return input\n }\n\n return undefined\n}\n"]}
1
+ {"version":3,"file":"blob.js","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,GACf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,OAA6B;IAE7B,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,SAAS,CAAA;IAE5C,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAA;IACtB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAErD,8EAA8E;IAC9E,oEAAoE;IACpE,qEAAqE;IACrE,iDAAiD;IAEjD,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAA;QAE1B,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;QACnC,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,IAAI,CAAA;IAChD,CAAC;IAED,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["import {\n BlobRefCheckOptions,\n LexMap,\n TypedBlobRef,\n isTypedBlobRef,\n} from '@atproto/lex-data'\nimport { parseLexLink } from './link.js'\n\n/**\n * Parses a blob reference from a JSON object.\n *\n * In the AT Protocol, blobs are referenced using a specific object structure\n * with `$type: 'blob'`, a `ref` property containing a CID link, and metadata\n * like `mimeType` and `size`. This function validates and parses such objects\n * into `BlobRef` instances.\n *\n * The function handles both cases where the `ref` property is:\n * - A `{$link: string}` object (when parsing from JSON)\n * - Already a `Cid` instance (when the parent object has been partially converted)\n *\n * @param input - A Lex map potentially representing a blob reference\n * @param options - Optional blob reference validation options\n * @returns The parsed `BlobRef` if the input is a valid blob reference,\n * or `undefined` if the input is not a valid blob representation\n *\n * @example\n * ```typescript\n * // Parse a blob reference from JSON\n * const blobRef = parseTypedBlobRef({\n * $type: 'blob',\n * ref: { $link: 'bafyreib2rxk3rybloqtqwbo' },\n * mimeType: 'image/png',\n * size: 12345\n * })\n *\n * // blobRef.ref is a Cid instance\n *\n * // Returns undefined for non-blob objects\n * const result = parseTypedBlobRef({ foo: 'bar' })\n * // result is undefined\n * ```\n */\nexport function parseTypedBlobRef(\n input: LexMap,\n options?: BlobRefCheckOptions,\n): TypedBlobRef | undefined {\n if (input.$type !== 'blob') return undefined\n\n const ref = input?.ref\n if (!ref || typeof ref !== 'object') return undefined\n\n // @NOTE Because json to lex conversion can be performed both in a depth-first\n // manner (e.g. via lexParse) or in a breadth-first manner (e.g. via\n // jsonToLex), the `ref` property may either be a LexMap with a $link\n // property, or it may already be a CID instance.\n\n if ('$link' in ref) {\n const cid = parseLexLink(ref)\n if (!cid) return undefined\n\n const blob = { ...input, ref: cid }\n if (isTypedBlobRef(blob, options)) return blob\n }\n\n if (isTypedBlobRef(input)) {\n return input\n }\n\n return undefined\n}\n"]}
package/dist/bytes.js CHANGED
@@ -1,8 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseLexBytes = parseLexBytes;
4
- exports.encodeLexBytes = encodeLexBytes;
5
- const lex_data_1 = require("@atproto/lex-data");
1
+ import { fromBase64, toBase64 } from '@atproto/lex-data';
6
2
  /**
7
3
  * Parses a `{$bytes: string}` JSON object into a `Uint8Array`.
8
4
  *
@@ -29,7 +25,7 @@ const lex_data_1 = require("@atproto/lex-data");
29
25
  * // invalid is undefined
30
26
  * ```
31
27
  */
32
- function parseLexBytes(input) {
28
+ export function parseLexBytes(input) {
33
29
  if (!input || !('$bytes' in input)) {
34
30
  return undefined;
35
31
  }
@@ -42,7 +38,7 @@ function parseLexBytes(input) {
42
38
  return undefined;
43
39
  }
44
40
  try {
45
- return (0, lex_data_1.fromBase64)(input.$bytes);
41
+ return fromBase64(input.$bytes);
46
42
  }
47
43
  catch {
48
44
  return undefined;
@@ -65,7 +61,7 @@ function parseLexBytes(input) {
65
61
  * // encoded is { $bytes: 'SGVsbG8sIHdvcmxkIQ==' }
66
62
  * ```
67
63
  */
68
- function encodeLexBytes(bytes) {
69
- return { $bytes: (0, lex_data_1.toBase64)(bytes) };
64
+ export function encodeLexBytes(bytes) {
65
+ return { $bytes: toBase64(bytes) };
70
66
  }
71
67
  //# sourceMappingURL=bytes.js.map
package/dist/bytes.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../src/bytes.ts"],"names":[],"mappings":";;AA6BA,sCAsBC;AAmBD,wCAEC;AAxED,gDAAwD;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAgB,aAAa,CAC3B,KAA+B;IAE/B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAA,qBAAU,EAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,cAAc,CAAC,KAAiB;IAC9C,OAAO,EAAE,MAAM,EAAE,IAAA,mBAAQ,EAAC,KAAK,CAAC,EAAE,CAAA;AACpC,CAAC","sourcesContent":["import { fromBase64, toBase64 } from '@atproto/lex-data'\nimport { JsonValue } from './json.js'\n\n/**\n * Parses a `{$bytes: string}` JSON object into a `Uint8Array`.\n *\n * In the AT Protocol data model, binary data is represented in JSON as an object\n * with a single `$bytes` property containing a base64-encoded string. This function\n * decodes that representation back into raw bytes.\n *\n * @param input - An object potentially containing a `$bytes` property\n * @returns The decoded `Uint8Array` if the input is a valid `$bytes` object,\n * or `undefined` if the input is not a valid `$bytes` representation\n *\n * @example\n * ```typescript\n * // Parse a $bytes object to Uint8Array\n * const bytes = parseLexBytes({ $bytes: 'SGVsbG8sIHdvcmxkIQ==' })\n * // bytes is Uint8Array containing \"Hello, world!\"\n *\n * // Returns undefined for non-$bytes objects\n * const result = parseLexBytes({ foo: 'bar' })\n * // result is undefined\n *\n * // Returns undefined for objects with extra properties\n * const invalid = parseLexBytes({ $bytes: 'SGVsbG8=', extra: true })\n * // invalid is undefined\n * ```\n */\nexport function parseLexBytes(\n input?: Record<string, unknown>,\n): Uint8Array | undefined {\n if (!input || !('$bytes' in input)) {\n return undefined\n }\n\n for (const key in input) {\n if (key !== '$bytes') {\n return undefined\n }\n }\n\n if (typeof input.$bytes !== 'string') {\n return undefined\n }\n\n try {\n return fromBase64(input.$bytes)\n } catch {\n return undefined\n }\n}\n\n/**\n * Encodes a `Uint8Array` into a `{$bytes: string}` JSON representation.\n *\n * In the AT Protocol data model, binary data is represented in JSON as an object\n * with a single `$bytes` property containing a base64-encoded string. This function\n * performs that encoding.\n *\n * @param bytes - The binary data to encode\n * @returns An object with a `$bytes` property containing the base64-encoded data\n *\n * @example\n * ```typescript\n * const bytes = new TextEncoder().encode('Hello, world!')\n * const encoded = encodeLexBytes(bytes)\n * // encoded is { $bytes: 'SGVsbG8sIHdvcmxkIQ==' }\n * ```\n */\nexport function encodeLexBytes(bytes: Uint8Array): JsonValue {\n return { $bytes: toBase64(bytes) }\n}\n"]}
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../src/bytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,aAAa,CAC3B,KAA+B;IAE/B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAA;AACpC,CAAC","sourcesContent":["import { fromBase64, toBase64 } from '@atproto/lex-data'\nimport { JsonValue } from './json.js'\n\n/**\n * Parses a `{$bytes: string}` JSON object into a `Uint8Array`.\n *\n * In the AT Protocol data model, binary data is represented in JSON as an object\n * with a single `$bytes` property containing a base64-encoded string. This function\n * decodes that representation back into raw bytes.\n *\n * @param input - An object potentially containing a `$bytes` property\n * @returns The decoded `Uint8Array` if the input is a valid `$bytes` object,\n * or `undefined` if the input is not a valid `$bytes` representation\n *\n * @example\n * ```typescript\n * // Parse a $bytes object to Uint8Array\n * const bytes = parseLexBytes({ $bytes: 'SGVsbG8sIHdvcmxkIQ==' })\n * // bytes is Uint8Array containing \"Hello, world!\"\n *\n * // Returns undefined for non-$bytes objects\n * const result = parseLexBytes({ foo: 'bar' })\n * // result is undefined\n *\n * // Returns undefined for objects with extra properties\n * const invalid = parseLexBytes({ $bytes: 'SGVsbG8=', extra: true })\n * // invalid is undefined\n * ```\n */\nexport function parseLexBytes(\n input?: Record<string, unknown>,\n): Uint8Array | undefined {\n if (!input || !('$bytes' in input)) {\n return undefined\n }\n\n for (const key in input) {\n if (key !== '$bytes') {\n return undefined\n }\n }\n\n if (typeof input.$bytes !== 'string') {\n return undefined\n }\n\n try {\n return fromBase64(input.$bytes)\n } catch {\n return undefined\n }\n}\n\n/**\n * Encodes a `Uint8Array` into a `{$bytes: string}` JSON representation.\n *\n * In the AT Protocol data model, binary data is represented in JSON as an object\n * with a single `$bytes` property containing a base64-encoded string. This function\n * performs that encoding.\n *\n * @param bytes - The binary data to encode\n * @returns An object with a `$bytes` property containing the base64-encoded data\n *\n * @example\n * ```typescript\n * const bytes = new TextEncoder().encode('Hello, world!')\n * const encoded = encodeLexBytes(bytes)\n * // encoded is { $bytes: 'SGVsbG8sIHdvcmxkIQ==' }\n * ```\n */\nexport function encodeLexBytes(bytes: Uint8Array): JsonValue {\n return { $bytes: toBase64(bytes) }\n}\n"]}
package/dist/index.js CHANGED
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./bytes.js"), exports);
5
- tslib_1.__exportStar(require("./json.js"), exports);
6
- tslib_1.__exportStar(require("./lex-json.js"), exports);
7
- tslib_1.__exportStar(require("./link.js"), exports);
1
+ export * from './bytes.js';
2
+ export * from './json.js';
3
+ export * from './lex-json.js';
4
+ export * from './link.js';
8
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,qDAA0B;AAC1B,oDAAyB;AACzB,wDAA6B;AAC7B,oDAAyB","sourcesContent":["export * from './bytes.js'\nexport * from './json.js'\nexport * from './lex-json.js'\nexport * from './link.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA","sourcesContent":["export * from './bytes.js'\nexport * from './json.js'\nexport * from './lex-json.js'\nexport * from './link.js'\n"]}
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.JsonBytesDecoder = exports.BASE64_NATIVE_THRESHOLD = void 0;
4
- const lex_data_1 = require("@atproto/lex-data");
5
- const blob_js_1 = require("./blob.js");
1
+ import { fromBase64, parseCid } from '@atproto/lex-data';
2
+ import { parseTypedBlobRef } from './blob.js';
6
3
  const CHAR_TAB = 0x09;
7
4
  const CHAR_NEWLINE = 0x0a;
8
5
  const CHAR_CARRIAGE_RETURN = 0x0d;
@@ -62,27 +59,12 @@ for (let i = CHAR_UPPER_A; i <= CHAR_UPPER_F; i++)
62
59
  for (let i = CHAR_LOWER_A; i <= CHAR_LOWER_F; i++)
63
60
  HEX_LOOKUP[i] = i - CHAR_LOWER_A + 10;
64
61
  // Thresholds for optimization heuristics
65
- exports.BASE64_NATIVE_THRESHOLD = 256; // Use native decoding for base64 strings > this length
66
- class JsonBytesDecoder {
62
+ export const BASE64_NATIVE_THRESHOLD = 256; // Use native decoding for base64 strings > this length
63
+ export class JsonBytesDecoder {
67
64
  constructor(data, strict = true) {
68
- Object.defineProperty(this, "data", {
69
- enumerable: true,
70
- configurable: true,
71
- writable: true,
72
- value: data
73
- });
74
- Object.defineProperty(this, "strict", {
75
- enumerable: true,
76
- configurable: true,
77
- writable: true,
78
- value: strict
79
- });
80
- Object.defineProperty(this, "pos", {
81
- enumerable: true,
82
- configurable: true,
83
- writable: true,
84
- value: 0
85
- });
65
+ this.data = data;
66
+ this.strict = strict;
67
+ this.pos = 0;
86
68
  }
87
69
  decode() {
88
70
  this.skipWhitespace();
@@ -167,9 +149,9 @@ class JsonBytesDecoder {
167
149
  try {
168
150
  // Use native decoding for large base64 strings (much faster
169
151
  // based on benchmarks)
170
- if (base64Len > exports.BASE64_NATIVE_THRESHOLD) {
152
+ if (base64Len > BASE64_NATIVE_THRESHOLD) {
171
153
  const b64Str = this.decodeUnescapedString(b64Start, b64End);
172
- return (0, lex_data_1.fromBase64)(b64Str); // Validate and convert to LexValue bytes
154
+ return fromBase64(b64Str); // Validate and convert to LexValue bytes
173
155
  }
174
156
  // Manual decoding for smaller strings (optimized path)
175
157
  // Skip padding characters
@@ -227,7 +209,7 @@ class JsonBytesDecoder {
227
209
  this.pos++;
228
210
  const cidStr = this.decodeUnescapedString(cidStart, cidEnd);
229
211
  try {
230
- return (0, lex_data_1.parseCid)(cidStr);
212
+ return parseCid(cidStr);
231
213
  }
232
214
  catch (cause) {
233
215
  if (this.strict) {
@@ -241,7 +223,7 @@ class JsonBytesDecoder {
241
223
  }
242
224
  }
243
225
  // Parse value
244
- obj ?? (obj = {});
226
+ obj ??= {};
245
227
  obj[key] = this.parseValue();
246
228
  this.skipWhitespace();
247
229
  const next = this.data[this.pos];
@@ -266,7 +248,7 @@ class JsonBytesDecoder {
266
248
  throw new TypeError('Invalid $link object');
267
249
  }
268
250
  else if (obj.$type === 'blob') {
269
- const blob = (0, blob_js_1.parseTypedBlobRef)(obj, { strict: this.strict });
251
+ const blob = parseTypedBlobRef(obj, { strict: this.strict });
270
252
  if (blob)
271
253
  return blob;
272
254
  throw new TypeError(`Invalid blob object`);
@@ -596,5 +578,4 @@ class JsonBytesDecoder {
596
578
  }
597
579
  }
598
580
  }
599
- exports.JsonBytesDecoder = JsonBytesDecoder;
600
581
  //# sourceMappingURL=json-bytes-decoder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-bytes-decoder.js","sourceRoot":"","sources":["../src/json-bytes-decoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { LexValue, fromBase64, parseCid } from '@atproto/lex-data'\nimport { parseTypedBlobRef } from './blob.js'\n\nconst CHAR_TAB = 0x09\nconst CHAR_NEWLINE = 0x0a\nconst CHAR_CARRIAGE_RETURN = 0x0d\nconst CHAR_SPACE = 0x20\nconst CHAR_DOUBLE_QUOTE = 0x22\nconst CHAR_PLUS = 0x2b\nconst CHAR_COMMA = 0x2c\nconst CHAR_MINUS = 0x2d\nconst CHAR_PERIOD = 0x2e\nconst CHAR_SLASH = 0x2f\nconst CHAR_DIGIT_0 = 0x30\nconst CHAR_DIGIT_1 = 0x31\nconst CHAR_DIGIT_9 = 0x39\nconst CHAR_COLON = 0x3a\nconst CHAR_EQUAL = 0x3d\nconst CHAR_UPPER_A = 0x41\nconst CHAR_UPPER_E = 0x45\nconst CHAR_UPPER_F = 0x46\nconst CHAR_UPPER_Z = 0x5a\nconst CHAR_LEFT_BRACKET = 0x5b\nconst CHAR_BACKSLASH = 0x5c\nconst CHAR_RIGHT_BRACKET = 0x5d\nconst CHAR_UNDERSCORE = 0x5f\nconst CHAR_DOLLAR = 0x24\nconst CHAR_LOWER_A = 0x61\nconst CHAR_LOWER_B = 0x62\nconst CHAR_LOWER_E = 0x65\nconst CHAR_LOWER_F = 0x66\nconst CHAR_LOWER_L = 0x6c\nconst CHAR_LOWER_N = 0x6e\nconst CHAR_LOWER_R = 0x72\nconst CHAR_LOWER_S = 0x73\nconst CHAR_LOWER_T = 0x74\nconst CHAR_LOWER_U = 0x75\nconst CHAR_LOWER_Z = 0x7a\nconst CHAR_LEFT_BRACE = 0x7b\nconst CHAR_RIGHT_BRACE = 0x7d\n\nconst DECODER = new TextDecoder('utf-8', { fatal: true })\n\nconst BASE64_LOOKUP = new Int8Array(256)\nBASE64_LOOKUP.fill(-1)\nfor (let i = CHAR_UPPER_A; i <= CHAR_UPPER_Z; i++)\n BASE64_LOOKUP[i] = i - CHAR_UPPER_A\nfor (let i = CHAR_LOWER_A; i <= CHAR_LOWER_Z; i++)\n BASE64_LOOKUP[i] = i - CHAR_LOWER_A + 26\nfor (let i = CHAR_DIGIT_0; i <= CHAR_DIGIT_9; i++)\n BASE64_LOOKUP[i] = i - CHAR_DIGIT_0 + 52\nBASE64_LOOKUP[CHAR_PLUS] = 62\nBASE64_LOOKUP[CHAR_MINUS] = 62\nBASE64_LOOKUP[CHAR_SLASH] = 63\nBASE64_LOOKUP[CHAR_UNDERSCORE] = 63\n\nconst HEX_LOOKUP = new Int8Array(256)\nHEX_LOOKUP.fill(-1)\nfor (let i = CHAR_DIGIT_0; i <= CHAR_DIGIT_9; i++)\n HEX_LOOKUP[i] = i - CHAR_DIGIT_0\nfor (let i = CHAR_UPPER_A; i <= CHAR_UPPER_F; i++)\n HEX_LOOKUP[i] = i - CHAR_UPPER_A + 10\nfor (let i = CHAR_LOWER_A; i <= CHAR_LOWER_F; i++)\n HEX_LOOKUP[i] = i - CHAR_LOWER_A + 10\n\n// Thresholds for optimization heuristics\nexport const BASE64_NATIVE_THRESHOLD = 256 // Use native decoding for base64 strings > this length\n\nexport class JsonBytesDecoder {\n private pos = 0\n\n constructor(\n private readonly data: Uint8Array,\n private readonly strict = true,\n ) {}\n\n decode(): LexValue {\n this.skipWhitespace()\n const value = this.parseValue()\n this.skipWhitespace()\n\n if (this.pos < this.data.length) {\n throw new TypeError(`Unexpected data after JSON at position ${this.pos}`)\n }\n\n return value\n }\n\n private parseValue(): LexValue {\n const ch = this.data[this.pos]\n\n // Optimize by checking most common value types first\n // Strings and objects are very common in real JSON\n if (ch === CHAR_DOUBLE_QUOTE) {\n return this.parseString()\n } else if (ch === CHAR_LEFT_BRACE) {\n return this.parseObject()\n } else if (ch === CHAR_LEFT_BRACKET) {\n return this.parseArray()\n } else if (ch === CHAR_LOWER_T) {\n return this.parseTrue()\n } else if (ch === CHAR_LOWER_F) {\n return this.parseFalse()\n } else if (ch === CHAR_LOWER_N) {\n return this.parseNull()\n } else {\n // Fallback for unexpected input\n return this.parseNumber()\n }\n }\n\n private parseObject(): LexValue {\n this.pos++ // skip '{'\n this.skipWhitespace()\n\n // Check for empty object\n if (this.data[this.pos] === CHAR_RIGHT_BRACE) {\n this.pos++\n return {}\n }\n\n let obj: Record<string, LexValue>\n let hasDollarKey = false // Track if we've seen any $ key for validation\n\n for (let i = 0; ; i++) {\n this.skipWhitespace()\n\n // Parse key\n if (this.data[this.pos] !== CHAR_DOUBLE_QUOTE) {\n throw new TypeError(`Expected string key at position ${this.pos}`)\n }\n\n // Track special keys for later validation\n if (this.data[this.pos + 1] === CHAR_DOLLAR) {\n hasDollarKey = true\n }\n\n const key = this.parseString()\n\n // Prevent prototype pollution\n if (key === '__proto__') {\n throw new TypeError('JSON object keys cannot be \"__proto__\"')\n }\n\n this.skipWhitespace()\n\n // Parse colon\n if (this.data[this.pos] !== CHAR_COLON) {\n throw new TypeError(`Expected ':' at position ${this.pos}`)\n }\n this.pos++\n this.skipWhitespace()\n\n // Parse $bytes or $link if it's the first and only key\n if (i === 0) {\n if (key === '$bytes' && this.data[this.pos] === CHAR_DOUBLE_QUOTE) {\n const initialPos = this.pos\n const b64Start = initialPos + 1\n const b64End = this.data.indexOf(CHAR_DOUBLE_QUOTE, b64Start)\n if (b64End !== -1) {\n this.pos = b64End + 1\n this.skipWhitespace()\n if (this.data[this.pos] === CHAR_RIGHT_BRACE) {\n this.pos++\n\n const base64Len = b64End - b64Start\n\n try {\n // Use native decoding for large base64 strings (much faster\n // based on benchmarks)\n if (base64Len > BASE64_NATIVE_THRESHOLD) {\n const b64Str = this.decodeUnescapedString(b64Start, b64End)\n return fromBase64(b64Str) // Validate and convert to LexValue bytes\n }\n\n // Manual decoding for smaller strings (optimized path)\n // Skip padding characters\n let b64EndNoPadding = b64End\n while (\n b64EndNoPadding > b64Start &&\n this.data[b64EndNoPadding - 1] === CHAR_EQUAL\n ) {\n b64EndNoPadding--\n }\n\n const base64LenNoPadding = b64EndNoPadding - b64Start\n const bytesLen = Math.floor((base64LenNoPadding * 3) / 4)\n const result = new Uint8Array(bytesLen)\n\n for (\n let i = b64Start, j = 0;\n i <= b64EndNoPadding - 4;\n i += 4\n ) {\n const chunk =\n (this.base64Value(this.data[i]) << 18) |\n (this.base64Value(this.data[i + 1]) << 12) |\n (this.base64Value(this.data[i + 2]) << 6) |\n this.base64Value(this.data[i + 3])\n\n result[j++] = (chunk >> 16) & 0xff\n result[j++] = (chunk >> 8) & 0xff\n result[j++] = chunk & 0xff\n }\n\n // Handle remaining characters (if any)\n if (base64LenNoPadding % 4 === 2) {\n const chunk =\n (this.base64Value(this.data[b64EndNoPadding - 2]) << 18) |\n (this.base64Value(this.data[b64EndNoPadding - 1]) << 12)\n result[bytesLen - 1] = (chunk >> 16) & 0xff\n } else if (base64LenNoPadding % 4 === 3) {\n const chunk =\n (this.base64Value(this.data[b64EndNoPadding - 3]) << 18) |\n (this.base64Value(this.data[b64EndNoPadding - 2]) << 12) |\n (this.base64Value(this.data[b64EndNoPadding - 1]) << 6)\n result[bytesLen - 2] = (chunk >> 16) & 0xff\n result[bytesLen - 1] = (chunk >> 8) & 0xff\n }\n\n return result\n } catch (cause) {\n if (this.strict) {\n throw new TypeError('Invalid $bytes object', { cause })\n }\n // ignore and parse as regular object\n }\n }\n }\n\n this.pos = initialPos // reset position to parse string properly\n } else if (\n key === '$link' &&\n this.data[this.pos] === CHAR_DOUBLE_QUOTE\n ) {\n const initialPos = this.pos\n const cidStart = initialPos + 1\n const cidEnd = this.data.indexOf(CHAR_DOUBLE_QUOTE, cidStart)\n if (cidEnd !== -1) {\n this.pos = cidEnd + 1\n this.skipWhitespace()\n if (this.data[this.pos] === CHAR_RIGHT_BRACE) {\n this.pos++\n const cidStr = this.decodeUnescapedString(cidStart, cidEnd)\n try {\n return parseCid(cidStr)\n } catch (cause) {\n if (this.strict) {\n throw new TypeError('Invalid $link object', { cause })\n }\n // ignore\n }\n }\n }\n\n this.pos = initialPos // reset position to parse string properly\n }\n }\n\n // Parse value\n obj ??= {}\n obj[key] = this.parseValue()\n\n this.skipWhitespace()\n\n const next = this.data[this.pos]\n if (next === CHAR_RIGHT_BRACE) {\n this.pos++\n break\n } else if (next === CHAR_COMMA) {\n this.pos++\n } else {\n throw new TypeError(`Expected ',' or '}' at position ${this.pos}`)\n }\n }\n\n // In strict mode, validate special objects with extra keys\n // Only check if we've seen a $ key (optimization)\n if (hasDollarKey && this.strict) {\n if (obj.$bytes !== undefined) {\n throw new TypeError('Invalid $bytes object')\n } else if (obj.$link !== undefined) {\n throw new TypeError('Invalid $link object')\n } else if (obj.$type === 'blob') {\n const blob = parseTypedBlobRef(obj, { strict: this.strict })\n if (blob) return blob\n throw new TypeError(`Invalid blob object`)\n } else if (obj.$type !== undefined) {\n if (typeof obj.$type !== 'string') {\n throw new TypeError(`Invalid $type property (${typeof obj.$type})`)\n } else if (obj.$type.length === 0) {\n throw new TypeError(`Empty $type property`)\n }\n }\n }\n\n return obj\n }\n\n private parseArray(): LexValue[] {\n this.pos++ // skip '['\n this.skipWhitespace()\n\n const arr: LexValue[] = []\n\n // Check for empty array\n if (this.data[this.pos] === CHAR_RIGHT_BRACKET) {\n this.pos++\n return arr\n }\n\n for (;;) {\n this.skipWhitespace()\n arr.push(this.parseValue())\n this.skipWhitespace()\n\n const next = this.data[this.pos]\n if (next === CHAR_RIGHT_BRACKET) {\n this.pos++\n break\n } else if (next === CHAR_COMMA) {\n this.pos++\n } else {\n throw new TypeError(`Expected ',' or ']' at position ${this.pos}`)\n }\n }\n\n return arr\n }\n\n private parseString(): string {\n this.pos++ // skip opening quote\n const start = this.pos\n\n // Fast path: scan for quote, checking for escapes and control chars inline\n // Optimized for the common case of strings without escapes\n let i = this.pos\n while (i < this.data.length) {\n const ch = this.data[i]\n\n if (ch === CHAR_DOUBLE_QUOTE) {\n // Found end quote - fast path success\n this.pos = i + 1\n return this.decodeUnescapedString(start, i)\n } else if (ch === CHAR_BACKSLASH) {\n // Found escape or control character - need slow path\n break\n } else if (ch < 0x20) {\n throw new TypeError(`Unescaped control character at position ${i}`)\n }\n i++\n }\n\n // Slow path: handle escapes or control characters\n if (i >= this.data.length) {\n throw new TypeError('Unterminated string')\n }\n\n // We hit a backslash - need to process escape sequences\n let result = ''\n let segmentStart = start\n\n this.pos = i\n while (this.pos < this.data.length) {\n const ch = this.data[this.pos]\n\n if (ch === CHAR_DOUBLE_QUOTE) {\n // Found end of string\n if (segmentStart < this.pos) {\n result += this.decodeUnescapedString(segmentStart, this.pos)\n }\n this.pos++\n return result\n } else if (ch === CHAR_BACKSLASH) {\n // Process escape sequence\n if (segmentStart < this.pos) {\n result += this.decodeUnescapedString(segmentStart, this.pos)\n }\n this.pos++ // skip backslash\n result += this.parseEscapeSequence()\n segmentStart = this.pos\n } else if (ch < 0x20) {\n throw new TypeError(\n `Unescaped control character at position ${this.pos}`,\n )\n } else {\n this.pos++\n }\n }\n\n throw new TypeError('Unterminated string')\n }\n\n private parseEscapeSequence(): string {\n const ch = this.data[this.pos++]\n\n switch (ch) {\n case CHAR_DOUBLE_QUOTE:\n return '\"'\n case CHAR_BACKSLASH:\n return '\\\\'\n case CHAR_SLASH:\n return '/'\n case CHAR_LOWER_B:\n return '\\b'\n case CHAR_LOWER_F:\n return '\\f'\n case CHAR_LOWER_N:\n return '\\n'\n case CHAR_LOWER_R:\n return '\\r'\n case CHAR_LOWER_T:\n return '\\t'\n case CHAR_LOWER_U:\n return this.parseUnicodeEscape()\n default:\n throw new TypeError(`Invalid escape sequence at position ${this.pos}`)\n }\n }\n\n private parseUnicodeEscape(): string {\n // Parse \\uXXXX\n let codePoint = 0\n for (let i = 0; i < 4; i++) {\n const ch = this.data[this.pos++]\n const hex = this.hexValue(ch)\n codePoint = (codePoint << 4) | hex\n }\n\n // Handle surrogate pairs\n if (codePoint >= 0xd800 && codePoint <= 0xdbff) {\n // High surrogate, check if followed by low surrogate\n if (\n this.pos + 5 < this.data.length &&\n this.data[this.pos] === CHAR_BACKSLASH &&\n this.data[this.pos + 1] === CHAR_LOWER_U\n ) {\n // Save position in case we need to backtrack\n const savedPos = this.pos\n this.pos += 2\n let low = 0\n for (let i = 0; i < 4; i++) {\n const ch = this.data[this.pos++]\n const hex = this.hexValue(ch)\n low = (low << 4) | hex\n }\n // Check if it's a valid low surrogate\n if (low >= 0xdc00 && low <= 0xdfff) {\n // Valid pair - combine into single codepoint\n codePoint = 0x10000 + ((codePoint - 0xd800) << 10) + (low - 0xdc00)\n } else {\n // Not a low surrogate - backtrack so it gets processed separately\n this.pos = savedPos\n }\n }\n }\n\n return String.fromCodePoint(codePoint)\n }\n\n private hexValue(ch: number): number {\n const value = HEX_LOOKUP[ch]\n if (value !== -1) return value\n throw new TypeError(`Invalid unicode escape at position ${this.pos}`)\n }\n\n private base64Value(ch: number): number {\n const value = BASE64_LOOKUP[ch]\n if (value !== -1) return value\n throw new TypeError(\n `Invalid base64 character: ${String.fromCharCode(ch)} at position ${this.pos}`,\n )\n }\n\n private decodeUnescapedString(start: number, end: number): string {\n const len = end - start\n if (len === 0) return ''\n\n // Fast path for very short ASCII strings (common for object keys like \"id\", \"name\", etc.)\n // Heuristic: only worth it for strings <= 20 chars where String.fromCharCode is faster\n // This is a hot path for object keys\n if (len <= 20) {\n let result = ''\n for (let i = start; i < end; i++) {\n const byte = this.data[i]\n if (byte > 0x7f) {\n // Hit non-ASCII, fall back to TextDecoder for full UTF-8 decoding\n const subView = new Uint8Array(\n this.data.buffer,\n this.data.byteOffset + start,\n len,\n )\n return DECODER.decode(subView)\n }\n result += String.fromCharCode(byte)\n }\n return result\n }\n\n // For longer strings, use utf8FromBytes directly (it's highly optimized)\n const subView = new Uint8Array(\n this.data.buffer,\n this.data.byteOffset + start,\n len,\n )\n return DECODER.decode(subView)\n }\n\n private parseNumber(): number {\n const start = this.pos\n\n let sign = 1\n let int = 0\n let decimal = 0\n let expSign = 1\n let exp = 0\n\n // Parse sign\n if (this.data[this.pos] === CHAR_MINUS) {\n sign = -1\n this.pos++\n }\n\n // Parse integer part\n if (this.data[this.pos] === CHAR_DIGIT_0) {\n this.pos++\n // Leading zero must be followed by decimal, exponent, or end\n } else if (\n // Note: cannot start with \"0\"\n this.data[this.pos] >= CHAR_DIGIT_1 &&\n this.data[this.pos] <= CHAR_DIGIT_9\n ) {\n do {\n int = int * 10 + (this.data[this.pos] - CHAR_DIGIT_0)\n this.pos++\n } while (\n this.pos < this.data.length &&\n this.data[this.pos] >= CHAR_DIGIT_0 &&\n this.data[this.pos] <= CHAR_DIGIT_9\n )\n } else {\n throw new TypeError(`Unexpected character at position ${this.pos}`)\n }\n\n // Strict mode validation is deferred until after decimal/exponent parsing\n // so that we can include the complete number value in the error message.\n\n // Parse decimal part\n if (this.pos < this.data.length && this.data[this.pos] === CHAR_PERIOD) {\n this.pos++\n if (\n this.pos >= this.data.length ||\n this.data[this.pos] < CHAR_DIGIT_0 ||\n this.data[this.pos] > CHAR_DIGIT_9\n ) {\n throw new TypeError(`Invalid number at position ${start}`)\n }\n let decimalPlace = 0.1\n do {\n decimal += (this.data[this.pos] - CHAR_DIGIT_0) * decimalPlace\n decimalPlace *= 0.1\n this.pos++\n } while (\n this.pos < this.data.length &&\n this.data[this.pos] >= CHAR_DIGIT_0 &&\n this.data[this.pos] <= CHAR_DIGIT_9\n )\n }\n\n // Parse exponent part\n if (\n this.pos < this.data.length &&\n (this.data[this.pos] === CHAR_LOWER_E ||\n this.data[this.pos] === CHAR_UPPER_E)\n ) {\n this.pos++\n if (\n this.pos < this.data.length &&\n (this.data[this.pos] === CHAR_PLUS ||\n this.data[this.pos] === CHAR_MINUS)\n ) {\n expSign = this.data[this.pos] === CHAR_MINUS ? -1 : 1\n this.pos++ // skip + or -\n }\n if (\n this.pos >= this.data.length ||\n this.data[this.pos] < CHAR_DIGIT_0 ||\n this.data[this.pos] > CHAR_DIGIT_9\n ) {\n throw new TypeError(`Invalid number at position ${start}`)\n }\n do {\n exp = exp * 10 + (this.data[this.pos] - CHAR_DIGIT_0)\n this.pos++\n } while (\n this.pos < this.data.length &&\n this.data[this.pos] >= CHAR_DIGIT_0 &&\n this.data[this.pos] <= CHAR_DIGIT_9\n )\n }\n\n const num = sign * (int + decimal) * Math.pow(10, expSign * exp)\n\n if (this.strict && !Number.isSafeInteger(num)) {\n throw new TypeError(`Invalid non-integer number: ${num}`)\n }\n\n return num\n }\n\n private parseTrue(): boolean {\n if (\n this.pos + 4 <= this.data.length &&\n this.data[this.pos] === CHAR_LOWER_T &&\n this.data[this.pos + 1] === CHAR_LOWER_R &&\n this.data[this.pos + 2] === CHAR_LOWER_U &&\n this.data[this.pos + 3] === CHAR_LOWER_E\n ) {\n this.pos += 4\n return true\n }\n throw new TypeError(`Unexpected token at position ${this.pos}`)\n }\n\n private parseFalse(): boolean {\n if (\n this.pos + 5 <= this.data.length &&\n this.data[this.pos] === CHAR_LOWER_F &&\n this.data[this.pos + 1] === CHAR_LOWER_A &&\n this.data[this.pos + 2] === CHAR_LOWER_L &&\n this.data[this.pos + 3] === CHAR_LOWER_S &&\n this.data[this.pos + 4] === CHAR_LOWER_E\n ) {\n this.pos += 5\n return false\n }\n throw new TypeError(`Unexpected token at position ${this.pos}`)\n }\n\n private parseNull(): null {\n if (\n this.pos + 4 <= this.data.length &&\n this.data[this.pos] === CHAR_LOWER_N &&\n this.data[this.pos + 1] === CHAR_LOWER_U &&\n this.data[this.pos + 2] === CHAR_LOWER_L &&\n this.data[this.pos + 3] === CHAR_LOWER_L\n ) {\n this.pos += 4\n return null\n }\n throw new TypeError(`Unexpected token at position ${this.pos}`)\n }\n\n private skipWhitespace(): void {\n // Optimized: check most common case (space) first, and use <= for compact check\n while (this.pos < this.data.length) {\n const ch = this.data[this.pos]\n // Optimize for the most common case: space (0x20)\n if (ch === CHAR_SPACE) {\n this.pos++\n } else if (\n ch === CHAR_TAB ||\n ch === CHAR_NEWLINE ||\n ch === CHAR_CARRIAGE_RETURN\n ) {\n this.pos++\n } else {\n break\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"json-bytes-decoder.js","sourceRoot":"","sources":["../src/json-bytes-decoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { LexValue, fromBase64, parseCid } from '@atproto/lex-data'\nimport { parseTypedBlobRef } from './blob.js'\n\nconst CHAR_TAB = 0x09\nconst CHAR_NEWLINE = 0x0a\nconst CHAR_CARRIAGE_RETURN = 0x0d\nconst CHAR_SPACE = 0x20\nconst CHAR_DOUBLE_QUOTE = 0x22\nconst CHAR_PLUS = 0x2b\nconst CHAR_COMMA = 0x2c\nconst CHAR_MINUS = 0x2d\nconst CHAR_PERIOD = 0x2e\nconst CHAR_SLASH = 0x2f\nconst CHAR_DIGIT_0 = 0x30\nconst CHAR_DIGIT_1 = 0x31\nconst CHAR_DIGIT_9 = 0x39\nconst CHAR_COLON = 0x3a\nconst CHAR_EQUAL = 0x3d\nconst CHAR_UPPER_A = 0x41\nconst CHAR_UPPER_E = 0x45\nconst CHAR_UPPER_F = 0x46\nconst CHAR_UPPER_Z = 0x5a\nconst CHAR_LEFT_BRACKET = 0x5b\nconst CHAR_BACKSLASH = 0x5c\nconst CHAR_RIGHT_BRACKET = 0x5d\nconst CHAR_UNDERSCORE = 0x5f\nconst CHAR_DOLLAR = 0x24\nconst CHAR_LOWER_A = 0x61\nconst CHAR_LOWER_B = 0x62\nconst CHAR_LOWER_E = 0x65\nconst CHAR_LOWER_F = 0x66\nconst CHAR_LOWER_L = 0x6c\nconst CHAR_LOWER_N = 0x6e\nconst CHAR_LOWER_R = 0x72\nconst CHAR_LOWER_S = 0x73\nconst CHAR_LOWER_T = 0x74\nconst CHAR_LOWER_U = 0x75\nconst CHAR_LOWER_Z = 0x7a\nconst CHAR_LEFT_BRACE = 0x7b\nconst CHAR_RIGHT_BRACE = 0x7d\n\nconst DECODER = new TextDecoder('utf-8', { fatal: true })\n\nconst BASE64_LOOKUP = new Int8Array(256)\nBASE64_LOOKUP.fill(-1)\nfor (let i = CHAR_UPPER_A; i <= CHAR_UPPER_Z; i++)\n BASE64_LOOKUP[i] = i - CHAR_UPPER_A\nfor (let i = CHAR_LOWER_A; i <= CHAR_LOWER_Z; i++)\n BASE64_LOOKUP[i] = i - CHAR_LOWER_A + 26\nfor (let i = CHAR_DIGIT_0; i <= CHAR_DIGIT_9; i++)\n BASE64_LOOKUP[i] = i - CHAR_DIGIT_0 + 52\nBASE64_LOOKUP[CHAR_PLUS] = 62\nBASE64_LOOKUP[CHAR_MINUS] = 62\nBASE64_LOOKUP[CHAR_SLASH] = 63\nBASE64_LOOKUP[CHAR_UNDERSCORE] = 63\n\nconst HEX_LOOKUP = new Int8Array(256)\nHEX_LOOKUP.fill(-1)\nfor (let i = CHAR_DIGIT_0; i <= CHAR_DIGIT_9; i++)\n HEX_LOOKUP[i] = i - CHAR_DIGIT_0\nfor (let i = CHAR_UPPER_A; i <= CHAR_UPPER_F; i++)\n HEX_LOOKUP[i] = i - CHAR_UPPER_A + 10\nfor (let i = CHAR_LOWER_A; i <= CHAR_LOWER_F; i++)\n HEX_LOOKUP[i] = i - CHAR_LOWER_A + 10\n\n// Thresholds for optimization heuristics\nexport const BASE64_NATIVE_THRESHOLD = 256 // Use native decoding for base64 strings > this length\n\nexport class JsonBytesDecoder {\n private pos = 0\n\n constructor(\n private readonly data: Uint8Array,\n private readonly strict = true,\n ) {}\n\n decode(): LexValue {\n this.skipWhitespace()\n const value = this.parseValue()\n this.skipWhitespace()\n\n if (this.pos < this.data.length) {\n throw new TypeError(`Unexpected data after JSON at position ${this.pos}`)\n }\n\n return value\n }\n\n private parseValue(): LexValue {\n const ch = this.data[this.pos]\n\n // Optimize by checking most common value types first\n // Strings and objects are very common in real JSON\n if (ch === CHAR_DOUBLE_QUOTE) {\n return this.parseString()\n } else if (ch === CHAR_LEFT_BRACE) {\n return this.parseObject()\n } else if (ch === CHAR_LEFT_BRACKET) {\n return this.parseArray()\n } else if (ch === CHAR_LOWER_T) {\n return this.parseTrue()\n } else if (ch === CHAR_LOWER_F) {\n return this.parseFalse()\n } else if (ch === CHAR_LOWER_N) {\n return this.parseNull()\n } else {\n // Fallback for unexpected input\n return this.parseNumber()\n }\n }\n\n private parseObject(): LexValue {\n this.pos++ // skip '{'\n this.skipWhitespace()\n\n // Check for empty object\n if (this.data[this.pos] === CHAR_RIGHT_BRACE) {\n this.pos++\n return {}\n }\n\n let obj: Record<string, LexValue>\n let hasDollarKey = false // Track if we've seen any $ key for validation\n\n for (let i = 0; ; i++) {\n this.skipWhitespace()\n\n // Parse key\n if (this.data[this.pos] !== CHAR_DOUBLE_QUOTE) {\n throw new TypeError(`Expected string key at position ${this.pos}`)\n }\n\n // Track special keys for later validation\n if (this.data[this.pos + 1] === CHAR_DOLLAR) {\n hasDollarKey = true\n }\n\n const key = this.parseString()\n\n // Prevent prototype pollution\n if (key === '__proto__') {\n throw new TypeError('JSON object keys cannot be \"__proto__\"')\n }\n\n this.skipWhitespace()\n\n // Parse colon\n if (this.data[this.pos] !== CHAR_COLON) {\n throw new TypeError(`Expected ':' at position ${this.pos}`)\n }\n this.pos++\n this.skipWhitespace()\n\n // Parse $bytes or $link if it's the first and only key\n if (i === 0) {\n if (key === '$bytes' && this.data[this.pos] === CHAR_DOUBLE_QUOTE) {\n const initialPos = this.pos\n const b64Start = initialPos + 1\n const b64End = this.data.indexOf(CHAR_DOUBLE_QUOTE, b64Start)\n if (b64End !== -1) {\n this.pos = b64End + 1\n this.skipWhitespace()\n if (this.data[this.pos] === CHAR_RIGHT_BRACE) {\n this.pos++\n\n const base64Len = b64End - b64Start\n\n try {\n // Use native decoding for large base64 strings (much faster\n // based on benchmarks)\n if (base64Len > BASE64_NATIVE_THRESHOLD) {\n const b64Str = this.decodeUnescapedString(b64Start, b64End)\n return fromBase64(b64Str) // Validate and convert to LexValue bytes\n }\n\n // Manual decoding for smaller strings (optimized path)\n // Skip padding characters\n let b64EndNoPadding = b64End\n while (\n b64EndNoPadding > b64Start &&\n this.data[b64EndNoPadding - 1] === CHAR_EQUAL\n ) {\n b64EndNoPadding--\n }\n\n const base64LenNoPadding = b64EndNoPadding - b64Start\n const bytesLen = Math.floor((base64LenNoPadding * 3) / 4)\n const result = new Uint8Array(bytesLen)\n\n for (\n let i = b64Start, j = 0;\n i <= b64EndNoPadding - 4;\n i += 4\n ) {\n const chunk =\n (this.base64Value(this.data[i]) << 18) |\n (this.base64Value(this.data[i + 1]) << 12) |\n (this.base64Value(this.data[i + 2]) << 6) |\n this.base64Value(this.data[i + 3])\n\n result[j++] = (chunk >> 16) & 0xff\n result[j++] = (chunk >> 8) & 0xff\n result[j++] = chunk & 0xff\n }\n\n // Handle remaining characters (if any)\n if (base64LenNoPadding % 4 === 2) {\n const chunk =\n (this.base64Value(this.data[b64EndNoPadding - 2]) << 18) |\n (this.base64Value(this.data[b64EndNoPadding - 1]) << 12)\n result[bytesLen - 1] = (chunk >> 16) & 0xff\n } else if (base64LenNoPadding % 4 === 3) {\n const chunk =\n (this.base64Value(this.data[b64EndNoPadding - 3]) << 18) |\n (this.base64Value(this.data[b64EndNoPadding - 2]) << 12) |\n (this.base64Value(this.data[b64EndNoPadding - 1]) << 6)\n result[bytesLen - 2] = (chunk >> 16) & 0xff\n result[bytesLen - 1] = (chunk >> 8) & 0xff\n }\n\n return result\n } catch (cause) {\n if (this.strict) {\n throw new TypeError('Invalid $bytes object', { cause })\n }\n // ignore and parse as regular object\n }\n }\n }\n\n this.pos = initialPos // reset position to parse string properly\n } else if (\n key === '$link' &&\n this.data[this.pos] === CHAR_DOUBLE_QUOTE\n ) {\n const initialPos = this.pos\n const cidStart = initialPos + 1\n const cidEnd = this.data.indexOf(CHAR_DOUBLE_QUOTE, cidStart)\n if (cidEnd !== -1) {\n this.pos = cidEnd + 1\n this.skipWhitespace()\n if (this.data[this.pos] === CHAR_RIGHT_BRACE) {\n this.pos++\n const cidStr = this.decodeUnescapedString(cidStart, cidEnd)\n try {\n return parseCid(cidStr)\n } catch (cause) {\n if (this.strict) {\n throw new TypeError('Invalid $link object', { cause })\n }\n // ignore\n }\n }\n }\n\n this.pos = initialPos // reset position to parse string properly\n }\n }\n\n // Parse value\n obj ??= {}\n obj[key] = this.parseValue()\n\n this.skipWhitespace()\n\n const next = this.data[this.pos]\n if (next === CHAR_RIGHT_BRACE) {\n this.pos++\n break\n } else if (next === CHAR_COMMA) {\n this.pos++\n } else {\n throw new TypeError(`Expected ',' or '}' at position ${this.pos}`)\n }\n }\n\n // In strict mode, validate special objects with extra keys\n // Only check if we've seen a $ key (optimization)\n if (hasDollarKey && this.strict) {\n if (obj.$bytes !== undefined) {\n throw new TypeError('Invalid $bytes object')\n } else if (obj.$link !== undefined) {\n throw new TypeError('Invalid $link object')\n } else if (obj.$type === 'blob') {\n const blob = parseTypedBlobRef(obj, { strict: this.strict })\n if (blob) return blob\n throw new TypeError(`Invalid blob object`)\n } else if (obj.$type !== undefined) {\n if (typeof obj.$type !== 'string') {\n throw new TypeError(`Invalid $type property (${typeof obj.$type})`)\n } else if (obj.$type.length === 0) {\n throw new TypeError(`Empty $type property`)\n }\n }\n }\n\n return obj\n }\n\n private parseArray(): LexValue[] {\n this.pos++ // skip '['\n this.skipWhitespace()\n\n const arr: LexValue[] = []\n\n // Check for empty array\n if (this.data[this.pos] === CHAR_RIGHT_BRACKET) {\n this.pos++\n return arr\n }\n\n for (;;) {\n this.skipWhitespace()\n arr.push(this.parseValue())\n this.skipWhitespace()\n\n const next = this.data[this.pos]\n if (next === CHAR_RIGHT_BRACKET) {\n this.pos++\n break\n } else if (next === CHAR_COMMA) {\n this.pos++\n } else {\n throw new TypeError(`Expected ',' or ']' at position ${this.pos}`)\n }\n }\n\n return arr\n }\n\n private parseString(): string {\n this.pos++ // skip opening quote\n const start = this.pos\n\n // Fast path: scan for quote, checking for escapes and control chars inline\n // Optimized for the common case of strings without escapes\n let i = this.pos\n while (i < this.data.length) {\n const ch = this.data[i]\n\n if (ch === CHAR_DOUBLE_QUOTE) {\n // Found end quote - fast path success\n this.pos = i + 1\n return this.decodeUnescapedString(start, i)\n } else if (ch === CHAR_BACKSLASH) {\n // Found escape or control character - need slow path\n break\n } else if (ch < 0x20) {\n throw new TypeError(`Unescaped control character at position ${i}`)\n }\n i++\n }\n\n // Slow path: handle escapes or control characters\n if (i >= this.data.length) {\n throw new TypeError('Unterminated string')\n }\n\n // We hit a backslash - need to process escape sequences\n let result = ''\n let segmentStart = start\n\n this.pos = i\n while (this.pos < this.data.length) {\n const ch = this.data[this.pos]\n\n if (ch === CHAR_DOUBLE_QUOTE) {\n // Found end of string\n if (segmentStart < this.pos) {\n result += this.decodeUnescapedString(segmentStart, this.pos)\n }\n this.pos++\n return result\n } else if (ch === CHAR_BACKSLASH) {\n // Process escape sequence\n if (segmentStart < this.pos) {\n result += this.decodeUnescapedString(segmentStart, this.pos)\n }\n this.pos++ // skip backslash\n result += this.parseEscapeSequence()\n segmentStart = this.pos\n } else if (ch < 0x20) {\n throw new TypeError(\n `Unescaped control character at position ${this.pos}`,\n )\n } else {\n this.pos++\n }\n }\n\n throw new TypeError('Unterminated string')\n }\n\n private parseEscapeSequence(): string {\n const ch = this.data[this.pos++]\n\n switch (ch) {\n case CHAR_DOUBLE_QUOTE:\n return '\"'\n case CHAR_BACKSLASH:\n return '\\\\'\n case CHAR_SLASH:\n return '/'\n case CHAR_LOWER_B:\n return '\\b'\n case CHAR_LOWER_F:\n return '\\f'\n case CHAR_LOWER_N:\n return '\\n'\n case CHAR_LOWER_R:\n return '\\r'\n case CHAR_LOWER_T:\n return '\\t'\n case CHAR_LOWER_U:\n return this.parseUnicodeEscape()\n default:\n throw new TypeError(`Invalid escape sequence at position ${this.pos}`)\n }\n }\n\n private parseUnicodeEscape(): string {\n // Parse \\uXXXX\n let codePoint = 0\n for (let i = 0; i < 4; i++) {\n const ch = this.data[this.pos++]\n const hex = this.hexValue(ch)\n codePoint = (codePoint << 4) | hex\n }\n\n // Handle surrogate pairs\n if (codePoint >= 0xd800 && codePoint <= 0xdbff) {\n // High surrogate, check if followed by low surrogate\n if (\n this.pos + 5 < this.data.length &&\n this.data[this.pos] === CHAR_BACKSLASH &&\n this.data[this.pos + 1] === CHAR_LOWER_U\n ) {\n // Save position in case we need to backtrack\n const savedPos = this.pos\n this.pos += 2\n let low = 0\n for (let i = 0; i < 4; i++) {\n const ch = this.data[this.pos++]\n const hex = this.hexValue(ch)\n low = (low << 4) | hex\n }\n // Check if it's a valid low surrogate\n if (low >= 0xdc00 && low <= 0xdfff) {\n // Valid pair - combine into single codepoint\n codePoint = 0x10000 + ((codePoint - 0xd800) << 10) + (low - 0xdc00)\n } else {\n // Not a low surrogate - backtrack so it gets processed separately\n this.pos = savedPos\n }\n }\n }\n\n return String.fromCodePoint(codePoint)\n }\n\n private hexValue(ch: number): number {\n const value = HEX_LOOKUP[ch]\n if (value !== -1) return value\n throw new TypeError(`Invalid unicode escape at position ${this.pos}`)\n }\n\n private base64Value(ch: number): number {\n const value = BASE64_LOOKUP[ch]\n if (value !== -1) return value\n throw new TypeError(\n `Invalid base64 character: ${String.fromCharCode(ch)} at position ${this.pos}`,\n )\n }\n\n private decodeUnescapedString(start: number, end: number): string {\n const len = end - start\n if (len === 0) return ''\n\n // Fast path for very short ASCII strings (common for object keys like \"id\", \"name\", etc.)\n // Heuristic: only worth it for strings <= 20 chars where String.fromCharCode is faster\n // This is a hot path for object keys\n if (len <= 20) {\n let result = ''\n for (let i = start; i < end; i++) {\n const byte = this.data[i]\n if (byte > 0x7f) {\n // Hit non-ASCII, fall back to TextDecoder for full UTF-8 decoding\n const subView = new Uint8Array(\n this.data.buffer,\n this.data.byteOffset + start,\n len,\n )\n return DECODER.decode(subView)\n }\n result += String.fromCharCode(byte)\n }\n return result\n }\n\n // For longer strings, use utf8FromBytes directly (it's highly optimized)\n const subView = new Uint8Array(\n this.data.buffer,\n this.data.byteOffset + start,\n len,\n )\n return DECODER.decode(subView)\n }\n\n private parseNumber(): number {\n const start = this.pos\n\n let sign = 1\n let int = 0\n let decimal = 0\n let expSign = 1\n let exp = 0\n\n // Parse sign\n if (this.data[this.pos] === CHAR_MINUS) {\n sign = -1\n this.pos++\n }\n\n // Parse integer part\n if (this.data[this.pos] === CHAR_DIGIT_0) {\n this.pos++\n // Leading zero must be followed by decimal, exponent, or end\n } else if (\n // Note: cannot start with \"0\"\n this.data[this.pos] >= CHAR_DIGIT_1 &&\n this.data[this.pos] <= CHAR_DIGIT_9\n ) {\n do {\n int = int * 10 + (this.data[this.pos] - CHAR_DIGIT_0)\n this.pos++\n } while (\n this.pos < this.data.length &&\n this.data[this.pos] >= CHAR_DIGIT_0 &&\n this.data[this.pos] <= CHAR_DIGIT_9\n )\n } else {\n throw new TypeError(`Unexpected character at position ${this.pos}`)\n }\n\n // Strict mode validation is deferred until after decimal/exponent parsing\n // so that we can include the complete number value in the error message.\n\n // Parse decimal part\n if (this.pos < this.data.length && this.data[this.pos] === CHAR_PERIOD) {\n this.pos++\n if (\n this.pos >= this.data.length ||\n this.data[this.pos] < CHAR_DIGIT_0 ||\n this.data[this.pos] > CHAR_DIGIT_9\n ) {\n throw new TypeError(`Invalid number at position ${start}`)\n }\n let decimalPlace = 0.1\n do {\n decimal += (this.data[this.pos] - CHAR_DIGIT_0) * decimalPlace\n decimalPlace *= 0.1\n this.pos++\n } while (\n this.pos < this.data.length &&\n this.data[this.pos] >= CHAR_DIGIT_0 &&\n this.data[this.pos] <= CHAR_DIGIT_9\n )\n }\n\n // Parse exponent part\n if (\n this.pos < this.data.length &&\n (this.data[this.pos] === CHAR_LOWER_E ||\n this.data[this.pos] === CHAR_UPPER_E)\n ) {\n this.pos++\n if (\n this.pos < this.data.length &&\n (this.data[this.pos] === CHAR_PLUS ||\n this.data[this.pos] === CHAR_MINUS)\n ) {\n expSign = this.data[this.pos] === CHAR_MINUS ? -1 : 1\n this.pos++ // skip + or -\n }\n if (\n this.pos >= this.data.length ||\n this.data[this.pos] < CHAR_DIGIT_0 ||\n this.data[this.pos] > CHAR_DIGIT_9\n ) {\n throw new TypeError(`Invalid number at position ${start}`)\n }\n do {\n exp = exp * 10 + (this.data[this.pos] - CHAR_DIGIT_0)\n this.pos++\n } while (\n this.pos < this.data.length &&\n this.data[this.pos] >= CHAR_DIGIT_0 &&\n this.data[this.pos] <= CHAR_DIGIT_9\n )\n }\n\n const num = sign * (int + decimal) * Math.pow(10, expSign * exp)\n\n if (this.strict && !Number.isSafeInteger(num)) {\n throw new TypeError(`Invalid non-integer number: ${num}`)\n }\n\n return num\n }\n\n private parseTrue(): boolean {\n if (\n this.pos + 4 <= this.data.length &&\n this.data[this.pos] === CHAR_LOWER_T &&\n this.data[this.pos + 1] === CHAR_LOWER_R &&\n this.data[this.pos + 2] === CHAR_LOWER_U &&\n this.data[this.pos + 3] === CHAR_LOWER_E\n ) {\n this.pos += 4\n return true\n }\n throw new TypeError(`Unexpected token at position ${this.pos}`)\n }\n\n private parseFalse(): boolean {\n if (\n this.pos + 5 <= this.data.length &&\n this.data[this.pos] === CHAR_LOWER_F &&\n this.data[this.pos + 1] === CHAR_LOWER_A &&\n this.data[this.pos + 2] === CHAR_LOWER_L &&\n this.data[this.pos + 3] === CHAR_LOWER_S &&\n this.data[this.pos + 4] === CHAR_LOWER_E\n ) {\n this.pos += 5\n return false\n }\n throw new TypeError(`Unexpected token at position ${this.pos}`)\n }\n\n private parseNull(): null {\n if (\n this.pos + 4 <= this.data.length &&\n this.data[this.pos] === CHAR_LOWER_N &&\n this.data[this.pos + 1] === CHAR_LOWER_U &&\n this.data[this.pos + 2] === CHAR_LOWER_L &&\n this.data[this.pos + 3] === CHAR_LOWER_L\n ) {\n this.pos += 4\n return null\n }\n throw new TypeError(`Unexpected token at position ${this.pos}`)\n }\n\n private skipWhitespace(): void {\n // Optimized: check most common case (space) first, and use <= for compact check\n while (this.pos < this.data.length) {\n const ch = this.data[this.pos]\n // Optimize for the most common case: space (0x20)\n if (ch === CHAR_SPACE) {\n this.pos++\n } else if (\n ch === CHAR_TAB ||\n ch === CHAR_NEWLINE ||\n ch === CHAR_CARRIAGE_RETURN\n ) {\n this.pos++\n } else {\n break\n }\n }\n }\n}\n"]}
package/dist/json.js CHANGED
@@ -1,3 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
3
2
  //# sourceMappingURL=json.js.map
package/dist/lex-json.js CHANGED
@@ -1,15 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.lexStringify = lexStringify;
4
- exports.lexParse = lexParse;
5
- exports.lexParseJsonBytes = lexParseJsonBytes;
6
- exports.jsonToLex = jsonToLex;
7
- exports.lexToJson = lexToJson;
8
- exports.parseSpecialJsonObject = parseSpecialJsonObject;
9
- const lex_data_1 = require("@atproto/lex-data");
10
- const blob_js_1 = require("./blob.js");
11
- const bytes_js_1 = require("./bytes.js");
12
- const link_js_1 = require("./link.js");
1
+ import { isCid, utf8FromBytes, } from '@atproto/lex-data';
2
+ import { parseTypedBlobRef } from './blob.js';
3
+ import { encodeLexBytes, parseLexBytes } from './bytes.js';
4
+ import { encodeLexLink, parseLexLink } from './link.js';
13
5
  /**
14
6
  * Serialize a Lex value to a JSON string.
15
7
  *
@@ -33,7 +25,7 @@ const link_js_1 = require("./link.js");
33
25
  * // json is '{"ref":{"$link":"bafyrei..."},"data":{"$bytes":"SGVsbG8="}}'
34
26
  * ```
35
27
  */
36
- function lexStringify(input) {
28
+ export function lexStringify(input) {
37
29
  // @NOTE Because of the way the "replacer" works in JSON.stringify, it's
38
30
  // simpler to convert Lex to JSON first rather than trying to do it
39
31
  // on-the-fly.
@@ -74,7 +66,7 @@ function lexStringify(input) {
74
66
  * const someBytes = lexParse<Uint8Array>('{"$bytes": "SGVsbG8sIHdvcmxkIQ=="}')
75
67
  * ```
76
68
  */
77
- function lexParse(input, options = { strict: false }) {
69
+ export function lexParse(input, options = { strict: false }) {
78
70
  // @NOTE see ./lex-json.bench.ts for performance comparison of implementation
79
71
  // that uses a reviver function in JSON.parse vs. the current implementation.
80
72
  return jsonToLex(JSON.parse(input), options);
@@ -82,7 +74,7 @@ function lexParse(input, options = { strict: false }) {
82
74
  /**
83
75
  * Parses a JSON string from a byte array into Lex values.
84
76
  */
85
- function lexParseJsonBytes(bytes, options) {
77
+ export function lexParseJsonBytes(bytes, options) {
86
78
  // @NOTE see ./json-bytes-decoder.bench.ts for performance comparison of
87
79
  // implementation that uses a decoder class that operates directly on bytes
88
80
  // vs. the current implementation that first decodes bytes to string and then
@@ -90,7 +82,7 @@ function lexParseJsonBytes(bytes, options) {
90
82
  // implementation works better than the decoder based solution, while having a
91
83
  // small overhead for slower cases (~2% difference). Because of this, we keep
92
84
  // the trivial implementation:
93
- return lexParse((0, lex_data_1.utf8FromBytes)(bytes), options);
85
+ return lexParse(utf8FromBytes(bytes), options);
94
86
  }
95
87
  /**
96
88
  * Converts a parsed JSON representation of Lexicon value to a {@link LexValue}.
@@ -121,7 +113,7 @@ function lexParseJsonBytes(bytes, options) {
121
113
  * })
122
114
  * ```
123
115
  */
124
- function jsonToLex(value, options = { strict: false }) {
116
+ export function jsonToLex(value, options = { strict: false }) {
125
117
  switch (typeof value) {
126
118
  case 'object': {
127
119
  if (value === null)
@@ -151,7 +143,7 @@ function jsonArrayToLex(input, options) {
151
143
  const inputItem = input[i];
152
144
  const item = jsonToLex(inputItem, options);
153
145
  if (item !== inputItem) {
154
- copy ?? (copy = Array.from(input));
146
+ copy ??= Array.from(input);
155
147
  copy[i] = item;
156
148
  }
157
149
  }
@@ -167,13 +159,13 @@ function jsonObjectToLexMap(input, options) {
167
159
  }
168
160
  // Ignore (strip) undefined values
169
161
  if (jsonValue === undefined) {
170
- copy ?? (copy = { ...input });
162
+ copy ??= { ...input };
171
163
  delete copy[key];
172
164
  continue;
173
165
  }
174
166
  const value = jsonToLex(jsonValue, options);
175
167
  if (value !== jsonValue) {
176
- copy ?? (copy = { ...input });
168
+ copy ??= { ...input };
177
169
  copy[key] = value;
178
170
  }
179
171
  }
@@ -206,7 +198,7 @@ function jsonObjectToLexMap(input, options) {
206
198
  * })
207
199
  * ```
208
200
  */
209
- function lexToJson(value) {
201
+ export function lexToJson(value) {
210
202
  switch (typeof value) {
211
203
  case 'object':
212
204
  if (value === null) {
@@ -215,11 +207,11 @@ function lexToJson(value) {
215
207
  else if (Array.isArray(value)) {
216
208
  return lexArrayToJson(value);
217
209
  }
218
- else if ((0, lex_data_1.isCid)(value)) {
219
- return (0, link_js_1.encodeLexLink)(value);
210
+ else if (isCid(value)) {
211
+ return encodeLexLink(value);
220
212
  }
221
213
  else if (ArrayBuffer.isView(value)) {
222
- return (0, bytes_js_1.encodeLexBytes)(value);
214
+ return encodeLexBytes(value);
223
215
  }
224
216
  else {
225
217
  return encodeLexMap(value);
@@ -239,7 +231,7 @@ function lexArrayToJson(input) {
239
231
  const inputItem = input[i];
240
232
  const item = lexToJson(inputItem);
241
233
  if (item !== inputItem) {
242
- copy ?? (copy = Array.from(input));
234
+ copy ??= Array.from(input);
243
235
  copy[i] = item;
244
236
  }
245
237
  }
@@ -255,13 +247,13 @@ function encodeLexMap(input) {
255
247
  }
256
248
  // Ignore (strip) undefined values
257
249
  if (lexValue === undefined) {
258
- copy ?? (copy = { ...input });
250
+ copy ??= { ...input };
259
251
  delete copy[key];
260
252
  continue;
261
253
  }
262
254
  const jsonValue = lexToJson(lexValue);
263
255
  if (jsonValue !== lexValue) {
264
- copy ?? (copy = { ...input });
256
+ copy ??= { ...input };
265
257
  copy[key] = jsonValue;
266
258
  }
267
259
  }
@@ -270,17 +262,17 @@ function encodeLexMap(input) {
270
262
  /**
271
263
  * @internal
272
264
  */
273
- function parseSpecialJsonObject(input, options) {
265
+ export function parseSpecialJsonObject(input, options) {
274
266
  // Hot path: use hints to avoid parsing when possible
275
267
  if (input.$link !== undefined) {
276
- const cid = (0, link_js_1.parseLexLink)(input);
268
+ const cid = parseLexLink(input);
277
269
  if (cid)
278
270
  return cid;
279
271
  if (options.strict)
280
272
  throw new TypeError(`Invalid $link object`);
281
273
  }
282
274
  else if (input.$bytes !== undefined) {
283
- const bytes = (0, bytes_js_1.parseLexBytes)(input);
275
+ const bytes = parseLexBytes(input);
284
276
  if (bytes)
285
277
  return bytes;
286
278
  if (options.strict)
@@ -293,7 +285,7 @@ function parseSpecialJsonObject(input, options) {
293
285
  // the strict option is enabled.
294
286
  if (options.strict) {
295
287
  if (input.$type === 'blob') {
296
- const blob = (0, blob_js_1.parseTypedBlobRef)(input, options);
288
+ const blob = parseTypedBlobRef(input, options);
297
289
  if (blob)
298
290
  return blob;
299
291
  throw new TypeError(`Invalid blob object`);
@@ -1 +1 @@
1
- {"version":3,"file":"lex-json.js","sourceRoot":"","sources":["../src/lex-json.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BlobRef,\n Cid,\n LexArray,\n LexMap,\n LexValue,\n isCid,\n utf8FromBytes,\n} from '@atproto/lex-data'\nimport { parseTypedBlobRef } from './blob.js'\nimport { encodeLexBytes, parseLexBytes } from './bytes.js'\nimport { JsonObject, JsonValue } from './json.js'\nimport { encodeLexLink, parseLexLink } from './link.js'\n\n/**\n * Serialize a Lex value to a JSON string.\n *\n * This function serializes AT Protocol data model values to JSON, automatically\n * encoding special types:\n * - `Cid` instances are encoded as `{$link: string}`\n * - `Uint8Array` instances are encoded as `{$bytes: string}` (base64)\n *\n * @param input - The Lex value to stringify\n * @returns A JSON string representation of the value\n *\n * @example\n * ```typescript\n * import { lexStringify } from '@atproto/lex'\n *\n * // Stringify with CID and bytes encoding\n * const json = lexStringify({\n * ref: someCid,\n * data: new Uint8Array([72, 101, 108, 108, 111])\n * })\n * // json is '{\"ref\":{\"$link\":\"bafyrei...\"},\"data\":{\"$bytes\":\"SGVsbG8=\"}}'\n * ```\n */\nexport function lexStringify(input: LexValue): string {\n // @NOTE Because of the way the \"replacer\" works in JSON.stringify, it's\n // simpler to convert Lex to JSON first rather than trying to do it\n // on-the-fly.\n return JSON.stringify(lexToJson(input))\n}\n\n/**\n * Options for parsing JSON to Lex values.\n */\nexport type LexParseOptions = {\n /**\n * When enabled, forbids the presence of invalid Lex values such as:\n * - Non-integer numbers (only safe integers are valid in the Lex data model)\n * - Malformed `$link` objects\n * - Malformed `$bytes` objects\n * - Objects with invalid or empty `$type` properties\n * - Invalid {@link BlobRef} (`$type: 'blob'`) objects\n *\n * When disabled (default), invalid special objects are left as plain objects.\n *\n * @default false\n */\n strict?: boolean\n}\n\n/**\n * Parses a JSON string into Lex values.\n *\n * This function parses JSON and automatically decodes AT Protocol special types:\n * - `{$link: string}` objects are decoded to `Cid` instances\n * - `{$bytes: string}` objects are decoded to `Uint8Array` instances\n * - `{$type: 'blob'}` objects are validated\n *\n * @typeParam T - Type cast for the resulting Lex value. Use when you want to specify the expected structure of the parsed data.\n * @param input - The JSON string to parse\n * @param options - Parsing options (e.g., strict mode)\n * @returns The parsed Lex value\n * @throws {SyntaxError} If the input is not valid JSON\n * @throws {TypeError} If strict mode is enabled and invalid Lex values are found\n *\n * @example\n * ```typescript\n * import { lexParse } from '@atproto/lex'\n *\n * // Parse JSON with $link and $bytes decoding\n * const parsed = lexParse<{\n * ref: Cid\n * data: Uint8Array\n * }>(`{\n * \"ref\": { \"$link\": \"bafyrei...\" },\n * \"data\": { \"$bytes\": \"SGVsbG8sIHdvcmxkIQ==\" }\n * }`)\n *\n * // Parse a single CID\n * const someCid = lexParse<Cid>('{\"$link\": \"bafyrei...\"}')\n *\n * // Parse binary data\n * const someBytes = lexParse<Uint8Array>('{\"$bytes\": \"SGVsbG8sIHdvcmxkIQ==\"}')\n * ```\n */\nexport function lexParse<T extends LexValue = LexValue>(\n input: string,\n options: LexParseOptions = { strict: false },\n): T {\n // @NOTE see ./lex-json.bench.ts for performance comparison of implementation\n // that uses a reviver function in JSON.parse vs. the current implementation.\n return jsonToLex(JSON.parse(input), options) as T\n}\n\n/**\n * Parses a JSON string from a byte array into Lex values.\n */\nexport function lexParseJsonBytes(\n bytes: Uint8Array,\n options?: LexParseOptions,\n): LexValue {\n // @NOTE see ./json-bytes-decoder.bench.ts for performance comparison of\n // implementation that uses a decoder class that operates directly on bytes\n // vs. the current implementation that first decodes bytes to string and then\n // parses JSON. For more common cases, it seems that the trivial\n // implementation works better than the decoder based solution, while having a\n // small overhead for slower cases (~2% difference). Because of this, we keep\n // the trivial implementation:\n return lexParse(utf8FromBytes(bytes), options)\n}\n\n/**\n * Converts a parsed JSON representation of Lexicon value to a {@link LexValue}.\n *\n * This function transforms already-parsed JSON objects into Lex values by\n * decoding AT Protocol special types:\n * - `{$link: string}` objects are converted to `Cid` instances\n * - `{$bytes: string}` objects are converted to `Uint8Array` instances\n *\n * Use this when you have a JavaScript object (e.g., from `JSON.parse()`) and\n * need to convert it to the Lex data model. For parsing JSON strings directly,\n * use {@link lexParse} instead.\n *\n * @param value - The JSON value to convert\n * @param options - Parsing options (e.g., strict mode)\n * @returns The converted Lex value\n * @throws {TypeError} If strict mode is enabled and invalid Lex values are found\n * @throws {TypeError} If the value contains unsupported types (e.g., undefined at top level)\n *\n * @example\n * ```typescript\n * import { jsonToLex } from '@atproto/lex'\n *\n * // Convert parsed JSON to Lex values\n * const lex = jsonToLex({\n * ref: { $link: 'bafyrei...' }, // Converted to Cid\n * data: { $bytes: 'SGVsbG8sIHdvcmxkIQ==' } // Converted to Uint8Array\n * })\n * ```\n */\nexport function jsonToLex(\n value: JsonValue,\n options: LexParseOptions = { strict: false },\n): LexValue {\n switch (typeof value) {\n case 'object': {\n if (value === null) return null\n if (Array.isArray(value)) return jsonArrayToLex(value, options)\n return (\n parseSpecialJsonObject(value, options) ??\n jsonObjectToLexMap(value, options)\n )\n }\n case 'number':\n if (Number.isSafeInteger(value)) return value\n if (options.strict === false) return value\n throw new TypeError(`Invalid non-integer number: ${value}`)\n case 'boolean':\n case 'string':\n return value\n default:\n throw new TypeError(`Invalid JSON value: ${typeof value}`)\n }\n}\n\nfunction jsonArrayToLex(\n input: JsonValue[],\n options: LexParseOptions,\n): LexValue[] {\n // Lazily copy value\n let copy: LexValue[] | undefined\n for (let i = 0; i < input.length; i++) {\n const inputItem = input[i]\n const item = jsonToLex(inputItem, options)\n if (item !== inputItem) {\n copy ??= Array.from(input)\n copy[i] = item\n }\n }\n return copy ?? input\n}\n\nfunction jsonObjectToLexMap(\n input: JsonObject,\n options: LexParseOptions,\n): LexMap {\n // Lazily copy value\n let copy: LexMap | undefined = undefined\n for (const [key, jsonValue] of Object.entries(input)) {\n // Prevent prototype pollution\n if (key === '__proto__') {\n throw new TypeError('Invalid key: __proto__')\n }\n\n // Ignore (strip) undefined values\n if (jsonValue === undefined) {\n copy ??= { ...input }\n delete copy[key]\n continue\n }\n\n const value = jsonToLex(jsonValue!, options)\n if (value !== jsonValue) {\n copy ??= { ...input }\n copy[key] = value\n }\n }\n return copy ?? input\n}\n\n/**\n * Converts a Lex value to a JSON-compatible value.\n *\n * This function transforms Lex data model values into plain JavaScript objects\n * suitable for JSON serialization:\n * - `Cid` instances are converted to `{$link: string}` objects\n * - `Uint8Array` instances are converted to `{$bytes: string}` objects (base64)\n *\n * Use this when you need to convert Lex values to plain objects (e.g., for\n * custom serialization or inspection). For direct JSON string output, use\n * {@link lexStringify} instead.\n *\n * @param value - The Lex value to convert\n * @returns The JSON-compatible value\n * @throws {TypeError} If the value contains unsupported types\n *\n * @example\n * ```typescript\n * import { lexToJson } from '@atproto/lex'\n *\n * // Convert Lex values to JSON-compatible objects\n * const obj = lexToJson({\n * ref: someCid, // Converted to { $link: string }\n * data: someBytes // Converted to { $bytes: string }\n * })\n * ```\n */\nexport function lexToJson(value: LexValue): JsonValue {\n switch (typeof value) {\n case 'object':\n if (value === null) {\n return value\n } else if (Array.isArray(value)) {\n return lexArrayToJson(value)\n } else if (isCid(value)) {\n return encodeLexLink(value)\n } else if (ArrayBuffer.isView(value)) {\n return encodeLexBytes(value)\n } else {\n return encodeLexMap(value)\n }\n case 'boolean':\n case 'string':\n case 'number':\n return value\n default:\n throw new TypeError(`Invalid Lex value: ${typeof value}`)\n }\n}\n\nfunction lexArrayToJson(input: LexArray): JsonValue[] {\n // Lazily copy value\n let copy: JsonValue[] | undefined\n for (let i = 0; i < input.length; i++) {\n const inputItem = input[i]\n const item = lexToJson(inputItem)\n if (item !== inputItem) {\n copy ??= Array.from(input) as JsonValue[]\n copy[i] = item\n }\n }\n return copy ?? (input as JsonValue[])\n}\n\nfunction encodeLexMap(input: LexMap): JsonObject {\n // Lazily copy value\n let copy: JsonObject | undefined = undefined\n for (const [key, lexValue] of Object.entries(input)) {\n // Prevent prototype pollution\n if (key === '__proto__') {\n throw new TypeError('Invalid key: __proto__')\n }\n\n // Ignore (strip) undefined values\n if (lexValue === undefined) {\n copy ??= { ...input } as JsonObject\n delete copy[key]\n continue\n }\n\n const jsonValue = lexToJson(lexValue!)\n if (jsonValue !== lexValue) {\n copy ??= { ...input } as JsonObject\n copy[key] = jsonValue\n }\n }\n return copy ?? (input as JsonObject)\n}\n\n/**\n * @internal\n */\nexport function parseSpecialJsonObject(\n input: LexMap,\n options: LexParseOptions,\n): Cid | Uint8Array | BlobRef | undefined {\n // Hot path: use hints to avoid parsing when possible\n\n if (input.$link !== undefined) {\n const cid = parseLexLink(input)\n if (cid) return cid\n if (options.strict) throw new TypeError(`Invalid $link object`)\n } else if (input.$bytes !== undefined) {\n const bytes = parseLexBytes(input)\n if (bytes) return bytes\n if (options.strict) throw new TypeError(`Invalid $bytes object`)\n } else if (input.$type !== undefined) {\n // @NOTE Since blobs are \"just\" regular lex objects with a special shape,\n // and because an object that does not conform to the blob shape would still\n // result in undefined being returned, we only attempt to parse blobs when\n // the strict option is enabled.\n if (options.strict) {\n if (input.$type === 'blob') {\n const blob = parseTypedBlobRef(input, options)\n if (blob) return blob\n throw new TypeError(`Invalid blob object`)\n } else if (typeof input.$type !== 'string') {\n throw new TypeError(`Invalid $type property (${typeof input.$type})`)\n } else if (input.$type.length === 0) {\n throw new TypeError(`Empty $type property`)\n }\n }\n }\n\n // @NOTE We ignore legacy blob representation here. They can be handled at the\n // application level if needed.\n\n return undefined\n}\n"]}
1
+ {"version":3,"file":"lex-json.js","sourceRoot":"","sources":["../src/lex-json.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BlobRef,\n Cid,\n LexArray,\n LexMap,\n LexValue,\n isCid,\n utf8FromBytes,\n} from '@atproto/lex-data'\nimport { parseTypedBlobRef } from './blob.js'\nimport { encodeLexBytes, parseLexBytes } from './bytes.js'\nimport { JsonObject, JsonValue } from './json.js'\nimport { encodeLexLink, parseLexLink } from './link.js'\n\n/**\n * Serialize a Lex value to a JSON string.\n *\n * This function serializes AT Protocol data model values to JSON, automatically\n * encoding special types:\n * - `Cid` instances are encoded as `{$link: string}`\n * - `Uint8Array` instances are encoded as `{$bytes: string}` (base64)\n *\n * @param input - The Lex value to stringify\n * @returns A JSON string representation of the value\n *\n * @example\n * ```typescript\n * import { lexStringify } from '@atproto/lex'\n *\n * // Stringify with CID and bytes encoding\n * const json = lexStringify({\n * ref: someCid,\n * data: new Uint8Array([72, 101, 108, 108, 111])\n * })\n * // json is '{\"ref\":{\"$link\":\"bafyrei...\"},\"data\":{\"$bytes\":\"SGVsbG8=\"}}'\n * ```\n */\nexport function lexStringify(input: LexValue): string {\n // @NOTE Because of the way the \"replacer\" works in JSON.stringify, it's\n // simpler to convert Lex to JSON first rather than trying to do it\n // on-the-fly.\n return JSON.stringify(lexToJson(input))\n}\n\n/**\n * Options for parsing JSON to Lex values.\n */\nexport type LexParseOptions = {\n /**\n * When enabled, forbids the presence of invalid Lex values such as:\n * - Non-integer numbers (only safe integers are valid in the Lex data model)\n * - Malformed `$link` objects\n * - Malformed `$bytes` objects\n * - Objects with invalid or empty `$type` properties\n * - Invalid {@link BlobRef} (`$type: 'blob'`) objects\n *\n * When disabled (default), invalid special objects are left as plain objects.\n *\n * @default false\n */\n strict?: boolean\n}\n\n/**\n * Parses a JSON string into Lex values.\n *\n * This function parses JSON and automatically decodes AT Protocol special types:\n * - `{$link: string}` objects are decoded to `Cid` instances\n * - `{$bytes: string}` objects are decoded to `Uint8Array` instances\n * - `{$type: 'blob'}` objects are validated\n *\n * @typeParam T - Type cast for the resulting Lex value. Use when you want to specify the expected structure of the parsed data.\n * @param input - The JSON string to parse\n * @param options - Parsing options (e.g., strict mode)\n * @returns The parsed Lex value\n * @throws {SyntaxError} If the input is not valid JSON\n * @throws {TypeError} If strict mode is enabled and invalid Lex values are found\n *\n * @example\n * ```typescript\n * import { lexParse } from '@atproto/lex'\n *\n * // Parse JSON with $link and $bytes decoding\n * const parsed = lexParse<{\n * ref: Cid\n * data: Uint8Array\n * }>(`{\n * \"ref\": { \"$link\": \"bafyrei...\" },\n * \"data\": { \"$bytes\": \"SGVsbG8sIHdvcmxkIQ==\" }\n * }`)\n *\n * // Parse a single CID\n * const someCid = lexParse<Cid>('{\"$link\": \"bafyrei...\"}')\n *\n * // Parse binary data\n * const someBytes = lexParse<Uint8Array>('{\"$bytes\": \"SGVsbG8sIHdvcmxkIQ==\"}')\n * ```\n */\nexport function lexParse<T extends LexValue = LexValue>(\n input: string,\n options: LexParseOptions = { strict: false },\n): T {\n // @NOTE see ./lex-json.bench.ts for performance comparison of implementation\n // that uses a reviver function in JSON.parse vs. the current implementation.\n return jsonToLex(JSON.parse(input), options) as T\n}\n\n/**\n * Parses a JSON string from a byte array into Lex values.\n */\nexport function lexParseJsonBytes(\n bytes: Uint8Array,\n options?: LexParseOptions,\n): LexValue {\n // @NOTE see ./json-bytes-decoder.bench.ts for performance comparison of\n // implementation that uses a decoder class that operates directly on bytes\n // vs. the current implementation that first decodes bytes to string and then\n // parses JSON. For more common cases, it seems that the trivial\n // implementation works better than the decoder based solution, while having a\n // small overhead for slower cases (~2% difference). Because of this, we keep\n // the trivial implementation:\n return lexParse(utf8FromBytes(bytes), options)\n}\n\n/**\n * Converts a parsed JSON representation of Lexicon value to a {@link LexValue}.\n *\n * This function transforms already-parsed JSON objects into Lex values by\n * decoding AT Protocol special types:\n * - `{$link: string}` objects are converted to `Cid` instances\n * - `{$bytes: string}` objects are converted to `Uint8Array` instances\n *\n * Use this when you have a JavaScript object (e.g., from `JSON.parse()`) and\n * need to convert it to the Lex data model. For parsing JSON strings directly,\n * use {@link lexParse} instead.\n *\n * @param value - The JSON value to convert\n * @param options - Parsing options (e.g., strict mode)\n * @returns The converted Lex value\n * @throws {TypeError} If strict mode is enabled and invalid Lex values are found\n * @throws {TypeError} If the value contains unsupported types (e.g., undefined at top level)\n *\n * @example\n * ```typescript\n * import { jsonToLex } from '@atproto/lex'\n *\n * // Convert parsed JSON to Lex values\n * const lex = jsonToLex({\n * ref: { $link: 'bafyrei...' }, // Converted to Cid\n * data: { $bytes: 'SGVsbG8sIHdvcmxkIQ==' } // Converted to Uint8Array\n * })\n * ```\n */\nexport function jsonToLex(\n value: JsonValue,\n options: LexParseOptions = { strict: false },\n): LexValue {\n switch (typeof value) {\n case 'object': {\n if (value === null) return null\n if (Array.isArray(value)) return jsonArrayToLex(value, options)\n return (\n parseSpecialJsonObject(value, options) ??\n jsonObjectToLexMap(value, options)\n )\n }\n case 'number':\n if (Number.isSafeInteger(value)) return value\n if (options.strict === false) return value\n throw new TypeError(`Invalid non-integer number: ${value}`)\n case 'boolean':\n case 'string':\n return value\n default:\n throw new TypeError(`Invalid JSON value: ${typeof value}`)\n }\n}\n\nfunction jsonArrayToLex(\n input: JsonValue[],\n options: LexParseOptions,\n): LexValue[] {\n // Lazily copy value\n let copy: LexValue[] | undefined\n for (let i = 0; i < input.length; i++) {\n const inputItem = input[i]\n const item = jsonToLex(inputItem, options)\n if (item !== inputItem) {\n copy ??= Array.from(input)\n copy[i] = item\n }\n }\n return copy ?? input\n}\n\nfunction jsonObjectToLexMap(\n input: JsonObject,\n options: LexParseOptions,\n): LexMap {\n // Lazily copy value\n let copy: LexMap | undefined = undefined\n for (const [key, jsonValue] of Object.entries(input)) {\n // Prevent prototype pollution\n if (key === '__proto__') {\n throw new TypeError('Invalid key: __proto__')\n }\n\n // Ignore (strip) undefined values\n if (jsonValue === undefined) {\n copy ??= { ...input }\n delete copy[key]\n continue\n }\n\n const value = jsonToLex(jsonValue!, options)\n if (value !== jsonValue) {\n copy ??= { ...input }\n copy[key] = value\n }\n }\n return copy ?? input\n}\n\n/**\n * Converts a Lex value to a JSON-compatible value.\n *\n * This function transforms Lex data model values into plain JavaScript objects\n * suitable for JSON serialization:\n * - `Cid` instances are converted to `{$link: string}` objects\n * - `Uint8Array` instances are converted to `{$bytes: string}` objects (base64)\n *\n * Use this when you need to convert Lex values to plain objects (e.g., for\n * custom serialization or inspection). For direct JSON string output, use\n * {@link lexStringify} instead.\n *\n * @param value - The Lex value to convert\n * @returns The JSON-compatible value\n * @throws {TypeError} If the value contains unsupported types\n *\n * @example\n * ```typescript\n * import { lexToJson } from '@atproto/lex'\n *\n * // Convert Lex values to JSON-compatible objects\n * const obj = lexToJson({\n * ref: someCid, // Converted to { $link: string }\n * data: someBytes // Converted to { $bytes: string }\n * })\n * ```\n */\nexport function lexToJson(value: LexValue): JsonValue {\n switch (typeof value) {\n case 'object':\n if (value === null) {\n return value\n } else if (Array.isArray(value)) {\n return lexArrayToJson(value)\n } else if (isCid(value)) {\n return encodeLexLink(value)\n } else if (ArrayBuffer.isView(value)) {\n return encodeLexBytes(value)\n } else {\n return encodeLexMap(value)\n }\n case 'boolean':\n case 'string':\n case 'number':\n return value\n default:\n throw new TypeError(`Invalid Lex value: ${typeof value}`)\n }\n}\n\nfunction lexArrayToJson(input: LexArray): JsonValue[] {\n // Lazily copy value\n let copy: JsonValue[] | undefined\n for (let i = 0; i < input.length; i++) {\n const inputItem = input[i]\n const item = lexToJson(inputItem)\n if (item !== inputItem) {\n copy ??= Array.from(input) as JsonValue[]\n copy[i] = item\n }\n }\n return copy ?? (input as JsonValue[])\n}\n\nfunction encodeLexMap(input: LexMap): JsonObject {\n // Lazily copy value\n let copy: JsonObject | undefined = undefined\n for (const [key, lexValue] of Object.entries(input)) {\n // Prevent prototype pollution\n if (key === '__proto__') {\n throw new TypeError('Invalid key: __proto__')\n }\n\n // Ignore (strip) undefined values\n if (lexValue === undefined) {\n copy ??= { ...input } as JsonObject\n delete copy[key]\n continue\n }\n\n const jsonValue = lexToJson(lexValue!)\n if (jsonValue !== lexValue) {\n copy ??= { ...input } as JsonObject\n copy[key] = jsonValue\n }\n }\n return copy ?? (input as JsonObject)\n}\n\n/**\n * @internal\n */\nexport function parseSpecialJsonObject(\n input: LexMap,\n options: LexParseOptions,\n): Cid | Uint8Array | BlobRef | undefined {\n // Hot path: use hints to avoid parsing when possible\n\n if (input.$link !== undefined) {\n const cid = parseLexLink(input)\n if (cid) return cid\n if (options.strict) throw new TypeError(`Invalid $link object`)\n } else if (input.$bytes !== undefined) {\n const bytes = parseLexBytes(input)\n if (bytes) return bytes\n if (options.strict) throw new TypeError(`Invalid $bytes object`)\n } else if (input.$type !== undefined) {\n // @NOTE Since blobs are \"just\" regular lex objects with a special shape,\n // and because an object that does not conform to the blob shape would still\n // result in undefined being returned, we only attempt to parse blobs when\n // the strict option is enabled.\n if (options.strict) {\n if (input.$type === 'blob') {\n const blob = parseTypedBlobRef(input, options)\n if (blob) return blob\n throw new TypeError(`Invalid blob object`)\n } else if (typeof input.$type !== 'string') {\n throw new TypeError(`Invalid $type property (${typeof input.$type})`)\n } else if (input.$type.length === 0) {\n throw new TypeError(`Empty $type property`)\n }\n }\n }\n\n // @NOTE We ignore legacy blob representation here. They can be handled at the\n // application level if needed.\n\n return undefined\n}\n"]}
package/dist/link.js CHANGED
@@ -1,9 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseLexLink = parseLexLink;
4
- exports.encodeLexLink = encodeLexLink;
5
- const lex_data_1 = require("@atproto/lex-data");
6
- function parseLexLink(input, options) {
1
+ import { parseCid, } from '@atproto/lex-data';
2
+ export function parseLexLink(input, options) {
7
3
  if (!input || !('$link' in input)) {
8
4
  return undefined;
9
5
  }
@@ -24,9 +20,9 @@ function parseLexLink(input, options) {
24
20
  return undefined;
25
21
  }
26
22
  try {
27
- return (0, lex_data_1.parseCid)($link, options);
23
+ return parseCid($link, options);
28
24
  }
29
- catch (cause) {
25
+ catch {
30
26
  return undefined;
31
27
  }
32
28
  }
@@ -47,7 +43,7 @@ function parseLexLink(input, options) {
47
43
  * // encoded is { $link: 'bafyreib2rxk3rybloqtqwbo' }
48
44
  * ```
49
45
  */
50
- function encodeLexLink(cid) {
46
+ export function encodeLexLink(cid) {
51
47
  return { $link: cid.toString() };
52
48
  }
53
49
  //# sourceMappingURL=link.js.map
package/dist/link.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":";;AA6CA,oCAkCC;AAmBD,sCAEC;AApGD,gDAK0B;AAwC1B,SAAgB,YAAY,CAC1B,KAA+B,EAC/B,OAAyB;IAEzB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IAEvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACxB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAA,mBAAQ,EAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,aAAa,CAAC,GAAQ;IACpC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAA;AAClC,CAAC","sourcesContent":["import {\n CheckCidOptions,\n Cid,\n InferCheckedCid,\n parseCid,\n} from '@atproto/lex-data'\nimport { JsonValue } from './json.js'\n\n/**\n * Parses a `{$link: string}` JSON object into a {@link Cid} instance.\n *\n * In the AT Protocol data model, CID references are represented in JSON as an\n * object with a single `$link` property containing a base32-encoded CID string,\n * prefixed with \"b\". This function decodes that representation into a `Cid`\n * object.\n *\n * @param input - An object potentially containing a `{$link: string}` property\n * @param options - Optional CID validation options\n * @returns The parsed {@link Cid} if the input is a valid `$link` object,\n * or `undefined` if the input is not a valid `$link` representation\n * @throws {TypeError} If `$link` is present but is not a valid CID string\n *\n * @example\n * ```typescript\n * // Parse a $link object to Cid\n * const cid = parseLexLink({ $link: 'bafyreib2rxk3rybloqtqwbo' })\n * // cid is a Cid instance\n *\n * // Returns undefined for non-$link objects\n * const result = parseLexLink({ foo: 'bar' })\n * // result is undefined\n *\n * // Returns undefined for objects with extra properties\n * const invalid = parseLexLink({ $link: 'bafyrei...', extra: true })\n * // invalid is undefined\n * ```\n */\nexport function parseLexLink<TOptions extends CheckCidOptions>(\n input: undefined | Record<string, unknown>,\n options: TOptions,\n): InferCheckedCid<TOptions> | undefined\nexport function parseLexLink(\n input?: Record<string, unknown>,\n options?: CheckCidOptions,\n): Cid | undefined\nexport function parseLexLink(\n input?: Record<string, unknown>,\n options?: CheckCidOptions,\n): Cid | undefined {\n if (!input || !('$link' in input)) {\n return undefined\n }\n\n for (const key in input) {\n if (key !== '$link') {\n return undefined\n }\n }\n\n const { $link } = input\n\n if (typeof $link !== 'string') {\n return undefined\n }\n\n if ($link.length === 0) {\n return undefined\n }\n\n // Arbitrary limit to prevent DoS via extremely long CIDs\n if ($link.length > 2048) {\n return undefined\n }\n\n try {\n return parseCid($link, options)\n } catch (cause) {\n return undefined\n }\n}\n\n/**\n * Encodes a {@link Cid} instance into a `{$link: string}` JSON representation.\n *\n * In the AT Protocol data model, CID references are represented in JSON as an\n * object with a single `$link` property containing a base32-encoded CID string,\n * prefixed with \"b\". This function performs that encoding.\n *\n * @param cid - The CID to encode\n * @returns An object with a `$link` property containing the string representation of the CID\n *\n * @example\n * ```typescript\n * const cid = CID.parse('bafyreib2rxk3rybloqtqwbo')\n * const encoded = encodeLexLink(cid)\n * // encoded is { $link: 'bafyreib2rxk3rybloqtqwbo' }\n * ```\n */\nexport function encodeLexLink(cid: Cid): JsonValue {\n return { $link: cid.toString() }\n}\n"]}
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,QAAQ,GACT,MAAM,mBAAmB,CAAA;AAwC1B,MAAM,UAAU,YAAY,CAC1B,KAA+B,EAC/B,OAAyB;IAEzB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IAEvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACxB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAA;AAClC,CAAC","sourcesContent":["import {\n CheckCidOptions,\n Cid,\n InferCheckedCid,\n parseCid,\n} from '@atproto/lex-data'\nimport { JsonValue } from './json.js'\n\n/**\n * Parses a `{$link: string}` JSON object into a {@link Cid} instance.\n *\n * In the AT Protocol data model, CID references are represented in JSON as an\n * object with a single `$link` property containing a base32-encoded CID string,\n * prefixed with \"b\". This function decodes that representation into a `Cid`\n * object.\n *\n * @param input - An object potentially containing a `{$link: string}` property\n * @param options - Optional CID validation options\n * @returns The parsed {@link Cid} if the input is a valid `$link` object,\n * or `undefined` if the input is not a valid `$link` representation\n * @throws {TypeError} If `$link` is present but is not a valid CID string\n *\n * @example\n * ```typescript\n * // Parse a $link object to Cid\n * const cid = parseLexLink({ $link: 'bafyreib2rxk3rybloqtqwbo' })\n * // cid is a Cid instance\n *\n * // Returns undefined for non-$link objects\n * const result = parseLexLink({ foo: 'bar' })\n * // result is undefined\n *\n * // Returns undefined for objects with extra properties\n * const invalid = parseLexLink({ $link: 'bafyrei...', extra: true })\n * // invalid is undefined\n * ```\n */\nexport function parseLexLink<TOptions extends CheckCidOptions>(\n input: undefined | Record<string, unknown>,\n options: TOptions,\n): InferCheckedCid<TOptions> | undefined\nexport function parseLexLink(\n input?: Record<string, unknown>,\n options?: CheckCidOptions,\n): Cid | undefined\nexport function parseLexLink(\n input?: Record<string, unknown>,\n options?: CheckCidOptions,\n): Cid | undefined {\n if (!input || !('$link' in input)) {\n return undefined\n }\n\n for (const key in input) {\n if (key !== '$link') {\n return undefined\n }\n }\n\n const { $link } = input\n\n if (typeof $link !== 'string') {\n return undefined\n }\n\n if ($link.length === 0) {\n return undefined\n }\n\n // Arbitrary limit to prevent DoS via extremely long CIDs\n if ($link.length > 2048) {\n return undefined\n }\n\n try {\n return parseCid($link, options)\n } catch {\n return undefined\n }\n}\n\n/**\n * Encodes a {@link Cid} instance into a `{$link: string}` JSON representation.\n *\n * In the AT Protocol data model, CID references are represented in JSON as an\n * object with a single `$link` property containing a base32-encoded CID string,\n * prefixed with \"b\". This function performs that encoding.\n *\n * @param cid - The CID to encode\n * @returns An object with a `$link` property containing the string representation of the CID\n *\n * @example\n * ```typescript\n * const cid = CID.parse('bafyreib2rxk3rybloqtqwbo')\n * const encoded = encodeLexLink(cid)\n * // encoded is { $link: 'bafyreib2rxk3rybloqtqwbo' }\n * ```\n */\nexport function encodeLexLink(cid: Cid): JsonValue {\n return { $link: cid.toString() }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "@atproto/lex-json",
3
- "version": "0.0.16",
3
+ "version": "0.1.0-next.0",
4
+ "engines": {
5
+ "node": ">=22"
6
+ },
4
7
  "license": "MIT",
5
8
  "description": "Lexicon encoding utilities for AT Lexicon data in JSON format",
6
9
  "keywords": [
@@ -26,20 +29,16 @@
26
29
  "./CHANGELOG.md"
27
30
  ],
28
31
  "sideEffects": false,
29
- "type": "commonjs",
30
- "main": "./dist/index.js",
31
- "types": "./dist/index.d.ts",
32
+ "type": "module",
32
33
  "exports": {
33
34
  ".": {
34
35
  "types": "./dist/index.d.ts",
35
- "browser": "./dist/index.js",
36
- "import": "./dist/index.js",
37
36
  "default": "./dist/index.js"
38
37
  }
39
38
  },
40
39
  "dependencies": {
41
40
  "tslib": "^2.8.1",
42
- "@atproto/lex-data": "^0.0.15"
41
+ "@atproto/lex-data": "^0.1.0-next.0"
43
42
  },
44
43
  "devDependencies": {
45
44
  "vitest": "^4.0.16"
package/src/link.ts CHANGED
@@ -74,7 +74,7 @@ export function parseLexLink(
74
74
 
75
75
  try {
76
76
  return parseCid($link, options)
77
- } catch (cause) {
77
+ } catch {
78
78
  return undefined
79
79
  }
80
80
  }