{"version":3,"file":"PasswordError.mjs","sources":["../../../../../../../../../web/src/ui/components/molecules/PasswordError.tsx"],"sourcesContent":["import { msg, plural } from '@lingui/core/macro';\nimport { useLingui } from '@lingui/react/macro';\nimport { BootstrapData } from '@stytch/core';\nimport React from 'react';\n\nimport Column from '../atoms/Column';\nimport Typography from '../atoms/Typography';\nimport VisuallyHidden from '../atoms/VisuallyHidden';\nimport styles from './PasswordError.module.css';\nimport type { PasswordInputProps } from './PasswordInput';\nimport { PasswordStrengthCheck } from './PasswordStrengthCheck';\n\n// This list of warnings and suggestions should be exhaustive, and is pulled from https://github.com/stytchauth/zxcvbn/blob/main/feedback/feedback.go\nconst warnings = {\n  'Short keyboard patterns are easy to guess.': msg({\n    id: 'password.zxcvbn.warning.shortKeyboardPatterns',\n    message: 'Short keyboard patterns are easy to guess.',\n  }),\n  'Straight rows of keys are easy to guess.': msg({\n    id: 'password.zxcvbn.warning.straightRows',\n    message: 'Straight rows of keys are easy to guess.',\n  }),\n  'Repeats like \"aaa\" are easy to guess.': msg({\n    id: 'password.zxcvbn.warning.repeats',\n    message: 'Repeats like \"aaa\" are easy to guess.',\n  }),\n  'Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\".': msg({\n    id: 'password.zxcvbn.warning.longerRepeats',\n    message: 'Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\".',\n  }),\n  'Sequences like \"abc\" or \"6543\" are easy to guess.': msg({\n    id: 'password.zxcvbn.warning.sequences',\n    message: 'Sequences like \"abc\" or \"6543\" are easy to guess.',\n  }),\n  'Recent years are easy to guess.': msg({\n    id: 'password.zxcvbn.warning.recentYears',\n    message: 'Recent years are easy to guess.',\n  }),\n  'Dates are often easy to guess.': msg({\n    id: 'password.zxcvbn.warning.dates',\n    message: 'Dates are often easy to guess.',\n  }),\n  'This is a top-10 common password.': msg({\n    id: 'password.zxcvbn.warning.top10CommonPassword',\n    message: 'This is a top-10 common password.',\n  }),\n  'This is a top-100 common password.': msg({\n    id: 'password.zxcvbn.warning.top100CommonPassword',\n    message: 'This is a top-100 common password.',\n  }),\n  'This is a very common password.': msg({\n    id: 'password.zxcvbn.warning.veryCommonPassword',\n    message: 'This is a very common password.',\n  }),\n  'This is similar to a commonly used password.': msg({\n    id: 'password.zxcvbn.warning.similarToCommonPassword',\n    message: 'This is similar to a commonly used password.',\n  }),\n  'A word by itself is easy to guess.': msg({\n    id: 'password.zxcvbn.warning.wordByItself',\n    message: 'A word by itself is easy to guess.',\n  }),\n  'Names and surnames by themselves are easy to guess.': msg({\n    id: 'password.zxcvbn.warning.names',\n    message: 'Names and surnames by themselves are easy to guess.',\n  }),\n  'Common names and surnames are easy to guess.': msg({\n    id: 'password.zxcvbn.warning.commonNames',\n    message: 'Common names and surnames are easy to guess.',\n  }),\n};\n\nconst suggestions = {\n  'Use a few words, avoid common phrases.': msg({\n    id: 'password.zxcvbn.suggestion.useAFewWords',\n    message: 'Use a few words, avoid common phrases.',\n  }),\n  'No need for symbols, digits, or uppercase letters.': msg({\n    id: 'password.zxcvbn.suggestion.noSymbolsDigitsUppercase',\n    message: 'No need for symbols, digits, or uppercase letters.',\n  }),\n  'Add another word or two. Uncommon words are better.': msg({\n    id: 'password.zxcvbn.suggestion.addWords',\n    message: 'Add another word or two. Uncommon words are better.',\n  }),\n  'Use a longer keyboard pattern with more turns.': msg({\n    id: 'password.zxcvbn.suggestion.longerKeyboardPattern',\n    message: 'Use a longer keyboard pattern with more turns.',\n  }),\n  'Avoid repeated words and characters.': msg({\n    id: 'password.zxcvbn.suggestion.avoidRepeats',\n    message: 'Avoid repeated words and characters.',\n  }),\n  'Avoid sequences.': msg({\n    id: 'password.zxcvbn.suggestion.avoidSequences',\n    message: 'Avoid sequences.',\n  }),\n  'Avoid recent years.': msg({\n    id: 'password.zxcvbn.suggestion.avoidRecentYears',\n    message: 'Avoid recent years.',\n  }),\n  'Avoid years that are associated with you.': msg({\n    id: 'password.zxcvbn.suggestion.avoidYearsAssociatedWithYou',\n    message: 'Avoid years that are associated with you.',\n  }),\n  'Avoid dates and years that are associated with you.': msg({\n    id: 'password.zxcvbn.suggestion.avoidDatesAndYearsAssociatedWithYou',\n    message: 'Avoid dates and years that are associated with you.',\n  }),\n  \"Capitalization doesn't help very much.\": msg({\n    id: 'password.zxcvbn.suggestion.capitalization',\n    message: \"Capitalization doesn't help very much.\",\n  }),\n  'All-uppercase is almost as easy to guess as all-lowercase.': msg({\n    id: 'password.zxcvbn.suggestion.allUppercase',\n    message: 'All-uppercase is almost as easy to guess as all-lowercase.',\n  }),\n  \"Reversed words aren't much harder to guess.\": msg({\n    id: 'password.zxcvbn.suggestion.reversed',\n    message: \"Reversed words aren't much harder to guess.\",\n  }),\n  \"Predictable substitutions like '@' instead of 'a' don't help very much.\": msg({\n    id: 'password.zxcvbn.suggestion.predictableSubstitutions',\n    message: \"Predictable substitutions like '@' instead of 'a' don't help very much.\",\n  }),\n};\n\nconst labels = {\n  fulfilled: msg({ id: 'password.requirement.fulfilled', message: 'Fulfilled' }),\n  notFulfilled: msg({ id: 'password.requirement.notFulfilled', message: 'Not fulfilled' }),\n  warning: msg({ id: 'password.requirement.warning', message: 'Warning' }),\n  suggestion: msg({ id: 'password.requirement.suggestion', message: 'Suggestion' }),\n} as const;\n\nconst CrossIcon = () => (\n  <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path\n      d=\"M12.6667 4.27334L11.7267 3.33334L8.00001 7.06001L4.27334 3.33334L3.33334 4.27334L7.06001 8.00001L3.33334 11.7267L4.27334 12.6667L8.00001 8.94001L11.7267 12.6667L12.6667 11.7267L8.94001 8.00001L12.6667 4.27334Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\nconst CheckIcon = () => (\n  <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path\n      d=\"M5.86332 10.5833L3.08332 7.80333L2.13666 8.74333L5.86332 12.47L13.8633 4.47L12.9233 3.53L5.86332 10.5833Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n\nexport type PasswordErrorProps =\n  | {\n      policy: 'zxcvbn';\n      passwordInvalid: boolean;\n      passwordScore: number;\n      isPasswordBreached: boolean;\n      // zxcvbn will return 0-1 warnings\n      passwordWarning?: string;\n      // zxcvbn will return 1-n suggestions\n      passwordSuggestions: string[];\n    }\n  | {\n      policy: 'luds';\n      passwordInvalid: boolean;\n      isPasswordBreached: boolean;\n      missingCharacters: number;\n      missingComplexity: number;\n    }\n  | { policy: 'notLoaded' };\n\nconst PasswordStrengthItem = ({ children, type }: { children: string; type: keyof typeof labels }) => {\n  const { t } = useLingui();\n\n  // notFulfilled and warning both have the same icon and color, they only differ in label\n  const color =\n    type === 'suggestion'\n      ? undefined //\n      : type === 'fulfilled'\n        ? 'success'\n        : 'destructive';\n\n  const icon =\n    type === 'suggestion' ? (\n      <span role=\"presentation\" className={styles.bullet}></span>\n    ) : type === 'fulfilled' ? (\n      <CheckIcon />\n    ) : (\n      <CrossIcon />\n    );\n\n  return (\n    <Typography variant=\"helper\" className={styles.item} color={color} aria-atomic>\n      {icon}\n      <span>\n        <VisuallyHidden>{t(labels[type])}: </VisuallyHidden>\n        {children}\n      </span>\n    </Typography>\n  );\n};\n\nexport const PasswordError = ({ bootstrap, ...props }: PasswordErrorProps & { bootstrap: BootstrapData }) => {\n  const { t } = useLingui();\n  const complexity = bootstrap.passwordConfig?.ludsComplexity ?? 0;\n  const characterLength = bootstrap.passwordConfig?.ludsMinimumCount ?? 0;\n\n  if (props.policy === 'notLoaded') {\n    return null;\n  }\n\n  const { passwordInvalid, isPasswordBreached } = props;\n  const passwordBreachedWarning = isPasswordBreached ? (\n    <PasswordStrengthItem type=\"warning\">\n      {t({\n        id: 'password.strengthError.breached',\n        message:\n          'This password may have been used on a different site that experienced a security issue. Please choose another password.',\n      })}\n    </PasswordStrengthItem>\n  ) : null;\n\n  if (props.policy === 'zxcvbn') {\n    const { passwordScore, passwordWarning, passwordSuggestions } = props;\n\n    // The list of warnings and suggestions above should be exhaustive, but we'll fall back to the untranslated string just in case.\n    const translatedWarning = passwordWarning\n      ? (warnings[passwordWarning as keyof typeof warnings] ?? passwordWarning)\n      : null;\n    const uniqueSuggestions = [...new Set(passwordSuggestions)];\n    const translatedSuggestions = uniqueSuggestions.map(\n      (suggestion) => suggestions[suggestion as keyof typeof suggestions] ?? suggestion,\n    );\n\n    return (\n      <Column gap={1} aria-live=\"polite\">\n        <PasswordStrengthCheck score={passwordScore} />\n\n        <VisuallyHidden>\n          {passwordInvalid\n            ? t({ id: 'password.strength.notAccepted', message: 'Password not accepted.' })\n            : t({ id: 'password.strength.accepted', message: 'Password accepted.' })}\n        </VisuallyHidden>\n\n        <div>\n          {translatedWarning && <PasswordStrengthItem type=\"warning\">{t(translatedWarning)}</PasswordStrengthItem>}\n\n          {translatedSuggestions.map((suggestion) => (\n            <PasswordStrengthItem key={suggestion.id} type=\"suggestion\">\n              {t(suggestion)}\n            </PasswordStrengthItem>\n          ))}\n\n          {passwordBreachedWarning}\n        </div>\n      </Column>\n    );\n  }\n\n  const { missingCharacters, missingComplexity } = props;\n  return (\n    <div aria-live=\"polite\">\n      <VisuallyHidden>\n        {passwordInvalid\n          ? t({ id: 'password.strength.requirementsNotMet', message: 'Your password must meet all requirements.' })\n          : t({ id: 'password.strength.accepted', message: 'Password accepted.' })}\n      </VisuallyHidden>\n\n      <PasswordStrengthItem type={missingCharacters === 0 ? 'fulfilled' : 'notFulfilled'}>\n        {t({\n          id: 'password.strengthError.minimumLength',\n          message: plural(characterLength, {\n            one: 'Must be at least # character long',\n            other: 'Must be at least # characters long',\n          }),\n        })}\n      </PasswordStrengthItem>\n\n      <PasswordStrengthItem type={missingComplexity === 0 ? 'fulfilled' : 'notFulfilled'}>\n        {t({\n          id: 'password.strengthError.complexity',\n          message: plural(complexity, {\n            one: 'Must contain # of the following: uppercase letter, lowercase letter, number, symbol',\n            other: 'Must contain # of the following: uppercase letter, lowercase letter, number, symbol',\n          }),\n        })}\n      </PasswordStrengthItem>\n\n      {passwordBreachedWarning}\n    </div>\n  );\n};\n\nexport function getNewPasswordProps(bootstrap: BootstrapData, passwordPolicy: PasswordErrorProps['policy']) {\n  if (passwordPolicy === 'notLoaded' || passwordPolicy === 'zxcvbn' || bootstrap.passwordConfig == null) {\n    // passwordrules is currently only respected by password managers so this is a safe default\n    // we don't set minLength to avoid blocking\n    // https://developer.apple.com/password-rules/\n    return {\n      type: 'new' as const,\n      passwordrules: 'allowed: unicode; minlength: 10',\n    } satisfies Partial<PasswordInputProps>;\n  }\n\n  const { ludsComplexity, ludsMinimumCount } = bootstrap.passwordConfig;\n  const required = ['special', 'digit', 'upper', 'lower'].slice(0, ludsComplexity);\n  return {\n    type: 'new' as const,\n    minLength: ludsMinimumCount,\n    passwordrules: `allowed: unicode; minlength: ${ludsMinimumCount}; ${required.map((r) => `required: ${r}`).join('; ')}`,\n  } satisfies Partial<PasswordInputProps>;\n}\n"],"names":["warnings","suggestions","labels","fulfilled","notFulfilled","warning","suggestion","CrossIcon","React","svg","viewBox","fill","xmlns","path","d","CheckIcon","PasswordStrengthItem","children","type","useLingui","color","undefined","icon","span","role","className","styles","bullet","Typography","variant","item","aria-atomic","VisuallyHidden","PasswordError","bootstrap","props","complexity","passwordConfig","ludsComplexity","characterLength","ludsMinimumCount","policy","passwordInvalid","isPasswordBreached","passwordBreachedWarning","passwordScore","passwordWarning","passwordSuggestions","translatedWarning","uniqueSuggestions","Set","translatedSuggestions","map","Column","gap","aria-live","PasswordStrengthCheck","score","div","key","id","missingCharacters","missingComplexity","getNewPasswordProps","passwordPolicy","passwordrules","required","slice","minLength","r","join"],"mappings":"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"}