@cbortech/cbor 0.23.0 → 0.23.1
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/README.ja.md +6 -3
- package/README.md +7 -4
- package/dist/ast/CborArray.d.ts +17 -0
- package/dist/ast/CborBignum.d.ts +36 -0
- package/dist/ast/CborByteString.d.ts +20 -0
- package/dist/ast/CborEllipsis.d.ts +11 -0
- package/dist/ast/CborEmbeddedCBOR.d.ts +22 -0
- package/dist/ast/CborFloat.d.ts +27 -0
- package/dist/ast/CborIndefiniteByteString.d.ts +13 -0
- package/dist/ast/CborIndefiniteTextString.d.ts +13 -0
- package/dist/ast/CborItem.d.ts +91 -0
- package/dist/ast/CborMap.d.ts +17 -0
- package/dist/ast/CborNint.d.ts +27 -0
- package/dist/ast/CborSimple.d.ts +22 -0
- package/dist/ast/CborTag.d.ts +16 -0
- package/dist/ast/CborTextString.d.ts +15 -0
- package/dist/ast/CborUint.d.ts +14 -0
- package/dist/ast/CborUnresolvedAppExt.d.ts +16 -0
- package/dist/ast/index.cjs +1 -0
- package/dist/ast/index.d.ts +15 -0
- package/dist/ast/index.js +2 -0
- package/dist/cbor/constants.d.ts +14 -0
- package/dist/cbor/decoder.d.ts +11 -0
- package/dist/cbor/encode.d.ts +35 -0
- package/dist/cbor/encoder.d.ts +7 -0
- package/dist/cbor.d.ts +129 -0
- package/dist/edn/parser.d.ts +7 -0
- package/dist/edn/serialize-utils.d.ts +48 -0
- package/dist/edn/serializer.d.ts +7 -0
- package/dist/edn/tokenizer.d.ts +176 -0
- package/dist/extensions/bignum.d.ts +3 -0
- package/dist/extensions/builtins.d.ts +2 -0
- package/dist/extensions/cbordata.d.ts +4 -0
- package/dist/extensions/cri.d.ts +32 -0
- package/dist/extensions/dt.d.ts +109 -0
- package/dist/extensions/hash.d.ts +17 -0
- package/dist/extensions/ip.d.ts +41 -0
- package/dist/extensions/types.d.ts +70 -0
- package/dist/index.cjs +2 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -695
- package/dist/index.js +30 -3913
- package/dist/index.js.map +1 -1
- package/dist/js/fromJS.d.ts +25 -0
- package/dist/js/toJS.d.ts +6 -0
- package/dist/mapEntries-C73nWM8o.cjs +31 -0
- package/dist/mapEntries-C73nWM8o.cjs.map +1 -0
- package/dist/mapEntries-CSjvgq1X.js +3887 -0
- package/dist/mapEntries-CSjvgq1X.js.map +1 -0
- package/dist/mapEntries.d.ts +3 -0
- package/dist/simple.d.ts +25 -0
- package/dist/tag.d.ts +45 -0
- package/dist/types.d.ts +352 -0
- package/dist/utils/float16.d.ts +38 -0
- package/dist/utils/hexfloat.d.ts +27 -0
- package/dist/utils/ip.d.ts +9 -0
- package/package.json +12 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapEntries-CSjvgq1X.js","names":["u64.split","u64.rotrSH","u64.shrSH","u64.rotrSL","u64.shrSL","u64.rotrBH","u64.rotrBL","u64.add4L","u64.add4H","u64.add5L","u64.add5H","u64.add","u64.add3L","u64.add3H"],"sources":["../src/tag.ts","../src/types.ts","../src/simple.ts","../src/ast/CborItem.ts","../src/utils/float16.ts","../src/cbor/encode.ts","../src/ast/CborUint.ts","../src/ast/CborNint.ts","../src/edn/serialize-utils.ts","../src/utils/hexfloat.ts","../src/ast/CborFloat.ts","../src/ast/CborTag.ts","../src/edn/tokenizer.ts","../src/ast/CborByteString.ts","../src/ast/CborIndefiniteByteString.ts","../src/ast/CborIndefiniteTextString.ts","../src/ast/CborArray.ts","../src/ast/CborMap.ts","../src/ast/CborSimple.ts","../src/ast/CborEmbeddedCBOR.ts","../src/ast/CborUnresolvedAppExt.ts","../src/ast/CborEllipsis.ts","../src/ast/CborBignum.ts","../src/edn/parser.ts","../src/ast/CborTextString.ts","../src/extensions/dt.ts","../src/utils/ip.ts","../src/extensions/ip.ts","../src/extensions/bignum.ts","../src/extensions/cri.ts","../node_modules/@noble/hashes/utils.js","../node_modules/@noble/hashes/_md.js","../node_modules/@noble/hashes/_u64.js","../node_modules/@noble/hashes/sha2.js","../node_modules/@noble/hashes/sha3.js","../node_modules/@noble/hashes/legacy.js","../src/extensions/hash.ts","../src/cbor/decoder.ts","../src/extensions/cbordata.ts","../src/extensions/builtins.ts","../src/js/fromJS.ts","../src/mapEntries.ts"],"sourcesContent":["export const CBOR_TAG: unique symbol = Symbol.for('cbor.tag');\n\n// ─── Internal wrappers ────────────────────────────────────────────────────────\n\nexport class Null {\n valueOf(): null {\n return null;\n }\n toJSON(): null {\n return null;\n }\n}\n\nexport class Undefined {\n valueOf(): undefined {\n return undefined;\n }\n toJSON(): undefined {\n return undefined;\n }\n}\n\n// ─── Public helpers ───────────────────────────────────────────────────────────\n\n/** @internal */\nexport function getCborTag(value: unknown): bigint | undefined {\n if (!_canHaveTag(value)) return undefined;\n const sym = (value as Record<symbol, unknown>)[CBOR_TAG];\n return typeof sym === 'bigint' ? sym : undefined;\n}\n\n/** @internal */\nexport function setCborTag(value: unknown, tag: bigint): object {\n let obj: object;\n switch (typeof value) {\n case 'number':\n obj = new Number(value);\n break;\n case 'string':\n obj = new String(value);\n break;\n case 'boolean':\n obj = new Boolean(value);\n break;\n case 'bigint':\n obj = Object(value);\n break;\n case 'undefined':\n obj = new Undefined();\n break;\n case 'object':\n if (value === null) {\n obj = new Null();\n break;\n }\n obj = value as object;\n break;\n default:\n throw new TypeError(\n `setCborTag: cannot tag value of type ${typeof value}`\n );\n }\n (obj as Record<symbol, bigint>)[CBOR_TAG] = tag;\n return obj;\n}\n\n/** @internal */\nexport function removeCborTag(value: unknown): unknown {\n if (value instanceof Number) return value.valueOf();\n if (value instanceof String) return value.valueOf();\n if (value instanceof Boolean) return value.valueOf();\n if (Object.prototype.toString.call(value) === '[object BigInt]')\n return (value as { valueOf(): bigint }).valueOf();\n if (value instanceof Null) return null;\n if (value instanceof Undefined) return undefined;\n if (typeof value === 'object' && value !== null) {\n delete (value as Record<symbol, unknown>)[CBOR_TAG];\n return value;\n }\n return value;\n}\n\n/** @internal */\nexport function getCborTaggedValue(value: unknown): unknown {\n if (value instanceof Number) return value.valueOf();\n if (value instanceof String) return value.valueOf();\n if (value instanceof Boolean) return value.valueOf();\n if (Object.prototype.toString.call(value) === '[object BigInt]')\n return (value as { valueOf(): bigint }).valueOf();\n if (value instanceof Null) return null;\n if (value instanceof Undefined) return undefined;\n return value;\n}\n\n// ─── Internal helper ──────────────────────────────────────────────────────────\n\n/** Return true if value can carry the [CBOR_TAG] symbol (i.e. is a non-null object). */\nfunction _canHaveTag(value: unknown): value is object {\n // All boxed primitives (Number, String, Boolean, BigInt objects) also have\n // typeof === 'object', so a single check covers all cases.\n return typeof value === 'object' && value !== null;\n}\n\n// ─── Tag namespace ────────────────────────────────────────────────────────────\n\n/**\n * Namespace for CBOR tag annotation utilities.\n *\n * @example\n * const v = CBOR.fromEDN('42(\"hello\")').toJS();\n * Tag.get(v); // 42n\n * Tag.getValue(v); // \"hello\"\n *\n * const tagged = Tag.set([1, 2, 3], 100n);\n * Tag.remove(tagged); // [1, 2, 3]\n */\nexport class Tag {\n private constructor() {}\n\n /** Unique symbol used to attach a CBOR tag number to a JS value. */\n static readonly symbol: typeof CBOR_TAG = CBOR_TAG;\n\n /** Wrapper class for tagged `null` values. */\n static readonly Null = Null;\n\n /** Wrapper class for tagged `undefined` values. */\n static readonly Undefined = Undefined;\n\n /** Return the CBOR tag number attached to `value`, or `undefined` if none. */\n static get(value: unknown): bigint | undefined {\n return getCborTag(value);\n }\n\n /** Attach a CBOR tag number to `value` and return the annotated value. */\n static set(value: unknown, tag: bigint): object {\n return setCborTag(value, tag);\n }\n\n /** Remove the `[Tag.symbol]` annotation from `value` and return the plain value. */\n static remove(value: unknown): unknown {\n return removeCborTag(value);\n }\n\n /** Return the underlying plain JS value held inside a tagged wrapper. */\n static getValue(value: unknown): unknown {\n return getCborTaggedValue(value);\n }\n}\n","/**\n * Shared option types and plugin interfaces.\n */\n\n// ─── Omit sentinel ───────────────────────────────────────────────────────────\n\n/**\n * Sentinel returned from a replacer or reviver to omit the key/element from\n * the output. Use this instead of returning `undefined` when `undefinedOmits`\n * is `false` (the default) and you need to drop a specific entry.\n *\n * Accessible as `CBOR.OMIT` on the main class.\n */\nexport const CBOR_OMIT: unique symbol = Symbol('cbor.omit');\n\n// ─── Extension plugin ─────────────────────────────────────────────────────────\n// Defined in extensions/types.ts and re-exported here for convenience.\nexport type { CborExtension } from './extensions/types';\nimport type { CborExtension } from './extensions/types';\n\n// ─── Options ──────────────────────────────────────────────────────────────────\n\nexport interface ToHexDumpOptions {\n /**\n * Indentation per nesting level.\n * - `number`: number of spaces (e.g. `3` → `\" \"`)\n * - `string`: literal indent string (e.g. `'\\t'`)\n * @default 3\n */\n indent?: number | string;\n /** Comment marker used in the hex dump. Default: `'--'` */\n commentStyle?: '--' | '#';\n}\n\nexport interface ToJSOptions {\n /**\n * How to represent CBOR integer values (major type 0 / 1) in JavaScript.\n * - `'auto'`: `number` when the value is within the safe integer range\n * (±`Number.MAX_SAFE_INTEGER`), `bigint` otherwise.\n * - `'number'`: always `number` (precision may be lost for large values).\n * - `'bigint'`: always `bigint`.\n * @default 'auto'\n */\n integerAs?: 'auto' | 'number' | 'bigint';\n\n /**\n * How to represent CBOR map values when converting to JavaScript.\n * - `'auto'`: text-string-only keys → `Record<string, unknown>`,\n * other key types → `Map<unknown, unknown>`.\n * Duplicate keys are silently overwritten (last value wins).\n * - `'object'`: always `Record<string, unknown>` — non-string keys are\n * converted via `String()`. Duplicate keys are overwritten (last wins).\n * - `'entries'`: always `MapEntries` (a typed `Array` subclass) — preserves all\n * entries including duplicate keys (§2.6.2 of draft-ietf-cbor-edn-literals-20).\n * `fromJS()` recognises `MapEntries` instances and converts them back to `CborMap`.\n * @default 'auto'\n */\n mapAs?: 'auto' | 'object' | 'entries';\n\n /**\n * Post-conversion reviver function, applied bottom-up after the CBOR value\n * has been converted to JavaScript.\n *\n * Called for every key/value pair — including map entries with non-string\n * keys — and finally for the root value with key `''`.\n * Return `CBOR.OMIT` to remove the entry from its parent container.\n * When `undefinedOmits` is `true`, returning `undefined` also removes the\n * entry (matching `JSON.parse` behavior).\n *\n * Note: this option is honoured by `CborItem.toJS()` and the `CBOR.*`\n * shortcut methods. Calling `_toJS()` directly bypasses it.\n */\n reviver?: (this: unknown, key: unknown, value: unknown) => unknown;\n\n /**\n * When `true`, a reviver returning `undefined` removes the entry from its\n * parent container, matching `JSON.parse` behavior.\n * When `false` (default), only `CBOR.OMIT` removes an entry; returning\n * `undefined` keeps the entry as CBOR `undefined` (simple 23).\n * @default false\n */\n undefinedOmits?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ToCBOROptions {}\n\nexport interface FromCBOROptions {\n /**\n * Byte offset within the supplied input at which CBOR decoding starts.\n * Useful for reading one item from a CBOR Sequence.\n *\n * @default 0\n */\n offset?: number;\n\n /**\n * Allow bytes after the decoded item.\n *\n * When `false`, decoding still requires the item to consume the remaining\n * input, preserving the historical single-item behaviour. Set this to `true`\n * when using `CborItem.end` to continue decoding a CBOR Sequence.\n *\n * @example\n * // Read two items from a CBOR Sequence, validating that the second is last.\n * const first = CBOR.fromCBOR(bytes, { allowTrailing: true });\n * const second = CBOR.fromCBOR(bytes, { offset: first.end });\n *\n * @default false\n */\n allowTrailing?: boolean;\n\n /**\n * Extension plugins applied during CBOR decoding.\n * Extensions with `parseTag()` are invoked when a tagged item is\n * encountered; returning a non-`undefined` value replaces the default\n * `CborTag` node.\n */\n extensions?: CborExtension[];\n}\n\n/**\n * Options for parsing an annotated hex dump.\n */\nexport interface FromHexDumpOptions {\n /**\n * Extension plugins applied during CBOR decoding.\n * Extensions with `parseTag()` are invoked when a tagged item is encountered;\n * returning a non-`undefined` value replaces the default `CborTag` node.\n */\n extensions?: CborExtension[];\n}\n\nexport interface FromEDNOptions {\n /**\n * Character offset within the supplied text at which CBOR-EDN parsing starts.\n * Leading whitespace/comments at or after this offset are skipped as usual.\n *\n * @default 0\n */\n offset?: number;\n\n /**\n * Allow tokens after the parsed item.\n *\n * When `false`, parsing still requires the item to consume the remaining\n * input, preserving the historical single-item behaviour. Set this to `true`\n * when using `CborItem.end` to continue parsing a CBOR-EDN sequence.\n * Top-level comma separators are not skipped by `fromEDN()` itself; handle\n * them in sequence-level code before passing the next `offset`. For example,\n * after parsing `1, 2`, the first item's `end` points just before the comma;\n * advance past that comma before parsing the next item.\n *\n * @example\n * // Read two whitespace-separated items, validating that the second is last.\n * const first = CBOR.fromEDN(text, { allowTrailing: true });\n * const second = CBOR.fromEDN(text, { offset: first.end });\n *\n * @default false\n */\n allowTrailing?: boolean;\n\n /**\n * Extension plugins for EDN parsing.\n * Each extension declares which app-string prefixes (and, in future, tag\n * numbers) it handles via `appStringPrefixes` / `tagNumbers`, and provides\n * callback methods that return `CborItem`-subclassed objects controlling\n * subsequent serialisation.\n *\n * User-supplied extensions take priority over the built-in `dt`/`DT`\n * extension for the same prefix.\n */\n extensions?: CborExtension[];\n\n /**\n * How to handle unrecognised application-extension identifiers\n * (§4.1 draft-ietf-cbor-edn-literals-20).\n *\n * - `'cpa999'`: wrap the literal in a `CPA999` tag\n * (`CborUnresolvedAppExt`) instead of failing. The resulting node\n * round-trips through `toEDN()` back to the original notation.\n * - `'error'`: throw `SyntaxError` for unknown prefixes.\n * @default 'cpa999'\n */\n unresolvedExtension?: 'cpa999' | 'error';\n\n /**\n * When `true`, byte-string chunks in text string concatenation\n * (`\"a\" + h'...'`) that are not valid UTF-8 are decoded with the Unicode\n * replacement character (U+FFFD) instead of throwing a `SyntaxError`.\n *\n * The CBOR text string type (RFC 8949 §3.1) requires valid UTF-8;\n * enabling this option produces non-conformant output and should only be\n * used when interoperating with lenient producers.\n *\n * @default false\n */\n allowInvalidUtf8?: boolean;\n\n /**\n * Preserve comments found between CBOR-EDN values and attach them to the AST.\n *\n * Comments are metadata only: they are ignored by CBOR binary encoding and\n * JavaScript conversion. Use together with `ToEDNOptions.preserveComments`\n * to include them when formatting back to EDN.\n *\n * @default false\n */\n preserveComments?: boolean;\n}\n\nexport interface FromJSOptions {\n /**\n * Extension plugins applied during `fromJS()`.\n * Extensions with `fromJS()` are given first chance to convert each value.\n */\n extensions?: CborExtension[];\n\n /**\n * How to encode integer-valued JS `number`s.\n * - `'int'`: encode as CborUint / CborNint\n * - `'float'`: always encode as CborFloat\n * @default 'int'\n */\n encodeIntegerAs?: 'int' | 'float';\n\n /**\n * How to encode `Uint8Array` values.\n * - `'bytes'`: encode as CborByteString\n * - `'array'`: encode as CborArray of CborUint\n * @default 'bytes'\n */\n uint8ArrayAs?: 'bytes' | 'array';\n\n /**\n * Pre-encoding replacer function or key allowlist, applied before the\n * JavaScript value is converted to a CBOR AST node.\n *\n * - Function: called for every key/value pair (including `MapEntries`\n * entries with non-string keys). Return `CBOR.OMIT` to remove the entry.\n * When `undefinedOmits` is `true`, returning `undefined` also removes it.\n * - Array of strings/numbers: allowlist of object keys to include.\n * `MapEntries` entries retain all entries; their values are recursively\n * filtered.\n *\n * Note: this option is honoured by `fromJS()` and the `CBOR.*` shortcut\n * methods.\n */\n replacer?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[];\n\n /**\n * When `true`, a replacer returning `undefined` removes the entry from the\n * output, matching `JSON.stringify` behavior.\n * When `false` (default), only `CBOR.OMIT` removes an entry; returning\n * `undefined` keeps the entry as CBOR `undefined` (simple 23).\n * @default false\n */\n undefinedOmits?: boolean;\n}\n\nexport interface ToEDNOptions {\n /**\n * Indentation for pretty-printing.\n * - `number`: number of spaces\n * - `string`: literal indent string (e.g. `'\\t'`)\n * - omit for single-line output\n */\n indent?: number | string;\n\n /**\n * Emit comments previously captured by `FromEDNOptions.preserveComments`.\n *\n * When enabled for containers, comment-bearing arrays/maps are emitted in\n * multi-line form even if `indent` is omitted.\n *\n * @default false\n */\n preserveComments?: boolean;\n\n /**\n * Re-emit byte string literals parsed from EDN using their original source\n * text when available.\n *\n * This preserves the spelling and interior layout of non-concatenated\n * `h'...'`, `b64'...'`, `b32'...'`, `h32'...'`, raw-backtick byte strings,\n * and single-quoted byte strings, including comments inside those literals.\n * Byte strings produced by `+` concatenation are normalised as usual.\n *\n * When enabled, this takes precedence over `bstrEncoding` and `sqstr` for\n * byte strings that carry original EDN source text.\n *\n * @default false\n */\n preserveByteString?: boolean;\n\n /**\n * Whether to emit commas between array/map elements.\n * - `'comma'`: emit commas (`[1, 2, 3]`)\n * - `'none'`: omit commas, use spaces only (`[1 2 3]`)\n * - `'trailing'`: emit commas including a trailing comma after the last element\n * @default 'comma'\n */\n commas?: 'comma' | 'none' | 'trailing';\n\n /**\n /**\n * Fallback binary encoding for byte string literals when sqstr is not applicable.\n * - `'hex'`: `h'...'`\n * - `'base64'`: `b64'...'`\n * - `'base64url'`: `b64'...'` (base64url alphabet)\n * - `'base32'`: `b32'...'`\n * - `'base32hex'`: `h32'...'`\n * @default 'hex'\n */\n bstrEncoding?: 'hex' | 'base64' | 'base64url' | 'base32' | 'base32hex';\n\n /**\n * Whether to prefer single-quoted string form (`sqstr`) for byte strings.\n * - `'printable-string'`: emit `'...'` when the bytes are valid UTF-8 and\n * contain no control characters; fall back to `bstrEncoding` otherwise.\n * - `'string'`: emit `'...'` when the bytes are valid UTF-8;\n * fall back to `bstrEncoding` otherwise.\n * - `'none'`: never emit sqstr; always use `bstrEncoding`.\n * @default 'printable-string'\n */\n sqstr?: 'printable-string' | 'string' | 'none';\n\n /**\n * Whether to use application-string / app-sequence notation for built-in\n * extensions (e.g. `dt'...'`, `DT'...'`, `ip'...'`, `IP'...'`).\n * - `true`: emit extension notation (`DT'2023-01-01T12:00:00Z'`)\n * - `false`: emit raw CBOR notation (`1(-14159024)`, `52(h'c000022a')`)\n * @default true\n */\n appStrings?: boolean;\n\n /**\n * Numeric format for integer values in EDN output.\n * - `'decimal'`: standard decimal notation (e.g. `42`, `-14159024`)\n * - `'hex'`: hexadecimal notation (e.g. `0x2a`, `-0xd83130`)\n * - `'octal'`: octal notation (e.g. `0o52`, `-0o67061560`)\n * - `'binary'`: binary notation (e.g. `0b101010`, `-0b110110000011000100110000`)\n * @default 'decimal'\n */\n intFormat?: 'decimal' | 'hex' | 'octal' | 'binary';\n\n /**\n * Numeric format for floating-point values in EDN output.\n * - `'decimal'`: standard decimal notation (e.g. `1.5`, `145544.0_3`)\n * - `'hex'`: C99-style hex float notation (e.g. `0x1.8p+0`, `0x1.1c54p+17_3`)\n * @default 'decimal'\n */\n floatFormat?: 'decimal' | 'hex';\n\n /**\n * Split long text strings using EDN string concatenation syntax (`\"a\" + \"b\"`).\n * Only effective when `indent` is specified.\n *\n * - `'newline'`: split at newline characters\n * - `'cboredn'`: split according to CBOR-EDN structure when the string content\n * is parseable as CBOR-EDN (JSON superset)\n *\n * When both are specified, `'cboredn'` is tried first; `'newline'` is used\n * only when the string content is not parseable as CBOR-EDN.\n */\n textStringFormat?: ('newline' | 'cboredn')[];\n}\n\nexport interface CborComment {\n kind: 'line' | 'block';\n marker: '#' | '//' | '/*' | '/';\n text: string;\n start: number;\n end: number;\n line: number;\n col: number;\n}\n\nexport interface CborComments {\n leading?: CborComment[];\n trailing?: CborComment[];\n dangling?: CborComment[];\n}\n\n/**\n * Combined options for the `CBOR` constructor.\n *\n * These defaults are applied to every subsequent method call on the instance.\n * Per-call options always take precedence over these defaults.\n *\n * Note: `encodeIntegerAs` (from {@link FromJSOptions}) and `integerAs` (from\n * {@link ToJSOptions}) are distinct fields and do not conflict.\n */\nexport type CBOROptions = FromEDNOptions &\n FromJSOptions &\n ToCBOROptions &\n ToEDNOptions &\n ToJSOptions &\n ToHexDumpOptions;\n","/**\n * Wrapper for unrecognised CBOR simple values (0–255, excluding false/true/\n * null/undefined). Returned by CborSimple.toJS() so that fromJS() can\n * reconstruct the original CborSimple node and preserve the round-trip.\n *\n * Also serves as a namespace for simple-value utilities.\n *\n * @example\n * const v = CBOR.fromEDN('simple(19)').toJS();\n * Simple.is(v); // true\n * Simple.get(v); // 19\n *\n * const node = CBOR.fromJS(new Simple(19));\n * node.toEDN(); // \"simple(19)\"\n */\nexport class Simple {\n readonly value: number;\n\n constructor(value: number) {\n if (!Number.isInteger(value) || value < 0 || value > 255)\n throw new RangeError('Simple value must be an integer in 0–255');\n this.value = value;\n }\n\n valueOf(): number {\n return this.value;\n }\n\n toJSON(): never {\n throw new TypeError(`simple(${this.value}) cannot be serialized to JSON`);\n }\n\n /** Return true if value is a Simple instance. */\n static is(value: unknown): value is Simple {\n return value instanceof Simple;\n }\n\n /** Return the simple number if value is a Simple instance, otherwise undefined. */\n static get(value: unknown): number | undefined {\n return value instanceof Simple ? value.value : undefined;\n }\n}\n","import type {\n CBOROptions,\n ToEDNOptions,\n ToJSOptions,\n ToHexDumpOptions,\n ToCBOROptions,\n CborComments,\n} from '../types';\nimport { CBOR_OMIT } from '../types';\n\n/** @internal One line of an annotated hex dump. */\nexport interface AnnotatedLine {\n depth: number;\n hex: string;\n comment: string;\n}\n\n/**\n * Abstract base class for all CBOR AST nodes.\n *\n * Every node can serialize itself to CBOR binary, CBOR-EDN text, and a\n * plain JavaScript value. Concrete implementations are provided in each\n * subclass (added in later phases).\n */\nexport abstract class CborItem {\n /**\n * Character offset of the first character of this item in the parsed source.\n * Set by parsers; undefined when the node was constructed directly.\n * For CBOR input this is a byte offset.\n */\n start?: number;\n\n /**\n * Character offset just past the last character of this item in the parsed source.\n * Set by parsers; undefined when the node was constructed directly.\n * For CBOR input this is a byte offset.\n */\n end?: number;\n\n /**\n * Comments captured from CBOR-EDN source when `preserveComments` is enabled.\n * They do not affect CBOR bytes or JS conversion.\n */\n comments?: CborComments;\n\n /**\n * Default options bound by a {@link CBOR} instance factory method.\n * Per-call options always take precedence.\n * @internal\n */\n _defaults?: CBOROptions;\n\n // ─── Public template methods ────────────────────────────────────────────────\n\n /** Serialize this node to CBOR binary. */\n toCBOR(options?: ToCBOROptions): Uint8Array {\n const merged = this._defaults ? { ...this._defaults, ...options } : options;\n return this._toCBOR(merged);\n }\n\n /** Serialize this node to a CBOR-EDN text string. */\n toEDN(options?: ToEDNOptions): string {\n const merged = this._defaults ? { ...this._defaults, ...options } : options;\n const body = this._toEDN(merged, 0);\n if (!merged?.preserveComments) return body;\n const leading = this.comments?.leading?.map((c) => c.text) ?? [];\n const trailing = this.comments?.trailing ?? [];\n const bodyWithTrailing =\n trailing.length === 0\n ? body\n : `${body} ${trailing.map((c) => c.text.trimEnd()).join(' ')}`;\n return [...leading, bodyWithTrailing].join('\\n');\n }\n\n /**\n * Convert this CBOR AST node to a plain JavaScript value.\n *\n * If `options.reviver` is supplied it is called with key `''` on the root\n * result after the full tree has been converted (matching the semantics of\n * `JSON.parse`). Container nodes call the reviver on each of their direct\n * children during conversion, so the walk is bottom-up.\n */\n toJS(options?: ToJSOptions): unknown {\n const merged = this._defaults ? { ...this._defaults, ...options } : options;\n const result = this._toJS(merged);\n if (!merged?.reviver) return result;\n const rv = merged.reviver.call({ '': result }, '', result);\n return rv === CBOR_OMIT ? undefined : rv;\n }\n\n /**\n * Generate an RFC 8949 §3 style annotated hex dump of this value.\n *\n * @example\n * const cbor = CBOR.fromEDN('[_ 1, [2, 3]]');\n * console.log(cbor.toHexDump());\n * // 9F -- Start indefinite-length array\n * // 01 -- 1\n * // 82 -- Array of length 2\n * // 02 -- 2\n * // 03 -- 3\n * // FF -- \"break\"\n * // FF -- \"break\"\n */\n toHexDump(options?: ToHexDumpOptions): string {\n const merged = this._defaults ? { ...this._defaults, ...options } : options;\n const raw = merged?.indent ?? 3;\n const indentStr = typeof raw === 'string' ? raw : ' '.repeat(raw);\n const marker = (merged?.commentStyle ?? '--') + ' ';\n const lines = this._toHexDump(0, merged);\n const maxPrefixLen = Math.max(\n ...lines.map((l) => l.depth * indentStr.length + l.hex.length)\n );\n const col = maxPrefixLen + 2;\n return lines\n .map((l) => {\n const prefix = indentStr.repeat(l.depth) + l.hex;\n return prefix.padEnd(col) + marker + l.comment;\n })\n .join('\\n');\n }\n\n // ─── Internal abstract methods ───────────────────────────────────────────────\n\n /** @internal Subclass CBOR encoding implementation. */\n abstract _toCBOR(options?: ToCBOROptions): Uint8Array;\n\n /**\n * @internal\n * Depth-aware EDN serialization.\n * Leaf nodes receive `depth` but may ignore it.\n * Container nodes use `depth` for indentation and call\n * `child._toEDN(options, depth + 1)` when recursing.\n */\n abstract _toEDN(options: ToEDNOptions | undefined, depth: number): string;\n\n /**\n * @internal\n * Core conversion logic implemented by each subclass.\n * Container nodes apply `options.reviver` to their direct children.\n * Do not call this directly — use `toJS()` instead.\n */\n abstract _toJS(options?: ToJSOptions): unknown;\n\n /**\n * @internal\n * Collect annotated-hex lines for this node.\n * Leaf nodes emit a single line; container nodes override to emit\n * open/close lines with recursively collected children.\n */\n _toHexDump(depth: number, options?: ToEDNOptions): AnnotatedLine[] {\n const hex = Array.from(this._toCBOR(), (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n return [{ depth, hex, comment: this._toEDN(options, 0) }];\n }\n}\n","/**\n * Float16 (IEEE 754 binary16) encode/decode utilities.\n *\n * Uses native DataView.getFloat16 / setFloat16 when both are available,\n * and falls back to a manual bit-manipulation implementation otherwise.\n *\n * binary16 format:\n * bit 15 : sign\n * bits 14-10: exponent (5 bits, bias = 15)\n * bits 9- 0: mantissa (10 bits)\n */\n\nexport const hasNativeFloat16 =\n 'getFloat16' in DataView.prototype && 'setFloat16' in DataView.prototype;\n\n// Reusable 8-byte buffer for float64 bit extraction (avoids per-call allocation)\nconst _buf8 = new ArrayBuffer(8);\nconst _dv8 = new DataView(_buf8);\n\n/**\n * float64 → float16 bit pattern (16-bit unsigned integer).\n *\n * Operates directly on float64 bits to avoid double-rounding artifacts that\n * arise from a float64 → float32 → float16 two-step conversion.\n * Implements IEEE 754 round-to-nearest-ties-to-even (RN-TE).\n *\n * Exported for testing (manual vs native consistency checks).\n */\nexport function float64ToFloat16Bits(value: number): number {\n // Store the float64 in big-endian order so the bit layout is predictable\n _dv8.setFloat64(0, value, false);\n const hi = _dv8.getUint32(0, false); // bits 63-32 of IEEE 754 binary64\n const lo = _dv8.getUint32(4, false); // bits 31-0\n\n const sign = (hi >>> 31) & 1;\n const exp64 = (hi >>> 20) & 0x7ff; // 11-bit exponent, bias 1023\n const mantHi = hi & 0x000f_ffff; // top 20 bits of the 52-bit mantissa\n // lo = lower 32 bits of the mantissa\n\n // ── Infinity / NaN ──────────────────────────────────────────────────────────\n if (exp64 === 0x7ff) {\n if (mantHi === 0 && lo === 0) return (sign << 15) | 0x7c00; // ±Infinity\n // NaN: carry top 10 mantissa bits; guarantee at least one bit is set\n const f16mant = (mantHi >> 10) | (lo !== 0 ? 1 : 0) || 1;\n return (sign << 15) | 0x7c00 | (f16mant & 0x3ff);\n }\n\n // Rebias: float64 exponent bias 1023 → float16 bias 15\n const f16Exp = exp64 - 1023 + 15;\n\n // ── Overflow → ±Infinity ────────────────────────────────────────────────────\n if (f16Exp >= 31) return (sign << 15) | 0x7c00;\n\n let f16mant: number;\n let roundBit: number;\n let sticky: boolean;\n\n if (f16Exp <= 0) {\n // ── Underflow ──────────────────────────────────────────────────────────────\n if (f16Exp < -10) return sign << 15; // → ±0\n\n // ── Denormal ───────────────────────────────────────────────────────────────\n // Reconstruct the 53-bit significand's top 21 bits: [implicit 1][mantHi 20-bit]\n const top21 = (1 << 20) | mantHi;\n\n // Right-shift amount to align the significand for a float16 denormal:\n // f16mant = round(top53 / 2^(43 - f16Exp))\n // We approximate top53 ≈ top21 × 2^32 (low bits from `lo` affect only rounding).\n const s = 11 - f16Exp; // s ∈ [11, 21]\n\n if (s <= 20) {\n f16mant = (top21 >> s) & 0x3ff;\n roundBit = (top21 >> (s - 1)) & 1;\n sticky = (top21 & ((1 << (s - 1)) - 1)) !== 0 || lo !== 0;\n } else {\n // s = 21: the implicit-1 bit becomes the round bit; truncated result is 0\n f16mant = 0;\n roundBit = 1; // implicit 1 is always present\n sticky = mantHi !== 0 || lo !== 0;\n }\n } else {\n // ── Normal ─────────────────────────────────────────────────────────────────\n // Take the top 10 bits of the 52-bit mantissa; round using the next bits.\n f16mant = mantHi >> 10;\n roundBit = (mantHi >> 9) & 1;\n sticky = (mantHi & 0x1ff) !== 0 || lo !== 0;\n }\n\n // ── Round-to-nearest-ties-to-even (RN-TE) ───────────────────────────────────\n if (roundBit !== 0 && (sticky || (f16mant & 1) !== 0)) {\n f16mant++;\n }\n\n // ── Mantissa overflow: carry into exponent ───────────────────────────────────\n if (f16mant >= 1024) {\n // Denormal rounds up to the smallest normal (exp = 1), or normal exponent increments\n const newExp = f16Exp <= 0 ? 1 : f16Exp + 1;\n if (newExp >= 31) return (sign << 15) | 0x7c00; // overflow to Infinity\n return (sign << 15) | (newExp << 10); // mant = 0\n }\n\n const outExp = f16Exp <= 0 ? 0 : f16Exp;\n return (sign << 15) | (outExp << 10) | f16mant;\n}\n\n/**\n * float16 bit pattern → float64.\n * Exported for testing purposes.\n */\nexport function float16BitsToFloat64(bits: number): number {\n const sign = (bits >>> 15) & 1;\n const exp = (bits >>> 10) & 0x1f;\n const mant = bits & 0x3ff;\n\n if (exp === 0x1f) {\n return mant === 0 ? (sign ? -Infinity : Infinity) : NaN;\n }\n if (exp === 0) {\n if (mant === 0) return sign ? -0 : 0;\n // Denormal: (-1)^sign × 2^(-14) × (mant / 1024)\n return (sign ? -1 : 1) * 2 ** -14 * (mant / 1024);\n }\n // Normal: (-1)^sign × 2^(exp-15) × (1 + mant/1024)\n return (sign ? -1 : 1) * 2 ** (exp - 15) * (1 + mant / 1024);\n}\n\n/**\n * Write a float16 value at the given offset in a DataView.\n */\ntype WriteFloat16 = (\n view: DataView,\n offset: number,\n value: number,\n littleEndian: boolean\n) => void;\n\n/**\n * Read a float16 value from the given offset in a DataView, returned as float64.\n */\ntype ReadFloat16 = (\n view: DataView,\n offset: number,\n littleEndian: boolean\n) => number;\n\nconst writeFloat16Native: WriteFloat16 = (\n view,\n offset,\n value,\n littleEndian\n) => {\n view.setFloat16(offset, value, littleEndian);\n};\n\nconst writeFloat16Fallback: WriteFloat16 = (\n view,\n offset,\n value,\n littleEndian\n) => {\n view.setUint16(offset, float64ToFloat16Bits(value), littleEndian);\n};\n\nconst readFloat16Native: ReadFloat16 = (view, offset, littleEndian) => {\n return view.getFloat16(offset, littleEndian);\n};\n\nconst readFloat16Fallback: ReadFloat16 = (view, offset, littleEndian) => {\n return float16BitsToFloat64(view.getUint16(offset, littleEndian));\n};\n\n// Dispatch between native and fallback once at module initialization time.\nexport const writeFloat16: WriteFloat16 = hasNativeFloat16\n ? writeFloat16Native\n : writeFloat16Fallback;\n\nexport const readFloat16: ReadFloat16 = hasNativeFloat16\n ? readFloat16Native\n : readFloat16Fallback;\n","import { float64ToFloat16Bits, float16BitsToFloat64 } from '../utils/float16';\nimport type { FloatPrecision } from '../ast/CborFloat';\nimport { AI_1BYTE, AI_2BYTE, AI_4BYTE, AI_8BYTE } from './constants';\n\n// ─── Encoding width ───────────────────────────────────────────────────────────\n\n/**\n * EDN encoding indicator, mapping to a specific CBOR AI encoding:\n * 'i' → ai 0–23 (argument in initial byte, value must be 0–23)\n * 0 → AI 24 (1-byte argument, value must be 0–0xFF)\n * 1 → AI 25 (2-byte argument, value must be 0–0xFFFF)\n * 2 → AI 26 (4-byte argument, value must be 0–0xFFFFFFFF)\n * 3 → AI 27 (8-byte argument, value must be 0–0xFFFFFFFFFFFFFFFF)\n */\nexport type EncodingWidth = 'i' | 0 | 1 | 2 | 3;\n\n// ─── Header encoding ──────────────────────────────────────────────────────────\n\n/**\n * Encode a CBOR initial byte + argument into a Uint8Array.\n *\n * When `encodingWidth` is provided the argument is always written using that\n * many additional bytes (AI = 24 + encodingWidth), even if the value would fit\n * in fewer bytes. Without it the smallest valid encoding is chosen.\n */\nexport function writeHead(\n mt: number,\n value: bigint,\n encodingWidth?: EncodingWidth\n): Uint8Array {\n if (encodingWidth !== undefined) {\n // Immediate encoding: value must fit in the lower 5 bits of the initial byte\n if (encodingWidth === 'i') {\n if (value > 23n)\n throw new RangeError(\n `value ${value} does not fit in immediate encoding _i (max 23)`\n );\n return new Uint8Array([(mt << 5) | Number(value)]);\n }\n const maxForWidth = [\n 0xffn,\n 0xffffn,\n 0xffff_ffffn,\n 0xffff_ffff_ffff_ffffn,\n ] as const;\n if (value > maxForWidth[encodingWidth]) {\n throw new RangeError(\n `value ${value} does not fit in encodingWidth _${encodingWidth} (max ${maxForWidth[encodingWidth]})`\n );\n }\n const ai = AI_1BYTE + encodingWidth; // 24, 25, 26, or 27\n if (ai === AI_1BYTE) {\n return new Uint8Array([(mt << 5) | AI_1BYTE, Number(value)]);\n }\n if (ai === AI_2BYTE) {\n const buf = new Uint8Array(3);\n buf[0] = (mt << 5) | AI_2BYTE;\n buf[1] = Number(value >> 8n);\n buf[2] = Number(value & 0xffn);\n return buf;\n }\n if (ai === AI_4BYTE) {\n const buf = new Uint8Array(5);\n buf[0] = (mt << 5) | AI_4BYTE;\n new DataView(buf.buffer).setUint32(1, Number(value), false);\n return buf;\n }\n // ai === AI_8BYTE\n const buf = new Uint8Array(9);\n buf[0] = (mt << 5) | AI_8BYTE;\n new DataView(buf.buffer).setBigUint64(1, value, false);\n return buf;\n }\n if (value <= 23n) {\n return new Uint8Array([(mt << 5) | Number(value)]);\n }\n if (value <= 0xffn) {\n return new Uint8Array([(mt << 5) | AI_1BYTE, Number(value)]);\n }\n if (value <= 0xffffn) {\n const buf = new Uint8Array(3);\n buf[0] = (mt << 5) | AI_2BYTE;\n buf[1] = Number(value >> 8n);\n buf[2] = Number(value & 0xffn);\n return buf;\n }\n if (value <= 0xffff_ffffn) {\n const buf = new Uint8Array(5);\n buf[0] = (mt << 5) | AI_4BYTE;\n new DataView(buf.buffer).setUint32(1, Number(value), false);\n return buf;\n }\n const buf = new Uint8Array(9);\n buf[0] = (mt << 5) | AI_8BYTE;\n new DataView(buf.buffer).setBigUint64(1, value, false);\n return buf;\n}\n\n/** Concatenate multiple Uint8Arrays into one. */\nexport function concat(parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((n, p) => n + p.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.length;\n }\n return out;\n}\n\n// ─── Float precision helpers ──────────────────────────────────────────────────\n\nconst _f32buf = new DataView(new ArrayBuffer(4));\n\n/**\n * Returns true if `value` can be exactly represented as a float16 without\n * precision loss (including -0, Infinity, -Infinity, NaN identity).\n */\nexport function canEncodeAsFloat16(value: number): boolean {\n return Object.is(float16BitsToFloat64(float64ToFloat16Bits(value)), value);\n}\n\n/**\n * Returns true if `value` can be exactly represented as a float32 without\n * precision loss.\n */\nexport function canEncodeAsFloat32(value: number): boolean {\n _f32buf.setFloat32(0, value, false);\n return Object.is(_f32buf.getFloat32(0, false), value);\n}\n\n/**\n * Choose the smallest float precision that represents `value` exactly.\n * Used by CborFloat.toCBOR() when `precision` is undefined.\n */\nexport function autoSelectFloatPrecision(value: number): FloatPrecision {\n if (canEncodeAsFloat16(value)) return 'half';\n if (canEncodeAsFloat32(value)) return 'single';\n return 'double';\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_UINT } from '../cbor/constants';\nimport { writeHead, type EncodingWidth } from '../cbor/encode';\n\n/** CBOR Major Type 0 — unsigned integer (0 … 2^64−1). */\nexport class CborUint extends CborItem {\n readonly value: bigint;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n value: number | bigint,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super();\n this.value = BigInt(value);\n if (this.value < 0n)\n throw new RangeError('CborUint value must be non-negative');\n if (this.value > 0xffff_ffff_ffff_ffffn)\n throw new RangeError('CborUint value exceeds maximum uint64');\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n return writeHead(MT_UINT, this.value, this.encodingWidth);\n }\n\n _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n const v = this.value;\n switch (options?.intFormat) {\n case 'hex':\n return `0x${v.toString(16)}${suffix}`;\n case 'octal':\n return `0o${v.toString(8)}${suffix}`;\n case 'binary':\n return `0b${v.toString(2)}${suffix}`;\n default:\n return v.toString() + suffix;\n }\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const mode = options?.integerAs ?? 'auto';\n if (mode === 'bigint') return this.value;\n if (mode === 'number') return Number(this.value);\n return this.value <= BigInt(Number.MAX_SAFE_INTEGER)\n ? Number(this.value)\n : this.value;\n }\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_NINT } from '../cbor/constants';\nimport { writeHead, type EncodingWidth } from '../cbor/encode';\n\n/**\n * CBOR Major Type 1 — negative integer (−2^64 … −1).\n *\n * The constructor accepts the actual negative value (e.g. `-5n`).\n * Internally the CBOR \"argument\" `n` is stored, where the decoded value\n * equals `−1 − n`. This matches the wire encoding directly.\n *\n * Examples:\n * new CborNint(-1n) → argument = 0n\n * new CborNint(-5n) → argument = 4n\n */\nexport class CborNint extends CborItem {\n /** CBOR raw argument n, where actual value = −1 − n. */\n readonly argument: bigint;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n value: number | bigint,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super();\n const v = BigInt(value);\n if (v >= 0n) throw new RangeError('CborNint value must be negative');\n if (v < -(0xffff_ffff_ffff_ffffn + 1n))\n throw new RangeError('CborNint value exceeds minimum int64');\n this.argument = -1n - v;\n this.encodingWidth = options?.encodingWidth;\n }\n\n /** The actual decoded negative value (−1 − argument). */\n get value(): bigint {\n return -1n - this.argument;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n return writeHead(MT_NINT, this.argument, this.encodingWidth);\n }\n\n _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n const abs = this.argument + 1n; // absolute value of the negative number\n switch (options?.intFormat) {\n case 'hex':\n return `-0x${abs.toString(16)}${suffix}`;\n case 'octal':\n return `-0o${abs.toString(8)}${suffix}`;\n case 'binary':\n return `-0b${abs.toString(2)}${suffix}`;\n default:\n return this.value.toString() + suffix;\n }\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const v = this.value;\n const mode = options?.integerAs ?? 'auto';\n if (mode === 'bigint') return v;\n if (mode === 'number') return Number(v);\n return v >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(v) : v;\n }\n}\n","/**\n * Pure utility functions for EDN serialization.\n * No AST imports — safe to import from any AST class.\n */\n\nimport type { CborComments, ToEDNOptions } from '../types';\n\n// ─── Indent helpers ───────────────────────────────────────────────────────────\n\n/** Resolve indent option to a string, or null for single-line output. */\nexport function resolveIndent(\n options: ToEDNOptions | undefined\n): string | null {\n const indent = options?.indent;\n if (indent === undefined) return null;\n return typeof indent === 'number' ? ' '.repeat(indent) : indent;\n}\n\n/** Build the indent prefix for a given depth. */\nexport function indentOf(indentStr: string, depth: number): string {\n return indentStr.repeat(depth);\n}\n\n// ─── Comment helpers ─────────────────────────────────────────────────────────\n\nexport interface Commented {\n comments?: CborComments;\n}\n\nexport function hasPreservedComments(item: Commented): boolean {\n return Boolean(\n item.comments?.leading?.length ||\n item.comments?.trailing?.length ||\n item.comments?.dangling?.length\n );\n}\n\nexport function hasContainerLayoutComments(item: Commented): boolean {\n return Boolean(\n item.comments?.trailing?.length || item.comments?.dangling?.length\n );\n}\n\nexport function formatLeadingComments(\n item: Commented,\n indent: string\n): string[] {\n return (item.comments?.leading ?? []).map((comment) => indent + comment.text);\n}\n\nexport function formatTrailingComments(item: Commented): string {\n const comments = item.comments?.trailing ?? [];\n if (comments.length === 0) return '';\n return ' ' + comments.map((comment) => comment.text).join(' ');\n}\n\nexport function formatDanglingComments(\n item: Commented,\n indent: string\n): string[] {\n return (item.comments?.dangling ?? []).map(\n (comment) => indent + comment.text\n );\n}\n\n// ─── Comma / separator helpers ────────────────────────────────────────────────\n\n/**\n * Resolve separator options into concrete strings.\n *\n * @param compact - When `true` (no `indent` option), omit spaces around\n * separators to produce compact single-line output (like `JSON.stringify`).\n *\n * @returns\n * - `inlineSep` – between items on a single line\n * - `multilineSep` – appended after each non-last line in multi-line mode\n * - `trailSep` – appended after the last item (empty string or `,`)\n * - `colSep` – between map key and value (`': '` or `':'`)\n */\nexport function resolveSeparators(\n options: ToEDNOptions | undefined,\n compact = false\n): {\n inlineSep: string;\n multilineSep: string;\n trailSep: string;\n colSep: string;\n} {\n const commas = options?.commas ?? 'comma';\n const useCommas = commas !== 'none';\n const trailing = commas === 'trailing';\n return {\n inlineSep: useCommas ? (compact ? ',' : ', ') : ' ',\n multilineSep: useCommas ? ',' : '',\n trailSep: trailing ? ',' : '',\n colSep: compact ? ':' : ': ',\n };\n}\n\n// ─── Byte string encoding ─────────────────────────────────────────────────────\n\nfunction toHex(bytes: Uint8Array): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (bytes as any).toHex === 'function')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (bytes as any).toHex();\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _hasNativeToBase64 =\n typeof (new Uint8Array(0) as any).toBase64 === 'function';\n\nfunction toBase64(bytes: Uint8Array): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (_hasNativeToBase64) return (bytes as any).toBase64({ omitPadding: true });\n let binary = '';\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/=/g, '');\n}\n\nfunction toBase64Url(bytes: Uint8Array): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (_hasNativeToBase64)\n return (bytes as any).toBase64({\n alphabet: 'base64url',\n omitPadding: true,\n });\n let binary = '';\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nconst B32_ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\nconst H32_ALPHA = '0123456789ABCDEFGHIJKLMNOPQRSTUV';\n\nfunction base32Encode(bytes: Uint8Array, alpha: string): string {\n let result = '';\n let buf = 0,\n bufBits = 0;\n for (const b of bytes) {\n buf = (buf << 8) | b;\n bufBits += 8;\n while (bufBits >= 5) {\n bufBits -= 5;\n result += alpha[(buf >> bufBits) & 0x1f];\n }\n }\n if (bufBits > 0) result += alpha[(buf << (5 - bufBits)) & 0x1f];\n return result;\n}\n\n/**\n * Returns true if the string contains any C0 control character (U+0000–U+001F)\n * or DEL (U+007F).\n */\nfunction _hasNonPrintable(s: string): boolean {\n for (const char of s) {\n const cp = char.codePointAt(0)!;\n if (cp < 0x20 || cp === 0x7f) return true;\n }\n return false;\n}\n\nexport function serializeBytes(\n bytes: Uint8Array,\n encoding?: 'hex' | 'base64' | 'base64url' | 'base32' | 'base32hex',\n sqstr?: 'printable-string' | 'string' | 'none'\n): string {\n if (sqstr === 'string') {\n const s = _tryDecodeUtf8(bytes);\n if (s != null) return _escapeSingleQuoted(s);\n }\n if (sqstr === 'printable-string' || sqstr === undefined) {\n const s = _tryDecodeUtf8(bytes);\n if (s != null && !_hasNonPrintable(s)) return _escapeSingleQuoted(s);\n }\n switch (encoding) {\n case 'base64':\n return `b64'${toBase64(bytes)}'`;\n case 'base64url':\n return `b64'${toBase64Url(bytes)}'`;\n case 'base32':\n return `b32'${base32Encode(bytes, B32_ALPHA)}'`;\n case 'base32hex':\n return `h32'${base32Encode(bytes, H32_ALPHA)}'`;\n case 'hex':\n default:\n return `h'${toHex(bytes)}'`;\n }\n}\n\n/** Decode bytes as UTF-8; returns null if the bytes are not valid UTF-8. */\nfunction _tryDecodeUtf8(bytes: Uint8Array): string | null {\n try {\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch {\n return null;\n }\n}\n\n// ─── Text string escaping ─────────────────────────────────────────────────────\n\n/**\n * Core EDN string escaper.\n *\n * Produces a quoted literal delimited by `quote` (`\"` or `'`).\n * Iterates by Unicode code point so characters above U+FFFF are emitted as a\n * single character rather than two surrogate `\\uXXXX` escapes.\n *\n * Always escapes:\n * - the delimiter character itself\n * - `\\` (backslash)\n * - `\\n`, `\\r`, `\\t`\n * - U+0000–U+001F (C0 controls), U+007F (DEL)\n * - U+2028 / U+2029 (JS line terminators)\n * - U+200B–U+200D (zero-width characters), U+FEFF (BOM)\n */\nfunction _escapeQuoted(s: string, quote: string): string {\n const quoteCP = quote.codePointAt(0)!;\n let result = quote;\n for (const char of s) {\n const cp = char.codePointAt(0)!;\n switch (cp) {\n case quoteCP:\n result += `\\\\${quote}`;\n break;\n case 0x5c: // \\\n result += '\\\\\\\\';\n break;\n case 0x0a: // \\n\n result += '\\\\n';\n break;\n case 0x0d: // \\r\n result += '\\\\r';\n break;\n case 0x09: // \\t\n result += '\\\\t';\n break;\n default:\n if (\n cp < 0x20 ||\n cp === 0x7f ||\n cp === 0x2028 ||\n cp === 0x2029 ||\n cp === 0x200b ||\n cp === 0x200c ||\n cp === 0x200d ||\n cp === 0xfeff\n )\n result += `\\\\u${cp.toString(16).padStart(4, '0')}`;\n else result += char;\n }\n }\n return result + quote;\n}\n\n/** Produce a single-quoted EDN byte string literal `'...'` from a string value. */\nfunction _escapeSingleQuoted(s: string): string {\n return _escapeQuoted(s, \"'\");\n}\n\n/**\n * Produce a single-quoted EDN app-string content `'...'` from a string value.\n * Exported for use by app-extension `_toEDN` implementations.\n */\nexport function escapeAppString(s: string): string {\n return _escapeQuoted(s, \"'\");\n}\n\n/**\n * Produce an EDN double-quoted string literal `\"...\"` from a string value.\n */\nexport function escapeString(s: string): string {\n return _escapeQuoted(s, '\"');\n}\n\n// ─── Float formatting ─────────────────────────────────────────────────────────\n\n/** Produce the numeric string for a float value (with decimal point if needed). */\nexport function floatValueToString(value: number): string {\n if (isNaN(value)) return 'NaN';\n if (!isFinite(value)) return value > 0 ? 'Infinity' : '-Infinity';\n if (Object.is(value, -0)) return '-0.0';\n const s = value.toString();\n // Ensure a decimal point is present to distinguish from CBOR integer types\n return s.includes('.') || s.includes('e') ? s : s + '.0';\n}\n\n/**\n * EDN encoding-indicator suffix for a float precision.\n * Returns '' when the auto-selected precision matches (no suffix needed).\n */\nexport function floatSuffix(\n _value: number,\n precision: 'half' | 'single' | 'double' | undefined,\n autoSelected: 'half' | 'single' | 'double'\n): string {\n if (precision === undefined || precision === autoSelected) return '';\n return precision === 'half' ? '_1' : precision === 'single' ? '_2' : '_3';\n}\n","/**\n * Hex float (C99-style, e.g. `0x1.8p+0`) encode/decode utilities.\n *\n * Hex float format:\n * [-] 0x [hex digits] [. [hex digits]] p [+-] [decimal exponent]\n *\n * This notation appears in CBOR-EDN (draft-ietf-cbor-edn-literals) as an\n * alternative representation for floating-point values (major type 7).\n */\n\n// Reusable 8-byte buffer for float64 bit extraction\nconst _buf8 = new ArrayBuffer(8);\nconst _dv8 = new DataView(_buf8);\n\n/**\n * Parse a hex float literal (e.g. `0x4711p+03`, `0x1.8p+0`, `-0x1.fp-2`)\n * to a JS number.\n *\n * Assumes the string has already been stripped of any encoding-indicator\n * suffix (`_1`, `_2`, `_3`).\n */\nexport function parseHexFloat(s: string): number {\n const neg = s.startsWith('-');\n const body = s.slice(neg ? 3 : 2); // strip optional '-' and '0x'/'0X'\n\n const pIdx = body.search(/[pP]/);\n if (pIdx === -1)\n throw new SyntaxError(\n `EDN parse error: hex float missing 'p' exponent: ${s}`\n );\n\n const mantissaStr = body.slice(0, pIdx);\n const expStr = body.slice(pIdx + 1);\n\n // Exponent must be a non-empty decimal integer (optional sign + digits)\n if (!/^[+-]?\\d+$/.test(expStr))\n throw new SyntaxError(\n `EDN parse error: hex float has invalid or missing exponent: ${s}`\n );\n\n const exp = parseInt(expStr, 10);\n\n const dotIdx = mantissaStr.indexOf('.');\n let mantissa: number;\n if (dotIdx === -1) {\n // No decimal point: must have at least one hex digit\n if (!/^[0-9a-fA-F]+$/.test(mantissaStr))\n throw new SyntaxError(\n `EDN parse error: hex float has no mantissa digits: ${s}`\n );\n mantissa = parseInt(mantissaStr, 16);\n } else {\n const intPart = mantissaStr.slice(0, dotIdx);\n const fracStr = mantissaStr.slice(dotIdx + 1);\n // At least one hex digit required on either side of the decimal point\n if (intPart === '' && fracStr === '')\n throw new SyntaxError(\n `EDN parse error: hex float has no mantissa digits: ${s}`\n );\n if (intPart !== '' && !/^[0-9a-fA-F]+$/.test(intPart))\n throw new SyntaxError(\n `EDN parse error: hex float has invalid mantissa: ${s}`\n );\n if (fracStr !== '' && !/^[0-9a-fA-F]+$/.test(fracStr))\n throw new SyntaxError(\n `EDN parse error: hex float has invalid mantissa: ${s}`\n );\n const intVal = intPart === '' ? 0 : parseInt(intPart, 16);\n const fracVal =\n fracStr === '' ? 0 : parseInt(fracStr, 16) / Math.pow(16, fracStr.length);\n mantissa = intVal + fracVal;\n }\n\n const result = mantissa * Math.pow(2, exp);\n return neg ? -result : result;\n}\n\n/**\n * Convert a JS number to a normalized hex float string compatible with\n * CBOR-EDN diagnostic notation.\n *\n * - Normal values: `0x1.[hex fraction]p[+-][exp]` (e.g. `0x1.8p+0` for 1.5)\n * - Subnormal values: `0x0.[hex fraction]p-1022`\n * - Zero: `0x0p+0` / `-0x0p+0`\n * - Non-finite values (NaN, ±Infinity) are returned unchanged as EDN tokens.\n */\nexport function floatToHexFloat(v: number): string {\n if (isNaN(v)) return 'NaN';\n if (!isFinite(v)) return v > 0 ? 'Infinity' : '-Infinity';\n\n const neg = Object.is(v, -0) || v < 0;\n const abs = Math.abs(v);\n\n if (abs === 0) return neg ? '-0x0p+0' : '0x0p+0';\n\n _dv8.setFloat64(0, abs, false); // big-endian\n const hi = _dv8.getUint32(0, false);\n const lo = _dv8.getUint32(4, false);\n\n // bits [30:20] of hi = biased exponent (11 bits)\n const biasedExp = (hi >>> 20) & 0x7ff;\n // bits [19:0] of hi = upper 20 bits of 52-bit mantissa\n const mantHi = hi & 0xfffff;\n // lo = lower 32 bits of mantissa\n const mantLo = lo;\n\n // Format mantissa as 13 hex digits (52 bits / 4), strip trailing zeros\n const hexMant =\n mantHi.toString(16).padStart(5, '0') + mantLo.toString(16).padStart(8, '0');\n const trimmed = hexMant.replace(/0+$/, '');\n const mantPart = trimmed === '' ? '' : `.${trimmed}`;\n\n let intPart: string;\n let exp: number;\n if (biasedExp === 0) {\n // Subnormal: value = 0.[mantissa] * 2^-1022\n intPart = '0';\n exp = -1022;\n } else {\n // Normal: value = 1.[mantissa] * 2^(biasedExp-1023)\n intPart = '1';\n exp = biasedExp - 1023;\n }\n\n const expStr = exp >= 0 ? `+${exp}` : `${exp}`;\n const result = `0x${intPart}${mantPart}p${expStr}`;\n return neg ? `-${result}` : result;\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_SIMPLE, AI_2BYTE, AI_4BYTE, AI_8BYTE } from '../cbor/constants';\nimport { autoSelectFloatPrecision } from '../cbor/encode';\nimport { writeFloat16 } from '../utils/float16';\nimport { floatValueToString, floatSuffix } from '../edn/serialize-utils';\nimport { floatToHexFloat } from '../utils/hexfloat';\n\nexport type FloatPrecision = 'half' | 'single' | 'double';\n\n/**\n * CBOR Major Type 7 — IEEE 754 floating-point number.\n *\n * `precision` records the encoding size from the original CBOR stream so\n * that lossless round-trips are preserved. When constructing from a JS\n * `number`, omit `precision` (`undefined`) and the encoder will choose\n * the smallest encoding that preserves the value exactly.\n */\nexport class CborFloat extends CborItem {\n readonly value: number;\n /**\n * Encoding size hint.\n * - `'half'` / `'single'` / `'double'`: use exactly this size (set by the\n * decoder to guarantee lossless round-trips).\n * - `undefined`: encoder auto-selects the smallest lossless size.\n */\n readonly precision: FloatPrecision | undefined;\n\n constructor(value: number, options?: { precision?: FloatPrecision }) {\n super();\n this.value = value;\n this.precision = options?.precision;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n const precision = this.precision ?? autoSelectFloatPrecision(this.value);\n const initial = MT_SIMPLE << 5;\n\n if (precision === 'half') {\n const buf = new Uint8Array(3);\n buf[0] = initial | AI_2BYTE; // 0xf9\n writeFloat16(new DataView(buf.buffer), 1, this.value, false);\n return buf;\n }\n if (precision === 'single') {\n const buf = new Uint8Array(5);\n buf[0] = initial | AI_4BYTE; // 0xfa\n new DataView(buf.buffer).setFloat32(1, this.value, false);\n return buf;\n }\n // double\n const buf = new Uint8Array(9);\n buf[0] = initial | AI_8BYTE; // 0xfb\n new DataView(buf.buffer).setFloat64(1, this.value, false);\n return buf;\n }\n\n _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n const autoSelected = autoSelectFloatPrecision(this.value);\n const numStr =\n options?.floatFormat === 'hex'\n ? floatToHexFloat(this.value)\n : floatValueToString(this.value);\n return numStr + floatSuffix(this.value, this.precision, autoSelected);\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this.value;\n }\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { Tag } from '../tag';\nimport type { AnnotatedLine } from './CborItem';\nimport { MT_TAG } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\n\n/** CBOR Major Type 6 — tagged data item. */\nexport class CborTag extends CborItem {\n readonly tag: bigint;\n readonly content: CborItem;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n tag: number | bigint,\n content: CborItem,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super();\n this.tag = BigInt(tag);\n if (this.tag < 0n)\n throw new RangeError('CborTag tag number must be non-negative');\n this.content = content;\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n return concat([\n writeHead(MT_TAG, this.tag, this.encodingWidth),\n this.content._toCBOR(options),\n ]);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n return `${this.tag}${suffix}(${this.content._toEDN(options, depth)})`;\n }\n\n override _toHexDump(depth: number, options?: ToEDNOptions): AnnotatedLine[] {\n const toHex = (bytes: Uint8Array) =>\n Array.from(bytes, (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: toHex(writeHead(MT_TAG, this.tag, this.encodingWidth)),\n comment: `Tag ${this.tag}`,\n },\n ];\n lines.push(...this.content._toHexDump(depth + 1, options));\n return lines;\n }\n\n _toJS(options?: ToJSOptions): unknown {\n return Tag.set(this.content._toJS(options), this.tag);\n }\n}\n","/**\n * EDN lexer (internal).\n *\n * Used by parser.ts for parsing and by CborTextString serialization to collect\n * source offsets after parseEDN() has already validated embedded CBOR-EDN.\n */\n\nexport type TokenType =\n | 'INTEGER'\n | 'FLOAT'\n | 'TSTR'\n | 'SQSTR'\n | 'RAWSTRING'\n | 'BYTES_HEX'\n | 'BYTES_HEX_ELIDED'\n | 'BYTES_B64'\n | 'BYTES_B32'\n | 'BYTES_H32'\n | 'APP_STRING'\n | 'APP_SEQUENCE'\n | 'EMPTY_INDEF_BYTES'\n | 'EMPTY_INDEF_TEXT'\n | 'TRUE'\n | 'FALSE'\n | 'NULL'\n | 'UNDEFINED'\n | 'SIMPLE'\n | 'LBRACKET'\n | 'RBRACKET'\n | 'LBRACE'\n | 'RBRACE'\n | 'LPAREN'\n | 'RPAREN'\n | 'COLON'\n | 'COMMA'\n | 'PLUS'\n | 'UNDERSCORE'\n | 'ENCODING_INDICATOR'\n | 'LT_LT'\n | 'GT_GT'\n | 'ELLIPSIS'\n | 'EOF';\n\nexport interface Token {\n type: TokenType;\n /** Processed value: decoded string content, raw number text, raw byte content, etc. */\n value: string;\n /** Original source text for this token. */\n raw: string;\n line: number;\n col: number;\n /** Character offset of the first character of this token in the source input. */\n offset: number;\n /** Character offset just past the last character of this token in the source input. */\n endOffset: number;\n /** Only set when type === 'APP_STRING': the extension prefix (e.g. 'dt', 'DT'). */\n appPrefix?: string;\n}\n\nexport interface TokenizerOptions {\n /** Character offset at which tokenization starts. */\n offset?: number;\n}\n\nexport interface EdnComment {\n kind: 'line' | 'block';\n marker: '#' | '//' | '/*' | '/';\n text: string;\n start: number;\n end: number;\n line: number;\n col: number;\n}\n\nfunction positionAt(\n input: string,\n offset: number\n): { line: number; col: number } {\n let line = 1;\n let col = 1;\n for (let i = 0; i < offset; i++) {\n if (input[i] === '\\n') {\n line++;\n col = 1;\n } else {\n col++;\n }\n }\n return { line, col };\n}\n\nexport class Tokenizer {\n private pos: number;\n private line: number;\n private col: number;\n private _peeked: Token | null = null;\n private _lastConsumedEndOffset: number;\n /** Comments encountered while scanning, appended in source order. */\n readonly comments: EdnComment[] = [];\n constructor(\n private readonly input: string,\n options?: TokenizerOptions\n ) {\n const offset = options?.offset ?? 0;\n if (!Number.isInteger(offset) || offset < 0 || offset > input.length)\n throw new RangeError(\n `EDN parse offset must be an integer between 0 and ${input.length}`\n );\n const position = positionAt(input, offset);\n this.pos = offset;\n this.line = position.line;\n this.col = position.col;\n this._lastConsumedEndOffset = offset;\n }\n\n peek(): Token {\n if (this._peeked === null) this._peeked = this._readNext();\n return this._peeked;\n }\n\n consume(): Token {\n const tok = this._peeked !== null ? this._peeked : this._readNext();\n this._peeked = null;\n this._lastConsumedEndOffset = tok.endOffset;\n return tok;\n }\n\n /** Character offset just past the last character of the most recently consumed token. */\n get lastEndOffset(): number {\n return this._lastConsumedEndOffset;\n }\n\n // ── Internal helpers ─────────────────────────────────────────────────────\n\n private _ch(): string {\n return this.input[this.pos] ?? '';\n }\n private _eof(): boolean {\n return this.pos >= this.input.length;\n }\n\n private _advance(): string {\n const c = this.input[this.pos++] ?? '';\n if (c === '\\n') {\n this.line++;\n this.col = 1;\n } else {\n this.col++;\n }\n return c;\n }\n\n private _fail(msg: string, line = this.line, col = this.col): never {\n throw new SyntaxError(\n `EDN parse error at line ${line}, column ${col}: ${msg}`\n );\n }\n\n private _skipWS(): void {\n for (;;) {\n // Skip whitespace characters\n while (!this._eof() && /\\s/.test(this._ch())) this._advance();\n if (this._eof()) return;\n\n const c = this._ch();\n\n // CBOR-EDN line comment: # to end of line\n if (c === '#') {\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n while (!this._eof() && this._ch() !== '\\n') this._advance();\n this.comments.push({\n kind: 'line',\n marker: '#',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n\n // Comments starting with /\n if (c === '/') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === '/') {\n // EDN end-of-line comment: // to end of line (§2.2)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() !== '\\n') this._advance();\n this.comments.push({\n kind: 'line',\n marker: '//',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n if (next === '*') {\n // EDN block comment: /* ... */ (§2.2)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance();\n this._advance();\n this._skipBlockCommentStar();\n this.comments.push({\n kind: 'block',\n marker: '/*',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n // EDN slash-delimited comment: / ... / (§2.2, first char must not be * or /)\n const start = this.pos;\n const line = this.line;\n const col = this.col;\n this._advance(); // consume opening /\n this._skipBlockCommentSlash();\n this.comments.push({\n kind: 'block',\n marker: '/',\n text: this.input.slice(start, this.pos),\n start,\n end: this.pos,\n line,\n col,\n });\n continue;\n }\n\n return;\n }\n }\n\n /**\n * Skip a comment in a quoted byte string literal (h'', b32'', h32'').\n * Returns true if a comment was consumed, false if the current char is not a\n * comment start. `quote` is the closing delimiter character.\n *\n * Supports / ... /, /* *\\/, //, and # comment forms (§2.2).\n */\n private _skipByteStringComment(quote: string): boolean {\n const ch = this._ch();\n if (ch === '/') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === '/') {\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n return true;\n }\n if (next === '*') {\n this._advance();\n this._advance();\n this._skipBlockCommentStar();\n return true;\n }\n this._advance();\n this._skipBlockCommentSlash();\n return true;\n }\n if (ch === '#') {\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n return true;\n }\n return false;\n }\n\n /**\n * Skip a comment in a raw byte string (h``, b32``, h32``).\n * Called with `i` pointing at the comment-start character.\n * Returns the index after the comment, or -1 if no comment was found.\n *\n * Supports / ... /, /* *\\/, //, and # comment forms (§2.2).\n * `context` is used in unterminated-comment error messages.\n */\n private _skipRawComment(\n raw: string,\n i: number,\n context: string,\n tokenLine: number,\n tokenCol: number\n ): number {\n const ch = raw[i];\n if (ch === '/') {\n i++;\n if (raw[i] === '/') {\n i++;\n while (i < raw.length && raw[i] !== '\\n') i++;\n return i;\n }\n if (raw[i] === '*') {\n i++;\n while (i < raw.length) {\n if (raw[i] === '*' && raw[i + 1] === '/') return i + 2;\n i++;\n }\n return i; // EOF inside comment — fall through; caller will report\n }\n // / … / comment\n while (i < raw.length && raw[i] !== '/') i++;\n if (i >= raw.length)\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: unterminated block comment in ${context}`\n );\n return i + 1; // consume closing /\n }\n if (ch === '#') {\n while (i < raw.length && raw[i] !== '\\n') i++;\n return i;\n }\n return -1; // not a comment\n }\n\n /** Skip content until a closing `/` (CBOR-EDN block comment). */\n private _skipBlockCommentSlash(): void {\n const line = this.line,\n col = this.col;\n while (!this._eof()) {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof()) this._advance();\n continue;\n }\n if (this._ch() === '/') break;\n this._advance();\n }\n if (this._eof()) this._fail('unterminated block comment', line, col);\n this._advance(); // consume closing /\n }\n\n /** Skip content until a closing `*\\/` (JSONC block comment). */\n private _skipBlockCommentStar(): void {\n const line = this.line,\n col = this.col;\n while (!this._eof()) {\n if (this._ch() === '*' && (this.input[this.pos + 1] ?? '') === '/') {\n this._advance();\n this._advance();\n return;\n }\n this._advance();\n }\n this._fail('unterminated block comment', line, col);\n }\n\n /**\n * Read content between `quote` delimiters, processing escape sequences.\n *\n * Strict spec compliance:\n * - Literal LF (U+000A) is allowed; all other C0 controls and U+007F are rejected.\n * - Literal CR (U+000D) is silently stripped (source-level CRLF normalisation).\n * - Only spec-defined escape sequences are accepted; `\\q` etc. throw SyntaxError.\n * - `\\/` is valid in both single- and double-quoted strings.\n * - `\\\\` (backslash) is always a valid escape.\n * - `\\uXXXX` for a high surrogate must be immediately followed by `\\uXXXX` for\n * the corresponding low surrogate; lone surrogates are rejected.\n * - `\\u{N}` … `\\u{10FFFF}` extended syntax is supported; surrogates are rejected.\n * - In single-quoted strings, `\\u` escapes to printable ASCII (U+0020–U+007E)\n * are forbidden (hexchar-s restriction, draft §2.5.2 / §5.1).\n */\n private _readStringContent(quote: string): string {\n this._advance(); // opening quote\n let out = '';\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n\n // Strip literal CR (cross-platform source normalisation — spec §2.5.1)\n if (ch === '\\r') {\n this._advance();\n continue;\n }\n\n // Reject unescaped C0 control characters (except LF) and DEL — spec §5.1 unescaped\n const cp = ch.codePointAt(0)!;\n if ((cp < 0x20 && cp !== 0x0a) || cp === 0x7f)\n this._fail(\n `unescaped control character U+${cp.toString(16).padStart(4, '0')} is not allowed in string literals`\n );\n\n if (ch === '\\\\') {\n this._advance();\n const eLine = this.line,\n eCol = this.col;\n const e = this._advance();\n switch (e) {\n case 'n':\n out += '\\n';\n break;\n case 'r':\n out += '\\r';\n break;\n case 't':\n out += '\\t';\n break;\n case 'b':\n out += '\\b';\n break;\n case 'f':\n out += '\\f';\n break;\n case '\\\\':\n out += '\\\\';\n break;\n case 'u':\n out += this._readUnicodeEscape(quote);\n break;\n default:\n // Escaped delimiter char (e.g. \\' inside '...' or \\\" inside \"...\")\n if (e === quote) {\n out += e;\n break;\n }\n if (e === '/') {\n out += '/';\n break;\n }\n this._fail(\n `invalid escape sequence \\\\${e} in ${quote === '\"' ? 'double' : 'single'}-quoted string`,\n eLine,\n eCol\n );\n }\n } else {\n out += this._advance();\n }\n }\n if (this._eof()) this._fail('unterminated string literal');\n this._advance(); // closing quote\n return out;\n }\n\n /**\n * Parse a Unicode escape immediately after `\\u` has been consumed.\n *\n * @param quote - The enclosing string delimiter (`\"` or `'`).\n *\n * Handles two forms:\n * - `\\u{N}` … `\\u{10FFFF}`: direct Unicode scalar value (surrogates rejected)\n * - `\\uXXXX`: exactly four hex digits; a high surrogate must be followed by\n * `\\uXXXX` for the matching low surrogate to form a valid surrogate pair,\n * which is then decoded into the corresponding non-BMP code point.\n *\n * In single-quoted strings (`quote === \"'\"`), `\\u` escapes that resolve to\n * printable ASCII (U+0020–U+007E) are rejected per draft §2.5.2 / §5.1\n * hexchar-s, except for backslash (U+005C) and single-quote (U+0027), which\n * require escaping and cannot be written literally.\n */\n private _readUnicodeEscape(quote: string): string {\n const line = this.line,\n col = this.col;\n\n /** Throw if this is a single-quoted string and the code point is printable ASCII that can be written literally. */\n const checkSingleQuotedPrintable = (cp: number): void => {\n // Backslash (0x5C) and the quote delimiter (0x27) require escaping even in single-quoted\n // strings, so \\u{} is a valid alternative to \\\\ and \\'. All other printable ASCII chars\n // must be written literally per hexchar-s.\n if (\n quote === \"'\" &&\n cp >= 0x20 &&\n cp <= 0x7e &&\n cp !== 0x5c &&\n cp !== 0x27\n )\n this._fail(\n `\\\\u escape for printable ASCII U+${cp.toString(16).padStart(4, '0')} is not allowed in single-quoted strings; write the character literally`,\n line,\n col\n );\n };\n\n // Extended form \\u{NNN}\n if (!this._eof() && this._ch() === '{') {\n this._advance(); // {\n let hex = '';\n while (!this._eof() && this._ch() !== '}') {\n const c = this._ch();\n if (!/[0-9a-fA-F]/.test(c))\n this._fail(\n `invalid character in \\\\u{} escape: ${JSON.stringify(c)}`,\n line,\n col\n );\n hex += this._advance();\n }\n if (this._eof()) this._fail('unterminated \\\\u{} escape', line, col);\n this._advance(); // }\n if (hex.length === 0) this._fail('empty \\\\u{} escape', line, col);\n const cp = parseInt(hex, 16);\n if (cp > 0x10_ffff)\n this._fail(\n `\\\\u{${hex}} exceeds maximum Unicode code point U+10FFFF`,\n line,\n col\n );\n if (cp >= 0xd800 && cp <= 0xdfff)\n this._fail(\n `\\\\u{${hex}} is a surrogate code point, which is not a valid Unicode scalar value`,\n line,\n col\n );\n checkSingleQuotedPrintable(cp);\n return String.fromCodePoint(cp);\n }\n\n // Standard form \\uXXXX\n let hex = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof()) this._fail('truncated \\\\uXXXX escape', line, col);\n const c = this._ch();\n if (!/[0-9a-fA-F]/.test(c))\n this._fail(\n `invalid hex digit in \\\\uXXXX escape: ${JSON.stringify(c)}`,\n line,\n col\n );\n hex += this._advance();\n }\n const cp = parseInt(hex, 16);\n\n // High surrogate: must be immediately followed by a low-surrogate escape\n if (cp >= 0xd800 && cp <= 0xdbff) {\n if (this._ch() !== '\\\\' || (this.input[this.pos + 1] ?? '') !== 'u')\n this._fail(\n `lone high surrogate \\\\u${hex} must be followed by \\\\uDC00–\\\\uDFFF`,\n line,\n col\n );\n this._advance(); // \\\n this._advance(); // u\n const line2 = this.line,\n col2 = this.col;\n let hex2 = '';\n for (let i = 0; i < 4; i++) {\n if (this._eof())\n this._fail('truncated low-surrogate escape', line2, col2);\n hex2 += this._advance();\n }\n const cp2 = parseInt(hex2, 16);\n if (cp2 < 0xdc00 || cp2 > 0xdfff)\n this._fail(\n `\\\\u${hex} (high surrogate) not followed by a valid low surrogate (got \\\\u${hex2})`,\n line,\n col\n );\n // Surrogate pairs always resolve to non-BMP (> U+FFFF), never printable ASCII\n return String.fromCodePoint(\n 0x10000 + (cp - 0xd800) * 0x400 + (cp2 - 0xdc00)\n );\n }\n\n // Low surrogate without a preceding high surrogate is invalid\n if (cp >= 0xdc00 && cp <= 0xdfff)\n this._fail(`lone low surrogate \\\\u${hex} is not valid`, line, col);\n\n checkSingleQuotedPrintable(cp);\n return String.fromCharCode(cp);\n }\n\n /**\n * Read raw text-string content between N-backtick delimiters (§2.5.3).\n *\n * - The opening delimiter is the maximal run of consecutive backticks (N ≥ 1).\n * - A single leading newline (LF or CRLF) immediately after the opening is stripped.\n * - No escape sequences are processed — content is taken verbatim.\n * - Literal CR is stripped for source-level CRLF normalisation.\n * - The closing delimiter is the first run of M ≥ N backticks; any excess\n * M-N backticks are appended to the content before closing.\n */\n private _readRawStringContent(): string {\n const openLine = this.line,\n openCol = this.col;\n\n // Count opening backticks (greedy)\n let n = 0;\n while (!this._eof() && this._ch() === '`') {\n this._advance();\n n++;\n }\n\n // Strip a single leading CRLF or LF (§2.5.3)\n if (!this._eof() && this._ch() === '\\r') this._advance(); // CR\n if (!this._eof() && this._ch() === '\\n') this._advance(); // LF\n\n let out = '';\n while (!this._eof()) {\n const ch = this._ch();\n\n // Source-level CRLF normalisation: strip bare CR\n if (ch === '\\r') {\n this._advance();\n continue;\n }\n\n if (ch === '`') {\n // Count this backtick run\n let m = 0;\n while (!this._eof() && this._ch() === '`') {\n this._advance();\n m++;\n }\n if (m >= n) {\n // Closing delimiter found; excess backticks become content\n out += '`'.repeat(m - n);\n if (out === '')\n this._fail(\n 'raw string must not be empty (§2.5.3)',\n openLine,\n openCol\n );\n return out;\n }\n // Not enough backticks — all become content\n out += '`'.repeat(m);\n } else {\n const cp = ch.codePointAt(0)!;\n // rawchars = 1*(%x0a/%x0d / %x20-5f / %x61-7e / NONASCII) — HT and other C0 controls forbidden\n if (cp < 0x20 && cp !== 0x0a && cp !== 0x0d) {\n this._fail(\n `raw string content must not contain control character U+${cp.toString(16).toUpperCase().padStart(4, '0')} (§2.5.3)`,\n this.line,\n this.col\n );\n }\n if (cp === 0x7f) {\n this._fail(\n 'raw string content must not contain DEL (U+007F) (§2.5.3)',\n this.line,\n this.col\n );\n }\n out += this._advance();\n }\n }\n\n this._fail('unterminated raw string literal', openLine, openCol);\n }\n\n /**\n * Post-process raw hex content from a `h``…``\\` raw string (§5.3.3).\n *\n * Skips:\n * - lblank whitespace (LF, SP; also CR for source-level normalisation)\n * - `/ … /` block comments\n * - `# …` line comments (up to but not including LF)\n * Detects `...` ellipsis sequences.\n *\n * A trailing `# comment` immediately before the closing delimiter is allowed\n * per §5.3.3 `r-app-string-h`.\n *\n * Returns { value: hex-string-with-ellipsis-markers, elided: boolean }\n */\n private _processRawHexContent(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): { value: string; elided: boolean } {\n let hex = '';\n let elided = false;\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT is still forbidden (rawchars excludes %x09)\n if (ch === '\\t') {\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: horizontal tab (HT) is not allowed inside h\\`\\` raw byte string literals (§5.3.3)`\n );\n }\n // Comments (§2.2)\n const afterComment = this._skipRawComment(\n raw,\n i,\n 'h`` raw byte string',\n tokenLine,\n tokenCol\n );\n if (afterComment !== -1) {\n i = afterComment;\n continue;\n }\n // Ellipsis: ... (three or more dots)\n if (ch === '.' && raw[i + 1] === '.' && raw[i + 2] === '.') {\n i += 3;\n while (i < raw.length && raw[i] === '.') i++;\n hex += '...';\n elided = true;\n continue;\n }\n // Hex digit\n if (/[0-9a-fA-F]/.test(ch)) {\n hex += ch;\n i++;\n continue;\n }\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: unexpected character ${JSON.stringify(ch)} in h\\`\\` raw byte string`\n );\n }\n return { value: hex, elided };\n }\n\n /**\n * Post-process raw base64 content from a `b64``…``\\` raw string (§5.3.4).\n *\n * Skips:\n * - lblank whitespace (LF, SP; also CR for source-level normalisation)\n * - `# …` line comments (up to but not including LF)\n *\n * Returns the stripped base64 string.\n */\n private _processRawB64Content(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): string {\n let out = '';\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT forbidden\n if (ch === '\\t') {\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: horizontal tab (HT) is not allowed inside b64\\`\\` raw byte string literals (§5.3.4)`\n );\n }\n // Line comment: # … (to end of line)\n // Note: // is NOT treated as a comment because / is a valid B64DIGIT\n // (e.g. 0xFF 0xFF encodes to //8= in standard base64).\n if (ch === '#') {\n while (i < raw.length && raw[i] !== '\\n') i++;\n continue;\n }\n out += ch;\n i++;\n }\n return out;\n }\n\n /**\n * Post-process raw base32/base32hex content from `b32``…``\\` / `h32``…``\\` raw strings.\n *\n * Supports all comment forms (§2.2): `/ ... /`, `/*...*\\/`, `//`, `#`.\n * HT is still forbidden (rawchars excludes %x09).\n */\n private _processRawB32Content(\n raw: string,\n tokenLine: number,\n tokenCol: number\n ): string {\n let out = '';\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n // lblank / CR — skip\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n i++;\n continue;\n }\n // HT forbidden\n if (ch === '\\t') {\n throw new SyntaxError(\n `EDN parse error at line ${tokenLine}, column ${tokenCol}: horizontal tab (HT) is not allowed inside b32\\`\\`/h32\\`\\` raw byte string literals (§5.2)`\n );\n }\n // Comments (§2.2)\n const afterComment = this._skipRawComment(\n raw,\n i,\n 'b32``/h32`` raw byte string',\n tokenLine,\n tokenCol\n );\n if (afterComment !== -1) {\n i = afterComment;\n continue;\n }\n out += ch;\n i++;\n }\n return out;\n }\n\n /**\n * Read raw byte-string content between `quote` chars (b64 / b64url).\n *\n * Strips whitespace and skips `# ...` line comments per §2.5.5.\n * `/` is NOT treated as a comment delimiter because it is a valid base64 character.\n */\n private _readByteContent(quote: string): string {\n this._advance(); // opening quote\n let raw = '';\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 — only LF and SP are whitespace (§5.2.2 Fig 4); HT is forbidden\n if (ch === '\\n' || ch === ' ') {\n this._advance();\n continue;\n }\n if (ch === '\\r') {\n // CR is not lblank; skip silently as source-level normalization only\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside byte string literals (§5.2.2)',\n this.line,\n this.col\n );\n }\n // # line comment — stop at newline or the closing quote (whichever comes first)\n // Note: // is NOT treated as a comment here because / is a valid B64DIGIT;\n // treating // as a comment would corrupt base64 data that naturally contains\n // consecutive slashes (e.g. 0xFF 0xFF encodes to //8= in standard base64).\n if (ch === '#') {\n while (!this._eof() && this._ch() !== '\\n') {\n if (this._ch() === '\\\\') {\n this._advance();\n if (!this._eof() && this._ch() !== '\\n') this._advance();\n continue;\n }\n if (this._ch() === quote) break;\n this._advance();\n }\n continue;\n }\n raw += this._advance();\n }\n if (this._eof()) this._fail('unterminated byte string literal');\n this._advance(); // closing quote\n return raw;\n }\n\n /**\n * Read base32 / base32hex byte-string content (`b32'...'` / `h32'...'`).\n *\n * Supports all comment forms (§2.2): `/ ... /`, `/*...*\\/`, `//`, `#`.\n */\n private _readB32Content(quote: string): string {\n this._advance(); // opening quote\n let raw = '';\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 only; HT is forbidden per §5.2 Figure 3\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside byte string literals (§5.2)',\n this.line,\n this.col\n );\n }\n if (this._skipByteStringComment(quote)) continue;\n raw += this._advance();\n }\n if (this._eof()) this._fail('unterminated byte string literal');\n this._advance(); // closing quote\n return raw;\n }\n\n /**\n * Read hex byte-string content, recognising `...` ellipsis sequences (§4.2).\n *\n * Returns the raw hex string (with `...` markers embedded) and a flag\n * indicating whether any ellipsis was found.\n */\n private _readHexByteContentElisionAware(quote: string): {\n value: string;\n elided: boolean;\n } {\n this._advance(); // opening quote\n let hex = '';\n let elided = false;\n while (!this._eof() && this._ch() !== quote) {\n const ch = this._ch();\n // lblank = %x0A / %x20 only; HT is forbidden per §5.2 Figure 3\n if (ch === '\\n' || ch === ' ' || ch === '\\r') {\n this._advance();\n continue;\n }\n if (ch === '\\t') {\n this._fail(\n 'horizontal tab (HT) is not allowed inside hex byte string literals (§5.2.1)',\n this.line,\n this.col\n );\n }\n if (this._skipByteStringComment(quote)) continue;\n // Detect '...' ellipsis inside hex literal\n if (\n ch === '.' &&\n (this.input[this.pos + 1] ?? '') === '.' &&\n (this.input[this.pos + 2] ?? '') === '.'\n ) {\n this._advance();\n this._advance();\n this._advance();\n // consume any additional dots (spec says \"three or more\")\n while (!this._eof() && this._ch() === '.') this._advance();\n // adjacent ... separated only by whitespace collapse into a single ellipsis\n if (!hex.endsWith('...')) hex += '...';\n elided = true;\n continue;\n }\n if (/[0-9a-fA-F]/.test(ch)) {\n hex += this._advance();\n continue;\n }\n this._fail(\n `unexpected character ${JSON.stringify(ch)} in hex byte string`\n );\n }\n if (this._eof()) this._fail('unterminated hex byte string literal');\n this._advance(); // closing quote\n return { value: hex, elided };\n }\n\n // ── Token reader ─────────────────────────────────────────────────────────\n\n private _readNext(): Token {\n this._skipWS();\n const offset = this.pos;\n const tok = this._readNextCore();\n return {\n ...tok,\n raw: this.input.slice(offset, this.pos),\n offset,\n endOffset: this.pos,\n };\n }\n\n private _readNextCore(): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n const line = this.line,\n col = this.col;\n if (this._eof()) return { type: 'EOF', value: '', line, col };\n\n const c = this._ch();\n\n switch (c) {\n case '[':\n this._advance();\n return { type: 'LBRACKET', value: '[', line, col };\n case ']':\n this._advance();\n return { type: 'RBRACKET', value: ']', line, col };\n case '{':\n this._advance();\n return { type: 'LBRACE', value: '{', line, col };\n case '}':\n this._advance();\n return { type: 'RBRACE', value: '}', line, col };\n case '(':\n this._advance();\n return { type: 'LPAREN', value: '(', line, col };\n case ')':\n this._advance();\n return { type: 'RPAREN', value: ')', line, col };\n case ':':\n this._advance();\n return { type: 'COLON', value: ':', line, col };\n case ',':\n this._advance();\n return { type: 'COMMA', value: ',', line, col };\n case '<':\n if ((this.input[this.pos + 1] ?? '') === '<') {\n this._advance();\n this._advance();\n return { type: 'LT_LT', value: '<<', line, col };\n }\n this._fail(`unexpected character '<'`, line, col);\n case '>':\n if ((this.input[this.pos + 1] ?? '') === '>') {\n this._advance();\n this._advance();\n return { type: 'GT_GT', value: '>>', line, col };\n }\n this._fail(`unexpected character '>'`, line, col);\n case '+': {\n const rest1 = this.input.slice(this.pos + 1);\n // +Infinity[_N]\n if (rest1.startsWith('Infinity')) {\n const after = rest1[8] ?? '';\n const hasSuffix =\n after === '_' &&\n /[0-3i]/.test(rest1[9] ?? '') &&\n !/[a-zA-Z0-9_]/.test(rest1[10] ?? '');\n if (!/[a-zA-Z0-9_]/.test(after) || hasSuffix) {\n this._advance(); // +\n for (let i = 0; i < 8; i++) this._advance(); // Infinity\n let value = 'Infinity';\n if (hasSuffix) value += this._advance() + this._advance(); // _N\n return { type: 'FLOAT', value, line, col };\n }\n }\n // Numeric literal with explicit positive sign\n const afterPlus = rest1[0] ?? '';\n if ((afterPlus >= '0' && afterPlus <= '9') || afterPlus === '.') {\n this._advance(); // consume '+'\n return this._readNumber(line, col);\n }\n // String concatenation operator\n this._advance();\n return { type: 'PLUS', value: '+', line, col };\n }\n case '`':\n return {\n type: 'RAWSTRING',\n value: this._readRawStringContent(),\n line,\n col,\n };\n case '\"': {\n const strVal = this._readStringContent('\"');\n if (strVal === '' && this._ch() === '_') {\n this._advance(); // _\n return { type: 'EMPTY_INDEF_TEXT', value: '', line, col };\n }\n return { type: 'TSTR', value: strVal, line, col };\n }\n case \"'\": {\n // ''_ → empty indefinite byte string\n if (\n (this.input[this.pos + 1] ?? '') === \"'\" &&\n (this.input[this.pos + 2] ?? '') === '_'\n ) {\n this._advance(); // first '\n this._advance(); // second '\n this._advance(); // _\n return { type: 'EMPTY_INDEF_BYTES', value: '', line, col };\n }\n // 'text' → UTF-8 encoded byte string (major type 2)\n const strVal = this._readStringContent(\"'\");\n const utf8 = new TextEncoder().encode(strVal);\n const hex = Array.from(utf8, (b) =>\n b.toString(16).padStart(2, '0')\n ).join('');\n return { type: 'SQSTR', value: hex, line, col };\n }\n }\n\n // -Infinity (check before generic '-' handling)\n if (c === '-') {\n const rest = this.input.slice(this.pos + 1);\n if (rest.startsWith('Infinity')) {\n const after = rest[8] ?? '';\n const hasSuffix =\n after === '_' &&\n /[0-3i]/.test(rest[9] ?? '') &&\n !/[a-zA-Z0-9_]/.test(rest[10] ?? '');\n if (!/[a-zA-Z0-9_]/.test(after) || hasSuffix) {\n this._advance(); // -\n for (let i = 0; i < 8; i++) this._advance(); // Infinity\n let value = '-Infinity';\n if (hasSuffix) value += this._advance() + this._advance(); // _N\n return { type: 'FLOAT', value, line, col };\n }\n }\n return this._readNumber(line, col);\n }\n\n if (c === '+') {\n const rest = this.input.slice(this.pos + 1);\n if (rest.startsWith('Infinity')) {\n const after = rest[8] ?? '';\n const hasSuffix =\n after === '_' &&\n /[0-3i]/.test(rest[9] ?? '') &&\n !/[a-zA-Z0-9_]/.test(rest[10] ?? '');\n if (!/[a-zA-Z0-9_]/.test(after) || hasSuffix) {\n this._advance(); // +\n for (let i = 0; i < 8; i++) this._advance(); // Infinity\n let value = 'Infinity';\n if (hasSuffix) value += this._advance() + this._advance(); // _N\n return { type: 'FLOAT', value, line, col };\n }\n }\n this._advance(); // consume '+' (positive sign is a no-op)\n return this._readNumber(line, col);\n }\n\n if (c >= '0' && c <= '9') return this._readNumber(line, col);\n // Leading-dot float: .5, .1e2, etc. (same as +.5 / -.5)\n if (c === '.' && /[0-9]/.test(this.input[this.pos + 1] ?? ''))\n return this._readNumber(line, col);\n if (/[a-zA-Z_]/.test(c)) return this._readIdent(line, col);\n\n // Three or more dots → ellipsis notation (§4.2)\n if (c === '.') {\n if (\n (this.input[this.pos + 1] ?? '') === '.' &&\n (this.input[this.pos + 2] ?? '') === '.'\n ) {\n this._advance();\n this._advance();\n this._advance();\n while (!this._eof() && this._ch() === '.') this._advance();\n return { type: 'ELLIPSIS', value: '...', line, col };\n }\n this._fail(`unexpected character '.'`, line, col);\n }\n\n this._fail(`unexpected character ${JSON.stringify(c)}`, line, col);\n }\n\n private _readNumber(\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n let raw = '';\n if (this._ch() === '-') raw += this._advance();\n\n // Alternative bases: 0x 0o 0b\n if (this._ch() === '0') {\n const next = this.input[this.pos + 1] ?? '';\n if (next === 'x' || next === 'X') {\n raw += this._advance() + this._advance(); // '0x'\n const hexDigitsBefore = raw.length;\n while (!this._eof() && /[0-9a-fA-F]/.test(this._ch()))\n raw += this._advance();\n const hasIntDigits = raw.length > hexDigitsBefore;\n // Hex float: optional '.[hex]' fractional part followed by 'p'/'P' exponent\n let isHexFloat = false;\n let hasFracDigits = false;\n if (!this._eof() && this._ch() === '.') {\n isHexFloat = true;\n raw += this._advance();\n const fracStart = raw.length;\n while (!this._eof() && /[0-9a-fA-F]/.test(this._ch()))\n raw += this._advance();\n hasFracDigits = raw.length > fracStart;\n }\n if (!this._eof() && (this._ch() === 'p' || this._ch() === 'P')) {\n isHexFloat = true;\n // Validate mantissa: need at least one hex digit before or after dot\n if (!hasIntDigits && !hasFracDigits)\n this._fail(`hex float has no mantissa digits: ${raw}`, line, col);\n raw += this._advance();\n if (!this._eof() && (this._ch() === '+' || this._ch() === '-'))\n raw += this._advance();\n const expStart = raw.length;\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '9')\n raw += this._advance();\n // Validate exponent: at least one decimal digit required\n if (raw.length === expStart)\n this._fail(`hex float missing exponent digits: ${raw}`, line, col);\n } else if (isHexFloat) {\n // Had a dot but no 'p' — missing exponent\n this._fail(`hex float missing 'p' exponent: ${raw}`, line, col);\n }\n if (isHexFloat) {\n // Encoding-indicator suffix _0/_1/_2/_3/_i for hex floats\n if (this._ch() === '_') {\n const d = this.input[this.pos + 1] ?? '';\n const after = this.input[this.pos + 2] ?? '';\n if (\n (d === '0' || d === '1' || d === '2' || d === '3' || d === 'i') &&\n !/[0-9a-zA-Z_]/.test(after)\n ) {\n raw += this._advance() + this._advance();\n }\n }\n return { type: 'FLOAT', value: raw, line, col };\n }\n return { type: 'INTEGER', value: raw, line, col };\n }\n if (next === 'o' || next === 'O') {\n raw += this._advance() + this._advance();\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '7')\n raw += this._advance();\n return { type: 'INTEGER', value: raw, line, col };\n }\n if (next === 'b' || next === 'B') {\n raw += this._advance() + this._advance();\n while (!this._eof() && (this._ch() === '0' || this._ch() === '1'))\n raw += this._advance();\n return { type: 'INTEGER', value: raw, line, col };\n }\n }\n\n // Decimal digits\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '9')\n raw += this._advance();\n\n let isFloat = false;\n if (!this._eof() && this._ch() === '.') {\n isFloat = true;\n raw += this._advance();\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '9')\n raw += this._advance();\n }\n if (!this._eof() && (this._ch() === 'e' || this._ch() === 'E')) {\n isFloat = true;\n raw += this._advance();\n if (!this._eof() && (this._ch() === '+' || this._ch() === '-'))\n raw += this._advance();\n const expStart = raw.length;\n while (!this._eof() && this._ch() >= '0' && this._ch() <= '9')\n raw += this._advance();\n if (raw.length === expStart)\n this._fail(\n `float exponent has no digits: ${JSON.stringify(raw)}`,\n line,\n col\n );\n }\n\n // Encoding-indicator suffix _0 / _1 / _2 / _3 (no whitespace, not followed by more ident chars)\n if (this._ch() === '_') {\n const d = this.input[this.pos + 1] ?? '';\n const after = this.input[this.pos + 2] ?? '';\n if (\n (d === '0' || d === '1' || d === '2' || d === '3' || d === 'i') &&\n !/[0-9a-zA-Z_]/.test(after)\n ) {\n // Include the suffix in the raw value.\n // isFloat is NOT set here — a float is only a float when it contains\n // '.' or 'e'/'E'. The parser extracts encoding width from the suffix.\n raw += this._advance() + this._advance();\n }\n }\n\n return { type: isFloat ? 'FLOAT' : 'INTEGER', value: raw, line, col };\n }\n\n private _readIdent(\n line: number,\n col: number\n ): Omit<Token, 'raw' | 'offset' | 'endOffset'> {\n let ident = '';\n while (!this._eof() && /[a-zA-Z0-9_]/.test(this._ch()))\n ident += this._advance();\n\n // Known keywords — checked first so they are never shadowed by app-strings.\n switch (ident) {\n case 'true':\n return { type: 'TRUE', value: ident, line, col };\n case 'false':\n return { type: 'FALSE', value: ident, line, col };\n case 'null':\n return { type: 'NULL', value: ident, line, col };\n case 'undefined':\n return { type: 'UNDEFINED', value: ident, line, col };\n case 'NaN':\n case 'NaN_0':\n case 'NaN_1':\n case 'NaN_2':\n case 'NaN_3':\n case 'NaN_i':\n case 'Infinity':\n case 'Infinity_0':\n case 'Infinity_1':\n case 'Infinity_2':\n case 'Infinity_3':\n case 'Infinity_i':\n return { type: 'FLOAT', value: ident, line, col };\n case 'simple':\n return { type: 'SIMPLE', value: ident, line, col };\n case '_':\n return { type: 'UNDERSCORE', value: '_', line, col };\n // Encoding indicators used in array/map/string/bytes contexts\n case '_0':\n return { type: 'ENCODING_INDICATOR', value: '0', line, col };\n case '_1':\n return { type: 'ENCODING_INDICATOR', value: '1', line, col };\n case '_2':\n return { type: 'ENCODING_INDICATOR', value: '2', line, col };\n case '_3':\n return { type: 'ENCODING_INDICATOR', value: '3', line, col };\n case '_i':\n return { type: 'ENCODING_INDICATOR', value: 'i', line, col };\n }\n\n // Byte-string prefixes or app-string extensions.\n // App-prefix grammar (§3 of draft-ietf-cbor-edn-literals):\n // app-prefix = lcalpha *lcldh / ucalpha *ucldh\n // lcldh = lcalpha / DIGIT / \"-\"\n // ucldh = ucalpha / DIGIT / \"-\"\n // Mixed-case or underscore-containing idents are not valid app-prefixes.\n const firstChar = ident[0] ?? '';\n const isLower = firstChar >= 'a' && firstChar <= 'z';\n const isUpper = firstChar >= 'A' && firstChar <= 'Z';\n\n if (isLower || isUpper) {\n // Validate chars already consumed by the main loop (no underscore, correct case).\n const restAlreadyRead = ident.slice(1);\n const restValid = isLower\n ? /^[a-z0-9]*$/.test(restAlreadyRead)\n : /^[A-Z0-9]*$/.test(restAlreadyRead);\n\n if (restValid) {\n // Extend the prefix with any remaining lcldh / ucldh chars.\n // The main loop stops at '-', so we need to consume hyphen-segments here.\n while (!this._eof()) {\n const ch = this._ch();\n const validCh = isLower\n ? (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch === '-'\n : (ch >= 'A' && ch <= 'Z') ||\n (ch >= '0' && ch <= '9') ||\n ch === '-';\n if (!validCh) break;\n ident += this._advance();\n }\n\n const q = this._ch();\n // Double quotes are not valid for app-string / byte-string prefixes.\n // app-string = app-prefix sqstr (sqstr uses single quotes only)\n if (q === '\"')\n this._fail(\n `\"${ident}\" prefix requires single quotes or backticks, not double quotes`,\n line,\n col\n );\n if (q === \"'\") {\n switch (ident) {\n case 'h': {\n const { value: hexVal, elided } =\n this._readHexByteContentElisionAware(q);\n return {\n type: elided ? 'BYTES_HEX_ELIDED' : 'BYTES_HEX',\n value: hexVal,\n line,\n col,\n };\n }\n case 'b64':\n return {\n type: 'BYTES_B64',\n value: this._readByteContent(q),\n line,\n col,\n };\n case 'b32':\n return {\n type: 'BYTES_B32',\n value: this._readB32Content(q),\n line,\n col,\n };\n case 'h32':\n return {\n type: 'BYTES_H32',\n value: this._readB32Content(q),\n line,\n col,\n };\n default:\n return {\n type: 'APP_STRING',\n appPrefix: ident,\n value: this._readStringContent(q),\n line,\n col,\n };\n }\n }\n\n // app-rstring: prefix followed by backtick raw string (§2.5.3 / app-rstring)\n if (q === '`') {\n const raw = this._readRawStringContent();\n switch (ident) {\n case 'h': {\n // §5.3.3: lblank + / / block comments + # line comments + ellipsis\n const { value: hexVal, elided } = this._processRawHexContent(\n raw,\n line,\n col\n );\n return {\n type: elided ? 'BYTES_HEX_ELIDED' : 'BYTES_HEX',\n value: hexVal,\n line,\n col,\n };\n }\n case 'b64':\n // §5.3.4: lblank + # line comments\n return {\n type: 'BYTES_B64',\n value: this._processRawB64Content(raw, line, col),\n line,\n col,\n };\n case 'b32':\n return {\n type: 'BYTES_B32',\n value: this._processRawB32Content(raw, line, col),\n line,\n col,\n };\n case 'h32':\n return {\n type: 'BYTES_H32',\n value: this._processRawB32Content(raw, line, col),\n line,\n col,\n };\n default:\n return {\n type: 'APP_STRING',\n appPrefix: ident,\n value: raw,\n line,\n col,\n };\n }\n }\n\n // App-sequence extension: prefix<<items...>>\n // The tokenizer consumes only prefix + \"<<\"; the parser reads items until \">>\".\n if (q === '<' && (this.input[this.pos + 1] ?? '') === '<') {\n this._advance();\n this._advance(); // <<\n return {\n type: 'APP_SEQUENCE',\n appPrefix: ident,\n value: '',\n line,\n col,\n };\n }\n }\n }\n\n this._fail(`unknown identifier ${JSON.stringify(ident)}`, line, col);\n }\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_BYTES } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\nimport { serializeBytes } from '../edn/serialize-utils';\n\n/** CBOR Major Type 2 — definite-length byte string. */\nexport class CborByteString extends CborItem {\n readonly indefiniteLength = false as const;\n readonly value: Uint8Array;\n /** Preferred EDN encoding for this byte string. */\n readonly ednEncoding: 'hex' | 'base64' | 'base64url' | 'base32' | 'base32hex';\n readonly encodingWidth: EncodingWidth | undefined;\n readonly ednSource: string | undefined;\n\n constructor(\n value: Uint8Array,\n options?: {\n ednEncoding?: 'hex' | 'base64' | 'base64url' | 'base32' | 'base32hex';\n encodingWidth?: EncodingWidth;\n ednSource?: string;\n }\n ) {\n super();\n this.value = value;\n this.ednEncoding = options?.ednEncoding ?? 'hex';\n this.encodingWidth = options?.encodingWidth;\n this.ednSource = options?.ednSource;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n return concat([\n writeHead(MT_BYTES, BigInt(this.value.length), this.encodingWidth),\n this.value,\n ]);\n }\n\n _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n if (options?.preserveByteString && this.ednSource !== undefined)\n return this.ednSource + suffix;\n const encoding = options?.bstrEncoding ?? this.ednEncoding;\n return serializeBytes(this.value, encoding, options?.sqstr) + suffix;\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this.value;\n }\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport type { CborByteString } from './CborByteString';\nimport { MT_BYTES, AI_INDEFINITE, BREAK_CODE } from '../cbor/constants';\nimport { concat } from '../cbor/encode';\n\n/** CBOR Major Type 2 — indefinite-length byte string (chunked). */\nexport class CborIndefiniteByteString extends CborItem {\n readonly indefiniteLength = true as const;\n readonly chunks: CborByteString[];\n\n constructor(chunks: CborByteString[]) {\n super();\n this.chunks = chunks;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n const parts: Uint8Array[] = [\n new Uint8Array([(MT_BYTES << 5) | AI_INDEFINITE]),\n ];\n for (const chunk of this.chunks) parts.push(chunk._toCBOR(options));\n parts.push(new Uint8Array([BREAK_CODE]));\n return concat(parts);\n }\n\n _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n if (this.chunks.length === 0) return \"''_\";\n const chunkStrs = this.chunks.map((c) => c._toEDN(options, 0));\n return `(_ ${chunkStrs.join(', ')})`;\n }\n\n override _toHexDump(depth: number, options?: ToEDNOptions): AnnotatedLine[] {\n const byteHex = (b: number) =>\n b.toString(16).toUpperCase().padStart(2, '0');\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: byteHex((MT_BYTES << 5) | AI_INDEFINITE),\n comment: 'Start indefinite-length byte string',\n },\n ];\n for (const chunk of this.chunks)\n lines.push(...chunk._toHexDump(depth + 1, options));\n lines.push({ depth, hex: byteHex(BREAK_CODE), comment: '\"break\"' });\n return lines;\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n const totalLen = this.chunks.reduce((sum, c) => sum + c.value.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const chunk of this.chunks) {\n result.set(chunk.value, offset);\n offset += chunk.value.length;\n }\n return result;\n }\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport type { CborTextString } from './CborTextString';\nimport { MT_TEXT, AI_INDEFINITE, BREAK_CODE } from '../cbor/constants';\nimport { concat } from '../cbor/encode';\n\n/** CBOR Major Type 3 — indefinite-length UTF-8 text string (chunked). */\nexport class CborIndefiniteTextString extends CborItem {\n readonly indefiniteLength = true as const;\n readonly chunks: CborTextString[];\n\n constructor(chunks: CborTextString[]) {\n super();\n this.chunks = chunks;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n const parts: Uint8Array[] = [\n new Uint8Array([(MT_TEXT << 5) | AI_INDEFINITE]),\n ];\n for (const chunk of this.chunks) parts.push(chunk._toCBOR(options));\n parts.push(new Uint8Array([BREAK_CODE]));\n return concat(parts);\n }\n\n _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n if (this.chunks.length === 0) return '\"\"_';\n const chunkStrs = this.chunks.map((c) => c._toEDN(options, 0));\n return `(_ ${chunkStrs.join(', ')})`;\n }\n\n override _toHexDump(depth: number, options?: ToEDNOptions): AnnotatedLine[] {\n const byteHex = (b: number) =>\n b.toString(16).toUpperCase().padStart(2, '0');\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: byteHex((MT_TEXT << 5) | AI_INDEFINITE),\n comment: 'Start indefinite-length text string',\n },\n ];\n for (const chunk of this.chunks)\n lines.push(...chunk._toHexDump(depth + 1, options));\n lines.push({ depth, hex: byteHex(BREAK_CODE), comment: '\"break\"' });\n return lines;\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this.chunks.map((c) => c.value).join('');\n }\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CBOR_OMIT } from '../types';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport { MT_ARRAY, AI_INDEFINITE, BREAK_CODE } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\nimport {\n resolveIndent,\n indentOf,\n resolveSeparators,\n formatDanglingComments,\n formatLeadingComments,\n formatTrailingComments,\n hasContainerLayoutComments,\n hasPreservedComments,\n} from '../edn/serialize-utils';\n\n/** CBOR Major Type 4 — array (definite- or indefinite-length). */\nexport class CborArray extends CborItem {\n readonly items: CborItem[];\n readonly indefiniteLength: boolean;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n items: CborItem[],\n options?: { indefiniteLength?: boolean; encodingWidth?: EncodingWidth }\n ) {\n super();\n this.items = items;\n this.indefiniteLength = options?.indefiniteLength ?? false;\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n if (this.indefiniteLength) {\n const parts: Uint8Array[] = [\n new Uint8Array([(MT_ARRAY << 5) | AI_INDEFINITE]),\n ];\n for (const item of this.items) parts.push(item._toCBOR(options));\n parts.push(new Uint8Array([BREAK_CODE]));\n return concat(parts);\n }\n const parts = [\n writeHead(MT_ARRAY, BigInt(this.items.length), this.encodingWidth),\n ];\n for (const item of this.items) parts.push(item._toCBOR(options));\n return concat(parts);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n let indentStr = resolveIndent(options);\n const preserveComments = options?.preserveComments;\n const hasComments =\n preserveComments &&\n (hasContainerLayoutComments(this) ||\n this.items.some(hasPreservedComments));\n if (indentStr === null && hasComments) indentStr = ' ';\n const { inlineSep, multilineSep, trailSep } = resolveSeparators(\n options,\n indentStr === null\n );\n const eiSuffix =\n !this.indefiniteLength && this.encodingWidth !== undefined\n ? `_${this.encodingWidth} `\n : '';\n\n if (indentStr === null || (this.items.length === 0 && !hasComments)) {\n // single-line\n const inner = this.items\n .map((item) => item._toEDN(options, depth + 1))\n .join(inlineSep);\n if (this.indefiniteLength) {\n return this.items.length === 0 ? '[_ ]' : `[_ ${inner}]`;\n }\n return `[${eiSuffix}${inner}]`;\n }\n\n // multi-line\n const childIndent = indentOf(indentStr, depth + 1);\n const closeIndent = indentOf(indentStr, depth);\n const open = this.indefiniteLength ? '[_ ' : `[${eiSuffix}`;\n const lines: string[] = [];\n for (let i = 0; i < this.items.length; i++) {\n const item = this.items[i];\n if (preserveComments)\n lines.push(...formatLeadingComments(item, childIndent));\n const sep = i < this.items.length - 1 ? multilineSep : trailSep;\n lines.push(\n `${childIndent}${item._toEDN(options, depth + 1)}${sep}${preserveComments ? formatTrailingComments(item) : ''}`\n );\n }\n if (preserveComments)\n lines.push(...formatDanglingComments(this, childIndent));\n const body = lines.join('\\n');\n return `${open}\\n${body}\\n${closeIndent}]`;\n }\n\n override _toHexDump(depth: number, options?: ToEDNOptions): AnnotatedLine[] {\n const byteHex = (b: number) =>\n b.toString(16).toUpperCase().padStart(2, '0');\n const toHex = (bytes: Uint8Array) =>\n Array.from(bytes, (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n\n if (this.indefiniteLength) {\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: byteHex((MT_ARRAY << 5) | AI_INDEFINITE),\n comment: 'Start indefinite-length array',\n },\n ];\n for (const item of this.items)\n lines.push(...item._toHexDump(depth + 1, options));\n lines.push({ depth, hex: byteHex(BREAK_CODE), comment: '\"break\"' });\n return lines;\n }\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: toHex(\n writeHead(MT_ARRAY, BigInt(this.items.length), this.encodingWidth)\n ),\n comment: `Array of length ${this.items.length}`,\n },\n ];\n for (const item of this.items)\n lines.push(...item._toHexDump(depth + 1, options));\n return lines;\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const reviver = options?.reviver;\n if (!reviver) return this.items.map((item) => item._toJS(options));\n // First pass: pre-populate holder with unrevived values so later siblings\n // are still raw when earlier callbacks run (matches JSON.parse sibling timing).\n const optNoReviver = options\n ? { ...options, reviver: undefined }\n : undefined;\n const holder: unknown[] = this.items.map((item) =>\n item._toJS(optNoReviver)\n );\n // Second pass: revive each element depth-first, splice out undefined entries\n // immediately so `this` reflects the compacted in-progress array.\n // Original indices are used as reviver keys; undefined → omit (compact,\n // differs from JSON.parse which leaves holes).\n let deleted = 0;\n for (let i = 0; i < this.items.length; i++) {\n const hIdx = i - deleted;\n const val = this.items[i]._toJS(options);\n const rv = reviver.call(holder, String(i), val);\n const omit =\n rv === CBOR_OMIT || (options?.undefinedOmits && rv === undefined);\n if (omit) {\n holder.splice(hIdx, 1);\n deleted++;\n } else {\n holder[hIdx] = rv;\n }\n }\n return holder;\n }\n}\n","import type {\n CborComment,\n ToEDNOptions,\n ToJSOptions,\n ToCBOROptions,\n} from '../types';\nimport { CBOR_OMIT } from '../types';\nimport { MapEntries } from '../mapEntries';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport { CborTextString } from './CborTextString';\nimport { MT_MAP, AI_INDEFINITE, BREAK_CODE } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\nimport {\n resolveIndent,\n indentOf,\n resolveSeparators,\n formatDanglingComments,\n formatLeadingComments,\n hasContainerLayoutComments,\n hasPreservedComments,\n} from '../edn/serialize-utils';\n\n/** CBOR Major Type 5 — map (definite- or indefinite-length). */\nexport class CborMap extends CborItem {\n readonly entries: [CborItem, CborItem][];\n readonly indefiniteLength: boolean;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(\n entries: [CborItem, CborItem][],\n options?: { indefiniteLength?: boolean; encodingWidth?: EncodingWidth }\n ) {\n super();\n this.entries = entries;\n this.indefiniteLength = options?.indefiniteLength ?? false;\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n if (this.indefiniteLength) {\n const parts: Uint8Array[] = [\n new Uint8Array([(MT_MAP << 5) | AI_INDEFINITE]),\n ];\n for (const [k, v] of this.entries) {\n parts.push(k._toCBOR(options), v._toCBOR(options));\n }\n parts.push(new Uint8Array([BREAK_CODE]));\n return concat(parts);\n }\n const parts = [\n writeHead(MT_MAP, BigInt(this.entries.length), this.encodingWidth),\n ];\n for (const [k, v] of this.entries) {\n parts.push(k._toCBOR(options), v._toCBOR(options));\n }\n return concat(parts);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n let indentStr = resolveIndent(options);\n const preserveComments = options?.preserveComments;\n const hasComments =\n preserveComments &&\n (hasContainerLayoutComments(this) ||\n this.entries.some(\n ([key, value]) =>\n hasPreservedComments(key) || hasPreservedComments(value)\n ));\n if (indentStr === null && hasComments) indentStr = ' ';\n const { inlineSep, multilineSep, trailSep, colSep } = resolveSeparators(\n options,\n indentStr === null\n );\n const eiSuffix =\n !this.indefiniteLength && this.encodingWidth !== undefined\n ? `_${this.encodingWidth} `\n : '';\n const open = this.indefiniteLength ? '{_ ' : `{${eiSuffix}`;\n\n if (indentStr === null || (this.entries.length === 0 && !hasComments)) {\n // single-line\n const inner = this.entries\n .map(\n ([k, v]) =>\n `${k._toEDN(options, depth + 1)}${colSep}${v._toEDN(options, depth + 1)}`\n )\n .join(inlineSep);\n if (this.indefiniteLength) {\n return this.entries.length === 0 ? '{_ }' : `{_ ${inner}}`;\n }\n return `{${eiSuffix}${inner}}`;\n }\n\n // multi-line\n const childIndent = indentOf(indentStr, depth + 1);\n const closeIndent = indentOf(indentStr, depth);\n const lines: string[] = [];\n for (let i = 0; i < this.entries.length; i++) {\n const [k, v] = this.entries[i];\n if (preserveComments) {\n lines.push(...formatLeadingComments(k, childIndent));\n }\n const sep = i < this.entries.length - 1 ? multilineSep : trailSep;\n const entryComments = preserveComments\n ? formatMapEntryTrailingComments([\n ...(k.comments?.trailing ?? []),\n ...(v.comments?.leading ?? []),\n ...(v.comments?.trailing ?? []),\n ])\n : '';\n lines.push(\n `${childIndent}${k._toEDN(options, depth + 1)}${colSep}${v._toEDN(options, depth + 1)}${sep}${entryComments}`\n );\n }\n if (preserveComments)\n lines.push(...formatDanglingComments(this, childIndent));\n const body = lines.join('\\n');\n return `${open}\\n${body}\\n${closeIndent}}`;\n }\n\n override _toHexDump(depth: number, options?: ToEDNOptions): AnnotatedLine[] {\n const byteHex = (b: number) =>\n b.toString(16).toUpperCase().padStart(2, '0');\n const toHex = (bytes: Uint8Array) =>\n Array.from(bytes, (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n\n if (this.indefiniteLength) {\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: byteHex((MT_MAP << 5) | AI_INDEFINITE),\n comment: 'Start indefinite-length map',\n },\n ];\n for (const [k, v] of this.entries) {\n lines.push(...k._toHexDump(depth + 1, options));\n lines.push(...v._toHexDump(depth + 1, options));\n }\n lines.push({ depth, hex: byteHex(BREAK_CODE), comment: '\"break\"' });\n return lines;\n }\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: toHex(\n writeHead(MT_MAP, BigInt(this.entries.length), this.encodingWidth)\n ),\n comment: `Map of length ${this.entries.length}`,\n },\n ];\n for (const [k, v] of this.entries) {\n lines.push(...k._toHexDump(depth + 1, options));\n lines.push(...v._toHexDump(depth + 1, options));\n }\n return lines;\n }\n\n _toJS(options?: ToJSOptions): unknown {\n const reviver = options?.reviver;\n const toEntries = () => {\n const result = MapEntries.from(\n this.entries,\n ([k, v]) => [k._toJS(options), v._toJS(options)] as [unknown, unknown]\n );\n if (!reviver) return result;\n const uOmits = options?.undefinedOmits;\n for (let i = 0; i < result.length; i++) {\n const [k, v] = result[i];\n const rv = reviver.call(result, k, v);\n if (rv === CBOR_OMIT || (uOmits && rv === undefined))\n result.splice(i--, 1);\n else result[i] = [k, rv];\n }\n return result;\n };\n const toObject = () => {\n // First pass: pre-populate holder with unrevived values so all sibling\n // keys are visible in `this` when reviver runs (matches JSON.parse).\n const optNoReviver = options\n ? { ...options, reviver: undefined }\n : undefined;\n const holder: Record<string, unknown> = {};\n for (const [k, v] of this.entries) {\n const key = k instanceof CborTextString ? k.value : k.toEDN();\n const raw = v._toJS(optNoReviver);\n if (key === '__proto__') {\n Object.defineProperty(holder, key, {\n value: raw,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n holder[key] = raw;\n }\n }\n if (!reviver) return holder;\n // Second pass: process each property sequentially depth-first.\n // Only the last occurrence of each key is revived to avoid duplicate\n // callbacks when CBOR maps contain repeated keys.\n const lastIdx = new Map<string, number>();\n for (let i = 0; i < this.entries.length; i++) {\n const [k] = this.entries[i];\n lastIdx.set(k instanceof CborTextString ? k.value : k.toEDN(), i);\n }\n for (let i = 0; i < this.entries.length; i++) {\n const [k, v] = this.entries[i];\n const key = k instanceof CborTextString ? k.value : k.toEDN();\n if (lastIdx.get(key) !== i) continue;\n const val = v._toJS(options);\n const rv = reviver.call(holder, key, val);\n const omit =\n rv === CBOR_OMIT || (options?.undefinedOmits && rv === undefined);\n if (!omit) {\n if (key === '__proto__') {\n Object.defineProperty(holder, key, {\n value: rv,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n holder[key] = rv;\n }\n } else {\n delete holder[key];\n }\n }\n return holder;\n };\n\n if (options?.mapAs === 'entries') return toEntries();\n if (options?.mapAs === 'object') return toObject();\n if (this.entries.every(([k]) => k instanceof CborTextString))\n return toObject();\n return toEntries();\n }\n}\n\nfunction formatMapEntryTrailingComments(comments: CborComment[]): string {\n if (comments.length === 0) return '';\n return ' ' + comments.map((comment) => comment.text.trimEnd()).join(' ');\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { Simple } from '../simple';\nimport { MT_SIMPLE, AI_1BYTE } from '../cbor/constants';\n\n/**\n * CBOR Major Type 7 — simple value (0–255).\n *\n * Well-known values:\n * 20 → false\n * 21 → true\n * 22 → null\n * 23 → undefined\n */\nexport class CborSimple extends CborItem {\n readonly value: number;\n\n constructor(value: number) {\n super();\n if (!Number.isInteger(value) || value < 0 || value > 255)\n throw new RangeError('CborSimple value must be an integer in 0–255');\n this.value = value;\n }\n\n static readonly FALSE = new CborSimple(20);\n static readonly TRUE = new CborSimple(21);\n static readonly NULL = new CborSimple(22);\n static readonly UNDEFINED = new CborSimple(23);\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n // Values 0–23: encoded in the initial byte (MT7 | value)\n if (this.value <= 23)\n return new Uint8Array([(MT_SIMPLE << 5) | this.value]);\n // Values 24–255: MT7, AI_1BYTE, then one value byte\n return new Uint8Array([(MT_SIMPLE << 5) | AI_1BYTE, this.value]);\n }\n\n _toEDN(_options: ToEDNOptions | undefined, _depth: number): string {\n switch (this.value) {\n case 20:\n return 'false';\n case 21:\n return 'true';\n case 22:\n return 'null';\n case 23:\n return 'undefined';\n default:\n return `simple(${this.value})`;\n }\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n switch (this.value) {\n case 20:\n return false;\n case 21:\n return true;\n case 22:\n return null;\n case 23:\n return undefined;\n default:\n return new Simple(this.value);\n }\n }\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport type { AnnotatedLine } from './CborItem';\nimport { MT_BYTES } from '../cbor/constants';\nimport { writeHead, concat } from '../cbor/encode';\nimport {\n resolveIndent,\n indentOf,\n resolveSeparators,\n} from '../edn/serialize-utils';\n\n/**\n * CBOR Sequence Literal (§2.5.6) — `<<item, item, ...>>`.\n *\n * Encodes as a definite-length byte string whose value is the concatenation\n * of the CBOR encodings of the contained items.\n *\n * @example\n * // <<1, 2>> → h'0102'\n * new CborEmbeddedCBOR([new CborUint(1n), new CborUint(2n)])\n */\nexport class CborEmbeddedCBOR extends CborItem {\n readonly items: CborItem[];\n\n constructor(items: CborItem[]) {\n super();\n this.items = items;\n }\n\n /** The raw concatenated CBOR bytes of all contained items. */\n private _content(options?: ToCBOROptions): Uint8Array {\n return concat(this.items.map((item) => item._toCBOR(options)));\n }\n\n _toCBOR(options?: ToCBOROptions): Uint8Array {\n const content = this._content(options);\n return concat([writeHead(MT_BYTES, BigInt(content.length)), content]);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n if (this.items.length === 0) return '<<>>';\n\n const indentStr = resolveIndent(options);\n const { inlineSep, multilineSep, trailSep } = resolveSeparators(\n options,\n indentStr === null\n );\n\n if (indentStr === null) {\n // single-line\n const inner = this.items\n .map((item) => item._toEDN(options, depth + 1))\n .join(inlineSep);\n return `<<${inner}>>`;\n }\n\n // multi-line\n const childIndent = indentOf(indentStr, depth + 1);\n const closeIndent = indentOf(indentStr, depth);\n const lines = this.items.map(\n (item) => `${childIndent}${item._toEDN(options, depth + 1)}`\n );\n const lastIdx = lines.length - 1;\n const body = lines\n .map((line, i) =>\n i < lastIdx ? `${line}${multilineSep}` : `${line}${trailSep}`\n )\n .join('\\n');\n return `<<\\n${body}\\n${closeIndent}>>`;\n }\n\n override _toHexDump(depth: number, options?: ToEDNOptions): AnnotatedLine[] {\n const toHex = (bytes: Uint8Array) =>\n Array.from(bytes, (b) =>\n b.toString(16).toUpperCase().padStart(2, '0')\n ).join(' ');\n\n const content = this._content();\n const n = content.length;\n const lines: AnnotatedLine[] = [\n {\n depth,\n hex: toHex(writeHead(MT_BYTES, BigInt(n))),\n comment: `Embedded CBOR sequence, ${n} byte${n !== 1 ? 's' : ''}`,\n },\n ];\n for (const item of this.items) {\n lines.push(...item._toHexDump(depth + 1, options));\n }\n return lines;\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this._content();\n }\n}\n","/**\n * §4.1 draft-ietf-cbor-edn-literals-20 — Stand-in for unknown app-extensions.\n *\n * When the EDN parser encounters an unrecognised application-extension\n * identifier (the default `unresolvedExtension: 'cpa999'` behaviour), it wraps\n * the literal in a CPA999 tag instead of throwing a SyntaxError.\n *\n * Structure:\n * CPA999([<prefix>, [<content-items...>]])\n *\n * Examples:\n * cri'https://example.com' → CPA999([\"cri\", [\"https://example.com\"]])\n * hash<<\"data\", -44>> → CPA999([\"hash\", [\"data\", -44]])\n *\n * toEDN() reconstructs the original app-string / app-sequence notation:\n * CPA999([\"cri\", [\"https://example.com\"]]) → cri'https://example.com'\n * CPA999([\"hash\", [\"data\", -44]]) → hash<<\"data\", -44>>\n *\n * Note: CPA999 is a provisional tag number (CPA = Code Point Allocation).\n * It will be replaced by an IANA-assigned tag number upon RFC publication.\n */\n\nimport type { ToEDNOptions } from '../types';\nimport { CborTag } from './CborTag';\nimport { CborArray } from './CborArray';\nimport { CborTextString } from './CborTextString';\nimport type { CborItem } from './CborItem';\nimport { escapeAppString } from '../edn/serialize-utils';\n\n/** Provisional tag number for the Unresolved Application-Extension stand-in. */\nexport const CPA999_TAG = 999n;\n\n/**\n * Stand-in for an unrecognised EDN application-extension literal.\n *\n * Structure:\n * App-string: CPA999([prefix, text])\n * App-sequence: CPA999([prefix, [items...]])\n */\nexport class CborUnresolvedAppExt extends CborTag {\n constructor(prefix: string, items: CborItem[]) {\n // App-string: single text item → tag(999, [prefix, text])\n // App-sequence: otherwise → tag(999, [prefix, [items...]])\n const content =\n items.length === 1 && items[0] instanceof CborTextString\n ? items[0]\n : new CborArray(items);\n super(CPA999_TAG, new CborArray([new CborTextString(prefix), content]));\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n const arr = this.content as CborArray;\n const prefix = (arr.items[0] as CborTextString).value;\n const contentItem = arr.items[1];\n\n // Text string → reconstruct app-string form: prefix'content'\n if (contentItem instanceof CborTextString) {\n return `${prefix}${escapeAppString(contentItem.value)}`;\n }\n\n // Array → reconstruct app-sequence form: prefix<<item, item, ...>>\n const contentArr = contentItem as CborArray;\n const inner = contentArr.items\n .map((item) => item._toEDN(options, depth))\n .join(', ');\n return `${prefix}<<${inner}>>`;\n }\n}\n","/**\n * §4.2 draft-ietf-cbor-edn-literals-20 — Ellipsis (Elision) tag.\n *\n * Two forms:\n * 888(null) — subtree elision: a whole data item replaced by ...\n * 888([frag, 888(null), frag, ...])\n * — string/bytes elision: fragments alternating with ellipses\n *\n * Note: CPA888 is a provisional tag number.\n */\n\nimport type { ToEDNOptions } from '../types';\nimport { CborTag } from './CborTag';\nimport { CborArray } from './CborArray';\nimport { CborSimple } from './CborSimple';\nimport type { CborItem } from './CborItem';\n\nexport const CPA888_TAG = 888n;\n\nexport class CborEllipsis extends CborTag {\n /** Subtree elision: 888(null) */\n constructor();\n /** String/bytes elision: 888([items...]) */\n constructor(items: CborItem[]);\n constructor(items?: CborItem[]) {\n if (items === undefined) {\n super(CPA888_TAG, CborSimple.NULL);\n } else {\n super(CPA888_TAG, new CborArray(items));\n }\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n if (this.content instanceof CborSimple) {\n // Subtree elision → \"...\"\n return '...';\n }\n if (this.content instanceof CborArray) {\n // String/bytes elision → frag + ... + frag\n return this.content.items\n .map((item) => item._toEDN(options, depth))\n .join(' + ');\n }\n return super._toEDN(options, depth);\n }\n}\n","/**\n * CBOR bignum tags (RFC 8949 §3.4.3).\n *\n * Tag 2 — unsigned bignum: tag(2, bstr) where bstr is the big-endian\n * encoding of a non-negative integer.\n * Tag 3 — negative bignum: tag(3, bstr) where the value = -1 - unsigned(bstr).\n *\n * These classes are used for integers that fall outside the uint64 / nint64\n * range of CBOR major types 0 and 1:\n * CborBigUint — value ≥ 2^64\n * CborBigNint — value ≤ -(2^64 + 1)\n *\n * toEDN() emits the plain decimal form (e.g. \"18446744073709551616\") so that\n * round-trips through EDN text are human-readable.\n */\n\nimport type { ToEDNOptions, ToJSOptions } from '../types';\nimport { CborTag } from './CborTag';\nimport { CborByteString } from './CborByteString';\n\nexport const BIGNUM_UINT_TAG = 2n;\nexport const BIGNUM_NINT_TAG = 3n;\n\nconst UINT64_MAX = 0xffff_ffff_ffff_ffffn;\nconst NINT64_MIN = -(UINT64_MAX + 1n); // -18446744073709551616n\n\n// ─── Bigint ↔ bytes helpers ───────────────────────────────────────────────────\n\n/**\n * Encode a non-negative bigint as a minimal big-endian byte string.\n * Zero is encoded as the empty byte string per RFC 8949 §3.4.3.\n */\nexport function bigintToBytes(n: bigint): Uint8Array {\n if (n < 0n)\n throw new RangeError('bigintToBytes requires a non-negative value');\n if (n === 0n) return new Uint8Array(0);\n let hex = n.toString(16);\n if (hex.length % 2 !== 0) hex = '0' + hex;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < bytes.length; i++)\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return bytes;\n}\n\n/**\n * Decode a big-endian byte string to a non-negative bigint.\n * Empty bytes → 0n.\n */\nexport function bytesToBigint(bytes: Uint8Array): bigint {\n let n = 0n;\n for (const b of bytes) n = (n << 8n) | BigInt(b);\n return n;\n}\n\n// ─── AST nodes ────────────────────────────────────────────────────────────────\n\n/**\n * Unsigned bignum — integers ≥ 2^64.\n * Wire format: tag(2, big-endian byte string).\n * toEDN() emits the plain decimal integer.\n */\nexport class CborBigUint extends CborTag {\n readonly bigValue: bigint;\n\n constructor(value: bigint) {\n if (value <= UINT64_MAX)\n throw new RangeError(\n `CborBigUint value ${value} fits in CborUint; use CborUint instead`\n );\n super(BIGNUM_UINT_TAG, new CborByteString(bigintToBytes(value)));\n this.bigValue = value;\n }\n\n override _toEDN(_options: ToEDNOptions | undefined, _depth: number): string {\n return this.bigValue.toString();\n }\n\n override _toJS(_options?: ToJSOptions): bigint {\n return this.bigValue;\n }\n}\n\n/**\n * Negative bignum — integers ≤ -(2^64 + 1).\n * Wire format: tag(3, big-endian byte string of (-1 - value)).\n * toEDN() emits the plain decimal integer.\n */\nexport class CborBigNint extends CborTag {\n readonly bigValue: bigint;\n\n constructor(value: bigint) {\n if (value >= NINT64_MIN)\n throw new RangeError(\n `CborBigNint value ${value} fits in CborNint; use CborNint instead`\n );\n super(BIGNUM_NINT_TAG, new CborByteString(bigintToBytes(-1n - value)));\n this.bigValue = value;\n }\n\n override _toEDN(_options: ToEDNOptions | undefined, _depth: number): string {\n return this.bigValue.toString();\n }\n\n override _toJS(_options?: ToJSOptions): bigint {\n return this.bigValue;\n }\n}\n","import {\n Tokenizer,\n type EdnComment,\n type Token,\n type TokenType,\n} from './tokenizer';\nimport type { CborItem } from '../ast/CborItem';\nimport type { CborComment, FromEDNOptions, CborExtension } from '../types';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborIndefiniteByteString } from '../ast/CborIndefiniteByteString';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborIndefiniteTextString } from '../ast/CborIndefiniteTextString';\nimport { CborArray } from '../ast/CborArray';\nimport { CborMap } from '../ast/CborMap';\nimport { CborTag } from '../ast/CborTag';\nimport { CborFloat, type FloatPrecision } from '../ast/CborFloat';\nimport { CborSimple } from '../ast/CborSimple';\nimport { CborEmbeddedCBOR } from '../ast/CborEmbeddedCBOR';\nimport type { EncodingWidth } from '../cbor/encode';\nimport { parseHexFloat } from '../utils/hexfloat';\nimport { BUILTIN_EXTENSIONS } from '../extensions/builtins';\nimport { CborUnresolvedAppExt } from '../ast/CborUnresolvedAppExt';\nimport { CborEllipsis } from '../ast/CborEllipsis';\nimport { CborBigUint, CborBigNint } from '../ast/CborBignum';\n\n// ─── Public entry point ───────────────────────────────────────────────────────\n\n/**\n * Parse a CBOR-EDN diagnostic notation string into a CborItem AST node.\n * Throws SyntaxError on invalid input.\n */\nexport function parseEDN(text: string, options?: FromEDNOptions): CborItem {\n const tokenizer = new Tokenizer(text, { offset: options?.offset });\n const parser = new EDNParser(\n tokenizer,\n options?.extensions,\n options?.unresolvedExtension,\n options?.allowInvalidUtf8,\n options?.allowTrailing\n );\n const node = parser.parse();\n if (options?.preserveComments) attachComments(node, tokenizer.comments, text);\n return node;\n}\n\n// ─── Value helpers ────────────────────────────────────────────────────────────\n\n/** Strip an optional _0/_1/_2/_3/_i encoding-indicator suffix from a raw\n * integer token value and return both the numeric string and the width. */\nfunction parseIntegerRaw(raw: string): {\n numStr: string;\n encodingWidth: EncodingWidth | undefined;\n} {\n let numStr = raw;\n let encodingWidth: EncodingWidth | undefined;\n if (/[_][0-3i]$/.test(raw)) {\n const suffix = raw[raw.length - 1]!;\n encodingWidth = suffix === 'i' ? 'i' : (Number(suffix) as EncodingWidth);\n numStr = raw.slice(0, -2);\n }\n return { numStr, encodingWidth };\n}\n\nfunction parseBigInt(raw: string): bigint {\n if (raw.startsWith('-')) return -BigInt(raw.slice(1));\n return BigInt(raw);\n}\n\nfunction parseFloatToken(raw: string): {\n value: number;\n precision: FloatPrecision | undefined;\n} {\n if (raw === 'NaN') return { value: NaN, precision: undefined };\n if (raw === 'Infinity') return { value: Infinity, precision: undefined };\n if (raw === '-Infinity') return { value: -Infinity, precision: undefined };\n\n // _0 and _i are not valid encoding indicators for floating-point values\n // (floats use _1=half, _2=single, _3=double; _0 is 1-byte integer arg, _i is immediate)\n if (raw.endsWith('_i') || raw.endsWith('_0'))\n throw new SyntaxError(\n `EDN parse error: _0 and _i encoding indicators are not valid for floating-point values`\n );\n\n let numStr = raw;\n let precision: FloatPrecision | undefined;\n if (raw.endsWith('_1')) {\n precision = 'half';\n numStr = raw.slice(0, -2);\n } else if (raw.endsWith('_2')) {\n precision = 'single';\n numStr = raw.slice(0, -2);\n } else if (raw.endsWith('_3')) {\n precision = 'double';\n numStr = raw.slice(0, -2);\n }\n\n // Hex float literal: 0x[hex]p[exp] or -0x[hex]p[exp]\n if (/^-?0[xX]/.test(numStr))\n return { value: parseHexFloat(numStr), precision };\n\n return { value: parseFloat(numStr), precision };\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (Uint8Array as any).fromHex === 'function')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Uint8Array as any).fromHex(hex);\n if (hex.length % 2 !== 0)\n throw new SyntaxError(`hex string has odd length: ${hex.length}`);\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2)\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n return out;\n}\n\nconst B32_ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\nconst H32_ALPHA = '0123456789ABCDEFGHIJKLMNOPQRSTUV';\n\nfunction base32Decode(str: string, alpha: string): Uint8Array {\n // Padding is optional per the ABNF (§5.2.2 analogue for base32); strip it.\n const s = str.replace(/=+$/, '').toUpperCase();\n // RFC 4648 §6: valid unpadded lengths mod 8 are 0, 2, 4, 5, 7.\n // Lengths 1, 3, 6 mod 8 cannot arise from any valid byte sequence.\n const rem = s.length % 8;\n if (rem === 1 || rem === 3 || rem === 6)\n throw new SyntaxError(`invalid base32 length: ${s.length} characters`);\n const lookup = new Uint8Array(128).fill(0xff);\n for (let i = 0; i < alpha.length; i++) lookup[alpha.charCodeAt(i)] = i;\n const out = new Uint8Array(Math.floor((s.length * 5) / 8));\n let buf = 0,\n bufBits = 0,\n outIdx = 0;\n for (const ch of s) {\n const code = ch.charCodeAt(0);\n const val = code < 128 ? lookup[code] : 0xff;\n if (val === 0xff)\n throw new SyntaxError(\n `invalid character in byte string: ${JSON.stringify(ch)}`\n );\n buf = (buf << 5) | val;\n bufBits += 5;\n if (bufBits >= 8) {\n bufBits -= 8;\n out[outIdx++] = (buf >> bufBits) & 0xff;\n }\n }\n // RFC 4648 §3.5: trailing bits in the last quantum must be zero.\n if (bufBits > 0 && (buf & ((1 << bufBits) - 1)) !== 0)\n throw new SyntaxError('non-zero trailing bits in base32 input');\n return out;\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n // Padding is optional but accepted per §5.2.2 ABNF\n // (\"accommodates, but does not require base64 padding\").\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (Uint8Array as any).fromBase64 === 'function') {\n // Detect alphabet from content: base64url uses - or _\n const alphabet = /[-_]/.test(b64) ? 'base64url' : 'base64';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Uint8Array as any).fromBase64(b64, {\n alphabet,\n lastChunkHandling: 'loose',\n });\n }\n // Accept both base64 (+/) and base64url (-_) alphabets.\n // Add padding internally as needed for atob().\n const normalized = b64.replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized + '='.repeat((4 - (normalized.length % 4)) % 4);\n const binary = atob(padded);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n// ─── Comment attachment ──────────────────────────────────────────────────────\n\ninterface NodeInfo {\n node: CborItem;\n start: number;\n end: number;\n}\n\nfunction attachComments(\n root: CborItem,\n comments: EdnComment[],\n source: string\n): void {\n if (comments.length === 0) return;\n const nodes = collectNodes(root);\n const lineAt = buildLineAt(source);\n\n for (const raw of comments) {\n const comment: CborComment = { ...raw };\n const prev = [...nodes]\n .filter((n) => n.end <= raw.start)\n .sort((a, b) => b.end - a.end || b.start - a.start)[0];\n const separatorBeforeComment = prev\n ? source.slice(prev.end, raw.start)\n : '';\n if (\n prev &&\n lineAt(prev.end) === raw.line &&\n !separatorBeforeComment.includes(':')\n ) {\n addComment(prev.node, 'trailing', comment);\n continue;\n }\n\n const container = [...nodes]\n .filter((n) => n.start < raw.start && raw.end < n.end)\n .sort((a, b) => b.start - a.start || a.end - b.end)[0];\n const next = [...nodes]\n .filter((n) => n.start >= raw.end)\n .sort((a, b) => a.start - b.start || b.end - a.end)[0];\n if (!container || (next && next.end <= container.end)) {\n if (next) {\n addComment(next.node, 'leading', comment);\n continue;\n }\n }\n\n addComment(container?.node ?? root, 'dangling', comment);\n }\n}\n\nfunction collectNodes(root: CborItem): NodeInfo[] {\n const out: NodeInfo[] = [];\n const visit = (node: CborItem) => {\n if (node.start !== undefined && node.end !== undefined)\n out.push({ node, start: node.start, end: node.end });\n if (node instanceof CborArray || node instanceof CborEmbeddedCBOR) {\n for (const item of node.items) visit(item);\n return;\n }\n if (node instanceof CborMap) {\n for (const [key, value] of node.entries) {\n visit(key);\n visit(value);\n }\n return;\n }\n if (\n node instanceof CborIndefiniteByteString ||\n node instanceof CborIndefiniteTextString\n ) {\n for (const chunk of node.chunks) visit(chunk);\n return;\n }\n if (node instanceof CborTag) visit(node.content);\n };\n visit(root);\n return out;\n}\n\nfunction addComment(\n node: CborItem,\n placement: 'leading' | 'trailing' | 'dangling',\n comment: CborComment\n): void {\n node.comments ??= {};\n node.comments[placement] ??= [];\n node.comments[placement].push(comment);\n}\n\nfunction buildLineAt(source: string): (offset: number) => number {\n const starts = [0];\n for (let i = 0; i < source.length; i++) {\n if (source[i] === '\\n') starts.push(i + 1);\n }\n return (offset: number): number => {\n let target = Math.max(0, Math.min(source.length, offset));\n if (target > 0 && target === source.length) target--;\n let lo = 0;\n let hi = starts.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (starts[mid] <= target) lo = mid + 1;\n else hi = mid - 1;\n }\n return hi + 1;\n };\n}\n\n// ─── Parser ───────────────────────────────────────────────────────────────────\n\nclass EDNParser {\n /** Lookup from app-prefix → extension (user extensions override built-ins). */\n private readonly extByPrefix: Map<string, CborExtension>;\n /** Lookup from tag number → extension. */\n private readonly extByTag: Map<bigint, CborExtension>;\n\n private readonly unresolvedExtension: 'cpa999' | 'error';\n\n constructor(\n private readonly t: Tokenizer,\n userExtensions?: CborExtension[],\n unresolvedExtension?: 'cpa999' | 'error',\n private readonly allowInvalidUtf8?: boolean,\n private readonly allowTrailing?: boolean\n ) {\n this.extByPrefix = new Map();\n this.extByTag = new Map();\n this.unresolvedExtension = unresolvedExtension ?? 'cpa999';\n for (const ext of [...BUILTIN_EXTENSIONS, ...(userExtensions ?? [])]) {\n for (const prefix of ext.appStringPrefixes ?? [])\n this.extByPrefix.set(prefix, ext);\n for (const tag of ext.tagNumbers ?? []) this.extByTag.set(tag, ext);\n }\n }\n\n parse(): CborItem {\n const value = this.parseValue();\n if (this.allowTrailing) return value;\n const next = this.t.peek();\n if (next.type !== 'EOF') {\n this._fail(\n `unexpected token after value: ${JSON.stringify(next.value)}`,\n next\n );\n }\n return value;\n }\n\n parseValue(): CborItem {\n const start = this.t.peek().offset;\n const node = this._parseValueNode();\n node.start = start;\n node.end = this.t.lastEndOffset;\n return node;\n }\n\n private _parseValueNode(): CborItem {\n const tok = this.t.peek();\n switch (tok.type) {\n case 'INTEGER':\n return this.parseIntegerOrTag();\n case 'FLOAT':\n return this.parseFloat();\n case 'TSTR':\n case 'RAWSTRING':\n return this.parseString();\n case 'BYTES_HEX':\n case 'SQSTR':\n case 'BYTES_B64':\n case 'BYTES_B32':\n case 'BYTES_H32': {\n this.t.consume();\n return this._parseBytesConcat(\n this._decodeBytesToken(tok),\n tok.type,\n tok.raw\n );\n }\n case 'EMPTY_INDEF_BYTES':\n this.t.consume();\n return new CborIndefiniteByteString([]);\n case 'EMPTY_INDEF_TEXT':\n this.t.consume();\n return new CborIndefiniteTextString([]);\n case 'TRUE':\n this.t.consume();\n return CborSimple.TRUE;\n case 'FALSE':\n this.t.consume();\n return CborSimple.FALSE;\n case 'NULL':\n this.t.consume();\n return CborSimple.NULL;\n case 'UNDEFINED':\n this.t.consume();\n return CborSimple.UNDEFINED;\n case 'SIMPLE':\n return this.parseSimple();\n case 'LBRACKET':\n return this.parseArray();\n case 'LBRACE':\n return this.parseMap();\n case 'LPAREN':\n return this.parseIndefGroup();\n case 'LT_LT':\n return this.parseEmbeddedCBOR();\n case 'APP_STRING': {\n this.t.consume();\n const ext = this.extByPrefix.get(tok.appPrefix!);\n if (!ext?.parseAppString) {\n if (this.unresolvedExtension === 'cpa999')\n return new CborUnresolvedAppExt(tok.appPrefix!, [\n new CborTextString(tok.value),\n ]);\n this._fail(\n `unknown app-string extension: ${JSON.stringify(tok.appPrefix)}`,\n tok\n );\n }\n return ext.parseAppString(tok.appPrefix!, tok.value);\n }\n case 'APP_SEQUENCE': {\n this.t.consume();\n const items: CborItem[] = [];\n while (this.t.peek().type !== 'GT_GT') {\n if (this.t.peek().type === 'EOF')\n this._fail(`unterminated ${tok.appPrefix!}<<...>>`, tok);\n if (items.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'GT_GT') break; // trailing comma\n }\n items.push(this.parseValue());\n }\n this.expect('GT_GT');\n const seqExt = this.extByPrefix.get(tok.appPrefix!);\n if (!seqExt) {\n if (this.unresolvedExtension === 'cpa999')\n return new CborUnresolvedAppExt(tok.appPrefix!, items);\n this._fail(\n `unknown app-string extension: ${JSON.stringify(tok.appPrefix)}`,\n tok\n );\n }\n if (!seqExt.parseAppSequence)\n this._fail(\n `app-string extension ${JSON.stringify(tok.appPrefix)} does not support <<...>> form`,\n tok\n );\n return seqExt.parseAppSequence(tok.appPrefix!, items);\n }\n case 'ELLIPSIS': {\n this.t.consume();\n if (this.t.peek().type !== 'PLUS') return new CborEllipsis();\n const items: CborItem[] = [new CborEllipsis()];\n while (this.t.peek().type === 'PLUS') {\n this.t.consume();\n items.push(this.parseValue());\n }\n return new CborEllipsis(items);\n }\n case 'BYTES_HEX_ELIDED': {\n this.t.consume();\n return this._parseHexElidedConcat(tok);\n }\n default:\n this._fail(`unexpected token: ${JSON.stringify(tok.value)}`, tok);\n }\n }\n\n private parseIntegerOrTag(): CborItem {\n const tok = this.t.consume(); // INTEGER\n const { numStr, encodingWidth: embeddedEW } = parseIntegerRaw(tok.value);\n // Hex/octal/binary literals return before the suffix check in the tokenizer,\n // so their encoding indicator arrives as a separate ENCODING_INDICATOR token.\n const encodingWidth =\n embeddedEW !== undefined ? embeddedEW : this.consumeEncodingIndicator();\n const n = parseBigInt(numStr);\n\n // Out-of-range integers become bignum tags per RFC 8949 §3.4.3.\n // Tag numbers must fit in uint64, so a value > UINT64_MAX before '(' is an error.\n if (n > 0xffff_ffff_ffff_ffffn) {\n if (this.t.peek().type === 'LPAREN')\n this._fail('tag number exceeds maximum uint64', tok);\n return new CborBigUint(n);\n }\n if (n < -(0xffff_ffff_ffff_ffffn + 1n)) {\n return new CborBigNint(n);\n }\n\n const intNode =\n n >= 0n\n ? new CborUint(\n n,\n encodingWidth !== undefined ? { encodingWidth } : undefined\n )\n : new CborNint(\n n,\n encodingWidth !== undefined ? { encodingWidth } : undefined\n );\n\n // integer followed by '(' → tagged data item\n if (this.t.peek().type === 'LPAREN') {\n if (!(intNode instanceof CborUint))\n this._fail('tag number must be non-negative', tok);\n this.t.consume(); // (\n const content = this.parseValue();\n this.expect('RPAREN');\n const tagNum = intNode.value;\n const ext = this.extByTag.get(tagNum);\n if (ext?.parseTag) {\n const result = ext.parseTag(tagNum, content);\n if (result !== undefined) return result;\n }\n return new CborTag(\n tagNum,\n content,\n encodingWidth !== undefined ? { encodingWidth } : undefined\n );\n }\n return intNode;\n }\n\n private parseFloat(): CborItem {\n const tok = this.t.consume(); // FLOAT\n const { value, precision } = parseFloatToken(tok.value);\n return new CborFloat(\n value,\n precision !== undefined ? { precision } : undefined\n );\n }\n\n private parseString(): CborItem {\n const tok = this.t.consume(); // STRING\n\n // Fast path: no concatenation\n if (this.t.peek().type !== 'PLUS') {\n const ew = this.consumeEncodingIndicator();\n return new CborTextString(\n tok.value,\n ew !== undefined ? { encodingWidth: ew } : undefined\n );\n }\n\n // Concatenation chain — may include ellipsis, producing CborEllipsis\n let hasEllipsis = false;\n const parts: Array<{ text: string } | { ellipsis: true }> = [\n { text: tok.value },\n ];\n\n while (this.t.peek().type === 'PLUS') {\n this.t.consume(); // +\n const next = this.t.peek();\n if (next.type === 'ELLIPSIS') {\n this.t.consume();\n parts.push({ ellipsis: true });\n hasEllipsis = true;\n } else if (next.type === 'TSTR' || next.type === 'RAWSTRING') {\n this.t.consume();\n parts.push({ text: next.value });\n } else if (this._isBytesToken(next.type)) {\n this.t.consume();\n parts.push({\n text: this._decodeUtf8(this._decodeBytesToken(next), next),\n });\n } else {\n this._fail(\n `expected string or byte string after +, got ${JSON.stringify(next.value)}`,\n next\n );\n }\n }\n\n if (!hasEllipsis) {\n // No ellipsis — join all text fragments into a single CborTextString\n const ew = this.consumeEncodingIndicator();\n return new CborTextString(\n parts.map((p) => ('text' in p ? p.text : '')).join(''),\n ew !== undefined ? { encodingWidth: ew } : undefined\n );\n }\n\n // Build 888([...]) with consolidated adjacent text fragments\n const items: CborItem[] = [];\n let currentText = '';\n for (const part of parts) {\n if ('ellipsis' in part) {\n if (currentText !== '') {\n items.push(new CborTextString(currentText));\n currentText = '';\n }\n items.push(new CborEllipsis());\n } else {\n currentText += part.text;\n }\n }\n if (currentText !== '') items.push(new CborTextString(currentText));\n\n return new CborEllipsis(items);\n }\n\n private _isBytesToken(type: string): boolean {\n return (\n type === 'BYTES_HEX' ||\n type === 'SQSTR' ||\n type === 'BYTES_B64' ||\n type === 'BYTES_B32' ||\n type === 'BYTES_H32'\n );\n }\n\n private _decodeBytesToken(tok: Token): Uint8Array {\n switch (tok.type) {\n case 'BYTES_HEX':\n case 'SQSTR':\n return hexToBytes(tok.value);\n case 'BYTES_B64':\n return base64ToBytes(tok.value);\n case 'BYTES_B32':\n return base32Decode(tok.value, B32_ALPHA);\n case 'BYTES_H32':\n return base32Decode(tok.value, H32_ALPHA);\n default:\n this._fail(`expected byte string token`, tok);\n }\n }\n\n private _decodeUtf8(bytes: Uint8Array, tok: Token): string {\n if (this.allowInvalidUtf8)\n return new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n try {\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch {\n this._fail('byte string in text concatenation is not valid UTF-8', tok);\n }\n }\n\n private _tokenTypeToEdnEncoding(\n type: string\n ): 'hex' | 'base64' | 'base32' | 'base32hex' {\n switch (type) {\n case 'BYTES_B64':\n return 'base64';\n case 'BYTES_B32':\n return 'base32';\n case 'BYTES_H32':\n return 'base32hex';\n default:\n return 'hex';\n }\n }\n\n private _parseBytesConcat(\n first: Uint8Array,\n firstType: string,\n firstSource: string\n ): CborByteString | CborEllipsis {\n if (this.t.peek().type !== 'PLUS') {\n const ew = this.consumeEncodingIndicator();\n const ednEncoding = this._tokenTypeToEdnEncoding(firstType);\n return new CborByteString(first, {\n ednEncoding,\n ednSource: firstSource,\n ...(ew !== undefined ? { encodingWidth: ew } : {}),\n });\n }\n\n // Concatenation chain — may include ellipsis\n let hasEllipsis = false;\n const parts: Array<{ bytes: Uint8Array } | { ellipsis: true }> = [\n { bytes: first },\n ];\n\n while (this.t.peek().type === 'PLUS') {\n this.t.consume(); // +\n const next = this.t.peek();\n if (next.type === 'ELLIPSIS') {\n this.t.consume();\n parts.push({ ellipsis: true });\n hasEllipsis = true;\n } else if (next.type === 'BYTES_HEX_ELIDED') {\n this.t.consume();\n const subItems = this._buildBytesElidedItems(next.value);\n for (const item of subItems) {\n if (item instanceof CborEllipsis) {\n parts.push({ ellipsis: true });\n hasEllipsis = true;\n } else if (item instanceof CborByteString) {\n parts.push({ bytes: item.value });\n }\n }\n } else if (this._isBytesToken(next.type)) {\n this.t.consume();\n parts.push({ bytes: this._decodeBytesToken(next) });\n } else if (next.type === 'TSTR' || next.type === 'RAWSTRING') {\n // Text strings in a byte-leading concat are UTF-8 encoded (same as\n // single-quoted strings and text chunks in indefinite byte strings).\n this.t.consume();\n parts.push({ bytes: new TextEncoder().encode(next.value) });\n } else {\n this._fail(\n `expected byte string after +, got ${JSON.stringify(next.value)}`,\n next\n );\n }\n }\n\n if (!hasEllipsis) {\n const ew = this.consumeEncodingIndicator();\n const allBytes = parts.map((p) =>\n 'bytes' in p ? p.bytes : new Uint8Array(0)\n );\n return new CborByteString(\n this._concatBytes(allBytes),\n ew !== undefined ? { encodingWidth: ew } : undefined\n );\n }\n\n // Build 888([...]) with consolidated adjacent byte fragments\n const items: CborItem[] = [];\n const pending: Uint8Array[] = [];\n const flushPending = () => {\n if (pending.length > 0) {\n items.push(new CborByteString(this._concatBytes([...pending])));\n pending.length = 0;\n }\n };\n for (const part of parts) {\n if ('ellipsis' in part) {\n flushPending();\n items.push(new CborEllipsis());\n } else {\n pending.push(part.bytes);\n }\n }\n flushPending();\n\n return new CborEllipsis(items);\n }\n\n /**\n * Parse a BYTES_HEX_ELIDED token (h'xx...yy') and any trailing + concatenation\n * into a CborEllipsis([h'xx', 888(null), h'yy', ...]).\n */\n private _parseHexElidedConcat(firstTok: Token): CborEllipsis {\n const items = this._buildBytesElidedItems(firstTok.value);\n\n while (this.t.peek().type === 'PLUS') {\n this.t.consume(); // +\n const next = this.t.peek();\n if (next.type === 'ELLIPSIS') {\n this.t.consume();\n items.push(new CborEllipsis());\n } else if (next.type === 'BYTES_HEX_ELIDED') {\n this.t.consume();\n const subItems = this._buildBytesElidedItems(next.value);\n this._mergeFirstBytesItem(items, subItems);\n } else if (this._isBytesToken(next.type)) {\n this.t.consume();\n const bytes = this._decodeBytesToken(next);\n // Append to the last item if it's a CborByteString\n const last = items[items.length - 1];\n if (last instanceof CborByteString) {\n items[items.length - 1] = new CborByteString(\n this._concatBytes([last.value, bytes])\n );\n } else {\n items.push(new CborByteString(bytes));\n }\n } else {\n this._fail(\n `expected byte string after +, got ${JSON.stringify(next.value)}`,\n next\n );\n }\n }\n return new CborEllipsis(items);\n }\n\n private _buildBytesElidedItems(hexWithEllipsis: string): CborItem[] {\n const segments = hexWithEllipsis.split('...');\n const items: CborItem[] = [];\n for (let i = 0; i < segments.length; i++) {\n if (i > 0) items.push(new CborEllipsis());\n if (segments[i].length > 0) {\n items.push(new CborByteString(hexToBytes(segments[i])));\n }\n }\n return items;\n }\n\n private _mergeFirstBytesItem(target: CborItem[], source: CborItem[]): void {\n if (source.length === 0) return;\n const lastTarget = target[target.length - 1];\n const firstSource = source[0];\n if (\n lastTarget instanceof CborByteString &&\n firstSource instanceof CborByteString\n ) {\n target[target.length - 1] = new CborByteString(\n this._concatBytes([lastTarget.value, firstSource.value])\n );\n target.push(...source.slice(1));\n } else {\n target.push(...source);\n }\n }\n\n private _concatBytes(parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((n, p) => n + p.byteLength, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.byteLength;\n }\n return out;\n }\n\n private parseSimple(): CborSimple {\n this.t.consume(); // 'simple'\n this.expect('LPAREN');\n const numTok = this.t.peek();\n if (numTok.type !== 'INTEGER')\n this._fail(\n `expected integer inside simple(), got ${JSON.stringify(numTok.value)}`,\n numTok\n );\n this.t.consume();\n const { numStr } = parseIntegerRaw(numTok.value);\n const n = Number(parseBigInt(numStr));\n this.expect('RPAREN');\n return new CborSimple(n);\n }\n\n private parseEmbeddedCBOR(): CborEmbeddedCBOR {\n this.t.consume(); // <<\n const items: CborItem[] = [];\n while (this.t.peek().type !== 'GT_GT') {\n if (items.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'GT_GT') break; // trailing comma\n }\n items.push(this.parseValue());\n }\n this.expect('GT_GT');\n return new CborEmbeddedCBOR(items);\n }\n\n private parseArray(): CborArray {\n this.t.consume(); // [\n let indefiniteLength = false;\n let encodingWidth: EncodingWidth | undefined;\n if (this.t.peek().type === 'UNDERSCORE') {\n this.t.consume();\n indefiniteLength = true;\n } else if (this.t.peek().type === 'ENCODING_INDICATOR') {\n const v = this.t.consume().value;\n encodingWidth = v === 'i' ? 'i' : (Number(v) as EncodingWidth);\n }\n const items: CborItem[] = [];\n while (this.t.peek().type !== 'RBRACKET') {\n if (items.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'RBRACKET') break; // trailing comma\n }\n items.push(this.parseValue());\n }\n this.expect('RBRACKET');\n return new CborArray(items, { indefiniteLength, encodingWidth });\n }\n\n private parseMap(): CborMap {\n this.t.consume(); // {\n let indefiniteLength = false;\n let encodingWidth: EncodingWidth | undefined;\n if (this.t.peek().type === 'UNDERSCORE') {\n this.t.consume();\n indefiniteLength = true;\n } else if (this.t.peek().type === 'ENCODING_INDICATOR') {\n const v = this.t.consume().value;\n encodingWidth = v === 'i' ? 'i' : (Number(v) as EncodingWidth);\n }\n const entries: [CborItem, CborItem][] = [];\n while (this.t.peek().type !== 'RBRACE') {\n if (entries.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'RBRACE') break; // trailing comma\n }\n const key = this.parseValue();\n this.expect('COLON');\n const val = this.parseValue();\n entries.push([key, val]);\n }\n this.expect('RBRACE');\n return new CborMap(entries, { indefiniteLength, encodingWidth });\n }\n\n /** Parses `(_ chunk, chunk, ...)` — indefinite byte or text string. */\n private parseIndefGroup():\n | CborIndefiniteByteString\n | CborIndefiniteTextString {\n this.t.consume(); // (\n const us = this.t.peek();\n if (us.type !== 'UNDERSCORE')\n this._fail(`expected _ after (, got ${JSON.stringify(us.value)}`, us);\n this.t.consume(); // _\n\n const chunks: CborItem[] = [];\n while (this.t.peek().type !== 'RPAREN') {\n if (chunks.length > 0 && this.t.peek().type === 'COMMA') {\n this.t.consume();\n if (this.t.peek().type === 'RPAREN') break; // trailing comma\n }\n chunks.push(this.parseValue());\n }\n this.expect('RPAREN');\n\n if (chunks.length === 0)\n this._fail(\n 'empty indefinite group (_ ) is ambiguous; use \\'\\'_ for bytes or \"\"_ for text'\n );\n\n const first = chunks[0];\n // All chunks must be the same type — mixing byte and text strings is\n // a SyntaxError per draft §2.5.4.\n if (first instanceof CborByteString) {\n const byteChunks = chunks.map((c, i) => {\n if (c instanceof CborByteString) return c;\n this._fail(\n `indefinite byte string chunk ${i} must be a byte string, not a text string`\n );\n });\n return new CborIndefiniteByteString(byteChunks);\n }\n if (first instanceof CborTextString) {\n const textChunks = chunks.map((c, i) => {\n if (c instanceof CborTextString) return c;\n this._fail(\n `indefinite text string chunk ${i} must be a text string, not a byte string`\n );\n });\n return new CborIndefiniteTextString(textChunks);\n }\n this._fail('indefinite group chunks must be byte strings or text strings');\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────────\n\n /** Consume an ENCODING_INDICATOR token if present, returning the width. */\n private consumeEncodingIndicator(): EncodingWidth | undefined {\n if (this.t.peek().type === 'ENCODING_INDICATOR') {\n const v = this.t.consume().value;\n return v === 'i' ? 'i' : (Number(v) as EncodingWidth);\n }\n return undefined;\n }\n\n private expect(type: TokenType): Token {\n const tok = this.t.consume();\n if (tok.type !== type)\n this._fail(\n `expected ${type}, got ${tok.type} (${JSON.stringify(tok.value)})`,\n tok\n );\n return tok;\n }\n\n private _fail(msg: string, tok?: Token): never {\n const loc = tok ? ` at line ${tok.line}, column ${tok.col}` : '';\n throw new SyntaxError(`EDN parse error${loc}: ${msg}`);\n }\n}\n","import type { ToEDNOptions, ToJSOptions, ToCBOROptions } from '../types';\nimport { CborItem } from './CborItem';\nimport { MT_TEXT } from '../cbor/constants';\nimport { writeHead, concat, type EncodingWidth } from '../cbor/encode';\nimport { parseEDN } from '../edn/parser';\n// Internal lexer reuse: parseEDN() validates embedded CBOR-EDN first; this pass\n// only needs token offsets so string formatting can split without changing text.\nimport { Tokenizer, type TokenType } from '../edn/tokenizer';\nimport { escapeString, indentOf, resolveIndent } from '../edn/serialize-utils';\n\nconst textEncoder = new TextEncoder();\n\n/** CBOR Major Type 3 — definite-length UTF-8 text string. */\nexport class CborTextString extends CborItem {\n readonly indefiniteLength = false as const;\n readonly value: string;\n readonly encodingWidth: EncodingWidth | undefined;\n\n constructor(value: string, options?: { encodingWidth?: EncodingWidth }) {\n super();\n this.value = value;\n this.encodingWidth = options?.encodingWidth;\n }\n\n _toCBOR(_options?: ToCBOROptions): Uint8Array {\n const encoded = textEncoder.encode(this.value);\n return concat([\n writeHead(MT_TEXT, BigInt(encoded.length), this.encodingWidth),\n encoded,\n ]);\n }\n\n _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n const suffix =\n this.encodingWidth !== undefined ? `_${this.encodingWidth}` : '';\n return formatTextString(this.value, suffix, options, depth);\n }\n\n _toJS(_options?: ToJSOptions): unknown {\n return this.value;\n }\n}\n\nfunction formatTextString(\n value: string,\n suffix: string,\n options: ToEDNOptions | undefined,\n depth: number\n): string {\n const formats = options?.textStringFormat ?? [];\n const indentStr = resolveIndent(options);\n if (formats.length === 0 || indentStr === null) {\n return escapeString(value) + suffix;\n }\n\n const breakpoints = new Map<number, number>();\n if (formats.includes('cboredn')) {\n const cborednBreakpoints = collectCborEdnBreakpoints(value);\n if (cborednBreakpoints !== null) {\n for (const { point, contentDepth } of cborednBreakpoints) {\n breakpoints.set(point, contentDepth);\n }\n }\n }\n if (formats.includes('newline') && breakpoints.size === 0) {\n for (const { point, contentDepth } of collectNewlineBreakpoints(value, 0)) {\n breakpoints.set(point, contentDepth);\n }\n }\n\n const parts = splitAtBreakpoints(value, breakpoints);\n if (parts.length <= 1) return escapeString(value) + suffix;\n\n const literals = parts.map(({ text }, i) => {\n const literal = escapeString(text);\n return i === parts.length - 1 ? literal + suffix : literal;\n });\n let result = literals[0]!;\n for (let i = 1; i < literals.length; i++) {\n const continuationIndent = indentOf(\n indentStr,\n depth + 1 + parts[i]!.contentDepth\n );\n result += ` +\\n${continuationIndent}${literals[i]}`;\n }\n return result;\n}\n\ninterface StringBreakpoint {\n point: number;\n contentDepth: number;\n}\n\ninterface StringPart {\n text: string;\n contentDepth: number;\n}\n\nfunction collectNewlineBreakpoints(\n value: string,\n contentDepth: number\n): StringBreakpoint[] {\n const points: StringBreakpoint[] = [];\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (ch === '\\r') {\n if (value[i + 1] === '\\n') {\n points.push({ point: i + 2, contentDepth });\n i++;\n } else {\n points.push({ point: i + 1, contentDepth });\n }\n } else if (ch === '\\n') {\n points.push({ point: i + 1, contentDepth });\n }\n }\n return points;\n}\n\nfunction collectCborEdnBreakpoints(value: string): StringBreakpoint[] | null {\n try {\n parseEDN(value);\n } catch {\n return null;\n }\n\n // The parse above validates structure. This second tokenizer pass only\n // collects original-source offsets and nesting depth for non-mutating splits.\n const points: StringBreakpoint[] = [];\n const tokenizer = new Tokenizer(value);\n let nesting = 0;\n let pending: { point: number; contentDepth: number } | null = null;\n let sawToken = false;\n let lastTokenEnd = 0;\n for (;;) {\n const token = tokenizer.consume();\n if (token.type === 'EOF') break;\n let skipClosePoint = false;\n\n if (!sawToken) {\n sawToken = true;\n if (\n token.offset > 0 &&\n hasCommentBetween(tokenizer.comments, 0, token.offset)\n ) {\n points.push({ point: token.offset, contentDepth: nesting });\n }\n }\n\n // After an opener/comma, split before the next token so intervening layout\n // whitespace stays at the end of the previous chunk.\n if (pending !== null) {\n if (CLOSE_TOKENS.has(token.type) && token.offset === pending.point) {\n skipClosePoint = true;\n } else {\n points.push({\n point: token.offset,\n contentDepth: pending.contentDepth,\n });\n }\n pending = null;\n }\n\n if (OPEN_TOKENS.has(token.type)) {\n nesting++;\n pending = { point: token.endOffset, contentDepth: nesting };\n } else if (CLOSE_TOKENS.has(token.type)) {\n nesting = Math.max(0, nesting - 1);\n if (!skipClosePoint) {\n points.push({ point: token.offset, contentDepth: nesting });\n }\n } else if (token.type === 'COMMA') {\n pending = { point: token.endOffset, contentDepth: nesting };\n }\n lastTokenEnd = token.endOffset;\n }\n\n const trailingComment = tokenizer.comments.find(\n (comment) => comment.start >= lastTokenEnd\n );\n if (trailingComment !== undefined) {\n points.push({ point: trailingComment.start, contentDepth: nesting });\n }\n return points;\n}\n\nconst OPEN_TOKENS = new Set<TokenType>([\n 'LBRACKET',\n 'LBRACE',\n 'LPAREN',\n 'LT_LT',\n]);\n\nconst CLOSE_TOKENS = new Set<TokenType>([\n 'RBRACKET',\n 'RBRACE',\n 'RPAREN',\n 'GT_GT',\n]);\n\nfunction hasCommentBetween(\n comments: readonly { start: number; end: number }[],\n start: number,\n end: number\n): boolean {\n // Comments use half-open source ranges; this checks for comments wholly\n // contained in [start, end), including one that ends exactly at `end`.\n return comments.some(\n (comment) => comment.start >= start && comment.end <= end\n );\n}\n\nfunction splitAtBreakpoints(\n value: string,\n breakpoints: Map<number, number>\n): StringPart[] {\n const points = [...breakpoints]\n .filter(([point]) => point > 0 && point < value.length)\n .sort(([a], [b]) => a - b);\n if (points.length === 0) return [{ text: value, contentDepth: 0 }];\n\n const parts: StringPart[] = [];\n let start = 0;\n let contentDepth = 0;\n for (const [point, nextContentDepth] of points) {\n if (point === start) continue;\n parts.push({ text: value.slice(start, point), contentDepth });\n start = point;\n contentDepth = nextContentDepth;\n }\n if (start < value.length) {\n parts.push({ text: value.slice(start), contentDepth });\n }\n return parts;\n}\n","/**\n * Standard EDN \"dt\" / \"DT\" application-extension (§3.1 draft-ietf-cbor-edn-literals-20).\n *\n * Parses RFC 3339 date-time app-strings into epoch-based numeric CBOR values.\n * The resulting CborItem subclasses override toEDN() so the value round-trips\n * back to dt'...' / DT'...' notation.\n *\n * For a richer variant that makes toJS() return Date objects, use dt_as_Date\n * from ./date instead.\n */\n\nimport type { ToEDNOptions, ToJSOptions, FromJSOptions } from '../types';\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { CborFloat } from '../ast/CborFloat';\nimport { CborTag } from '../ast/CborTag';\nimport type { EncodingWidth } from '../cbor/encode';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborByteString } from '../ast/CborByteString';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Convert epoch seconds to an RFC 3339 string with appropriate precision.\n *\n * - Integer epoch → \"…Z\" (no fractional part)\n * - Millisecond-precision → \"….SSSZ\" (3 decimal places, e.g. \".500Z\")\n * - Sub-millisecond → \"….S…Z\" (minimal digits, e.g. \".0001Z\")\n *\n * Millisecond precision is used whenever `Math.round(epochSeconds * 1000)`\n * round-trips back to the same float64 value, which is the common case for\n * timestamps stored as integer milliseconds (the JavaScript Date range).\n * Otherwise the shortest decimal representation of the fractional seconds is\n * used so that the float64 value is faithfully represented.\n */\nexport function epochToRfc3339(epochSeconds: number): string {\n if (Number.isInteger(epochSeconds))\n return new Date(epochSeconds * 1000).toISOString().replace(/\\.000Z$/, 'Z');\n\n // Check if millisecond precision suffices (the common case).\n const roundedMs = Math.round(epochSeconds * 1000);\n if (roundedMs / 1000 === epochSeconds)\n return new Date(roundedMs).toISOString().replace(/\\.000Z$/, 'Z');\n\n // Sub-millisecond precision: decompose into whole seconds + fractional part.\n // Math.floor ensures the fractional part is always in [0, 1), which is\n // correct for negative epochs too (e.g. -0.5 → floor=-1, frac=0.5).\n const wholeSeconds = Math.floor(epochSeconds);\n const frac = epochSeconds - wholeSeconds;\n\n // Base timestamp formatted to the second, without any fractional part.\n const base = new Date(wholeSeconds * 1000)\n .toISOString()\n .replace(/\\.\\d+Z$/, '');\n\n // Minimal decimal representation of the fractional seconds (JavaScript's\n // Number.prototype.toString uses the shortest round-trip string).\n const fracStr = frac.toString(); // e.g. \"0.0001\" or \"0.123456\"\n const dotIdx = fracStr.indexOf('.');\n let decDigits = dotIdx >= 0 ? fracStr.slice(dotIdx + 1) : '0';\n // Ensure at least 3 decimal places for conventional readability.\n while (decDigits.length < 3) decDigits += '0';\n\n return `${base}.${decDigits}Z`;\n}\n\n/**\n * Extract a date-time string from a single-item app-sequence.\n * Accepts CborTextString (dt<<\"...\">> ) and CborByteString (dt<<'...'>> , UTF-8).\n */\nfunction stringFromAppSequence(items: CborItem[]): string {\n if (items.length !== 1)\n throw new SyntaxError('dt<<...>>: expected exactly one item');\n const item = items[0];\n if (item instanceof CborTextString) return item.value;\n if (item instanceof CborByteString)\n return new TextDecoder('utf-8', { fatal: true }).decode(item.value);\n throw new SyntaxError('dt<<...>>: expected a text string or byte string');\n}\n\n/**\n * Parse an RFC 3339 string and produce the appropriate epoch CborItem subclass.\n * Integer seconds → CborEpochDtExtUint or CborEpochDtExtNint.\n * Fractional seconds → CborEpochDtExtFloat.\n *\n * Fractional seconds are extracted from the string directly (via parseFloat)\n * before passing the remainder to Date.parse, so sub-millisecond precision\n * is preserved rather than being rounded to the nearest millisecond.\n */\nexport function parseDtAppString(\n str: string\n): CborEpochDtExtUint | CborEpochDtExtNint | CborEpochDtExtFloat {\n // Separate the fractional-seconds part (if any) from the rest of the string.\n // This avoids Date.parse() truncating to millisecond precision.\n // Pattern: ...THH:MM:SS(.frac)(Z|±HH:MM)\n const fracMatch = str.match(\n /^(.+T\\d{2}:\\d{2}:\\d{2})(\\.\\d+)(Z|[+-]\\d{2}:\\d{2})$/i\n );\n\n let wholeStr: string;\n let fracValue: number | undefined;\n\n if (fracMatch) {\n // Parse the integer-seconds part (without the fractional digits).\n wholeStr = fracMatch[1] + fracMatch[3];\n // Parse the fractional seconds string with full float64 precision.\n fracValue = parseFloat('0' + fracMatch[2]); // e.g. parseFloat(\"0.0001\")\n } else {\n wholeStr = str;\n fracValue = undefined;\n }\n\n const ms = Date.parse(wholeStr);\n if (isNaN(ms))\n throw new SyntaxError(\n `dt: invalid RFC 3339 date-time: ${JSON.stringify(str)}`\n );\n\n if (fracValue === undefined) {\n const seconds = ms / 1000;\n if (seconds >= 0) return new CborEpochDtExtUint(BigInt(seconds));\n return new CborEpochDtExtNint(BigInt(seconds));\n }\n\n return new CborEpochDtExtFloat(ms / 1000 + fracValue);\n}\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nexport const PREFIX_DT = 'dt';\nexport const PREFIX_DT_TAGGED = 'DT';\nexport const TAG_EPOCH = 1n;\n\n// ─── CborItem subclasses ─────────────────────────────────────────────────────\n\n/**\n * Unsigned epoch timestamp whose toEDN() emits dt'…' notation.\n * The RFC 3339 string is re-derived from the numeric value on each call.\n */\nexport class CborEpochDtExtUint extends CborUint {\n constructor(\n value: number | bigint,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super(value, options);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, _depth);\n return `${PREFIX_DT}'${epochToRfc3339(Number(this.value))}'`;\n }\n}\n\n/**\n * Negative epoch timestamp whose toEDN() emits dt'…' notation.\n * The RFC 3339 string is re-derived from the numeric value on each call.\n */\nexport class CborEpochDtExtNint extends CborNint {\n constructor(\n value: number | bigint,\n options?: { encodingWidth?: EncodingWidth }\n ) {\n super(value, options);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, _depth);\n return `${PREFIX_DT}'${epochToRfc3339(Number(this.value))}'`;\n }\n}\n\n/**\n * Float epoch timestamp whose toEDN() emits dt'…' notation.\n * The RFC 3339 string is re-derived from the numeric value on each call.\n */\nexport class CborEpochDtExtFloat extends CborFloat {\n constructor(\n value: number,\n options?: { precision?: 'half' | 'single' | 'double' }\n ) {\n super(value, options);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, _depth);\n return `${PREFIX_DT}'${epochToRfc3339(this.value)}'`;\n }\n}\n\n/**\n * CBOR tag(1, epoch) whose toEDN() emits DT'…' notation.\n * The RFC 3339 string is re-derived from the numeric content on each call.\n */\nexport class CborTaggedEpochDtExt extends CborTag {\n constructor(datetime: string, options?: { encodingWidth?: EncodingWidth }) {\n super(TAG_EPOCH, parseDtAppString(datetime), options);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, depth);\n const c = this.content as\n | CborEpochDtExtUint\n | CborEpochDtExtNint\n | CborEpochDtExtFloat;\n const epochSeconds = c instanceof CborFloat ? c.value : Number(c.value);\n return `${PREFIX_DT_TAGGED}'${epochToRfc3339(epochSeconds)}'`;\n }\n}\n\n/**\n * CBOR tag(1, epoch) whose toJS() returns a plain Date object.\n * Use dt_as_Date (or createDtExtension({ jsDate: true })) to produce these nodes.\n */\nexport class CborTaggedEpochDtAsDateExt extends CborTaggedEpochDtExt {\n constructor(datetime: string, options?: { encodingWidth?: EncodingWidth }) {\n super(datetime, options);\n }\n\n override _toJS(_options?: ToJSOptions): Date {\n const c = this.content as\n | CborEpochDtExtUint\n | CborEpochDtExtNint\n | CborEpochDtExtFloat;\n const epochMs =\n c instanceof CborFloat ? c.value * 1000 : Number(c.value) * 1000;\n return new Date(epochMs);\n }\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\n/**\n * Create a dt/DT CborExtension.\n *\n * - `createDtExtension()` — tagged DT values produce `CborTaggedEpochDtExt`;\n * toJS() returns a number (epoch seconds).\n * - `createDtExtension({ jsDate: true })` — tagged DT values produce\n * `CborTaggedEpochDtAsDateExt`; toJS() returns a `Date` object, and\n * `fromJS(Date)` converts `Date` instances back to tagged epoch values.\n */\nexport function createDtExtension(options?: {\n jsDate?: boolean;\n}): CborExtension {\n const useDate = options?.jsDate ?? false;\n\n function makeTagged(\n datetime: string\n ): CborTaggedEpochDtExt | CborTaggedEpochDtAsDateExt {\n return useDate\n ? new CborTaggedEpochDtAsDateExt(datetime)\n : new CborTaggedEpochDtExt(datetime);\n }\n\n const ext: CborExtension = {\n appStringPrefixes: [PREFIX_DT, PREFIX_DT_TAGGED],\n tagNumbers: [TAG_EPOCH],\n\n parseAppString(prefix: string, content: string): CborItem {\n if (prefix === PREFIX_DT_TAGGED) return makeTagged(content);\n return parseDtAppString(content);\n },\n\n parseAppSequence(prefix: string, items: CborItem[]): CborItem {\n const str = stringFromAppSequence(items);\n if (prefix === PREFIX_DT_TAGGED) return makeTagged(str);\n return parseDtAppString(str);\n },\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (tag !== TAG_EPOCH) return undefined;\n let epochSeconds: number;\n if (value instanceof CborUint) epochSeconds = Number(value.value);\n else if (value instanceof CborNint) epochSeconds = Number(value.value);\n else if (value instanceof CborFloat) epochSeconds = value.value;\n else return undefined;\n return makeTagged(epochToRfc3339(epochSeconds));\n },\n };\n\n if (useDate) {\n ext.fromJS = (\n value: unknown,\n _options: FromJSOptions\n ): CborItem | undefined => {\n if (value instanceof Date)\n return new CborTaggedEpochDtAsDateExt(\n epochToRfc3339(value.getTime() / 1000)\n );\n return undefined;\n };\n ext.isJSType = (value: unknown): value is Date => value instanceof Date;\n }\n\n return ext;\n}\n\n// ─── Extension objects ────────────────────────────────────────────────────────\n\n/**\n * Standard dt/DT CborExtension.\n * Tagged DT values produce CborTaggedEpochDtExt; toJS() returns a number.\n * For Date-based toJS() use dt_as_Date or createDtExtension({ jsDate: true }).\n */\nexport const dt: CborExtension = createDtExtension();\n\n/**\n * Full-featured dt/DT CborExtension with Date support.\n * Tagged DT values produce CborTaggedEpochDtAsDateExt; toJS() returns a Date.\n * fromJS(Date) converts Date instances to tagged epoch values.\n */\nexport const dt_as_Date: CborExtension = createDtExtension({ jsDate: true });\n\nexport default dt;\n","/**\n * Shared IPv4 / IPv6 address parsing and formatting utilities.\n * Used by the \"ip\"/\"IP\" extension (RFC 9164) and the \"cri\"/\"CRI\" extension\n * (draft-ietf-core-href).\n */\n\n// ─── Parsing ──────────────────────────────────────────────────────────────────\n\nexport function parseIPv4(str: string): Uint8Array {\n const parts = str.split('.');\n if (parts.length !== 4)\n throw new SyntaxError(`ip: invalid IPv4 address: ${JSON.stringify(str)}`);\n const bytes = new Uint8Array(4);\n for (let i = 0; i < 4; i++) {\n const s = parts[i];\n if (!/^\\d+$/.test(s) || (s.length > 1 && s[0] === '0'))\n throw new SyntaxError(`ip: invalid IPv4 octet: ${JSON.stringify(s)}`);\n const n = parseInt(s, 10);\n if (n > 255) throw new SyntaxError(`ip: IPv4 octet out of range: ${n}`);\n bytes[i] = n;\n }\n return bytes;\n}\n\nexport function parseIPv6(str: string): Uint8Array {\n const bytes = new Uint8Array(16);\n if (str === '::') return bytes;\n\n // Handle IPv4-mapped suffix, e.g. ::ffff:192.0.2.1\n let head = str;\n let ipv4Tail: Uint8Array | null = null;\n const ipv4Match = str.match(/^(.*):(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (ipv4Match) {\n head = ipv4Match[1];\n if (head.endsWith(':')) head += ':'; // restore :: split by the regex\n ipv4Tail = parseIPv4(ipv4Match[2]);\n }\n\n const halves = head.split('::');\n if (halves.length > 2)\n throw new SyntaxError(`ip: invalid IPv6 address: ${JSON.stringify(str)}`);\n\n const doubleColon = halves.length === 2;\n const leftParts = halves[0] ? halves[0].split(':') : [];\n const rightParts = doubleColon && halves[1] ? halves[1].split(':') : [];\n const totalGroups = ipv4Tail ? 6 : 8;\n\n if (!doubleColon && leftParts.length !== totalGroups)\n throw new SyntaxError(`ip: invalid IPv6 address: ${JSON.stringify(str)}`);\n if (doubleColon && leftParts.length + rightParts.length >= totalGroups)\n throw new SyntaxError(`ip: invalid IPv6 address: ${JSON.stringify(str)}`);\n\n const zeroCount = totalGroups - leftParts.length - rightParts.length;\n const groups = [...leftParts, ...Array(zeroCount).fill('0'), ...rightParts];\n\n let offset = 0;\n for (const g of groups) {\n if (!/^[0-9a-fA-F]{1,4}$/.test(g))\n throw new SyntaxError(`ip: invalid IPv6 group: ${JSON.stringify(g)}`);\n const n = parseInt(g, 16);\n bytes[offset++] = (n >> 8) & 0xff;\n bytes[offset++] = n & 0xff;\n }\n if (ipv4Tail) bytes.set(ipv4Tail, 12);\n return bytes;\n}\n\n// ─── Formatting ───────────────────────────────────────────────────────────────\n\nexport function formatIPv4(bytes: Uint8Array): string {\n return Array.from(bytes).join('.');\n}\n\nexport function formatIPv6(bytes: Uint8Array): string {\n // RFC 5952 §5: IPv4-mapped (::ffff:a.b.c.d) — bytes 0-9 zero, 10-11 = 0xffff\n const isIpv4Mapped =\n bytes.slice(0, 10).every((b) => b === 0) &&\n bytes[10] === 0xff &&\n bytes[11] === 0xff;\n\n const ipv4Suffix = isIpv4Mapped ? formatIPv4(bytes.slice(12)) : null;\n\n const hexGroups = ipv4Suffix ? 6 : 8;\n const groups: number[] = [];\n for (let i = 0; i < hexGroups * 2; i += 2)\n groups.push((bytes[i] << 8) | bytes[i + 1]);\n\n // RFC 5952 §4.2.3: find longest run of consecutive zero groups (≥ 2) for ::\n let bestStart = -1,\n bestLen = 0;\n let i = 0;\n while (i < hexGroups) {\n if (groups[i] === 0) {\n let j = i + 1;\n while (j < hexGroups && groups[j] === 0) j++;\n if (j - i > bestLen) {\n bestStart = i;\n bestLen = j - i;\n }\n i = j;\n } else {\n i++;\n }\n }\n if (bestLen < 2) bestStart = -1;\n\n const fmt = (g: number) => g.toString(16);\n let hexPart: string;\n if (bestStart === -1) {\n hexPart = groups.map(fmt).join(':');\n } else {\n const left = groups.slice(0, bestStart).map(fmt).join(':');\n const right = groups\n .slice(bestStart + bestLen)\n .map(fmt)\n .join(':');\n hexPart = `${left}::${right}`;\n }\n\n return ipv4Suffix ? `${hexPart}:${ipv4Suffix}` : hexPart;\n}\n","/**\n * EDN \"ip\" / \"IP\" application-extension (§3.3 draft-ietf-cbor-edn-literals-20).\n *\n * Parses IPv4 / IPv6 address strings (RFC 3986 §3.2.2) into byte strings,\n * and optionally wraps them in CBOR tags per RFC 9164:\n * - tag 52 IPv4 address or prefix\n * - tag 54 IPv6 address or prefix\n *\n * Syntax:\n * ip'192.0.2.42' → CborIpExt bare 4-byte string\n * ip'2001:db8::1' → CborIpExt bare 16-byte string\n * ip'192.0.2.0/24' → CborIpPrefixExt bare [24, h'c00002']\n * ip'2001:db8::/32' → CborIpPrefixExt bare [32, h'20010db8']\n * IP'192.0.2.42' → CborTaggedIpExt tag(52, h'...')\n * IP'2001:db8::1' → CborTaggedIpExt tag(54, h'...')\n * IP'192.0.2.0/24' → CborTaggedIpExt tag(52, [24, h'c00002'])\n * IP'2001:db8::/32' → CborTaggedIpExt tag(54, [32, h'20010db8'])\n *\n * Lowercase ip produces the unwrapped content; uppercase IP additionally\n * wraps it in the IANA address family tag (52 for IPv4, 54 for IPv6).\n */\n\nimport type { ToEDNOptions } from '../types';\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborTag } from '../ast/CborTag';\nimport { CborArray } from '../ast/CborArray';\nimport { CborUint } from '../ast/CborUint';\nimport { CborTextString } from '../ast/CborTextString';\nimport { parseIPv4, parseIPv6, formatIPv4, formatIPv6 } from '../utils/ip';\n\nconst PREFIX_IP = 'ip';\nconst PREFIX_IP_TAGGED = 'IP';\nconst TAG_IPV4 = 52n;\nconst TAG_IPV6 = 54n;\n\nfunction stringFromAppSequence(items: CborItem[]): string {\n if (items.length !== 1)\n throw new SyntaxError('ip<<...>>: expected exactly one item');\n const item = items[0];\n if (item instanceof CborTextString) return item.value;\n if (item instanceof CborByteString)\n return new TextDecoder('utf-8', { fatal: true }).decode(item.value);\n throw new SyntaxError('ip<<...>>: expected a text string or byte string');\n}\n\n// ─── Address parsing ──────────────────────────────────────────────────────────\n\nfunction parseAddress(str: string): { bytes: Uint8Array; isV4: boolean } {\n if (/^\\d/.test(str) && str.includes('.') && !str.includes(':'))\n return { bytes: parseIPv4(str), isV4: true };\n return { bytes: parseIPv6(str), isV4: false };\n}\n\n// ─── Address formatting ───────────────────────────────────────────────────────\n\nfunction formatAddress(bytes: Uint8Array): string {\n if (bytes.length === 4) return formatIPv4(bytes);\n if (bytes.length === 16) return formatIPv6(bytes);\n throw new SyntaxError(`ip: unexpected byte length: ${bytes.length}`);\n}\n\n// ─── CIDR helpers ─────────────────────────────────────────────────────────────\n\nfunction truncateToPrefix(bytes: Uint8Array, prefixLen: number): Uint8Array {\n // RFC 9164 §2.3: zero host bits, then strip trailing zero bytes.\n const masked = new Uint8Array(bytes.length);\n masked.set(bytes);\n const fullBytes = Math.floor(prefixLen / 8);\n const extraBits = prefixLen % 8;\n if (extraBits > 0 && fullBytes < bytes.length)\n masked[fullBytes] &= (0xff << (8 - extraBits)) & 0xff;\n for (let i = fullBytes + (extraBits > 0 ? 1 : 0); i < bytes.length; i++)\n masked[i] = 0;\n let end = Math.ceil(prefixLen / 8);\n while (end > 0 && masked[end - 1] === 0) end--;\n return masked.slice(0, end);\n}\n\nfunction expandToFull(truncated: Uint8Array, fullLen: number): Uint8Array {\n const full = new Uint8Array(fullLen);\n full.set(truncated);\n return full;\n}\n\n// ─── CborItem subclasses ─────────────────────────────────────────────────────\n\n/**\n * Bare IP address byte string whose toEDN() emits ip'…' notation.\n */\nexport class CborIpExt extends CborByteString {\n override _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, _depth);\n return `${PREFIX_IP}'${formatAddress(this.value)}'`;\n }\n}\n\n/**\n * Bare IP address prefix (CIDR) whose toEDN() emits ip'…/prefix' notation.\n * Encoded as [prefixLen, truncatedBytes] per RFC 9164 §2.3, without a tag.\n */\nexport class CborIpPrefixExt extends CborArray {\n private readonly _isV4: boolean;\n\n constructor(prefixLen: number, truncated: Uint8Array, isV4: boolean) {\n super([new CborUint(BigInt(prefixLen)), new CborByteString(truncated)]);\n this._isV4 = isV4;\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, depth);\n const prefixLen = Number((this.items[0] as CborUint).value);\n const truncated = (this.items[1] as CborByteString).value;\n const full = expandToFull(truncated, this._isV4 ? 4 : 16);\n return `${PREFIX_IP}'${formatAddress(full)}/${prefixLen}'`;\n }\n}\n\n/**\n * CBOR tag(52/54, …) IP address whose toEDN() emits IP'…' notation.\n * Content may be a byte string (plain address) or an array [prefix, bytes]\n * (CIDR prefix per RFC 9164).\n */\nexport class CborTaggedIpExt extends CborTag {\n constructor(tag: bigint, content: CborItem) {\n super(tag, content);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, depth);\n const fullLen = this.tag === TAG_IPV4 ? 4 : 16;\n const c = this.content as CborItem;\n if (c instanceof CborByteString) {\n return `${PREFIX_IP_TAGGED}'${formatAddress(c.value)}'`;\n }\n if (\n c instanceof CborArray &&\n c.items.length === 2 &&\n c.items[0] instanceof CborUint &&\n c.items[1] instanceof CborByteString\n ) {\n const prefixLen = Number((c.items[0] as CborUint).value);\n const full = expandToFull((c.items[1] as CborByteString).value, fullLen);\n return `${PREFIX_IP_TAGGED}'${formatAddress(full)}/${prefixLen}'`;\n }\n return super._toEDN(options, depth);\n }\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\nfunction buildIpValue(prefix: string, content: string): CborItem {\n const slashIdx = content.indexOf('/');\n\n if (slashIdx === -1) {\n const { bytes, isV4 } = parseAddress(content);\n if (prefix === PREFIX_IP_TAGGED)\n return new CborTaggedIpExt(\n isV4 ? TAG_IPV4 : TAG_IPV6,\n new CborByteString(bytes)\n );\n return new CborIpExt(bytes);\n }\n\n // CIDR notation — supported with both lowercase ip and uppercase IP.\n // lowercase ip → bare [prefixLen, truncatedBytes] (no tag)\n // uppercase IP → tag(52/54, [prefixLen, truncatedBytes])\n const addrStr = content.slice(0, slashIdx);\n const lenStr = content.slice(slashIdx + 1);\n if (!/^\\d+$/.test(lenStr))\n throw new SyntaxError(\n `ip: invalid prefix length: ${JSON.stringify(lenStr)}`\n );\n const prefixLen = parseInt(lenStr, 10);\n\n const { bytes, isV4 } = parseAddress(addrStr);\n const maxLen = isV4 ? 32 : 128;\n if (prefixLen > maxLen)\n throw new SyntaxError(\n `ip: prefix length ${prefixLen} exceeds maximum ${maxLen} for ${isV4 ? 'IPv4' : 'IPv6'}`\n );\n\n const truncated = truncateToPrefix(bytes, prefixLen);\n if (prefix === PREFIX_IP_TAGGED) {\n return new CborTaggedIpExt(\n isV4 ? TAG_IPV4 : TAG_IPV6,\n new CborArray([\n new CborUint(BigInt(prefixLen)),\n new CborByteString(truncated),\n ])\n );\n }\n return new CborIpPrefixExt(prefixLen, truncated, isV4);\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\n/**\n * Create an ip/IP CborExtension (RFC 9164 / §3.3 draft-ietf-cbor-edn-literals-20).\n *\n * - `ip'addr'` → CborIpExt (bare byte string, 4 or 16 bytes)\n * - `IP'addr'` → CborTaggedIpExt tag(52 or 54, bytes)\n * - `IP'addr/prefix'` → CborTaggedIpExt tag(52 or 54, [prefix_len, bytes])\n * - parseTag(52/54, …) → CborTaggedIpExt (reversible via fromCBOR)\n * - fromJS(tagged obj) → CborTaggedIpExt (reversible via fromJS)\n */\nexport const ip: CborExtension = {\n appStringPrefixes: [PREFIX_IP, PREFIX_IP_TAGGED],\n tagNumbers: [TAG_IPV4, TAG_IPV6],\n\n parseAppString(prefix: string, content: string): CborItem {\n return buildIpValue(prefix, content);\n },\n\n parseAppSequence(prefix: string, items: CborItem[]): CborItem {\n return buildIpValue(prefix, stringFromAppSequence(items));\n },\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (tag !== TAG_IPV4 && tag !== TAG_IPV6) return undefined;\n if (value instanceof CborByteString || value instanceof CborArray)\n return new CborTaggedIpExt(tag, value);\n return undefined;\n },\n};\n\nexport default ip;\n","/**\n * Built-in bignum extension (RFC 8949 §3.4.3).\n *\n * Intercepts tag 2 (unsigned bignum) and tag 3 (negative bignum) during\n * fromCBOR() and fromEDN() so that out-of-range values are decoded as\n * CborBigUint / CborBigNint rather than plain CborTag nodes.\n *\n * In-range values (those that fit in uint64 / nint64) are left as plain\n * CborTag so that non-canonical bignum encodings of small integers don't\n * silently change behaviour.\n */\n\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborByteString } from '../ast/CborByteString';\nimport {\n CborBigUint,\n CborBigNint,\n bytesToBigint,\n BIGNUM_UINT_TAG,\n BIGNUM_NINT_TAG,\n} from '../ast/CborBignum';\n\nconst UINT64_MAX = 0xffff_ffff_ffff_ffffn;\nconst NINT64_MIN = -(UINT64_MAX + 1n);\n\nexport const bignum: CborExtension = {\n tagNumbers: [BIGNUM_UINT_TAG, BIGNUM_NINT_TAG],\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (!(value instanceof CborByteString)) return undefined;\n\n if (tag === BIGNUM_UINT_TAG) {\n const n = bytesToBigint(value.value);\n if (n > UINT64_MAX) return new CborBigUint(n);\n return undefined; // fits in uint64 — leave as plain CborTag\n }\n\n if (tag === BIGNUM_NINT_TAG) {\n const n = -1n - bytesToBigint(value.value);\n if (n < NINT64_MIN) return new CborBigNint(n);\n return undefined; // fits in nint64 — leave as plain CborTag\n }\n\n return undefined;\n },\n};\n\nexport default bignum;\n","/**\n * Standard EDN \"cri\" / \"CRI\" application-extension (§5.2.5 draft-ietf-cbor-edn-literals-20).\n *\n * Converts URI references (RFC 3986) to CRI (Constrained Resource Identifier,\n * draft-ietf-core-href) CBOR array format and back.\n *\n * Syntax:\n * cri'https://example.com/path' → bare CRI array (no CBOR tag)\n * CRI'https://example.com/path' → tag(99, CRI array)\n *\n * CRI array structures (trailing defaults removed):\n * Absolute: [scheme, authority, path, ?query, ?fragment]\n * Network-path: [false, authority, path, ?query, ?fragment]\n * Absolute-path: [true, path, ?query, ?fragment]\n * Relative-path: [uint(discard), path, ?query, ?fragment]\n * Same-document: [0, ?query, ?fragment]\n *\n * where:\n * scheme = scheme-id (nint, e.g. -4 for https) or scheme-name (text)\n * authority = [?userinfo, host, ?port] — host is text labels or IP bytes\n * path = [\"seg1\", \"seg2\", ...]\n * query = [\"k=v\", ...]\n * fragment = text\n * discard = uint — number of path segments to remove from base before appending\n * (1 = same directory, 2 = one level up \"../\", N = (N-1) levels up)\n *\n * Tag number 99 is used for the tagged \"CRI\" variant (draft-ietf-cbor-edn-literals-21 §3.4).\n */\n\nimport type { ToEDNOptions } from '../types';\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborArray } from '../ast/CborArray';\nimport { CborTag } from '../ast/CborTag';\nimport { CborNint } from '../ast/CborNint';\nimport { CborUint } from '../ast/CborUint';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborSimple } from '../ast/CborSimple';\nimport { parseIPv4, parseIPv6, formatIPv4, formatIPv6 } from '../utils/ip';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst PREFIX_CRI = 'cri';\nconst PREFIX_CRI_TAGGED = 'CRI';\n\n/**\n * CBOR tag number for the tagged CRI variant (draft-ietf-cbor-edn-literals-21 §3.4 / §5.2.5).\n */\nexport const TAG_CRI = 99n;\n\n// ─── Scheme-ID table ──────────────────────────────────────────────────────────\n\n/**\n * Scheme-id values from the IANA URI Schemes Registry.\n * Formula: scheme-id = -(scheme-number + 1)\n * https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml\n */\nconst SCHEME_ID_BY_NAME = new Map<string, bigint>([\n ['coap', -1n],\n ['coaps', -2n],\n ['http', -3n],\n ['https', -4n],\n ['urn', -5n],\n ['did', -6n],\n ['coap+tcp', -7n],\n ['coaps+tcp', -8n],\n ['coap+ws', -25n],\n ['coaps+ws', -26n],\n]);\n\nconst SCHEME_NAME_BY_ID = new Map<bigint, string>(\n [...SCHEME_ID_BY_NAME.entries()].map(([name, id]) => [id, name])\n);\n\n// ─── Percent-encoding helpers ─────────────────────────────────────────────────\n\nfunction pctDecode(s: string): string {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n}\n\nfunction pctEncodeChar(c: string): string {\n return Array.from(\n new TextEncoder().encode(c),\n (b) => `%${b.toString(16).toUpperCase().padStart(2, '0')}`\n ).join('');\n}\n\nfunction encodePct(s: string, isAllowed: (c: string) => boolean): string {\n let out = '';\n for (const c of s) {\n out += isAllowed(c) ? c : pctEncodeChar(c);\n }\n return out;\n}\n\n// unreserved = A-Za-z0-9 \"-\" \".\" \"_\" \"~\"\n// sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\" / \"*\" / \"+\" / \",\" / \";\" / \"=\"\nfunction isUnreserved(c: string): boolean {\n return /[A-Za-z0-9\\-._~]/.test(c);\n}\nfunction isSubDelim(c: string): boolean {\n return /[!$&'()*+,;=]/.test(c);\n}\n\n// path segment: unreserved | sub-delims | \":\" | \"@\"\nfunction isPathAllowed(c: string): boolean {\n return isUnreserved(c) || isSubDelim(c) || c === ':' || c === '@';\n}\n\n// query item: path chars | \"/\" | \"?\" — but NOT \"&\" (used as item separator between items)\nfunction isQueryItemAllowed(c: string): boolean {\n return (isPathAllowed(c) || c === '/' || c === '?') && c !== '&';\n}\n\n// fragment: same as query\nfunction isFragmentAllowed(c: string): boolean {\n return isPathAllowed(c) || c === '/' || c === '?';\n}\n\n// userinfo: unreserved | sub-delims | \":\" (RFC 3986 §3.2.1: \":\" is allowed in userinfo)\nfunction isUserinfoAllowed(c: string): boolean {\n return isUnreserved(c) || isSubDelim(c) || c === ':';\n}\n\n// registered name label: unreserved | sub-delims\nfunction isRegNameAllowed(c: string): boolean {\n return isUnreserved(c) || isSubDelim(c);\n}\n\n// ─── Authority conversion ──────────────────────────────────────────────────────\n\n/**\n * Parse URI authority string → CRI authority array.\n *\n * CRI authority = [?userinfo, host, ?port]\n * userinfo = (false, text) — two inline elements\n * host-name = *text — zero-or-more text labels, inline\n * host-ip = bytes (4 or 16 bytes) — single inline element\n * port = uint 0..65535 — trailing optional element\n */\nfunction parseAuthorityStr(authStr: string): CborArray {\n const items: CborItem[] = [];\n let str = authStr;\n\n // Strip userinfo (everything up to the last '@')\n const atIdx = str.indexOf('@');\n if (atIdx >= 0) {\n items.push(CborSimple.FALSE);\n items.push(new CborTextString(pctDecode(str.slice(0, atIdx))));\n str = str.slice(atIdx + 1);\n }\n\n // IPv6 bracket literal: [addr]:port\n let hostStr: string;\n let portStr: string | null = null;\n\n if (str.startsWith('[')) {\n const close = str.indexOf(']');\n if (close < 0)\n throw new SyntaxError('cri: unterminated IPv6 bracket in authority');\n hostStr = str.slice(1, close);\n const after = str.slice(close + 1);\n if (after.startsWith(':')) portStr = after.slice(1);\n else if (after.length > 0)\n throw new SyntaxError(\n `cri: unexpected characters after ']' in authority`\n );\n items.push(new CborByteString(parseIPv6(hostStr)));\n } else {\n // IPv4 address or registered name — find port via last ':'\n const colonIdx = str.lastIndexOf(':');\n if (colonIdx >= 0) {\n hostStr = str.slice(0, colonIdx);\n portStr = str.slice(colonIdx + 1);\n } else {\n hostStr = str;\n }\n\n if (hostStr === '') {\n // Empty host (e.g. file:///path) — zero labels, nothing pushed\n } else if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(hostStr)) {\n items.push(new CborByteString(parseIPv4(hostStr)));\n } else {\n // Registered name: split by '.' into lowercase labels\n for (const label of hostStr.toLowerCase().split('.')) {\n items.push(new CborTextString(label));\n }\n }\n }\n\n // Optional port\n if (portStr !== null && portStr !== '') {\n if (!/^\\d+$/.test(portStr))\n throw new SyntaxError(`cri: invalid port: ${JSON.stringify(portStr)}`);\n const port = parseInt(portStr, 10);\n if (port > 65535) throw new SyntaxError(`cri: port ${port} out of range`);\n items.push(new CborUint(BigInt(port)));\n }\n\n return new CborArray(items);\n}\n\n/**\n * Convert CRI authority array → URI authority string.\n */\nfunction criAuthorityToUri(auth: CborArray): string {\n const items = auth.items;\n let idx = 0;\n let result = '';\n\n // Userinfo: (false, text) as two consecutive elements\n if (\n idx < items.length &&\n items[idx] instanceof CborSimple &&\n (items[idx] as CborSimple).value === 20\n ) {\n idx++; // skip false sentinel\n const user = items[idx++] as CborTextString;\n result += encodePct(user.value, isUserinfoAllowed) + '@';\n }\n\n if (idx >= items.length) return result; // empty host\n\n const hostFirst = items[idx];\n if (hostFirst instanceof CborByteString) {\n idx++;\n const { length } = hostFirst.value;\n if (length === 4) {\n result += formatIPv4(hostFirst.value);\n } else if (length === 16) {\n result += '[' + formatIPv6(hostFirst.value) + ']';\n } else {\n throw new Error(`cri: unexpected host-ip byte length: ${length}`);\n }\n // Optional zone-id (text string immediately after the IP bytes)\n if (idx < items.length && items[idx] instanceof CborTextString) {\n result += `%25${encodePct((items[idx++] as CborTextString).value, isRegNameAllowed)}`;\n }\n } else {\n // Registered name: consecutive text strings up to the optional uint port\n const labels: string[] = [];\n while (idx < items.length && items[idx] instanceof CborTextString) {\n labels.push(\n encodePct((items[idx++] as CborTextString).value, isRegNameAllowed)\n );\n }\n result += labels.join('.');\n }\n\n // Optional port\n if (idx < items.length && items[idx] instanceof CborUint) {\n result += ':' + (items[idx] as CborUint).value.toString();\n }\n\n return result;\n}\n\n// ─── CRI array ↔ URI string ───────────────────────────────────────────────────\n\n/**\n * Parse `//authority/path` from a string starting with `//`.\n * Returns the CRI authority array and path segments.\n */\nfunction _parseHierarchicalPart(rest: string): {\n authority: CborArray;\n pathSegments: CborTextString[];\n} {\n const afterSlashes = rest.slice(2);\n const slashIdx = afterSlashes.indexOf('/');\n let authStr: string;\n let pathSegments: CborTextString[];\n if (slashIdx >= 0) {\n authStr = afterSlashes.slice(0, slashIdx);\n const pathStr = afterSlashes.slice(slashIdx + 1);\n pathSegments = pathStr\n .split('/')\n .map((s) => new CborTextString(pctDecode(s)));\n } else {\n authStr = afterSlashes;\n pathSegments = [];\n }\n return { authority: parseAuthorityStr(authStr), pathSegments };\n}\n\n/**\n * Parse a URI or URI-reference string into CRI array items.\n *\n * Supports all RFC 3986 reference forms:\n * Absolute URI: https://example.com/path → [scheme, authority, path, ...]\n * Network-path ref: //other.example.com/path → [false, authority, path, ...]\n * Absolute-path ref: /abs/path → [true, path, ...]\n * Relative-path ref: foo, ../bar → [uint(discard), path, ...]\n * Same-document ref: #frag, ?q=1, (empty) → [0, ...]\n *\n * Produces a compact representation with trailing defaults removed.\n */\nfunction uriToCriItems(str: string): CborItem[] {\n // ── 1. Fragment ────────────────────────────────────────────────────────────\n let rest = str;\n let fragment: string | null = null;\n const hashIdx = rest.indexOf('#');\n if (hashIdx >= 0) {\n fragment = pctDecode(rest.slice(hashIdx + 1));\n rest = rest.slice(0, hashIdx);\n }\n\n // ── 2. Query ───────────────────────────────────────────────────────────────\n let queryItems: CborTextString[] | null = null;\n const qIdx = rest.indexOf('?');\n if (qIdx >= 0) {\n const qs = rest.slice(qIdx + 1);\n rest = rest.slice(0, qIdx);\n // Per draft-ietf-core-href §5.1:\n // [] (empty array) = absent query (no \"?\") — this is the trailing default\n // [\"\"] (one empty string) = present but empty query (\"?\")\n // [\"k=v\", ...] = query with parameters\n queryItems = qs.split('&').map((s) => new CborTextString(pctDecode(s)));\n }\n\n // ── 3. Detect reference form and build leading items ───────────────────────\n const items: CborItem[] = [];\n\n const schemeMatch = /^([a-zA-Z][a-zA-Z0-9+.\\-]*):([\\s\\S]*)$/.exec(rest);\n if (schemeMatch) {\n // Absolute URI: scheme + hier-part\n const schemeName = schemeMatch[1].toLowerCase();\n const hierPart = schemeMatch[2];\n const schemeId = SCHEME_ID_BY_NAME.get(schemeName);\n items.push(\n schemeId !== undefined\n ? new CborNint(schemeId)\n : new CborTextString(schemeName)\n );\n if (hierPart.startsWith('//')) {\n const { authority, pathSegments } = _parseHierarchicalPart(hierPart);\n items.push(authority, new CborArray(pathSegments));\n } else if (hierPart.startsWith('/')) {\n const pathSegments = hierPart\n .slice(1)\n .split('/')\n .map((s) => new CborTextString(pctDecode(s)));\n items.push(CborSimple.NULL, new CborArray(pathSegments));\n } else {\n const pathSegments = hierPart\n .split('/')\n .map((s) => new CborTextString(pctDecode(s)));\n items.push(CborSimple.TRUE, new CborArray(pathSegments));\n }\n } else if (rest.startsWith('//')) {\n // Network-path reference: //authority/path\n const { authority, pathSegments } = _parseHierarchicalPart(rest);\n items.push(CborSimple.FALSE, authority, new CborArray(pathSegments));\n } else if (rest.startsWith('/')) {\n // Absolute-path reference: /path\n const pathSegments = rest\n .slice(1)\n .split('/')\n .map((s) => new CborTextString(pctDecode(s)));\n items.push(CborSimple.TRUE, new CborArray(pathSegments));\n } else if (rest === '') {\n // Same-document reference (only query/fragment differ from base)\n items.push(new CborUint(0n));\n } else {\n // Relative-path reference: count leading ../ sequences\n let discard = 1n;\n let pathRest = rest;\n let hasDotSlash = false;\n if (pathRest.startsWith('./')) {\n hasDotSlash = true;\n pathRest = pathRest.slice(2);\n }\n while (pathRest.startsWith('../')) {\n discard++;\n pathRest = pathRest.slice(3);\n }\n // Handle lone '..' or '.' at end\n if (pathRest === '..') {\n discard++;\n pathRest = '';\n } else if (pathRest === '.') {\n pathRest = '';\n }\n // RFC 3986 §3.3 path-noscheme: the first segment of a relative-path reference\n // must not contain ':' unless the path was explicitly prefixed with \"./\"\n // (which disambiguates it from a scheme). Without \"./\" the colon makes the\n // reference look like an absolute URI to parsers, and is most likely a typo.\n // This check applies only when discard=1 (same-directory) and no \"./\" was given.\n // For discard≥2 (e.g. \"../foo:bar\") the leading \"../\" already disambiguates.\n if (discard === 1n && !hasDotSlash && pathRest !== '') {\n const firstSeg = pathRest.split('/')[0];\n if (firstSeg.includes(':'))\n throw new SyntaxError(\n `cri: invalid relative-path reference — first segment must not contain ':' without a './' prefix (RFC 3986 §3.3): ${JSON.stringify(str)}`\n );\n }\n const pathSegments =\n pathRest === ''\n ? []\n : pathRest.split('/').map((s) => new CborTextString(pctDecode(s)));\n items.push(new CborUint(discard), new CborArray(pathSegments));\n }\n\n // ── 4. Append query and fragment ──────────────────────────────────────────\n if (queryItems !== null) items.push(new CborArray(queryItems));\n if (fragment !== null) {\n // When fragment is present but query is absent, use null as placeholder so that\n // \"no query\" is distinguishable from \"empty query []\" at the query position.\n if (queryItems === null) items.push(CborSimple.NULL);\n items.push(new CborTextString(fragment));\n }\n\n // ── 5. Trim trailing defaults ─────────────────────────────────────────────\n // Remove null placeholder for absent query (always at items.length - 2 when present)\n if (fragment !== null && queryItems === null) {\n items.splice(items.length - 2, 1);\n }\n // Remove trailing empty PATH array — but only when it is truly the last element\n // (i.e., neither a query nor a fragment follows it). An empty QUERY array []\n // means \"query is present but empty\" (?), which must be preserved.\n if (queryItems === null && fragment === null) {\n const last = items[items.length - 1];\n if (last instanceof CborArray && last.items.length === 0) {\n items.pop();\n }\n }\n\n // ── 6. Canonical same-document form ──────────────────────────────────────\n // Per §5.2: [discard=0] with no other items is sent as [] (empty array).\n if (\n items.length === 1 &&\n items[0] instanceof CborUint &&\n (items[0] as CborUint).value === 0n\n ) {\n return [];\n }\n\n return items;\n}\n\n/**\n * Encode query and fragment items from `items[startIdx..]` into a URI suffix string.\n * Handles both the `[] = empty query`, `[items] = query params`, `null = absent query`,\n * and optional trailing text fragment.\n */\nfunction _criSuffix(items: readonly CborItem[], startIdx: number): string {\n let idx = startIdx;\n let result = '';\n\n if (idx < items.length) {\n const qi = items[idx];\n if (qi instanceof CborArray) {\n idx++;\n // Per §5.1 / draft-ietf-core-href:\n // [] (empty array) = absent query — omit \"?\" entirely (trailing default)\n // [\"\"] = present but empty query — emit \"?\"\n // [\"k=v\", ...] = query with parameters — emit \"?k=v&...\"\n if (qi.items.length > 0) {\n const params = qi.items.map((s) => {\n if (!(s instanceof CborTextString))\n throw new Error('cri: query item must be a text string');\n return encodePct(s.value, isQueryItemAllowed);\n });\n result += '?' + params.join('&');\n }\n // [] = absent query → no '?' emitted\n } else if (qi instanceof CborSimple && qi.value === 22) {\n idx++; // explicit null = absent query component\n }\n // else: not a query item (text fragment follows); leave idx unchanged\n }\n\n if (idx < items.length && items[idx] instanceof CborTextString) {\n result +=\n '#' + encodePct((items[idx] as CborTextString).value, isFragmentAllowed);\n }\n\n return result;\n}\n\n/**\n * Encode a CRI path array into URI path segments.\n */\nfunction _criPathSegs(pathArr: CborArray): string[] {\n return pathArr.items.map((s) => {\n if (!(s instanceof CborTextString))\n throw new Error('cri: path segment must be a text string');\n return encodePct(s.value, isPathAllowed);\n });\n}\n\n/**\n * Convert CRI array items → URI string.\n *\n * Handles all CRI reference forms:\n * Absolute: first element is CborNint or CborTextString (scheme)\n * Network-path: first element is false (CborSimple(20))\n * Absolute-path: first element is true (CborSimple(21))\n * Relative-path: first element is CborUint (discard count ≥ 1)\n * Same-document: first element is CborUint(0)\n */\nfunction criItemsToUri(items: readonly CborItem[]): string {\n // Per §5.2: [] (empty array) is the canonical form of the same-document\n // reference [discard=0] with no query or fragment.\n if (items.length === 0) return '';\n\n let idx = 0;\n const first = items[idx++];\n\n // ── Absolute URI ──────────────────────────────────────────────────────────\n if (first instanceof CborNint || first instanceof CborTextString) {\n let schemePart: string;\n if (first instanceof CborNint) {\n const name = SCHEME_NAME_BY_ID.get(first.value);\n if (name === undefined)\n throw new Error(`cri: unrecognised scheme-id ${first.value}`);\n schemePart = name + ':';\n } else {\n schemePart = (first as CborTextString).value + ':';\n }\n\n if (idx >= items.length) return schemePart;\n\n const second = items[idx++];\n let authorityPart = '';\n let rootedPath = false;\n\n if (second instanceof CborArray) {\n authorityPart = '//' + criAuthorityToUri(second);\n rootedPath = true;\n } else if (second instanceof CborSimple) {\n if (second.value === 22)\n rootedPath = true; // null = NOAUTH-ROOTBASED\n else if (second.value === 21)\n rootedPath = false; // true = NOAUTH-ROOTLESS\n else\n throw new Error(\n `cri: unexpected no-authority value: simple(${second.value})`\n );\n } else {\n throw new Error('cri: unexpected type for authority element');\n }\n\n let pathPart = '';\n if (idx < items.length && items[idx] instanceof CborArray) {\n const pathArr = items[idx++] as CborArray;\n if (pathArr.items.length > 0) {\n pathPart = (rootedPath ? '/' : '') + _criPathSegs(pathArr).join('/');\n }\n }\n\n return schemePart + authorityPart + pathPart + _criSuffix(items, idx);\n }\n\n // ── Network-path reference: [false, authority-array, path-array, ...] ─────\n if (first instanceof CborSimple && first.value === 20) {\n if (idx >= items.length || !(items[idx] instanceof CborArray))\n throw new Error(\n 'cri: network-path reference requires an authority array'\n );\n const authority = criAuthorityToUri(items[idx++] as CborArray);\n let pathPart = '';\n if (idx < items.length && items[idx] instanceof CborArray) {\n const pathArr = items[idx++] as CborArray;\n if (pathArr.items.length > 0) {\n pathPart = '/' + _criPathSegs(pathArr).join('/');\n }\n }\n return '//' + authority + pathPart + _criSuffix(items, idx);\n }\n\n // ── Absolute-path reference: [true, path-array, ...] ─────────────────────\n if (first instanceof CborSimple && first.value === 21) {\n let pathPart = '/';\n if (idx < items.length && items[idx] instanceof CborArray) {\n const pathArr = items[idx++] as CborArray;\n pathPart = '/' + _criPathSegs(pathArr).join('/');\n }\n return pathPart + _criSuffix(items, idx);\n }\n\n // ── Relative-path / same-document: [uint(discard), ...] ──────────────────\n if (first instanceof CborUint) {\n const discard = first.value;\n\n if (discard === 0n) {\n // Same-document reference: path unchanged, only query/fragment differ\n return _criSuffix(items, idx);\n }\n\n // discard=1 → same directory (no \"../\" prefix)\n // discard=N → (N-1) \"../\" prefixes\n const dotdots = discard === 1n ? '' : '../'.repeat(Number(discard) - 1);\n\n let pathPart: string;\n if (idx < items.length && items[idx] instanceof CborArray) {\n const pathArr = items[idx++] as CborArray;\n if (pathArr.items.length > 0) {\n const segs = _criPathSegs(pathArr);\n // §6.1: when discard=1, prefix with \"./\" if the first segment contains \":\"\n // to prevent URI parsers from misreading it as a scheme (RFC 3986 §3.3).\n const needsDotSlash = discard === 1n && segs[0].includes(':');\n pathPart = (needsDotSlash ? './' : dotdots) + segs.join('/');\n } else {\n // Empty path array (should be trimmed, but handle defensively)\n pathPart = dotdots === '' ? './' : dotdots;\n }\n } else {\n // No path array (trimmed away)\n pathPart = dotdots === '' ? './' : dotdots;\n }\n\n return pathPart + _criSuffix(items, idx);\n }\n\n throw new Error(`cri: unrecognised first element type in CRI array`);\n}\n\n// ─── CborItem subclasses ──────────────────────────────────────────────────────\n\n/**\n * Bare CRI array whose toEDN() emits cri'…' notation.\n * Falls back to generic array notation if the content cannot be expressed as a URI.\n */\nexport class CborCriExt extends CborArray {\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, depth);\n try {\n return `${PREFIX_CRI}'${criItemsToUri(this.items)}'`;\n } catch {\n return super._toEDN(options, depth);\n }\n }\n}\n\n/**\n * tag(99, CRI array) whose toEDN() emits CRI'…' notation.\n * Falls back to generic tag notation if the content cannot be expressed as a URI.\n */\nexport class CborTaggedCriExt extends CborTag {\n constructor(content: CborArray) {\n super(TAG_CRI, content);\n }\n\n override _toEDN(options: ToEDNOptions | undefined, depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, depth);\n try {\n return `${PREFIX_CRI_TAGGED}'${criItemsToUri((this.content as CborArray).items)}'`;\n } catch {\n return super._toEDN(options, depth);\n }\n }\n}\n\n// ─── Builder ──────────────────────────────────────────────────────────────────\n\nfunction stringFromAppSequence(items: CborItem[]): string {\n if (items.length !== 1)\n throw new SyntaxError('cri<<...>>: expected exactly one item');\n const item = items[0];\n if (item instanceof CborTextString) return item.value;\n if (item instanceof CborByteString)\n return new TextDecoder('utf-8', { fatal: true }).decode(item.value);\n throw new SyntaxError('cri<<...>>: expected a text string or byte string');\n}\n\nfunction buildCriValue(prefix: string, uri: string): CborItem {\n const criItems = uriToCriItems(uri);\n const arr = new CborCriExt(criItems);\n if (prefix === PREFIX_CRI_TAGGED) return new CborTaggedCriExt(arr);\n return arr;\n}\n\n// ─── Extension factory ────────────────────────────────────────────────────────\n\n/**\n * Create the cri/CRI CborExtension (§5.2.5 draft-ietf-cbor-edn-literals-20).\n *\n * - `cri'uri'` → CborCriExt (bare CRI array, no CBOR tag)\n * - `CRI'uri'` → CborTaggedCriExt tag(99, CRI array)\n * - parseTag(99n, …) → CborTaggedCriExt (roundtrip from CBOR binary)\n */\nexport const cri: CborExtension = {\n appStringPrefixes: [PREFIX_CRI, PREFIX_CRI_TAGGED],\n tagNumbers: [TAG_CRI],\n\n parseAppString(prefix: string, content: string): CborItem {\n return buildCriValue(prefix, content);\n },\n\n parseAppSequence(prefix: string, items: CborItem[]): CborItem {\n return buildCriValue(prefix, stringFromAppSequence(items));\n },\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (tag !== TAG_CRI) return undefined;\n if (!(value instanceof CborArray)) return undefined;\n const inner = new CborCriExt(value.items, {\n indefiniteLength: value.indefiniteLength,\n encodingWidth: value.encodingWidth,\n });\n return new CborTaggedCriExt(inner);\n },\n};\n\nexport default cri;\n","/**\n * Checks if something is Uint8Array. Be careful: nodejs Buffer will return true.\n * @param a - value to test\n * @returns `true` when the value is a Uint8Array-compatible view.\n * @example\n * Check whether a value is a Uint8Array-compatible view.\n * ```ts\n * isBytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function isBytes(a) {\n // Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases.\n // The fallback still requires a real ArrayBuffer view, so plain\n // JSON-deserialized `{ constructor: ... }` spoofing is rejected, and\n // `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.\n return (a instanceof Uint8Array ||\n (ArrayBuffer.isView(a) &&\n a.constructor.name === 'Uint8Array' &&\n 'BYTES_PER_ELEMENT' in a &&\n a.BYTES_PER_ELEMENT === 1));\n}\n/**\n * Asserts something is a non-negative integer.\n * @param n - number to validate\n * @param title - label included in thrown errors\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate a non-negative integer option.\n * ```ts\n * anumber(32, 'length');\n * ```\n */\nexport function anumber(n, title = '') {\n if (typeof n !== 'number') {\n const prefix = title && `\"${title}\" `;\n throw new TypeError(`${prefix}expected number, got ${typeof n}`);\n }\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new RangeError(`${prefix}expected integer >= 0, got ${n}`);\n }\n}\n/**\n * Asserts something is Uint8Array.\n * @param value - value to validate\n * @param length - optional exact length constraint\n * @param title - label included in thrown errors\n * @returns The validated byte array.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate that a value is a byte array.\n * ```ts\n * abytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function abytes(value, length, title = '') {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n const message = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;\n if (!bytes)\n throw new TypeError(message);\n throw new RangeError(message);\n }\n return value;\n}\n/**\n * Copies bytes into a fresh Uint8Array.\n * Buffer-style slices can alias the same backing store, so callers that need ownership should copy.\n * @param bytes - source bytes to clone\n * @returns Freshly allocated copy of `bytes`.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Clone a byte array before mutating it.\n * ```ts\n * const copy = copyBytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function copyBytes(bytes) {\n // `Uint8Array.from(...)` would also accept arrays / other typed arrays. Keep this helper strict\n // because callers use it at byte-validation boundaries before mutating the detached copy.\n return Uint8Array.from(abytes(bytes));\n}\n/**\n * Asserts something is a wrapped hash constructor.\n * @param h - hash constructor to validate\n * @throws On wrong argument types or invalid hash wrapper shape. {@link TypeError}\n * @throws On invalid hash metadata ranges or values. {@link RangeError}\n * @throws If the hash metadata allows empty outputs or block sizes. {@link Error}\n * @example\n * Validate a callable hash wrapper.\n * ```ts\n * import { ahash } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * ahash(sha256);\n * ```\n */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new TypeError('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n // HMAC and KDF callers treat these as real byte lengths; allowing zero lets fake wrappers pass\n // validation and can produce empty outputs instead of failing fast.\n if (h.outputLen < 1)\n throw new Error('\"outputLen\" must be >= 1');\n if (h.blockLen < 1)\n throw new Error('\"blockLen\" must be >= 1');\n}\n/**\n * Asserts a hash instance has not been destroyed or finished.\n * @param instance - hash instance to validate\n * @param checkFinished - whether to reject finalized instances\n * @throws If the hash instance has already been destroyed or finalized. {@link Error}\n * @example\n * Validate that a hash instance is still usable.\n * ```ts\n * import { aexists } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const hash = sha256.create();\n * aexists(hash);\n * ```\n */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/**\n * Asserts output is a sufficiently-sized byte array.\n * @param out - destination buffer\n * @param instance - hash instance providing output length\n * Oversized buffers are allowed; downstream code only promises to fill the first `outputLen` bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate a caller-provided digest buffer.\n * ```ts\n * import { aoutput } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const hash = sha256.create();\n * aoutput(new Uint8Array(hash.outputLen), hash);\n * ```\n */\nexport function aoutput(out, instance) {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new RangeError('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n/**\n * Casts a typed array view to Uint8Array.\n * @param arr - source typed array\n * @returns Uint8Array view over the same buffer.\n * @example\n * Reinterpret a typed array as bytes.\n * ```ts\n * u8(new Uint32Array([1, 2]));\n * ```\n */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/**\n * Casts a typed array view to Uint32Array.\n * `arr.byteOffset` must already be 4-byte aligned or the platform\n * Uint32Array constructor will throw.\n * @param arr - source typed array\n * @returns Uint32Array view over the same buffer.\n * @example\n * Reinterpret a byte array as 32-bit words.\n * ```ts\n * u32(new Uint8Array(8));\n * ```\n */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/**\n * Zeroizes typed arrays in place. Warning: JS provides no guarantees.\n * @param arrays - arrays to overwrite with zeros\n * @example\n * Zeroize sensitive buffers in place.\n * ```ts\n * clean(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/**\n * Creates a DataView for byte-level manipulation.\n * @param arr - source typed array\n * @returns DataView over the same buffer region.\n * @example\n * Create a DataView over an existing buffer.\n * ```ts\n * createView(new Uint8Array(4));\n * ```\n */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/**\n * Rotate-right operation for uint32 values.\n * @param word - source word\n * @param shift - shift amount in bits\n * @returns Rotated word.\n * @example\n * Rotate a 32-bit word to the right.\n * ```ts\n * rotr(0x12345678, 8);\n * ```\n */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/**\n * Rotate-left operation for uint32 values.\n * @param word - source word\n * @param shift - shift amount in bits\n * @returns Rotated word.\n * @example\n * Rotate a 32-bit word to the left.\n * ```ts\n * rotl(0x12345678, 8);\n * ```\n */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Whether the current platform is little-endian. */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/**\n * Byte-swap operation for uint32 values.\n * @param word - source word\n * @returns Word with reversed byte order.\n * @example\n * Reverse the byte order of a 32-bit word.\n * ```ts\n * byteSwap(0x11223344);\n * ```\n */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/**\n * Conditionally byte-swaps one 32-bit word on big-endian platforms.\n * @param n - source word\n * @returns Original or byte-swapped word depending on platform endianness.\n * @example\n * Normalize a 32-bit word for host endianness.\n * ```ts\n * swap8IfBE(0x11223344);\n * ```\n */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n) >>> 0;\n/**\n * Byte-swaps every word of a Uint32Array in place.\n * @param arr - array to mutate\n * @returns The same array after mutation; callers pass live state arrays here.\n * @example\n * Reverse the byte order of every word in place.\n * ```ts\n * byteSwap32(new Uint32Array([0x11223344]));\n * ```\n */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n/**\n * Conditionally byte-swaps a Uint32Array on big-endian platforms.\n * @param u - array to normalize for host endianness\n * @returns Original or byte-swapped array depending on platform endianness.\n * On big-endian runtimes this mutates `u` in place via `byteSwap32(...)`.\n * @example\n * Normalize a word array for host endianness.\n * ```ts\n * swap32IfBE(new Uint32Array([0x11223344]));\n * ```\n */\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string.\n * Uses the built-in function when available and assumes it matches the tested\n * fallback semantics.\n * @param bytes - bytes to encode\n * @returns Lowercase hexadecimal string.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Convert bytes to lowercase hexadecimal.\n * ```ts\n * bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])); // 'cafe0123'\n * ```\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @param hex - hexadecimal string to decode\n * @returns Decoded bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Decode lowercase hexadecimal into bytes.\n * ```ts\n * hexToBytes('cafe0123'); // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n * ```\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new TypeError('hex string expected, got ' + typeof hex);\n if (hasHexBuiltin) {\n try {\n return Uint8Array.fromHex(hex);\n }\n catch (error) {\n if (error instanceof SyntaxError)\n throw new RangeError(error.message);\n throw error;\n }\n }\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new RangeError('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new RangeError('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * This yields to the Promise/microtask scheduler queue, not to timers or the\n * full macrotask event loop.\n * @example\n * Yield to the next scheduler tick.\n * ```ts\n * await nextTick();\n * ```\n */\nexport const nextTick = async () => { };\n/**\n * Returns control to the Promise/microtask scheduler every `tick`\n * milliseconds to avoid blocking long loops.\n * @param iters - number of loop iterations to run\n * @param tick - maximum time slice in milliseconds\n * @param cb - callback executed on each iteration\n * @example\n * Run a loop that periodically yields back to the event loop.\n * ```ts\n * await asyncLoop(2, 0, () => {});\n * ```\n */\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * Non-ASCII details are delegated to the platform `TextEncoder`.\n * @param str - string to encode\n * @returns UTF-8 encoded bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Encode a string as UTF-8 bytes.\n * ```ts\n * utf8ToBytes('abc'); // Uint8Array.from([97, 98, 99])\n * ```\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new TypeError('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Helper for KDFs: consumes Uint8Array or string.\n * String inputs are UTF-8 encoded; byte-array inputs stay aliased to the caller buffer.\n * @param data - user-provided KDF input\n * @param errorTitle - label included in thrown errors\n * @returns Byte representation of the input.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Normalize KDF input to bytes.\n * ```ts\n * kdfInputToBytes('password');\n * ```\n */\nexport function kdfInputToBytes(data, errorTitle = '') {\n if (typeof data === 'string')\n return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n/**\n * Copies several Uint8Arrays into one.\n * @param arrays - arrays to concatenate\n * @returns Concatenated byte array.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Concatenate multiple byte arrays.\n * ```ts\n * concatBytes(new Uint8Array([1]), new Uint8Array([2]));\n * ```\n */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n/**\n * Merges default options and passed options.\n * @param defaults - base option object\n * @param opts - user overrides\n * @returns Merged option object. The merge mutates `defaults` in place.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Merge user overrides onto default options.\n * ```ts\n * checkOpts({ dkLen: 32 }, { asyncTick: 10 });\n * ```\n */\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new TypeError('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/**\n * Creates a callable hash function from a stateful class constructor.\n * @param hashCons - hash constructor or factory\n * @param info - optional metadata such as DER OID\n * @returns Frozen callable hash wrapper with `.create()`.\n * Wrapper construction eagerly calls `hashCons(undefined)` once to read\n * `outputLen` / `blockLen`, so constructor side effects happen at module\n * init time.\n * @example\n * Wrap a stateful hash constructor into a callable helper.\n * ```ts\n * import { createHasher } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const wrapped = createHasher(sha256.create, { oid: sha256.oid });\n * wrapped(new Uint8Array([1]));\n * ```\n */\nexport function createHasher(hashCons, info = {}) {\n const hashC = (msg, opts) => hashCons(opts)\n .update(msg)\n .digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.canXOF = tmp.canXOF;\n hashC.create = (opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n/**\n * Cryptographically secure PRNG backed by `crypto.getRandomValues`.\n * @param bytesLength - number of random bytes to generate\n * @returns Random bytes.\n * The platform `getRandomValues()` implementation still defines any\n * single-call length cap, and this helper rejects oversize requests\n * with a stable library `RangeError` instead of host-specific errors.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @throws If the current runtime does not provide `crypto.getRandomValues`. {@link Error}\n * @example\n * Generate a fresh random key or nonce.\n * ```ts\n * const key = randomBytes(16);\n * ```\n */\nexport function randomBytes(bytesLength = 32) {\n // Match the repo's other length-taking helpers instead of relying on Uint8Array coercion.\n anumber(bytesLength, 'bytesLength');\n const cr = typeof globalThis === 'object' ? globalThis.crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n // Web Cryptography API Level 2 §10.1.1:\n // if `byteLength > 65536`, throw `QuotaExceededError`.\n // Keep the guard explicit so callers can see the quota in code\n // instead of discovering it by reading the spec or host errors.\n // This wrapper surfaces the same quota as a stable library RangeError.\n if (bytesLength > 65536)\n throw new RangeError(`\"bytesLength\" expected <= 65536, got ${bytesLength}`);\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n/**\n * Creates OID metadata for NIST hashes with prefix `06 09 60 86 48 01 65 03 04 02`.\n * @param suffix - final OID byte for the selected hash.\n * The helper accepts any byte even though only the documented NIST hash\n * suffixes are meaningful downstream.\n * @returns Object containing the DER-encoded OID.\n * @example\n * Build OID metadata for a NIST hash.\n * ```ts\n * oidNist(0x01);\n * ```\n */\nexport const oidNist = (suffix) => ({\n // Current NIST hashAlgs suffixes used here fit in one DER subidentifier octet.\n // Larger suffix values would need base-128 OID encoding and a different length byte.\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n//# sourceMappingURL=utils.js.map","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView, } from \"./utils.js\";\n/**\n * Shared 32-bit conditional boolean primitive reused by SHA-256, SHA-1, and MD5 `F`.\n * Returns bits from `b` when `a` is set, otherwise from `c`.\n * The XOR form is equivalent to MD5's `F(X,Y,Z) = XY v not(X)Z` because the masked terms never\n * set the same bit.\n * @param a - selector word\n * @param b - word chosen when selector bit is set\n * @param c - word chosen when selector bit is clear\n * @returns Mixed 32-bit word.\n * @example\n * Combine three words with the shared 32-bit choice primitive.\n * ```ts\n * Chi(0xffffffff, 0x12345678, 0x87654321);\n * ```\n */\nexport function Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/**\n * Shared 32-bit majority primitive reused by SHA-256 and SHA-1.\n * Returns bits shared by at least two inputs.\n * @param a - first input word\n * @param b - second input word\n * @param c - third input word\n * @returns Mixed 32-bit word.\n * @example\n * Combine three words with the shared 32-bit majority primitive.\n * ```ts\n * Maj(0xffffffff, 0x12345678, 0x87654321);\n * ```\n */\nexport function Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n * Accepts only byte-aligned `Uint8Array` input, even when the underlying spec describes bit\n * strings with partial-byte tails.\n * @param blockLen - internal block size in bytes\n * @param outputLen - digest size in bytes\n * @param padOffset - trailing length field size in bytes\n * @param isLE - whether length and state words are encoded in little-endian\n * @example\n * Use a concrete subclass to get the shared Merkle-Damgard update/digest flow.\n * ```ts\n * import { _SHA1 } from '@noble/hashes/legacy.js';\n * const hash = new _SHA1();\n * hash.update(new Uint8Array([97, 98, 99]));\n * hash.digest();\n * ```\n */\nexport class HashMD {\n blockLen;\n outputLen;\n canXOF = false;\n padOffset;\n isLE;\n // For partial updates less than block size\n buffer;\n view;\n finished = false;\n length = 0;\n pos = 0;\n destroyed = false;\n constructor(blockLen, outputLen, padOffset, isLE) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path only when there is no buffered partial block: `take === blockLen` implies\n // `this.pos === 0`, so we can process full blocks directly from the input view.\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // `padOffset` reserves the whole length field. For SHA-384/512 the high 64 bits stay zero from\n // the padding fill above, and JS will overflow before user input can make that half non-zero.\n // So we only need to write the low 64 bits here.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n // Copy before destroy(): subclasses wipe `buffer` during cleanup, but `digest()` must return\n // fresh bytes to the caller.\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to ||= new this.constructor();\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n // Only partial-block bytes need copying: when `length % blockLen === 0`, `pos === 0` and\n // later `update()` / `digestInto()` overwrite `to.buffer` from the start before reading it.\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state from RFC 6234 §6.1: the first 32 bits of the fractional parts of the\n * square roots of the first eight prime numbers. Exported as a shared table; callers must treat\n * it as read-only because constructors copy words from it by index. */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state `H(0)` from RFC 6234 §6.1. Exported as a shared table; callers must\n * treat it as read-only because constructors copy words from it by index. */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state from RFC 6234 §6.3: eight RFC 64-bit `H(0)` words stored as sixteen\n * big-endian 32-bit halves. Derived from the fractional parts of the square roots of the ninth\n * through sixteenth prime numbers. Exported as a shared table; callers must treat it as read-only\n * because constructors copy halves from it by index. */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state from RFC 6234 §6.3: eight RFC 64-bit `H(0)` words stored as sixteen\n * big-endian 32-bit halves. Derived from the fractional parts of the square roots of the first\n * eight prime numbers. Exported as a shared table; callers must treat it as read-only because\n * constructors copy halves from it by index. */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n// Split bigint into two 32-bit halves. With `le=true`, returned fields become `{ h: low, l: high\n// }` to match little-endian word order rather than the property names.\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n// Split bigint list into `[highWords, lowWords]` when `le=false`; with `le=true`, the first array\n// holds the low halves because `fromBig(...)` swaps the semantic meaning of `h` and `l`.\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n// Combine explicit `(high, low)` 32-bit halves into a bigint; `>>> 0` normalizes signed JS\n// bitwise results back to uint32 first, and little-endian callers must swap.\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// High 32-bit half of a 64-bit logical right shift for `s` in `0..31`.\nconst shrSH = (h, _l, s) => h >>> s;\n// Low 32-bit half of a 64-bit logical right shift, valid for `s` in `1..31`.\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// High 32-bit half of a 64-bit right rotate, valid for `s` in `1..31`.\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\n// Low 32-bit half of a 64-bit right rotate, valid for `s` in `1..31`.\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// High 32-bit half of a 64-bit right rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\n// Low 32-bit half of a 64-bit right rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// High 32-bit half of a 64-bit right rotate for `s === 32`; this is just the swapped low half.\nconst rotr32H = (_h, l) => l;\n// Low 32-bit half of a 64-bit right rotate for `s === 32`; this is just the swapped high half.\nconst rotr32L = (h, _l) => h;\n// High 32-bit half of a 64-bit left rotate, valid for `s` in `1..31`.\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\n// Low 32-bit half of a 64-bit left rotate, valid for `s` in `1..31`.\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// High 32-bit half of a 64-bit left rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\n// Low 32-bit half of a 64-bit left rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// Add two split 64-bit words and return the split `{ h, l }` sum.\n// JS uses 32-bit signed integers for bitwise operations, so we cannot simply shift the carry out\n// of the low sum and instead use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\n// Unmasked low-word accumulator for 3-way addition; pass the raw result into `add3H(...)`.\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\n// High-word finalize step for 3-way addition; `low` must be the untruncated output of `add3L(...)`.\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\n// Unmasked low-word accumulator for 4-way addition; pass the raw result into `add4H(...)`.\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\n// High-word finalize step for 4-way addition; `low` must be the untruncated output of `add4L(...)`.\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\n// Unmasked low-word accumulator for 5-way addition; pass the raw result into `add5H(...)`.\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\n// High-word finalize step for 5-way addition; `low` must be the untruncated output of `add5L(...)`.\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig };\n// Canonical grouped namespace for callers that prefer one object.\n// Named exports stay for direct imports.\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\n// Default export mirrors named `u64` for compatibility with object-style imports.\nexport default u64;\n//# sourceMappingURL=_u64.js.map","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out {@link https://www.rfc-editor.org/rfc/rfc4634 | RFC 4634} and\n * {@link https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf | FIPS 180-4}.\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, oidNist, rotr } from \"./utils.js\";\n/**\n * SHA-224 / SHA-256 round constants from RFC 6234 §5.1: the first 32 bits\n * of the cube roots of the first 64 primes (2..311).\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable SHA-224 / SHA-256 message schedule buffer `W_t` from RFC 6234 §6.2 step 1. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n/** Internal SHA-224 / SHA-256 compression engine from RFC 6234 §6.2. */\nclass SHA2_32B extends HashMD {\n constructor(outputLen) {\n super(64, outputLen, 8, false);\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n clean(SHA256_W);\n }\n destroy() {\n // HashMD callers route post-destroy usability through `destroyed`; zeroizing alone still leaves\n // update()/digest() callable on reused instances.\n this.destroyed = true;\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n/** Internal SHA-256 hash class grounded in RFC 6234 §6.2. */\nexport class _SHA256 extends SHA2_32B {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n A = SHA256_IV[0] | 0;\n B = SHA256_IV[1] | 0;\n C = SHA256_IV[2] | 0;\n D = SHA256_IV[3] | 0;\n E = SHA256_IV[4] | 0;\n F = SHA256_IV[5] | 0;\n G = SHA256_IV[6] | 0;\n H = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n/** Internal SHA-224 hash class grounded in RFC 6234 §6.2 and §8.5. */\nexport class _SHA224 extends SHA2_32B {\n A = SHA224_IV[0] | 0;\n B = SHA224_IV[1] | 0;\n C = SHA224_IV[2] | 0;\n D = SHA224_IV[3] | 0;\n E = SHA224_IV[4] | 0;\n F = SHA224_IV[5] | 0;\n G = SHA224_IV[6] | 0;\n H = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// SHA-384 / SHA-512 round constants from RFC 6234 §5.2:\n// 80 full 64-bit words split into high/low halves.\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable high-half schedule buffer for the RFC 6234 §6.4 64-bit `W_t` words.\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\n// Reusable low-half schedule buffer for the RFC 6234 §6.4 64-bit `W_t` words.\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n/** Internal SHA-384 / SHA-512 compression engine from RFC 6234 §6.4. */\nclass SHA2_64B extends HashMD {\n constructor(outputLen) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA512_W[i] = s0 + s1 + SHA512_W[i - 7] + SHA512_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n // HashMD callers route post-destroy usability through `destroyed`; zeroizing alone still leaves\n // update()/digest() callable on reused instances.\n this.destroyed = true;\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n/** Internal SHA-512 hash class grounded in RFC 6234 §6.3 and §6.4. */\nexport class _SHA512 extends SHA2_64B {\n Ah = SHA512_IV[0] | 0;\n Al = SHA512_IV[1] | 0;\n Bh = SHA512_IV[2] | 0;\n Bl = SHA512_IV[3] | 0;\n Ch = SHA512_IV[4] | 0;\n Cl = SHA512_IV[5] | 0;\n Dh = SHA512_IV[6] | 0;\n Dl = SHA512_IV[7] | 0;\n Eh = SHA512_IV[8] | 0;\n El = SHA512_IV[9] | 0;\n Fh = SHA512_IV[10] | 0;\n Fl = SHA512_IV[11] | 0;\n Gh = SHA512_IV[12] | 0;\n Gl = SHA512_IV[13] | 0;\n Hh = SHA512_IV[14] | 0;\n Hl = SHA512_IV[15] | 0;\n constructor() {\n super(64);\n }\n}\n/** Internal SHA-384 hash class grounded in RFC 6234 §6.3 and §6.4. */\nexport class _SHA384 extends SHA2_64B {\n Ah = SHA384_IV[0] | 0;\n Al = SHA384_IV[1] | 0;\n Bh = SHA384_IV[2] | 0;\n Bl = SHA384_IV[3] | 0;\n Ch = SHA384_IV[4] | 0;\n Cl = SHA384_IV[5] | 0;\n Dh = SHA384_IV[6] | 0;\n Dl = SHA384_IV[7] | 0;\n Eh = SHA384_IV[8] | 0;\n El = SHA384_IV[9] | 0;\n Fh = SHA384_IV[10] | 0;\n Fl = SHA384_IV[11] | 0;\n Gh = SHA384_IV[12] | 0;\n Gl = SHA384_IV[13] | 0;\n Hh = SHA384_IV[14] | 0;\n Hl = SHA384_IV[15] | 0;\n constructor() {\n super(48);\n }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See the repo-side derivation recipe in `test/misc/sha2-gen-iv.js`.\n * These IV literals are checked against that script rather than a dedicated\n * local RFC section.\n */\n/** SHA-512/224 IV derived by the SHA-512/t recipe in `test/misc/sha2-gen-iv.js` and\n * stored as sixteen big-endian 32-bit halves. */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA-512/256 IV derived by the SHA-512/t recipe in `test/misc/sha2-gen-iv.js` and\n * stored as sixteen big-endian 32-bit halves. */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n/** Internal SHA-512/224 hash class using the derived `T224_IV` and the shared\n * RFC 6234 §6.4 compression engine. */\nexport class _SHA512_224 extends SHA2_64B {\n Ah = T224_IV[0] | 0;\n Al = T224_IV[1] | 0;\n Bh = T224_IV[2] | 0;\n Bl = T224_IV[3] | 0;\n Ch = T224_IV[4] | 0;\n Cl = T224_IV[5] | 0;\n Dh = T224_IV[6] | 0;\n Dl = T224_IV[7] | 0;\n Eh = T224_IV[8] | 0;\n El = T224_IV[9] | 0;\n Fh = T224_IV[10] | 0;\n Fl = T224_IV[11] | 0;\n Gh = T224_IV[12] | 0;\n Gl = T224_IV[13] | 0;\n Hh = T224_IV[14] | 0;\n Hl = T224_IV[15] | 0;\n constructor() {\n super(28);\n }\n}\n/** Internal SHA-512/256 hash class using the derived `T256_IV` and the shared\n * RFC 6234 §6.4 compression engine. */\nexport class _SHA512_256 extends SHA2_64B {\n Ah = T256_IV[0] | 0;\n Al = T256_IV[1] | 0;\n Bh = T256_IV[2] | 0;\n Bl = T256_IV[3] | 0;\n Ch = T256_IV[4] | 0;\n Cl = T256_IV[5] | 0;\n Dh = T256_IV[6] | 0;\n Dl = T256_IV[7] | 0;\n Eh = T256_IV[8] | 0;\n El = T256_IV[9] | 0;\n Fh = T256_IV[10] | 0;\n Fl = T256_IV[11] | 0;\n Gh = T256_IV[12] | 0;\n Gl = T256_IV[13] | 0;\n Hh = T256_IV[14] | 0;\n Hl = T256_IV[15] | 0;\n constructor() {\n super(32);\n }\n}\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-256.\n * ```ts\n * sha256(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new _SHA256(), \n/* @__PURE__ */ oidNist(0x01));\n/**\n * SHA2-224 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-224.\n * ```ts\n * sha224(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new _SHA224(), \n/* @__PURE__ */ oidNist(0x04));\n/**\n * SHA2-512 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512.\n * ```ts\n * sha512(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new _SHA512(), \n/* @__PURE__ */ oidNist(0x03));\n/**\n * SHA2-384 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-384.\n * ```ts\n * sha384(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new _SHA384(), \n/* @__PURE__ */ oidNist(0x02));\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on {@link https://eprint.iacr.org/2010/548.pdf | truncated SHA512}.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512/256.\n * ```ts\n * sha512_256(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new _SHA512_256(), \n/* @__PURE__ */ oidNist(0x06));\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on {@link https://eprint.iacr.org/2010/548.pdf | truncated SHA512}.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512/224.\n * ```ts\n * sha512_224(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new _SHA512_224(), \n/* @__PURE__ */ oidNist(0x05));\n//# sourceMappingURL=sha2.js.map","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out\n * {@link https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf | FIPS-202},\n * {@link https://keccak.team/keccak.html | Website}, and\n * {@link https://crypto.stackexchange.com/q/15727 | the differences between\n * SHA-3 and Keccak}.\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from \"./_u64.js\";\n// prettier-ignore\nimport { abytes, aexists, anumber, aoutput, clean, createHasher, oidNist, swap32IfBE, u32 } from \"./utils.js\";\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\n// FIPS 202 Algorithm 5 rc(): when the outgoing bit is 1, the 8-bit LFSR xors\n// taps 0, 4, 5, and 6, which compresses to the feedback mask `0x71`.\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI = [];\nconst SHA3_ROTL = [];\nconst _SHA3_IOTA = []; // no pure annotation: var is always used\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n)\n t ^= _1n << ((_1n << BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\n// `split(..., true)` keeps the local little-endian lane-word layout used by\n// `state32`, so these `H` / `L` tables follow the file's first-word /\n// second-word lane slots rather than `_u64.ts`'s usual high/low naming.\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n/**\n * `keccakf1600` internal permutation, additionally allows adjusting the round count.\n * @param s - 5x5 Keccak state encoded as 25 lanes split into 50 uint32 words\n * in this file's local little-endian lane-word order\n * @param rounds - number of rounds to execute\n * @throws If `rounds` is outside the supported `1..24` range. {@link Error}\n * @example\n * Permute a Keccak state with the default 24 rounds.\n * ```ts\n * keccakP(new Uint32Array(50));\n * ```\n */\nexport function keccakP(s, rounds = 24) {\n anumber(rounds, 'rounds');\n // This implementation precomputes only the standard Keccak-f[1600] 24-round Iota table.\n if (rounds < 1 || rounds > 24)\n throw new Error('\"rounds\" expected integer 1..24');\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++)\n B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n // Same as:\n // for (let x = 0; x < 10; x++) B[x] = s[y + x];\n // for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n for (let y = 0; y < 50; y += 10) {\n const b0 = s[y], b1 = s[y + 1], b2 = s[y + 2], b3 = s[y + 3];\n s[y] ^= ~s[y + 2] & s[y + 4];\n s[y + 1] ^= ~s[y + 3] & s[y + 5];\n s[y + 2] ^= ~s[y + 4] & s[y + 6];\n s[y + 3] ^= ~s[y + 5] & s[y + 7];\n s[y + 4] ^= ~s[y + 6] & s[y + 8];\n s[y + 5] ^= ~s[y + 7] & s[y + 9];\n s[y + 6] ^= ~s[y + 8] & b0;\n s[y + 7] ^= ~s[y + 9] & b1;\n s[y + 8] ^= ~b0 & b2;\n s[y + 9] ^= ~b1 & b3;\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n clean(B);\n}\n/**\n * Keccak sponge function.\n * @param blockLen - absorb/squeeze rate in bytes\n * @param suffix - domain separation suffix byte\n * @param outputLen - default digest length in bytes. This base sponge only\n * requires a non-negative integer; wrappers that need positive output\n * lengths must enforce that themselves.\n * @param enableXOF - whether XOF output is allowed\n * @param rounds - number of Keccak-f rounds\n * @example\n * Build a sponge state, absorb bytes, then finalize a digest.\n * ```ts\n * const hash = new Keccak(136, 0x06, 32);\n * hash.update(new Uint8Array([1, 2, 3]));\n * hash.digest();\n * ```\n */\nexport class Keccak {\n state;\n pos = 0;\n posOut = 0;\n finished = false;\n state32;\n destroyed = false;\n blockLen;\n suffix;\n outputLen;\n canXOF;\n enableXOF = false;\n rounds;\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.canXOF = enableXOF;\n this.rounds = rounds;\n // Can be passed from user as dkLen\n anumber(outputLen, 'outputLen');\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n // 0 < blockLen < 200\n if (!(0 < blockLen && blockLen < 200))\n throw new Error('only keccak-f1600 function is supported');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n clone() {\n return this._cloneInto();\n }\n keccak() {\n swap32IfBE(this.state32);\n keccakP(this.state32, this.rounds);\n swap32IfBE(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data) {\n aexists(this);\n abytes(data);\n const { blockLen, state } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++)\n state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen)\n this.keccak();\n }\n return this;\n }\n finish() {\n if (this.finished)\n return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // FIPS 202 appends the SHA3/SHAKE domain-separation suffix before pad10*1.\n // These byte values already include the first padding bit, while the\n // final `0x80` below supplies the closing `1` bit in the last rate byte.\n state[pos] ^= suffix;\n // If that combined suffix lands in the last rate byte and already sets\n // bit 7, absorb it first so the final pad10*1 bit can be xored into a\n // fresh block.\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n writeInto(out) {\n aexists(this, false);\n abytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len;) {\n if (this.posOut >= blockLen)\n this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out) {\n // Plain SHA3/Keccak usage with XOF is probably a mistake, but this base\n // class is also reused by SHAKE/cSHAKE/KMAC/TupleHash/ParallelHash/\n // TurboSHAKE/KangarooTwelve wrappers that intentionally enable XOF.\n if (!this.enableXOF)\n throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes) {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out) {\n aoutput(out, this);\n if (this.finished)\n throw new Error('digest() was already called');\n // `aoutput(...)` allows oversized buffers; digestInto() must fill only the advertised digest.\n this.writeInto(out.subarray(0, this.outputLen));\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.outputLen);\n this.digestInto(out);\n return out;\n }\n destroy() {\n this.destroyed = true;\n clean(this.state);\n }\n _cloneInto(to) {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n // Reused destinations can come from a different rate/capacity variant, so clone must rewrite\n // the sponge geometry as well as the state words.\n to.blockLen = blockLen;\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n // Clones must preserve the public capability bit too; `_KMAC` reuses this path and deep clone\n // tests compare instance fields directly, so leaving `canXOF` behind makes the clone lie.\n to.canXOF = this.canXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\nconst genKeccak = (suffix, blockLen, outputLen, info = {}) => createHasher(() => new Keccak(blockLen, suffix, outputLen), info);\n/**\n * SHA3-224 hash function.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA3-224.\n * ```ts\n * sha3_224(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha3_224 = /* @__PURE__ */ genKeccak(0x06, 144, 28, \n/* @__PURE__ */ oidNist(0x07));\n/**\n * SHA3-256 hash function. Different from keccak-256.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA3-256.\n * ```ts\n * sha3_256(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha3_256 = /* @__PURE__ */ genKeccak(0x06, 136, 32, \n/* @__PURE__ */ oidNist(0x08));\n/**\n * SHA3-384 hash function.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA3-384.\n * ```ts\n * sha3_384(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha3_384 = /* @__PURE__ */ genKeccak(0x06, 104, 48, \n/* @__PURE__ */ oidNist(0x09));\n/**\n * SHA3-512 hash function.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA3-512.\n * ```ts\n * sha3_512(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha3_512 = /* @__PURE__ */ genKeccak(0x06, 72, 64, \n/* @__PURE__ */ oidNist(0x0a));\n/**\n * Keccak-224 hash function.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with Keccak-224.\n * ```ts\n * keccak_224(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const keccak_224 = /* @__PURE__ */ genKeccak(0x01, 144, 28);\n/**\n * Keccak-256 hash function. Different from SHA3-256.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with Keccak-256.\n * ```ts\n * keccak_256(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const keccak_256 = /* @__PURE__ */ genKeccak(0x01, 136, 32);\n/**\n * Keccak-384 hash function.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with Keccak-384.\n * ```ts\n * keccak_384(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const keccak_384 = /* @__PURE__ */ genKeccak(0x01, 104, 48);\n/**\n * Keccak-512 hash function.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with Keccak-512.\n * ```ts\n * keccak_512(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const keccak_512 = /* @__PURE__ */ genKeccak(0x01, 72, 64);\nconst genShake = (suffix, blockLen, outputLen, info = {}) => createHasher((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true), info);\n/**\n * SHAKE128 XOF with 128-bit security and a 16-byte default output.\n * @param msg - message bytes to hash\n * @param opts - Optional output-length override. See {@link ShakeOpts}.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHAKE128.\n * ```ts\n * shake128(new Uint8Array([97, 98, 99]), { dkLen: 32 });\n * ```\n */\nexport const shake128 = \n/* @__PURE__ */\ngenShake(0x1f, 168, 16, /* @__PURE__ */ oidNist(0x0b));\n/**\n * SHAKE256 XOF with 256-bit security and a 32-byte default output.\n * @param msg - message bytes to hash\n * @param opts - Optional output-length override. See {@link ShakeOpts}.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHAKE256.\n * ```ts\n * shake256(new Uint8Array([97, 98, 99]), { dkLen: 64 });\n * ```\n */\nexport const shake256 = \n/* @__PURE__ */\ngenShake(0x1f, 136, 32, /* @__PURE__ */ oidNist(0x0c));\n/**\n * SHAKE128 XOF with 256-bit output (NIST version).\n * @param msg - message bytes to hash\n * @param opts - Optional output-length override. See {@link ShakeOpts}.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHAKE128 using a 32-byte default output.\n * ```ts\n * shake128_32(new Uint8Array([97, 98, 99]), { dkLen: 32 });\n * ```\n */\nexport const shake128_32 = \n/* @__PURE__ */\ngenShake(0x1f, 168, 32, /* @__PURE__ */ oidNist(0x0b));\n/**\n * SHAKE256 XOF with 512-bit output (NIST version).\n * @param msg - message bytes to hash\n * @param opts - Optional output-length override. See {@link ShakeOpts}.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHAKE256 using a 64-byte default output.\n * ```ts\n * shake256_64(new Uint8Array([97, 98, 99]), { dkLen: 64 });\n * ```\n */\nexport const shake256_64 = \n/* @__PURE__ */\ngenShake(0x1f, 136, 64, /* @__PURE__ */ oidNist(0x0c));\n//# sourceMappingURL=sha3.js.map","/**\n\nSHA1 (RFC 3174), MD5 (RFC 1321), and RIPEMD160 legacy, weak hash functions.\nRFC 2286 only covers HMAC-RIPEMD160 wrapper material and test vectors,\nnot the base RIPEMD-160 compression spec.\nDon't use them in a new protocol. What \"weak\" means:\n\n- Collisions can be made with 2^18 effort in MD5, 2^60 in SHA1, 2^80 in RIPEMD160.\n- No practical pre-image attacks (only theoretical, 2^123.4)\n- HMAC seems kinda ok: https://www.rfc-editor.org/rfc/rfc6151\n * @module\n */\nimport { Chi, HashMD, Maj } from \"./_md.js\";\nimport { clean, createHasher, rotl } from \"./utils.js\";\n/** Initial SHA-1 state from RFC 3174 §6.1. */\nconst SHA1_IV = /* @__PURE__ */ Uint32Array.from([\n 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0,\n]);\n// Reusable 80-word SHA-1 message schedule buffer.\nconst SHA1_W = /* @__PURE__ */ new Uint32Array(80);\n/** Internal SHA1 legacy hash class. */\nexport class _SHA1 extends HashMD {\n A = SHA1_IV[0] | 0;\n B = SHA1_IV[1] | 0;\n C = SHA1_IV[2] | 0;\n D = SHA1_IV[3] | 0;\n E = SHA1_IV[4] | 0;\n constructor() {\n super(64, 20, 8, false);\n }\n get() {\n const { A, B, C, D, E } = this;\n return [A, B, C, D, E];\n }\n set(A, B, C, D, E) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n }\n process(view, offset) {\n for (let i = 0; i < 16; i++, offset += 4)\n SHA1_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 80; i++)\n SHA1_W[i] = rotl(SHA1_W[i - 3] ^ SHA1_W[i - 8] ^ SHA1_W[i - 14] ^ SHA1_W[i - 16], 1);\n // Compression function main loop, 80 rounds\n let { A, B, C, D, E } = this;\n for (let i = 0; i < 80; i++) {\n let F, K;\n if (i < 20) {\n F = Chi(B, C, D);\n K = 0x5a827999;\n }\n else if (i < 40) {\n F = B ^ C ^ D;\n K = 0x6ed9eba1;\n }\n else if (i < 60) {\n F = Maj(B, C, D);\n K = 0x8f1bbcdc;\n }\n else {\n F = B ^ C ^ D;\n K = 0xca62c1d6;\n }\n const T = (rotl(A, 5) + F + E + K + SHA1_W[i]) | 0;\n E = D;\n D = C;\n C = rotl(B, 30);\n B = A;\n A = T;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n this.set(A, B, C, D, E);\n }\n roundClean() {\n clean(SHA1_W);\n }\n destroy() {\n // HashMD callers route post-destroy usability through `destroyed`; zeroizing alone still leaves\n // update()/digest() callable on reused instances.\n this.destroyed = true;\n this.set(0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n/**\n * SHA1 (RFC 3174) legacy hash function. It was cryptographically broken.\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA1.\n * ```ts\n * sha1(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha1 = /* @__PURE__ */ createHasher(() => new _SHA1());\n/** RFC 1321 `T[i]` uses `floor(2^32 * abs(sin(i)))`; this is the shared `2^32` scale factor. */\nconst p32 = /* @__PURE__ */ Math.pow(2, 32);\n/** RFC 1321 `T[1..64]` table. */\nconst K = /* @__PURE__ */ Array.from({ length: 64 }, (_, i) => Math.floor(p32 * Math.abs(Math.sin(i + 1))));\n/** MD5 initial state from RFC 1321, stored as 4 u32 words. */\nconst MD5_IV = /* @__PURE__ */ SHA1_IV.slice(0, 4);\n// Reusable 16-word MD5 message block buffer.\nconst MD5_W = /* @__PURE__ */ new Uint32Array(16);\n/** Internal MD5 legacy hash class. */\nexport class _MD5 extends HashMD {\n A = MD5_IV[0] | 0;\n B = MD5_IV[1] | 0;\n C = MD5_IV[2] | 0;\n D = MD5_IV[3] | 0;\n constructor() {\n super(64, 16, 8, true);\n }\n get() {\n const { A, B, C, D } = this;\n return [A, B, C, D];\n }\n set(A, B, C, D) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n }\n process(view, offset) {\n for (let i = 0; i < 16; i++, offset += 4)\n MD5_W[i] = view.getUint32(offset, true);\n // Compression function main loop, 64 rounds\n let { A, B, C, D } = this;\n for (let i = 0; i < 64; i++) {\n let F, g, s;\n if (i < 16) {\n F = Chi(B, C, D);\n g = i;\n s = [7, 12, 17, 22];\n }\n else if (i < 32) {\n // RFC 1321 round 2 uses G(B,C,D) = (B & D) | (C & ~D), which is `Chi(D, B, C)`.\n F = Chi(D, B, C);\n g = (5 * i + 1) % 16;\n s = [5, 9, 14, 20];\n }\n else if (i < 48) {\n F = B ^ C ^ D;\n g = (3 * i + 5) % 16;\n s = [4, 11, 16, 23];\n }\n else {\n F = C ^ (B | ~D);\n g = (7 * i) % 16;\n s = [6, 10, 15, 21];\n }\n F = F + A + K[i] + MD5_W[g];\n A = D;\n D = C;\n C = B;\n B = B + rotl(F, s[i % 4]);\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n this.set(A, B, C, D);\n }\n roundClean() {\n clean(MD5_W);\n }\n destroy() {\n // HashMD callers route post-destroy usability through `destroyed`; zeroizing alone still leaves\n // update()/digest() callable on reused instances.\n this.destroyed = true;\n this.set(0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n/**\n * MD5 (RFC 1321) legacy hash function. It was cryptographically broken.\n * MD5 architecture is similar to SHA1, with some differences:\n * - Reduced output length: 16 bytes (128 bit) instead of 20\n * - 64 rounds, instead of 80\n * - Little-endian: could be faster, but will require more code\n * - Non-linear index selection: huge speed-up for unroll\n * - Per round constants: more memory accesses, additional speed-up for unroll\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with MD5.\n * ```ts\n * md5(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const md5 = /* @__PURE__ */ createHasher(() => new _MD5());\n// RIPEMD-160\n// Permutation repeatedly applied to derive the later RIPEMD-160 message-order tables.\nconst Rho160 = /* @__PURE__ */ Uint8Array.from([\n 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n]);\nconst Id160 = /* @__PURE__ */ (() => Uint8Array.from(new Array(16).fill(0).map((_, i) => i)))();\nconst Pi160 = /* @__PURE__ */ (() => Id160.map((i) => (9 * i + 5) % 16))();\n// Five left/right message-word orderings for the RIPEMD-160 dual-lane rounds.\nconst idxLR = /* @__PURE__ */ (() => {\n const L = [Id160];\n const R = [Pi160];\n const res = [L, R];\n for (let i = 0; i < 4; i++)\n for (let j of res)\n j.push(j[i].map((k) => Rho160[k]));\n return res;\n})();\nconst idxL = /* @__PURE__ */ (() => idxLR[0])();\nconst idxR = /* @__PURE__ */ (() => idxLR[1])();\n// const [idxL, idxR] = idxLR;\n// Base per-group shift table before the left/right message-order permutations are applied.\nconst shifts160 = /* @__PURE__ */ [\n [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8],\n [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7],\n [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9],\n [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6],\n [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5],\n].map((i) => Uint8Array.from(i));\nconst shiftsL160 = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst shiftsR160 = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts160[i][j]));\n// Five left-lane additive constants for RIPEMD-160.\nconst Kl160 = /* @__PURE__ */ Uint32Array.from([\n 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e,\n]);\n// Five right-lane additive constants for RIPEMD-160.\nconst Kr160 = /* @__PURE__ */ Uint32Array.from([\n 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000,\n]);\n// Called `f()` in the spec; valid `group` values are 0..4, and out-of-range\n// inputs currently fall through to the group-4 branch.\nfunction ripemd_f(group, x, y, z) {\n if (group === 0)\n return x ^ y ^ z;\n if (group === 1)\n return (x & y) | (~x & z);\n if (group === 2)\n return (x | ~y) ^ z;\n if (group === 3)\n return (x & z) | (y & ~z);\n return x ^ (y | ~z);\n}\n// Reusable 16-word RIPEMD-160 message block buffer.\nconst BUF_160 = /* @__PURE__ */ new Uint32Array(16);\n/**\n * Internal RIPEMD-160 legacy hash class.\n * RFC 2286 only adds HMAC-RIPEMD160 material, not the core hash specification.\n */\nexport class _RIPEMD160 extends HashMD {\n h0 = 0x67452301 | 0;\n h1 = 0xefcdab89 | 0;\n h2 = 0x98badcfe | 0;\n h3 = 0x10325476 | 0;\n h4 = 0xc3d2e1f0 | 0;\n constructor() {\n super(64, 20, 8, true);\n }\n get() {\n const { h0, h1, h2, h3, h4 } = this;\n return [h0, h1, h2, h3, h4];\n }\n set(h0, h1, h2, h3, h4) {\n this.h0 = h0 | 0;\n this.h1 = h1 | 0;\n this.h2 = h2 | 0;\n this.h3 = h3 | 0;\n this.h4 = h4 | 0;\n }\n process(view, offset) {\n for (let i = 0; i < 16; i++, offset += 4)\n BUF_160[i] = view.getUint32(offset, true);\n // prettier-ignore\n let al = this.h0 | 0, ar = al, bl = this.h1 | 0, br = bl, cl = this.h2 | 0, cr = cl, dl = this.h3 | 0, dr = dl, el = this.h4 | 0, er = el;\n // Instead of iterating 0 to 80, we split it into 5 groups\n // And use the groups in constants, functions, etc. Much simpler\n for (let group = 0; group < 5; group++) {\n const rGroup = 4 - group;\n const hbl = Kl160[group], hbr = Kr160[group]; // prettier-ignore\n const rl = idxL[group], rr = idxR[group]; // prettier-ignore\n const sl = shiftsL160[group], sr = shiftsR160[group]; // prettier-ignore\n for (let i = 0; i < 16; i++) {\n const tl = (rotl(al + ripemd_f(group, bl, cl, dl) + BUF_160[rl[i]] + hbl, sl[i]) + el) | 0;\n al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; // prettier-ignore\n }\n // 2 loops are 10% faster\n for (let i = 0; i < 16; i++) {\n const tr = (rotl(ar + ripemd_f(rGroup, br, cr, dr) + BUF_160[rr[i]] + hbr, sr[i]) + er) | 0;\n ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; // prettier-ignore\n }\n }\n // Add the compressed chunk to the current hash value\n // Final recombination cross-adds the left/right lane accumulators into the next h0..h4 order.\n this.set((this.h1 + cl + dr) | 0, (this.h2 + dl + er) | 0, (this.h3 + el + ar) | 0, (this.h4 + al + br) | 0, (this.h0 + bl + cr) | 0);\n }\n roundClean() {\n clean(BUF_160);\n }\n destroy() {\n this.destroyed = true;\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0);\n }\n}\n/**\n * RIPEMD-160 - a legacy hash function from 1990s.\n * RFC 2286 only covers HMAC-RIPEMD160 test material; the links below point\n * at the base RIPEMD-160 references.\n * * {@link https://homes.esat.kuleuven.be/~bosselae/ripemd160.html}\n * * {@link https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf}\n * @param msg - message bytes to hash\n * @returns Digest bytes.\n * @example\n * Hash a message with RIPEMD-160.\n * ```ts\n * ripemd160(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const ripemd160 = /* @__PURE__ */ createHasher(() => new _RIPEMD160());\n//# sourceMappingURL=legacy.js.map","/**\n * Standard EDN \"hash\" application-extension (§3.3 draft-ietf-cbor-edn-literals-22).\n *\n * Computes a cryptographic hash of the input and returns it as a byte string.\n * The hash algorithm is identified by its COSE Algorithms registry entry.\n *\n * Syntax:\n * hash'foo' → SHA-256 hash of UTF-8 \"foo\" (default: COSE -16)\n * hash<<'foo'>> → same\n * hash<<'foo', -16>> → explicit SHA-256 by COSE integer ID\n * hash<<'foo', \"SHA-256\">> → explicit SHA-256 by COSE name\n * hash<<'foo', -44>> → SHA-512 (COSE -44)\n * hash<<'foo', -17>> → SHA-512/256 (COSE -17)\n * hash<<'foo', -18>> → SHAKE128 256-bit (COSE -18)\n * hash<<'foo', -45>> → SHAKE256 512-bit (COSE -45)\n * hash<<h'0102', -16>> → SHA-256 of raw bytes h'0102'\n *\n * Note: No uppercase \"HASH\" variant exists (§3.3: \"No uppercase variant prefix\n * is defined for the application-extension identifier 'hash'\").\n */\n\nimport type { ToEDNOptions } from '../types';\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { escapeAppString, serializeBytes } from '../edn/serialize-utils';\nimport { sha256, sha384, sha512, sha512_256 } from '@noble/hashes/sha2.js';\nimport { shake128_32, shake256_64 } from '@noble/hashes/sha3.js';\nimport { sha1 } from '@noble/hashes/legacy.js';\n\n// ─── COSE Algorithm table (RFC 9054) ─────────────────────────────────────────\n\ntype HashFn = (data: Uint8Array) => Uint8Array;\n\n/** COSE algorithm ID → hash function (all 8 entries from RFC 9054) */\nconst COSE_HASH_FN = new Map<number, HashFn>([\n [-14, sha1],\n [-15, (data) => sha256(data).slice(0, 8)], // SHA-256/64: truncate to 64 bits\n [-16, sha256],\n [-17, sha512_256], // SHA-512/256\n [-18, shake128_32], // SHAKE128 256-bit output\n [-43, sha384],\n [-44, sha512],\n [-45, shake256_64], // SHAKE256 512-bit output\n]);\n\n/** COSE algorithm name → COSE ID */\nconst COSE_NAME_TO_ID = new Map<string, number>([\n ['SHA-1', -14],\n ['SHA-256/64', -15],\n ['SHA-256', -16],\n ['SHA-512/256', -17],\n ['SHAKE128', -18],\n ['SHA-384', -43],\n ['SHA-512', -44],\n ['SHAKE256', -45],\n]);\n\n/** COSE ID → algorithm name (reverse of COSE_NAME_TO_ID) */\nconst COSE_ID_TO_NAME = new Map<number, string>(\n [...COSE_NAME_TO_ID.entries()].map(([name, id]) => [id, name])\n);\n\n// ─── CborHashExt ──────────────────────────────────────────────────────────────\n\n/**\n * A byte string produced by a hash'…' or hash<<…>> literal.\n * Remembers the original input and algorithm so toEDN() can reconstruct\n * the hash notation when appStrings is not false.\n */\nexport class CborHashExt extends CborByteString {\n private readonly _input: CborTextString | CborByteString;\n private readonly _algorithmId: number;\n\n constructor(\n output: Uint8Array,\n input: CborTextString | CborByteString,\n algorithmId: number\n ) {\n super(output);\n this._input = input;\n this._algorithmId = algorithmId;\n }\n\n override _toEDN(options: ToEDNOptions | undefined, _depth: number): string {\n if (options?.appStrings === false) return super._toEDN(options, _depth);\n\n const isDefault = this._algorithmId === -16;\n\n if (this._input instanceof CborTextString && isDefault) {\n return `hash${escapeAppString(this._input.value)}`;\n }\n\n const dataEdn =\n this._input instanceof CborTextString\n ? escapeAppString(this._input.value)\n : serializeBytes(\n this._input.value,\n options?.bstrEncoding ?? 'hex',\n options?.sqstr\n );\n\n if (isDefault) return `hash<<${dataEdn}>>`;\n\n const algoEdn = COSE_ID_TO_NAME.has(this._algorithmId)\n ? `\"${COSE_ID_TO_NAME.get(this._algorithmId)}\"`\n : String(this._algorithmId);\n return `hash<<${dataEdn}, ${algoEdn}>>`;\n }\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveAlgorithmId(item: CborItem): number {\n if (item instanceof CborUint) return Number(item.value);\n if (item instanceof CborNint) return Number(item.value);\n if (item instanceof CborTextString) {\n const id = COSE_NAME_TO_ID.get(item.value);\n if (id === undefined)\n throw new SyntaxError(\n `hash: unknown algorithm name: ${JSON.stringify(item.value)}`\n );\n return id;\n }\n throw new SyntaxError('hash: algorithm must be an integer or text string');\n}\n\nfunction computeHash(\n input: CborTextString | CborByteString,\n algorithmId: number\n): CborHashExt {\n const data =\n input instanceof CborTextString\n ? new TextEncoder().encode(input.value)\n : input.value;\n const fn = COSE_HASH_FN.get(algorithmId);\n if (!fn)\n throw new SyntaxError(`hash: unsupported COSE algorithm ID ${algorithmId}`);\n return new CborHashExt(fn(data), input, algorithmId);\n}\n\n// ─── Extension factory ────────────────────────────────────────────────────────\n\nexport const hash: CborExtension = {\n appStringPrefixes: ['hash'],\n\n parseAppString(_prefix, content) {\n return computeHash(new CborTextString(content), -16);\n },\n\n parseAppSequence(_prefix, items) {\n if (items.length === 0 || items.length > 2)\n throw new SyntaxError(\n `hash<<...>>: expected 1 or 2 items, got ${items.length}`\n );\n const input = items[0];\n if (\n !(input instanceof CborTextString) &&\n !(input instanceof CborByteString)\n )\n throw new SyntaxError(\n 'hash: first argument must be a text or byte string'\n );\n const algorithmId = items.length === 2 ? resolveAlgorithmId(items[1]) : -16;\n return computeHash(input, algorithmId);\n },\n};\n\nexport default hash;\n","import type { FromCBOROptions } from '../types';\nimport type { CborItem } from '../ast/CborItem';\nimport { BUILTIN_EXTENSIONS } from '../extensions/builtins';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborIndefiniteByteString } from '../ast/CborIndefiniteByteString';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborIndefiniteTextString } from '../ast/CborIndefiniteTextString';\nimport { CborArray } from '../ast/CborArray';\nimport { CborMap } from '../ast/CborMap';\nimport { CborTag } from '../ast/CborTag';\nimport { CborFloat } from '../ast/CborFloat';\nimport { CborSimple } from '../ast/CborSimple';\nimport { float16BitsToFloat64 } from '../utils/float16';\nimport {\n MT_UINT,\n MT_NINT,\n MT_BYTES,\n MT_TEXT,\n MT_ARRAY,\n MT_MAP,\n MT_TAG,\n MT_SIMPLE,\n AI_1BYTE,\n AI_2BYTE,\n AI_4BYTE,\n AI_8BYTE,\n AI_INDEFINITE,\n BREAK_CODE,\n} from './constants';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst textDecoder = new TextDecoder('utf-8', { fatal: true });\n\nfunction decodeError(msg: string): never {\n throw new Error(`CBOR decode error: ${msg}`);\n}\n\n/**\n * Read the CBOR \"argument\" that follows the initial byte.\n * For ai 0–23 the argument is inline; for 24–27 it occupies 1/2/4/8 bytes.\n */\nfunction readArgument(\n view: DataView,\n offset: number,\n ai: number\n): { value: bigint; nextOffset: number } {\n if (ai <= 23) {\n return { value: BigInt(ai), nextOffset: offset };\n }\n switch (ai) {\n case AI_1BYTE:\n if (offset + 1 > view.byteLength) decodeError('unexpected end of input');\n return { value: BigInt(view.getUint8(offset)), nextOffset: offset + 1 };\n case AI_2BYTE:\n if (offset + 2 > view.byteLength) decodeError('unexpected end of input');\n return {\n value: BigInt(view.getUint16(offset, false)),\n nextOffset: offset + 2,\n };\n case AI_4BYTE:\n if (offset + 4 > view.byteLength) decodeError('unexpected end of input');\n return {\n value: BigInt(view.getUint32(offset, false)),\n nextOffset: offset + 4,\n };\n case AI_8BYTE:\n if (offset + 8 > view.byteLength) decodeError('unexpected end of input');\n return {\n value: view.getBigUint64(offset, false),\n nextOffset: offset + 8,\n };\n default:\n decodeError(`reserved additional info value: ${ai}`);\n }\n}\n\n// ─── Core recursive decoder ───────────────────────────────────────────────────\n\ntype DecodeResult = { value: CborItem; nextOffset: number };\n\nfunction decodeItem(\n view: DataView,\n offset: number,\n options?: FromCBOROptions\n): DecodeResult {\n const startOffset = offset;\n const result = decodeItemInner(view, offset, options);\n result.value.start = startOffset;\n result.value.end = result.nextOffset;\n return result;\n}\n\nfunction decodeItemInner(\n view: DataView,\n offset: number,\n options?: FromCBOROptions\n): DecodeResult {\n if (offset >= view.byteLength) decodeError('unexpected end of input');\n\n const initialByte = view.getUint8(offset++);\n const mt = initialByte >> 5;\n const ai = initialByte & 0x1f;\n\n switch (mt) {\n // ── Major Type 0: unsigned integer ────────────────────────────────────────\n case MT_UINT: {\n const { value, nextOffset } = readArgument(view, offset, ai);\n return { value: new CborUint(value), nextOffset };\n }\n\n // ── Major Type 1: negative integer ───────────────────────────────────────\n case MT_NINT: {\n const { value, nextOffset } = readArgument(view, offset, ai);\n // CBOR encodes negative integers as -1 - argument\n return { value: new CborNint(-1n - value), nextOffset };\n }\n\n // ── Major Type 2: byte string ─────────────────────────────────────────────\n case MT_BYTES: {\n if (ai === AI_INDEFINITE) {\n const chunks: CborByteString[] = [];\n let pos = offset;\n while (true) {\n if (pos >= view.byteLength)\n decodeError('unexpected end of indefinite byte string');\n if (view.getUint8(pos) === BREAK_CODE) {\n pos++;\n break;\n }\n const result = decodeItem(view, pos, options);\n if (!(result.value instanceof CborByteString)) {\n decodeError(\n 'indefinite-length byte string chunk must be a definite byte string'\n );\n }\n chunks.push(result.value);\n pos = result.nextOffset;\n }\n return { value: new CborIndefiniteByteString(chunks), nextOffset: pos };\n }\n const { value: len, nextOffset: dataOffset } = readArgument(\n view,\n offset,\n ai\n );\n const length = Number(len);\n if (dataOffset + length > view.byteLength)\n decodeError('byte string extends beyond input');\n const bytes = new Uint8Array(\n view.buffer,\n view.byteOffset + dataOffset,\n length\n );\n return {\n value: new CborByteString(bytes.slice()),\n nextOffset: dataOffset + length,\n };\n }\n\n // ── Major Type 3: text string ─────────────────────────────────────────────\n case MT_TEXT: {\n if (ai === AI_INDEFINITE) {\n const chunks: CborTextString[] = [];\n let pos = offset;\n while (true) {\n if (pos >= view.byteLength)\n decodeError('unexpected end of indefinite text string');\n if (view.getUint8(pos) === BREAK_CODE) {\n pos++;\n break;\n }\n const result = decodeItem(view, pos, options);\n if (!(result.value instanceof CborTextString)) {\n decodeError(\n 'indefinite-length text string chunk must be a definite text string'\n );\n }\n chunks.push(result.value);\n pos = result.nextOffset;\n }\n return { value: new CborIndefiniteTextString(chunks), nextOffset: pos };\n }\n const { value: len, nextOffset: dataOffset } = readArgument(\n view,\n offset,\n ai\n );\n const length = Number(len);\n if (dataOffset + length > view.byteLength)\n decodeError('text string extends beyond input');\n const bytes = new Uint8Array(\n view.buffer,\n view.byteOffset + dataOffset,\n length\n );\n let text: string;\n try {\n text = textDecoder.decode(bytes);\n } catch {\n decodeError('invalid UTF-8 sequence in text string');\n }\n return {\n value: new CborTextString(text),\n nextOffset: dataOffset + length,\n };\n }\n\n // ── Major Type 4: array ───────────────────────────────────────────────────\n case MT_ARRAY: {\n if (ai === AI_INDEFINITE) {\n const items: CborItem[] = [];\n let pos = offset;\n while (true) {\n if (pos >= view.byteLength)\n decodeError('unexpected end of indefinite array');\n if (view.getUint8(pos) === BREAK_CODE) {\n pos++;\n break;\n }\n const result = decodeItem(view, pos, options);\n items.push(result.value);\n pos = result.nextOffset;\n }\n return {\n value: new CborArray(items, { indefiniteLength: true }),\n nextOffset: pos,\n };\n }\n const { value: count, nextOffset: itemsStart } = readArgument(\n view,\n offset,\n ai\n );\n const length = Number(count);\n const items: CborItem[] = [];\n let pos = itemsStart;\n for (let i = 0; i < length; i++) {\n const result = decodeItem(view, pos, options);\n items.push(result.value);\n pos = result.nextOffset;\n }\n return { value: new CborArray(items), nextOffset: pos };\n }\n\n // ── Major Type 5: map ─────────────────────────────────────────────────────\n case MT_MAP: {\n if (ai === AI_INDEFINITE) {\n const entries: [CborItem, CborItem][] = [];\n let pos = offset;\n while (true) {\n if (pos >= view.byteLength)\n decodeError('unexpected end of indefinite map');\n if (view.getUint8(pos) === BREAK_CODE) {\n pos++;\n break;\n }\n const keyResult = decodeItem(view, pos, options);\n pos = keyResult.nextOffset;\n const valResult = decodeItem(view, pos, options);\n pos = valResult.nextOffset;\n entries.push([keyResult.value, valResult.value]);\n }\n return {\n value: new CborMap(entries, { indefiniteLength: true }),\n nextOffset: pos,\n };\n }\n const { value: count, nextOffset: entriesStart } = readArgument(\n view,\n offset,\n ai\n );\n const length = Number(count);\n const entries: [CborItem, CborItem][] = [];\n let pos = entriesStart;\n for (let i = 0; i < length; i++) {\n const keyResult = decodeItem(view, pos, options);\n pos = keyResult.nextOffset;\n const valResult = decodeItem(view, pos, options);\n pos = valResult.nextOffset;\n entries.push([keyResult.value, valResult.value]);\n }\n return { value: new CborMap(entries), nextOffset: pos };\n }\n\n // ── Major Type 6: tagged item ─────────────────────────────────────────────\n case MT_TAG: {\n if (ai === AI_INDEFINITE)\n decodeError('tags cannot use indefinite-length encoding');\n const { value: tagNum, nextOffset: contentStart } = readArgument(\n view,\n offset,\n ai\n );\n const contentResult = decodeItem(view, contentStart, options);\n for (const ext of [\n ...(options?.extensions ?? []),\n ...BUILTIN_EXTENSIONS,\n ]) {\n if (ext.parseTag) {\n const result = ext.parseTag(tagNum, contentResult.value);\n if (result !== undefined)\n return { value: result, nextOffset: contentResult.nextOffset };\n }\n }\n return {\n value: new CborTag(tagNum, contentResult.value),\n nextOffset: contentResult.nextOffset,\n };\n }\n\n // ── Major Type 7: float / simple value ────────────────────────────────────\n case MT_SIMPLE: {\n // ai 0–19: simple value encoded inline\n if (ai <= 19) {\n return { value: new CborSimple(ai), nextOffset: offset };\n }\n // ai 20–23: false / true / null / undefined\n if (ai === 20) return { value: CborSimple.FALSE, nextOffset: offset };\n if (ai === 21) return { value: CborSimple.TRUE, nextOffset: offset };\n if (ai === 22) return { value: CborSimple.NULL, nextOffset: offset };\n if (ai === 23) return { value: CborSimple.UNDEFINED, nextOffset: offset };\n\n // ai 24: simple value in next byte (value must be >= 32)\n if (ai === AI_1BYTE) {\n if (offset + 1 > view.byteLength)\n decodeError('unexpected end of input');\n const simpleVal = view.getUint8(offset);\n if (simpleVal < 32) {\n decodeError(\n `simple value ${simpleVal} must be encoded in initial byte (0–31 reserved for extended encoding)`\n );\n }\n return { value: new CborSimple(simpleVal), nextOffset: offset + 1 };\n }\n\n // ai 25: half-precision float\n if (ai === AI_2BYTE) {\n if (offset + 2 > view.byteLength)\n decodeError('unexpected end of input');\n const bits = view.getUint16(offset, false);\n return {\n value: new CborFloat(float16BitsToFloat64(bits), {\n precision: 'half',\n }),\n nextOffset: offset + 2,\n };\n }\n\n // ai 26: single-precision float\n if (ai === AI_4BYTE) {\n if (offset + 4 > view.byteLength)\n decodeError('unexpected end of input');\n return {\n value: new CborFloat(view.getFloat32(offset, false), {\n precision: 'single',\n }),\n nextOffset: offset + 4,\n };\n }\n\n // ai 27: double-precision float\n if (ai === AI_8BYTE) {\n if (offset + 8 > view.byteLength)\n decodeError('unexpected end of input');\n return {\n value: new CborFloat(view.getFloat64(offset, false), {\n precision: 'double',\n }),\n nextOffset: offset + 8,\n };\n }\n\n // ai 28–30: reserved\n if (ai < AI_INDEFINITE) {\n decodeError(`reserved additional info value in major type 7: ${ai}`);\n }\n\n // ai 31: break code — not valid at item level\n return decodeError(\n 'unexpected break code outside indefinite-length item'\n );\n }\n }\n // unreachable: all major types 0–7 are handled above\n return decodeError(`unknown major type: ${mt}`);\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nfunction toInputBytes(data: ArrayBufferView | ArrayBufferLike): Uint8Array {\n if (\n data instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' &&\n data instanceof SharedArrayBuffer)\n ) {\n return new Uint8Array(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n throw new TypeError('expected ArrayBufferView or ArrayBufferLike');\n}\n\n/**\n * Decode a CBOR-encoded byte array into a CborItem AST node.\n *\n * Accepts any `ArrayBufferView` (e.g. `Uint8Array`, `DataView`) or\n * `ArrayBufferLike` (e.g. `ArrayBuffer`, `SharedArrayBuffer`).\n *\n * Throws if the input is not well-formed CBOR or contains trailing bytes.\n */\nexport function decodeCBOR(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions\n): CborItem {\n const bytes = toInputBytes(input);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const offset = options?.offset ?? 0;\n if (!Number.isInteger(offset) || offset < 0 || offset > view.byteLength) {\n throw new RangeError(\n `CBOR decode offset must be an integer between 0 and ${view.byteLength}`\n );\n }\n const { value, nextOffset } = decodeItem(view, offset, options);\n if (!options?.allowTrailing && nextOffset !== view.byteLength) {\n decodeError(\n `${view.byteLength - nextOffset} trailing byte(s) after end of CBOR item`\n );\n }\n return value;\n}\n","/**\n * Built-in embedded CBOR extension (RFC 8949 §3.4.5.1).\n *\n * Intercepts tag 24 during fromCBOR() so that the byte string content is\n * decoded as a CBOR data item and represented as CborEmbeddedCBOR. This\n * allows toEDN() to render the value as 24(<<item>>) instead of 24(h'...').\n *\n * If the byte string is not valid CBOR (or has trailing bytes), the extension\n * returns undefined and falls back to the plain CborTag representation.\n */\n\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborEmbeddedCBOR } from '../ast/CborEmbeddedCBOR';\nimport { CborTag } from '../ast/CborTag';\nimport { decodeCBOR } from '../cbor/decoder';\n\nexport const TAG_CBOR_DATA = 24n;\n\nconst cbordata: CborExtension = {\n tagNumbers: [TAG_CBOR_DATA],\n\n parseTag(tag: bigint, value: CborItem): CborItem | undefined {\n if (tag !== TAG_CBOR_DATA) return undefined;\n if (!(value instanceof CborByteString)) return undefined;\n try {\n const decoded = decodeCBOR(value.value);\n return new CborTag(TAG_CBOR_DATA, new CborEmbeddedCBOR([decoded]));\n } catch {\n return undefined;\n }\n },\n};\n\nexport default cbordata;\n","import type { CborExtension } from './types';\nimport dt from './dt';\nimport ip from './ip';\nimport bignum from './bignum';\nimport cri from './cri';\nimport hash from './hash';\nimport cbordata from './cbordata';\n\nexport const BUILTIN_EXTENSIONS: CborExtension[] = [\n dt,\n ip,\n bignum,\n cri,\n hash,\n cbordata,\n];\n","import type { FromJSOptions } from '../types';\nimport { CBOR_OMIT } from '../types';\nimport type { CborItem } from '../ast/CborItem';\nimport type { CborExtension } from '../extensions/types';\nimport { BUILTIN_EXTENSIONS } from '../extensions/builtins';\nimport { CborUint } from '../ast/CborUint';\nimport { CborNint } from '../ast/CborNint';\nimport { CborBigUint, CborBigNint } from '../ast/CborBignum';\nimport { CborByteString } from '../ast/CborByteString';\nimport { CborTextString } from '../ast/CborTextString';\nimport { CborArray } from '../ast/CborArray';\nimport { CborMap } from '../ast/CborMap';\nimport { CborFloat } from '../ast/CborFloat';\nimport { CborSimple } from '../ast/CborSimple';\nimport { CborTag } from '../ast/CborTag';\nimport { Tag } from '../tag';\nimport { Simple } from '../simple';\nimport { MapEntries } from '../mapEntries';\n\n/**\n * Convert a plain JavaScript value to a CborItem AST node.\n *\n * Type dispatch order:\n * object with [Tag.symbol] symbol → CborTag (wraps the inner value)\n * null / undefined / boolean → CborSimple\n * bigint → CborUint / CborNint / CborBigUint / CborBigNint\n * number → CborFloat, or CborUint/CborNint if integerAs='int' (default)\n * string → CborTextString\n * Number / Boolean / String / BigInt object → unwrapped primitive (recurse)\n * Tag.Null / Tag.Undefined → CborSimple.NULL / UNDEFINED\n * ArrayBuffer / SharedArrayBuffer → CborByteString\n * ArrayBufferView (TypedArray, DataView, …) → CborByteString (Uint8Array respects uint8ArrayAs)\n * Array → CborArray (recursive)\n * Map → CborMap (keys also converted recursively)\n * plain object → CborMap (string keys → CborTextString)\n */\nexport function fromJS(value: unknown, options?: FromJSOptions): CborItem {\n if (options?.replacer) {\n const { replacer, ...rest } = options;\n const replaced = _applyReplacer(\n value,\n replacer,\n rest.extensions,\n rest.undefinedOmits\n );\n if (replaced === CBOR_OMIT) return CborSimple.UNDEFINED;\n return fromJS(\n replaced,\n Object.keys(rest).length > 0 ? (rest as FromJSOptions) : undefined\n );\n }\n return _fromJS(value, options, true);\n}\n\nfunction _fromJS(\n value: unknown,\n options: FromJSOptions | undefined,\n checkTag: boolean\n): CborItem {\n // ── Extension fromJS hooks ───────────────────────────────────────────────────\n for (const ext of [...(options?.extensions ?? []), ...BUILTIN_EXTENSIONS]) {\n if (ext.fromJS) {\n const result = ext.fromJS(value, options ?? {});\n if (result !== undefined) return result;\n }\n }\n\n // ── CBOR tag annotation (Symbol key) ────────────────────────────────────────\n // checkTag=false on the recursive call to skip this branch and convert the\n // inner value normally, avoiding infinite recursion.\n // After converting the inner value, try parseTag() hooks so that e.g.\n // dt / ip can produce their specialised subclasses without needing\n // a separate fromJS() hook on the extension.\n if (\n checkTag &&\n typeof value === 'object' &&\n value !== null &&\n Tag.symbol in (value as object)\n ) {\n const tag = (value as Record<symbol, bigint>)[Tag.symbol];\n const innerValue = _fromJS(value, options, false);\n for (const ext of [...(options?.extensions ?? []), ...BUILTIN_EXTENSIONS]) {\n if (ext.parseTag) {\n const result = ext.parseTag(tag, innerValue);\n if (result !== undefined) return result;\n }\n }\n return new CborTag(tag, innerValue);\n }\n\n // ── Null wrapper (from CborTag.toJS() of tagged null) ───────────────────────\n // Must come AFTER the Tag.symbol check so that Tag.Null (which carries\n // a [Tag.symbol] symbol) is first wrapped in CborTag, then unwrapped as NULL\n // in the recursive checkTag=false call.\n if (value instanceof Tag.Null) return CborSimple.NULL;\n if (value instanceof Tag.Undefined) return CborSimple.UNDEFINED;\n if (value instanceof Simple) return new CborSimple(value.value);\n\n // ── Primitives ───────────────────────────────────────────────────────────────\n if (value === null) return CborSimple.NULL;\n if (value === undefined) return CborSimple.UNDEFINED;\n if (value === true) return CborSimple.TRUE;\n if (value === false) return CborSimple.FALSE;\n\n if (typeof value === 'bigint') {\n if (value > 0xffff_ffff_ffff_ffffn) return new CborBigUint(value);\n if (value < -(0xffff_ffff_ffff_ffffn + 1n)) return new CborBigNint(value);\n return value >= 0n ? new CborUint(value) : new CborNint(value);\n }\n\n if (typeof value === 'number') {\n const integerAs = options?.encodeIntegerAs ?? 'int';\n if (\n integerAs === 'int' &&\n Number.isInteger(value) &&\n !Object.is(value, -0)\n ) {\n if (value >= 0) return new CborUint(BigInt(value));\n return new CborNint(BigInt(value));\n }\n return new CborFloat(value);\n }\n\n if (typeof value === 'string') return new CborTextString(value);\n\n // ── Boxed primitives — unwrap and recurse ───────────────────────────────────\n if (value instanceof Number) return _fromJS(value.valueOf(), options, false);\n if (value instanceof Boolean) return _fromJS(value.valueOf(), options, false);\n if (value instanceof String) return _fromJS(value.valueOf(), options, false);\n // Object(bigint) — detected via Object.prototype.toString\n if (Object.prototype.toString.call(value) === '[object BigInt]')\n return _fromJS((value as { valueOf(): bigint }).valueOf(), options, false);\n\n // ── ArrayBuffer / SharedArrayBuffer ─────────────────────────────────────────\n if (\n value instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' &&\n value instanceof SharedArrayBuffer)\n ) {\n return new CborByteString(new Uint8Array(value as ArrayBuffer));\n }\n\n // ── ArrayBufferView (TypedArray variants, DataView) ─────────────────────────\n if (ArrayBuffer.isView(value)) {\n if (value instanceof Uint8Array && options?.uint8ArrayAs === 'array') {\n return new CborArray(Array.from(value, (b) => new CborUint(BigInt(b))));\n }\n return new CborByteString(\n new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n );\n }\n\n if (value instanceof MapEntries) {\n return new CborMap(\n [...value].map(\n ([k, v]) =>\n [fromJS(k, options), fromJS(v, options)] as [CborItem, CborItem]\n )\n );\n }\n\n if (Array.isArray(value)) {\n return new CborArray(value.map((item) => fromJS(item, options)));\n }\n\n if (typeof value === 'object') {\n const entries: [CborItem, CborItem][] = [];\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n entries.push([new CborTextString(k), fromJS(v, options)]);\n }\n return new CborMap(entries);\n }\n\n throw new TypeError(`fromJS: unsupported value type: ${typeof value}`);\n}\n\n// ─── Replacer helper ────────────────────────────────────────────────────────\n\ntype _FnReplacer = (this: unknown, key: unknown, value: unknown) => unknown;\ntype _Replacer = _FnReplacer | (string | number)[];\n\n/** True for values that _fromJS handles via a dedicated branch (not Object.entries). */\nfunction _isNativelyHandled(v: object): boolean {\n return (\n ArrayBuffer.isView(v) ||\n v instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' &&\n v instanceof SharedArrayBuffer) ||\n v instanceof Number ||\n v instanceof Boolean ||\n v instanceof String ||\n Object.prototype.toString.call(v) === '[object BigInt]' ||\n v instanceof Tag.Null ||\n v instanceof Tag.Undefined ||\n v instanceof Simple\n );\n}\n\nexport function _applyReplacer(\n value: unknown,\n replacer: _Replacer,\n extensions?: readonly CborExtension[],\n undefinedOmits?: boolean\n): unknown {\n const allExts: readonly CborExtension[] = [\n ...(extensions ?? []),\n ...BUILTIN_EXTENSIONS,\n ];\n\n /** True when a replacer/reviver result should cause the entry to be dropped. */\n function _omits(v: unknown): boolean {\n return v === CBOR_OMIT || (undefinedOmits === true && v === undefined);\n }\n\n if (Array.isArray(replacer)) {\n const allowed = (replacer as (string | number)[]).map(String);\n function filterKeys(v: unknown): unknown {\n if (v === null || typeof v !== 'object') return v;\n if (v instanceof MapEntries)\n return MapEntries.from(\n v,\n ([k, val]) => [k, filterKeys(val)] as [unknown, unknown]\n );\n if (Array.isArray(v)) return v.map(filterKeys);\n // Tagged objects pass through so fromJS can encode the tag natively.\n if (Tag.symbol in (v as object)) return v;\n // Built-in types pass through so fromJS can handle them natively.\n if (_isNativelyHandled(v as object)) return v;\n // Extension-owned values pass through so fromJS can handle them natively.\n if (allExts.some((ext) => ext.isJSType?.(v))) return v;\n // Plain objects only: honor toJSON() first (matches JSON.stringify semantics).\n const proto = Object.getPrototypeOf(v as object) as unknown;\n if (proto === Object.prototype || proto === null) {\n const toJSON = (v as Record<string, unknown>)['toJSON'];\n if (typeof toJSON === 'function')\n return filterKeys((toJSON as () => unknown).call(v));\n }\n const result: Record<string, unknown> = {};\n for (const k of allowed) {\n if (Object.prototype.hasOwnProperty.call(v, k))\n result[k] = filterKeys((v as Record<string, unknown>)[k]);\n }\n return result;\n }\n return filterKeys(value);\n }\n\n const fn = replacer as _FnReplacer;\n function applyFn(val: unknown, key: unknown, holder: unknown): unknown {\n // Call toJSON() only on plain objects (proto === Object.prototype or null).\n // Non-plain objects (Date, TypedArray, extension-backed classes…) pass\n // through so fromJS extensions can handle them; MapEntries is also skipped\n // so its integer keys and structure are preserved for CBOR encoding.\n if (\n val !== null &&\n typeof val === 'object' &&\n !(val instanceof MapEntries)\n ) {\n const proto = Object.getPrototypeOf(val as object) as unknown;\n if (proto === Object.prototype || proto === null) {\n const toJSON = (val as Record<string, unknown>)['toJSON'];\n if (typeof toJSON === 'function')\n val = (toJSON as (k: unknown) => unknown).call(val, key);\n }\n }\n val = fn.call(holder, key, val);\n if (val !== null && typeof val === 'object') {\n // Tagged objects pass through so fromJS can encode the tag natively.\n if (Tag.symbol in (val as object)) return val;\n if (val instanceof MapEntries) {\n const result = new MapEntries();\n for (const [k, v] of val) {\n const newV = applyFn(v, k, val);\n if (!_omits(newV)) result.push([k, newV]);\n }\n return result;\n }\n if (Array.isArray(val)) {\n return (val as unknown[]).map((v, i) => {\n const child = applyFn(v, String(i), val);\n // CBOR.OMIT / undefined-omits in arrays → null (matches JSON.stringify).\n return _omits(child) ? null : child;\n });\n }\n // Built-in types pass through to fromJS unchanged.\n if (_isNativelyHandled(val as object)) return val;\n // Extension-owned values pass through so fromJS can handle them natively.\n if (allExts.some((ext) => ext.isJSType?.(val))) return val;\n const result: Record<string, unknown> = {};\n for (const k of Object.keys(val as object)) {\n const child = applyFn((val as Record<string, unknown>)[k], k, val);\n if (!_omits(child)) result[k] = child;\n }\n return result;\n }\n return val;\n }\n return applyFn(value, '', { '': value });\n}\n","import { fromJS } from './js/fromJS';\n\nexport class MapEntries extends Array<[unknown, unknown]> {\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [k, v] of this) {\n const key = typeof k === 'string' ? k : fromJS(k).toEDN();\n if (key === '__proto__') {\n Object.defineProperty(result, key, {\n value: v,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n result[key] = v;\n }\n }\n return result;\n }\n}\n"],"x_google_ignoreList":[30,31,32,33,34,35],"mappings":"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"}
|