json-web3 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,18 +20,22 @@ import jsonWeb3 from 'json-web3'
20
20
  const payload = {
21
21
  balance: 1234567890123456789n,
22
22
  decimals: 18n,
23
- data: new Uint8Array([1, 2, 3, 255]),
23
+ u8Array: new Uint8Array([1, 2, 3, 255]),
24
+ u16Array: new Uint16Array([1, 2, 3, 255]),
25
+ bigIntArray: new BigInt64Array([18446744073709551615n, 2n, 3n, 255n]),
24
26
  }
25
27
 
26
28
  const text = jsonWeb3.stringify(payload)
27
- // => {"balance":{"__@json.bigint__":"1234567890123456789"},"decimals":{"__@json.bigint__":"18"},"data":{"__@json.bytes__":"0x010203ff"}}
29
+ // => {"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"}}}
28
30
 
29
31
  const restored = jsonWeb3.parse(text)
30
32
  /* =>
31
33
  {
32
- "balance": 1234567890123456789n,
33
- "decimals": 18n,
34
- "data": Uint8Array(4) [1, 2, 3, 255]
34
+ balance: 1234567890123456789n,
35
+ decimals: 18n,
36
+ u8Array: Uint8Array(4) [1, 2, 3, 255]...,
37
+ u16Array: Uint16Array(4)...,
38
+ bigIntArray: BigInt64Array(4)...
35
39
  }
36
40
  */
37
41
  ```
@@ -43,4 +47,4 @@ const restored = jsonWeb3.parse(text)
43
47
 
44
48
  ## Notes
45
49
 
46
- `bigint` values are encoded as objects: `{"__@json.bigint__":"<value>"}`. `Uint8Array`/`ArrayBuffer` (and Node `Buffer` JSON shapes) are encoded as `{"__@json.bytes__":"0x..."}` and decoded back to `Uint8Array`.
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`).
package/dist/index.cjs CHANGED
@@ -28,16 +28,46 @@ module.exports = __toCommonJS(index_exports);
28
28
 
29
29
  // src/utils.ts
30
30
  var BIGINT_TAG = "__@json.bigint__";
31
- var BYTES_TAG = "__@json.bytes__";
31
+ var TYPEDARRAY_TAG = "__@json.typedarray__";
32
32
  var undefined = void 0;
33
- var isUndefined = (value) => value === undefined;
33
+ var isUndefined = (value) => typeof value === "undefined";
34
+ var isString = (value) => typeof value === "string";
34
35
  var hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
35
36
  var isArray = (value) => Array.isArray(value);
36
37
  var isObject = (value) => value !== null && typeof value === "object" && !isArray(value);
37
38
  var isFunction = (value) => typeof value === "function";
38
39
  var isBigInt = (value) => typeof value === "bigint";
39
- var isUint8Array = (value) => !isUndefined(Uint8Array) && value instanceof Uint8Array;
40
+ var hasBuffer = () => typeof Buffer !== "undefined";
40
41
  var isArrayBuffer = (value) => !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer;
42
+ var isTypedArray = (value) => {
43
+ if (isUndefined(value)) return false;
44
+ if (!isUndefined(ArrayBuffer) && isFunction(ArrayBuffer.isView) && ArrayBuffer.isView(value)) {
45
+ return Object.prototype.toString.call(value) !== "[object DataView]";
46
+ }
47
+ const tag = Object.prototype.toString.call(value);
48
+ return tag.endsWith("Array]") && tag !== "[object Array]";
49
+ };
50
+ var getTypedArrayName = (value) => {
51
+ if (isUndefined(value)) return null;
52
+ const ctor = value.constructor;
53
+ if (ctor && isString(ctor.name)) return ctor.name;
54
+ const tag = Object.prototype.toString.call(value);
55
+ const match = /^\[object (.+)\]$/.exec(tag);
56
+ return match ? match[1] : null;
57
+ };
58
+ var TYPEDARRAY_CTORS = {
59
+ Uint8Array: !isUndefined(Uint8Array) ? Uint8Array : undefined,
60
+ Uint8ClampedArray: !isUndefined(Uint8ClampedArray) ? Uint8ClampedArray : undefined,
61
+ Uint16Array: !isUndefined(Uint16Array) ? Uint16Array : undefined,
62
+ Uint32Array: !isUndefined(Uint32Array) ? Uint32Array : undefined,
63
+ Int8Array: !isUndefined(Int8Array) ? Int8Array : undefined,
64
+ Int16Array: !isUndefined(Int16Array) ? Int16Array : undefined,
65
+ Int32Array: !isUndefined(Int32Array) ? Int32Array : undefined,
66
+ Float32Array: !isUndefined(Float32Array) ? Float32Array : undefined,
67
+ Float64Array: !isUndefined(Float64Array) ? Float64Array : undefined,
68
+ BigInt64Array: !isUndefined(BigInt64Array) ? BigInt64Array : undefined,
69
+ BigUint64Array: !isUndefined(BigUint64Array) ? BigUint64Array : undefined
70
+ };
41
71
  var toHex = (value) => {
42
72
  let out = "0x";
43
73
  for (const byte of value) {
@@ -50,7 +80,7 @@ var fromHex = (hex) => {
50
80
  if (normalized.length % 2 !== 0) {
51
81
  throw new Error("Invalid hex string for bytes");
52
82
  }
53
- if (!isUndefined(Buffer)) {
83
+ if (hasBuffer()) {
54
84
  return Uint8Array.from(Buffer.from(normalized, "hex"));
55
85
  }
56
86
  const out = new Uint8Array(normalized.length / 2);
@@ -63,14 +93,18 @@ var toSerializable = (value) => {
63
93
  if (isBigInt(value)) {
64
94
  return { [BIGINT_TAG]: value.toString() };
65
95
  }
66
- if (isUint8Array(value)) {
67
- return { [BYTES_TAG]: toHex(value) };
96
+ if (isTypedArray(value)) {
97
+ const type = getTypedArrayName(value);
98
+ if (type && TYPEDARRAY_CTORS[type]) {
99
+ const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
100
+ return { [TYPEDARRAY_TAG]: { type, bytes: toHex(bytes) } };
101
+ }
68
102
  }
69
103
  if (isArrayBuffer(value)) {
70
- return { [BYTES_TAG]: toHex(new Uint8Array(value)) };
104
+ return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(new Uint8Array(value)) } };
71
105
  }
72
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)) {
73
- return { [BYTES_TAG]: toHex(Uint8Array.from(value.data)) };
107
+ return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(Uint8Array.from(value.data)) } };
74
108
  }
75
109
  return value;
76
110
  };
@@ -79,8 +113,17 @@ var fromSerializable = (value) => {
79
113
  if (hasOwnProperty(value, BIGINT_TAG)) {
80
114
  return BigInt(value[BIGINT_TAG]);
81
115
  }
82
- if (hasOwnProperty(value, BYTES_TAG)) {
83
- return fromHex(value[BYTES_TAG]);
116
+ if (hasOwnProperty(value, TYPEDARRAY_TAG)) {
117
+ const payload = value[TYPEDARRAY_TAG];
118
+ if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {
119
+ throw new Error("Invalid typed array payload");
120
+ }
121
+ const bytes = fromHex(payload.bytes);
122
+ const ctor = TYPEDARRAY_CTORS[payload.type];
123
+ if (!ctor) return bytes;
124
+ const buffer = new ArrayBuffer(bytes.byteLength);
125
+ new Uint8Array(buffer).set(bytes);
126
+ return new ctor(buffer);
84
127
  }
85
128
  if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {
86
129
  return Uint8Array.from(value.data);
@@ -88,6 +131,7 @@ var fromSerializable = (value) => {
88
131
  }
89
132
  return value;
90
133
  };
134
+ var isTypedArrayPayload = (value) => isObject(value) && isString(value.type) && isString(value.bytes) && Object.keys(value).length === 2;
91
135
 
92
136
  // src/index.ts
93
137
  var RAW_JSON = JSON;
@@ -98,7 +142,8 @@ var applyReplacer = (holder, key, value, replacer) => {
98
142
  if (isArray(replacer)) {
99
143
  if (key === "") return value;
100
144
  if (key === BIGINT_TAG) return value;
101
- if (key === BYTES_TAG) return value;
145
+ if (key === TYPEDARRAY_TAG) return value;
146
+ if (isTypedArrayPayload(holder)) return value;
102
147
  if (isArray(holder)) return value;
103
148
  return replacer.includes(key) ? value : undefined;
104
149
  }
@@ -114,7 +159,7 @@ var stringify = (value, replacer = null, space) => RAW_JSON.stringify(
114
159
  );
115
160
  var parse = (text, reviver = null) => RAW_JSON.parse(text, (key, v) => {
116
161
  const decoded = fromSerializable(v);
117
- return typeof reviver === "function" ? reviver(key, decoded) : decoded;
162
+ return isFunction(reviver) ? reviver(key, decoded) : decoded;
118
163
  });
119
164
  var index_default = {
120
165
  stringify,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n BIGINT_TAG,\n BYTES_TAG,\n fromSerializable,\n isArray,\n isFunction,\n toSerializable,\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 === BYTES_TAG) 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 typeof reviver === 'function' ? reviver(key, decoded) : decoded\n })\n\nexport default {\n stringify,\n parse,\n}\n","export const BIGINT_TAG = '__@json.bigint__'\nexport const BYTES_TAG = '__@json.bytes__'\n\nexport const undefined = void 0\nexport const isUndefined = (value: any): value is undefined => value === undefined\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 isBuffer = (value: any): value is Buffer =>\n !isUndefined(Buffer) && isFunction(Buffer.isBuffer) && Buffer.isBuffer(value)\nexport const isUint8Array = (value: any): value is Uint8Array =>\n !isUndefined(Uint8Array) && value instanceof Uint8Array\nexport const isArrayBuffer = (value: any): value is ArrayBuffer =>\n !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer\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 (!isUndefined(Buffer)) {\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 (isUint8Array(value)) {\n return { [BYTES_TAG]: toHex(value) }\n }\n\n if (isArrayBuffer(value)) {\n return { [BYTES_TAG]: 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 { [BYTES_TAG]: 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, BYTES_TAG)) {\n return fromHex(value[BYTES_TAG])\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"],"mappings":"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","names":[]}
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":[]}
package/dist/index.js CHANGED
@@ -1,15 +1,45 @@
1
1
  // src/utils.ts
2
2
  var BIGINT_TAG = "__@json.bigint__";
3
- var BYTES_TAG = "__@json.bytes__";
3
+ var TYPEDARRAY_TAG = "__@json.typedarray__";
4
4
  var undefined = void 0;
5
- var isUndefined = (value) => value === undefined;
5
+ var isUndefined = (value) => typeof value === "undefined";
6
+ var isString = (value) => typeof value === "string";
6
7
  var hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
7
8
  var isArray = (value) => Array.isArray(value);
8
9
  var isObject = (value) => value !== null && typeof value === "object" && !isArray(value);
9
10
  var isFunction = (value) => typeof value === "function";
10
11
  var isBigInt = (value) => typeof value === "bigint";
11
- var isUint8Array = (value) => !isUndefined(Uint8Array) && value instanceof Uint8Array;
12
+ var hasBuffer = () => typeof Buffer !== "undefined";
12
13
  var isArrayBuffer = (value) => !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer;
14
+ var isTypedArray = (value) => {
15
+ if (isUndefined(value)) return false;
16
+ if (!isUndefined(ArrayBuffer) && isFunction(ArrayBuffer.isView) && ArrayBuffer.isView(value)) {
17
+ return Object.prototype.toString.call(value) !== "[object DataView]";
18
+ }
19
+ const tag = Object.prototype.toString.call(value);
20
+ return tag.endsWith("Array]") && tag !== "[object Array]";
21
+ };
22
+ var getTypedArrayName = (value) => {
23
+ if (isUndefined(value)) return null;
24
+ const ctor = value.constructor;
25
+ if (ctor && isString(ctor.name)) return ctor.name;
26
+ const tag = Object.prototype.toString.call(value);
27
+ const match = /^\[object (.+)\]$/.exec(tag);
28
+ return match ? match[1] : null;
29
+ };
30
+ var TYPEDARRAY_CTORS = {
31
+ Uint8Array: !isUndefined(Uint8Array) ? Uint8Array : undefined,
32
+ Uint8ClampedArray: !isUndefined(Uint8ClampedArray) ? Uint8ClampedArray : undefined,
33
+ Uint16Array: !isUndefined(Uint16Array) ? Uint16Array : undefined,
34
+ Uint32Array: !isUndefined(Uint32Array) ? Uint32Array : undefined,
35
+ Int8Array: !isUndefined(Int8Array) ? Int8Array : undefined,
36
+ Int16Array: !isUndefined(Int16Array) ? Int16Array : undefined,
37
+ Int32Array: !isUndefined(Int32Array) ? Int32Array : undefined,
38
+ Float32Array: !isUndefined(Float32Array) ? Float32Array : undefined,
39
+ Float64Array: !isUndefined(Float64Array) ? Float64Array : undefined,
40
+ BigInt64Array: !isUndefined(BigInt64Array) ? BigInt64Array : undefined,
41
+ BigUint64Array: !isUndefined(BigUint64Array) ? BigUint64Array : undefined
42
+ };
13
43
  var toHex = (value) => {
14
44
  let out = "0x";
15
45
  for (const byte of value) {
@@ -22,7 +52,7 @@ var fromHex = (hex) => {
22
52
  if (normalized.length % 2 !== 0) {
23
53
  throw new Error("Invalid hex string for bytes");
24
54
  }
25
- if (!isUndefined(Buffer)) {
55
+ if (hasBuffer()) {
26
56
  return Uint8Array.from(Buffer.from(normalized, "hex"));
27
57
  }
28
58
  const out = new Uint8Array(normalized.length / 2);
@@ -35,14 +65,18 @@ var toSerializable = (value) => {
35
65
  if (isBigInt(value)) {
36
66
  return { [BIGINT_TAG]: value.toString() };
37
67
  }
38
- if (isUint8Array(value)) {
39
- return { [BYTES_TAG]: toHex(value) };
68
+ if (isTypedArray(value)) {
69
+ const type = getTypedArrayName(value);
70
+ if (type && TYPEDARRAY_CTORS[type]) {
71
+ const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
72
+ return { [TYPEDARRAY_TAG]: { type, bytes: toHex(bytes) } };
73
+ }
40
74
  }
41
75
  if (isArrayBuffer(value)) {
42
- return { [BYTES_TAG]: toHex(new Uint8Array(value)) };
76
+ return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(new Uint8Array(value)) } };
43
77
  }
44
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)) {
45
- return { [BYTES_TAG]: toHex(Uint8Array.from(value.data)) };
79
+ return { [TYPEDARRAY_TAG]: { type: "Uint8Array", bytes: toHex(Uint8Array.from(value.data)) } };
46
80
  }
47
81
  return value;
48
82
  };
@@ -51,8 +85,17 @@ var fromSerializable = (value) => {
51
85
  if (hasOwnProperty(value, BIGINT_TAG)) {
52
86
  return BigInt(value[BIGINT_TAG]);
53
87
  }
54
- if (hasOwnProperty(value, BYTES_TAG)) {
55
- return fromHex(value[BYTES_TAG]);
88
+ if (hasOwnProperty(value, TYPEDARRAY_TAG)) {
89
+ const payload = value[TYPEDARRAY_TAG];
90
+ if (!payload || !isObject(payload) || !isString(payload.type) || !isString(payload.bytes)) {
91
+ throw new Error("Invalid typed array payload");
92
+ }
93
+ const bytes = fromHex(payload.bytes);
94
+ const ctor = TYPEDARRAY_CTORS[payload.type];
95
+ if (!ctor) return bytes;
96
+ const buffer = new ArrayBuffer(bytes.byteLength);
97
+ new Uint8Array(buffer).set(bytes);
98
+ return new ctor(buffer);
56
99
  }
57
100
  if (value.type === "Buffer" && isArray(value.data) && Object.keys(value).length === 2 && value.data.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {
58
101
  return Uint8Array.from(value.data);
@@ -60,6 +103,7 @@ var fromSerializable = (value) => {
60
103
  }
61
104
  return value;
62
105
  };
106
+ var isTypedArrayPayload = (value) => isObject(value) && isString(value.type) && isString(value.bytes) && Object.keys(value).length === 2;
63
107
 
64
108
  // src/index.ts
65
109
  var RAW_JSON = JSON;
@@ -70,7 +114,8 @@ var applyReplacer = (holder, key, value, replacer) => {
70
114
  if (isArray(replacer)) {
71
115
  if (key === "") return value;
72
116
  if (key === BIGINT_TAG) return value;
73
- if (key === BYTES_TAG) return value;
117
+ if (key === TYPEDARRAY_TAG) return value;
118
+ if (isTypedArrayPayload(holder)) return value;
74
119
  if (isArray(holder)) return value;
75
120
  return replacer.includes(key) ? value : undefined;
76
121
  }
@@ -86,7 +131,7 @@ var stringify = (value, replacer = null, space) => RAW_JSON.stringify(
86
131
  );
87
132
  var parse = (text, reviver = null) => RAW_JSON.parse(text, (key, v) => {
88
133
  const decoded = fromSerializable(v);
89
- return typeof reviver === "function" ? reviver(key, decoded) : decoded;
134
+ return isFunction(reviver) ? reviver(key, decoded) : decoded;
90
135
  });
91
136
  var index_default = {
92
137
  stringify,
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 BYTES_TAG = '__@json.bytes__'\n\nexport const undefined = void 0\nexport const isUndefined = (value: any): value is undefined => value === undefined\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 isBuffer = (value: any): value is Buffer =>\n !isUndefined(Buffer) && isFunction(Buffer.isBuffer) && Buffer.isBuffer(value)\nexport const isUint8Array = (value: any): value is Uint8Array =>\n !isUndefined(Uint8Array) && value instanceof Uint8Array\nexport const isArrayBuffer = (value: any): value is ArrayBuffer =>\n !isUndefined(ArrayBuffer) && value instanceof ArrayBuffer\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 (!isUndefined(Buffer)) {\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 (isUint8Array(value)) {\n return { [BYTES_TAG]: toHex(value) }\n }\n\n if (isArrayBuffer(value)) {\n return { [BYTES_TAG]: 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 { [BYTES_TAG]: 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, BYTES_TAG)) {\n return fromHex(value[BYTES_TAG])\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","import {\n BIGINT_TAG,\n BYTES_TAG,\n fromSerializable,\n isArray,\n isFunction,\n toSerializable,\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 === BYTES_TAG) 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 typeof reviver === 'function' ? 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__'\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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-web3",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "BigInt-safe JSON serialization and deserialization for Web3 use cases.",
5
5
  "keywords": [
6
6
  "json",
@@ -51,10 +51,8 @@
51
51
  },
52
52
  "scripts": {
53
53
  "build": "tsup",
54
- "coverage": "vitest run --coverage",
54
+ "test": "vitest run --coverage",
55
55
  "lint": "prettier . --write",
56
- "test": "vitest run",
57
- "test:coverage": "pnpm run coverage",
58
56
  "test:watch": "vitest"
59
57
  }
60
58
  }