diff --git a/CHANGELOG.md b/CHANGELOG.md index e6ca622f..dd2b2898 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change logs +## 2024.01.21 v5.17.1 + +1. `safeParse` `safeStringify` supports converting bigint + ## 2024.01.22 v5.17.0 1. `randomColor` supports a range of custom color values, which can be used to customize the generation of dark, light, warm, etc. diff --git a/README.md b/README.md index 0b8ec72c..e6f4be9a 100755 --- a/README.md +++ b/README.md @@ -1571,6 +1571,8 @@ declare function spliceUrlParam( Secure parsing of JSON strings +> support BigInt since `v5.17.1` + - Since: `5.16.0` - Arguments: @@ -1588,8 +1590,8 @@ Secure parsing of JSON strings safeParse('100') // 100 -safeParse('{"a":"undefined","b":"NaN","c":"Infinity"}') -// { b: NaN, c: Infinity } +safeParse('{"a":"undefined","b":"NaN","c":"Infinity","d":"9007199254740993"}') +// { b: NaN, c: Infinity, d: 9007199254740993n } ``` - Types: @@ -1602,6 +1604,8 @@ declare function safeParse(data: string, covert?: boolean): any Secure stringify of JSON Object +> support BigInt since `v5.17.1` + - Since: `5.16.0` - Arguments: @@ -1628,8 +1632,8 @@ safeStringify(NaN) safeStringify(Infinity) // "Infinity" -safeStringify({ a: undefined, b: NaN, c: Infinity }) -// {"a":"undefined","b":"NaN","c":"Infinity"} +safeStringify({ a: undefined, b: NaN, c: Infinity, d: BigInt(Number.MAX_SAFE_INTEGER) + 2n }) +// {"a":"undefined","b":"NaN","c":"Infinity","d":"9007199254740993"} ``` - Types: diff --git a/package.json b/package.json index a3f43904..edfc287b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-cool", "description": "Collection of common JavaScript / TypeScript utilities", - "version": "5.17.0", + "version": "5.17.1", "packageManager": "pnpm@8.9.2", "main": "dist/index.cjs.js", "module": "dist/index.esm-bundler.js", diff --git a/src/safeParse.ts b/src/safeParse.ts index aeb7e296..bddbe304 100644 --- a/src/safeParse.ts +++ b/src/safeParse.ts @@ -6,8 +6,8 @@ * safeParse('100') * // 100 * - * safeParse('{"a":"undefined","b":"NaN","c":"Infinity"}') - * // { b: NaN, c: Infinity } + * safeParse('{"a":"undefined","b":"NaN","c":"Infinity","d":"9007199254740993"}') + * // { b: NaN, c: Infinity, d: 9007199254740993n } * ``` * @param data - JSON string * @param covert - Whether to convert data, default: true @@ -21,9 +21,15 @@ function safeParse(data: string, covert = true): any { '-Infinity': -Infinity } return JSON.parse(data, (key, val) => { - if (covert && ['Infinity', '-Infinity', 'undefined', 'NaN'].includes(val)) { + if (covert && ['Infinity', '-Infinity', 'undefined', 'NaN'].includes(val)) return VALUE_MAP[val as keyof typeof VALUE_MAP] - } + else if ( + typeof val === 'string' && + /^(\-|\+)?\d+(\.\d+)?$/.test(val) && + !Number.isSafeInteger(+val) + ) + return BigInt(val) + return val }) } diff --git a/src/safeStringify.ts b/src/safeStringify.ts index 544e4ecb..04ca6f1a 100644 --- a/src/safeStringify.ts +++ b/src/safeStringify.ts @@ -15,8 +15,8 @@ * safeStringify(Infinity) * // "Infinity" * - * safeStringify({ a: undefined, b: NaN, c: Infinity }) - * // {"a":"undefined","b":"NaN","c":"Infinity"} + * safeStringify({ a: undefined, b: NaN, c: Infinity, d: BigInt(Number.MAX_SAFE_INTEGER) + 2n }) + * // {"a":"undefined","b":"NaN","c":"Infinity","d":"9007199254740993"} * ``` * @param data - JSON Object * @param covert - Whether to convert data, default: true @@ -24,7 +24,11 @@ */ function safeStringify(data: any, covert = true): string { return JSON.stringify(data, (key, val) => { - if (covert && [Infinity, -Infinity, undefined, NaN].includes(val)) return String(val) + if (covert) { + if ([Infinity, -Infinity, undefined, NaN].includes(val)) return String(val) + else if (typeof val === 'number' && !Number.isSafeInteger(val)) + return String(BigInt(val)) + } else if (typeof val === 'bigint') return String(val) return val }) }