{"version":3,"file":"json-string.mjs","sources":["../../../../src/predefined/brand/string/json-string.mts"],"sourcesContent":["import { isNonNullObject } from 'ts-data-forge';\nimport { type Brand, type NonEmptyString } from 'ts-type-forge';\nimport { brand } from '../../../brand/index.mjs';\nimport { string } from '../../../primitives/index.mjs';\nimport { type Type } from '../../../type.mjs';\n\n// A valid JSON string (an object or array literal) is always non-empty, so\n// `JsonString` is branded on top of `NonEmptyString` and is assignable to it.\nexport type JsonString = Brand<NonEmptyString, 'JsonString'>;\n\n/**\n * @link https://github.com/validatorjs/validator.js/tree/v13.1.17?tab=readme-ov-file#validators\n */\nexport const jsonString = (\n  options?: Partial<\n    Readonly<{\n      defaultValue: string;\n    }>\n  >,\n): Type<JsonString> =>\n  brand<NonEmptyString, readonly ['JsonString']>({\n    baseType: string(options?.defaultValue ?? defaultJsonString, {\n      nonempty: true,\n    }),\n    is: isJsonString,\n    brandKeys: ['JsonString'],\n    typeName: 'JsonString',\n  });\n\nconst defaultJsonString = '{}';\n\nconst isJsonString = (str: string): str is JsonString => {\n  try {\n    return isNonNullObject(JSON.parse(str));\n  } catch {\n    return false;\n  }\n};\n\nif (import.meta.vitest !== undefined) {\n  test('defaultJsonString', () => {\n    assert.isTrue(isJsonString(defaultJsonString));\n  });\n}\n"],"names":[],"mappings":";;;;;;AAaO,MAAM,UAAA,GAAa,CACxB,OAAA,KAMA,KAAA,CAA+C;AAAA,EAC7C,QAAA,EAAU,MAAA,CAAO,OAAA,EAAS,YAAA,IAAgB,iBAAA,EAAmB;AAAA,IAC3D,QAAA,EAAU;AAAA,GACX,CAAA;AAAA,EACD,EAAA,EAAI,YAAA;AAAA,EACJ,SAAA,EAAW,CAAC,YAAY,CAAA;AAAA,EACxB,QAAA,EAAU;AACZ,CAAC;AAEH,MAAM,iBAAA,GAAoB,IAAA;AAE1B,MAAM,YAAA,GAAe,CAAC,GAAA,KAAmC;AACvD,EAAA,IAAI;AACF,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;;;;"}