@cbortech/cbor 0.27.1 → 0.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.ja.md +27 -0
  2. package/README.md +28 -0
  3. package/dist/ast/CborItem.d.ts +17 -2
  4. package/dist/ast/CborTag.d.ts +22 -0
  5. package/dist/ast/CborUnresolvedAppExt.d.ts +9 -0
  6. package/dist/ast/index.cjs +1 -1
  7. package/dist/ast/index.js +2 -2
  8. package/dist/cbor/tagLabels.d.ts +26 -0
  9. package/dist/cddl/eRefScope.d.ts +241 -0
  10. package/dist/cddl/eref.d.ts +64 -0
  11. package/dist/cddl/implicitTags.d.ts +28 -0
  12. package/dist/cddl/index.cjs +2 -2
  13. package/dist/cddl/index.cjs.map +1 -1
  14. package/dist/cddl/index.d.ts +2 -0
  15. package/dist/cddl/index.js +26 -25
  16. package/dist/cddl/index.js.map +1 -1
  17. package/dist/cddl/validator.d.ts +98 -2
  18. package/dist/cdn/index.cjs +1 -1
  19. package/dist/cdn/index.js +1 -1
  20. package/dist/cdn/serialize-utils.d.ts +20 -13
  21. package/dist/extensions/eref.d.ts +135 -0
  22. package/dist/index.cjs +7 -7
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.ts +1 -0
  25. package/dist/index.js +190 -81
  26. package/dist/index.js.map +1 -1
  27. package/dist/js/fromJS.d.ts +23 -1
  28. package/dist/mapEntries-8zshEr-t.js +7085 -0
  29. package/dist/mapEntries-8zshEr-t.js.map +1 -0
  30. package/dist/mapEntries-DwHPAzCN.cjs +68 -0
  31. package/dist/mapEntries-DwHPAzCN.cjs.map +1 -0
  32. package/dist/schema-7r2xjpMK.js +345 -0
  33. package/dist/schema-7r2xjpMK.js.map +1 -0
  34. package/dist/schema-YiigSWjR.cjs +8 -0
  35. package/dist/schema-YiigSWjR.cjs.map +1 -0
  36. package/dist/{serialize-utils-h-CVB9rg.js → serialize-utils-BQtutOo6.js} +14 -6
  37. package/dist/serialize-utils-BQtutOo6.js.map +1 -0
  38. package/dist/{serialize-utils-DhlW61ZX.cjs → serialize-utils-DQ8T3Mzw.cjs} +5 -5
  39. package/dist/serialize-utils-DQ8T3Mzw.cjs.map +1 -0
  40. package/dist/types.d.ts +153 -4
  41. package/package.json +8 -8
  42. package/dist/mapEntries-CCLaJSaJ.js +0 -4127
  43. package/dist/mapEntries-CCLaJSaJ.js.map +0 -1
  44. package/dist/mapEntries-CZZJScaj.cjs +0 -13
  45. package/dist/mapEntries-CZZJScaj.cjs.map +0 -1
  46. package/dist/schema-DN9inJny.js +0 -1977
  47. package/dist/schema-DN9inJny.js.map +0 -1
  48. package/dist/schema-zsg5yCPK.cjs +0 -63
  49. package/dist/schema-zsg5yCPK.cjs.map +0 -1
  50. package/dist/serialize-utils-DhlW61ZX.cjs.map +0 -1
  51. package/dist/serialize-utils-h-CVB9rg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["#defaults","#merge"],"sources":["../src/extensions/same.ts","../src/cbor.ts"],"sourcesContent":["/**\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; `appPrefix: 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 DecodeWarning,\n FromCBOROptions,\n FromCBORSeqOptions,\n FromCDNOptions,\n FromCDNSeqOptions,\n FromHexDumpOptions,\n FromJSOptions,\n ParseWarning,\n ToCBOROptions,\n ToCDNOptions,\n ToHexDumpOptions,\n ToJSOptions,\n ValidateOptions,\n ValidateResult,\n} from './types';\nimport { CBOR_OMIT } from './types';\nimport { decodeCBOR } from './cbor/decoder';\nimport { parseCDN } from './cdn/parser';\nimport { CdnSyntaxError } from './cdn/errors';\nimport { shouldEmitComments } from './cdn/serialize-utils';\nimport { CddlMismatchError } from './cddl/errors';\nimport { compile as compileCDDL, CddlSchema } from './cddl/schema';\nimport type { ValidateOptions as CddlValidateOptions } from './cddl/validator';\nimport type { CddlValidationError, CddlValidationWarning } from './cddl/errors';\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 * Cache for schemas compiled from CDDL source text passed as the `cddl`\n * option, so repeated per-call use of the same string does not recompile.\n * Bounded: the oldest entry is evicted once the cap is reached.\n */\nconst compiledCddlCache = new Map<string, CddlSchema>();\nconst COMPILED_CDDL_CACHE_MAX = 64;\n\n/**\n * Resolve the `cddl` option to a compiled schema: pass compiled schemas\n * through, compile (and cache) CDDL source text.\n */\nfunction resolveCddl(\n cddl: CddlSchema | string | undefined\n): CddlSchema | undefined {\n if (typeof cddl !== 'string') return cddl;\n let schema = compiledCddlCache.get(cddl);\n if (!schema) {\n schema = compileCDDL(cddl);\n if (compiledCddlCache.size >= COMPILED_CDDL_CACHE_MAX) {\n compiledCddlCache.delete(compiledCddlCache.keys().next().value!);\n }\n compiledCddlCache.set(cddl, schema);\n }\n return schema;\n}\n\n/**\n * Validate an item against a resolved schema (if any) and throw\n * {@link CddlMismatchError} on mismatch.\n */\nfunction assertCddl(\n item: CborItem,\n schema: CddlSchema | undefined,\n validationOptions?: CddlValidateOptions\n): CborItem {\n if (schema) {\n const result = schema.validate(item, validationOptions);\n if (!result.valid) {\n throw new CddlMismatchError(result.errors, result.warnings);\n }\n }\n return item;\n}\n\n/**\n * When a CDDL schema is supplied via the `cddl` option, validate the item\n * against it and throw {@link CddlMismatchError} on mismatch.\n */\nfunction checkCddl(\n item: CborItem,\n options?: {\n cddl?: CddlSchema | string;\n cddlValidationOptions?: CddlValidateOptions;\n }\n): CborItem {\n return assertCddl(\n item,\n resolveCddl(options?.cddl),\n options?.cddlValidationOptions\n );\n}\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 /**\n * Check CBOR / CDN / hex dump input for well-formedness and validity,\n * without throwing.\n */\n validate(\n input: ArrayBufferView | ArrayBufferLike | string,\n options?: ValidateOptions\n ): ValidateResult {\n return CBOR.validate(input, 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 checkCddl(decodeCBOR(input, options), options);\n }\n\n /** Parse a CDN text string into an AST node. */\n static fromCDN(text: string, options?: FromCDNOptions): CborItem {\n return checkCddl(parseCDN(text, options), 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 // Resolve up front so invalid CDDL source text throws even when the\n // sequence turns out to be empty.\n const cddlSchema = resolveCddl(options?.cddl);\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(bytes, {\n ...options,\n offset,\n allowTrailing: true,\n });\n yield assertCddl(item, cddlSchema, options?.cddlValidationOptions);\n offset = item.end!;\n }\n }\n\n /**\n * CDN テキストの複数 item を 1 つずつパースするジェネレータ。\n *\n * `preserveComments` が有効な場合、item 間のコメントは次の item の\n * leading コメントとして、item と同じ行にあるコメントはその item の\n * trailing コメントとして付与される。最後の item の後の行にだけ\n * コメントが残る場合、そのコメントはどの item にも属さず破棄される。\n */\n static *fromCDNSeq(\n text: string,\n options?: FromCDNSeqOptions\n ): Generator<CborItem> {\n // Resolve up front so invalid CDDL source text throws even when the\n // sequence turns out to be empty.\n const cddlSchema = resolveCddl(options?.cddl);\n const preserve = shouldEmitComments(options) || !!options?.preserveAll;\n let offset = 0;\n let isFirst = true;\n while (true) {\n const {\n offset: next,\n hadSeparator,\n commaOffset,\n } = skipCDNSeparator(\n text,\n offset,\n options,\n preserve ? (isFirst ? 'all' : 'after-newline') : 'none'\n );\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 // Stopped at a comment that should lead the next item: make sure an\n // item actually follows. If only comments remain, we are done (the\n // remaining comments belong to no item and are dropped, matching the\n // behaviour of `preserveComments: false`).\n if (preserve && isCDNCommentStart(text, next)) {\n const lookahead = skipCDNSeparator(text, next, options);\n if (lookahead.offset >= text.length) break;\n }\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 true,\n e instanceof CdnSyntaxError ? e : undefined\n );\n break;\n }\n yield assertCddl(item, cddlSchema, options?.cddlValidationOptions);\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 checkCddl(_fromJS(value, options), 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 checkCddl(decodeCBOR(new Uint8Array(bytes), options), 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 * Check CBOR / CDN / hex dump input for well-formedness and validity,\n * without throwing.\n *\n * Decodes/parses the input as a sequence (CBOR Sequence per RFC 8742, or a\n * CDN Sequence) in non-strict mode: recoverable violations are collected\n * into `warnings` instead of stopping decoding, while malformed input\n * (e.g. truncated data, hard syntax errors — including a CDN Sequence\n * abandoned after a hard syntax error) is reported via `error`.\n * Informational hints about optional extensions that aren't registered\n * (`ParseWarning.hint`) are not treated as violations; they are collected\n * separately into `hints`.\n *\n * @example\n * const result = CBOR.validate(bytes);\n * if (!result.valid) {\n * if (result.error) console.error(`invalid: ${result.error.message}`);\n * for (const w of result.warnings) console.warn(w.message);\n * }\n *\n * @example\n * // CDN text input\n * CBOR.validate('{\"a\": 1}', { type: 'cdn' });\n *\n * @example\n * // Schema validation with a compiled CDDL schema\n * import { CDDL } from '@cbortech/cbor/cddl';\n * const schema = CDDL.compile('person = { name: tstr, ? age: uint }');\n * const result = CBOR.validate('{\"name\": \"kudo\"}', { type: 'cdn', cddl: schema });\n * result.valid; // true\n * result.cddlErrors; // []\n */\n static validate(\n input: ArrayBufferView | ArrayBufferLike | string,\n options?: ValidateOptions\n ): ValidateResult {\n const warnings: (DecodeWarning | ParseWarning)[] = [];\n const hints: ParseWarning[] = [];\n let fatal: ParseWarning | undefined;\n // `cddl` is deliberately not forwarded to the Seq generators: a mismatch\n // must be collected below, not thrown from inside the generator.\n const seqOptions = {\n strict: false,\n extensions: options?.extensions,\n builtinExtensions: options?.builtinExtensions,\n onWarning: (w: DecodeWarning | ParseWarning) => {\n if ('hint' in w && w.hint) {\n hints.push(w);\n return;\n }\n if ('fatal' in w && w.fatal) {\n fatal = w;\n return;\n }\n warnings.push(w);\n },\n };\n const schema = resolveCddl(options?.cddl);\n const cddlErrors: CddlValidationError[] = [];\n const cddlWarnings: CddlValidationWarning[] = [];\n const checkItem = (item: CborItem) => {\n if (!schema) return;\n const result = schema.validate(item, options?.cddlValidationOptions);\n cddlErrors.push(...result.errors);\n if (result.warnings) cddlWarnings.push(...result.warnings);\n };\n const cddlFields = schema ? { cddlErrors, cddlWarnings } : {};\n let count = 0;\n try {\n const type = options?.type ?? 'cbor';\n if (type === 'cdn') {\n const cdnOptions: FromCDNSeqOptions = {\n ...seqOptions,\n unresolvedExtension: options?.unresolvedExtension,\n };\n for (const item of CBOR.fromCDNSeq(input as string, cdnOptions)) {\n count++;\n checkItem(item);\n }\n } else if (type === 'hex') {\n for (const item of CBOR.fromHexDumpSeq(input as string, seqOptions)) {\n count++;\n checkItem(item);\n }\n } else {\n for (const item of CBOR.fromCBORSeq(\n input as ArrayBufferView | ArrayBufferLike,\n seqOptions\n )) {\n count++;\n checkItem(item);\n }\n }\n } catch (err) {\n return {\n valid: false,\n count,\n warnings,\n hints,\n error: err instanceof Error ? err : new Error(String(err)),\n ...cddlFields,\n };\n }\n if (fatal) {\n // Prefer the original syntax error (position fields intact); the\n // unterminated-comment fatals are emitted without one, so rebuild a\n // CdnSyntaxError carrying at least the warning's offset.\n const error =\n fatal.cause instanceof Error\n ? fatal.cause\n : new CdnSyntaxError(fatal.message, { offset: fatal.offset });\n return { valid: false, count, warnings, hints, error, ...cddlFields };\n }\n return {\n valid: warnings.length === 0 && cddlErrors.length === 0,\n count,\n warnings,\n hints,\n ...cddlFields,\n };\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 opts.builtinExtensions\n );\n if (replaced === undefined || replaced === CBOR_OMIT)\n return undefined as unknown as string;\n const { replacer: _r, ...restFromJS } = opts;\n return checkCddl(\n _fromJS(\n replaced,\n Object.keys(restFromJS).length > 0\n ? (restFromJS as FromJSOptions)\n : undefined\n ),\n opts\n ).toCDN(opts);\n }\n return checkCddl(\n _fromJS(value, opts as FromJSOptions | undefined),\n opts\n ).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 fallbackOffset: number,\n options: FromCDNSeqOptions | undefined,\n fatal?: boolean,\n cause?: CdnSyntaxError\n): void {\n const offset = cause?.offset ?? fallbackOffset;\n const w: ParseWarning = { message: msg, offset };\n if (fatal) w.fatal = true;\n if (cause) w.cause = cause;\n if (cause?.offset !== undefined) {\n w.line = cause.line;\n w.column = cause.column;\n w.endOffset = cause.endOffset;\n }\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/** Whether `text[i]` starts a CDN comment (`#`, `//`, `/* … *\\/`, or `/ … /`). */\nfunction isCDNCommentStart(text: string, i: number): boolean {\n const ch = text[i];\n return ch === '#' || ch === '/';\n}\n\n/**\n * CDN sequence の item 間にある空白・コメント・省略可能なカンマを読み飛ばし、\n * 次の item が始まる文字位置と、何らかの separator が存在したかどうかを返す。\n * 未終端のブロックコメントは strict モードでは throw し、\n * strict: false の場合は警告を emit して末尾まで読み飛ばす。\n *\n * `stopAtComments` は `preserveComments` 有効時にコメントを次の item の\n * leading コメントとして残すためのモード:\n * - `'none'`: コメントも読み飛ばす(従来動作)\n * - `'all'`: 最初のコメントで停止する(先頭 item 用)\n * - `'after-newline'`: 改行より後のコメントで停止する。直前 item と同じ行の\n * コメントはその item の trailing コメントとして既に付与されているため読み飛ばす。\n */\nfunction skipCDNSeparator(\n text: string,\n from: number,\n options: FromCDNSeqOptions | undefined,\n stopAtComments: 'none' | 'after-newline' | 'all' = 'none'\n): { offset: number; hadSeparator: boolean; commaOffset: number } {\n let i = from;\n let hadSeparator = false;\n let seenComma = false;\n let seenNewline = false;\n let commaOffset = -1;\n const stopHere = (): boolean =>\n stopAtComments === 'all' ||\n (stopAtComments === 'after-newline' && seenNewline);\n while (i < text.length) {\n const ch = text[i];\n if (ch === ' ' || ch === '\\t' || ch === '\\r' || ch === '\\x1e') {\n hadSeparator = true;\n i++;\n continue;\n }\n if (ch === '\\n') {\n hadSeparator = true;\n seenNewline = true;\n i++;\n continue;\n }\n if (ch === '#') {\n hadSeparator = true;\n if (stopHere()) break;\n const nl = text.indexOf('\\n', i + 1);\n i = nl < 0 ? text.length : nl + 1;\n seenNewline = true;\n continue;\n }\n if (ch === '/' && text[i + 1] === '/') {\n hadSeparator = true;\n if (stopHere()) break;\n const nl = text.indexOf('\\n', i + 2);\n i = nl < 0 ? text.length : nl + 1;\n seenNewline = true;\n continue;\n }\n if (ch === '/' && text[i + 1] === '*') {\n hadSeparator = true;\n if (stopHere()) break;\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, true);\n i = text.length;\n } else {\n if (text.slice(i, end).includes('\\n')) seenNewline = true;\n i = end + 2;\n }\n continue;\n }\n if (ch === '/' && text[i + 1] !== '/') {\n hadSeparator = true;\n if (stopHere()) break;\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, true);\n i = text.length;\n } else {\n if (text.slice(i, end).includes('\\n')) seenNewline = true;\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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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/extensions/same.ts","../src/cddl/implicitTags.ts","../src/cbor.ts"],"sourcesContent":["/**\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; `appPrefix: 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","/**\n * Schema-implied (\"implicit\") CBOR tags: a tag the CDDL schema itself\n * requires at some position — `time = #6.1(number)`, `tdate = #6.0(tstr)`,\n * any `#6.N(type)` with a literal tag number — carries no information a\n * JS value needs to spell out, so it can be left off in both directions:\n *\n * - `inferImplicitTags()` (`fromJS()`): a JS value converted without a\n * `Tag.symbol` annotation becomes an untagged item; where validation\n * fails only because such a type expected a tag, the missing tag is\n * added (`FromJSOptions.implicitTags`).\n * - `markImplicitTags()` (after any successful `cddl` validation): flags\n * each `CborTag` whose tag inference would restore exactly, so `toJS()`\n * omits it (`ToJSOptions.implicitTags`).\n *\n * Inference is only ever a fallback. A tree that already validates is left\n * alone, and within inference every type/rule/map-group choice tries its\n * alternatives without inference first (`TagTracing.infer`), so a plain\n * number under `time / number` stays a plain number.\n *\n * Marking never *predicts* what inference would do: it runs inference on\n * the tree with the candidate tags stripped and keeps a candidate only if\n * exactly the stripped tags come back (see `markImplicitTags()`). Since\n * `fromJS()`'s own inference is the same deterministic procedure on the\n * same stripped tree, a `toJS()` → `fromJS()` round trip restores every\n * omitted tag, and never adds one that wasn't there.\n */\n\nimport type { CddlSchema } from './schema';\nimport {\n validateItem,\n type TagRecord,\n type ValidateOptions,\n} from './validator';\nimport { CborItem } from '../ast/CborItem';\nimport { CborArray } from '../ast/CborArray';\nimport { CborMap } from '../ast/CborMap';\nimport { CborTag } from '../ast/CborTag';\nimport { CborAppSeqResult } from '../ast/CborAppSeqResult';\n\n/** Upper bound on `markImplicitTags()`'s candidate-narrowing rounds. */\nconst MAX_ROUNDS = 8;\n\n/**\n * `item` with every tag the schema implies — but that the item lacks —\n * added via `makeTag`, when that is what makes it valid. Returns `item`\n * itself (unchanged) when it already validates, or when even inference\n * cannot make it valid (the caller's own validation then reports why).\n * Nodes are replaced in place inside their containers; the returned root\n * differs from `item` only when the root itself gets tagged.\n */\nexport function inferImplicitTags(\n schema: CddlSchema,\n item: CborItem,\n options: ValidateOptions | undefined,\n makeTag: (tag: bigint, inner: CborItem) => CborItem\n): CborItem {\n if (validateItem(schema, item, options).valid) return item;\n const trail: TagRecord[] = [];\n if (!validateItem(schema, item, options, { infer: true, trail }).valid)\n return item;\n const wraps = inferredTagsByItem(trail);\n if (!wraps || wraps.size === 0) return item;\n return rewrite(item, wraps, makeTag);\n}\n\n/**\n * Flag (`CborTag._implicit`) every tag in `item` that the schema implies\n * and that `inferImplicitTags()` would restore exactly if it were left off;\n * clear the flag on every other tag. `trail` holds the records of the\n * caller's own successful validation of `item` (its candidates: every tag\n * matched by a literal `#6.N`).\n *\n * The candidate set shrinks until stripping it and inferring again yields\n * back exactly that set: a tag that isn't restored (another alternative\n * accepts the untagged content, the untagged tree already validates, …)\n * drops out, and dropping one can change what the rest infer, hence the\n * rounds. If inference would ever tag something that wasn't tagged, or\n * the rounds run out, nothing is flagged — omission is an optimization,\n * never worth a round trip that changes the data.\n */\nexport function markImplicitTags(\n schema: CddlSchema,\n item: CborItem,\n options: ValidateOptions | undefined,\n trail: readonly TagRecord[]\n): void {\n clearMarks(item);\n let candidates = new Set<CborTag>();\n for (const r of trail)\n if (!r.inferred && isCandidate(r.item)) candidates.add(r.item);\n for (let round = 0; candidates.size > 0 && round < MAX_ROUNDS; round++) {\n const restored = restoredBy(schema, item, options, candidates);\n if (!restored) return;\n if (restored.size === candidates.size) {\n for (const tag of candidates) tag._implicit = true;\n return;\n }\n candidates = restored;\n }\n}\n\n/**\n * Which of `stripped` inference restores when they are all left off, or\n * `undefined` when it would also add a tag none of them accounts for.\n */\nfunction restoredBy(\n schema: CddlSchema,\n item: CborItem,\n options: ValidateOptions | undefined,\n stripped: ReadonlySet<CborTag>\n): Set<CborTag> | undefined {\n // Mirrors inferImplicitTags(): no inference when the stripped tree\n // already validates as it is.\n if (validateItem(schema, item, options, { stripped, trail: [] }).valid)\n return new Set();\n const trail: TagRecord[] = [];\n if (\n !validateItem(schema, item, options, { infer: true, stripped, trail }).valid\n )\n return new Set();\n // Inference records the item validation actually sees in place of a\n // stripped tag — the bottom of its run of directly nested stripped tags —\n // once per layer. A run is restored only if inference yields exactly its\n // tag numbers, in order.\n const chains = new Map<CborItem, CborTag[]>();\n for (const tag of stripped) {\n const chain = strippedRun(tag, stripped);\n const bottom = unwrapAppSeq(chain[chain.length - 1]!.content);\n // The run starting at its outermost tag is the longest one.\n if ((chains.get(bottom)?.length ?? 0) < chain.length)\n chains.set(bottom, chain);\n }\n const inferred = inferredTagsByItem(trail);\n if (!inferred) return undefined;\n const restored = new Set<CborTag>();\n for (const [inner, tags] of inferred) {\n const chain = chains.get(inner);\n // A tag on an item that wasn't stripped: fromJS() would add it.\n if (!chain) return undefined;\n if (\n chain.length === tags.length &&\n chain.every((t, i) => t.tag === tags[i])\n )\n for (const t of chain) restored.add(t);\n }\n return restored;\n}\n\n/**\n * `tag` and the stripped tags directly nested inside it, outermost first\n * (validation sees through all of them at once — see `viewItem()`).\n */\nfunction strippedRun(tag: CborTag, stripped: ReadonlySet<CborTag>): CborTag[] {\n const run: CborTag[] = [];\n let node: CborItem = tag;\n while (node instanceof CborTag && stripped.has(node)) {\n run.push(node);\n node = unwrapAppSeq(node.content);\n }\n return run;\n}\n\n/**\n * Inferred tag numbers per untagged item, outermost first (by\n * `TagRecord.layer`); a layer checked more than once (`.and`, `.within`,\n * …) counts once. `undefined` when one layer got two different numbers,\n * or a layer is missing — no single tagging to apply.\n */\nfunction inferredTagsByItem(\n trail: readonly TagRecord[]\n): Map<CborItem, bigint[]> | undefined {\n const out = new Map<CborItem, bigint[]>();\n for (const r of trail) {\n if (!r.inferred) continue;\n let tags = out.get(r.item);\n if (!tags) out.set(r.item, (tags = []));\n const seen = tags[r.layer];\n if (seen === undefined) tags[r.layer] = r.tag;\n else if (seen !== r.tag) return undefined;\n }\n for (const tags of out.values())\n for (let i = 0; i < tags.length; i++)\n if (tags[i] === undefined) return undefined;\n return out;\n}\n\n/**\n * Only a tag whose `toJS()` is the generic tag-annotated conversion: a\n * bignum (`CborBigUint`/`CborBigNint`) converts to a plain `bigint`\n * already, and other subclasses convert to something of their own.\n */\nfunction isCandidate(item: CborItem): item is CborTag {\n return item instanceof CborTag && item._toJS === CborTag.prototype._toJS;\n}\n\nfunction unwrapAppSeq(item: CborItem): CborItem {\n while (item instanceof CborAppSeqResult) item = item.inner;\n return item;\n}\n\n/** Reset `_implicit` on every tag reachable the way `toJS()` reaches it. */\nfunction clearMarks(item: CborItem): void {\n forEachChild(item, clearMarks);\n if (item instanceof CborTag) item._implicit = false;\n}\n\nfunction forEachChild(item: CborItem, fn: (child: CborItem) => void): void {\n if (item instanceof CborArray) item.items.forEach(fn);\n else if (item instanceof CborMap)\n for (const [k, v] of item.entries) {\n fn(k);\n fn(v);\n }\n else if (item instanceof CborTag) fn(item.content);\n else if (item instanceof CborAppSeqResult) fn(item.inner);\n}\n\n/** Replace each node in `wraps` (bottom-up) by its tagged form. */\nfunction rewrite(\n item: CborItem,\n wraps: ReadonlyMap<CborItem, readonly bigint[]>,\n makeTag: (tag: bigint, inner: CborItem) => CborItem\n): CborItem {\n const visit = (node: CborItem): CborItem => {\n if (node instanceof CborArray) {\n const { items } = node;\n for (let i = 0; i < items.length; i++) items[i] = visit(items[i]!);\n } else if (node instanceof CborMap) {\n for (const entry of node.entries) {\n entry[0] = visit(entry[0]);\n entry[1] = visit(entry[1]);\n }\n } else if (node instanceof CborTag) {\n (node as { content: CborItem }).content = visit(node.content);\n }\n let out = node;\n const tags = wraps.get(node) ?? [];\n // Innermost (last) first.\n for (let i = tags.length - 1; i >= 0; i--) out = makeTag(tags[i]!, out);\n return out;\n };\n return visit(item);\n}\n","import type { CborItem } from './ast/CborItem';\nimport type {\n CBOROptions,\n CborExtension,\n DecodeWarning,\n FromCBOROptions,\n FromCBORSeqOptions,\n FromCDNOptions,\n FromCDNSeqOptions,\n FromHexDumpOptions,\n FromJSOptions,\n ParseWarning,\n ToCBOROptions,\n ToCDNOptions,\n ToHexDumpOptions,\n ToJSOptions,\n ValidateOptions,\n ValidateResult,\n} from './types';\nimport { CBOR_OMIT } from './types';\nimport { decodeCBOR } from './cbor/decoder';\nimport { parseCDN } from './cdn/parser';\nimport { CdnSyntaxError } from './cdn/errors';\nimport { shouldEmitComments } from './cdn/serialize-utils';\nimport { CddlMismatchError } from './cddl/errors';\nimport { compile as compileCDDL, CddlSchema } from './cddl/schema';\nimport {\n validateItem,\n type TagRecord,\n type ValidateOptions as CddlValidateOptions,\n} from './cddl/validator';\nimport { inferImplicitTags, markImplicitTags } from './cddl/implicitTags';\nimport type { CddlValidationError, CddlValidationWarning } from './cddl/errors';\nimport { annotateERefKeys, createERefExtension } from './extensions/eref';\nimport { dt_as_Date as _dt_as_Date } from './extensions/dt';\nimport { fromJS as _fromJS, _applyReplacer, tagFromJS } 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 * Cache for schemas compiled from CDDL source text passed as the `cddl`\n * option, so repeated per-call use of the same string does not recompile.\n * Bounded: the oldest entry is evicted once the cap is reached.\n */\nconst compiledCddlCache = new Map<string, CddlSchema>();\nconst COMPILED_CDDL_CACHE_MAX = 64;\n\n/**\n * Resolve the `cddl` option to a compiled schema: pass compiled schemas\n * through, compile (and cache) CDDL source text.\n */\nfunction resolveCddl(\n cddl: CddlSchema | string | undefined\n): CddlSchema | undefined {\n if (typeof cddl !== 'string') return cddl;\n let schema = compiledCddlCache.get(cddl);\n if (!schema) {\n schema = compileCDDL(cddl);\n if (compiledCddlCache.size >= COMPILED_CDDL_CACHE_MAX) {\n compiledCddlCache.delete(compiledCddlCache.keys().next().value!);\n }\n compiledCddlCache.set(cddl, schema);\n }\n return schema;\n}\n\n/**\n * Validate an item against a resolved schema (if any) and throw\n * {@link CddlMismatchError} on mismatch. On success, also annotates any map\n * key the schema names via `e'...'` external-reference resolution (see\n * `extensions/eref.ts`'s `annotateERefKeys()`) so the item's own `toCDN()`\n * naturally emits `e'name'` notation and `toJS()` naturally uses `name` as\n * the plain-object key (both by default) — regardless of whether the\n * original CBOR/CDN/JS source spelled `e'...'` at all.\n */\nfunction assertCddl(\n item: CborItem,\n schema: CddlSchema | undefined,\n validationOptions?: CddlValidateOptions,\n decodeOptions?: Pick<FromCBOROptions, 'extensions' | 'builtinExtensions'>,\n jsOptions?: FromJSOptions\n): CborItem {\n if (schema) {\n // A converted JS value may leave out tags the schema implies (see\n // `cddl/implicitTags.ts`); add them before validating.\n if (jsOptions && jsOptions.implicitTags !== false)\n item = inferImplicitTags(schema, item, validationOptions, (tag, inner) =>\n tagFromJS(tag, inner, jsOptions)\n );\n const trail: TagRecord[] = [];\n const result = validateItem(schema, item, validationOptions, { trail });\n if (!result.valid) {\n throw new CddlMismatchError(result.errors, result.warnings);\n }\n markImplicitTags(schema, item, validationOptions, trail);\n annotateERefKeys(item, schema, validationOptions, decodeOptions);\n }\n return item;\n}\n\n/**\n * Register the `e'...'` external-reference app-extension (see\n * `extensions/eref.ts`) ahead of any user-supplied `extensions`, so a user\n * override for the same `'e'` prefix still wins — matching the priority\n * order `resolveBuiltinExtensions()` gives the bundled set. A no-op without\n * a resolved schema.\n */\nfunction withERefExtension<T extends { extensions?: CborExtension[] }>(\n options: T | undefined,\n schema: CddlSchema | undefined\n): T | undefined {\n if (!schema) return options;\n return {\n ...options,\n extensions: [createERefExtension(schema), ...(options?.extensions ?? [])],\n } as T;\n}\n\n/**\n * When a CDDL schema is supplied via the `cddl` option, validate the item\n * against it and throw {@link CddlMismatchError} on mismatch.\n */\nfunction checkCddl(\n item: CborItem,\n options?: {\n cddl?: CddlSchema | string;\n cddlValidationOptions?: CddlValidateOptions;\n extensions?: CborExtension[];\n builtinExtensions?: CborExtension[] | false;\n }\n): CborItem {\n return assertCddl(\n item,\n resolveCddl(options?.cddl),\n options?.cddlValidationOptions,\n options\n );\n}\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 /**\n * Check CBOR / CDN / hex dump input for well-formedness and validity,\n * without throwing.\n */\n validate(\n input: ArrayBufferView | ArrayBufferLike | string,\n options?: ValidateOptions\n ): ValidateResult {\n return CBOR.validate(input, 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 checkCddl(decodeCBOR(input, options), options);\n }\n\n /** Parse a CDN text string into an AST node. */\n static fromCDN(text: string, options?: FromCDNOptions): CborItem {\n const schema = resolveCddl(options?.cddl);\n const item = parseCDN(text, withERefExtension(options, schema));\n return assertCddl(item, schema, options?.cddlValidationOptions, 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 // Resolve up front so invalid CDDL source text throws even when the\n // sequence turns out to be empty.\n const cddlSchema = resolveCddl(options?.cddl);\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(bytes, {\n ...options,\n offset,\n allowTrailing: true,\n });\n yield assertCddl(\n item,\n cddlSchema,\n options?.cddlValidationOptions,\n options\n );\n offset = item.end!;\n }\n }\n\n /**\n * CDN テキストの複数 item を 1 つずつパースするジェネレータ。\n *\n * `preserveComments` が有効な場合、item 間のコメントは次の item の\n * leading コメントとして、item と同じ行にあるコメントはその item の\n * trailing コメントとして付与される。最後の item の後の行にだけ\n * コメントが残る場合、そのコメントはどの item にも属さず破棄される。\n */\n static *fromCDNSeq(\n text: string,\n options?: FromCDNSeqOptions\n ): Generator<CborItem> {\n // Resolve up front so invalid CDDL source text throws even when the\n // sequence turns out to be empty.\n const cddlSchema = resolveCddl(options?.cddl);\n const preserve = shouldEmitComments(options) || !!options?.preserveAll;\n let offset = 0;\n let isFirst = true;\n while (true) {\n const {\n offset: next,\n hadSeparator,\n commaOffset,\n } = skipCDNSeparator(\n text,\n offset,\n options,\n preserve ? (isFirst ? 'all' : 'after-newline') : 'none'\n );\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 // Stopped at a comment that should lead the next item: make sure an\n // item actually follows. If only comments remain, we are done (the\n // remaining comments belong to no item and are dropped, matching the\n // behaviour of `preserveComments: false`).\n if (preserve && isCDNCommentStart(text, next)) {\n const lookahead = skipCDNSeparator(text, next, options);\n if (lookahead.offset >= text.length) break;\n }\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(\n text,\n withERefExtension(\n {\n ...options,\n offset,\n allowTrailing: true,\n _skipRS: true,\n } as FromCDNOptions,\n cddlSchema\n )\n );\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 true,\n e instanceof CdnSyntaxError ? e : undefined\n );\n break;\n }\n yield assertCddl(\n item,\n cddlSchema,\n options?.cddlValidationOptions,\n options\n );\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 // Resolved up front (rather than via checkCddl(), which resolves after\n // conversion) so `options.eRefKeys` can be honored during conversion\n // itself — see `_fromJS()`'s own doc in `js/fromJS.ts`.\n const schema = resolveCddl(options?.cddl);\n const item = _fromJS(value, options, schema);\n return assertCddl(\n item,\n schema,\n options?.cddlValidationOptions,\n options,\n options ?? {}\n );\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 checkCddl(decodeCBOR(new Uint8Array(bytes), options), 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 * Check CBOR / CDN / hex dump input for well-formedness and validity,\n * without throwing.\n *\n * Decodes/parses the input as a sequence (CBOR Sequence per RFC 8742, or a\n * CDN Sequence) in non-strict mode: recoverable violations are collected\n * into `warnings` instead of stopping decoding, while malformed input\n * (e.g. truncated data, hard syntax errors — including a CDN Sequence\n * abandoned after a hard syntax error) is reported via `error`.\n * Informational hints about optional extensions that aren't registered\n * (`ParseWarning.hint`) are not treated as violations; they are collected\n * separately into `hints`.\n *\n * @example\n * const result = CBOR.validate(bytes);\n * if (!result.valid) {\n * if (result.error) console.error(`invalid: ${result.error.message}`);\n * for (const w of result.warnings) console.warn(w.message);\n * }\n *\n * @example\n * // CDN text input\n * CBOR.validate('{\"a\": 1}', { type: 'cdn' });\n *\n * @example\n * // Schema validation with a compiled CDDL schema\n * import { CDDL } from '@cbortech/cbor/cddl';\n * const schema = CDDL.compile('person = { name: tstr, ? age: uint }');\n * const result = CBOR.validate('{\"name\": \"kudo\"}', { type: 'cdn', cddl: schema });\n * result.valid; // true\n * result.cddlErrors; // []\n */\n static validate(\n input: ArrayBufferView | ArrayBufferLike | string,\n options?: ValidateOptions\n ): ValidateResult {\n const warnings: (DecodeWarning | ParseWarning)[] = [];\n const hints: ParseWarning[] = [];\n let fatal: ParseWarning | undefined;\n const schema = resolveCddl(options?.cddl);\n // `cddl` is deliberately not forwarded to the Seq generators (a mismatch\n // must be collected below, not thrown from inside the generator), but\n // `e'...'` still needs to parse as CDN text when a schema is given — see\n // `withERefExtension()`.\n const seqOptions = {\n strict: false,\n extensions: schema\n ? [createERefExtension(schema), ...(options?.extensions ?? [])]\n : options?.extensions,\n builtinExtensions: options?.builtinExtensions,\n onWarning: (w: DecodeWarning | ParseWarning) => {\n if ('hint' in w && w.hint) {\n hints.push(w);\n return;\n }\n if ('fatal' in w && w.fatal) {\n fatal = w;\n return;\n }\n warnings.push(w);\n },\n };\n const cddlErrors: CddlValidationError[] = [];\n const cddlWarnings: CddlValidationWarning[] = [];\n const checkItem = (item: CborItem) => {\n if (!schema) return;\n const result = schema.validate(item, options?.cddlValidationOptions);\n cddlErrors.push(...result.errors);\n if (result.warnings) cddlWarnings.push(...result.warnings);\n };\n const cddlFields = schema ? { cddlErrors, cddlWarnings } : {};\n let count = 0;\n try {\n const type = options?.type ?? 'cbor';\n if (type === 'cdn') {\n const cdnOptions: FromCDNSeqOptions = {\n ...seqOptions,\n unresolvedExtension: options?.unresolvedExtension,\n };\n for (const item of CBOR.fromCDNSeq(input as string, cdnOptions)) {\n count++;\n checkItem(item);\n }\n } else if (type === 'hex') {\n for (const item of CBOR.fromHexDumpSeq(input as string, seqOptions)) {\n count++;\n checkItem(item);\n }\n } else {\n for (const item of CBOR.fromCBORSeq(\n input as ArrayBufferView | ArrayBufferLike,\n seqOptions\n )) {\n count++;\n checkItem(item);\n }\n }\n } catch (err) {\n return {\n valid: false,\n count,\n warnings,\n hints,\n error: err instanceof Error ? err : new Error(String(err)),\n ...cddlFields,\n };\n }\n if (fatal) {\n // Prefer the original syntax error (position fields intact); the\n // unterminated-comment fatals are emitted without one, so rebuild a\n // CdnSyntaxError carrying at least the warning's offset.\n const error =\n fatal.cause instanceof Error\n ? fatal.cause\n : new CdnSyntaxError(fatal.message, { offset: fatal.offset });\n return { valid: false, count, warnings, hints, error, ...cddlFields };\n }\n return {\n valid: warnings.length === 0 && cddlErrors.length === 0,\n count,\n warnings,\n hints,\n ...cddlFields,\n };\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 // Resolved up front (rather than via checkCddl(), which resolves after\n // conversion) so `opts.eRefKeys` can be honored during conversion\n // itself — mirrors `CBOR.fromJS()`; see `_fromJS()`'s own doc.\n const schema = resolveCddl(opts?.cddl);\n if (opts?.replacer) {\n const replaced = _applyReplacer(\n value,\n opts.replacer,\n opts.extensions,\n opts.undefinedOmits,\n opts.builtinExtensions\n );\n if (replaced === undefined || replaced === CBOR_OMIT)\n return undefined as unknown as string;\n const { replacer: _r, ...restFromJS } = opts;\n const item = _fromJS(\n replaced,\n Object.keys(restFromJS).length > 0\n ? (restFromJS as FromJSOptions)\n : undefined,\n schema\n );\n return assertCddl(\n item,\n schema,\n opts.cddlValidationOptions,\n opts,\n restFromJS as FromJSOptions\n ).toCDN(opts);\n }\n const item = _fromJS(value, opts as FromJSOptions | undefined, schema);\n return assertCddl(\n item,\n schema,\n opts?.cddlValidationOptions,\n opts,\n opts ?? {}\n ).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 fallbackOffset: number,\n options: FromCDNSeqOptions | undefined,\n fatal?: boolean,\n cause?: CdnSyntaxError\n): void {\n const offset = cause?.offset ?? fallbackOffset;\n const w: ParseWarning = { message: msg, offset };\n if (fatal) w.fatal = true;\n if (cause) w.cause = cause;\n if (cause?.offset !== undefined) {\n w.line = cause.line;\n w.column = cause.column;\n w.endOffset = cause.endOffset;\n }\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/** Whether `text[i]` starts a CDN comment (`#`, `//`, `/* … *\\/`, or `/ … /`). */\nfunction isCDNCommentStart(text: string, i: number): boolean {\n const ch = text[i];\n return ch === '#' || ch === '/';\n}\n\n/**\n * CDN sequence の item 間にある空白・コメント・省略可能なカンマを読み飛ばし、\n * 次の item が始まる文字位置と、何らかの separator が存在したかどうかを返す。\n * 未終端のブロックコメントは strict モードでは throw し、\n * strict: false の場合は警告を emit して末尾まで読み飛ばす。\n *\n * `stopAtComments` は `preserveComments` 有効時にコメントを次の item の\n * leading コメントとして残すためのモード:\n * - `'none'`: コメントも読み飛ばす(従来動作)\n * - `'all'`: 最初のコメントで停止する(先頭 item 用)\n * - `'after-newline'`: 改行より後のコメントで停止する。直前 item と同じ行の\n * コメントはその item の trailing コメントとして既に付与されているため読み飛ばす。\n */\nfunction skipCDNSeparator(\n text: string,\n from: number,\n options: FromCDNSeqOptions | undefined,\n stopAtComments: 'none' | 'after-newline' | 'all' = 'none'\n): { offset: number; hadSeparator: boolean; commaOffset: number } {\n let i = from;\n let hadSeparator = false;\n let seenComma = false;\n let seenNewline = false;\n let commaOffset = -1;\n const stopHere = (): boolean =>\n stopAtComments === 'all' ||\n (stopAtComments === 'after-newline' && seenNewline);\n while (i < text.length) {\n const ch = text[i];\n if (ch === ' ' || ch === '\\t' || ch === '\\r' || ch === '\\x1e') {\n hadSeparator = true;\n i++;\n continue;\n }\n if (ch === '\\n') {\n hadSeparator = true;\n seenNewline = true;\n i++;\n continue;\n }\n if (ch === '#') {\n hadSeparator = true;\n if (stopHere()) break;\n const nl = text.indexOf('\\n', i + 1);\n i = nl < 0 ? text.length : nl + 1;\n seenNewline = true;\n continue;\n }\n if (ch === '/' && text[i + 1] === '/') {\n hadSeparator = true;\n if (stopHere()) break;\n const nl = text.indexOf('\\n', i + 2);\n i = nl < 0 ? text.length : nl + 1;\n seenNewline = true;\n continue;\n }\n if (ch === '/' && text[i + 1] === '*') {\n hadSeparator = true;\n if (stopHere()) break;\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, true);\n i = text.length;\n } else {\n if (text.slice(i, end).includes('\\n')) seenNewline = true;\n i = end + 2;\n }\n continue;\n }\n if (ch === '/' && text[i + 1] !== '/') {\n hadSeparator = true;\n if (stopHere()) break;\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, true);\n i = text.length;\n } else {\n if (text.slice(i, end).includes('\\n')) seenNewline = true;\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
@@ -15,6 +15,7 @@ export { ip } from './extensions/ip';
15
15
  export { cri } from './extensions/cri';
16
16
  export { t1, b1 } from './extensions/concat';
17
17
  export { ilbs, ilts } from './extensions/ilstrings';
18
+ export { createERefExtension, annotateERefKeys, CborERefUint, CborERefNint, } from './extensions/eref';
18
19
  export { BUILTIN_EXTENSIONS } from './extensions/builtins';
19
20
  export { CBOR } from './cbor';
20
21
  export { CBOR as default } from './cbor';