{"version":3,"file":"PasswordPolicy-Xqa3Ye_O.js","sources":["../../src/components/shared/PasswordField.tsx","../../src/components/shared/PasswordErrors.tsx","../../src/utils/passwordValidation.ts","../../src/components/shared/PasswordPolicy/PasswordRule.tsx","../../src/components/shared/PasswordPolicy/PasswordPolicy.tsx"],"sourcesContent":["import { FunctionComponent, useState, useCallback } from 'react';\nimport {\n Lock as LockIcon,\n Visibility as VisibilityIcon,\n VisibilityOff as VisibilityOffIcon,\n} from '@mui/icons-material';\nimport { TextField, IconButton, InputAdornment, TextFieldProps } from '@mui/material';\n\ntype PasswordFieldProps = Omit;\n\nexport const PasswordField: FunctionComponent = ({ inputProps, InputProps, ...rest }) => {\n const [visible, setVisible] = useState(false);\n\n const toggleVisibility = useCallback(() => setVisible((prevState) => !prevState), []);\n /*\n Disclaimer:\n\n My intentions are for parent components that call this to not pass type or adornment props.\n The ideal solution would be to Omit those attributes from the input props, but Material-ui's\n `TextFieldProps` type is a mess of unions. They clash and omitting doesn't work.\n The spreads below are to guarantee that those props don't get overwritten.\n */\n const {\n type: inputPropsType,\n // using underscore to differentiate between inputProps and InputProps\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ...remaining_inputProps\n } = inputProps ?? {};\n\n const {\n type: InputPropsType,\n startAdornment,\n endAdornment,\n // using underscore to differentiate between inputProps and InputProps\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ...remaining_InputProps\n } = InputProps ?? {};\n\n return (\n \n \n \n ),\n endAdornment: (\n \n \n {visible ? : }\n \n \n ),\n }}\n />\n );\n};\n","import { FunctionComponent } from 'react';\nimport { GraphQLError } from 'graphql';\nimport styled from '@emotion/styled';\nimport { APIErrorCode } from 'utils/APIErrorCodes/APIErrorCode';\n\nimport { useExtendedIntl } from 'hooks/useExtendedIntl';\nimport { APIErrorCodesCatalog } from 'utils/APIErrorCodes/APIErrorCodesCatalog';\nimport { Typography } from '@mui/material';\n\nconst StyledDiv = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n`;\n\ninterface PasswordErrorsProps {\n className?: string;\n graphQLErrors: readonly GraphQLError[];\n}\n\nexport const PasswordErrors: FunctionComponent = ({ className, graphQLErrors }) => {\n const { formatAPIErrorCode } = useExtendedIntl();\n\n if (!graphQLErrors.length) {\n return null;\n }\n\n const { PasswordTooCommon, PasswordSimilarWithUserData, PasswordEntirelyNumeric, PasswordTooShort } = APIErrorCode;\n\n const errorsCatalog = new APIErrorCodesCatalog(graphQLErrors);\n\n return (\n \n {errorsCatalog.hasErrorCode(PasswordTooShort) && (\n {formatAPIErrorCode({ errorCode: PasswordTooShort, data: {} })}\n )}\n {errorsCatalog.hasErrorCode(PasswordEntirelyNumeric) && (\n {formatAPIErrorCode({ errorCode: PasswordEntirelyNumeric, data: {} })}\n )}\n {errorsCatalog.hasErrorCode(PasswordTooCommon) && (\n {formatAPIErrorCode({ errorCode: PasswordTooCommon, data: {} })}\n )}\n {errorsCatalog.hasErrorCode(PasswordSimilarWithUserData) && (\n \n {formatAPIErrorCode({ errorCode: PasswordSimilarWithUserData, data: {} })}\n \n )}\n \n );\n};\n","const PASSWORD_MIN_LENGTH = 8;\nconst ONE_OR_MORE_NUMBERS_REGEX = new RegExp(/\\d+/);\nconst ONE_OR_MORE_LETTERS_REGEX = new RegExp(/[a-zA-Z]+/);\n\nexport function validatePasswordLength(password: string): boolean {\n return password.length >= PASSWORD_MIN_LENGTH;\n}\n\nexport function validatePasswordLetterAndNumber(password: string): boolean {\n return ONE_OR_MORE_NUMBERS_REGEX.test(password) && ONE_OR_MORE_LETTERS_REGEX.test(password);\n}\n\nexport function validatePassword(password: string): boolean {\n return validatePasswordLength(password) && validatePasswordLetterAndNumber(password);\n}\n","import { FunctionComponent } from 'react';\nimport { Circle as CircleIcon, CheckCircle as CheckCircleIcon } from '@mui/icons-material';\nimport styled from '@emotion/styled';\nimport { blueGrey } from '@mui/material/colors';\nimport { Typography } from '@mui/material';\n\nconst StyledDiv = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst StyledTypography = styled(Typography)`\n margin-left: 0.5rem;\n`;\n\ninterface PasswordRuleProps {\n className?: string;\n valid: boolean;\n}\n\nexport const PasswordRule: FunctionComponent = ({ className, valid, children }) => (\n \n {valid ? (\n \n ) : (\n \n )}\n \n {children}\n \n \n);\n","import { FunctionComponent } from 'react';\nimport styled from '@emotion/styled';\nimport { useExtendedIntl } from 'hooks/useExtendedIntl';\nimport { validatePasswordLetterAndNumber, validatePasswordLength } from 'utils/passwordValidation';\n\nimport { PasswordRule } from './PasswordRule';\n\nimport { Typography, List, ListItem, ListItemTypeMap } from '@mui/material';\nimport { OverridableComponent } from '@mui/material/OverridableComponent';\n\nconst StyledList = styled(List)`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nconst StyledListItem = styled>>(ListItem)`\n padding-left: unset;\n padding-right: unset;\n`;\n\ninterface PasswordPolicyProps {\n className?: string;\n password: string;\n}\n\nexport const PasswordPolicy: FunctionComponent = ({ password, className }) => {\n const { formatMessage } = useExtendedIntl();\n\n const validLength = validatePasswordLength(password);\n const validLettersAndNumbers = validatePasswordLetterAndNumber(password);\n\n return (\n
\n \n {formatMessage({ id: 'shared.password-policy.paragraph' }, { b: (...chunks: unknown[]) => {chunks} })}\n \n \n \n \n {formatMessage({ id: 'shared.password-policy.password-rule.length' })}\n \n \n \n \n {formatMessage({ id: 'shared.password-policy.password-rule.letter-and-number' })}\n \n \n \n
\n );\n};\n"],"names":["PasswordField","inputProps","InputProps","rest","visible","setVisible","useState","toggleVisibility","useCallback","prevState","inputPropsType","remaining_inputProps","InputPropsType","startAdornment","endAdornment","remaining_InputProps","jsx","TextField","InputAdornment","LockIcon","IconButton","VisibilityOffIcon","VisibilityIcon","StyledDiv","styled","PasswordErrors","className","graphQLErrors","formatAPIErrorCode","useExtendedIntl","PasswordTooCommon","PasswordSimilarWithUserData","PasswordEntirelyNumeric","PasswordTooShort","APIErrorCode","errorsCatalog","APIErrorCodesCatalog","jsxs","Typography","PASSWORD_MIN_LENGTH","ONE_OR_MORE_NUMBERS_REGEX","ONE_OR_MORE_LETTERS_REGEX","validatePasswordLength","password","validatePasswordLetterAndNumber","validatePassword","StyledTypography","PasswordRule","valid","children","CheckCircleIcon","CircleIcon","blueGrey","StyledList","List","StyledListItem","ListItem","PasswordPolicy","formatMessage","validLength","validLettersAndNumbers","chunks"],"mappings":"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"}