Skip to content

Commit 1681b0a

Browse files
committed
feat: added jsonParse()
1 parent 979061c commit 1681b0a

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export * from './inRange.js';
3636
export * from './isEmpty.js';
3737
export * from './iterateForever.js';
3838
export * from './joinStrings.js';
39+
export * from './jsonParse.js';
3940
export * from './looksLikeURL.js';
4041
export * from './normalize.js';
4142
export * from './parseNumber.js';

src/jsonParse.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { TypeAssertionFn } from './types/functions.js';
2+
3+
export type JsonReviver = Parameters<JSON['parse']>[1];
4+
5+
export function jsonParse(input: string): unknown;
6+
7+
export function jsonParse(input: string, reviver?: JsonReviver): unknown;
8+
9+
export function jsonParse<T>(input: string, reviver: JsonReviver | undefined, assertionFn: TypeAssertionFn<T>): T;
10+
11+
export function jsonParse<T>(input: string, reviver?: JsonReviver, assertionFn?: TypeAssertionFn<T>): unknown {
12+
const data: unknown = JSON.parse(input, reviver);
13+
14+
assertionFn?.(data);
15+
16+
return data;
17+
}

test/jsonParse.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { describe, expect, it } from 'vitest';
2+
3+
import { assertIsObject } from '../src/assertion/assertIsObject.js';
4+
import { jsonParse } from '../src/jsonParse.js';
5+
6+
describe('jsonParse()', () => {
7+
it('Parses a JSON string', () => {
8+
const unknownData = jsonParse('{"name":"test"}');
9+
10+
expect(unknownData).toEqual({
11+
name: 'test',
12+
});
13+
});
14+
15+
it('Can use a reviver function', () => {
16+
const unknownData = jsonParse('{"name":"test"}', (key, value) => {
17+
return key === 'name' ? String(value).toUpperCase() : value;
18+
});
19+
20+
expect(unknownData).toEqual({
21+
name: 'TEST',
22+
});
23+
});
24+
25+
it('Can use a type assertion function', () => {
26+
expect(jsonParse('{"name":"test"}', undefined, assertIsObject)).toEqual({
27+
name: 'test',
28+
});
29+
30+
expect(() => jsonParse('[]', undefined, assertIsObject)).toThrowError();
31+
});
32+
});

0 commit comments

Comments
 (0)