{"version":3,"file":"strong.mjs","names":[],"sources":["../../../../../../../react-form/src/rules/strong.ts"],"sourcesContent":["import { trans } from \"@mongez/localization\";\nimport { ReactNode } from \"react\";\nimport { type InputRule } from \"../types\";\n\n/**\n * Configurable strong-password criteria.\n *\n * Pass as the value of the `strong` prop on a form control:\n *\n * - `<TextInput strong />`                  — apply all defaults\n * - `<TextInput strong={{ symbol: false }}` — selectively disable a criterion\n * - `<TextInput strong={{ minLength: 10 }}` — override a numeric criterion\n */\nexport type StrongPasswordCriteria = {\n  /**\n   * Minimum password length. Set to 0 (or falsy) to disable the length check.\n   * @default 8\n   */\n  minLength?: number;\n  /**\n   * Require at least one uppercase letter (A-Z).\n   * @default true\n   */\n  uppercase?: boolean;\n  /**\n   * Require at least one lowercase letter (a-z).\n   * @default true\n   */\n  lowercase?: boolean;\n  /**\n   * Require at least one digit (0-9).\n   * @default true\n   */\n  digit?: boolean;\n  /**\n   * Require at least one non-alphanumeric character.\n   * @default true\n   */\n  symbol?: boolean;\n};\n\nconst defaultCriteria: Required<StrongPasswordCriteria> = {\n  minLength: 8,\n  uppercase: true,\n  lowercase: true,\n  digit: true,\n  symbol: true,\n};\n\n/**\n * Validates a strong password against five composable criteria:\n *\n *   - `strong.minLength` — minimum length (default 8)\n *   - `strong.uppercase` — at least one uppercase letter\n *   - `strong.lowercase` — at least one lowercase letter\n *   - `strong.digit`     — at least one digit\n *   - `strong.symbol`    — at least one non-alphanumeric character\n *\n * Each failing criterion is also written individually into\n * `formControl.errorsList` under the namespaced key (e.g. `strong.uppercase`)\n * so consumers can render per-criterion password-strength checklists.\n *\n * The rule's primary `error` (consumed by the hook into `errorsList.strong`) is\n * the first failing message — same convention as every other rule.\n *\n * Requires `type=\"password\"`. Activated by passing the `strong` prop:\n *\n * ```tsx\n * <TextInput type=\"password\" name=\"password\" strong required minLength={8} />\n * <TextInput type=\"password\" name=\"password\" strong={{ symbol: false }} />\n * ```\n */\nexport const strongRule: InputRule = {\n  name: \"strong\",\n  preservedProps: [\"strong\"],\n  requiresType: \"password\",\n  validate: ({ value, strong, formControl, errorKeys }) => {\n    if (!strong) return;\n\n    const criteria: Required<StrongPasswordCriteria> =\n      strong === true ? defaultCriteria : { ...defaultCriteria, ...strong };\n\n    const stringValue = typeof value === \"string\" ? value : \"\";\n    const failures: ReactNode[] = [];\n\n    const fail = (key: string, message: ReactNode) => {\n      formControl.errorsList[`strong.${key}`] = message;\n      failures.push(message);\n    };\n\n    if (criteria.minLength && stringValue.length < criteria.minLength) {\n      fail(\n        \"minLength\",\n        trans(\"validation.strongMinLength\", {\n          input: errorKeys.name,\n          length: criteria.minLength,\n        })\n      );\n    }\n\n    if (criteria.uppercase && !/[A-Z]/.test(stringValue)) {\n      fail(\n        \"uppercase\",\n        trans(\"validation.strongUppercase\", { input: errorKeys.name })\n      );\n    }\n\n    if (criteria.lowercase && !/[a-z]/.test(stringValue)) {\n      fail(\n        \"lowercase\",\n        trans(\"validation.strongLowercase\", { input: errorKeys.name })\n      );\n    }\n\n    if (criteria.digit && !/\\d/.test(stringValue)) {\n      fail(\n        \"digit\",\n        trans(\"validation.strongDigit\", { input: errorKeys.name })\n      );\n    }\n\n    if (criteria.symbol && !/[^A-Za-z0-9]/.test(stringValue)) {\n      fail(\n        \"symbol\",\n        trans(\"validation.strongSymbol\", { input: errorKeys.name })\n      );\n    }\n\n    if (failures.length > 0) {\n      return failures[0];\n    }\n  },\n};\n"],"mappings":";;;AAyCA,MAAM,kBAAoD;CACxD,WAAW;CACX,WAAW;CACX,WAAW;CACX,OAAO;CACP,QAAQ;AACV;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAa,aAAwB;CACnC,MAAM;CACN,gBAAgB,CAAC,QAAQ;CACzB,cAAc;CACd,WAAW,EAAE,OAAO,QAAQ,aAAa,gBAAgB;EACvD,IAAI,CAAC,QAAQ;EAEb,MAAM,WACJ,WAAW,OAAO,kBAAkB;GAAE,GAAG;GAAiB,GAAG;EAAO;EAEtE,MAAM,cAAc,OAAO,UAAU,WAAW,QAAQ;EACxD,MAAM,WAAwB,CAAC;EAE/B,MAAM,QAAQ,KAAa,YAAuB;GAChD,YAAY,WAAW,UAAU,SAAS;GAC1C,SAAS,KAAK,OAAO;EACvB;EAEA,IAAI,SAAS,aAAa,YAAY,SAAS,SAAS,WACtD,KACE,aACA,MAAM,8BAA8B;GAClC,OAAO,UAAU;GACjB,QAAQ,SAAS;EACnB,CAAC,CACH;EAGF,IAAI,SAAS,aAAa,CAAC,QAAQ,KAAK,WAAW,GACjD,KACE,aACA,MAAM,8BAA8B,EAAE,OAAO,UAAU,KAAK,CAAC,CAC/D;EAGF,IAAI,SAAS,aAAa,CAAC,QAAQ,KAAK,WAAW,GACjD,KACE,aACA,MAAM,8BAA8B,EAAE,OAAO,UAAU,KAAK,CAAC,CAC/D;EAGF,IAAI,SAAS,SAAS,CAAC,KAAK,KAAK,WAAW,GAC1C,KACE,SACA,MAAM,0BAA0B,EAAE,OAAO,UAAU,KAAK,CAAC,CAC3D;EAGF,IAAI,SAAS,UAAU,CAAC,eAAe,KAAK,WAAW,GACrD,KACE,UACA,MAAM,2BAA2B,EAAE,OAAO,UAAU,KAAK,CAAC,CAC5D;EAGF,IAAI,SAAS,SAAS,GACpB,OAAO,SAAS;CAEpB;AACF"}