diff --git a/src/index.js b/src/index.js index 94f49379..b050880c 100644 --- a/src/index.js +++ b/src/index.js @@ -2,7 +2,8 @@ import { Volder } from './lib/volder'; import { singleVolder } from './lib/single-volder'; import { UUID } from './lib/volder-types/uuid'; import { Email } from './lib/volder-types/email'; +import { Json } from './lib/volder-types/json'; import { CreditCard } from './lib/volder-types/credit-card'; import { IPAddress } from './lib/volder-types/ip-address'; import { URL } from './lib/volder-types/url'; -export { Volder, singleVolder, UUID, Email, CreditCard, URL, IPAddress }; +export { Volder, singleVolder, UUID, Email, Json, CreditCard, URL, IPAddress }; diff --git a/src/lib/volder-types/json.js b/src/lib/volder-types/json.js new file mode 100644 index 00000000..24821bfc --- /dev/null +++ b/src/lib/volder-types/json.js @@ -0,0 +1,8 @@ +export const Json = (str) => { + try { + JSON.parse(str); + } catch (e) { + return false; + } + return true; +}; diff --git a/test/volder-types.test.js b/test/volder-types.test.js index 23120806..ec926b1b 100644 --- a/test/volder-types.test.js +++ b/test/volder-types.test.js @@ -3,8 +3,50 @@ import { UUID } from '../src/lib/volder-types/uuid'; import { CreditCard } from '../src/lib/volder-types/credit-card'; import { URL } from '../src/lib/volder-types/url'; import { IPAddress } from '../src/lib/volder-types/ip-address'; +import { Json } from '../src/lib/volder-types/json'; import { Volder } from '../src/index'; +test('json volder type work correctly', () => { + // Thses assertions are based on JSON grammar + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON + + // valid jsons + expect(Json(`{}`)).toBe(true); + expect(Json(`[]`)).toBe(true); + expect(Json(`0`)).toBe(true); + expect(Json(`0.1`)).toBe(true); + expect(Json(`-1`)).toBe(true); + expect(Json(`"string"`)).toBe(true); + expect(Json(`"'single quote' in string"`)).toBe(true); + expect(Json(`true`)).toBe(true); + expect(Json(`false`)).toBe(true); + expect(Json(`null`)).toBe(true); + expect(Json(`[1,2,3]`)).toBe(true); + expect(Json(`[1,\n2,3]`)).toBe(true); + expect(Json(`[1,\t2,3]`)).toBe(true); + expect(Json(`[1,\r2,3]`)).toBe(true); + expect(Json(`{"list":[1,2,3]}`)).toBe(true); + expect(Json(`{"a":"A","b":"B"}`)).toBe(true); + expect(Json(`{"a":"a",\n"b":"B"}`)).toBe(true); + expect(Json(`{"a":"a",\t"b":"B"}`)).toBe(true); + expect(Json(`{"a":"a",\r"b":"B"}`)).toBe(true); + + // invalid jsons + expect(Json(`{'a':'A'}`)).toBe(false); // Single Quote + expect(Json(`{"a":'A'}`)).toBe(false); + expect(Json(`{'a':"A"}`)).toBe(false); + expect(Json(`'string'`)).toBe(false); + expect(Json(`{"a":"A","b":"B",}`)).toBe(false); // Trailing Comma + expect(Json(`01`)).toBe(false); // Leading zero + expect(Json(`00.1`)).toBe(false); + expect(Json(`NaN`)).toBe(false); + expect(Json(`Infinity`)).toBe(false); + expect(Json(`undefined`)).toBe(false); + expect(Json(`{"a":"Str\ning"}`)).toBe(false); // Whitespace in string + expect(Json(`{"a":"Str\ting"}`)).toBe(false); + expect(Json(`{"a":"Str\ring"}`)).toBe(false); +}); + test('email volder type work correctly', () => { // valid emails expect(Email('foo@bar.com')).toBe(true);