{"version":3,"file":"uuid.mjs","sources":["../../../../src/predefined/brand/string/uuid.mts"],"sourcesContent":["import {\n  type Brand,\n  type NonEmptyString,\n  type ReadonlyRecord,\n  type TypeEq,\n  type UintRangeInclusive,\n} from 'ts-type-forge';\nimport { brand } from '../../../brand/index.mjs';\nimport { string } from '../../../primitives/index.mjs';\nimport { type Type } from '../../../type.mjs';\n\nexport type UuidVersion = UintRangeInclusive<1, 8>;\n\nexport type UuidBaseString<V extends UuidVersion = UuidVersion> =\n  | `${string}-${string}-${V}${string}-${string}-${string}`\n  | '00000000-0000-0000-0000-000000000000'\n  | 'ffffffff-ffff-ffff-ffff-ffffffffffff';\n\n// A UUID always has the dash-separated hexadecimal form, so it is never an\n// empty string; `Uuid` is branded on top of `NonEmptyString` and is\n// assignable to it.\nexport type Uuid = Brand<UuidBaseString & NonEmptyString, 'Uuid'>;\n\nexport type Uuid4 = Brand<UuidBaseString<4> & NonEmptyString, 'Uuid'>;\n\nexport type Uuid6 = Brand<UuidBaseString<6> & NonEmptyString, 'Uuid'>;\n\nexport type Uuid7 = Brand<UuidBaseString<7> & NonEmptyString, 'Uuid'>;\n\n/**\n * @link https://github.com/validatorjs/validator.js/tree/v13.1.17?tab=readme-ov-file#validators\n */\nexport const uuid = <V extends UuidVersion | UuidVersionAdditionalOption>(\n  options?: UuidValidatorOption<V>,\n): Type<UuidOf<V>> => {\n  type T = Brand<UuidBaseString & NonEmptyString, 'Uuid'>;\n\n  const defaultValue = options?.defaultValue ?? nilUuid;\n\n  const version = options?.version ?? 'all';\n\n  // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n  return brand<UuidBaseString & NonEmptyString, readonly ['Uuid']>({\n    // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n    baseType: string(defaultValue, { nonempty: true }) as Type<\n      UuidBaseString & NonEmptyString\n    >,\n    is: (s): s is T => uuidDef[version](s),\n    // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n    defaultValue: defaultValue as UuidBaseString & NonEmptyString,\n    brandKeys: ['Uuid'],\n    typeName:\n      options?.typeName ??\n      (version === 4\n        ? 'UuidV4'\n        : version === 6\n          ? 'UuidV6'\n          : version === 7\n            ? 'UuidV7'\n            : 'Uuid'),\n  }) satisfies Type<T> as Type<UuidOf<V>>;\n};\n\ntype UuidVersionAdditionalOption = 'nil' | 'max' | 'all' | 'loose';\n\ntype UuidOf<V extends UuidVersion | UuidVersionAdditionalOption> =\n  TypeEq<V, 4> extends true\n    ? Uuid4\n    : TypeEq<V, 6> extends true\n      ? Uuid6\n      : TypeEq<V, 7> extends true\n        ? Uuid7\n        : Uuid;\n\nexport const uuidV4 = (defaultValue?: string): Type<Uuid4> =>\n  uuid({\n    defaultValue: defaultValue ?? '00000000-0000-4000-8000-000000000000',\n    version: 4,\n  });\n\nexport const uuidV6 = (defaultValue?: string): Type<Uuid6> =>\n  uuid({\n    defaultValue: defaultValue ?? '00000000-0000-6000-8000-000000000000',\n    version: 6,\n  });\n\nexport const uuidV7 = (defaultValue?: string): Type<Uuid7> =>\n  uuid({\n    defaultValue: defaultValue ?? '00000000-0000-7000-8000-000000000000',\n    version: 7,\n  });\n\ntype UuidValidatorOption<V extends UuidVersion | UuidVersionAdditionalOption> =\n  Partial<\n    Readonly<{\n      /**\n       * @param version One of 1-8, 'nil', 'max', 'all' or 'loose'. The 'loose' option checks if the string is a UUID-like string with hexadecimal values, ignoring RFC9562.\n       */\n      version: V;\n\n      typeName: string;\n      defaultValue: string;\n    }>\n  >;\n\nconst nilUuid = '00000000-0000-0000-0000-000000000000' satisfies UuidBaseString;\n\nconst maxUuid = 'ffffffff-ffff-ffff-ffff-ffffffffffff' satisfies UuidBaseString;\n\nconst regexDef = {\n  1: /^[\\da-f]{8}-[\\da-f]{4}-1[\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}$/u,\n  2: /^[\\da-f]{8}-[\\da-f]{4}-2[\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}$/u,\n  3: /^[\\da-f]{8}-[\\da-f]{4}-3[\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}$/u,\n  4: /^[\\da-f]{8}-[\\da-f]{4}-4[\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}$/u,\n  5: /^[\\da-f]{8}-[\\da-f]{4}-5[\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}$/u,\n  6: /^[\\da-f]{8}-[\\da-f]{4}-6[\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}$/u,\n  7: /^[\\da-f]{8}-[\\da-f]{4}-7[\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}$/u,\n  8: /^[\\da-f]{8}-[\\da-f]{4}-8[\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}$/u,\n  loose: /^[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}$/u,\n  '1-8':\n    /^(?:[\\da-f]{8}-[\\da-f]{4}-[1-8][\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12})$/iu,\n} as const;\n\nconst uuidDef: ReadonlyRecord<\n  UuidVersion | UuidVersionAdditionalOption,\n  (s: string) => boolean\n> = {\n  1: (s) => regexDef[1].test(s),\n  2: (s) => regexDef[2].test(s),\n  3: (s) => regexDef[3].test(s),\n  4: (s) => regexDef[4].test(s),\n  5: (s) => regexDef[5].test(s),\n  6: (s) => regexDef[6].test(s),\n  7: (s) => regexDef[7].test(s),\n  8: (s) => regexDef[8].test(s),\n  nil: (s) => s === nilUuid,\n  max: (s) => s === maxUuid,\n  loose: (s) => regexDef.loose.test(s),\n  all: (s) => s === nilUuid || s === maxUuid || regexDef['1-8'].test(s),\n} as const;\n"],"names":[],"mappings":"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"}