{"version":3,"file":"email.mjs","sources":["../../../../src/predefined/brand/string/email.mts"],"sourcesContent":["import { 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 e-mail address is always non-empty, so `Email` is branded on top of\n// `NonEmptyString` and is assignable to it.\nexport type Email = Brand<NonEmptyString, 'Email'>;\n\n/**\n * @link https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address\n */\nexport const email = (\n  options?: Partial<\n    Readonly<{\n      defaultValue: string;\n    }>\n  >,\n): Type<Email> =>\n  brand<NonEmptyString, readonly ['Email']>({\n    baseType: string(options?.defaultValue ?? defaultEmail, {\n      nonempty: true,\n    }),\n    is: (s): s is Email => regexpEmailAddress.test(s),\n    brandKeys: ['Email'],\n    typeName: 'Email',\n  });\n\nconst defaultEmail = 'ts-f.o.r.t.r.e.s.s@gmail.com';\n\nconst regexpEmailAddress =\n  // eslint-disable-next-line security/detect-unsafe-regex\n  /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/u;\n\nif (import.meta.vitest !== undefined) {\n  test('defaultEmail', () => {\n    expect(defaultEmail).toMatch(regexpEmailAddress);\n  });\n}\n"],"names":[],"mappings":";;;;;;AAYO,MAAM,KAAA,GAAQ,CACnB,OAAA,KAMA,KAAA,CAA0C;AAAA,EACxC,QAAA,EAAU,MAAA,CAAO,OAAA,EAAS,YAAA,IAAgB,YAAA,EAAc;AAAA,IACtD,QAAA,EAAU;AAAA,GACX,CAAA;AAAA,EACD,EAAA,EAAI,CAAC,CAAA,KAAkB,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,EAChD,SAAA,EAAW,CAAC,OAAO,CAAA;AAAA,EACnB,QAAA,EAAU;AACZ,CAAC;AAEH,MAAM,YAAA,GAAe,8BAAA;AAErB,MAAM,kBAAA;AAAA;AAAA,EAEJ;AAAA,CAAA;;;;"}