json-web3 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -23,28 +23,57 @@ const payload = {
23
23
  u8Array: new Uint8Array([1, 2, 3, 255]),
24
24
  u16Array: new Uint16Array([1, 2, 3, 255]),
25
25
  bigIntArray: new BigInt64Array([18446744073709551615n, 2n, 3n, 255n]),
26
+ createdAt: new Date('2020-01-02T03:04:05.006Z'),
27
+ ids: new Set([123, 456]),
28
+ headers: new Map([['hello', 'world']]),
29
+ re: /([^\s]+)/g,
30
+ url: new URL('https://example.com/'),
31
+ fn: function echo(arg) {
32
+ return arg
33
+ },
26
34
  }
27
35
 
28
36
  const text = jsonWeb3.stringify(payload)
29
37
  // => {"balance":{"__@json.bigint__":"1234567890123456789"},"decimals":{"__@json.bigint__":"18"},"u8Array":{"__@json.typedarray__":{"type":"Uint8Array","bytes":"0x010203ff"}},"u16Array":{"__@json.typedarray__":{"type":"Uint16Array","bytes":"0x010002000300ff00"}},"bigIntArray":{"__@json.typedarray__":{"type":"BigInt64Array","bytes":"0xffffffffffffffff02000000000000000300000000000000ff00000000000000"}}}
30
38
 
31
39
  const restored = jsonWeb3.parse(text)
32
- /* =>
40
+ /* =>
33
41
  {
34
42
  balance: 1234567890123456789n,
35
43
  decimals: 18n,
36
44
  u8Array: Uint8Array(4) [1, 2, 3, 255]...,
37
45
  u16Array: Uint16Array(4)...,
38
- bigIntArray: BigInt64Array(4)...
46
+ bigIntArray: BigInt64Array(4)...,
47
+ createdAt: Date(...),
48
+ ids: Set(2) {...},
49
+ headers: Map(1) {...},
50
+ re: /([^\s]+)/g,
51
+ url: URL(...),
52
+ fn: undefined
39
53
  }
40
54
  */
55
+
56
+ const textUnsafe = jsonWeb3.stringify_UNSAFE(payload)
57
+ const restoredUnsafe = jsonWeb3.parse_UNSAFE(textUnsafe)
58
+ // restoredUnsafe.fn is a callable function
41
59
  ```
42
60
 
43
61
  ## API (Fully compatible with native globalThis.JSON)
44
62
 
45
63
  - `stringify(value, replacer?, space?)`
64
+ - `stringify_UNSAFE(value, replacer?, space?)` (serializes `Function` payloads)
46
65
  - `parse(text, reviver?)`
66
+ - `parse_UNSAFE(text, reviver?)` (revives `Function` payloads via `new Function(...)`)
67
+
68
+ ## Note
47
69
 
48
- ## Notes
70
+ - `bigint` values are encoded as objects: `{"__@json.bigint__":"<value>"}`.
71
+ - Non-finite numbers (`NaN`, `Infinity`, `-Infinity`) are encoded as `{"__@json.number__":"<value>"}`.
72
+ - `Date` values are encoded as `{"__@json.date__":<timestamp>}`.
73
+ - `Map` values are encoded as `{"__@json.map__":[[k,v],...]}` and `Set` values as `{"__@json.set__":[...]}`.
74
+ - `RegExp` values are encoded as `{"__@json.regexp__":{"source":"...","flags":"..."}}`.
75
+ - `URL` values are encoded as `{"__@json.url__":"..."}`.
76
+ - `Function` values are encoded as `{"__@json.function__":"<source>"}` by `stringify_UNSAFE` and are only revived by `parse_UNSAFE` using `new Function(...)` (only do this with trusted input).
77
+ - `ArrayBuffer`, Node `Buffer` JSON shapes, and typed arrays are encoded as `{"__@json.typedarray__":{"type":"<Name>","bytes":"0x..."}}` and decoded back to the original typed array (`Uint8Array`, `Uint8ClampedArray`, `Uint16Array`, `Uint32Array`, `Int8Array`, `Int16Array`, `Int32Array`, `Float32Array`, `Float64Array`, `BigInt64Array`, `BigUint64Array`).
49
78
 
50
- `bigint` values are encoded as objects: `{"__@json.bigint__":"<value>"}`. `ArrayBuffer`, Node `Buffer` JSON shapes, and typed arrays are encoded as `{"__@json.typedarray__":{"type":"<Name>","bytes":"0x..."}}` and decoded back to the original typed array (`Uint8Array`, `Uint8ClampedArray`, `Uint16Array`, `Uint32Array`, `Int8Array`, `Int16Array`, `Int32Array`, `Float32Array`, `Float64Array`, `BigInt64Array`, `BigUint64Array`).
79
+ Compared to libraries that require eval-based parsing (for example, `serialize-javascript`), this approach is generally safer and more efficient.
package/dist/index.cjs CHANGED
@@ -22,13 +22,22 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  default: () => index_default,
24
24
  parse: () => parse,
25
- stringify: () => stringify
25
+ parse_UNSAFE: () => parse_UNSAFE,
26
+ stringify: () => stringify,
27
+ stringify_UNSAFE: () => stringify_UNSAFE
26
28
  });
27
29
  module.exports = __toCommonJS(index_exports);
28
30
 
29
31
  // src/utils.ts
30
32
  var BIGINT_TAG = "__@json.bigint__";
31
33
  var TYPEDARRAY_TAG = "__@json.typedarray__";
34
+ var DATE_TAG = "__@json.date__";
35
+ var MAP_TAG = "__@json.map__";
36
+ var SET_TAG = "__@json.set__";
37
+ var REGEXP_TAG = "__@json.regexp__";
38
+ var URL_TAG = "__@json.url__";
39
+ var FUNCTION_TAG = "__@json.function__";
40
+ var NUMBER_TAG = "__@json.number__";
32
41
  var undefined = void 0;
33
42
  var isUndefined = (value) => typeof value === "undefined";
34
43
  var isString = (value) => typeof value === "string";
@@ -37,6 +46,13 @@ var isArray = (value) => Array.isArray(value);
37
46
  var isObject = (value) => value !== null && typeof value === "object" && !isArray(value);
38
47
  var isFunction = (value) => typeof value === "function";
39
48
  var isBigInt = (value) => typeof value === "bigint";
49
+ var isDate = (value) => value instanceof Date;
50
+ var isMap = (value) => value instanceof Map;
51
+ var isSet = (value) => value instanceof Set;
52
+ var isRegExp = (value) => value instanceof RegExp;
53
+ var isURL = (value) => !isUndefined(URL) && value instanceof URL;
54
+ var isNonFiniteNumber = (value) => typeof value === "number" && !Number.isFinite(value);
55
+ var isInteger = (value) => Number.isInteger(value);
40
56
  var hasBuffer = () => typeof Buffer !== "undefined";
41
57
  var isArrayBuffer = (value) => !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer;
42
58
  var isTypedArray = (value) => {
@@ -89,10 +105,34 @@ var fromHex = (hex) => {
89
105
  }
90
106
  return out;
91
107
  };
92
- var toSerializable = (value) => {
108
+ var toSerializable = (value, options = {}) => {
93
109
  if (isBigInt(value)) {
94
110
  return { [BIGINT_TAG]: value.toString() };
95
111
  }
112
+ if (isNonFiniteNumber(value)) {
113
+ return { [NUMBER_TAG]: String(value) };
114
+ }
115
+ if (isDate(value)) {
116
+ return { [DATE_TAG]: value.getTime() };
117
+ }
118
+ if (isMap(value)) {
119
+ return { [MAP_TAG]: Array.from(value.entries()) };
120
+ }
121
+ if (isSet(value)) {
122
+ return { [SET_TAG]: Array.from(value.values()) };
123
+ }
124
+ if (isRegExp(value)) {
125
+ return { [REGEXP_TAG]: { source: value.source, flags: value.flags } };
126
+ }
127
+ if (isURL(value)) {
128
+ return { [URL_TAG]: value.toString() };
129
+ }
130
+ if (isFunction(value)) {
131
+ if (!options.allowFunction) {
132
+ return value;
133
+ }
134
+ return { [FUNCTION_TAG]: value.toString() };
135
+ }
96
136
  if (isTypedArray(value)) {
97
137
  const type = getTypedArrayName(value);
98
138
  if (type && TYPEDARRAY_CTORS[type]) {
@@ -103,16 +143,64 @@ var toSerializable = (value) => {
103
143
  if (isArrayBuffer(value)) {
104
144
  return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(new Uint8Array(value)) } };
105
145
  }
106
- if (value && isObject(value) && value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {
146
+ if (value && isObject(value) && value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => isInteger(entry) && entry >= 0 && entry <= 255)) {
107
147
  return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(Uint8Array.from(value.data)) } };
108
148
  }
109
149
  return value;
110
150
  };
111
- var fromSerializable = (value) => {
151
+ var fromSerializable = (value, options = {}) => {
112
152
  if (value && isObject(value)) {
113
153
  if (hasOwnProperty(value, BIGINT_TAG)) {
114
154
  return BigInt(value[BIGINT_TAG]);
115
155
  }
156
+ if (hasOwnProperty(value, NUMBER_TAG)) {
157
+ const payload = value[NUMBER_TAG];
158
+ if (payload === "NaN") return NaN;
159
+ if (payload === "Infinity") return Infinity;
160
+ if (payload === "-Infinity") return -Infinity;
161
+ throw new Error("Invalid number payload");
162
+ }
163
+ if (hasOwnProperty(value, DATE_TAG)) {
164
+ return new Date(value[DATE_TAG]);
165
+ }
166
+ if (hasOwnProperty(value, MAP_TAG)) {
167
+ const payload = value[MAP_TAG];
168
+ if (!isArray(payload)) {
169
+ throw new Error("Invalid map payload");
170
+ }
171
+ return new Map(payload);
172
+ }
173
+ if (hasOwnProperty(value, SET_TAG)) {
174
+ const payload = value[SET_TAG];
175
+ if (!isArray(payload)) {
176
+ throw new Error("Invalid set payload");
177
+ }
178
+ return new Set(payload);
179
+ }
180
+ if (hasOwnProperty(value, REGEXP_TAG)) {
181
+ const payload = value[REGEXP_TAG];
182
+ if (!payload || !isObject(payload) || !isString(payload.source) || !isString(payload.flags)) {
183
+ throw new Error("Invalid regexp payload");
184
+ }
185
+ return new RegExp(payload.source, payload.flags);
186
+ }
187
+ if (hasOwnProperty(value, URL_TAG)) {
188
+ const payload = value[URL_TAG];
189
+ if (!isString(payload)) {
190
+ throw new Error("Invalid URL payload");
191
+ }
192
+ return new URL(payload);
193
+ }
194
+ if (hasOwnProperty(value, FUNCTION_TAG)) {
195
+ if (!options.allowFunction) {
196
+ return value;
197
+ }
198
+ const payload = value[FUNCTION_TAG];
199
+ if (!isString(payload)) {
200
+ throw new Error("Invalid function payload");
201
+ }
202
+ return new Function(`return (${payload})`)();
203
+ }
116
204
  if (hasOwnProperty(value, TYPEDARRAY_TAG)) {
117
205
  const payload = value[TYPEDARRAY_TAG];
118
206
  if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {
@@ -125,13 +213,14 @@ var fromSerializable = (value) => {
125
213
  new Uint8Array(buffer).set(bytes);
126
214
  return new ctor(buffer);
127
215
  }
128
- if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {
216
+ if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => isInteger(entry) && entry >= 0 && entry <= 255)) {
129
217
  return Uint8Array.from(value.data);
130
218
  }
131
219
  }
132
220
  return value;
133
221
  };
134
222
  var isTypedArrayPayload = (value) => isObject(value) && isString(value.type) && isString(value.bytes) && Object.keys(value).length === 2;
223
+ var isRegExpPayload = (value) => isObject(value) && isString(value.source) && isString(value.flags) && Object.keys(value).length === 2;
135
224
 
136
225
  // src/index.ts
137
226
  var RAW_JSON = JSON;
@@ -142,8 +231,16 @@ var applyReplacer = (holder, key, value, replacer) => {
142
231
  if (isArray(replacer)) {
143
232
  if (key === "") return value;
144
233
  if (key === BIGINT_TAG) return value;
234
+ if (key === DATE_TAG) return value;
235
+ if (key === NUMBER_TAG) return value;
236
+ if (key === MAP_TAG) return value;
237
+ if (key === SET_TAG) return value;
238
+ if (key === REGEXP_TAG) return value;
239
+ if (key === URL_TAG) return value;
240
+ if (key === FUNCTION_TAG) return value;
145
241
  if (key === TYPEDARRAY_TAG) return value;
146
242
  if (isTypedArrayPayload(holder)) return value;
243
+ if (isRegExpPayload(holder)) return value;
147
244
  if (isArray(holder)) return value;
148
245
  return replacer.includes(key) ? value : undefined;
149
246
  }
@@ -152,22 +249,42 @@ var applyReplacer = (holder, key, value, replacer) => {
152
249
  var stringify = (value, replacer = null, space) => RAW_JSON.stringify(
153
250
  value,
154
251
  function replacerFn(key, v) {
155
- const replaced = applyReplacer(this, key, v, replacer);
252
+ const holderValue = this && key in Object(this) ? this[key] : v;
253
+ const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v;
254
+ const replaced = applyReplacer(this, key, candidate, replacer);
156
255
  return toSerializable(replaced);
157
256
  },
158
257
  space
159
258
  );
259
+ var stringify_UNSAFE = (value, replacer = null, space) => RAW_JSON.stringify(
260
+ value,
261
+ function replacerFn(key, v) {
262
+ const holderValue = this && key in Object(this) ? this[key] : v;
263
+ const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v;
264
+ const replaced = applyReplacer(this, key, candidate, replacer);
265
+ return toSerializable(replaced, { allowFunction: true });
266
+ },
267
+ space
268
+ );
160
269
  var parse = (text, reviver = null) => RAW_JSON.parse(text, (key, v) => {
161
270
  const decoded = fromSerializable(v);
162
271
  return isFunction(reviver) ? reviver(key, decoded) : decoded;
163
272
  });
273
+ var parse_UNSAFE = (text, reviver = null) => RAW_JSON.parse(text, (key, v) => {
274
+ const decoded = fromSerializable(v, { allowFunction: true });
275
+ return isFunction(reviver) ? reviver(key, decoded) : decoded;
276
+ });
164
277
  var index_default = {
165
278
  stringify,
166
- parse
279
+ stringify_UNSAFE,
280
+ parse,
281
+ parse_UNSAFE
167
282
  };
168
283
  // Annotate the CommonJS export names for ESM import in node:
169
284
  0 && (module.exports = {
170
285
  parse,
171
- stringify
286
+ parse_UNSAFE,
287
+ stringify,
288
+ stringify_UNSAFE
172
289
  });
173
290
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n BIGINT_TAG,\n fromSerializable,\n isArray,\n isFunction,\n isTypedArrayPayload,\n toSerializable,\n TYPEDARRAY_TAG,\n undefined,\n} from './utils'\n\nconst RAW_JSON = JSON\ntype Replacer = ((this: any, key: string, value: any) => any) | Array<string | number> | null\ntype Reviver = ((this: any, key: string, value: any) => any) | null\n\nconst applyReplacer = (holder: any, key: string, value: any, replacer: Replacer): any => {\n if (isFunction(replacer)) {\n return replacer(key, value)\n }\n if (isArray(replacer)) {\n if (key === '') return value\n if (key === BIGINT_TAG) return value\n if (key === TYPEDARRAY_TAG) return value\n if (isTypedArrayPayload(holder)) return value\n if (isArray(holder)) return value\n return replacer.includes(key) ? value : undefined\n }\n return value\n}\n\nexport const stringify = (value: any, replacer: Replacer = null, space?: string | number): string =>\n RAW_JSON.stringify(\n value,\n function replacerFn(key, v) {\n const replaced = applyReplacer(this, key, v, replacer)\n return toSerializable(replaced)\n },\n space,\n )\n\nexport const parse = (text: string, reviver: Reviver = null): any =>\n RAW_JSON.parse(text, (key, v) => {\n const decoded = fromSerializable(v)\n return isFunction(reviver) ? reviver(key, decoded) : decoded\n })\n\nexport default {\n stringify,\n parse,\n}\n","export const BIGINT_TAG = '__@json.bigint__'\nexport const TYPEDARRAY_TAG = '__@json.typedarray__'\n\nexport const undefined = void 0\nexport const isUndefined = (value: any): value is undefined => typeof value === 'undefined'\nexport const isString = (value: any): value is string => typeof value === 'string'\nexport const hasOwnProperty = (obj: any, prop: string): boolean =>\n Object.prototype.hasOwnProperty.call(obj, prop)\nexport const isArray = (value: any): value is Array<any> => Array.isArray(value)\nexport const isObject = (value: any): value is Record<string, any> =>\n value !== null && typeof value === 'object' && !isArray(value)\nexport const isFunction = (value: any): value is Function => typeof value === 'function'\nexport const isBigInt = (value: any): value is bigint => typeof value === 'bigint'\nconst hasBuffer = (): boolean => typeof Buffer !== 'undefined'\n\nexport const isBuffer = (value: any): value is Buffer =>\n hasBuffer() && isFunction(Buffer.isBuffer) && Buffer.isBuffer(value)\nexport const isArrayBuffer = (value: any): value is ArrayBuffer =>\n !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer\n\nexport const isTypedArray = (value: any): value is ArrayBufferView => {\n if (isUndefined(value)) return false\n if (!isUndefined(ArrayBuffer) && isFunction(ArrayBuffer.isView) && ArrayBuffer.isView(value)) {\n return Object.prototype.toString.call(value) !== '[object DataView]'\n }\n const tag = Object.prototype.toString.call(value)\n return tag.endsWith('Array]') && tag !== '[object Array]'\n}\n\nexport const getTypedArrayName = (value: any): string | null => {\n if (isUndefined(value)) return null\n const ctor = (value as any).constructor\n if (ctor && isString(ctor.name)) return ctor.name\n const tag = Object.prototype.toString.call(value)\n const match = /^\\[object (.+)\\]$/.exec(tag)\n return match ? match[1] : null\n}\n\nconst TYPEDARRAY_CTORS: Record<string, any> = {\n Uint8Array: !isUndefined(Uint8Array) ? Uint8Array : undefined,\n Uint8ClampedArray: !isUndefined(Uint8ClampedArray) ? Uint8ClampedArray : undefined,\n Uint16Array: !isUndefined(Uint16Array) ? Uint16Array : undefined,\n Uint32Array: !isUndefined(Uint32Array) ? Uint32Array : undefined,\n Int8Array: !isUndefined(Int8Array) ? Int8Array : undefined,\n Int16Array: !isUndefined(Int16Array) ? Int16Array : undefined,\n Int32Array: !isUndefined(Int32Array) ? Int32Array : undefined,\n Float32Array: !isUndefined(Float32Array) ? Float32Array : undefined,\n Float64Array: !isUndefined(Float64Array) ? Float64Array : undefined,\n BigInt64Array: !isUndefined(BigInt64Array) ? BigInt64Array : undefined,\n BigUint64Array: !isUndefined(BigUint64Array) ? BigUint64Array : undefined,\n}\n\nexport const toHex = (value: Uint8Array): string => {\n let out = '0x'\n for (const byte of value) {\n out += byte.toString(16).padStart(2, '0')\n }\n return out\n}\n\nexport const fromHex = (hex: string): Uint8Array => {\n const normalized = hex.startsWith('0x') ? hex.slice(2) : hex\n if (normalized.length % 2 !== 0) {\n throw new Error('Invalid hex string for bytes')\n }\n\n if (hasBuffer()) {\n return Uint8Array.from(Buffer.from(normalized, 'hex'))\n }\n\n const out = new Uint8Array(normalized.length / 2)\n for (let i = 0; i < normalized.length; i += 2) {\n out[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16)\n }\n return out\n}\n\nexport const toSerializable = (value: any): any => {\n if (isBigInt(value)) {\n return { [BIGINT_TAG]: value.toString() }\n }\n\n if (isTypedArray(value)) {\n const type = getTypedArrayName(value)\n if (type && TYPEDARRAY_CTORS[type]) {\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n return { [TYPEDARRAY_TAG]: { type, bytes: toHex(bytes) } }\n }\n }\n\n if (isArrayBuffer(value)) {\n return { [TYPEDARRAY_TAG]: { type: 'Uint8Array', bytes: toHex(new Uint8Array(value)) } }\n }\n\n if (\n value &&\n isObject(value) &&\n value.type === 'Buffer' &&\n isArray(value.data) &&\n Object.keys(value).length === 2 &&\n value.data.every((entry: any) => Number.isInteger(entry) && entry >= 0 && entry <= 255)\n ) {\n return { [TYPEDARRAY_TAG]: { type: 'Uint8Array', bytes: toHex(Uint8Array.from(value.data)) } }\n }\n\n return value\n}\n\nexport const fromSerializable = (value: any): any => {\n if (value && isObject(value)) {\n if (hasOwnProperty(value, BIGINT_TAG)) {\n return BigInt(value[BIGINT_TAG])\n }\n if (hasOwnProperty(value, TYPEDARRAY_TAG)) {\n const payload = value[TYPEDARRAY_TAG]\n if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {\n throw new Error('Invalid typed array payload')\n }\n const bytes = fromHex(payload.bytes)\n const ctor = TYPEDARRAY_CTORS[payload.type]\n if (!ctor) return bytes\n const buffer = new ArrayBuffer(bytes.byteLength)\n new Uint8Array(buffer).set(bytes)\n return new ctor(buffer)\n }\n if (\n value.type === 'Buffer' &&\n isArray(value.data) &&\n Object.keys(value).length === 2 &&\n value.data.every((entry: any) => Number.isInteger(entry) && entry >= 0 && entry <= 255)\n ) {\n return Uint8Array.from(value.data)\n }\n }\n return value\n}\n\nexport const isTypedArrayPayload = (value: any): boolean =>\n isObject(value) &&\n isString(value.type) &&\n isString(value.bytes) &&\n Object.keys(value).length === 2\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n BIGINT_TAG,\n DATE_TAG,\n fromSerializable,\n FUNCTION_TAG,\n isArray,\n isDate,\n isFunction,\n isRegExpPayload,\n isTypedArrayPayload,\n isURL,\n MAP_TAG,\n NUMBER_TAG,\n REGEXP_TAG,\n SET_TAG,\n toSerializable,\n TYPEDARRAY_TAG,\n undefined,\n URL_TAG,\n} from './utils'\n\nconst RAW_JSON = JSON\ntype Replacer = ((this: any, key: string, value: any) => any) | Array<string | number> | null\ntype Reviver = ((this: any, key: string, value: any) => any) | null\n\nconst applyReplacer = (holder: any, key: string, value: any, replacer: Replacer): any => {\n if (isFunction(replacer)) {\n return replacer(key, value)\n }\n if (isArray(replacer)) {\n if (key === '') return value\n if (key === BIGINT_TAG) return value\n if (key === DATE_TAG) return value\n if (key === NUMBER_TAG) return value\n if (key === MAP_TAG) return value\n if (key === SET_TAG) return value\n if (key === REGEXP_TAG) return value\n if (key === URL_TAG) return value\n if (key === FUNCTION_TAG) return value\n if (key === TYPEDARRAY_TAG) return value\n if (isTypedArrayPayload(holder)) return value\n if (isRegExpPayload(holder)) return value\n if (isArray(holder)) return value\n return replacer.includes(key) ? value : undefined\n }\n return value\n}\n\nexport const stringify = (value: any, replacer: Replacer = null, space?: string | number): string =>\n RAW_JSON.stringify(\n value,\n function replacerFn(key, v) {\n const holderValue = this && key in Object(this) ? (this as any)[key] : v\n const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v\n const replaced = applyReplacer(this, key, candidate, replacer)\n return toSerializable(replaced)\n },\n space,\n )\n\nexport const stringify_UNSAFE = (\n value: any,\n replacer: Replacer = null,\n space?: string | number,\n): string =>\n RAW_JSON.stringify(\n value,\n function replacerFn(key, v) {\n const holderValue = this && key in Object(this) ? (this as any)[key] : v\n const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v\n const replaced = applyReplacer(this, key, candidate, replacer)\n return toSerializable(replaced, { allowFunction: true })\n },\n space,\n )\n\nexport const parse = <T = any>(text: string, reviver: Reviver = null): T =>\n RAW_JSON.parse(text, (key, v) => {\n const decoded = fromSerializable(v)\n return isFunction(reviver) ? reviver(key, decoded) : decoded\n })\n\nexport const parse_UNSAFE = <T = any>(text: string, reviver: Reviver = null): T =>\n RAW_JSON.parse(text, (key, v) => {\n const decoded = fromSerializable(v, { allowFunction: true })\n return isFunction(reviver) ? reviver(key, decoded) : decoded\n })\n\nexport default {\n stringify,\n stringify_UNSAFE,\n parse,\n parse_UNSAFE,\n}\n","export const BIGINT_TAG = '__@json.bigint__'\nexport const TYPEDARRAY_TAG = '__@json.typedarray__'\nexport const DATE_TAG = '__@json.date__'\nexport const MAP_TAG = '__@json.map__'\nexport const SET_TAG = '__@json.set__'\nexport const REGEXP_TAG = '__@json.regexp__'\nexport const URL_TAG = '__@json.url__'\nexport const FUNCTION_TAG = '__@json.function__'\nexport const NUMBER_TAG = '__@json.number__'\n\nexport const undefined = void 0\nexport const isUndefined = (value: any): value is undefined => typeof value === 'undefined'\nexport const isString = (value: any): value is string => typeof value === 'string'\nexport const hasOwnProperty = (obj: any, prop: string): boolean =>\n Object.prototype.hasOwnProperty.call(obj, prop)\nexport const isArray = (value: any): value is Array<any> => Array.isArray(value)\nexport const isObject = (value: any): value is Record<string, any> =>\n value !== null && typeof value === 'object' && !isArray(value)\nexport const isFunction = (value: any): value is Function => typeof value === 'function'\nexport const isBigInt = (value: any): value is bigint => typeof value === 'bigint'\nexport const isDate = (value: any): value is Date => value instanceof Date\nexport const isMap = (value: any): value is Map<any, any> => value instanceof Map\nexport const isSet = (value: any): value is Set<any> => value instanceof Set\nexport const isRegExp = (value: any): value is RegExp => value instanceof RegExp\nexport const isURL = (value: any): value is URL => !isUndefined(URL) && value instanceof URL\nexport const isNonFiniteNumber = (value: any): value is number =>\n typeof value === 'number' && !Number.isFinite(value)\nexport const isInteger = (value: any): value is number => Number.isInteger(value)\nconst hasBuffer = (): boolean => typeof Buffer !== 'undefined'\n\nexport const isBuffer = (value: any): value is Buffer =>\n hasBuffer() && isFunction(Buffer.isBuffer) && Buffer.isBuffer(value)\nexport const isArrayBuffer = (value: any): value is ArrayBuffer =>\n !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer\n\nexport const isTypedArray = (value: any): value is ArrayBufferView => {\n if (isUndefined(value)) return false\n if (!isUndefined(ArrayBuffer) && isFunction(ArrayBuffer.isView) && ArrayBuffer.isView(value)) {\n return Object.prototype.toString.call(value) !== '[object DataView]'\n }\n const tag = Object.prototype.toString.call(value)\n return tag.endsWith('Array]') && tag !== '[object Array]'\n}\n\nexport const getTypedArrayName = (value: any): string | null => {\n if (isUndefined(value)) return null\n const ctor = (value as any).constructor\n if (ctor && isString(ctor.name)) return ctor.name\n const tag = Object.prototype.toString.call(value)\n const match = /^\\[object (.+)\\]$/.exec(tag)\n return match ? match[1] : null\n}\n\nconst TYPEDARRAY_CTORS: Record<string, any> = {\n Uint8Array: !isUndefined(Uint8Array) ? Uint8Array : undefined,\n Uint8ClampedArray: !isUndefined(Uint8ClampedArray) ? Uint8ClampedArray : undefined,\n Uint16Array: !isUndefined(Uint16Array) ? Uint16Array : undefined,\n Uint32Array: !isUndefined(Uint32Array) ? Uint32Array : undefined,\n Int8Array: !isUndefined(Int8Array) ? Int8Array : undefined,\n Int16Array: !isUndefined(Int16Array) ? Int16Array : undefined,\n Int32Array: !isUndefined(Int32Array) ? Int32Array : undefined,\n Float32Array: !isUndefined(Float32Array) ? Float32Array : undefined,\n Float64Array: !isUndefined(Float64Array) ? Float64Array : undefined,\n BigInt64Array: !isUndefined(BigInt64Array) ? BigInt64Array : undefined,\n BigUint64Array: !isUndefined(BigUint64Array) ? BigUint64Array : undefined,\n}\n\nexport const toHex = (value: Uint8Array): string => {\n let out = '0x'\n for (const byte of value) {\n out += byte.toString(16).padStart(2, '0')\n }\n return out\n}\n\nexport const fromHex = (hex: string): Uint8Array => {\n const normalized = hex.startsWith('0x') ? hex.slice(2) : hex\n if (normalized.length % 2 !== 0) {\n throw new Error('Invalid hex string for bytes')\n }\n\n if (hasBuffer()) {\n return Uint8Array.from(Buffer.from(normalized, 'hex'))\n }\n\n const out = new Uint8Array(normalized.length / 2)\n for (let i = 0; i < normalized.length; i += 2) {\n out[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16)\n }\n return out\n}\n\nexport const toSerializable = (value: any, options: { allowFunction?: boolean } = {}): any => {\n if (isBigInt(value)) {\n return { [BIGINT_TAG]: value.toString() }\n }\n\n if (isNonFiniteNumber(value)) {\n return { [NUMBER_TAG]: String(value) }\n }\n\n if (isDate(value)) {\n return { [DATE_TAG]: value.getTime() }\n }\n\n if (isMap(value)) {\n return { [MAP_TAG]: Array.from(value.entries()) }\n }\n\n if (isSet(value)) {\n return { [SET_TAG]: Array.from(value.values()) }\n }\n\n if (isRegExp(value)) {\n return { [REGEXP_TAG]: { source: value.source, flags: value.flags } }\n }\n\n if (isURL(value)) {\n return { [URL_TAG]: value.toString() }\n }\n\n if (isFunction(value)) {\n if (!options.allowFunction) {\n return value\n }\n return { [FUNCTION_TAG]: value.toString() }\n }\n\n if (isTypedArray(value)) {\n const type = getTypedArrayName(value)\n if (type && TYPEDARRAY_CTORS[type]) {\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n return { [TYPEDARRAY_TAG]: { type, bytes: toHex(bytes) } }\n }\n }\n\n if (isArrayBuffer(value)) {\n return { [TYPEDARRAY_TAG]: { type: 'Uint8Array', bytes: toHex(new Uint8Array(value)) } }\n }\n\n if (\n value &&\n isObject(value) &&\n value.type === 'Buffer' &&\n isArray(value.data) &&\n Object.keys(value).length === 2 &&\n value.data.every((entry: any) => isInteger(entry) && entry >= 0 && entry <= 255)\n ) {\n return { [TYPEDARRAY_TAG]: { type: 'Uint8Array', bytes: toHex(Uint8Array.from(value.data)) } }\n }\n\n return value\n}\n\nexport const fromSerializable = (value: any, options: { allowFunction?: boolean } = {}): any => {\n if (value && isObject(value)) {\n if (hasOwnProperty(value, BIGINT_TAG)) {\n return BigInt(value[BIGINT_TAG])\n }\n if (hasOwnProperty(value, NUMBER_TAG)) {\n const payload = value[NUMBER_TAG]\n if (payload === 'NaN') return NaN\n if (payload === 'Infinity') return Infinity\n if (payload === '-Infinity') return -Infinity\n throw new Error('Invalid number payload')\n }\n if (hasOwnProperty(value, DATE_TAG)) {\n return new Date(value[DATE_TAG])\n }\n if (hasOwnProperty(value, MAP_TAG)) {\n const payload = value[MAP_TAG]\n if (!isArray(payload)) {\n throw new Error('Invalid map payload')\n }\n return new Map(payload)\n }\n if (hasOwnProperty(value, SET_TAG)) {\n const payload = value[SET_TAG]\n if (!isArray(payload)) {\n throw new Error('Invalid set payload')\n }\n return new Set(payload)\n }\n if (hasOwnProperty(value, REGEXP_TAG)) {\n const payload = value[REGEXP_TAG]\n if (!payload || !isObject(payload) || !isString(payload.source) || !isString(payload.flags)) {\n throw new Error('Invalid regexp payload')\n }\n return new RegExp(payload.source, payload.flags)\n }\n if (hasOwnProperty(value, URL_TAG)) {\n const payload = value[URL_TAG]\n if (!isString(payload)) {\n throw new Error('Invalid URL payload')\n }\n return new URL(payload)\n }\n if (hasOwnProperty(value, FUNCTION_TAG)) {\n if (!options.allowFunction) {\n return value\n }\n const payload = value[FUNCTION_TAG]\n if (!isString(payload)) {\n throw new Error('Invalid function payload')\n }\n return new Function(`return (${payload})`)()\n }\n if (hasOwnProperty(value, TYPEDARRAY_TAG)) {\n const payload = value[TYPEDARRAY_TAG]\n if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {\n throw new Error('Invalid typed array payload')\n }\n const bytes = fromHex(payload.bytes)\n const ctor = TYPEDARRAY_CTORS[payload.type]\n if (!ctor) return bytes\n const buffer = new ArrayBuffer(bytes.byteLength)\n new Uint8Array(buffer).set(bytes)\n return new ctor(buffer)\n }\n if (\n value.type === 'Buffer' &&\n isArray(value.data) &&\n Object.keys(value).length === 2 &&\n value.data.every((entry: any) => isInteger(entry) && entry >= 0 && entry <= 255)\n ) {\n return Uint8Array.from(value.data)\n }\n }\n return value\n}\n\nexport const isTypedArrayPayload = (value: any): boolean =>\n isObject(value) &&\n isString(value.type) &&\n isString(value.bytes) &&\n Object.keys(value).length === 2\n\nexport const isRegExpPayload = (value: any): boolean =>\n isObject(value) &&\n isString(value.source) &&\n isString(value.flags) &&\n Object.keys(value).length === 2\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,WAAW;AACjB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,aAAa;AACnB,IAAM,UAAU;AAChB,IAAM,eAAe;AACrB,IAAM,aAAa;AAEnB,IAAM,YAAY;AAClB,IAAM,cAAc,CAAC,UAAmC,OAAO,UAAU;AACzE,IAAM,WAAW,CAAC,UAAgC,OAAO,UAAU;AACnE,IAAM,iBAAiB,CAAC,KAAU,SACvC,OAAO,UAAU,eAAe,KAAK,KAAK,IAAI;AACzC,IAAM,UAAU,CAAC,UAAoC,MAAM,QAAQ,KAAK;AACxE,IAAM,WAAW,CAAC,UACvB,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,QAAQ,KAAK;AACxD,IAAM,aAAa,CAAC,UAAkC,OAAO,UAAU;AACvE,IAAM,WAAW,CAAC,UAAgC,OAAO,UAAU;AACnE,IAAM,SAAS,CAAC,UAA8B,iBAAiB;AAC/D,IAAM,QAAQ,CAAC,UAAuC,iBAAiB;AACvE,IAAM,QAAQ,CAAC,UAAkC,iBAAiB;AAClE,IAAM,WAAW,CAAC,UAAgC,iBAAiB;AACnE,IAAM,QAAQ,CAAC,UAA6B,CAAC,YAAY,GAAG,KAAK,iBAAiB;AAClF,IAAM,oBAAoB,CAAC,UAChC,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK;AAC9C,IAAM,YAAY,CAAC,UAAgC,OAAO,UAAU,KAAK;AAChF,IAAM,YAAY,MAAe,OAAO,WAAW;AAI5C,IAAM,gBAAgB,CAAC,UAC5B,CAAC,YAAY,WAAW,KAAK,iBAAiB;AAEzC,IAAM,eAAe,CAAC,UAAyC;AACpE,MAAI,YAAY,KAAK,EAAG,QAAO;AAC/B,MAAI,CAAC,YAAY,WAAW,KAAK,WAAW,YAAY,MAAM,KAAK,YAAY,OAAO,KAAK,GAAG;AAC5F,WAAO,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM;AAAA,EACnD;AACA,QAAM,MAAM,OAAO,UAAU,SAAS,KAAK,KAAK;AAChD,SAAO,IAAI,SAAS,QAAQ,KAAK,QAAQ;AAC3C;AAEO,IAAM,oBAAoB,CAAC,UAA8B;AAC9D,MAAI,YAAY,KAAK,EAAG,QAAO;AAC/B,QAAM,OAAQ,MAAc;AAC5B,MAAI,QAAQ,SAAS,KAAK,IAAI,EAAG,QAAO,KAAK;AAC7C,QAAM,MAAM,OAAO,UAAU,SAAS,KAAK,KAAK;AAChD,QAAM,QAAQ,oBAAoB,KAAK,GAAG;AAC1C,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC5B;AAEA,IAAM,mBAAwC;AAAA,EAC5C,YAAY,CAAC,YAAY,UAAU,IAAI,aAAa;AAAA,EACpD,mBAAmB,CAAC,YAAY,iBAAiB,IAAI,oBAAoB;AAAA,EACzE,aAAa,CAAC,YAAY,WAAW,IAAI,cAAc;AAAA,EACvD,aAAa,CAAC,YAAY,WAAW,IAAI,cAAc;AAAA,EACvD,WAAW,CAAC,YAAY,SAAS,IAAI,YAAY;AAAA,EACjD,YAAY,CAAC,YAAY,UAAU,IAAI,aAAa;AAAA,EACpD,YAAY,CAAC,YAAY,UAAU,IAAI,aAAa;AAAA,EACpD,cAAc,CAAC,YAAY,YAAY,IAAI,eAAe;AAAA,EAC1D,cAAc,CAAC,YAAY,YAAY,IAAI,eAAe;AAAA,EAC1D,eAAe,CAAC,YAAY,aAAa,IAAI,gBAAgB;AAAA,EAC7D,gBAAgB,CAAC,YAAY,cAAc,IAAI,iBAAiB;AAClE;AAEO,IAAM,QAAQ,CAAC,UAA8B;AAClD,MAAI,MAAM;AACV,aAAW,QAAQ,OAAO;AACxB,WAAO,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,QAA4B;AAClD,QAAM,aAAa,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI;AACzD,MAAI,WAAW,SAAS,MAAM,GAAG;AAC/B,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,MAAI,UAAU,GAAG;AACf,WAAO,WAAW,KAAK,OAAO,KAAK,YAAY,KAAK,CAAC;AAAA,EACvD;AAEA,QAAM,MAAM,IAAI,WAAW,WAAW,SAAS,CAAC;AAChD,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;AAC7C,QAAI,IAAI,CAAC,IAAI,OAAO,SAAS,WAAW,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AAAA,EAC7D;AACA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAAC,OAAY,UAAuC,CAAC,MAAW;AAC5F,MAAI,SAAS,KAAK,GAAG;AACnB,WAAO,EAAE,CAAC,UAAU,GAAG,MAAM,SAAS,EAAE;AAAA,EAC1C;AAEA,MAAI,kBAAkB,KAAK,GAAG;AAC5B,WAAO,EAAE,CAAC,UAAU,GAAG,OAAO,KAAK,EAAE;AAAA,EACvC;AAEA,MAAI,OAAO,KAAK,GAAG;AACjB,WAAO,EAAE,CAAC,QAAQ,GAAG,MAAM,QAAQ,EAAE;AAAA,EACvC;AAEA,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO,EAAE,CAAC,OAAO,GAAG,MAAM,KAAK,MAAM,QAAQ,CAAC,EAAE;AAAA,EAClD;AAEA,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO,EAAE,CAAC,OAAO,GAAG,MAAM,KAAK,MAAM,OAAO,CAAC,EAAE;AAAA,EACjD;AAEA,MAAI,SAAS,KAAK,GAAG;AACnB,WAAO,EAAE,CAAC,UAAU,GAAG,EAAE,QAAQ,MAAM,QAAQ,OAAO,MAAM,MAAM,EAAE;AAAA,EACtE;AAEA,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO,EAAE,CAAC,OAAO,GAAG,MAAM,SAAS,EAAE;AAAA,EACvC;AAEA,MAAI,WAAW,KAAK,GAAG;AACrB,QAAI,CAAC,QAAQ,eAAe;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,EAAE,CAAC,YAAY,GAAG,MAAM,SAAS,EAAE;AAAA,EAC5C;AAEA,MAAI,aAAa,KAAK,GAAG;AACvB,UAAM,OAAO,kBAAkB,KAAK;AACpC,QAAI,QAAQ,iBAAiB,IAAI,GAAG;AAClC,YAAM,QAAQ,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC7E,aAAO,EAAE,CAAC,cAAc,GAAG,EAAE,MAAM,OAAO,MAAM,KAAK,EAAE,EAAE;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,cAAc,KAAK,GAAG;AACxB,WAAO,EAAE,CAAC,cAAc,GAAG,EAAE,MAAM,cAAc,OAAO,MAAM,IAAI,WAAW,KAAK,CAAC,EAAE,EAAE;AAAA,EACzF;AAEA,MACE,SACA,SAAS,KAAK,KACd,MAAM,SAAS,YACf,QAAQ,MAAM,IAAI,KAClB,OAAO,KAAK,KAAK,EAAE,WAAW,KAC9B,MAAM,KAAK,MAAM,CAAC,UAAe,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG,GAC/E;AACA,WAAO,EAAE,CAAC,cAAc,GAAG,EAAE,MAAM,cAAc,OAAO,MAAM,WAAW,KAAK,MAAM,IAAI,CAAC,EAAE,EAAE;AAAA,EAC/F;AAEA,SAAO;AACT;AAEO,IAAM,mBAAmB,CAAC,OAAY,UAAuC,CAAC,MAAW;AAC9F,MAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,QAAI,eAAe,OAAO,UAAU,GAAG;AACrC,aAAO,OAAO,MAAM,UAAU,CAAC;AAAA,IACjC;AACA,QAAI,eAAe,OAAO,UAAU,GAAG;AACrC,YAAM,UAAU,MAAM,UAAU;AAChC,UAAI,YAAY,MAAO,QAAO;AAC9B,UAAI,YAAY,WAAY,QAAO;AACnC,UAAI,YAAY,YAAa,QAAO;AACpC,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,QAAI,eAAe,OAAO,QAAQ,GAAG;AACnC,aAAO,IAAI,KAAK,MAAM,QAAQ,CAAC;AAAA,IACjC;AACA,QAAI,eAAe,OAAO,OAAO,GAAG;AAClC,YAAM,UAAU,MAAM,OAAO;AAC7B,UAAI,CAAC,QAAQ,OAAO,GAAG;AACrB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AACA,aAAO,IAAI,IAAI,OAAO;AAAA,IACxB;AACA,QAAI,eAAe,OAAO,OAAO,GAAG;AAClC,YAAM,UAAU,MAAM,OAAO;AAC7B,UAAI,CAAC,QAAQ,OAAO,GAAG;AACrB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AACA,aAAO,IAAI,IAAI,OAAO;AAAA,IACxB;AACA,QAAI,eAAe,OAAO,UAAU,GAAG;AACrC,YAAM,UAAU,MAAM,UAAU;AAChC,UAAI,CAAC,WAAW,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,QAAQ,MAAM,KAAK,CAAC,SAAS,QAAQ,KAAK,GAAG;AAC3F,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AACA,aAAO,IAAI,OAAO,QAAQ,QAAQ,QAAQ,KAAK;AAAA,IACjD;AACA,QAAI,eAAe,OAAO,OAAO,GAAG;AAClC,YAAM,UAAU,MAAM,OAAO;AAC7B,UAAI,CAAC,SAAS,OAAO,GAAG;AACtB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AACA,aAAO,IAAI,IAAI,OAAO;AAAA,IACxB;AACA,QAAI,eAAe,OAAO,YAAY,GAAG;AACvC,UAAI,CAAC,QAAQ,eAAe;AAC1B,eAAO;AAAA,MACT;AACA,YAAM,UAAU,MAAM,YAAY;AAClC,UAAI,CAAC,SAAS,OAAO,GAAG;AACtB,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AACA,aAAO,IAAI,SAAS,WAAW,OAAO,GAAG,EAAE;AAAA,IAC7C;AACA,QAAI,eAAe,OAAO,cAAc,GAAG;AACzC,YAAM,UAAU,MAAM,cAAc;AACpC,UAAI,CAAC,WAAW,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,QAAQ,IAAI,KAAK,CAAC,SAAS,QAAQ,KAAK,GAAG;AACzF,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AACA,YAAM,QAAQ,QAAQ,QAAQ,KAAK;AACnC,YAAM,OAAO,iBAAiB,QAAQ,IAAI;AAC1C,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAC/C,UAAI,WAAW,MAAM,EAAE,IAAI,KAAK;AAChC,aAAO,IAAI,KAAK,MAAM;AAAA,IACxB;AACA,QACE,MAAM,SAAS,YACf,QAAQ,MAAM,IAAI,KAClB,OAAO,KAAK,KAAK,EAAE,WAAW,KAC9B,MAAM,KAAK,MAAM,CAAC,UAAe,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG,GAC/E;AACA,aAAO,WAAW,KAAK,MAAM,IAAI;AAAA,IACnC;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,sBAAsB,CAAC,UAClC,SAAS,KAAK,KACd,SAAS,MAAM,IAAI,KACnB,SAAS,MAAM,KAAK,KACpB,OAAO,KAAK,KAAK,EAAE,WAAW;AAEzB,IAAM,kBAAkB,CAAC,UAC9B,SAAS,KAAK,KACd,SAAS,MAAM,MAAM,KACrB,SAAS,MAAM,KAAK,KACpB,OAAO,KAAK,KAAK,EAAE,WAAW;;;AD5NhC,IAAM,WAAW;AAIjB,IAAM,gBAAgB,CAAC,QAAa,KAAa,OAAY,aAA4B;AACvF,MAAI,WAAW,QAAQ,GAAG;AACxB,WAAO,SAAS,KAAK,KAAK;AAAA,EAC5B;AACA,MAAI,QAAQ,QAAQ,GAAG;AACrB,QAAI,QAAQ,GAAI,QAAO;AACvB,QAAI,QAAQ,WAAY,QAAO;AAC/B,QAAI,QAAQ,SAAU,QAAO;AAC7B,QAAI,QAAQ,WAAY,QAAO;AAC/B,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,QAAQ,WAAY,QAAO;AAC/B,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,QAAQ,aAAc,QAAO;AACjC,QAAI,QAAQ,eAAgB,QAAO;AACnC,QAAI,oBAAoB,MAAM,EAAG,QAAO;AACxC,QAAI,gBAAgB,MAAM,EAAG,QAAO;AACpC,QAAI,QAAQ,MAAM,EAAG,QAAO;AAC5B,WAAO,SAAS,SAAS,GAAG,IAAI,QAAQ;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,IAAM,YAAY,CAAC,OAAY,WAAqB,MAAM,UAC/D,SAAS;AAAA,EACP;AAAA,EACA,SAAS,WAAW,KAAK,GAAG;AAC1B,UAAM,cAAc,QAAQ,OAAO,OAAO,IAAI,IAAK,KAAa,GAAG,IAAI;AACvE,UAAM,YAAY,OAAO,WAAW,KAAK,MAAM,WAAW,IAAI,cAAc;AAC5E,UAAM,WAAW,cAAc,MAAM,KAAK,WAAW,QAAQ;AAC7D,WAAO,eAAe,QAAQ;AAAA,EAChC;AAAA,EACA;AACF;AAEK,IAAM,mBAAmB,CAC9B,OACA,WAAqB,MACrB,UAEA,SAAS;AAAA,EACP;AAAA,EACA,SAAS,WAAW,KAAK,GAAG;AAC1B,UAAM,cAAc,QAAQ,OAAO,OAAO,IAAI,IAAK,KAAa,GAAG,IAAI;AACvE,UAAM,YAAY,OAAO,WAAW,KAAK,MAAM,WAAW,IAAI,cAAc;AAC5E,UAAM,WAAW,cAAc,MAAM,KAAK,WAAW,QAAQ;AAC7D,WAAO,eAAe,UAAU,EAAE,eAAe,KAAK,CAAC;AAAA,EACzD;AAAA,EACA;AACF;AAEK,IAAM,QAAQ,CAAU,MAAc,UAAmB,SAC9D,SAAS,MAAM,MAAM,CAAC,KAAK,MAAM;AAC/B,QAAM,UAAU,iBAAiB,CAAC;AAClC,SAAO,WAAW,OAAO,IAAI,QAAQ,KAAK,OAAO,IAAI;AACvD,CAAC;AAEI,IAAM,eAAe,CAAU,MAAc,UAAmB,SACrE,SAAS,MAAM,MAAM,CAAC,KAAK,MAAM;AAC/B,QAAM,UAAU,iBAAiB,GAAG,EAAE,eAAe,KAAK,CAAC;AAC3D,SAAO,WAAW,OAAO,IAAI,QAAQ,KAAK,OAAO,IAAI;AACvD,CAAC;AAEH,IAAO,gBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,10 +1,14 @@
1
1
  type Replacer = ((this: any, key: string, value: any) => any) | Array<string | number> | null;
2
2
  type Reviver = ((this: any, key: string, value: any) => any) | null;
3
3
  declare const stringify: (value: any, replacer?: Replacer, space?: string | number) => string;
4
- declare const parse: (text: string, reviver?: Reviver) => any;
4
+ declare const stringify_UNSAFE: (value: any, replacer?: Replacer, space?: string | number) => string;
5
+ declare const parse: <T = any>(text: string, reviver?: Reviver) => T;
6
+ declare const parse_UNSAFE: <T = any>(text: string, reviver?: Reviver) => T;
5
7
  declare const _default: {
6
8
  stringify: (value: any, replacer?: Replacer, space?: string | number) => string;
7
- parse: (text: string, reviver?: Reviver) => any;
9
+ stringify_UNSAFE: (value: any, replacer?: Replacer, space?: string | number) => string;
10
+ parse: <T = any>(text: string, reviver?: Reviver) => T;
11
+ parse_UNSAFE: <T = any>(text: string, reviver?: Reviver) => T;
8
12
  };
9
13
 
10
- export { _default as default, parse, stringify };
14
+ export { _default as default, parse, parse_UNSAFE, stringify, stringify_UNSAFE };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,14 @@
1
1
  type Replacer = ((this: any, key: string, value: any) => any) | Array<string | number> | null;
2
2
  type Reviver = ((this: any, key: string, value: any) => any) | null;
3
3
  declare const stringify: (value: any, replacer?: Replacer, space?: string | number) => string;
4
- declare const parse: (text: string, reviver?: Reviver) => any;
4
+ declare const stringify_UNSAFE: (value: any, replacer?: Replacer, space?: string | number) => string;
5
+ declare const parse: <T = any>(text: string, reviver?: Reviver) => T;
6
+ declare const parse_UNSAFE: <T = any>(text: string, reviver?: Reviver) => T;
5
7
  declare const _default: {
6
8
  stringify: (value: any, replacer?: Replacer, space?: string | number) => string;
7
- parse: (text: string, reviver?: Reviver) => any;
9
+ stringify_UNSAFE: (value: any, replacer?: Replacer, space?: string | number) => string;
10
+ parse: <T = any>(text: string, reviver?: Reviver) => T;
11
+ parse_UNSAFE: <T = any>(text: string, reviver?: Reviver) => T;
8
12
  };
9
13
 
10
- export { _default as default, parse, stringify };
14
+ export { _default as default, parse, parse_UNSAFE, stringify, stringify_UNSAFE };
package/dist/index.js CHANGED
@@ -1,6 +1,13 @@
1
1
  // src/utils.ts
2
2
  var BIGINT_TAG = "__@json.bigint__";
3
3
  var TYPEDARRAY_TAG = "__@json.typedarray__";
4
+ var DATE_TAG = "__@json.date__";
5
+ var MAP_TAG = "__@json.map__";
6
+ var SET_TAG = "__@json.set__";
7
+ var REGEXP_TAG = "__@json.regexp__";
8
+ var URL_TAG = "__@json.url__";
9
+ var FUNCTION_TAG = "__@json.function__";
10
+ var NUMBER_TAG = "__@json.number__";
4
11
  var undefined = void 0;
5
12
  var isUndefined = (value) => typeof value === "undefined";
6
13
  var isString = (value) => typeof value === "string";
@@ -9,6 +16,13 @@ var isArray = (value) => Array.isArray(value);
9
16
  var isObject = (value) => value !== null && typeof value === "object" && !isArray(value);
10
17
  var isFunction = (value) => typeof value === "function";
11
18
  var isBigInt = (value) => typeof value === "bigint";
19
+ var isDate = (value) => value instanceof Date;
20
+ var isMap = (value) => value instanceof Map;
21
+ var isSet = (value) => value instanceof Set;
22
+ var isRegExp = (value) => value instanceof RegExp;
23
+ var isURL = (value) => !isUndefined(URL) && value instanceof URL;
24
+ var isNonFiniteNumber = (value) => typeof value === "number" && !Number.isFinite(value);
25
+ var isInteger = (value) => Number.isInteger(value);
12
26
  var hasBuffer = () => typeof Buffer !== "undefined";
13
27
  var isArrayBuffer = (value) => !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer;
14
28
  var isTypedArray = (value) => {
@@ -61,10 +75,34 @@ var fromHex = (hex) => {
61
75
  }
62
76
  return out;
63
77
  };
64
- var toSerializable = (value) => {
78
+ var toSerializable = (value, options = {}) => {
65
79
  if (isBigInt(value)) {
66
80
  return { [BIGINT_TAG]: value.toString() };
67
81
  }
82
+ if (isNonFiniteNumber(value)) {
83
+ return { [NUMBER_TAG]: String(value) };
84
+ }
85
+ if (isDate(value)) {
86
+ return { [DATE_TAG]: value.getTime() };
87
+ }
88
+ if (isMap(value)) {
89
+ return { [MAP_TAG]: Array.from(value.entries()) };
90
+ }
91
+ if (isSet(value)) {
92
+ return { [SET_TAG]: Array.from(value.values()) };
93
+ }
94
+ if (isRegExp(value)) {
95
+ return { [REGEXP_TAG]: { source: value.source, flags: value.flags } };
96
+ }
97
+ if (isURL(value)) {
98
+ return { [URL_TAG]: value.toString() };
99
+ }
100
+ if (isFunction(value)) {
101
+ if (!options.allowFunction) {
102
+ return value;
103
+ }
104
+ return { [FUNCTION_TAG]: value.toString() };
105
+ }
68
106
  if (isTypedArray(value)) {
69
107
  const type = getTypedArrayName(value);
70
108
  if (type && TYPEDARRAY_CTORS[type]) {
@@ -75,16 +113,64 @@ var toSerializable = (value) => {
75
113
  if (isArrayBuffer(value)) {
76
114
  return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(new Uint8Array(value)) } };
77
115
  }
78
- if (value && isObject(value) && value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {
116
+ if (value && isObject(value) && value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => isInteger(entry) && entry >= 0 && entry <= 255)) {
79
117
  return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(Uint8Array.from(value.data)) } };
80
118
  }
81
119
  return value;
82
120
  };
83
- var fromSerializable = (value) => {
121
+ var fromSerializable = (value, options = {}) => {
84
122
  if (value && isObject(value)) {
85
123
  if (hasOwnProperty(value, BIGINT_TAG)) {
86
124
  return BigInt(value[BIGINT_TAG]);
87
125
  }
126
+ if (hasOwnProperty(value, NUMBER_TAG)) {
127
+ const payload = value[NUMBER_TAG];
128
+ if (payload === "NaN") return NaN;
129
+ if (payload === "Infinity") return Infinity;
130
+ if (payload === "-Infinity") return -Infinity;
131
+ throw new Error("Invalid number payload");
132
+ }
133
+ if (hasOwnProperty(value, DATE_TAG)) {
134
+ return new Date(value[DATE_TAG]);
135
+ }
136
+ if (hasOwnProperty(value, MAP_TAG)) {
137
+ const payload = value[MAP_TAG];
138
+ if (!isArray(payload)) {
139
+ throw new Error("Invalid map payload");
140
+ }
141
+ return new Map(payload);
142
+ }
143
+ if (hasOwnProperty(value, SET_TAG)) {
144
+ const payload = value[SET_TAG];
145
+ if (!isArray(payload)) {
146
+ throw new Error("Invalid set payload");
147
+ }
148
+ return new Set(payload);
149
+ }
150
+ if (hasOwnProperty(value, REGEXP_TAG)) {
151
+ const payload = value[REGEXP_TAG];
152
+ if (!payload || !isObject(payload) || !isString(payload.source) || !isString(payload.flags)) {
153
+ throw new Error("Invalid regexp payload");
154
+ }
155
+ return new RegExp(payload.source, payload.flags);
156
+ }
157
+ if (hasOwnProperty(value, URL_TAG)) {
158
+ const payload = value[URL_TAG];
159
+ if (!isString(payload)) {
160
+ throw new Error("Invalid URL payload");
161
+ }
162
+ return new URL(payload);
163
+ }
164
+ if (hasOwnProperty(value, FUNCTION_TAG)) {
165
+ if (!options.allowFunction) {
166
+ return value;
167
+ }
168
+ const payload = value[FUNCTION_TAG];
169
+ if (!isString(payload)) {
170
+ throw new Error("Invalid function payload");
171
+ }
172
+ return new Function(`return (${payload})`)();
173
+ }
88
174
  if (hasOwnProperty(value, TYPEDARRAY_TAG)) {
89
175
  const payload = value[TYPEDARRAY_TAG];
90
176
  if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {
@@ -97,13 +183,14 @@ var fromSerializable = (value) => {
97
183
  new Uint8Array(buffer).set(bytes);
98
184
  return new ctor(buffer);
99
185
  }
100
- if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {
186
+ if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => isInteger(entry) && entry >= 0 && entry <= 255)) {
101
187
  return Uint8Array.from(value.data);
102
188
  }
103
189
  }
104
190
  return value;
105
191
  };
106
192
  var isTypedArrayPayload = (value) => isObject(value) && isString(value.type) && isString(value.bytes) && Object.keys(value).length === 2;
193
+ var isRegExpPayload = (value) => isObject(value) && isString(value.source) && isString(value.flags) && Object.keys(value).length === 2;
107
194
 
108
195
  // src/index.ts
109
196
  var RAW_JSON = JSON;
@@ -114,8 +201,16 @@ var applyReplacer = (holder, key, value, replacer) => {
114
201
  if (isArray(replacer)) {
115
202
  if (key === "") return value;
116
203
  if (key === BIGINT_TAG) return value;
204
+ if (key === DATE_TAG) return value;
205
+ if (key === NUMBER_TAG) return value;
206
+ if (key === MAP_TAG) return value;
207
+ if (key === SET_TAG) return value;
208
+ if (key === REGEXP_TAG) return value;
209
+ if (key === URL_TAG) return value;
210
+ if (key === FUNCTION_TAG) return value;
117
211
  if (key === TYPEDARRAY_TAG) return value;
118
212
  if (isTypedArrayPayload(holder)) return value;
213
+ if (isRegExpPayload(holder)) return value;
119
214
  if (isArray(holder)) return value;
120
215
  return replacer.includes(key) ? value : undefined;
121
216
  }
@@ -124,22 +219,42 @@ var applyReplacer = (holder, key, value, replacer) => {
124
219
  var stringify = (value, replacer = null, space) => RAW_JSON.stringify(
125
220
  value,
126
221
  function replacerFn(key, v) {
127
- const replaced = applyReplacer(this, key, v, replacer);
222
+ const holderValue = this && key in Object(this) ? this[key] : v;
223
+ const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v;
224
+ const replaced = applyReplacer(this, key, candidate, replacer);
128
225
  return toSerializable(replaced);
129
226
  },
130
227
  space
131
228
  );
229
+ var stringify_UNSAFE = (value, replacer = null, space) => RAW_JSON.stringify(
230
+ value,
231
+ function replacerFn(key, v) {
232
+ const holderValue = this && key in Object(this) ? this[key] : v;
233
+ const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v;
234
+ const replaced = applyReplacer(this, key, candidate, replacer);
235
+ return toSerializable(replaced, { allowFunction: true });
236
+ },
237
+ space
238
+ );
132
239
  var parse = (text, reviver = null) => RAW_JSON.parse(text, (key, v) => {
133
240
  const decoded = fromSerializable(v);
134
241
  return isFunction(reviver) ? reviver(key, decoded) : decoded;
135
242
  });
243
+ var parse_UNSAFE = (text, reviver = null) => RAW_JSON.parse(text, (key, v) => {
244
+ const decoded = fromSerializable(v, { allowFunction: true });
245
+ return isFunction(reviver) ? reviver(key, decoded) : decoded;
246
+ });
136
247
  var index_default = {
137
248
  stringify,
138
- parse
249
+ stringify_UNSAFE,
250
+ parse,
251
+ parse_UNSAFE
139
252
  };
140
253
  export {
141
254
  index_default as default,
142
255
  parse,
143
- stringify
256
+ parse_UNSAFE,
257
+ stringify,
258
+ stringify_UNSAFE
144
259
  };
145
260
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["export const BIGINT_TAG = '__@json.bigint__'\nexport const TYPEDARRAY_TAG = '__@json.typedarray__'\n\nexport const undefined = void 0\nexport const isUndefined = (value: any): value is undefined => typeof value === 'undefined'\nexport const isString = (value: any): value is string => typeof value === 'string'\nexport const hasOwnProperty = (obj: any, prop: string): boolean =>\n Object.prototype.hasOwnProperty.call(obj, prop)\nexport const isArray = (value: any): value is Array<any> => Array.isArray(value)\nexport const isObject = (value: any): value is Record<string, any> =>\n value !== null && typeof value === 'object' && !isArray(value)\nexport const isFunction = (value: any): value is Function => typeof value === 'function'\nexport const isBigInt = (value: any): value is bigint => typeof value === 'bigint'\nconst hasBuffer = (): boolean => typeof Buffer !== 'undefined'\n\nexport const isBuffer = (value: any): value is Buffer =>\n hasBuffer() && isFunction(Buffer.isBuffer) && Buffer.isBuffer(value)\nexport const isArrayBuffer = (value: any): value is ArrayBuffer =>\n !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer\n\nexport const isTypedArray = (value: any): value is ArrayBufferView => {\n if (isUndefined(value)) return false\n if (!isUndefined(ArrayBuffer) && isFunction(ArrayBuffer.isView) && ArrayBuffer.isView(value)) {\n return Object.prototype.toString.call(value) !== '[object DataView]'\n }\n const tag = Object.prototype.toString.call(value)\n return tag.endsWith('Array]') && tag !== '[object Array]'\n}\n\nexport const getTypedArrayName = (value: any): string | null => {\n if (isUndefined(value)) return null\n const ctor = (value as any).constructor\n if (ctor && isString(ctor.name)) return ctor.name\n const tag = Object.prototype.toString.call(value)\n const match = /^\\[object (.+)\\]$/.exec(tag)\n return match ? match[1] : null\n}\n\nconst TYPEDARRAY_CTORS: Record<string, any> = {\n Uint8Array: !isUndefined(Uint8Array) ? Uint8Array : undefined,\n Uint8ClampedArray: !isUndefined(Uint8ClampedArray) ? Uint8ClampedArray : undefined,\n Uint16Array: !isUndefined(Uint16Array) ? Uint16Array : undefined,\n Uint32Array: !isUndefined(Uint32Array) ? Uint32Array : undefined,\n Int8Array: !isUndefined(Int8Array) ? Int8Array : undefined,\n Int16Array: !isUndefined(Int16Array) ? Int16Array : undefined,\n Int32Array: !isUndefined(Int32Array) ? Int32Array : undefined,\n Float32Array: !isUndefined(Float32Array) ? Float32Array : undefined,\n Float64Array: !isUndefined(Float64Array) ? Float64Array : undefined,\n BigInt64Array: !isUndefined(BigInt64Array) ? BigInt64Array : undefined,\n BigUint64Array: !isUndefined(BigUint64Array) ? BigUint64Array : undefined,\n}\n\nexport const toHex = (value: Uint8Array): string => {\n let out = '0x'\n for (const byte of value) {\n out += byte.toString(16).padStart(2, '0')\n }\n return out\n}\n\nexport const fromHex = (hex: string): Uint8Array => {\n const normalized = hex.startsWith('0x') ? hex.slice(2) : hex\n if (normalized.length % 2 !== 0) {\n throw new Error('Invalid hex string for bytes')\n }\n\n if (hasBuffer()) {\n return Uint8Array.from(Buffer.from(normalized, 'hex'))\n }\n\n const out = new Uint8Array(normalized.length / 2)\n for (let i = 0; i < normalized.length; i += 2) {\n out[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16)\n }\n return out\n}\n\nexport const toSerializable = (value: any): any => {\n if (isBigInt(value)) {\n return { [BIGINT_TAG]: value.toString() }\n }\n\n if (isTypedArray(value)) {\n const type = getTypedArrayName(value)\n if (type && TYPEDARRAY_CTORS[type]) {\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n return { [TYPEDARRAY_TAG]: { type, bytes: toHex(bytes) } }\n }\n }\n\n if (isArrayBuffer(value)) {\n return { [TYPEDARRAY_TAG]: { type: 'Uint8Array', bytes: toHex(new Uint8Array(value)) } }\n }\n\n if (\n value &&\n isObject(value) &&\n value.type === 'Buffer' &&\n isArray(value.data) &&\n Object.keys(value).length === 2 &&\n value.data.every((entry: any) => Number.isInteger(entry) && entry >= 0 && entry <= 255)\n ) {\n return { [TYPEDARRAY_TAG]: { type: 'Uint8Array', bytes: toHex(Uint8Array.from(value.data)) } }\n }\n\n return value\n}\n\nexport const fromSerializable = (value: any): any => {\n if (value && isObject(value)) {\n if (hasOwnProperty(value, BIGINT_TAG)) {\n return BigInt(value[BIGINT_TAG])\n }\n if (hasOwnProperty(value, TYPEDARRAY_TAG)) {\n const payload = value[TYPEDARRAY_TAG]\n if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {\n throw new Error('Invalid typed array payload')\n }\n const bytes = fromHex(payload.bytes)\n const ctor = TYPEDARRAY_CTORS[payload.type]\n if (!ctor) return bytes\n const buffer = new ArrayBuffer(bytes.byteLength)\n new Uint8Array(buffer).set(bytes)\n return new ctor(buffer)\n }\n if (\n value.type === 'Buffer' &&\n isArray(value.data) &&\n Object.keys(value).length === 2 &&\n value.data.every((entry: any) => Number.isInteger(entry) && entry >= 0 && entry <= 255)\n ) {\n return Uint8Array.from(value.data)\n }\n }\n return value\n}\n\nexport const isTypedArrayPayload = (value: any): boolean =>\n isObject(value) &&\n isString(value.type) &&\n isString(value.bytes) &&\n Object.keys(value).length === 2\n","import {\n BIGINT_TAG,\n fromSerializable,\n isArray,\n isFunction,\n isTypedArrayPayload,\n toSerializable,\n TYPEDARRAY_TAG,\n undefined,\n} from './utils'\n\nconst RAW_JSON = JSON\ntype Replacer = ((this: any, key: string, value: any) => any) | Array<string | number> | null\ntype Reviver = ((this: any, key: string, value: any) => any) | null\n\nconst applyReplacer = (holder: any, key: string, value: any, replacer: Replacer): any => {\n if (isFunction(replacer)) {\n return replacer(key, value)\n }\n if (isArray(replacer)) {\n if (key === '') return value\n if (key === BIGINT_TAG) return value\n if (key === TYPEDARRAY_TAG) return value\n if (isTypedArrayPayload(holder)) return value\n if (isArray(holder)) return value\n return replacer.includes(key) ? value : undefined\n }\n return value\n}\n\nexport const stringify = (value: any, replacer: Replacer = null, space?: string | number): string =>\n RAW_JSON.stringify(\n value,\n function replacerFn(key, v) {\n const replaced = applyReplacer(this, key, v, replacer)\n return toSerializable(replaced)\n },\n space,\n )\n\nexport const parse = (text: string, reviver: Reviver = null): any =>\n RAW_JSON.parse(text, (key, v) => {\n const decoded = fromSerializable(v)\n return isFunction(reviver) ? reviver(key, decoded) : decoded\n })\n\nexport default {\n stringify,\n parse,\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["export const BIGINT_TAG = '__@json.bigint__'\nexport const TYPEDARRAY_TAG = '__@json.typedarray__'\nexport const DATE_TAG = '__@json.date__'\nexport const MAP_TAG = '__@json.map__'\nexport const SET_TAG = '__@json.set__'\nexport const REGEXP_TAG = '__@json.regexp__'\nexport const URL_TAG = '__@json.url__'\nexport const FUNCTION_TAG = '__@json.function__'\nexport const NUMBER_TAG = '__@json.number__'\n\nexport const undefined = void 0\nexport const isUndefined = (value: any): value is undefined => typeof value === 'undefined'\nexport const isString = (value: any): value is string => typeof value === 'string'\nexport const hasOwnProperty = (obj: any, prop: string): boolean =>\n Object.prototype.hasOwnProperty.call(obj, prop)\nexport const isArray = (value: any): value is Array<any> => Array.isArray(value)\nexport const isObject = (value: any): value is Record<string, any> =>\n value !== null && typeof value === 'object' && !isArray(value)\nexport const isFunction = (value: any): value is Function => typeof value === 'function'\nexport const isBigInt = (value: any): value is bigint => typeof value === 'bigint'\nexport const isDate = (value: any): value is Date => value instanceof Date\nexport const isMap = (value: any): value is Map<any, any> => value instanceof Map\nexport const isSet = (value: any): value is Set<any> => value instanceof Set\nexport const isRegExp = (value: any): value is RegExp => value instanceof RegExp\nexport const isURL = (value: any): value is URL => !isUndefined(URL) && value instanceof URL\nexport const isNonFiniteNumber = (value: any): value is number =>\n typeof value === 'number' && !Number.isFinite(value)\nexport const isInteger = (value: any): value is number => Number.isInteger(value)\nconst hasBuffer = (): boolean => typeof Buffer !== 'undefined'\n\nexport const isBuffer = (value: any): value is Buffer =>\n hasBuffer() && isFunction(Buffer.isBuffer) && Buffer.isBuffer(value)\nexport const isArrayBuffer = (value: any): value is ArrayBuffer =>\n !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer\n\nexport const isTypedArray = (value: any): value is ArrayBufferView => {\n if (isUndefined(value)) return false\n if (!isUndefined(ArrayBuffer) && isFunction(ArrayBuffer.isView) && ArrayBuffer.isView(value)) {\n return Object.prototype.toString.call(value) !== '[object DataView]'\n }\n const tag = Object.prototype.toString.call(value)\n return tag.endsWith('Array]') && tag !== '[object Array]'\n}\n\nexport const getTypedArrayName = (value: any): string | null => {\n if (isUndefined(value)) return null\n const ctor = (value as any).constructor\n if (ctor && isString(ctor.name)) return ctor.name\n const tag = Object.prototype.toString.call(value)\n const match = /^\\[object (.+)\\]$/.exec(tag)\n return match ? match[1] : null\n}\n\nconst TYPEDARRAY_CTORS: Record<string, any> = {\n Uint8Array: !isUndefined(Uint8Array) ? Uint8Array : undefined,\n Uint8ClampedArray: !isUndefined(Uint8ClampedArray) ? Uint8ClampedArray : undefined,\n Uint16Array: !isUndefined(Uint16Array) ? Uint16Array : undefined,\n Uint32Array: !isUndefined(Uint32Array) ? Uint32Array : undefined,\n Int8Array: !isUndefined(Int8Array) ? Int8Array : undefined,\n Int16Array: !isUndefined(Int16Array) ? Int16Array : undefined,\n Int32Array: !isUndefined(Int32Array) ? Int32Array : undefined,\n Float32Array: !isUndefined(Float32Array) ? Float32Array : undefined,\n Float64Array: !isUndefined(Float64Array) ? Float64Array : undefined,\n BigInt64Array: !isUndefined(BigInt64Array) ? BigInt64Array : undefined,\n BigUint64Array: !isUndefined(BigUint64Array) ? BigUint64Array : undefined,\n}\n\nexport const toHex = (value: Uint8Array): string => {\n let out = '0x'\n for (const byte of value) {\n out += byte.toString(16).padStart(2, '0')\n }\n return out\n}\n\nexport const fromHex = (hex: string): Uint8Array => {\n const normalized = hex.startsWith('0x') ? hex.slice(2) : hex\n if (normalized.length % 2 !== 0) {\n throw new Error('Invalid hex string for bytes')\n }\n\n if (hasBuffer()) {\n return Uint8Array.from(Buffer.from(normalized, 'hex'))\n }\n\n const out = new Uint8Array(normalized.length / 2)\n for (let i = 0; i < normalized.length; i += 2) {\n out[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16)\n }\n return out\n}\n\nexport const toSerializable = (value: any, options: { allowFunction?: boolean } = {}): any => {\n if (isBigInt(value)) {\n return { [BIGINT_TAG]: value.toString() }\n }\n\n if (isNonFiniteNumber(value)) {\n return { [NUMBER_TAG]: String(value) }\n }\n\n if (isDate(value)) {\n return { [DATE_TAG]: value.getTime() }\n }\n\n if (isMap(value)) {\n return { [MAP_TAG]: Array.from(value.entries()) }\n }\n\n if (isSet(value)) {\n return { [SET_TAG]: Array.from(value.values()) }\n }\n\n if (isRegExp(value)) {\n return { [REGEXP_TAG]: { source: value.source, flags: value.flags } }\n }\n\n if (isURL(value)) {\n return { [URL_TAG]: value.toString() }\n }\n\n if (isFunction(value)) {\n if (!options.allowFunction) {\n return value\n }\n return { [FUNCTION_TAG]: value.toString() }\n }\n\n if (isTypedArray(value)) {\n const type = getTypedArrayName(value)\n if (type && TYPEDARRAY_CTORS[type]) {\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n return { [TYPEDARRAY_TAG]: { type, bytes: toHex(bytes) } }\n }\n }\n\n if (isArrayBuffer(value)) {\n return { [TYPEDARRAY_TAG]: { type: 'Uint8Array', bytes: toHex(new Uint8Array(value)) } }\n }\n\n if (\n value &&\n isObject(value) &&\n value.type === 'Buffer' &&\n isArray(value.data) &&\n Object.keys(value).length === 2 &&\n value.data.every((entry: any) => isInteger(entry) && entry >= 0 && entry <= 255)\n ) {\n return { [TYPEDARRAY_TAG]: { type: 'Uint8Array', bytes: toHex(Uint8Array.from(value.data)) } }\n }\n\n return value\n}\n\nexport const fromSerializable = (value: any, options: { allowFunction?: boolean } = {}): any => {\n if (value && isObject(value)) {\n if (hasOwnProperty(value, BIGINT_TAG)) {\n return BigInt(value[BIGINT_TAG])\n }\n if (hasOwnProperty(value, NUMBER_TAG)) {\n const payload = value[NUMBER_TAG]\n if (payload === 'NaN') return NaN\n if (payload === 'Infinity') return Infinity\n if (payload === '-Infinity') return -Infinity\n throw new Error('Invalid number payload')\n }\n if (hasOwnProperty(value, DATE_TAG)) {\n return new Date(value[DATE_TAG])\n }\n if (hasOwnProperty(value, MAP_TAG)) {\n const payload = value[MAP_TAG]\n if (!isArray(payload)) {\n throw new Error('Invalid map payload')\n }\n return new Map(payload)\n }\n if (hasOwnProperty(value, SET_TAG)) {\n const payload = value[SET_TAG]\n if (!isArray(payload)) {\n throw new Error('Invalid set payload')\n }\n return new Set(payload)\n }\n if (hasOwnProperty(value, REGEXP_TAG)) {\n const payload = value[REGEXP_TAG]\n if (!payload || !isObject(payload) || !isString(payload.source) || !isString(payload.flags)) {\n throw new Error('Invalid regexp payload')\n }\n return new RegExp(payload.source, payload.flags)\n }\n if (hasOwnProperty(value, URL_TAG)) {\n const payload = value[URL_TAG]\n if (!isString(payload)) {\n throw new Error('Invalid URL payload')\n }\n return new URL(payload)\n }\n if (hasOwnProperty(value, FUNCTION_TAG)) {\n if (!options.allowFunction) {\n return value\n }\n const payload = value[FUNCTION_TAG]\n if (!isString(payload)) {\n throw new Error('Invalid function payload')\n }\n return new Function(`return (${payload})`)()\n }\n if (hasOwnProperty(value, TYPEDARRAY_TAG)) {\n const payload = value[TYPEDARRAY_TAG]\n if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {\n throw new Error('Invalid typed array payload')\n }\n const bytes = fromHex(payload.bytes)\n const ctor = TYPEDARRAY_CTORS[payload.type]\n if (!ctor) return bytes\n const buffer = new ArrayBuffer(bytes.byteLength)\n new Uint8Array(buffer).set(bytes)\n return new ctor(buffer)\n }\n if (\n value.type === 'Buffer' &&\n isArray(value.data) &&\n Object.keys(value).length === 2 &&\n value.data.every((entry: any) => isInteger(entry) && entry >= 0 && entry <= 255)\n ) {\n return Uint8Array.from(value.data)\n }\n }\n return value\n}\n\nexport const isTypedArrayPayload = (value: any): boolean =>\n isObject(value) &&\n isString(value.type) &&\n isString(value.bytes) &&\n Object.keys(value).length === 2\n\nexport const isRegExpPayload = (value: any): boolean =>\n isObject(value) &&\n isString(value.source) &&\n isString(value.flags) &&\n Object.keys(value).length === 2\n","import {\n BIGINT_TAG,\n DATE_TAG,\n fromSerializable,\n FUNCTION_TAG,\n isArray,\n isDate,\n isFunction,\n isRegExpPayload,\n isTypedArrayPayload,\n isURL,\n MAP_TAG,\n NUMBER_TAG,\n REGEXP_TAG,\n SET_TAG,\n toSerializable,\n TYPEDARRAY_TAG,\n undefined,\n URL_TAG,\n} from './utils'\n\nconst RAW_JSON = JSON\ntype Replacer = ((this: any, key: string, value: any) => any) | Array<string | number> | null\ntype Reviver = ((this: any, key: string, value: any) => any) | null\n\nconst applyReplacer = (holder: any, key: string, value: any, replacer: Replacer): any => {\n if (isFunction(replacer)) {\n return replacer(key, value)\n }\n if (isArray(replacer)) {\n if (key === '') return value\n if (key === BIGINT_TAG) return value\n if (key === DATE_TAG) return value\n if (key === NUMBER_TAG) return value\n if (key === MAP_TAG) return value\n if (key === SET_TAG) return value\n if (key === REGEXP_TAG) return value\n if (key === URL_TAG) return value\n if (key === FUNCTION_TAG) return value\n if (key === TYPEDARRAY_TAG) return value\n if (isTypedArrayPayload(holder)) return value\n if (isRegExpPayload(holder)) return value\n if (isArray(holder)) return value\n return replacer.includes(key) ? value : undefined\n }\n return value\n}\n\nexport const stringify = (value: any, replacer: Replacer = null, space?: string | number): string =>\n RAW_JSON.stringify(\n value,\n function replacerFn(key, v) {\n const holderValue = this && key in Object(this) ? (this as any)[key] : v\n const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v\n const replaced = applyReplacer(this, key, candidate, replacer)\n return toSerializable(replaced)\n },\n space,\n )\n\nexport const stringify_UNSAFE = (\n value: any,\n replacer: Replacer = null,\n space?: string | number,\n): string =>\n RAW_JSON.stringify(\n value,\n function replacerFn(key, v) {\n const holderValue = this && key in Object(this) ? (this as any)[key] : v\n const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v\n const replaced = applyReplacer(this, key, candidate, replacer)\n return toSerializable(replaced, { allowFunction: true })\n },\n space,\n )\n\nexport const parse = <T = any>(text: string, reviver: Reviver = null): T =>\n RAW_JSON.parse(text, (key, v) => {\n const decoded = fromSerializable(v)\n return isFunction(reviver) ? reviver(key, decoded) : decoded\n })\n\nexport const parse_UNSAFE = <T = any>(text: string, reviver: Reviver = null): T =>\n RAW_JSON.parse(text, (key, v) => {\n const decoded = fromSerializable(v, { allowFunction: true })\n return isFunction(reviver) ? reviver(key, decoded) : decoded\n })\n\nexport default {\n stringify,\n stringify_UNSAFE,\n parse,\n parse_UNSAFE,\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-web3",
3
- "version": "1.0.2",
3
+ "version": "1.2.0",
4
4
  "description": "BigInt-safe JSON serialization and deserialization for Web3 use cases.",
5
5
  "keywords": [
6
6
  "json",
@@ -44,6 +44,7 @@
44
44
  "prettier-plugin-tailwindcss": "^0.7.2",
45
45
  "tsup": "^8.5.1",
46
46
  "typescript": "^5.9.3",
47
+ "vite-node": "^5.3.0",
47
48
  "vitest": "^4.0.17"
48
49
  },
49
50
  "engines": {