json-web3 1.0.2 → 1.1.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,19 +23,33 @@ 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: [Function: echo]
39
53
  }
40
54
  */
41
55
  ```
@@ -45,6 +59,15 @@ const restored = jsonWeb3.parse(text)
45
59
  - `stringify(value, replacer?, space?)`
46
60
  - `parse(text, reviver?)`
47
61
 
48
- ## Notes
62
+ ## Note
49
63
 
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`).
64
+ - `bigint` values are encoded as objects: `{"__@json.bigint__":"<value>"}`.
65
+ - Non-finite numbers (`NaN`, `Infinity`, `-Infinity`) are encoded as `{"__@json.number__":"<value>"}`.
66
+ - `Date` values are encoded as `{"__@json.date__":<timestamp>}`.
67
+ - `Map` values are encoded as `{"__@json.map__":[[k,v],...]}` and `Set` values as `{"__@json.set__":[...]}`.
68
+ - `RegExp` values are encoded as `{"__@json.regexp__":{"source":"...","flags":"..."}}`.
69
+ - `URL` values are encoded as `{"__@json.url__":"..."}`.
70
+ - `Function` values are encoded as `{"__@json.function__":"<source>"}` and revived with `new Function(...)` (only do this with trusted input).
71
+ - `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`).
72
+
73
+ 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
@@ -29,6 +29,13 @@ module.exports = __toCommonJS(index_exports);
29
29
  // src/utils.ts
30
30
  var BIGINT_TAG = "__@json.bigint__";
31
31
  var TYPEDARRAY_TAG = "__@json.typedarray__";
32
+ var DATE_TAG = "__@json.date__";
33
+ var MAP_TAG = "__@json.map__";
34
+ var SET_TAG = "__@json.set__";
35
+ var REGEXP_TAG = "__@json.regexp__";
36
+ var URL_TAG = "__@json.url__";
37
+ var FUNCTION_TAG = "__@json.function__";
38
+ var NUMBER_TAG = "__@json.number__";
32
39
  var undefined = void 0;
33
40
  var isUndefined = (value) => typeof value === "undefined";
34
41
  var isString = (value) => typeof value === "string";
@@ -37,6 +44,13 @@ var isArray = (value) => Array.isArray(value);
37
44
  var isObject = (value) => value !== null && typeof value === "object" && !isArray(value);
38
45
  var isFunction = (value) => typeof value === "function";
39
46
  var isBigInt = (value) => typeof value === "bigint";
47
+ var isDate = (value) => value instanceof Date;
48
+ var isMap = (value) => value instanceof Map;
49
+ var isSet = (value) => value instanceof Set;
50
+ var isRegExp = (value) => value instanceof RegExp;
51
+ var isURL = (value) => !isUndefined(URL) && value instanceof URL;
52
+ var isNonFiniteNumber = (value) => typeof value === "number" && !Number.isFinite(value);
53
+ var isInteger = (value) => Number.isInteger(value);
40
54
  var hasBuffer = () => typeof Buffer !== "undefined";
41
55
  var isArrayBuffer = (value) => !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer;
42
56
  var isTypedArray = (value) => {
@@ -93,6 +107,27 @@ var toSerializable = (value) => {
93
107
  if (isBigInt(value)) {
94
108
  return { [BIGINT_TAG]: value.toString() };
95
109
  }
110
+ if (isNonFiniteNumber(value)) {
111
+ return { [NUMBER_TAG]: String(value) };
112
+ }
113
+ if (isDate(value)) {
114
+ return { [DATE_TAG]: value.getTime() };
115
+ }
116
+ if (isMap(value)) {
117
+ return { [MAP_TAG]: Array.from(value.entries()) };
118
+ }
119
+ if (isSet(value)) {
120
+ return { [SET_TAG]: Array.from(value.values()) };
121
+ }
122
+ if (isRegExp(value)) {
123
+ return { [REGEXP_TAG]: { source: value.source, flags: value.flags } };
124
+ }
125
+ if (isURL(value)) {
126
+ return { [URL_TAG]: value.toString() };
127
+ }
128
+ if (isFunction(value)) {
129
+ return { [FUNCTION_TAG]: value.toString() };
130
+ }
96
131
  if (isTypedArray(value)) {
97
132
  const type = getTypedArrayName(value);
98
133
  if (type && TYPEDARRAY_CTORS[type]) {
@@ -103,7 +138,7 @@ var toSerializable = (value) => {
103
138
  if (isArrayBuffer(value)) {
104
139
  return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(new Uint8Array(value)) } };
105
140
  }
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)) {
141
+ 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
142
  return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(Uint8Array.from(value.data)) } };
108
143
  }
109
144
  return value;
@@ -113,6 +148,51 @@ var fromSerializable = (value) => {
113
148
  if (hasOwnProperty(value, BIGINT_TAG)) {
114
149
  return BigInt(value[BIGINT_TAG]);
115
150
  }
151
+ if (hasOwnProperty(value, NUMBER_TAG)) {
152
+ const payload = value[NUMBER_TAG];
153
+ if (payload === "NaN") return NaN;
154
+ if (payload === "Infinity") return Infinity;
155
+ if (payload === "-Infinity") return -Infinity;
156
+ throw new Error("Invalid number payload");
157
+ }
158
+ if (hasOwnProperty(value, DATE_TAG)) {
159
+ return new Date(value[DATE_TAG]);
160
+ }
161
+ if (hasOwnProperty(value, MAP_TAG)) {
162
+ const payload = value[MAP_TAG];
163
+ if (!isArray(payload)) {
164
+ throw new Error("Invalid map payload");
165
+ }
166
+ return new Map(payload);
167
+ }
168
+ if (hasOwnProperty(value, SET_TAG)) {
169
+ const payload = value[SET_TAG];
170
+ if (!isArray(payload)) {
171
+ throw new Error("Invalid set payload");
172
+ }
173
+ return new Set(payload);
174
+ }
175
+ if (hasOwnProperty(value, REGEXP_TAG)) {
176
+ const payload = value[REGEXP_TAG];
177
+ if (!payload || !isObject(payload) || !isString(payload.source) || !isString(payload.flags)) {
178
+ throw new Error("Invalid regexp payload");
179
+ }
180
+ return new RegExp(payload.source, payload.flags);
181
+ }
182
+ if (hasOwnProperty(value, URL_TAG)) {
183
+ const payload = value[URL_TAG];
184
+ if (!isString(payload)) {
185
+ throw new Error("Invalid URL payload");
186
+ }
187
+ return new URL(payload);
188
+ }
189
+ if (hasOwnProperty(value, FUNCTION_TAG)) {
190
+ const payload = value[FUNCTION_TAG];
191
+ if (!isString(payload)) {
192
+ throw new Error("Invalid function payload");
193
+ }
194
+ return new Function(`return (${payload})`)();
195
+ }
116
196
  if (hasOwnProperty(value, TYPEDARRAY_TAG)) {
117
197
  const payload = value[TYPEDARRAY_TAG];
118
198
  if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {
@@ -125,13 +205,14 @@ var fromSerializable = (value) => {
125
205
  new Uint8Array(buffer).set(bytes);
126
206
  return new ctor(buffer);
127
207
  }
128
- if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {
208
+ if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => isInteger(entry) && entry >= 0 && entry <= 255)) {
129
209
  return Uint8Array.from(value.data);
130
210
  }
131
211
  }
132
212
  return value;
133
213
  };
134
214
  var isTypedArrayPayload = (value) => isObject(value) && isString(value.type) && isString(value.bytes) && Object.keys(value).length === 2;
215
+ var isRegExpPayload = (value) => isObject(value) && isString(value.source) && isString(value.flags) && Object.keys(value).length === 2;
135
216
 
136
217
  // src/index.ts
137
218
  var RAW_JSON = JSON;
@@ -142,8 +223,16 @@ var applyReplacer = (holder, key, value, replacer) => {
142
223
  if (isArray(replacer)) {
143
224
  if (key === "") return value;
144
225
  if (key === BIGINT_TAG) return value;
226
+ if (key === DATE_TAG) return value;
227
+ if (key === NUMBER_TAG) return value;
228
+ if (key === MAP_TAG) return value;
229
+ if (key === SET_TAG) return value;
230
+ if (key === REGEXP_TAG) return value;
231
+ if (key === URL_TAG) return value;
232
+ if (key === FUNCTION_TAG) return value;
145
233
  if (key === TYPEDARRAY_TAG) return value;
146
234
  if (isTypedArrayPayload(holder)) return value;
235
+ if (isRegExpPayload(holder)) return value;
147
236
  if (isArray(holder)) return value;
148
237
  return replacer.includes(key) ? value : undefined;
149
238
  }
@@ -152,7 +241,9 @@ var applyReplacer = (holder, key, value, replacer) => {
152
241
  var stringify = (value, replacer = null, space) => RAW_JSON.stringify(
153
242
  value,
154
243
  function replacerFn(key, v) {
155
- const replaced = applyReplacer(this, key, v, replacer);
244
+ const holderValue = this && key in Object(this) ? this[key] : v;
245
+ const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v;
246
+ const replaced = applyReplacer(this, key, candidate, replacer);
156
247
  return toSerializable(replaced);
157
248
  },
158
249
  space
@@ -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 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 default {\n stringify,\n parse,\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): 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 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): 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 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;;;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,UAAoB;AACjD,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,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,UAAoB;AACnD,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,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;;;ADtNhC,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,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;AAEH,IAAO,gBAAQ;AAAA,EACb;AAAA,EACA;AACF;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,10 +1,10 @@
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 parse: <T = any>(text: string, reviver?: Reviver) => T;
5
5
  declare const _default: {
6
6
  stringify: (value: any, replacer?: Replacer, space?: string | number) => string;
7
- parse: (text: string, reviver?: Reviver) => any;
7
+ parse: <T = any>(text: string, reviver?: Reviver) => T;
8
8
  };
9
9
 
10
10
  export { _default as default, parse, stringify };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
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 parse: <T = any>(text: string, reviver?: Reviver) => T;
5
5
  declare const _default: {
6
6
  stringify: (value: any, replacer?: Replacer, space?: string | number) => string;
7
- parse: (text: string, reviver?: Reviver) => any;
7
+ parse: <T = any>(text: string, reviver?: Reviver) => T;
8
8
  };
9
9
 
10
10
  export { _default as default, parse, stringify };
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) => {
@@ -65,6 +79,27 @@ var toSerializable = (value) => {
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
+ return { [FUNCTION_TAG]: value.toString() };
102
+ }
68
103
  if (isTypedArray(value)) {
69
104
  const type = getTypedArrayName(value);
70
105
  if (type && TYPEDARRAY_CTORS[type]) {
@@ -75,7 +110,7 @@ var toSerializable = (value) => {
75
110
  if (isArrayBuffer(value)) {
76
111
  return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(new Uint8Array(value)) } };
77
112
  }
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)) {
113
+ 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
114
  return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(Uint8Array.from(value.data)) } };
80
115
  }
81
116
  return value;
@@ -85,6 +120,51 @@ var fromSerializable = (value) => {
85
120
  if (hasOwnProperty(value, BIGINT_TAG)) {
86
121
  return BigInt(value[BIGINT_TAG]);
87
122
  }
123
+ if (hasOwnProperty(value, NUMBER_TAG)) {
124
+ const payload = value[NUMBER_TAG];
125
+ if (payload === "NaN") return NaN;
126
+ if (payload === "Infinity") return Infinity;
127
+ if (payload === "-Infinity") return -Infinity;
128
+ throw new Error("Invalid number payload");
129
+ }
130
+ if (hasOwnProperty(value, DATE_TAG)) {
131
+ return new Date(value[DATE_TAG]);
132
+ }
133
+ if (hasOwnProperty(value, MAP_TAG)) {
134
+ const payload = value[MAP_TAG];
135
+ if (!isArray(payload)) {
136
+ throw new Error("Invalid map payload");
137
+ }
138
+ return new Map(payload);
139
+ }
140
+ if (hasOwnProperty(value, SET_TAG)) {
141
+ const payload = value[SET_TAG];
142
+ if (!isArray(payload)) {
143
+ throw new Error("Invalid set payload");
144
+ }
145
+ return new Set(payload);
146
+ }
147
+ if (hasOwnProperty(value, REGEXP_TAG)) {
148
+ const payload = value[REGEXP_TAG];
149
+ if (!payload || !isObject(payload) || !isString(payload.source) || !isString(payload.flags)) {
150
+ throw new Error("Invalid regexp payload");
151
+ }
152
+ return new RegExp(payload.source, payload.flags);
153
+ }
154
+ if (hasOwnProperty(value, URL_TAG)) {
155
+ const payload = value[URL_TAG];
156
+ if (!isString(payload)) {
157
+ throw new Error("Invalid URL payload");
158
+ }
159
+ return new URL(payload);
160
+ }
161
+ if (hasOwnProperty(value, FUNCTION_TAG)) {
162
+ const payload = value[FUNCTION_TAG];
163
+ if (!isString(payload)) {
164
+ throw new Error("Invalid function payload");
165
+ }
166
+ return new Function(`return (${payload})`)();
167
+ }
88
168
  if (hasOwnProperty(value, TYPEDARRAY_TAG)) {
89
169
  const payload = value[TYPEDARRAY_TAG];
90
170
  if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {
@@ -97,13 +177,14 @@ var fromSerializable = (value) => {
97
177
  new Uint8Array(buffer).set(bytes);
98
178
  return new ctor(buffer);
99
179
  }
100
- if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {
180
+ if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => isInteger(entry) && entry >= 0 && entry <= 255)) {
101
181
  return Uint8Array.from(value.data);
102
182
  }
103
183
  }
104
184
  return value;
105
185
  };
106
186
  var isTypedArrayPayload = (value) => isObject(value) && isString(value.type) && isString(value.bytes) && Object.keys(value).length === 2;
187
+ var isRegExpPayload = (value) => isObject(value) && isString(value.source) && isString(value.flags) && Object.keys(value).length === 2;
107
188
 
108
189
  // src/index.ts
109
190
  var RAW_JSON = JSON;
@@ -114,8 +195,16 @@ var applyReplacer = (holder, key, value, replacer) => {
114
195
  if (isArray(replacer)) {
115
196
  if (key === "") return value;
116
197
  if (key === BIGINT_TAG) return value;
198
+ if (key === DATE_TAG) return value;
199
+ if (key === NUMBER_TAG) return value;
200
+ if (key === MAP_TAG) return value;
201
+ if (key === SET_TAG) return value;
202
+ if (key === REGEXP_TAG) return value;
203
+ if (key === URL_TAG) return value;
204
+ if (key === FUNCTION_TAG) return value;
117
205
  if (key === TYPEDARRAY_TAG) return value;
118
206
  if (isTypedArrayPayload(holder)) return value;
207
+ if (isRegExpPayload(holder)) return value;
119
208
  if (isArray(holder)) return value;
120
209
  return replacer.includes(key) ? value : undefined;
121
210
  }
@@ -124,7 +213,9 @@ var applyReplacer = (holder, key, value, replacer) => {
124
213
  var stringify = (value, replacer = null, space) => RAW_JSON.stringify(
125
214
  value,
126
215
  function replacerFn(key, v) {
127
- const replaced = applyReplacer(this, key, v, replacer);
216
+ const holderValue = this && key in Object(this) ? this[key] : v;
217
+ const candidate = isDate(holderValue) || isURL(holderValue) ? holderValue : v;
218
+ const replaced = applyReplacer(this, key, candidate, replacer);
128
219
  return toSerializable(replaced);
129
220
  },
130
221
  space
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): 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 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): 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 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 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 default {\n stringify,\n parse,\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.1.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": {