@cbortech/cbor 0.25.6 → 0.25.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["#defaults","#merge"],"sources":["../src/utils/strip-comments.ts","../src/extensions/b32.ts","../src/extensions/float.ts","../src/extensions/same.ts","../src/cbor.ts"],"sourcesContent":["/**\n * Strip whitespace and EDN §2.2 comments from app-string content.\n *\n * Used by extensions whose content allows the same comment syntax as byte\n * string literals (b32, h32, float, …):\n * SP / LF / CR — whitespace, skipped\n * # … LF — line comment\n * // … LF — line comment\n * /* … *\\/ — block comment (unterminated → SyntaxError)\n * / … / — block comment (unterminated → SyntaxError)\n */\nexport function stripComments(str: string): string {\n let out = '';\n let i = 0;\n while (i < str.length) {\n const ch = str[i];\n if (ch === ' ' || ch === '\\n' || ch === '\\r') {\n i++;\n continue;\n }\n if (ch === '#') {\n while (i < str.length && str[i] !== '\\n') i++;\n continue;\n }\n if (ch === '/') {\n const next = str[i + 1] ?? '';\n if (next === '/') {\n while (i < str.length && str[i] !== '\\n') i++;\n continue;\n }\n if (next === '*') {\n i += 2;\n while (\n i < str.length &&\n !(str[i] === '*' && (str[i + 1] ?? '') === '/')\n )\n i++;\n if (i >= str.length)\n throw new SyntaxError('unterminated block comment');\n i += 2; // consume */\n continue;\n }\n // / … / block comment\n i++;\n while (i < str.length && str[i] !== '/') i++;\n if (i >= str.length) throw new SyntaxError('unterminated block comment');\n i++; // consume closing /\n continue;\n }\n out += ch;\n i++;\n }\n return out;\n}\n","import type { CborExtension } from './types';\nimport { CborByteString } from '../ast/CborByteString';\nimport { stripComments } from '../utils/strip-comments';\n\nconst B32_ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\nconst H32_ALPHA = '0123456789ABCDEFGHIJKLMNOPQRSTUV';\n\nfunction stripBase32Padding(str: string): string {\n let end = str.length;\n while (end > 0 && str.charCodeAt(end - 1) === 0x3d) end--;\n return str.slice(0, end);\n}\n\nfunction base32Decode(\n str: string,\n alpha: string,\n onError?: (msg: string) => void\n): Uint8Array {\n // Padding is optional; strip it before decoding.\n const s = stripBase32Padding(str).toUpperCase();\n // RFC 4648 §6: valid unpadded lengths mod 8 are 0, 2, 4, 5, 7.\n // Lengths 1, 3, 6 can never result 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 final quantum must be zero.\n if (bufBits > 0 && (buf & ((1 << bufBits) - 1)) !== 0) {\n const msg = 'non-zero trailing bits in base32 input';\n if (onError) onError(msg);\n else throw new SyntaxError(msg);\n }\n return out;\n}\n\n/** RFC 4648 §6 Base32 (A–Z 2–7) app-string extension. */\nexport const b32: CborExtension = {\n appStringPrefixes: ['b32'],\n parseAppString(_prefix, content, onError) {\n return new CborByteString(\n base32Decode(stripComments(content), B32_ALPHA, onError),\n {\n ednEncoding: 'base32',\n }\n );\n },\n};\n\n/** RFC 4648 §7 Base32Hex (0–9 A–V) app-string extension. */\nexport const h32: CborExtension = {\n appStringPrefixes: ['h32'],\n parseAppString(_prefix, content, onError) {\n return new CborByteString(\n base32Decode(stripComments(content), H32_ALPHA, onError),\n {\n ednEncoding: 'base32hex',\n }\n );\n },\n};\n","/**\n * `float'...'` / `float<<...>>` app-string extension.\n *\n * Interprets a hex bit-pattern as an IEEE 754 floating-point value:\n * - 4 hex digits (2 bytes) → float16 (CBOR major-7, additional 25 / 0xf9)\n * - 8 hex digits (4 bytes) → float32 (CBOR major-7, additional 26 / 0xfa)\n * - 16 hex digits (8 bytes) → float64 (CBOR major-7, additional 27 / 0xfb)\n *\n * The string form `float'...'` supports the same comment syntax as `h'...'`:\n * slash-delimited block comments, C-style block comments, line comments (`//`\n * and `#`). The extension strips comments from the raw content itself.\n *\n * The sequence form `float<<byteStr>>` accepts a single byte-string expression\n * (e.g. `float<<h'7ef0'>>`) and interprets its bytes as float bits.\n *\n * Defined in draft-ietf-cbor-edn-literals §3.7. Not included in the default\n * extension set (must be added explicitly):\n *\n * @example\n * import { float } from '@cbortech/cbor';\n * parseCDN(\"float'7ef0'\", { extensions: [float] }); // NaN as float16\n */\n\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborFloat } from '../ast/CborFloat';\nimport { CborByteString } from '../ast/CborByteString';\nimport { float16BitsToFloat64, float64ToFloat16Bits } from '../utils/float16';\nimport { stripComments } from '../utils/strip-comments';\nimport { hexToBytes } from '../utils/hex';\nimport type { EncodingWidth } from '../cbor/encode';\n\n// ── Bit-preserving CborFloat subclasses ───────────────────────────────────────\n// CborFloat stores a JS `number`, which loses NaN payloads. These subclasses\n// override _toCBOR() to emit the original bit pattern verbatim.\n\nclass CborFloat16Bits extends CborFloat {\n private readonly _bits: number;\n constructor(bits: number) {\n super(float16BitsToFloat64(bits), { precision: 'half' });\n this._bits = bits & 0xffff;\n }\n override _toCBOR(): Uint8Array {\n return new Uint8Array([0xf9, (this._bits >> 8) & 0xff, this._bits & 0xff]);\n }\n}\n\nclass CborFloat32Bits extends CborFloat {\n private readonly _raw: Uint8Array;\n constructor(bytes: Uint8Array) {\n super(new DataView(bytes.buffer, bytes.byteOffset).getFloat32(0, false), {\n precision: 'single',\n });\n this._raw = bytes.slice();\n }\n override _toCBOR(): Uint8Array {\n const out = new Uint8Array(5);\n out[0] = 0xfa;\n out.set(this._raw, 1);\n return out;\n }\n}\n\nclass CborFloat64Bits extends CborFloat {\n private readonly _raw: Uint8Array;\n constructor(bytes: Uint8Array) {\n super(new DataView(bytes.buffer, bytes.byteOffset).getFloat64(0, false), {\n precision: 'double',\n });\n this._raw = bytes.slice();\n }\n override _toCBOR(): Uint8Array {\n const out = new Uint8Array(9);\n out[0] = 0xfb;\n out.set(this._raw, 1);\n return out;\n }\n}\n\nfunction floatFromBytes(bytes: Uint8Array): CborFloat {\n if (bytes.length === 2) {\n const bits = (bytes[0]! << 8) | bytes[1]!;\n return new CborFloat16Bits(bits);\n }\n if (bytes.length === 4) return new CborFloat32Bits(bytes);\n if (bytes.length === 8) return new CborFloat64Bits(bytes);\n throw new SyntaxError(\n `float'...' requires 4, 8, or 16 hex digits (2, 4, or 8 bytes); got ${bytes.length} bytes`\n );\n}\n\n/** Expand float16 bit pattern to 4-byte float32 (bit-exact, preserves NaN payloads). */\nfunction float16BitsToFloat32Bytes(bits16: number): Uint8Array {\n const sign = (bits16 >>> 15) & 1;\n const exp16 = (bits16 >>> 10) & 0x1f;\n const mant16 = bits16 & 0x3ff;\n let bits32: number;\n if (exp16 === 0x1f) {\n bits32 = (sign << 31) | 0x7f800000 | (mant16 << 13);\n } else if (exp16 === 0 && mant16 === 0) {\n bits32 = sign << 31;\n } else if (exp16 === 0) {\n // Denormal float16 → normal float32\n let m = mant16;\n let shifts = 0;\n while ((m & 0x200) === 0) {\n m <<= 1;\n shifts++;\n }\n bits32 = (sign << 31) | ((112 - shifts) << 23) | ((m & 0x1ff) << 14);\n } else {\n bits32 = (sign << 31) | ((exp16 + 112) << 23) | (mant16 << 13);\n }\n const out = new Uint8Array(4);\n new DataView(out.buffer).setUint32(0, bits32 >>> 0, false);\n return out;\n}\n\n/** Expand float16 bit pattern to 8-byte float64 (bit-exact, preserves NaN payloads). */\nfunction float16BitsToFloat64Bytes(bits16: number): Uint8Array {\n const sign = (bits16 >>> 15) & 1;\n const exp16 = (bits16 >>> 10) & 0x1f;\n const mant16 = bits16 & 0x3ff;\n const out = new Uint8Array(8);\n const dv = new DataView(out.buffer);\n if (exp16 === 0x1f) {\n dv.setUint32(0, ((sign << 31) | 0x7ff00000 | (mant16 << 10)) >>> 0, false);\n dv.setUint32(4, 0, false);\n } else if (exp16 === 0 && mant16 === 0) {\n dv.setUint32(0, (sign << 31) >>> 0, false);\n dv.setUint32(4, 0, false);\n } else if (exp16 === 0) {\n // Denormal float16 → normal float64\n let m = mant16;\n let shifts = 0;\n while ((m & 0x200) === 0) {\n m <<= 1;\n shifts++;\n }\n dv.setUint32(\n 0,\n ((sign << 31) | ((1008 - shifts) << 20) | ((m & 0x1ff) << 11)) >>> 0,\n false\n );\n dv.setUint32(4, 0, false);\n } else {\n dv.setUint32(\n 0,\n ((sign << 31) | ((exp16 + 1008) << 20) | (mant16 << 10)) >>> 0,\n false\n );\n dv.setUint32(4, 0, false);\n }\n return out;\n}\n\n/** Expand float32 bit pattern to 8-byte float64 (bit-exact, preserves NaN payloads). */\nfunction float32BitsToFloat64Bytes(bytes4: Uint8Array): Uint8Array {\n const bits32 = new DataView(bytes4.buffer, bytes4.byteOffset).getUint32(\n 0,\n false\n );\n const sign = (bits32 >>> 31) & 1;\n const exp32 = (bits32 >>> 23) & 0xff;\n const mant32 = bits32 & 0x7fffff;\n const out = new Uint8Array(8);\n const dv = new DataView(out.buffer);\n if (exp32 === 0xff) {\n dv.setUint32(0, ((sign << 31) | 0x7ff00000 | (mant32 >>> 3)) >>> 0, false);\n dv.setUint32(4, (mant32 & 7) << 29, false);\n } else if (exp32 === 0 && mant32 === 0) {\n dv.setUint32(0, (sign << 31) >>> 0, false);\n dv.setUint32(4, 0, false);\n } else {\n // Normal or denormal: JS arithmetic is exact (float32 ⊂ float64), NaN handled above.\n const f64 = new DataView(bytes4.buffer, bytes4.byteOffset).getFloat32(\n 0,\n false\n );\n dv.setFloat64(0, f64, false);\n }\n return out;\n}\n\n/**\n * Re-encode float bytes at a target precision (_1=half, _2=single, _3=double).\n * Returns undefined if the conversion is lossy (caller should warn).\n */\nfunction reencodeFloat(\n bytes: Uint8Array,\n targetWidth: 1 | 2 | 3,\n onError: (msg: string) => void\n): CborFloat {\n const naturalWidth = bytes.length === 2 ? 1 : bytes.length === 4 ? 2 : 3;\n\n if (naturalWidth === 1) {\n const bits16 = (bytes[0]! << 8) | bytes[1]!;\n if (targetWidth === 2)\n return new CborFloat32Bits(float16BitsToFloat32Bytes(bits16));\n if (targetWidth === 3)\n return new CborFloat64Bits(float16BitsToFloat64Bytes(bits16));\n }\n\n if (naturalWidth === 2) {\n if (targetWidth === 3)\n return new CborFloat64Bits(float32BitsToFloat64Bytes(bytes));\n if (targetWidth === 1) {\n const f32 = new DataView(bytes.buffer, bytes.byteOffset).getFloat32(\n 0,\n false\n );\n const bits16 = float64ToFloat16Bits(f32);\n if (!Object.is(float16BitsToFloat64(bits16), f32) && !isNaN(f32)) {\n onError(\n `float'...' value cannot be exactly represented as float16 (_1)`\n );\n }\n return new CborFloat16Bits(bits16);\n }\n }\n\n if (naturalWidth === 3) {\n const f64 = new DataView(bytes.buffer, bytes.byteOffset).getFloat64(\n 0,\n false\n );\n if (targetWidth === 1) {\n const bits16 = float64ToFloat16Bits(f64);\n if (!Object.is(float16BitsToFloat64(bits16), f64) && !isNaN(f64)) {\n onError(\n `float'...' value cannot be exactly represented as float16 (_1)`\n );\n }\n return new CborFloat16Bits(bits16);\n }\n if (targetWidth === 2) {\n const f32 = Math.fround(f64);\n if (!Object.is(f32, f64) && !isNaN(f64)) {\n onError(\n `float'...' value cannot be exactly represented as float32 (_2)`\n );\n }\n const out = new Uint8Array(4);\n new DataView(out.buffer).setFloat32(0, f32, false);\n return new CborFloat32Bits(out);\n }\n }\n\n // naturalWidth === targetWidth: identity (already handled by caller)\n return floatFromBytes(bytes);\n}\n\n/**\n * Extension object for `float'...'` / `float<<...>>`.\n * Pass to `parseCDN(..., { extensions: [float] })`.\n */\nexport const float: CborExtension = {\n appStringPrefixes: ['float'],\n\n parseAppString(\n _prefix: string,\n content: string,\n onError?: (msg: string) => void,\n options?: { encodingWidth?: EncodingWidth }\n ): CborItem {\n const hex = stripComments(content);\n if (!/^[0-9a-fA-F]*$/.test(hex))\n throw new SyntaxError(`float'...' contains non-hex characters`);\n if (hex.length % 2 !== 0)\n throw new SyntaxError(\n `float'...' hex content has odd length (${hex.length} digits)`\n );\n const bytes = hexToBytes(hex);\n const ew = options?.encodingWidth;\n if (ew === undefined) return floatFromBytes(bytes);\n if (ew !== 1 && ew !== 2 && ew !== 3) {\n const msg = `float'...' encoding indicator _${ew} is not valid; use _1, _2, or _3`;\n if (onError) {\n onError(msg);\n return floatFromBytes(bytes);\n }\n throw new SyntaxError(msg);\n }\n const naturalWidth = bytes.length === 2 ? 1 : bytes.length === 4 ? 2 : 3;\n if (ew === naturalWidth) return floatFromBytes(bytes);\n const fallbackOnError =\n onError ??\n ((msg: string) => {\n throw new SyntaxError(msg);\n });\n return reencodeFloat(bytes, ew, fallbackOnError);\n },\n\n parseAppSequence(\n _prefix: string,\n items: CborItem[],\n onError?: (msg: string) => void\n ): CborItem {\n if (items.length === 0)\n throw new SyntaxError(\n `float<<...>> requires exactly one byte-string item`\n );\n if (items.length > 1) {\n const msg = `float<<...>> expects 1 item; got ${items.length} — using first`;\n if (onError) onError(msg);\n else throw new SyntaxError(msg);\n }\n if (!(items[0] instanceof CborByteString))\n throw new SyntaxError(`float<<...>> item must be a byte string`);\n return floatFromBytes(items[0].value);\n },\n};\n\nexport default float;\n","/**\n * `same<<expr, expr, ...>>` app-sequence extension.\n *\n * Evaluates every item in the sequence to CBOR bytes and asserts that all\n * produce identical bytes. Returns the first item if all match.\n *\n * In strict mode a mismatch throws a `SyntaxError`. In lenient mode\n * (`strict: false`) a mismatch emits a `ParseWarning` and returns the first\n * item so parsing can continue.\n *\n * `same<<x>>` (single item) is a no-op assertion that always passes.\n *\n * The parsed result is wrapped in `CborAppSeqResult` so that `toCDN()` round-trips\n * the original `same<<...>>` notation. `toCBOR()` and `toJS()` delegate\n * transparently to the inner item; `appStrings: false` produces the resolved value.\n * The result is not directly `instanceof` the inner item's class.\n *\n * This extension is a testing/validation construct from the cabo/edn-abnf\n * corpus and is NOT part of draft-ietf-cbor-edn-literals. It is not included\n * in the default extension set. Add it explicitly:\n *\n * @example\n * import { same } from '@cbortech/cbor';\n * parseCDN(\"same<<b64'AA',h'00'>>\", { extensions: [same] }); // h'00'\n */\n\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/**\n * Extension object for `same<<...>>`.\n * Pass to `parseCDN(..., { extensions: [same] })`.\n */\nexport const same: CborExtension = {\n appStringPrefixes: ['same'],\n preserveAppSeqSource: true,\n\n parseAppSequence(\n _prefix: string,\n items: CborItem[],\n onError?: (msg: string) => void\n ): CborItem {\n if (items.length === 0)\n throw new SyntaxError(`same<<...>> requires at least one item`);\n const first = items[0]!;\n const firstCbor = first.toCBOR();\n for (let i = 1; i < items.length; i++) {\n const otherCbor = items[i]!.toCBOR();\n if (!bytesEqual(firstCbor, otherCbor)) {\n const msg = `same<<...>>: item ${i} produces different CBOR bytes than item 0`;\n if (onError)\n onError(msg); // lenient: warn + return first item\n else throw new SyntaxError(msg);\n }\n }\n return first;\n },\n};\n\nexport default same;\n","import type { CborItem } from './ast/CborItem';\nimport type {\n CBOROptions,\n FromCBOROptions,\n FromCDNOptions,\n FromHexDumpOptions,\n FromJSOptions,\n ToCBOROptions,\n ToCDNOptions,\n ToJSOptions,\n} from './types';\nimport { CBOR_OMIT } from './types';\nimport { decodeCBOR } from './cbor/decoder';\nimport { parseCDN } from './cdn/parser';\nimport { dt_as_Date as _dt_as_Date } from './extensions/dt';\nimport { fromJS as _fromJS, _applyReplacer } from './js/fromJS';\nimport { MapEntries as _MapEntries } from './mapEntries';\nimport { Simple as _Simple } from './simple';\nimport { CBOR_TAG, Tag as _Tag } from './tag';\n\n/**\n * Main facade class.\n *\n * Provides factory methods for constructing AST nodes from the three\n * supported input formats, and shortcut methods that mirror the\n * `JSON.parse` / `JSON.stringify` API.\n *\n * @example\n * // CBOR binary → AST → CBOR binary\n * const ast = CBOR.fromCBOR(bytes);\n * const reencoded = ast.toCBOR();\n *\n * @example\n * // JS value → CBOR binary (shortcut)\n * const bytes = CBOR.encode({ hello: 'world' });\n *\n * @example\n * // CBOR binary → JS value (shortcut)\n * const value = CBOR.decode(bytes);\n */\nexport class CBOR {\n /**\n * Sentinel returned from a replacer or reviver to omit the key/element from\n * the output. Use this instead of `undefined` when `undefinedOmits` is\n * `false` (the default) and you need to drop a specific entry.\n */\n static readonly OMIT: typeof CBOR_OMIT = CBOR_OMIT;\n\n /** Unique symbol used to attach a CBOR tag number to a JS value. */\n static readonly TAG: typeof CBOR_TAG = CBOR_TAG;\n\n /** Namespace for CBOR tag annotation utilities. */\n static readonly Tag: typeof _Tag = _Tag;\n\n /** Wrapper for CBOR simple values other than false/true/null/undefined. */\n static readonly Simple: typeof _Simple = _Simple;\n\n /** Array subclass used to preserve CBOR map entries, including duplicates. */\n static readonly MapEntries: typeof _MapEntries = _MapEntries;\n\n /** Extension that maps CDN dt/DT values to JavaScript Date objects. */\n static readonly dt_as_Date: typeof _dt_as_Date = _dt_as_Date;\n\n // ─── Instance API ───────────────────────────────────────────────────────────\n\n readonly #defaults: CBOROptions;\n\n /**\n * Create a reusable instance with default options applied to every method call.\n * Per-call options always override these defaults.\n *\n * @example\n * const cbor = new CBOR({ extensions: [CBOR.dt_as_Date] });\n * const obj = cbor.parse('{ \"dt\": DT\\'2024-01-01T00:00:00Z\\' }');\n * const text = cbor.stringify(obj);\n */\n constructor(defaults?: CBOROptions) {\n this.#defaults = defaults ?? {};\n }\n\n #merge<T extends object>(perCall?: T): CBOROptions & T {\n return { ...this.#defaults, ...(perCall ?? {}) } as CBOROptions & T;\n }\n\n fromCBOR(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions\n ): CborItem {\n const node = CBOR.fromCBOR(input, this.#merge(options));\n node._defaults = this.#defaults;\n return node;\n }\n\n fromCDN(text: string, options?: FromCDNOptions): CborItem {\n const node = CBOR.fromCDN(text, this.#merge(options));\n node._defaults = this.#defaults;\n return node;\n }\n\n /** @deprecated Use `fromCDN()` instead. */\n fromEDN(text: string, options?: FromCDNOptions): CborItem {\n return this.fromCDN(text, options);\n }\n\n fromJS(value: unknown, options?: FromJSOptions): CborItem {\n const node = CBOR.fromJS(value, this.#merge(options));\n node._defaults = this.#defaults;\n return node;\n }\n\n fromHexDump(text: string, options?: FromHexDumpOptions): CborItem {\n const node = CBOR.fromHexDump(text, this.#merge(options));\n node._defaults = this.#defaults;\n return node;\n }\n\n decode(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToJSOptions\n ): unknown {\n return CBOR.decode(input, this.#merge(options));\n }\n\n encode(value: unknown, options?: FromJSOptions & ToCBOROptions): Uint8Array {\n return CBOR.encode(value, this.#merge(options));\n }\n\n /**\n * @deprecated Use `cborToCdn()` or `fromCBOR(input, options).toCDN(options)` instead.\n */\n cborToCborEdn(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToCDNOptions\n ): string {\n return this.cborToCdn(input, options);\n }\n\n cborToCdn(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToCDNOptions\n ): string {\n return CBOR.cborToCdn(input, this.#merge(options));\n }\n\n /**\n * @deprecated Use `cdnToCbor()` or `fromCDN(text, options).toCBOR(options)` instead.\n */\n cborEdnToCbor(\n text: string,\n options?: FromCDNOptions & ToCBOROptions\n ): Uint8Array {\n return this.cdnToCbor(text, options);\n }\n\n cdnToCbor(\n text: string,\n options?: FromCDNOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.cdnToCbor(text, this.#merge(options));\n }\n\n parse(text: string): unknown;\n parse(\n text: string,\n reviver: (this: unknown, key: unknown, value: unknown) => unknown\n ): unknown;\n parse(text: string, options: FromCDNOptions & ToJSOptions): unknown;\n parse(\n text: string,\n arg2?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (FromCDNOptions & ToJSOptions)\n ): unknown {\n if (typeof arg2 === 'function') {\n const merged = this.#merge<ToJSOptions>({ reviver: arg2 });\n return CBOR.fromCDN(text, merged).toJS(merged);\n }\n const merged = this.#merge(arg2);\n return CBOR.fromCDN(text, merged).toJS(merged);\n }\n\n stringify(value: unknown): string;\n stringify(\n value: unknown,\n replacer:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[]\n | null,\n space?: string | number\n ): string;\n stringify(value: unknown, options: FromJSOptions & ToCDNOptions): string;\n stringify(\n value: unknown,\n arg2?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[]\n | null\n | (FromJSOptions & ToCDNOptions),\n arg3?: string | number\n ): string {\n if (\n typeof arg2 === 'function' ||\n Array.isArray(arg2) ||\n arg2 === null ||\n (arg2 === undefined && arg3 !== undefined)\n ) {\n const opts: FromJSOptions & ToCDNOptions = {\n ...(this.#defaults as FromJSOptions & ToCDNOptions),\n };\n if (arg2 === null) {\n opts.replacer = undefined;\n } else if (typeof arg2 === 'function' || Array.isArray(arg2)) {\n opts.replacer = arg2;\n }\n if (arg3 !== undefined) opts.indent = resolveSpace(arg3);\n return CBOR.stringify(value, opts);\n }\n return CBOR.stringify(value, this.#merge(arg2 ?? undefined));\n }\n\n format(text: string, options?: FromCDNOptions & ToCDNOptions): string {\n return CBOR.format(text, this.#merge(options));\n }\n\n // ─── Factory methods ────────────────────────────────────────────────────────\n\n /** Decode CBOR binary data into an AST node. */\n static fromCBOR(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions\n ): CborItem {\n return decodeCBOR(input, options);\n }\n\n /** Parse a CDN text string into an AST node. */\n static fromCDN(text: string, options?: FromCDNOptions): CborItem {\n return parseCDN(text, options);\n }\n\n /**\n * Parse a CDN text string into an AST node.\n *\n * @deprecated Use `fromCDN()` instead.\n */\n static fromEDN(text: string, options?: FromCDNOptions): CborItem {\n return CBOR.fromCDN(text, options);\n }\n\n /** Convert a JavaScript value into an AST node. */\n static fromJS(value: unknown, options?: FromJSOptions): CborItem {\n return _fromJS(value, options);\n }\n\n /**\n * Parse an annotated hex dump (as produced by {@link CborItem#toHexDump})\n * into an AST node.\n *\n * Each line is expected to have the form:\n * `[whitespace] HH [HH …] -- comment`\n * `[whitespace] HH [HH …] # comment`\n * `[whitespace] HH [HH …] // comment`\n * Block comments may also be written as `/ comment /` or `/* comment *\\/`.\n * Lines with no hex content before the comment marker are ignored.\n */\n static fromHexDump(text: string, options?: FromHexDumpOptions): CborItem {\n const bytes: number[] = [];\n const uncommented = stripHexDumpComments(text);\n const tokens = uncommented.trim().split(/\\s+/).filter(Boolean);\n for (const token of tokens) {\n if (/^[0-9A-Fa-f]{2}$/.test(token)) {\n bytes.push(parseInt(token, 16));\n } else if (/^[0-9A-Fa-f]+$/.test(token) && token.length % 2 === 0) {\n for (let i = 0; i < token.length; i += 2)\n bytes.push(parseInt(token.slice(i, i + 2), 16));\n } else {\n throw new SyntaxError(\n `Invalid hex token in dump: ${JSON.stringify(token)}`\n );\n }\n }\n return decodeCBOR(new Uint8Array(bytes), options);\n }\n\n // ─── Shortcut API ───────────────────────────────────────────────────────────\n\n /** Decode CBOR binary data directly to a JavaScript value. */\n static decode(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToJSOptions\n ): unknown {\n return CBOR.fromCBOR(input, options).toJS(options);\n }\n\n /** Encode a JavaScript value directly to CBOR binary data. */\n static encode(\n value: unknown,\n options?: FromJSOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.fromJS(value, options).toCBOR(options);\n }\n\n /**\n * Convert CBOR binary data directly to a CDN text string.\n */\n static cborToCdn(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToCDNOptions\n ): string {\n return CBOR.fromCBOR(input, options).toCDN(options);\n }\n\n /**\n * Convert CBOR binary data directly to a CDN text string.\n *\n * @deprecated Use `CBOR.cborToCdn()` or `CBOR.fromCBOR(input, options).toCDN(options)` instead.\n */\n static cborToCborEdn(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToCDNOptions\n ): string {\n return CBOR.cborToCdn(input, options);\n }\n\n /**\n * Convert a CDN text string directly to CBOR binary data.\n */\n static cdnToCbor(\n text: string,\n options?: FromCDNOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.fromCDN(text, options).toCBOR(options);\n }\n\n /**\n * Convert a CDN text string directly to CBOR binary data.\n *\n * @deprecated Use `CBOR.cdnToCbor()` or `CBOR.fromCDN(text, options).toCBOR(options)` instead.\n */\n static cborEdnToCbor(\n text: string,\n options?: FromCDNOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.cdnToCbor(text, options);\n }\n\n /**\n * Parse a CDN text string directly to a JavaScript value.\n *\n * Accepts either a JSON-compatible `reviver` function as the second argument,\n * or a plain options object (existing API).\n *\n * When a `reviver` is supplied it is applied bottom-up after the CDN text has\n * been parsed and converted to a JS value, matching the semantics of\n * `JSON.parse(text, reviver)`.\n *\n * Note: CBOR-specific value types such as `bigint` are passed to the reviver\n * as-is; the reviver is responsible for handling them.\n */\n static parse(text: string): unknown;\n static parse(\n text: string,\n reviver: (this: unknown, key: unknown, value: unknown) => unknown\n ): unknown;\n static parse(text: string, options: FromCDNOptions & ToJSOptions): unknown;\n static parse(\n text: string,\n arg2?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (FromCDNOptions & ToJSOptions)\n ): unknown {\n if (typeof arg2 === 'function') {\n return CBOR.fromCDN(text).toJS({ reviver: arg2 });\n }\n return CBOR.fromCDN(text, arg2).toJS(arg2);\n }\n\n /**\n * Serialize a JavaScript value directly to a CDN text string.\n *\n * Accepts either JSON-compatible `replacer` + `space` arguments, or a plain\n * options object (existing API).\n *\n * - `replacer` may be a function (transforms each key/value before encoding)\n * or an array of strings/numbers (allowlist of object keys to include).\n * Pass `null` to skip filtering.\n * - `space` controls indentation, mapping to `ToCDNOptions.indent`.\n * Numbers are clamped to `[0, 10]`; strings are truncated to 10 characters.\n */\n static stringify(value: unknown): string;\n static stringify(\n value: unknown,\n replacer:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[]\n | null,\n space?: string | number\n ): string;\n static stringify(\n value: unknown,\n options: FromJSOptions & ToCDNOptions\n ): string;\n static stringify(\n value: unknown,\n arg2?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[]\n | null\n | (FromJSOptions & ToCDNOptions),\n arg3?: string | number\n ): string {\n if (\n typeof arg2 === 'function' ||\n Array.isArray(arg2) ||\n arg2 === null ||\n (arg2 === undefined && arg3 !== undefined)\n ) {\n const replacer =\n typeof arg2 === 'function' || Array.isArray(arg2) ? arg2 : undefined;\n const indent = resolveSpace(arg3);\n if (replacer) {\n // Mirror JSON.stringify: if the replacer drops the root, return undefined.\n const replaced = _applyReplacer(value, replacer);\n if (replaced === undefined || replaced === CBOR_OMIT)\n return undefined as unknown as string;\n return _fromJS(replaced).toCDN(\n indent !== undefined ? { indent } : undefined\n );\n }\n return _fromJS(value).toCDN(\n indent !== undefined ? { indent } : undefined\n );\n }\n // Options form: also mirror JSON.stringify root-drop semantics.\n const opts = arg2 as (FromJSOptions & ToCDNOptions) | undefined;\n if (opts?.replacer) {\n const replaced = _applyReplacer(\n value,\n opts.replacer,\n opts.extensions,\n opts.undefinedOmits\n );\n if (replaced === undefined || replaced === CBOR_OMIT)\n return undefined as unknown as string;\n const { replacer: _r, ...restFromJS } = opts;\n return _fromJS(\n replaced,\n Object.keys(restFromJS).length > 0\n ? (restFromJS as FromJSOptions)\n : undefined\n ).toCDN(opts);\n }\n return _fromJS(value, opts as FromJSOptions | undefined).toCDN(opts);\n }\n\n /** Normalize a CDN text string by parsing and re-serializing it. */\n static format(text: string, options?: FromCDNOptions & ToCDNOptions): string {\n return CBOR.fromCDN(text, options).toCDN(options);\n }\n}\n\nfunction stripHexDumpComments(text: string): string {\n let out = '';\n let i = 0;\n\n while (i < text.length) {\n const ch = text[i];\n const next = text[i + 1] ?? '';\n\n if (ch === '-' && next === '-') {\n i = skipLineComment(text, i + 2);\n out += ' ';\n continue;\n }\n\n if (ch === '—') {\n i = skipLineComment(text, i + 1);\n out += ' ';\n continue;\n }\n\n if (ch === '#') {\n i = skipLineComment(text, i + 1);\n out += ' ';\n continue;\n }\n\n if (ch === '/' && next === '/') {\n i = skipLineComment(text, i + 2);\n out += ' ';\n continue;\n }\n\n if (ch === '/' && next === '*') {\n const end = text.indexOf('*/', i + 2);\n if (end < 0) throw new SyntaxError('Unterminated comment in hex dump');\n out += whitespaceLike(text.slice(i, end + 2));\n i = end + 2;\n continue;\n }\n\n if (ch === '/') {\n const end = text.indexOf('/', i + 1);\n if (end < 0) throw new SyntaxError('Unterminated comment in hex dump');\n out += whitespaceLike(text.slice(i, end + 1));\n i = end + 1;\n continue;\n }\n\n out += ch;\n i++;\n }\n\n return out;\n}\n\nfunction skipLineComment(text: string, start: number): number {\n const end = text.indexOf('\\n', start);\n return end < 0 ? text.length : end;\n}\n\nfunction whitespaceLike(text: string): string {\n return text.replace(/[^\\r\\n]/g, ' ');\n}\n\n// ─── Module-scope helper ─────────────────────────────────────────────────────\n\n/** Map JSON.stringify `space` argument to ToCDNOptions.indent. */\nfunction resolveSpace(\n space: string | number | undefined\n): string | number | undefined {\n if (typeof space === 'number') {\n const n = Math.floor(Math.min(10, Math.max(0, space)));\n return n === 0 ? undefined : n;\n }\n if (typeof space === 'string') {\n const s = space.slice(0, 10);\n return s || undefined;\n }\n return undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["#defaults","#merge"],"sources":["../src/utils/strip-comments.ts","../src/extensions/b32.ts","../src/extensions/float.ts","../src/extensions/same.ts","../src/cbor.ts"],"sourcesContent":["/**\n * Strip whitespace and EDN §2.2 comments from app-string content.\n *\n * Used by extensions whose content allows the same comment syntax as byte\n * string literals (b32, h32, float, …):\n * SP / LF / CR — whitespace, skipped\n * # … LF — line comment\n * // … LF — line comment\n * /* … *\\/ — block comment (unterminated → SyntaxError)\n * / … / — block comment (unterminated → SyntaxError)\n */\nexport function stripComments(str: string): string {\n let out = '';\n let i = 0;\n while (i < str.length) {\n const ch = str[i];\n if (ch === ' ' || ch === '\\n' || ch === '\\r') {\n i++;\n continue;\n }\n if (ch === '#') {\n while (i < str.length && str[i] !== '\\n') i++;\n continue;\n }\n if (ch === '/') {\n const next = str[i + 1] ?? '';\n if (next === '/') {\n while (i < str.length && str[i] !== '\\n') i++;\n continue;\n }\n if (next === '*') {\n i += 2;\n while (\n i < str.length &&\n !(str[i] === '*' && (str[i + 1] ?? '') === '/')\n )\n i++;\n if (i >= str.length)\n throw new SyntaxError('unterminated block comment');\n i += 2; // consume */\n continue;\n }\n // / … / block comment\n i++;\n while (i < str.length && str[i] !== '/') i++;\n if (i >= str.length) throw new SyntaxError('unterminated block comment');\n i++; // consume closing /\n continue;\n }\n out += ch;\n i++;\n }\n return out;\n}\n","import type { CborExtension } from './types';\nimport { CborByteString } from '../ast/CborByteString';\nimport { stripComments } from '../utils/strip-comments';\n\nconst B32_ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\nconst H32_ALPHA = '0123456789ABCDEFGHIJKLMNOPQRSTUV';\n\nfunction stripBase32Padding(str: string): string {\n let end = str.length;\n while (end > 0 && str.charCodeAt(end - 1) === 0x3d) end--;\n return str.slice(0, end);\n}\n\nfunction base32Decode(\n str: string,\n alpha: string,\n onError?: (msg: string) => void\n): Uint8Array {\n // Padding is optional; strip it before decoding.\n const s = stripBase32Padding(str).toUpperCase();\n // RFC 4648 §6: valid unpadded lengths mod 8 are 0, 2, 4, 5, 7.\n // Lengths 1, 3, 6 can never result 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 final quantum must be zero.\n if (bufBits > 0 && (buf & ((1 << bufBits) - 1)) !== 0) {\n const msg = 'non-zero trailing bits in base32 input';\n if (onError) onError(msg);\n else throw new SyntaxError(msg);\n }\n return out;\n}\n\n/** RFC 4648 §6 Base32 (A–Z 2–7) app-string extension. */\nexport const b32: CborExtension = {\n appStringPrefixes: ['b32'],\n parseAppString(_prefix, content, onError) {\n return new CborByteString(\n base32Decode(stripComments(content), B32_ALPHA, onError),\n {\n ednEncoding: 'base32',\n }\n );\n },\n};\n\n/** RFC 4648 §7 Base32Hex (0–9 A–V) app-string extension. */\nexport const h32: CborExtension = {\n appStringPrefixes: ['h32'],\n parseAppString(_prefix, content, onError) {\n return new CborByteString(\n base32Decode(stripComments(content), H32_ALPHA, onError),\n {\n ednEncoding: 'base32hex',\n }\n );\n },\n};\n","/**\n * `float'...'` / `float<<...>>` app-string extension.\n *\n * Interprets a hex bit-pattern as an IEEE 754 floating-point value:\n * - 4 hex digits (2 bytes) → float16 (CBOR major-7, additional 25 / 0xf9)\n * - 8 hex digits (4 bytes) → float32 (CBOR major-7, additional 26 / 0xfa)\n * - 16 hex digits (8 bytes) → float64 (CBOR major-7, additional 27 / 0xfb)\n *\n * The string form `float'...'` supports the same comment syntax as `h'...'`:\n * slash-delimited block comments, C-style block comments, line comments (`//`\n * and `#`). The extension strips comments from the raw content itself.\n *\n * The sequence form `float<<byteStr>>` accepts a single byte-string expression\n * (e.g. `float<<h'7ef0'>>`) and interprets its bytes as float bits.\n *\n * Defined in draft-ietf-cbor-edn-literals §3.7. Not included in the default\n * extension set (must be added explicitly):\n *\n * @example\n * import { float } from '@cbortech/cbor';\n * parseCDN(\"float'7ef0'\", { extensions: [float] }); // NaN as float16\n */\n\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\nimport { CborFloat } from '../ast/CborFloat';\nimport { CborByteString } from '../ast/CborByteString';\nimport { float16BitsToFloat64, float64ToFloat16Bits } from '../utils/float16';\nimport { stripComments } from '../utils/strip-comments';\nimport { hexToBytes } from '../utils/hex';\nimport type { EncodingWidth } from '../cbor/encode';\n\n// ── Bit-preserving CborFloat subclasses ───────────────────────────────────────\n// CborFloat stores a JS `number`, which loses NaN payloads. These subclasses\n// override _toCBOR() to emit the original bit pattern verbatim.\n\nclass CborFloat16Bits extends CborFloat {\n private readonly _bits: number;\n constructor(bits: number) {\n super(float16BitsToFloat64(bits), { precision: 'half' });\n this._bits = bits & 0xffff;\n }\n override _toCBOR(): Uint8Array {\n return new Uint8Array([0xf9, (this._bits >> 8) & 0xff, this._bits & 0xff]);\n }\n}\n\nclass CborFloat32Bits extends CborFloat {\n private readonly _raw: Uint8Array;\n constructor(bytes: Uint8Array) {\n super(new DataView(bytes.buffer, bytes.byteOffset).getFloat32(0, false), {\n precision: 'single',\n });\n this._raw = bytes.slice();\n }\n override _toCBOR(): Uint8Array {\n const out = new Uint8Array(5);\n out[0] = 0xfa;\n out.set(this._raw, 1);\n return out;\n }\n}\n\nclass CborFloat64Bits extends CborFloat {\n private readonly _raw: Uint8Array;\n constructor(bytes: Uint8Array) {\n super(new DataView(bytes.buffer, bytes.byteOffset).getFloat64(0, false), {\n precision: 'double',\n });\n this._raw = bytes.slice();\n }\n override _toCBOR(): Uint8Array {\n const out = new Uint8Array(9);\n out[0] = 0xfb;\n out.set(this._raw, 1);\n return out;\n }\n}\n\nfunction floatFromBytes(bytes: Uint8Array): CborFloat {\n if (bytes.length === 2) {\n const bits = (bytes[0]! << 8) | bytes[1]!;\n return new CborFloat16Bits(bits);\n }\n if (bytes.length === 4) return new CborFloat32Bits(bytes);\n if (bytes.length === 8) return new CborFloat64Bits(bytes);\n throw new SyntaxError(\n `float'...' requires 4, 8, or 16 hex digits (2, 4, or 8 bytes); got ${bytes.length} bytes`\n );\n}\n\n/** Expand float16 bit pattern to 4-byte float32 (bit-exact, preserves NaN payloads). */\nfunction float16BitsToFloat32Bytes(bits16: number): Uint8Array {\n const sign = (bits16 >>> 15) & 1;\n const exp16 = (bits16 >>> 10) & 0x1f;\n const mant16 = bits16 & 0x3ff;\n let bits32: number;\n if (exp16 === 0x1f) {\n bits32 = (sign << 31) | 0x7f800000 | (mant16 << 13);\n } else if (exp16 === 0 && mant16 === 0) {\n bits32 = sign << 31;\n } else if (exp16 === 0) {\n // Denormal float16 → normal float32\n let m = mant16;\n let shifts = 0;\n while ((m & 0x200) === 0) {\n m <<= 1;\n shifts++;\n }\n bits32 = (sign << 31) | ((112 - shifts) << 23) | ((m & 0x1ff) << 14);\n } else {\n bits32 = (sign << 31) | ((exp16 + 112) << 23) | (mant16 << 13);\n }\n const out = new Uint8Array(4);\n new DataView(out.buffer).setUint32(0, bits32 >>> 0, false);\n return out;\n}\n\n/** Expand float16 bit pattern to 8-byte float64 (bit-exact, preserves NaN payloads). */\nfunction float16BitsToFloat64Bytes(bits16: number): Uint8Array {\n const sign = (bits16 >>> 15) & 1;\n const exp16 = (bits16 >>> 10) & 0x1f;\n const mant16 = bits16 & 0x3ff;\n const out = new Uint8Array(8);\n const dv = new DataView(out.buffer);\n if (exp16 === 0x1f) {\n dv.setUint32(0, ((sign << 31) | 0x7ff00000 | (mant16 << 10)) >>> 0, false);\n dv.setUint32(4, 0, false);\n } else if (exp16 === 0 && mant16 === 0) {\n dv.setUint32(0, (sign << 31) >>> 0, false);\n dv.setUint32(4, 0, false);\n } else if (exp16 === 0) {\n // Denormal float16 → normal float64\n let m = mant16;\n let shifts = 0;\n while ((m & 0x200) === 0) {\n m <<= 1;\n shifts++;\n }\n dv.setUint32(\n 0,\n ((sign << 31) | ((1008 - shifts) << 20) | ((m & 0x1ff) << 11)) >>> 0,\n false\n );\n dv.setUint32(4, 0, false);\n } else {\n dv.setUint32(\n 0,\n ((sign << 31) | ((exp16 + 1008) << 20) | (mant16 << 10)) >>> 0,\n false\n );\n dv.setUint32(4, 0, false);\n }\n return out;\n}\n\n/** Expand float32 bit pattern to 8-byte float64 (bit-exact, preserves NaN payloads). */\nfunction float32BitsToFloat64Bytes(bytes4: Uint8Array): Uint8Array {\n const bits32 = new DataView(bytes4.buffer, bytes4.byteOffset).getUint32(\n 0,\n false\n );\n const sign = (bits32 >>> 31) & 1;\n const exp32 = (bits32 >>> 23) & 0xff;\n const mant32 = bits32 & 0x7fffff;\n const out = new Uint8Array(8);\n const dv = new DataView(out.buffer);\n if (exp32 === 0xff) {\n dv.setUint32(0, ((sign << 31) | 0x7ff00000 | (mant32 >>> 3)) >>> 0, false);\n dv.setUint32(4, (mant32 & 7) << 29, false);\n } else if (exp32 === 0 && mant32 === 0) {\n dv.setUint32(0, (sign << 31) >>> 0, false);\n dv.setUint32(4, 0, false);\n } else {\n // Normal or denormal: JS arithmetic is exact (float32 ⊂ float64), NaN handled above.\n const f64 = new DataView(bytes4.buffer, bytes4.byteOffset).getFloat32(\n 0,\n false\n );\n dv.setFloat64(0, f64, false);\n }\n return out;\n}\n\n/**\n * Re-encode float bytes at a target precision (_1=half, _2=single, _3=double).\n * Returns undefined if the conversion is lossy (caller should warn).\n */\nfunction reencodeFloat(\n bytes: Uint8Array,\n targetWidth: 1 | 2 | 3,\n onError: (msg: string) => void\n): CborFloat {\n const naturalWidth = bytes.length === 2 ? 1 : bytes.length === 4 ? 2 : 3;\n\n if (naturalWidth === 1) {\n const bits16 = (bytes[0]! << 8) | bytes[1]!;\n if (targetWidth === 2)\n return new CborFloat32Bits(float16BitsToFloat32Bytes(bits16));\n if (targetWidth === 3)\n return new CborFloat64Bits(float16BitsToFloat64Bytes(bits16));\n }\n\n if (naturalWidth === 2) {\n if (targetWidth === 3)\n return new CborFloat64Bits(float32BitsToFloat64Bytes(bytes));\n if (targetWidth === 1) {\n const f32 = new DataView(bytes.buffer, bytes.byteOffset).getFloat32(\n 0,\n false\n );\n const bits16 = float64ToFloat16Bits(f32);\n if (!Object.is(float16BitsToFloat64(bits16), f32) && !isNaN(f32)) {\n onError(\n `float'...' value cannot be exactly represented as float16 (_1)`\n );\n }\n return new CborFloat16Bits(bits16);\n }\n }\n\n if (naturalWidth === 3) {\n const f64 = new DataView(bytes.buffer, bytes.byteOffset).getFloat64(\n 0,\n false\n );\n if (targetWidth === 1) {\n const bits16 = float64ToFloat16Bits(f64);\n if (!Object.is(float16BitsToFloat64(bits16), f64) && !isNaN(f64)) {\n onError(\n `float'...' value cannot be exactly represented as float16 (_1)`\n );\n }\n return new CborFloat16Bits(bits16);\n }\n if (targetWidth === 2) {\n const f32 = Math.fround(f64);\n if (!Object.is(f32, f64) && !isNaN(f64)) {\n onError(\n `float'...' value cannot be exactly represented as float32 (_2)`\n );\n }\n const out = new Uint8Array(4);\n new DataView(out.buffer).setFloat32(0, f32, false);\n return new CborFloat32Bits(out);\n }\n }\n\n // naturalWidth === targetWidth: identity (already handled by caller)\n return floatFromBytes(bytes);\n}\n\n/**\n * Extension object for `float'...'` / `float<<...>>`.\n * Pass to `parseCDN(..., { extensions: [float] })`.\n */\nexport const float: CborExtension = {\n appStringPrefixes: ['float'],\n\n parseAppString(\n _prefix: string,\n content: string,\n onError?: (msg: string) => void,\n options?: { encodingWidth?: EncodingWidth }\n ): CborItem {\n const hex = stripComments(content);\n if (!/^[0-9a-fA-F]*$/.test(hex))\n throw new SyntaxError(`float'...' contains non-hex characters`);\n if (hex.length % 2 !== 0)\n throw new SyntaxError(\n `float'...' hex content has odd length (${hex.length} digits)`\n );\n const bytes = hexToBytes(hex);\n const ew = options?.encodingWidth;\n if (ew === undefined) return floatFromBytes(bytes);\n if (ew !== 1 && ew !== 2 && ew !== 3) {\n const msg = `float'...' encoding indicator _${ew} is not valid; use _1, _2, or _3`;\n if (onError) {\n onError(msg);\n return floatFromBytes(bytes);\n }\n throw new SyntaxError(msg);\n }\n const naturalWidth = bytes.length === 2 ? 1 : bytes.length === 4 ? 2 : 3;\n if (ew === naturalWidth) return floatFromBytes(bytes);\n const fallbackOnError =\n onError ??\n ((msg: string) => {\n throw new SyntaxError(msg);\n });\n return reencodeFloat(bytes, ew, fallbackOnError);\n },\n\n parseAppSequence(\n _prefix: string,\n items: CborItem[],\n onError?: (msg: string) => void\n ): CborItem {\n if (items.length === 0)\n throw new SyntaxError(\n `float<<...>> requires exactly one byte-string item`\n );\n if (items.length > 1) {\n const msg = `float<<...>> expects 1 item; got ${items.length} — using first`;\n if (onError) onError(msg);\n else throw new SyntaxError(msg);\n }\n if (!(items[0] instanceof CborByteString))\n throw new SyntaxError(`float<<...>> item must be a byte string`);\n return floatFromBytes(items[0].value);\n },\n};\n\nexport default float;\n","/**\n * `same<<expr, expr, ...>>` app-sequence extension.\n *\n * Evaluates every item in the sequence to CBOR bytes and asserts that all\n * produce identical bytes. Returns the first item if all match.\n *\n * In strict mode a mismatch throws a `SyntaxError`. In lenient mode\n * (`strict: false`) a mismatch emits a `ParseWarning` and returns the first\n * item so parsing can continue.\n *\n * `same<<x>>` (single item) is a no-op assertion that always passes.\n *\n * The parsed result is wrapped in `CborAppSeqResult` so that `toCDN()` round-trips\n * the original `same<<...>>` notation. `toCBOR()` and `toJS()` delegate\n * transparently to the inner item; `appStrings: false` produces the resolved value.\n * The result is not directly `instanceof` the inner item's class.\n *\n * This extension is a testing/validation construct from the cabo/edn-abnf\n * corpus and is NOT part of draft-ietf-cbor-edn-literals. It is not included\n * in the default extension set. Add it explicitly:\n *\n * @example\n * import { same } from '@cbortech/cbor';\n * parseCDN(\"same<<b64'AA',h'00'>>\", { extensions: [same] }); // h'00'\n */\n\nimport type { CborExtension } from './types';\nimport type { CborItem } from '../ast/CborItem';\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/**\n * Extension object for `same<<...>>`.\n * Pass to `parseCDN(..., { extensions: [same] })`.\n */\nexport const same: CborExtension = {\n appStringPrefixes: ['same'],\n preserveAppSeqSource: true,\n\n parseAppSequence(\n _prefix: string,\n items: CborItem[],\n onError?: (msg: string) => void\n ): CborItem {\n if (items.length === 0)\n throw new SyntaxError(`same<<...>> requires at least one item`);\n const first = items[0]!;\n const firstCbor = first.toCBOR();\n for (let i = 1; i < items.length; i++) {\n const otherCbor = items[i]!.toCBOR();\n if (!bytesEqual(firstCbor, otherCbor)) {\n const msg = `same<<...>>: item ${i} produces different CBOR bytes than item 0`;\n if (onError)\n onError(msg); // lenient: warn + return first item\n else throw new SyntaxError(msg);\n }\n }\n return first;\n },\n};\n\nexport default same;\n","import type { CborItem } from './ast/CborItem';\nimport type {\n CBOROptions,\n FromCBOROptions,\n FromCBORSeqOptions,\n FromCDNOptions,\n FromCDNSeqOptions,\n FromHexDumpOptions,\n FromJSOptions,\n ParseWarning,\n ToCBOROptions,\n ToCDNOptions,\n ToHexDumpOptions,\n ToJSOptions,\n} from './types';\nimport { CBOR_OMIT } from './types';\nimport { decodeCBOR } from './cbor/decoder';\nimport { parseCDN } from './cdn/parser';\nimport { dt_as_Date as _dt_as_Date } from './extensions/dt';\nimport { fromJS as _fromJS, _applyReplacer } from './js/fromJS';\nimport { MapEntries as _MapEntries } from './mapEntries';\nimport { Simple as _Simple } from './simple';\nimport { CBOR_TAG, Tag as _Tag } from './tag';\n\n/**\n * Main facade class.\n *\n * Provides factory methods for constructing AST nodes from the three\n * supported input formats, and shortcut methods that mirror the\n * `JSON.parse` / `JSON.stringify` API.\n *\n * @example\n * // CBOR binary → AST → CBOR binary\n * const ast = CBOR.fromCBOR(bytes);\n * const reencoded = ast.toCBOR();\n *\n * @example\n * // JS value → CBOR binary (shortcut)\n * const bytes = CBOR.encode({ hello: 'world' });\n *\n * @example\n * // CBOR binary → JS value (shortcut)\n * const value = CBOR.decode(bytes);\n */\nexport class CBOR {\n /**\n * Sentinel returned from a replacer or reviver to omit the key/element from\n * the output. Use this instead of `undefined` when `undefinedOmits` is\n * `false` (the default) and you need to drop a specific entry.\n */\n static readonly OMIT: typeof CBOR_OMIT = CBOR_OMIT;\n\n /** Unique symbol used to attach a CBOR tag number to a JS value. */\n static readonly TAG: typeof CBOR_TAG = CBOR_TAG;\n\n /** Namespace for CBOR tag annotation utilities. */\n static readonly Tag: typeof _Tag = _Tag;\n\n /** Wrapper for CBOR simple values other than false/true/null/undefined. */\n static readonly Simple: typeof _Simple = _Simple;\n\n /** Array subclass used to preserve CBOR map entries, including duplicates. */\n static readonly MapEntries: typeof _MapEntries = _MapEntries;\n\n /** Extension that maps CDN dt/DT values to JavaScript Date objects. */\n static readonly dt_as_Date: typeof _dt_as_Date = _dt_as_Date;\n\n // ─── Instance API ───────────────────────────────────────────────────────────\n\n readonly #defaults: CBOROptions;\n\n /**\n * Create a reusable instance with default options applied to every method call.\n * Per-call options always override these defaults.\n *\n * @example\n * const cbor = new CBOR({ extensions: [CBOR.dt_as_Date] });\n * const obj = cbor.parse('{ \"dt\": DT\\'2024-01-01T00:00:00Z\\' }');\n * const text = cbor.stringify(obj);\n */\n constructor(defaults?: CBOROptions) {\n this.#defaults = defaults ?? {};\n }\n\n #merge<T extends object>(perCall?: T): CBOROptions & T {\n return { ...this.#defaults, ...(perCall ?? {}) } as CBOROptions & T;\n }\n\n fromCBOR(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions\n ): CborItem {\n const node = CBOR.fromCBOR(input, this.#merge(options));\n node._defaults = this.#defaults;\n return node;\n }\n\n fromCDN(text: string, options?: FromCDNOptions): CborItem {\n const node = CBOR.fromCDN(text, this.#merge(options));\n node._defaults = this.#defaults;\n return node;\n }\n\n /** @deprecated Use `fromCDN()` instead. */\n fromEDN(text: string, options?: FromCDNOptions): CborItem {\n return this.fromCDN(text, options);\n }\n\n fromJS(value: unknown, options?: FromJSOptions): CborItem {\n const node = CBOR.fromJS(value, this.#merge(options));\n node._defaults = this.#defaults;\n return node;\n }\n\n fromHexDump(text: string, options?: FromHexDumpOptions): CborItem {\n const node = CBOR.fromHexDump(text, this.#merge(options));\n node._defaults = this.#defaults;\n return node;\n }\n\n *fromCBORSeq(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBORSeqOptions\n ): Generator<CborItem> {\n for (const item of CBOR.fromCBORSeq(input, this.#merge(options))) {\n item._defaults = this.#defaults;\n yield item;\n }\n }\n\n *fromCDNSeq(text: string, options?: FromCDNSeqOptions): Generator<CborItem> {\n for (const item of CBOR.fromCDNSeq(text, this.#merge(options))) {\n item._defaults = this.#defaults;\n yield item;\n }\n }\n\n *fromHexDumpSeq(\n text: string,\n options?: FromHexDumpOptions\n ): Generator<CborItem> {\n for (const item of CBOR.fromHexDumpSeq(text, this.#merge(options))) {\n item._defaults = this.#defaults;\n yield item;\n }\n }\n\n decode(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToJSOptions\n ): unknown {\n return CBOR.decode(input, this.#merge(options));\n }\n\n *decodeSeq(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBORSeqOptions & ToJSOptions\n ): Generator<unknown> {\n yield* CBOR.decodeSeq(input, this.#merge(options));\n }\n\n *parseSeq(\n text: string,\n options?: FromCDNSeqOptions & ToJSOptions\n ): Generator<unknown> {\n yield* CBOR.parseSeq(text, this.#merge(options));\n }\n\n encode(value: unknown, options?: FromJSOptions & ToCBOROptions): Uint8Array {\n return CBOR.encode(value, this.#merge(options));\n }\n\n compile(\n text: string,\n options?: FromCDNSeqOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.compile(text, this.#merge(options));\n }\n\n decompile(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBORSeqOptions & ToCDNOptions\n ): string {\n return CBOR.decompile(input, this.#merge(options));\n }\n\n toHex(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBORSeqOptions & ToHexDumpOptions\n ): string {\n return CBOR.toHex(input, this.#merge(options));\n }\n\n fromHex(\n text: string,\n options?: FromHexDumpOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.fromHex(text, this.#merge(options));\n }\n\n /** @deprecated Use `decompile()` instead. */\n cborToCborEdn(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToCDNOptions\n ): string {\n return this.cborToCdn(input, options);\n }\n\n /** @deprecated Use `decompile()` instead. */\n cborToCdn(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToCDNOptions\n ): string {\n const merged = this.#merge(options);\n const node = CBOR.fromCBOR(input, merged);\n node._defaults = this.#defaults;\n return node.toCDN(merged);\n }\n\n /** @deprecated Use `compile()` instead. */\n cborEdnToCbor(\n text: string,\n options?: FromCDNOptions & ToCBOROptions\n ): Uint8Array {\n return this.cdnToCbor(text, options);\n }\n\n /** @deprecated Use `compile()` instead. */\n cdnToCbor(\n text: string,\n options?: FromCDNOptions & ToCBOROptions\n ): Uint8Array {\n const merged = this.#merge(options);\n return CBOR.fromCDN(text, merged).toCBOR(merged);\n }\n\n parse(text: string): unknown;\n parse(\n text: string,\n reviver: (this: unknown, key: unknown, value: unknown) => unknown\n ): unknown;\n parse(text: string, options: FromCDNOptions & ToJSOptions): unknown;\n parse(\n text: string,\n arg2?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (FromCDNOptions & ToJSOptions)\n ): unknown {\n if (typeof arg2 === 'function') {\n const merged = this.#merge<ToJSOptions>({ reviver: arg2 });\n return CBOR.fromCDN(text, merged).toJS(merged);\n }\n const merged = this.#merge(arg2);\n return CBOR.fromCDN(text, merged).toJS(merged);\n }\n\n stringify(value: unknown): string;\n stringify(\n value: unknown,\n replacer:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[]\n | null,\n space?: string | number\n ): string;\n stringify(value: unknown, options: FromJSOptions & ToCDNOptions): string;\n stringify(\n value: unknown,\n arg2?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[]\n | null\n | (FromJSOptions & ToCDNOptions),\n arg3?: string | number\n ): string {\n if (\n typeof arg2 === 'function' ||\n Array.isArray(arg2) ||\n arg2 === null ||\n (arg2 === undefined && arg3 !== undefined)\n ) {\n const opts: FromJSOptions & ToCDNOptions = {\n ...(this.#defaults as FromJSOptions & ToCDNOptions),\n };\n if (arg2 === null) {\n opts.replacer = undefined;\n } else if (typeof arg2 === 'function' || Array.isArray(arg2)) {\n opts.replacer = arg2;\n }\n if (arg3 !== undefined) opts.indent = resolveSpace(arg3);\n return CBOR.stringify(value, opts);\n }\n return CBOR.stringify(value, this.#merge(arg2 ?? undefined));\n }\n\n format(text: string, options?: FromCDNOptions & ToCDNOptions): string {\n return CBOR.format(text, this.#merge(options));\n }\n\n // ─── Factory methods ────────────────────────────────────────────────────────\n\n /** Decode CBOR binary data into an AST node. */\n static fromCBOR(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions\n ): CborItem {\n return decodeCBOR(input, options);\n }\n\n /** Parse a CDN text string into an AST node. */\n static fromCDN(text: string, options?: FromCDNOptions): CborItem {\n return parseCDN(text, options);\n }\n\n /**\n * Parse a CDN text string into an AST node.\n *\n * @deprecated Use `fromCDN()` instead.\n */\n static fromEDN(text: string, options?: FromCDNOptions): CborItem {\n return CBOR.fromCDN(text, options);\n }\n\n /** アノテーション付き hex dump テキストから CBOR Sequence を item ごとにデコードするジェネレータ。 */\n static *fromHexDumpSeq(\n text: string,\n options?: FromHexDumpOptions\n ): Generator<CborItem> {\n const bytes: number[] = [];\n const uncommented = stripHexDumpComments(text);\n const tokens = uncommented.trim().split(/\\s+/).filter(Boolean);\n for (const token of tokens) {\n if (/^[0-9A-Fa-f]{2}$/.test(token)) {\n bytes.push(parseInt(token, 16));\n } else if (/^[0-9A-Fa-f]+$/.test(token) && token.length % 2 === 0) {\n for (let i = 0; i < token.length; i += 2)\n bytes.push(parseInt(token.slice(i, i + 2), 16));\n } else {\n throw new SyntaxError(\n `Invalid hex token in dump: ${JSON.stringify(token)}`\n );\n }\n }\n yield* CBOR.fromCBORSeq(new Uint8Array(bytes), options);\n }\n\n /** CBOR Sequence (RFC 8742) を item ごとにデコードするジェネレータ。 */\n static *fromCBORSeq(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBORSeqOptions\n ): Generator<CborItem> {\n const bytes =\n input instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' &&\n input instanceof SharedArrayBuffer)\n ? new Uint8Array(input)\n : new Uint8Array(\n (input as ArrayBufferView).buffer,\n (input as ArrayBufferView).byteOffset,\n (input as ArrayBufferView).byteLength\n );\n let offset = 0;\n while (offset < bytes.byteLength) {\n const item = decodeCBOR(input, {\n ...options,\n offset,\n allowTrailing: true,\n });\n yield item;\n offset = item.end!;\n }\n }\n\n /** CDN テキストの複数 item を 1 つずつパースするジェネレータ。 */\n static *fromCDNSeq(\n text: string,\n options?: FromCDNSeqOptions\n ): Generator<CborItem> {\n let offset = 0;\n let isFirst = true;\n while (true) {\n const {\n offset: next,\n hadSeparator,\n commaOffset,\n } = skipCDNSeparator(text, offset, options);\n // Leading comma: comma before the first item (including comma-only input).\n // Checked before the EOF break so that \",\" alone is also caught.\n // Trailing comma is valid per ABNF SOC = S [\",\" S] and is silently accepted.\n if (isFirst && commaOffset >= 0) {\n const msg = 'leading comma in CDN sequence';\n if (options?.strict !== false) throw new SyntaxError(msg);\n emitCDNSeqWarning(msg, commaOffset, options);\n }\n if (next >= text.length) break;\n if (!isFirst && !hadSeparator) {\n const msg =\n 'CDN sequence items must be separated by whitespace, comma, or comment';\n if (options?.strict !== false) throw new SyntaxError(msg);\n emitCDNSeqWarning(msg, next, options);\n }\n offset = next;\n let item: CborItem;\n try {\n // _skipRS: true causes the tokenizer to treat RS (U+001E, RFC 7464) as\n // whitespace, preventing it from corrupting string-literal contents via\n // a global text replacement.\n item = parseCDN(text, {\n ...options,\n offset,\n allowTrailing: true,\n _skipRS: true,\n } as FromCDNOptions);\n } catch (e) {\n if (options?.strict !== false) throw e;\n emitCDNSeqWarning(\n e instanceof Error ? e.message : String(e),\n offset,\n options\n );\n break;\n }\n yield item;\n offset = item.end!;\n isFirst = false;\n }\n }\n\n /** Convert a JavaScript value into an AST node. */\n static fromJS(value: unknown, options?: FromJSOptions): CborItem {\n return _fromJS(value, options);\n }\n\n /**\n * Parse an annotated hex dump (as produced by {@link CborItem#toHexDump})\n * into an AST node.\n *\n * Each line is expected to have the form:\n * `[whitespace] HH [HH …] -- comment`\n * `[whitespace] HH [HH …] # comment`\n * `[whitespace] HH [HH …] // comment`\n * Block comments may also be written as `/ comment /` or `/* comment *\\/`.\n * Lines with no hex content before the comment marker are ignored.\n */\n static fromHexDump(text: string, options?: FromHexDumpOptions): CborItem {\n const bytes: number[] = [];\n const uncommented = stripHexDumpComments(text);\n const tokens = uncommented.trim().split(/\\s+/).filter(Boolean);\n for (const token of tokens) {\n if (/^[0-9A-Fa-f]{2}$/.test(token)) {\n bytes.push(parseInt(token, 16));\n } else if (/^[0-9A-Fa-f]+$/.test(token) && token.length % 2 === 0) {\n for (let i = 0; i < token.length; i += 2)\n bytes.push(parseInt(token.slice(i, i + 2), 16));\n } else {\n throw new SyntaxError(\n `Invalid hex token in dump: ${JSON.stringify(token)}`\n );\n }\n }\n return decodeCBOR(new Uint8Array(bytes), options);\n }\n\n // ─── Shortcut API ───────────────────────────────────────────────────────────\n\n /** Decode CBOR binary data directly to a JavaScript value. */\n static decode(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToJSOptions\n ): unknown {\n return CBOR.fromCBOR(input, options).toJS(options);\n }\n\n /** Decode a CBOR Sequence (RFC 8742), yielding each item as a JavaScript value. */\n static *decodeSeq(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBORSeqOptions & ToJSOptions\n ): Generator<unknown> {\n for (const item of CBOR.fromCBORSeq(input, options)) {\n yield item.toJS(options);\n }\n }\n\n /** Parse a CDN Sequence text string, yielding each item as a JavaScript value. */\n static *parseSeq(\n text: string,\n options?: FromCDNSeqOptions & ToJSOptions\n ): Generator<unknown> {\n for (const item of CBOR.fromCDNSeq(text, options)) {\n yield item.toJS(options);\n }\n }\n\n /** Encode a JavaScript value directly to CBOR binary data. */\n static encode(\n value: unknown,\n options?: FromJSOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.fromJS(value, options).toCBOR(options);\n }\n\n /**\n * Compile a CDN text string to CBOR binary data.\n * Multi-item CDN Sequences produce a CBOR Sequence (RFC 8742): concatenated items.\n */\n static compile(\n text: string,\n options?: FromCDNSeqOptions & ToCBOROptions\n ): Uint8Array {\n const byteArrays = [...CBOR.fromCDNSeq(text, options)].map((item) =>\n item.toCBOR(options)\n );\n const total = byteArrays.reduce((s, b) => s + b.length, 0);\n const result = new Uint8Array(total);\n let off = 0;\n for (const b of byteArrays) {\n result.set(b, off);\n off += b.length;\n }\n return result;\n }\n\n /**\n * Decompile CBOR binary data to a CDN text string.\n * CBOR Sequences (RFC 8742) produce multi-item CDN output, with items separated by newlines.\n */\n static decompile(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBORSeqOptions & ToCDNOptions\n ): string {\n return [...CBOR.fromCBORSeq(input, options)]\n .map((item) => item.toCDN(options))\n .join('\\n');\n }\n\n /**\n * Convert CBOR binary data to an annotated hex dump string.\n * CBOR Sequences (RFC 8742) produce one dump per item, separated by newlines.\n */\n static toHex(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBORSeqOptions & ToHexDumpOptions\n ): string {\n return [...CBOR.fromCBORSeq(input, options)]\n .map((item) => item.toHexDump(options))\n .join('\\n');\n }\n\n /**\n * Parse an annotated hex dump string to CBOR binary data.\n * Multi-item dumps produce a CBOR Sequence (RFC 8742): concatenated items.\n */\n static fromHex(\n text: string,\n options?: FromHexDumpOptions & ToCBOROptions\n ): Uint8Array {\n const byteArrays = [...CBOR.fromHexDumpSeq(text, options)].map((item) =>\n item.toCBOR(options)\n );\n const total = byteArrays.reduce((s, b) => s + b.length, 0);\n const result = new Uint8Array(total);\n let off = 0;\n for (const b of byteArrays) {\n result.set(b, off);\n off += b.length;\n }\n return result;\n }\n\n /**\n * Convert CBOR binary data directly to a CDN text string.\n *\n * @deprecated Use `CBOR.decompile()` instead.\n */\n static cborToCdn(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToCDNOptions\n ): string {\n return CBOR.fromCBOR(input, options).toCDN(options);\n }\n\n /** @deprecated Use `CBOR.decompile()` instead. */\n static cborToCborEdn(\n input: ArrayBufferView | ArrayBufferLike,\n options?: FromCBOROptions & ToCDNOptions\n ): string {\n return CBOR.fromCBOR(input, options).toCDN(options);\n }\n\n /**\n * Convert a CDN text string directly to CBOR binary data.\n *\n * @deprecated Use `CBOR.compile()` instead.\n */\n static cdnToCbor(\n text: string,\n options?: FromCDNOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.fromCDN(text, options).toCBOR(options);\n }\n\n /** @deprecated Use `CBOR.compile()` instead. */\n static cborEdnToCbor(\n text: string,\n options?: FromCDNOptions & ToCBOROptions\n ): Uint8Array {\n return CBOR.fromCDN(text, options).toCBOR(options);\n }\n\n /**\n * Parse a CDN text string directly to a JavaScript value.\n *\n * Accepts either a JSON-compatible `reviver` function as the second argument,\n * or a plain options object (existing API).\n *\n * When a `reviver` is supplied it is applied bottom-up after the CDN text has\n * been parsed and converted to a JS value, matching the semantics of\n * `JSON.parse(text, reviver)`.\n *\n * Note: CBOR-specific value types such as `bigint` are passed to the reviver\n * as-is; the reviver is responsible for handling them.\n */\n static parse(text: string): unknown;\n static parse(\n text: string,\n reviver: (this: unknown, key: unknown, value: unknown) => unknown\n ): unknown;\n static parse(text: string, options: FromCDNOptions & ToJSOptions): unknown;\n static parse(\n text: string,\n arg2?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (FromCDNOptions & ToJSOptions)\n ): unknown {\n if (typeof arg2 === 'function') {\n return CBOR.fromCDN(text).toJS({ reviver: arg2 });\n }\n return CBOR.fromCDN(text, arg2).toJS(arg2);\n }\n\n /**\n * Serialize a JavaScript value directly to a CDN text string.\n *\n * Accepts either JSON-compatible `replacer` + `space` arguments, or a plain\n * options object (existing API).\n *\n * - `replacer` may be a function (transforms each key/value before encoding)\n * or an array of strings/numbers (allowlist of object keys to include).\n * Pass `null` to skip filtering.\n * - `space` controls indentation, mapping to `ToCDNOptions.indent`.\n * Numbers are clamped to `[0, 10]`; strings are truncated to 10 characters.\n */\n static stringify(value: unknown): string;\n static stringify(\n value: unknown,\n replacer:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[]\n | null,\n space?: string | number\n ): string;\n static stringify(\n value: unknown,\n options: FromJSOptions & ToCDNOptions\n ): string;\n static stringify(\n value: unknown,\n arg2?:\n | ((this: unknown, key: unknown, value: unknown) => unknown)\n | (string | number)[]\n | null\n | (FromJSOptions & ToCDNOptions),\n arg3?: string | number\n ): string {\n if (\n typeof arg2 === 'function' ||\n Array.isArray(arg2) ||\n arg2 === null ||\n (arg2 === undefined && arg3 !== undefined)\n ) {\n const replacer =\n typeof arg2 === 'function' || Array.isArray(arg2) ? arg2 : undefined;\n const indent = resolveSpace(arg3);\n if (replacer) {\n // Mirror JSON.stringify: if the replacer drops the root, return undefined.\n const replaced = _applyReplacer(value, replacer);\n if (replaced === undefined || replaced === CBOR_OMIT)\n return undefined as unknown as string;\n return _fromJS(replaced).toCDN(\n indent !== undefined ? { indent } : undefined\n );\n }\n return _fromJS(value).toCDN(\n indent !== undefined ? { indent } : undefined\n );\n }\n // Options form: also mirror JSON.stringify root-drop semantics.\n const opts = arg2 as (FromJSOptions & ToCDNOptions) | undefined;\n if (opts?.replacer) {\n const replaced = _applyReplacer(\n value,\n opts.replacer,\n opts.extensions,\n opts.undefinedOmits\n );\n if (replaced === undefined || replaced === CBOR_OMIT)\n return undefined as unknown as string;\n const { replacer: _r, ...restFromJS } = opts;\n return _fromJS(\n replaced,\n Object.keys(restFromJS).length > 0\n ? (restFromJS as FromJSOptions)\n : undefined\n ).toCDN(opts);\n }\n return _fromJS(value, opts as FromJSOptions | undefined).toCDN(opts);\n }\n\n /** Normalize a CDN text string by parsing and re-serializing it. */\n static format(text: string, options?: FromCDNOptions & ToCDNOptions): string {\n return CBOR.fromCDN(text, options).toCDN(options);\n }\n}\n\nfunction stripHexDumpComments(text: string): string {\n let out = '';\n let i = 0;\n\n while (i < text.length) {\n const ch = text[i];\n const next = text[i + 1] ?? '';\n\n if (ch === '-' && next === '-') {\n i = skipLineComment(text, i + 2);\n out += ' ';\n continue;\n }\n\n if (ch === '—') {\n i = skipLineComment(text, i + 1);\n out += ' ';\n continue;\n }\n\n if (ch === '#') {\n i = skipLineComment(text, i + 1);\n out += ' ';\n continue;\n }\n\n if (ch === '/' && next === '/') {\n i = skipLineComment(text, i + 2);\n out += ' ';\n continue;\n }\n\n if (ch === '/' && next === '*') {\n const end = text.indexOf('*/', i + 2);\n if (end < 0) throw new SyntaxError('Unterminated comment in hex dump');\n out += whitespaceLike(text.slice(i, end + 2));\n i = end + 2;\n continue;\n }\n\n if (ch === '/') {\n const end = text.indexOf('/', i + 1);\n if (end < 0) throw new SyntaxError('Unterminated comment in hex dump');\n out += whitespaceLike(text.slice(i, end + 1));\n i = end + 1;\n continue;\n }\n\n out += ch;\n i++;\n }\n\n return out;\n}\n\nfunction skipLineComment(text: string, start: number): number {\n const end = text.indexOf('\\n', start);\n return end < 0 ? text.length : end;\n}\n\nfunction whitespaceLike(text: string): string {\n return text.replace(/[^\\r\\n]/g, ' ');\n}\n\n// ─── Module-scope helper ─────────────────────────────────────────────────────\n\nfunction emitCDNSeqWarning(\n msg: string,\n offset: number,\n options: FromCDNSeqOptions | undefined\n): void {\n const w: ParseWarning = { message: msg, offset };\n if (options?.onWarning) options.onWarning(w);\n else if (!options?.silent)\n console.warn(`CDN sequence warning at offset ${offset}: ${msg}`);\n}\n\n/**\n * CDN sequence の item 間にある空白・コメント・省略可能なカンマを読み飛ばし、\n * 次の item が始まる文字位置と、何らかの separator が存在したかどうかを返す。\n * 未終端のブロックコメントは strict モードでは throw し、\n * strict: false の場合は警告を emit して末尾まで読み飛ばす。\n */\nfunction skipCDNSeparator(\n text: string,\n from: number,\n options: FromCDNSeqOptions | undefined\n): { offset: number; hadSeparator: boolean; commaOffset: number } {\n let i = from;\n let hadSeparator = false;\n let seenComma = false;\n let commaOffset = -1;\n while (i < text.length) {\n const ch = text[i];\n if (\n ch === ' ' ||\n ch === '\\t' ||\n ch === '\\r' ||\n ch === '\\n' ||\n ch === '\\x1e'\n ) {\n hadSeparator = true;\n i++;\n continue;\n }\n if (ch === '#') {\n hadSeparator = true;\n const nl = text.indexOf('\\n', i + 1);\n i = nl < 0 ? text.length : nl + 1;\n continue;\n }\n if (ch === '/' && text[i + 1] === '/') {\n hadSeparator = true;\n const nl = text.indexOf('\\n', i + 2);\n i = nl < 0 ? text.length : nl + 1;\n continue;\n }\n if (ch === '/' && text[i + 1] === '*') {\n hadSeparator = true;\n const end = text.indexOf('*/', i + 2);\n if (end < 0) {\n const msg = 'unterminated /* comment in CDN sequence';\n if (options?.strict !== false) throw new SyntaxError(msg);\n emitCDNSeqWarning(msg, i, options);\n i = text.length;\n } else {\n i = end + 2;\n }\n continue;\n }\n if (ch === '/' && text[i + 1] !== '/') {\n hadSeparator = true;\n const end = text.indexOf('/', i + 1);\n if (end < 0) {\n const msg = 'unterminated / comment in CDN sequence';\n if (options?.strict !== false) throw new SyntaxError(msg);\n emitCDNSeqWarning(msg, i, options);\n i = text.length;\n } else {\n i = end + 1;\n }\n continue;\n }\n if (ch === ',' && !seenComma) {\n hadSeparator = true;\n seenComma = true;\n commaOffset = i;\n i++;\n continue;\n }\n break;\n }\n return { offset: i, hadSeparator, commaOffset };\n}\n\n/** Map JSON.stringify `space` argument to ToCDNOptions.indent. */\nfunction resolveSpace(\n space: string | number | undefined\n): string | number | undefined {\n if (typeof space === 'number') {\n const n = Math.floor(Math.min(10, Math.max(0, space)));\n return n === 0 ? undefined : n;\n }\n if (typeof space === 'string') {\n const s = space.slice(0, 10);\n return s || undefined;\n }\n return undefined;\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { CBOROptions, CborExtension, DecodeWarning, ParseWarning, FromCBOROptions, ToCBOROptions, FromCDNOptions, ToCDNOptions, FromEDNOptions, ToEDNOptions, FromJSOptions, ToJSOptions, FromHexDumpOptions, ToHexDumpOptions, } from './types';
1
+ export type { CBOROptions, CborExtension, DecodeWarning, ParseWarning, FromCBOROptions, FromCBORSeqOptions, ToCBOROptions, FromCDNOptions, FromCDNSeqOptions, ToCDNOptions, FromEDNOptions, ToEDNOptions, FromJSOptions, ToJSOptions, FromHexDumpOptions, ToHexDumpOptions, } from './types';
2
2
  export { CdnSyntaxError } from './cdn/errors';
3
3
  export { CBOR_TAG, Null, Tag, Undefined } from './tag';
4
4
  export { CBOR_OMIT } from './types';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { n as e } from "./tokenizer-C597LW89.js";
2
- import { A as t, C as n, D as r, E as i, O as a, S as o, T as s, a as c, g as l, i as u, k as d, n as f, r as p, s as m, t as h, v as g, w as _ } from "./mapEntries-DDh7IS2M.js";
1
+ import { n as e } from "./tokenizer-IDqJN0Dw.js";
2
+ import { A as t, C as n, D as r, E as i, O as a, S as o, T as s, a as c, g as l, i as u, k as d, n as f, r as p, s as m, t as h, v as g, w as _ } from "./mapEntries-Cc4If3gy.js";
3
3
  //#region src/utils/strip-comments.ts
4
4
  function v(e) {
5
5
  let t = "", n = 0;
@@ -45,7 +45,7 @@ function x(e) {
45
45
  function S(e, t, n) {
46
46
  let r = x(e).toUpperCase(), i = r.length % 8;
47
47
  if (i === 1 || i === 3 || i === 6) throw SyntaxError(`invalid base32 length: ${r.length} characters`);
48
- let a = new Uint8Array(128).fill(255);
48
+ let a = (/* @__PURE__ */ new Uint8Array(128)).fill(255);
49
49
  for (let e = 0; e < t.length; e++) a[t.charCodeAt(e)] = e;
50
50
  let o = new Uint8Array(Math.floor(r.length * 5 / 8)), s = 0, c = 0, l = 0;
51
51
  for (let e of r) {
@@ -88,7 +88,7 @@ var C = {
88
88
  super(new DataView(e.buffer, e.byteOffset).getFloat32(0, !1), { precision: "single" }), this._raw = e.slice();
89
89
  }
90
90
  _toCBOR() {
91
- let e = new Uint8Array(5);
91
+ let e = /* @__PURE__ */ new Uint8Array(5);
92
92
  return e[0] = 250, e.set(this._raw, 1), e;
93
93
  }
94
94
  }, D = class extends g {
@@ -97,7 +97,7 @@ var C = {
97
97
  super(new DataView(e.buffer, e.byteOffset).getFloat64(0, !1), { precision: "double" }), this._raw = e.slice();
98
98
  }
99
99
  _toCBOR() {
100
- let e = new Uint8Array(9);
100
+ let e = /* @__PURE__ */ new Uint8Array(9);
101
101
  return e[0] = 251, e.set(this._raw, 1), e;
102
102
  }
103
103
  };
@@ -116,11 +116,11 @@ function k(e) {
116
116
  for (; !(e & 512);) e <<= 1, n++;
117
117
  i = t << 31 | 112 - n << 23 | (e & 511) << 14;
118
118
  } else i = t << 31 | n + 112 << 23 | r << 13;
119
- let a = new Uint8Array(4);
119
+ let a = /* @__PURE__ */ new Uint8Array(4);
120
120
  return new DataView(a.buffer).setUint32(0, i >>> 0, !1), a;
121
121
  }
122
122
  function A(e) {
123
- let t = e >>> 15 & 1, n = e >>> 10 & 31, r = e & 1023, i = new Uint8Array(8), a = new DataView(i.buffer);
123
+ let t = e >>> 15 & 1, n = e >>> 10 & 31, r = e & 1023, i = /* @__PURE__ */ new Uint8Array(8), a = new DataView(i.buffer);
124
124
  if (n === 31) a.setUint32(0, (t << 31 | 2146435072 | r << 10) >>> 0, !1), a.setUint32(4, 0, !1);
125
125
  else if (n === 0 && r === 0) a.setUint32(0, t << 31 >>> 0, !1), a.setUint32(4, 0, !1);
126
126
  else if (n === 0) {
@@ -131,7 +131,7 @@ function A(e) {
131
131
  return i;
132
132
  }
133
133
  function j(e) {
134
- let t = new DataView(e.buffer, e.byteOffset).getUint32(0, !1), n = t >>> 31 & 1, r = t >>> 23 & 255, i = t & 8388607, a = new Uint8Array(8), o = new DataView(a.buffer);
134
+ let t = new DataView(e.buffer, e.byteOffset).getUint32(0, !1), n = t >>> 31 & 1, r = t >>> 23 & 255, i = t & 8388607, a = /* @__PURE__ */ new Uint8Array(8), o = new DataView(a.buffer);
135
135
  if (r === 255) o.setUint32(0, (n << 31 | 2146435072 | i >>> 3) >>> 0, !1), o.setUint32(4, (i & 7) << 29, !1);
136
136
  else if (r === 0 && i === 0) o.setUint32(0, n << 31 >>> 0, !1), o.setUint32(4, 0, !1);
137
137
  else {
@@ -163,7 +163,7 @@ function M(e, t, r) {
163
163
  if (t === 2) {
164
164
  let e = Math.fround(i);
165
165
  !Object.is(e, i) && !isNaN(i) && r("float'...' value cannot be exactly represented as float32 (_2)");
166
- let t = new Uint8Array(4);
166
+ let t = /* @__PURE__ */ new Uint8Array(4);
167
167
  return new DataView(t.buffer).setFloat32(0, e, !1), new E(t);
168
168
  }
169
169
  }
@@ -253,23 +253,52 @@ var F = {
253
253
  let r = e.fromHexDump(t, this.#t(n));
254
254
  return r._defaults = this.#e, r;
255
255
  }
256
+ *fromCBORSeq(t, n) {
257
+ for (let r of e.fromCBORSeq(t, this.#t(n))) r._defaults = this.#e, yield r;
258
+ }
259
+ *fromCDNSeq(t, n) {
260
+ for (let r of e.fromCDNSeq(t, this.#t(n))) r._defaults = this.#e, yield r;
261
+ }
262
+ *fromHexDumpSeq(t, n) {
263
+ for (let r of e.fromHexDumpSeq(t, this.#t(n))) r._defaults = this.#e, yield r;
264
+ }
256
265
  decode(t, n) {
257
266
  return e.decode(t, this.#t(n));
258
267
  }
268
+ *decodeSeq(t, n) {
269
+ yield* e.decodeSeq(t, this.#t(n));
270
+ }
271
+ *parseSeq(t, n) {
272
+ yield* e.parseSeq(t, this.#t(n));
273
+ }
259
274
  encode(t, n) {
260
275
  return e.encode(t, this.#t(n));
261
276
  }
277
+ compile(t, n) {
278
+ return e.compile(t, this.#t(n));
279
+ }
280
+ decompile(t, n) {
281
+ return e.decompile(t, this.#t(n));
282
+ }
283
+ toHex(t, n) {
284
+ return e.toHex(t, this.#t(n));
285
+ }
286
+ fromHex(t, n) {
287
+ return e.fromHex(t, this.#t(n));
288
+ }
262
289
  cborToCborEdn(e, t) {
263
290
  return this.cborToCdn(e, t);
264
291
  }
265
292
  cborToCdn(t, n) {
266
- return e.cborToCdn(t, this.#t(n));
293
+ let r = this.#t(n), i = e.fromCBOR(t, r);
294
+ return i._defaults = this.#e, i.toCDN(r);
267
295
  }
268
296
  cborEdnToCbor(e, t) {
269
297
  return this.cdnToCbor(e, t);
270
298
  }
271
299
  cdnToCbor(t, n) {
272
- return e.cdnToCbor(t, this.#t(n));
300
+ let r = this.#t(n);
301
+ return e.fromCDN(t, r).toCBOR(r);
273
302
  }
274
303
  parse(t, n) {
275
304
  if (typeof n == "function") {
@@ -282,7 +311,7 @@ var F = {
282
311
  stringify(t, n, r) {
283
312
  if (typeof n == "function" || Array.isArray(n) || n === null || n === void 0 && r !== void 0) {
284
313
  let i = { ...this.#e };
285
- return n === null ? i.replacer = void 0 : (typeof n == "function" || Array.isArray(n)) && (i.replacer = n), r !== void 0 && (i.indent = B(r)), e.stringify(t, i);
314
+ return n === null ? i.replacer = void 0 : (typeof n == "function" || Array.isArray(n)) && (i.replacer = n), r !== void 0 && (i.indent = H(r)), e.stringify(t, i);
286
315
  }
287
316
  return e.stringify(t, this.#t(n ?? void 0));
288
317
  }
@@ -298,6 +327,56 @@ var F = {
298
327
  static fromEDN(t, n) {
299
328
  return e.fromCDN(t, n);
300
329
  }
330
+ static *fromHexDumpSeq(t, n) {
331
+ let r = [], i = L(t).trim().split(/\s+/).filter(Boolean);
332
+ for (let e of i) if (/^[0-9A-Fa-f]{2}$/.test(e)) r.push(parseInt(e, 16));
333
+ else if (/^[0-9A-Fa-f]+$/.test(e) && e.length % 2 == 0) for (let t = 0; t < e.length; t += 2) r.push(parseInt(e.slice(t, t + 2), 16));
334
+ else throw SyntaxError(`Invalid hex token in dump: ${JSON.stringify(e)}`);
335
+ yield* e.fromCBORSeq(new Uint8Array(r), n);
336
+ }
337
+ static *fromCBORSeq(e, t) {
338
+ let n = e instanceof ArrayBuffer || typeof SharedArrayBuffer < "u" && e instanceof SharedArrayBuffer ? new Uint8Array(e) : new Uint8Array(e.buffer, e.byteOffset, e.byteLength), r = 0;
339
+ for (; r < n.byteLength;) {
340
+ let n = u(e, {
341
+ ...t,
342
+ offset: r,
343
+ allowTrailing: !0
344
+ });
345
+ yield n, r = n.end;
346
+ }
347
+ }
348
+ static *fromCDNSeq(e, t) {
349
+ let n = 0, r = !0;
350
+ for (;;) {
351
+ let { offset: i, hadSeparator: a, commaOffset: o } = V(e, n, t);
352
+ if (r && o >= 0) {
353
+ let e = "leading comma in CDN sequence";
354
+ if (t?.strict !== !1) throw SyntaxError(e);
355
+ B(e, o, t);
356
+ }
357
+ if (i >= e.length) break;
358
+ if (!r && !a) {
359
+ let e = "CDN sequence items must be separated by whitespace, comma, or comment";
360
+ if (t?.strict !== !1) throw SyntaxError(e);
361
+ B(e, i, t);
362
+ }
363
+ n = i;
364
+ let s;
365
+ try {
366
+ s = m(e, {
367
+ ...t,
368
+ offset: n,
369
+ allowTrailing: !0,
370
+ _skipRS: !0
371
+ });
372
+ } catch (e) {
373
+ if (t?.strict !== !1) throw e;
374
+ B(e instanceof Error ? e.message : String(e), n, t);
375
+ break;
376
+ }
377
+ yield s, n = s.end, r = !1;
378
+ }
379
+ }
301
380
  static fromJS(e, t) {
302
381
  return p(e, t);
303
382
  }
@@ -311,27 +390,49 @@ var F = {
311
390
  static decode(t, n) {
312
391
  return e.fromCBOR(t, n).toJS(n);
313
392
  }
393
+ static *decodeSeq(t, n) {
394
+ for (let r of e.fromCBORSeq(t, n)) yield r.toJS(n);
395
+ }
396
+ static *parseSeq(t, n) {
397
+ for (let r of e.fromCDNSeq(t, n)) yield r.toJS(n);
398
+ }
314
399
  static encode(t, n) {
315
400
  return e.fromJS(t, n).toCBOR(n);
316
401
  }
402
+ static compile(t, n) {
403
+ let r = [...e.fromCDNSeq(t, n)].map((e) => e.toCBOR(n)), i = r.reduce((e, t) => e + t.length, 0), a = new Uint8Array(i), o = 0;
404
+ for (let e of r) a.set(e, o), o += e.length;
405
+ return a;
406
+ }
407
+ static decompile(t, n) {
408
+ return [...e.fromCBORSeq(t, n)].map((e) => e.toCDN(n)).join("\n");
409
+ }
410
+ static toHex(t, n) {
411
+ return [...e.fromCBORSeq(t, n)].map((e) => e.toHexDump(n)).join("\n");
412
+ }
413
+ static fromHex(t, n) {
414
+ let r = [...e.fromHexDumpSeq(t, n)].map((e) => e.toCBOR(n)), i = r.reduce((e, t) => e + t.length, 0), a = new Uint8Array(i), o = 0;
415
+ for (let e of r) a.set(e, o), o += e.length;
416
+ return a;
417
+ }
317
418
  static cborToCdn(t, n) {
318
419
  return e.fromCBOR(t, n).toCDN(n);
319
420
  }
320
421
  static cborToCborEdn(t, n) {
321
- return e.cborToCdn(t, n);
422
+ return e.fromCBOR(t, n).toCDN(n);
322
423
  }
323
424
  static cdnToCbor(t, n) {
324
425
  return e.fromCDN(t, n).toCBOR(n);
325
426
  }
326
427
  static cborEdnToCbor(t, n) {
327
- return e.cdnToCbor(t, n);
428
+ return e.fromCDN(t, n).toCBOR(n);
328
429
  }
329
430
  static parse(t, n) {
330
431
  return typeof n == "function" ? e.fromCDN(t).toJS({ reviver: n }) : e.fromCDN(t, n).toJS(n);
331
432
  }
332
433
  static stringify(e, t, n) {
333
434
  if (typeof t == "function" || Array.isArray(t) || t === null || t === void 0 && n !== void 0) {
334
- let r = typeof t == "function" || Array.isArray(t) ? t : void 0, a = B(n);
435
+ let r = typeof t == "function" || Array.isArray(t) ? t : void 0, a = H(n);
335
436
  if (r) {
336
437
  let t = f(e, r);
337
438
  return t === void 0 || t === i ? void 0 : p(t).toCDN(a === void 0 ? void 0 : { indent: a });
@@ -394,7 +495,66 @@ function R(e, t) {
394
495
  function z(e) {
395
496
  return e.replace(/[^\r\n]/g, " ");
396
497
  }
397
- function B(e) {
498
+ function B(e, t, n) {
499
+ let r = {
500
+ message: e,
501
+ offset: t
502
+ };
503
+ n?.onWarning ? n.onWarning(r) : n?.silent || console.warn(`CDN sequence warning at offset ${t}: ${e}`);
504
+ }
505
+ function V(e, t, n) {
506
+ let r = t, i = !1, a = !1, o = -1;
507
+ for (; r < e.length;) {
508
+ let t = e[r];
509
+ if (t === " " || t === " " || t === "\r" || t === "\n" || t === "") {
510
+ i = !0, r++;
511
+ continue;
512
+ }
513
+ if (t === "#") {
514
+ i = !0;
515
+ let t = e.indexOf("\n", r + 1);
516
+ r = t < 0 ? e.length : t + 1;
517
+ continue;
518
+ }
519
+ if (t === "/" && e[r + 1] === "/") {
520
+ i = !0;
521
+ let t = e.indexOf("\n", r + 2);
522
+ r = t < 0 ? e.length : t + 1;
523
+ continue;
524
+ }
525
+ if (t === "/" && e[r + 1] === "*") {
526
+ i = !0;
527
+ let t = e.indexOf("*/", r + 2);
528
+ if (t < 0) {
529
+ let t = "unterminated /* comment in CDN sequence";
530
+ if (n?.strict !== !1) throw SyntaxError(t);
531
+ B(t, r, n), r = e.length;
532
+ } else r = t + 2;
533
+ continue;
534
+ }
535
+ if (t === "/" && e[r + 1] !== "/") {
536
+ i = !0;
537
+ let t = e.indexOf("/", r + 1);
538
+ if (t < 0) {
539
+ let t = "unterminated / comment in CDN sequence";
540
+ if (n?.strict !== !1) throw SyntaxError(t);
541
+ B(t, r, n), r = e.length;
542
+ } else r = t + 1;
543
+ continue;
544
+ }
545
+ if (t === "," && !a) {
546
+ i = !0, a = !0, o = r, r++;
547
+ continue;
548
+ }
549
+ break;
550
+ }
551
+ return {
552
+ offset: r,
553
+ hadSeparator: i,
554
+ commaOffset: o
555
+ };
556
+ }
557
+ function H(e) {
398
558
  if (typeof e == "number") {
399
559
  let t = Math.floor(Math.min(10, Math.max(0, e)));
400
560
  return t === 0 ? void 0 : t;