@cbortech/cbor 0.25.2 → 0.25.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
- import { C as e, D as t, E as n, O as r, S as i, T as a, a as o, g as s, i as c, n as l, r as u, s as d, t as f, v as p, w as m } from "./mapEntries-BMMPg2FB.js";
1
+ import { n as e } from "./tokenizer-C597LW89.js";
2
+ import { C as t, D as n, E as r, O as i, S as a, T as o, a as s, g as c, i as l, k as u, n as d, r as f, s as p, t as m, v as h, w as g } from "./mapEntries-D6BfG4-1.js";
2
3
  //#region src/utils/strip-comments.ts
3
- function h(e) {
4
+ function _(e) {
4
5
  let t = "", n = 0;
5
6
  for (; n < e.length;) {
6
7
  let r = e[n];
@@ -35,14 +36,14 @@ function h(e) {
35
36
  }
36
37
  //#endregion
37
38
  //#region src/extensions/b32.ts
38
- var g = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", _ = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
39
- function v(e) {
39
+ var v = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", y = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
40
+ function b(e) {
40
41
  let t = e.length;
41
42
  for (; t > 0 && e.charCodeAt(t - 1) === 61;) t--;
42
43
  return e.slice(0, t);
43
44
  }
44
- function y(e, t, n) {
45
- let r = v(e).toUpperCase(), i = r.length % 8;
45
+ function x(e, t, n) {
46
+ let r = b(e).toUpperCase(), i = r.length % 8;
46
47
  if (i === 1 || i === 3 || i === 6) throw SyntaxError(`invalid base32 length: ${r.length} characters`);
47
48
  let a = new Uint8Array(128).fill(255);
48
49
  for (let e = 0; e < t.length; e++) a[t.charCodeAt(e)] = e;
@@ -59,24 +60,20 @@ function y(e, t, n) {
59
60
  }
60
61
  return o;
61
62
  }
62
- var b = {
63
+ var S = {
63
64
  appStringPrefixes: ["b32"],
64
65
  parseAppString(e, t, n) {
65
- return new s(y(h(t), g, n), { ednEncoding: "base32" });
66
+ return new c(x(_(t), v, n), { ednEncoding: "base32" });
66
67
  }
67
- }, x = {
68
+ }, C = {
68
69
  appStringPrefixes: ["h32"],
69
70
  parseAppString(e, t, n) {
70
- return new s(y(h(t), _, n), { ednEncoding: "base32hex" });
71
+ return new c(x(_(t), y, n), { ednEncoding: "base32hex" });
71
72
  }
72
- }, S = typeof Uint8Array.fromHex == "function" ? (e) => Uint8Array.fromHex(e) : (e) => {
73
- let t = new Uint8Array(e.length / 2);
74
- for (let n = 0; n < e.length; n += 2) t[n / 2] = parseInt(e.slice(n, n + 2), 16);
75
- return t;
76
- }, C = class extends p {
73
+ }, w = class extends h {
77
74
  _bits;
78
75
  constructor(e) {
79
- super(i(e), { precision: "half" }), this._bits = e & 65535;
76
+ super(a(e), { precision: "half" }), this._bits = e & 65535;
80
77
  }
81
78
  _toCBOR() {
82
79
  return new Uint8Array([
@@ -85,7 +82,7 @@ var b = {
85
82
  this._bits & 255
86
83
  ]);
87
84
  }
88
- }, w = class extends p {
85
+ }, T = class extends h {
89
86
  _raw;
90
87
  constructor(e) {
91
88
  super(new DataView(e.buffer, e.byteOffset).getFloat32(0, !1), { precision: "single" }), this._raw = e.slice();
@@ -94,7 +91,7 @@ var b = {
94
91
  let e = new Uint8Array(5);
95
92
  return e[0] = 250, e.set(this._raw, 1), e;
96
93
  }
97
- }, T = class extends p {
94
+ }, E = class extends h {
98
95
  _raw;
99
96
  constructor(e) {
100
97
  super(new DataView(e.buffer, e.byteOffset).getFloat64(0, !1), { precision: "double" }), this._raw = e.slice();
@@ -104,19 +101,19 @@ var b = {
104
101
  return e[0] = 251, e.set(this._raw, 1), e;
105
102
  }
106
103
  };
107
- function E(e) {
108
- if (e.length === 2) return new C(e[0] << 8 | e[1]);
109
- if (e.length === 4) return new w(e);
110
- if (e.length === 8) return new T(e);
104
+ function D(e) {
105
+ if (e.length === 2) return new w(e[0] << 8 | e[1]);
106
+ if (e.length === 4) return new T(e);
107
+ if (e.length === 8) return new E(e);
111
108
  throw SyntaxError(`float'...' requires 4, 8, or 16 hex digits (2, 4, or 8 bytes); got ${e.length} bytes`);
112
109
  }
113
- var D = {
110
+ var O = {
114
111
  appStringPrefixes: ["float"],
115
- parseAppString(e, t) {
116
- let n = h(t);
117
- if (!/^[0-9a-fA-F]*$/.test(n)) throw SyntaxError("float'...' contains non-hex characters");
118
- if (n.length % 2 != 0) throw SyntaxError(`float'...' hex content has odd length (${n.length} digits)`);
119
- return E(S(n));
112
+ parseAppString(e, n) {
113
+ let r = _(n);
114
+ if (!/^[0-9a-fA-F]*$/.test(r)) throw SyntaxError("float'...' contains non-hex characters");
115
+ if (r.length % 2 != 0) throw SyntaxError(`float'...' hex content has odd length (${r.length} digits)`);
116
+ return D(t(r));
120
117
  },
121
118
  parseAppSequence(e, t, n) {
122
119
  if (t.length === 0) throw SyntaxError("float<<...>> requires exactly one byte-string item");
@@ -125,37 +122,37 @@ var D = {
125
122
  if (n) n(e);
126
123
  else throw SyntaxError(e);
127
124
  }
128
- if (!(t[0] instanceof s)) throw SyntaxError("float<<...>> item must be a byte string");
129
- return E(t[0].value);
125
+ if (!(t[0] instanceof c)) throw SyntaxError("float<<...>> item must be a byte string");
126
+ return D(t[0].value);
130
127
  }
131
128
  };
132
129
  //#endregion
133
130
  //#region src/extensions/same.ts
134
- function O(e, t) {
131
+ function k(e, t) {
135
132
  if (e.length !== t.length) return !1;
136
133
  for (let n = 0; n < e.length; n++) if (e[n] !== t[n]) return !1;
137
134
  return !0;
138
135
  }
139
- var k = {
136
+ var A = {
140
137
  appStringPrefixes: ["same"],
141
138
  preserveAppSeqSource: !0,
142
139
  parseAppSequence(e, t, n) {
143
140
  if (t.length === 0) throw SyntaxError("same<<...>> requires at least one item");
144
141
  let r = t[0], i = r.toCBOR();
145
- for (let e = 1; e < t.length; e++) if (!O(i, t[e].toCBOR())) {
142
+ for (let e = 1; e < t.length; e++) if (!k(i, t[e].toCBOR())) {
146
143
  let t = `same<<...>>: item ${e} produces different CBOR bytes than item 0`;
147
144
  if (n) n(t);
148
145
  else throw SyntaxError(t);
149
146
  }
150
147
  return r;
151
148
  }
152
- }, A = class n {
153
- static OMIT = m;
154
- static TAG = a;
155
- static Tag = t;
156
- static Simple = e;
157
- static MapEntries = f;
158
- static dt_as_Date = o;
149
+ }, j = class e {
150
+ static OMIT = o;
151
+ static TAG = r;
152
+ static Tag = i;
153
+ static Simple = g;
154
+ static MapEntries = m;
155
+ static dt_as_Date = s;
159
156
  #e;
160
157
  constructor(e) {
161
158
  this.#e = e ?? {};
@@ -166,164 +163,167 @@ var k = {
166
163
  ...e ?? {}
167
164
  };
168
165
  }
169
- fromCBOR(e, t) {
170
- let r = n.fromCBOR(e, this.#t(t));
166
+ fromCBOR(t, n) {
167
+ let r = e.fromCBOR(t, this.#t(n));
171
168
  return r._defaults = this.#e, r;
172
169
  }
173
- fromCDN(e, t) {
174
- let r = n.fromCDN(e, this.#t(t));
170
+ fromCDN(t, n) {
171
+ let r = e.fromCDN(t, this.#t(n));
175
172
  return r._defaults = this.#e, r;
176
173
  }
177
174
  fromEDN(e, t) {
178
175
  return this.fromCDN(e, t);
179
176
  }
180
- fromJS(e, t) {
181
- let r = n.fromJS(e, this.#t(t));
177
+ fromJS(t, n) {
178
+ let r = e.fromJS(t, this.#t(n));
182
179
  return r._defaults = this.#e, r;
183
180
  }
184
- fromHexDump(e, t) {
185
- let r = n.fromHexDump(e, this.#t(t));
181
+ fromHexDump(t, n) {
182
+ let r = e.fromHexDump(t, this.#t(n));
186
183
  return r._defaults = this.#e, r;
187
184
  }
188
- decode(e, t) {
189
- return n.decode(e, this.#t(t));
185
+ decode(t, n) {
186
+ return e.decode(t, this.#t(n));
190
187
  }
191
- encode(e, t) {
192
- return n.encode(e, this.#t(t));
188
+ encode(t, n) {
189
+ return e.encode(t, this.#t(n));
193
190
  }
194
191
  cborToCborEdn(e, t) {
195
192
  return this.cborToCdn(e, t);
196
193
  }
197
- cborToCdn(e, t) {
198
- return n.cborToCdn(e, this.#t(t));
194
+ cborToCdn(t, n) {
195
+ return e.cborToCdn(t, this.#t(n));
199
196
  }
200
197
  cborEdnToCbor(e, t) {
201
198
  return this.cdnToCbor(e, t);
202
199
  }
203
- cdnToCbor(e, t) {
204
- return n.cdnToCbor(e, this.#t(t));
200
+ cdnToCbor(t, n) {
201
+ return e.cdnToCbor(t, this.#t(n));
205
202
  }
206
- parse(e, t) {
207
- if (typeof t == "function") {
208
- let r = this.#t({ reviver: t });
209
- return n.fromCDN(e, r).toJS(r);
203
+ parse(t, n) {
204
+ if (typeof n == "function") {
205
+ let r = this.#t({ reviver: n });
206
+ return e.fromCDN(t, r).toJS(r);
210
207
  }
211
- let r = this.#t(t);
212
- return n.fromCDN(e, r).toJS(r);
208
+ let r = this.#t(n);
209
+ return e.fromCDN(t, r).toJS(r);
213
210
  }
214
- stringify(e, t, r) {
215
- if (typeof t == "function" || Array.isArray(t) || t === null || t === void 0 && r !== void 0) {
211
+ stringify(t, n, r) {
212
+ if (typeof n == "function" || Array.isArray(n) || n === null || n === void 0 && r !== void 0) {
216
213
  let i = { ...this.#e };
217
- return t === null ? i.replacer = void 0 : (typeof t == "function" || Array.isArray(t)) && (i.replacer = t), r !== void 0 && (i.indent = P(r)), n.stringify(e, i);
214
+ return n === null ? i.replacer = void 0 : (typeof n == "function" || Array.isArray(n)) && (i.replacer = n), r !== void 0 && (i.indent = F(r)), e.stringify(t, i);
218
215
  }
219
- return n.stringify(e, this.#t(t ?? void 0));
216
+ return e.stringify(t, this.#t(n ?? void 0));
220
217
  }
221
- format(e, t) {
222
- return n.format(e, this.#t(t));
218
+ format(t, n) {
219
+ return e.format(t, this.#t(n));
223
220
  }
224
221
  static fromCBOR(e, t) {
225
- return c(e, t);
222
+ return l(e, t);
226
223
  }
227
224
  static fromCDN(e, t) {
228
- return d(e, t);
225
+ return p(e, t);
229
226
  }
230
- static fromEDN(e, t) {
231
- return n.fromCDN(e, t);
227
+ static fromEDN(t, n) {
228
+ return e.fromCDN(t, n);
232
229
  }
233
230
  static fromJS(e, t) {
234
- return u(e, t);
231
+ return f(e, t);
235
232
  }
236
233
  static fromHexDump(e, t) {
237
- let n = [], r = j(e).trim().split(/\s+/).filter(Boolean);
238
- for (let e of r) {
239
- if (!/^[0-9A-Fa-f]{2}$/.test(e)) throw SyntaxError(`Invalid hex token in dump: ${JSON.stringify(e)}`);
240
- n.push(parseInt(e, 16));
241
- }
242
- return c(new Uint8Array(n), t);
234
+ let n = [], r = M(e).trim().split(/\s+/).filter(Boolean);
235
+ for (let e of r) if (/^[0-9A-Fa-f]{2}$/.test(e)) n.push(parseInt(e, 16));
236
+ else if (/^[0-9A-Fa-f]+$/.test(e) && e.length % 2 == 0) for (let t = 0; t < e.length; t += 2) n.push(parseInt(e.slice(t, t + 2), 16));
237
+ else throw SyntaxError(`Invalid hex token in dump: ${JSON.stringify(e)}`);
238
+ return l(new Uint8Array(n), t);
243
239
  }
244
- static decode(e, t) {
245
- return n.fromCBOR(e, t).toJS(t);
240
+ static decode(t, n) {
241
+ return e.fromCBOR(t, n).toJS(n);
246
242
  }
247
- static encode(e, t) {
248
- return n.fromJS(e, t).toCBOR(t);
243
+ static encode(t, n) {
244
+ return e.fromJS(t, n).toCBOR(n);
249
245
  }
250
- static cborToCdn(e, t) {
251
- return n.fromCBOR(e, t).toCDN(t);
246
+ static cborToCdn(t, n) {
247
+ return e.fromCBOR(t, n).toCDN(n);
252
248
  }
253
- static cborToCborEdn(e, t) {
254
- return n.cborToCdn(e, t);
249
+ static cborToCborEdn(t, n) {
250
+ return e.cborToCdn(t, n);
255
251
  }
256
- static cdnToCbor(e, t) {
257
- return n.fromCDN(e, t).toCBOR(t);
252
+ static cdnToCbor(t, n) {
253
+ return e.fromCDN(t, n).toCBOR(n);
258
254
  }
259
- static cborEdnToCbor(e, t) {
260
- return n.cdnToCbor(e, t);
255
+ static cborEdnToCbor(t, n) {
256
+ return e.cdnToCbor(t, n);
261
257
  }
262
- static parse(e, t) {
263
- return typeof t == "function" ? n.fromCDN(e).toJS({ reviver: t }) : n.fromCDN(e, t).toJS(t);
258
+ static parse(t, n) {
259
+ return typeof n == "function" ? e.fromCDN(t).toJS({ reviver: n }) : e.fromCDN(t, n).toJS(n);
264
260
  }
265
261
  static stringify(e, t, n) {
266
262
  if (typeof t == "function" || Array.isArray(t) || t === null || t === void 0 && n !== void 0) {
267
- let r = typeof t == "function" || Array.isArray(t) ? t : void 0, i = P(n);
263
+ let r = typeof t == "function" || Array.isArray(t) ? t : void 0, i = F(n);
268
264
  if (r) {
269
- let t = l(e, r);
270
- return t === void 0 || t === m ? void 0 : u(t).toCDN(i === void 0 ? void 0 : { indent: i });
265
+ let t = d(e, r);
266
+ return t === void 0 || t === o ? void 0 : f(t).toCDN(i === void 0 ? void 0 : { indent: i });
271
267
  }
272
- return u(e).toCDN(i === void 0 ? void 0 : { indent: i });
268
+ return f(e).toCDN(i === void 0 ? void 0 : { indent: i });
273
269
  }
274
270
  let r = t;
275
271
  if (r?.replacer) {
276
- let t = l(e, r.replacer, r.extensions, r.undefinedOmits);
277
- if (t === void 0 || t === m) return;
272
+ let t = d(e, r.replacer, r.extensions, r.undefinedOmits);
273
+ if (t === void 0 || t === o) return;
278
274
  let { replacer: n, ...i } = r;
279
- return u(t, Object.keys(i).length > 0 ? i : void 0).toCDN(r);
275
+ return f(t, Object.keys(i).length > 0 ? i : void 0).toCDN(r);
280
276
  }
281
- return u(e, r).toCDN(r);
277
+ return f(e, r).toCDN(r);
282
278
  }
283
- static format(e, t) {
284
- return n.fromCDN(e, t).toCDN(t);
279
+ static format(t, n) {
280
+ return e.fromCDN(t, n).toCDN(n);
285
281
  }
286
282
  };
287
- function j(e) {
283
+ function M(e) {
288
284
  let t = "", n = 0;
289
285
  for (; n < e.length;) {
290
286
  let r = e[n], i = e[n + 1] ?? "";
291
287
  if (r === "-" && i === "-") {
292
- n = M(e, n + 2), t += " ";
288
+ n = N(e, n + 2), t += " ";
289
+ continue;
290
+ }
291
+ if (r === "—") {
292
+ n = N(e, n + 1), t += " ";
293
293
  continue;
294
294
  }
295
295
  if (r === "#") {
296
- n = M(e, n + 1), t += " ";
296
+ n = N(e, n + 1), t += " ";
297
297
  continue;
298
298
  }
299
299
  if (r === "/" && i === "/") {
300
- n = M(e, n + 2), t += " ";
300
+ n = N(e, n + 2), t += " ";
301
301
  continue;
302
302
  }
303
303
  if (r === "/" && i === "*") {
304
304
  let r = e.indexOf("*/", n + 2);
305
305
  if (r < 0) throw SyntaxError("Unterminated comment in hex dump");
306
- t += N(e.slice(n, r + 2)), n = r + 2;
306
+ t += P(e.slice(n, r + 2)), n = r + 2;
307
307
  continue;
308
308
  }
309
309
  if (r === "/") {
310
310
  let r = e.indexOf("/", n + 1);
311
311
  if (r < 0) throw SyntaxError("Unterminated comment in hex dump");
312
- t += N(e.slice(n, r + 1)), n = r + 1;
312
+ t += P(e.slice(n, r + 1)), n = r + 1;
313
313
  continue;
314
314
  }
315
315
  t += r, n++;
316
316
  }
317
317
  return t;
318
318
  }
319
- function M(e, t) {
319
+ function N(e, t) {
320
320
  let n = e.indexOf("\n", t);
321
321
  return n < 0 ? e.length : n;
322
322
  }
323
- function N(e) {
323
+ function P(e) {
324
324
  return e.replace(/[^\r\n]/g, " ");
325
325
  }
326
- function P(e) {
326
+ function F(e) {
327
327
  if (typeof e == "number") {
328
328
  let t = Math.floor(Math.min(10, Math.max(0, e)));
329
329
  return t === 0 ? void 0 : t;
@@ -331,6 +331,6 @@ function P(e) {
331
331
  if (typeof e == "string") return e.slice(0, 10) || void 0;
332
332
  }
333
333
  //#endregion
334
- export { A as CBOR, A as default, m as CBOR_OMIT, a as CBOR_TAG, f as MapEntries, n as Null, e as Simple, t as Tag, r as Undefined, b as b32, o as dt_as_Date, D as float, x as h32, k as same };
334
+ export { j as CBOR, j as default, o as CBOR_OMIT, r as CBOR_TAG, e as CdnSyntaxError, m as MapEntries, n as Null, g as Simple, i as Tag, u as Undefined, S as b32, s as dt_as_Date, O as float, C as h32, A as same };
335
335
 
336
336
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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 * This extension is NOT part of draft-ietf-cbor-edn-literals and is not\n * included in the default extension set. Add it 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 } from '../utils/float16';\nimport { stripComments } from '../utils/strip-comments';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _fromHex =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (Uint8Array as any).fromHex === 'function'\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (h: string) => (Uint8Array as any).fromHex(h) as Uint8Array\n : (h: string): Uint8Array => {\n const out = new Uint8Array(h.length / 2);\n for (let i = 0; i < h.length; i += 2)\n out[i / 2] = parseInt(h.slice(i, i + 2), 16);\n return out;\n };\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/**\n * Extension object for `float'...'` / `float<<...>>`.\n * Pass to `parseCDN(..., { extensions: [float] })`.\n */\nexport const float: CborExtension = {\n appStringPrefixes: ['float'],\n\n parseAppString(_prefix: string, content: string): 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 return floatFromBytes(_fromHex(hex));\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 throw new SyntaxError(\n `Invalid hex token in dump: ${JSON.stringify(token)}`\n );\n bytes.push(parseInt(token, 16));\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 === '/' && 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.js","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 * This extension is NOT part of draft-ietf-cbor-edn-literals and is not\n * included in the default extension set. Add it 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 } from '../utils/float16';\nimport { stripComments } from '../utils/strip-comments';\nimport { hexToBytes } from '../utils/hex';\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/**\n * Extension object for `float'...'` / `float<<...>>`.\n * Pass to `parseCDN(..., { extensions: [float] })`.\n */\nexport const float: CborExtension = {\n appStringPrefixes: ['float'],\n\n parseAppString(_prefix: string, content: string): 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 return floatFromBytes(hexToBytes(hex));\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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"}