@mittwald/flow-react-components 0.2.0-alpha.896 → 0.2.0-alpha.897
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +226 -0
- package/CHANGELOG.md +6 -0
- package/CLAUDE.md +1 -0
- package/dist/assets/doc-properties.json +7002 -7002
- package/dist/css/all.css +1 -1
- package/dist/js/@mittwald/password-tools-js.mjs +2 -2
- package/dist/js/_virtual/_.locale.json@95341064edeb0e38b66d786dbd62955c.mjs +2 -2
- package/dist/js/packages/components/src/components/PasswordCreationField/PasswordCreationField.mjs +31 -18
- package/dist/js/packages/components/src/components/PasswordCreationField/PasswordCreationField.mjs.map +1 -1
- package/dist/js/packages/components/src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.mjs +26 -37
- package/dist/js/packages/components/src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.mjs.map +1 -1
- package/dist/js/packages/components/src/components/PasswordCreationField/lib/generateValidationTranslation.mjs +2 -2
- package/dist/js/packages/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs +5 -5
- package/dist/js/packages/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs.map +1 -1
- package/dist/js/packages/components/src/components/PasswordCreationField/lib/usePolicyValidationResult.mjs +25 -42
- package/dist/js/packages/components/src/components/PasswordCreationField/lib/usePolicyValidationResult.mjs.map +1 -1
- package/dist/js/packages/components/src/components/PasswordCreationField/worker/generatePassword.mjs +2 -2
- package/dist/js/packages/components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs +3 -0
- package/dist/js/packages/components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs.map +1 -1
- package/dist/js/packages/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs +3 -3
- package/dist/js/packages/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs.map +1 -1
- package/dist/js/packages/design-tokens/dist/json/all-dark.json.mjs +1 -1
- package/dist/js/packages/design-tokens/dist/json/all-light.json.mjs +1 -1
- package/dist/types/components/PasswordCreationField/PasswordCreationField.d.ts.map +1 -1
- package/dist/types/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.d.ts.map +1 -1
- package/dist/types/components/PasswordCreationField/lib/usePolicyValidationResult.d.ts.map +1 -1
- package/dist/types/components/PasswordCreationField/stories/Default.stories.d.ts +1 -1
- package/dist/types/components/PasswordCreationField/stories/Default.stories.d.ts.map +1 -1
- package/dist/types/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.d.ts +1 -1
- package/dist/types/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.d.ts.map +1 -1
- package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts +2 -2
- package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts.map +1 -1
- package/dist/types/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.d.ts +1 -1
- package/dist/types/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.d.ts.map +1 -1
- package/dist/types/lib/theming/hooks/useDesignTokens.d.ts +48 -0
- package/dist/types/lib/theming/hooks/useDesignTokens.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
export { defaultPasswordCreationPolicy } from '../packages/components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
4
|
-
export { generatePasswordCreationFieldValidation, usePasswordCreationFieldValidation } from '../packages/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs';
|
|
5
3
|
export { Policy } from '@mittwald/password-tools-js/policy';
|
|
6
4
|
export { RegexFlags, Rule, RuleType, SequenceType } from '@mittwald/password-tools-js/rules';
|
|
7
5
|
export { Generator } from '@mittwald/password-tools-js/generator';
|
|
6
|
+
export { defaultPasswordCreationPolicy } from '../packages/components/src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
7
|
+
export { generatePasswordCreationFieldValidation, usePasswordCreationFieldValidation } from '../packages/components/src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.mjs';
|
|
8
8
|
//# sourceMappingURL=password-tools-js.mjs.map
|
|
@@ -28,7 +28,7 @@ const locales = {"de-DE":{
|
|
|
28
28
|
"validation.general.securePassword": "Sehr gut! Dein Passwort ist sicher.",
|
|
29
29
|
"validation.general.short.unspecified": "Keine spezifischen Anforderungen",
|
|
30
30
|
"validation.hibp": "{isValid, select, true {Das Passwort ist nicht kompromittiert.} other {Das Passwort ist kompromittiert. Bitte vergib ein neues.}}",
|
|
31
|
-
"validation.hibp.short": "{isValid, select, true {Nicht kompromittiert} other {
|
|
31
|
+
"validation.hibp.short": "{isValid, select, true {Nicht kompromittiert} other {Nicht kompromittiert}}",
|
|
32
32
|
"validation.length.max": "{max, plural, one {Bitte wähle ein Passwort mit maximal einem Zeichen.} other {Bitte wähle ein Passwort mit maximal {max} Zeichen.}}",
|
|
33
33
|
"validation.length.max.short": "{max, plural, one {Maximal ein Zeichen} other {Maximal {max} Zeichen}}",
|
|
34
34
|
"validation.length.min": "{min, plural, one {Bitte wähle ein Passwort mit mindestens einem Zeichen.} other {Bitte wähle ein Passwort mit mindestens {min} Zeichen.}}",
|
|
@@ -68,7 +68,7 @@ const locales = {"de-DE":{
|
|
|
68
68
|
"validation.general.securePassword": "Awesome! Your password is secure.",
|
|
69
69
|
"validation.general.short.unspecified": "No specific requirements",
|
|
70
70
|
"validation.hibp": "{isValid, select, true {The password is not compromised.} other {The password has been compromised. Please set a new one.}}",
|
|
71
|
-
"validation.hibp.short": "{isValid, select, true {Not compromised} other {
|
|
71
|
+
"validation.hibp.short": "{isValid, select, true {Not compromised} other {Not compromised}}",
|
|
72
72
|
"validation.length.max": "{max, plural, one {Please choose a password with a maximum of one character.} other {Please choose a password with a maximum of {max} characters.}}",
|
|
73
73
|
"validation.length.max.short": "{max, plural, one {Maximum one character} other {Maximum {max} characters}}",
|
|
74
74
|
"validation.length.min": "{min, plural, one {Please choose a password with at least one character.} other {Please choose a password with at least {min} characters.}}",
|
package/dist/js/packages/components/src/components/PasswordCreationField/PasswordCreationField.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
3
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
|
-
import {
|
|
4
|
+
import { useMemo, useState, useRef } from 'react';
|
|
5
5
|
import { dynamic } from '../../lib/propsContext/dynamicProps/dynamic.mjs';
|
|
6
6
|
import '../../lib/propsContext/propsContext.mjs';
|
|
7
7
|
import { PropsContextProvider } from '../../lib/propsContext/components/PropsContextProvider.mjs';
|
|
@@ -21,10 +21,10 @@ import { generatePassword } from './worker/generatePassword.mjs';
|
|
|
21
21
|
import { TogglePasswordVisibilityButton } from './components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton.mjs';
|
|
22
22
|
import { ValidationResultButton } from './components/ValidationResultButton/ValidationResultButton.mjs';
|
|
23
23
|
import { PasswordGenerateButton } from './components/PasswordGenerateButton/PasswordGenerateButton.mjs';
|
|
24
|
-
import { defaultPasswordCreationPolicy } from '../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
25
24
|
import { Policy } from '@mittwald/password-tools-js/policy';
|
|
26
25
|
import '@mittwald/password-tools-js/rules';
|
|
27
26
|
import '@mittwald/password-tools-js/generator';
|
|
27
|
+
import { defaultPasswordCreationPolicy } from '../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
28
28
|
import { usePolicyValidationResult } from './lib/usePolicyValidationResult.mjs';
|
|
29
29
|
import { useFieldComponent } from '../../lib/hooks/useFieldComponent.mjs';
|
|
30
30
|
import { FieldError } from '../FieldError/FieldError.mjs';
|
|
@@ -53,7 +53,6 @@ const PasswordCreationField = flowComponent(
|
|
|
53
53
|
fieldProps,
|
|
54
54
|
fieldPropsContext
|
|
55
55
|
} = useFieldComponent(props, "PasswordCreationField");
|
|
56
|
-
const [isLoading, setIsLoading] = useState(false);
|
|
57
56
|
const translate = useLocalizedStringFormatter(
|
|
58
57
|
locales,
|
|
59
58
|
"PasswordCreationField"
|
|
@@ -62,10 +61,9 @@ const PasswordCreationField = flowComponent(
|
|
|
62
61
|
() => Policy.fromDeclaration(validationPolicyFromProps),
|
|
63
62
|
[validationPolicyFromProps]
|
|
64
63
|
);
|
|
65
|
-
const deferredValue = useDeferredValue(value ?? "");
|
|
66
64
|
const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);
|
|
67
65
|
const initialPolicyValidationState = {
|
|
68
|
-
isValid:
|
|
66
|
+
isValid: "indeterminate",
|
|
69
67
|
complexity: {
|
|
70
68
|
min: validationPolicy.minComplexity,
|
|
71
69
|
actual: 4,
|
|
@@ -76,16 +74,25 @@ const PasswordCreationField = flowComponent(
|
|
|
76
74
|
const [policyValidationResult, setPolicyValidationResult] = useState(
|
|
77
75
|
initialPolicyValidationState
|
|
78
76
|
);
|
|
77
|
+
const loadingRef = useRef(null);
|
|
79
78
|
usePolicyValidationResult(
|
|
80
79
|
validationPolicy,
|
|
81
|
-
|
|
80
|
+
value ?? "",
|
|
82
81
|
() => {
|
|
83
82
|
if (isEmptyValue) {
|
|
84
83
|
return;
|
|
85
84
|
}
|
|
86
|
-
|
|
85
|
+
loadingRef.current = setTimeout(() => {
|
|
86
|
+
setPolicyValidationResult((r) => ({
|
|
87
|
+
...r,
|
|
88
|
+
isValid: "indeterminate"
|
|
89
|
+
}));
|
|
90
|
+
}, 150);
|
|
87
91
|
},
|
|
88
92
|
({ password, isValid, results }) => {
|
|
93
|
+
if (loadingRef.current) {
|
|
94
|
+
clearTimeout(loadingRef.current);
|
|
95
|
+
}
|
|
89
96
|
if (isEmptyValue) {
|
|
90
97
|
setPolicyValidationResult(() => ({
|
|
91
98
|
...results,
|
|
@@ -93,7 +100,6 @@ const PasswordCreationField = flowComponent(
|
|
|
93
100
|
}));
|
|
94
101
|
return;
|
|
95
102
|
}
|
|
96
|
-
setIsLoading(() => false);
|
|
97
103
|
setPolicyValidationResult(() => results);
|
|
98
104
|
onValidationResult?.({ password, isValid });
|
|
99
105
|
}
|
|
@@ -114,19 +120,25 @@ const PasswordCreationField = flowComponent(
|
|
|
114
120
|
);
|
|
115
121
|
}
|
|
116
122
|
const isValidFromValidationResult = !isEmptyValue && stateFromValidationResult?.isValid;
|
|
117
|
-
const isInvalidFromValidationResult = !isEmptyValue &&
|
|
123
|
+
const isInvalidFromValidationResult = !isEmptyValue && stateFromValidationResult?.isValid === false;
|
|
118
124
|
const isInvalid = invalidFromProps || isInvalidFromValidationResult;
|
|
119
125
|
const setOptimisticPolicyValidationResult = (state = {}) => {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
...state
|
|
124
|
-
isValid: true
|
|
126
|
+
setPolicyValidationResult((currentState) => ({
|
|
127
|
+
...currentState,
|
|
128
|
+
isValid: true,
|
|
129
|
+
...state
|
|
125
130
|
}));
|
|
126
131
|
};
|
|
127
132
|
const onPasswordGenerateHandler = async () => {
|
|
128
133
|
const generatedPassword = await generatePassword(validationPolicy);
|
|
129
|
-
setOptimisticPolicyValidationResult(
|
|
134
|
+
setOptimisticPolicyValidationResult({
|
|
135
|
+
...initialPolicyValidationState,
|
|
136
|
+
isValid: true,
|
|
137
|
+
ruleResults: policyValidationResult.ruleResults.map((r) => ({
|
|
138
|
+
...r,
|
|
139
|
+
isValid: true
|
|
140
|
+
}))
|
|
141
|
+
});
|
|
130
142
|
setIsPasswordRevealed(true);
|
|
131
143
|
onChange(generatedPassword);
|
|
132
144
|
};
|
|
@@ -204,7 +216,7 @@ const PasswordCreationField = flowComponent(
|
|
|
204
216
|
isRequired,
|
|
205
217
|
children: [
|
|
206
218
|
/* @__PURE__ */ jsxs(FieldErrorCaptureContext, { children: [
|
|
207
|
-
/* @__PURE__ */ jsx(FieldError, { children: latestValidationErrorText }),
|
|
219
|
+
latestValidationErrorText && /* @__PURE__ */ jsx(FieldError, { children: latestValidationErrorText }),
|
|
208
220
|
/* @__PURE__ */ jsxs(
|
|
209
221
|
PropsContextProvider,
|
|
210
222
|
{
|
|
@@ -247,10 +259,11 @@ const PasswordCreationField = flowComponent(
|
|
|
247
259
|
ComplexityIndicator,
|
|
248
260
|
{
|
|
249
261
|
isEmptyValue,
|
|
250
|
-
isLoading,
|
|
262
|
+
isLoading: policyValidationResult.isValid === "indeterminate",
|
|
251
263
|
policyValidationResult,
|
|
252
264
|
validationResultState: stateFromValidationResult
|
|
253
|
-
}
|
|
265
|
+
},
|
|
266
|
+
value
|
|
254
267
|
)
|
|
255
268
|
]
|
|
256
269
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport styles from \"./PasswordCreationField.module.scss\";\nimport * as Aria from \"react-aria-components\";\nimport clsx from \"clsx\";\nimport { type ActionFn } from \"@/components/Action\";\nimport getStateFromLatestPolicyValidationResult from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\nimport locales from \"./locales/*.locale.json\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport {\n defaultPasswordCreationPolicy,\n Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\nimport { useFieldComponent } from \"@/lib/hooks/useFieldComponent\";\nimport { FieldError } from \"@/components/FieldError\";\nimport { useControlledHostValueProps } from \"@/lib/remote/useControlledHostValueProps\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider/useLocalizedStringFormatter\";\nimport { UiComponentTunnelExit } from \"../UiComponentTunnel/UiComponentTunnelExit\";\n\nexport interface PasswordCreationFieldProps\n extends\n PropsWithChildren<\n Omit<Aria.TextFieldProps, \"children\" | \"value\" | \"defaultValue\"> &\n Partial<Pick<Aria.FieldErrorRenderProps, \"validationErrors\">>\n >,\n FlowComponentProps<HTMLInputElement> {\n value?: string;\n onValidationResult?: (result: { password: string; isValid: boolean }) => void;\n defaultValue?: string;\n placeholder?: string;\n validationPolicy?: PolicyGenericDeclaration;\n}\n\nexport interface ResolvedPolicyValidationResult extends Omit<\n PolicyValidationResult,\n \"isValid\"\n> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/** @flr-generate all */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n value,\n onChange,\n ...rest\n } = useControlledHostValueProps(props);\n\n const {\n FieldErrorView,\n FieldErrorCaptureContext,\n fieldProps,\n fieldPropsContext,\n } = useFieldComponent(props, \"PasswordCreationField\");\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedStringFormatter(\n locales,\n \"PasswordCreationField\",\n );\n\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const deferredValue = useDeferredValue(value ?? \"\");\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: true,\n complexity: {\n min: validationPolicy.minComplexity,\n actual: 4,\n warning: null,\n },\n ruleResults: [],\n };\n\n const [policyValidationResult, setPolicyValidationResult] = useState(\n initialPolicyValidationState,\n );\n usePolicyValidationResult(\n validationPolicy,\n deferredValue,\n () => {\n if (isEmptyValue) {\n return;\n }\n\n setIsLoading(() => true);\n },\n ({ password, isValid, results }) => {\n if (isEmptyValue) {\n setPolicyValidationResult(() => ({\n ...results,\n isValid: true,\n }));\n return;\n }\n\n setIsLoading(() => false);\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const isEmptyValue = !value;\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\n isEmptyValue,\n policyValidationResult,\n );\n let latestValidationErrorText = undefined;\n if (stateFromValidationResult) {\n const [translationKey, translationValues] = generateValidationTranslation(\n stateFromValidationResult,\n );\n latestValidationErrorText = translate.format(\n translationKey,\n translationValues,\n );\n }\n\n const isValidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid;\n const isInvalidFromValidationResult =\n !isEmptyValue && !stateFromValidationResult?.isValid;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => ({\n ...initialPolicyValidationState,\n ...state,\n isValid: true,\n }));\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n onChange(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData?.getData(\"text\");\n if (typeof pastedValue === \"string\" && pastedValue !== value) {\n setOptimisticPolicyValidationResult({\n isValid: \"indeterminate\",\n });\n }\n };\n\n const togglePasswordVisibilityHandler = () => {\n setIsPasswordRevealed((old) => !old);\n };\n\n const propsContext: PropsContext = {\n ...fieldPropsContext,\n Button: {\n tunnel: {\n id: \"button\",\n component: \"PasswordCreationField\",\n },\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnel: {\n id: \"button\",\n component: \"PasswordCreationField\",\n },\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n ...fieldPropsContext.Label,\n children: dynamic((localProps) => {\n return (\n <>\n {localProps.children}\n <PasswordGenerateButton\n isDisabled={isDisabled}\n onGeneratePasswordAction={onPasswordGenerateHandler}\n />\n <ValidationResultButton\n isEmptyValue={isEmptyValue}\n isDisabled={isDisabled}\n policyValidationResult={policyValidationResult}\n />\n </>\n );\n }),\n },\n };\n\n return (\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={onChange}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, fieldProps.className)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <FieldErrorCaptureContext>\n <FieldError>{latestValidationErrorText}</FieldError>\n <PropsContextProvider\n props={propsContext}\n dependencies={[\n isDisabled,\n isRequired,\n value,\n policyValidationResult,\n isEmptyValue,\n ]}\n >\n {children}\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <Aria.Input ref={ref} className={styles.input} />\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <UiComponentTunnelExit\n id=\"button\"\n component=\"PasswordCreationField\"\n />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n </PropsContextProvider>\n </FieldErrorCaptureContext>\n <FieldErrorView />\n </Aria.TextField>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useMemo,\n useRef,\n} from \"react\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport {\n flowComponent,\n type FlowComponentProps,\n} from \"@/lib/componentFactory/flowComponent\";\nimport styles from \"./PasswordCreationField.module.scss\";\nimport * as Aria from \"react-aria-components\";\nimport clsx from \"clsx\";\nimport { type ActionFn } from \"@/components/Action\";\nimport getStateFromLatestPolicyValidationResult from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\nimport locales from \"./locales/*.locale.json\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport {\n defaultPasswordCreationPolicy,\n Policy,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\nimport { useFieldComponent } from \"@/lib/hooks/useFieldComponent\";\nimport { FieldError } from \"@/components/FieldError\";\nimport { useControlledHostValueProps } from \"@/lib/remote/useControlledHostValueProps\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider/useLocalizedStringFormatter\";\nimport { UiComponentTunnelExit } from \"../UiComponentTunnel/UiComponentTunnelExit\";\n\nexport interface PasswordCreationFieldProps\n extends\n PropsWithChildren<\n Omit<Aria.TextFieldProps, \"children\" | \"value\" | \"defaultValue\"> &\n Partial<Pick<Aria.FieldErrorRenderProps, \"validationErrors\">>\n >,\n FlowComponentProps<HTMLInputElement> {\n value?: string;\n onValidationResult?: (result: { password: string; isValid: boolean }) => void;\n defaultValue?: string;\n placeholder?: string;\n validationPolicy?: PolicyGenericDeclaration;\n}\n\nexport interface ResolvedPolicyValidationResult extends Omit<\n PolicyValidationResult,\n \"isValid\"\n> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/** @flr-generate all */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n value,\n onChange,\n ...rest\n } = useControlledHostValueProps(props);\n\n const {\n FieldErrorView,\n FieldErrorCaptureContext,\n fieldProps,\n fieldPropsContext,\n } = useFieldComponent(props, \"PasswordCreationField\");\n\n const translate = useLocalizedStringFormatter(\n locales,\n \"PasswordCreationField\",\n );\n\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: \"indeterminate\",\n complexity: {\n min: validationPolicy.minComplexity,\n actual: 4,\n warning: null,\n },\n ruleResults: [],\n };\n\n const [policyValidationResult, setPolicyValidationResult] = useState(\n initialPolicyValidationState,\n );\n\n const loadingRef = useRef<ReturnType<typeof setTimeout>>(null);\n usePolicyValidationResult(\n validationPolicy,\n value ?? \"\",\n () => {\n if (isEmptyValue) {\n return;\n }\n\n loadingRef.current = setTimeout(() => {\n setPolicyValidationResult((r) => ({\n ...r,\n isValid: \"indeterminate\",\n }));\n }, 150);\n },\n ({ password, isValid, results }) => {\n if (loadingRef.current) {\n clearTimeout(loadingRef.current);\n }\n\n if (isEmptyValue) {\n setPolicyValidationResult(() => ({\n ...results,\n isValid: true,\n }));\n return;\n }\n\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const isEmptyValue = !value;\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\n isEmptyValue,\n policyValidationResult,\n );\n let latestValidationErrorText = undefined;\n if (stateFromValidationResult) {\n const [translationKey, translationValues] = generateValidationTranslation(\n stateFromValidationResult,\n );\n latestValidationErrorText = translate.format(\n translationKey,\n translationValues,\n );\n }\n\n const isValidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid;\n\n const isInvalidFromValidationResult =\n !isEmptyValue && stateFromValidationResult?.isValid === false;\n const isInvalid = invalidFromProps || isInvalidFromValidationResult;\n\n const setOptimisticPolicyValidationResult = (\n state: Partial<ResolvedPolicyValidationResult> = {},\n ) => {\n setPolicyValidationResult((currentState) => ({\n ...currentState,\n isValid: true,\n ...state,\n }));\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult({\n ...initialPolicyValidationState,\n isValid: true,\n ruleResults: policyValidationResult.ruleResults.map((r) => ({\n ...r,\n isValid: true,\n })),\n });\n setIsPasswordRevealed(true);\n onChange(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData?.getData(\"text\");\n if (typeof pastedValue === \"string\" && pastedValue !== value) {\n setOptimisticPolicyValidationResult({\n isValid: \"indeterminate\",\n });\n }\n };\n\n const togglePasswordVisibilityHandler = () => {\n setIsPasswordRevealed((old) => !old);\n };\n\n const propsContext: PropsContext = {\n ...fieldPropsContext,\n Button: {\n tunnel: {\n id: \"button\",\n component: \"PasswordCreationField\",\n },\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnel: {\n id: \"button\",\n component: \"PasswordCreationField\",\n },\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n ...fieldPropsContext.Label,\n children: dynamic((localProps) => {\n return (\n <>\n {localProps.children}\n <PasswordGenerateButton\n isDisabled={isDisabled}\n onGeneratePasswordAction={onPasswordGenerateHandler}\n />\n <ValidationResultButton\n isEmptyValue={isEmptyValue}\n isDisabled={isDisabled}\n policyValidationResult={policyValidationResult}\n />\n </>\n );\n }),\n },\n };\n\n return (\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={onChange}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, fieldProps.className)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <FieldErrorCaptureContext>\n {latestValidationErrorText && (\n <FieldError>{latestValidationErrorText}</FieldError>\n )}\n <PropsContextProvider\n props={propsContext}\n dependencies={[\n isDisabled,\n isRequired,\n value,\n policyValidationResult,\n isEmptyValue,\n ]}\n >\n {children}\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <Aria.Input ref={ref} className={styles.input} />\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <UiComponentTunnelExit\n id=\"button\"\n component=\"PasswordCreationField\"\n />\n </Aria.Group>\n <ComplexityIndicator\n key={value}\n isEmptyValue={isEmptyValue}\n isLoading={policyValidationResult.isValid === \"indeterminate\"}\n policyValidationResult={policyValidationResult}\n validationResultState={stateFromValidationResult}\n />\n </Aria.Group>\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n </PropsContextProvider>\n </FieldErrorCaptureContext>\n <FieldErrorView />\n </Aria.TextField>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
3
|
import { jsx } from 'react/jsx-runtime';
|
|
4
|
-
import
|
|
4
|
+
import 'react';
|
|
5
5
|
import styles from './ComplexityIndicator.module.scss.mjs';
|
|
6
6
|
import { getStatusFromPolicyValidationResult } from '../../lib/getStatusFromPolicyValidationResult.mjs';
|
|
7
7
|
import clsx from 'clsx';
|
|
@@ -13,45 +13,34 @@ const ComplexityIndicator = (props) => {
|
|
|
13
13
|
isLoading,
|
|
14
14
|
isEmptyValue
|
|
15
15
|
} = props;
|
|
16
|
+
let complexityVisible;
|
|
17
|
+
let status;
|
|
16
18
|
const complexityScore = policyValidationResult?.complexity;
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
} else if (complexityScore && !isEmptyValue) {
|
|
35
|
-
complexityFulfilledPercentage = Math.min(
|
|
36
|
-
100 / (complexityScore.min + 1) * (complexityScore.actual + 1),
|
|
37
|
-
100
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
const policyValidationStatus = getStatusFromPolicyValidationResult(
|
|
19
|
+
const rulesResults = policyValidationResult?.ruleResults ?? [];
|
|
20
|
+
const complexityFulfilledPercentage = complexityScore ? Math.min(
|
|
21
|
+
100 / (complexityScore.min + 1) * (complexityScore.actual + 1),
|
|
22
|
+
100
|
|
23
|
+
) : 0;
|
|
24
|
+
const validRules = rulesResults.filter((r) => r.isValid).length;
|
|
25
|
+
const rulesFulfilledPercentage = rulesResults.length > 0 ? validRules / rulesResults.length * 100 : 0;
|
|
26
|
+
let totalFulfilledPercentage = Math.round(
|
|
27
|
+
complexityFulfilledPercentage * 0.8 + rulesFulfilledPercentage * 0.2
|
|
28
|
+
);
|
|
29
|
+
if (isEmptyValue) {
|
|
30
|
+
complexityVisible = false;
|
|
31
|
+
totalFulfilledPercentage = 0;
|
|
32
|
+
status = "success";
|
|
33
|
+
} else {
|
|
34
|
+
complexityVisible = true;
|
|
35
|
+
status = getStatusFromPolicyValidationResult(
|
|
41
36
|
validationResultState?.isValid ?? policyValidationResult.isValid,
|
|
42
37
|
policyValidationResult
|
|
43
38
|
);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
percentage: complexityFulfilledPercentage,
|
|
47
|
-
visible: true
|
|
48
|
-
});
|
|
49
|
-
}, [policyValidationResult, isEmptyValue]);
|
|
50
|
-
const complexityVisible = state.visible;
|
|
51
|
-
const complexityFulfilled = state.percentage === 100;
|
|
39
|
+
}
|
|
40
|
+
const complexityFulfilled = totalFulfilledPercentage === 100;
|
|
52
41
|
const percentageClassName = clsx(
|
|
53
42
|
styles.bar,
|
|
54
|
-
!isEmptyValue && styles[`bar-background-status-${
|
|
43
|
+
!isEmptyValue && styles[`bar-background-status-${status}`],
|
|
55
44
|
{
|
|
56
45
|
[styles.loading]: isLoading,
|
|
57
46
|
[styles.running]: !complexityFulfilled
|
|
@@ -63,8 +52,8 @@ const ComplexityIndicator = (props) => {
|
|
|
63
52
|
"aria-hidden": true,
|
|
64
53
|
"data-container": "complexity",
|
|
65
54
|
"data-complexity-visible": complexityVisible,
|
|
66
|
-
"data-complexity-status":
|
|
67
|
-
"data-complexity-percentage":
|
|
55
|
+
"data-complexity-status": status,
|
|
56
|
+
"data-complexity-percentage": totalFulfilledPercentage,
|
|
68
57
|
className: clsx(styles.complexityIndicator, {
|
|
69
58
|
[styles.hide]: !complexityVisible
|
|
70
59
|
}),
|
|
@@ -72,7 +61,7 @@ const ComplexityIndicator = (props) => {
|
|
|
72
61
|
"div",
|
|
73
62
|
{
|
|
74
63
|
style: {
|
|
75
|
-
width: `${
|
|
64
|
+
width: `${totalFulfilledPercentage}%`
|
|
76
65
|
},
|
|
77
66
|
className: percentageClassName
|
|
78
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComplexityIndicator.mjs","sources":["../../../../../../../../../src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.tsx"],"sourcesContent":["import React, { type FC
|
|
1
|
+
{"version":3,"file":"ComplexityIndicator.mjs","sources":["../../../../../../../../../src/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator.tsx"],"sourcesContent":["import React, { type FC } from \"react\";\nimport styles from \"./ComplexityIndicator.module.scss\";\nimport { getStatusFromPolicyValidationResult } from \"@/components/PasswordCreationField/lib/getStatusFromPolicyValidationResult\";\nimport clsx from \"clsx\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport { type Status } from \"@/lib/types/props\";\nimport type { StateFromLatestPolicyValidationResult } from \"@/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult\";\n\nexport type ComplexityStatus = Exclude<Status, \"info\"> | \"indeterminate\";\n\nexport interface ComplexityIndicatorProps {\n isLoading: boolean;\n isEmptyValue: boolean;\n validationResultState: StateFromLatestPolicyValidationResult;\n policyValidationResult: ResolvedPolicyValidationResult;\n}\n\n/** @internal */\nexport const ComplexityIndicator: FC<ComplexityIndicatorProps> = (props) => {\n const {\n policyValidationResult,\n validationResultState,\n isLoading,\n isEmptyValue,\n } = props;\n\n let complexityVisible;\n let status: ComplexityStatus;\n\n const complexityScore = policyValidationResult?.complexity;\n const rulesResults = policyValidationResult?.ruleResults ?? [];\n\n const complexityFulfilledPercentage = complexityScore\n ? Math.min(\n (100 / (complexityScore.min + 1)) * (complexityScore.actual + 1),\n 100,\n )\n : 0;\n\n const validRules = rulesResults.filter((r) => r.isValid).length;\n const rulesFulfilledPercentage =\n rulesResults.length > 0 ? (validRules / rulesResults.length) * 100 : 0;\n\n let totalFulfilledPercentage = Math.round(\n complexityFulfilledPercentage * 0.8 + rulesFulfilledPercentage * 0.2,\n );\n\n if (isEmptyValue) {\n complexityVisible = false;\n totalFulfilledPercentage = 0;\n status = \"success\";\n } else {\n complexityVisible = true;\n status = getStatusFromPolicyValidationResult(\n validationResultState?.isValid ?? policyValidationResult.isValid,\n policyValidationResult,\n );\n }\n\n const complexityFulfilled = totalFulfilledPercentage === 100;\n\n const percentageClassName = clsx(\n styles.bar,\n !isEmptyValue && styles[`bar-background-status-${status}`],\n {\n [styles.loading as string]: isLoading,\n [styles.running as string]: !complexityFulfilled,\n },\n );\n\n return (\n <div\n aria-hidden={true}\n data-container=\"complexity\"\n data-complexity-visible={complexityVisible}\n data-complexity-status={status}\n data-complexity-percentage={totalFulfilledPercentage}\n className={clsx(styles.complexityIndicator, {\n [styles.hide as string]: !complexityVisible,\n })}\n >\n <div\n style={{\n width: `${totalFulfilledPercentage}%`,\n }}\n className={percentageClassName}\n />\n </div>\n );\n};\n\nexport default ComplexityIndicator;\n"],"names":[],"mappings":";;;;;;AAkBO,MAAM,mBAAA,GAAoD,CAAC,KAAA,KAAU;AAC1E,EAAA,MAAM;AAAA,IACJ,sBAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,IAAI,iBAAA;AACJ,EAAA,IAAI,MAAA;AAEJ,EAAA,MAAM,kBAAkB,sBAAA,EAAwB,UAAA;AAChD,EAAA,MAAM,YAAA,GAAe,sBAAA,EAAwB,WAAA,IAAe,EAAC;AAE7D,EAAA,MAAM,6BAAA,GAAgC,kBAClC,IAAA,CAAK,GAAA;AAAA,IACF,GAAA,IAAO,eAAA,CAAgB,GAAA,GAAM,CAAA,CAAA,IAAO,gBAAgB,MAAA,GAAS,CAAA,CAAA;AAAA,IAC9D;AAAA,GACF,GACA,CAAA;AAEJ,EAAA,MAAM,aAAa,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AACzD,EAAA,MAAM,2BACJ,YAAA,CAAa,MAAA,GAAS,IAAK,UAAA,GAAa,YAAA,CAAa,SAAU,GAAA,GAAM,CAAA;AAEvE,EAAA,IAAI,2BAA2B,IAAA,CAAK,KAAA;AAAA,IAClC,6BAAA,GAAgC,MAAM,wBAAA,GAA2B;AAAA,GACnE;AAEA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,iBAAA,GAAoB,KAAA;AACpB,IAAA,wBAAA,GAA2B,CAAA;AAC3B,IAAA,MAAA,GAAS,SAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,iBAAA,GAAoB,IAAA;AACpB,IAAA,MAAA,GAAS,mCAAA;AAAA,MACP,qBAAA,EAAuB,WAAW,sBAAA,CAAuB,OAAA;AAAA,MACzD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,sBAAsB,wBAAA,KAA6B,GAAA;AAEzD,EAAA,MAAM,mBAAA,GAAsB,IAAA;AAAA,IAC1B,MAAA,CAAO,GAAA;AAAA,IACP,CAAC,YAAA,IAAgB,MAAA,CAAO,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AAAA,IACzD;AAAA,MACE,CAAC,MAAA,CAAO,OAAiB,GAAG,SAAA;AAAA,MAC5B,CAAC,MAAA,CAAO,OAAiB,GAAG,CAAC;AAAA;AAC/B,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAa,IAAA;AAAA,MACb,gBAAA,EAAe,YAAA;AAAA,MACf,yBAAA,EAAyB,iBAAA;AAAA,MACzB,wBAAA,EAAwB,MAAA;AAAA,MACxB,4BAAA,EAA4B,wBAAA;AAAA,MAC5B,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAqB;AAAA,QAC1C,CAAC,MAAA,CAAO,IAAc,GAAG,CAAC;AAAA,OAC3B,CAAA;AAAA,MAED,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,GAAG,wBAAwB,CAAA,CAAA;AAAA,WACpC;AAAA,UACA,SAAA,EAAW;AAAA;AAAA;AACb;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
4
3
|
import '@mittwald/password-tools-js/policy';
|
|
5
|
-
import 'react';
|
|
6
4
|
import { RuleType } from '@mittwald/password-tools-js/rules';
|
|
7
5
|
import '@mittwald/password-tools-js/generator';
|
|
6
|
+
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
7
|
+
import 'react';
|
|
8
8
|
|
|
9
9
|
const generateTranslationString = (rule, shortVersion = false) => {
|
|
10
10
|
if (rule.translationKey) {
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
4
3
|
import '@mittwald/password-tools-js/policy';
|
|
5
|
-
import 'react';
|
|
6
4
|
import '@mittwald/password-tools-js/rules';
|
|
7
5
|
import '@mittwald/password-tools-js/generator';
|
|
6
|
+
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
7
|
+
import 'react';
|
|
8
8
|
|
|
9
9
|
const getStateFromLatestPolicyValidationResult = (isEmptyValue, result) => {
|
|
10
|
+
if (result.isValid === "indeterminate") {
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
10
13
|
if (result.ruleResults.length >= 1) {
|
|
11
14
|
const failingRule = result.ruleResults.find((r) => !r.isValid);
|
|
12
15
|
if (failingRule) {
|
|
13
16
|
return failingRule;
|
|
14
17
|
}
|
|
15
18
|
}
|
|
16
|
-
if (result.isValid === "indeterminate") {
|
|
17
|
-
return void 0;
|
|
18
|
-
}
|
|
19
19
|
if (!isEmptyValue) {
|
|
20
20
|
if (result.complexity.actual < result.complexity.min) {
|
|
21
21
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\nexport type StateFromLatestPolicyValidationResult =\n | undefined\n | Partial<RuleValidationResult>;\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n isEmptyValue: boolean,\n result: ResolvedPolicyValidationResult,\n): StateFromLatestPolicyValidationResult => {\n if (result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (failingRule) {\n return failingRule;\n }\n }\n\n if (
|
|
1
|
+
{"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\nexport type StateFromLatestPolicyValidationResult =\n | undefined\n | Partial<RuleValidationResult>;\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n isEmptyValue: boolean,\n result: ResolvedPolicyValidationResult,\n): StateFromLatestPolicyValidationResult => {\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\n if (result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (failingRule) {\n return failingRule;\n }\n }\n\n if (!isEmptyValue) {\n if (result.complexity.actual < result.complexity.min) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n if (result.complexity.actual === result.complexity.min) {\n return {\n isValid: result.isValid,\n identifier: \"optimizeComplexity\",\n };\n }\n }\n\n return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":";;;;;;AAQO,MAAM,wCAAA,GAA2C,CACtD,YAAA,EACA,MAAA,KAC0C;AAC1C,EAAA,IAAI,MAAA,CAAO,YAAY,eAAA,EAAiB;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,IAAU,CAAA,EAAG;AAClC,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,MAAA,CAAO,WAAW,GAAA,EAAK;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,MAAA,CAAO,WAAW,GAAA,EAAK;AACtD,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AACF;;;;"}
|
|
@@ -1,56 +1,39 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
3
|
import { useRef, useEffect, startTransition } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { useDebouncedCallback } from 'use-debounce';
|
|
5
5
|
|
|
6
6
|
const usePolicyValidationResult = (validationPolicy, password, onValidationStart, onValidationResult) => {
|
|
7
7
|
const cache = useRef(null);
|
|
8
|
-
|
|
8
|
+
const validatePassword = (pwd) => {
|
|
9
9
|
onValidationStart?.();
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
password: cache.current.password,
|
|
13
|
-
isValid: Boolean(cache.current.results.isValid),
|
|
14
|
-
results: cache.current.results
|
|
15
|
-
});
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
validationPolicy.validate(password).then((validationResult) => {
|
|
19
|
-
const setValidationResult = (password2, policyValidationResult) => {
|
|
20
|
-
const results = policyValidationResult;
|
|
21
|
-
const isValid = Boolean(policyValidationResult.isValid);
|
|
22
|
-
cache.current = { password: password2, results };
|
|
10
|
+
startTransition(async () => {
|
|
11
|
+
if (cache.current?.password === pwd) {
|
|
23
12
|
onValidationResult?.({
|
|
24
|
-
password:
|
|
25
|
-
isValid,
|
|
26
|
-
results:
|
|
13
|
+
password: cache.current.password,
|
|
14
|
+
isValid: Boolean(cache.current.results.isValid),
|
|
15
|
+
results: cache.current.results
|
|
27
16
|
});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
...validationResult.ruleResults
|
|
37
|
-
]).then(
|
|
38
|
-
([
|
|
39
|
-
resolvedValue,
|
|
40
|
-
resolvedValidationResult,
|
|
41
|
-
...resolvedValidationRuleResults
|
|
42
|
-
]) => {
|
|
43
|
-
startTransition(() => {
|
|
44
|
-
setValidationResult(resolvedValue, {
|
|
45
|
-
complexity: resolvedValidationResult.complexity,
|
|
46
|
-
ruleResults: resolvedValidationRuleResults,
|
|
47
|
-
isValid: resolvedValidationResult.isValid && resolvedValidationRuleResults.every((r) => r.isValid)
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const validationResult = await validationPolicy.validate(pwd);
|
|
20
|
+
cache.current = { password: pwd, results: validationResult };
|
|
21
|
+
onValidationResult?.({
|
|
22
|
+
password: pwd,
|
|
23
|
+
isValid: validationResult.isValid,
|
|
24
|
+
results: validationResult
|
|
52
25
|
});
|
|
53
26
|
});
|
|
27
|
+
};
|
|
28
|
+
const validatePasswordDebounce = useDebouncedCallback(validatePassword, 350, {
|
|
29
|
+
trailing: true
|
|
30
|
+
});
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (password) {
|
|
33
|
+
validatePasswordDebounce(password);
|
|
34
|
+
} else {
|
|
35
|
+
validatePassword(password);
|
|
36
|
+
}
|
|
54
37
|
}, [password, validationPolicy]);
|
|
55
38
|
};
|
|
56
39
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePolicyValidationResult.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/lib/usePolicyValidationResult.ts"],"sourcesContent":["import { startTransition, useEffect, useRef } from \"react\";\nimport type {
|
|
1
|
+
{"version":3,"file":"usePolicyValidationResult.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/lib/usePolicyValidationResult.ts"],"sourcesContent":["import { startTransition, useEffect, useRef } from \"react\";\nimport type { Policy } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport { useDebouncedCallback } from \"use-debounce\";\n\nexport const usePolicyValidationResult = (\n validationPolicy: Policy,\n password: string,\n onValidationStart?: () => void,\n onValidationResult?: (data: {\n password: string;\n isValid: boolean;\n results: ResolvedPolicyValidationResult;\n }) => void,\n) => {\n const cache = useRef<{\n password: string;\n results: ResolvedPolicyValidationResult;\n } | null>(null);\n\n const validatePassword = (pwd: string) => {\n onValidationStart?.();\n\n startTransition(async () => {\n if (cache.current?.password === pwd) {\n onValidationResult?.({\n password: cache.current.password,\n isValid: Boolean(cache.current.results.isValid),\n results: cache.current.results,\n });\n return;\n }\n\n const validationResult = await validationPolicy.validate(pwd);\n cache.current = { password: pwd, results: validationResult };\n onValidationResult?.({\n password: pwd,\n isValid: validationResult.isValid,\n results: validationResult,\n });\n });\n };\n\n const validatePasswordDebounce = useDebouncedCallback(validatePassword, 350, {\n trailing: true,\n });\n\n useEffect(() => {\n if (password) {\n validatePasswordDebounce(password);\n } else {\n validatePassword(password);\n }\n }, [password, validationPolicy]);\n};\n"],"names":[],"mappings":";;;AAKO,MAAM,yBAAA,GAA4B,CACvC,gBAAA,EACA,QAAA,EACA,mBACA,kBAAA,KAKG;AACH,EAAA,MAAM,KAAA,GAAQ,OAGJ,IAAI,CAAA;AAEd,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAA,KAAgB;AACxC,IAAA,iBAAA,IAAoB;AAEpB,IAAA,eAAA,CAAgB,YAAY;AAC1B,MAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,GAAA,EAAK;AACnC,QAAA,kBAAA,GAAqB;AAAA,UACnB,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,UACxB,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAAA,UAC9C,OAAA,EAAS,MAAM,OAAA,CAAQ;AAAA,SACxB,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,QAAA,CAAS,GAAG,CAAA;AAC5D,MAAA,KAAA,CAAM,OAAA,GAAU,EAAE,QAAA,EAAU,GAAA,EAAK,SAAS,gBAAA,EAAiB;AAC3D,MAAA,kBAAA,GAAqB;AAAA,QACnB,QAAA,EAAU,GAAA;AAAA,QACV,SAAS,gBAAA,CAAiB,OAAA;AAAA,QAC1B,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,oBAAA,CAAqB,gBAAA,EAAkB,GAAA,EAAK;AAAA,IAC3E,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,wBAAA,CAAyB,QAAQ,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAgB,CAAC,CAAA;AACjC;;;;"}
|
package/dist/js/packages/components/src/components/PasswordCreationField/worker/generatePassword.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
4
3
|
import '@mittwald/password-tools-js/policy';
|
|
5
|
-
import 'react';
|
|
6
4
|
import '@mittwald/password-tools-js/rules';
|
|
7
5
|
import { Generator } from '@mittwald/password-tools-js/generator';
|
|
6
|
+
import '../../../integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.mjs';
|
|
7
|
+
import 'react';
|
|
8
8
|
|
|
9
9
|
const generatePassword = async (validationPolicy) => {
|
|
10
10
|
return new Generator(validationPolicy).generatePassword();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultPasswordCreationPolicy.mjs","sources":["../../../../../../../../src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.ts"],"sourcesContent":["import type { PolicyDeclaration } from \"
|
|
1
|
+
{"version":3,"file":"defaultPasswordCreationPolicy.mjs","sources":["../../../../../../../../src/integrations/@mittwald/password-tools-js/defaultPasswordCreationPolicy.ts"],"sourcesContent":["import type { PolicyDeclaration } from \".\";\nimport { RuleType } from \".\";\n\nexport const defaultPasswordCreationPolicy: PolicyDeclaration = {\n minComplexity: 3,\n rules: [\n {\n ruleType: RuleType.length,\n min: 12,\n },\n {\n identifier: \"special\",\n ruleType: RuleType.charPool,\n charPools: [\"special\"],\n },\n {\n identifier: \"numbers\",\n ruleType: RuleType.charPool,\n charPools: [\"numbers\"],\n },\n ],\n};\n"],"names":[],"mappings":";;;;;AAGO,MAAM,6BAAA,GAAmD;AAAA,EAC9D,aAAA,EAAe,CAAA;AAAA,EACf,KAAA,EAAO;AAAA,IACL;AAAA,MACE,UAAU,QAAA,CAAS,MAAA;AAAA,MACnB,GAAA,EAAK;AAAA,KACP;AAAA,IACA;AAAA,MACE,UAAA,EAAY,SAAA;AAAA,MACZ,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA,KACvB;AAAA,IACA;AAAA,MACE,UAAA,EAAY,SAAA;AAAA,MACZ,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA;AACvB;AAEJ;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
3
|
import { Policy } from '@mittwald/password-tools-js/policy';
|
|
4
|
-
import { defaultPasswordCreationPolicy } from './defaultPasswordCreationPolicy.mjs';
|
|
5
|
-
import { useMemo, useRef } from 'react';
|
|
6
4
|
import '@mittwald/password-tools-js/rules';
|
|
7
5
|
import '@mittwald/password-tools-js/generator';
|
|
6
|
+
import { defaultPasswordCreationPolicy } from './defaultPasswordCreationPolicy.mjs';
|
|
7
|
+
import { useMemo, useRef } from 'react';
|
|
8
8
|
|
|
9
9
|
const usePasswordCreationFieldValidation = (genericValidationPolicy = defaultPasswordCreationPolicy) => {
|
|
10
10
|
const validationPolicy = useMemo(
|
|
@@ -21,7 +21,7 @@ const usePasswordCreationFieldValidation = (genericValidationPolicy = defaultPas
|
|
|
21
21
|
}
|
|
22
22
|
try {
|
|
23
23
|
const validationResult = await validationPolicy.validate(value);
|
|
24
|
-
const isValid =
|
|
24
|
+
const isValid = validationResult.isValid;
|
|
25
25
|
cache.current = {
|
|
26
26
|
password: value,
|
|
27
27
|
isValid
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePasswordCreationFieldValidation.mjs","sources":["../../../../../../../../src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { PolicyGenericDeclaration } from \"
|
|
1
|
+
{"version":3,"file":"usePasswordCreationFieldValidation.mjs","sources":["../../../../../../../../src/integrations/@mittwald/password-tools-js/usePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { PolicyGenericDeclaration } from \".\";\nimport { defaultPasswordCreationPolicy, Policy } from \".\";\nimport { useMemo, useRef } from \"react\";\nimport type { Validate } from \"react-hook-form\";\n\nexport const usePasswordCreationFieldValidation = (\n genericValidationPolicy: PolicyGenericDeclaration = defaultPasswordCreationPolicy,\n): Validate<string, unknown> => {\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(genericValidationPolicy),\n [genericValidationPolicy],\n );\n\n const cache = useRef<{\n password: string;\n isValid: boolean;\n } | null>(null);\n\n return async (value) => {\n if (value === \"\") {\n return;\n }\n\n if (cache.current?.password === value) {\n return cache.current.isValid;\n }\n\n try {\n const validationResult = await validationPolicy.validate(value);\n const isValid = validationResult.isValid;\n\n cache.current = {\n password: value,\n isValid,\n };\n return isValid;\n } catch (ignoredError) {\n return false;\n }\n };\n};\n\n/** @deprecated Use `usePasswordCreationFieldValidation` instead. */\nexport const generatePasswordCreationFieldValidation =\n usePasswordCreationFieldValidation;\n"],"names":[],"mappings":";;;;;;AAKO,MAAM,kCAAA,GAAqC,CAChD,uBAAA,GAAoD,6BAAA,KACtB;AAC9B,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM,MAAA,CAAO,eAAA,CAAgB,uBAAuB,CAAA;AAAA,IACpD,CAAC,uBAAuB;AAAA,GAC1B;AAEA,EAAA,MAAM,KAAA,GAAQ,OAGJ,IAAI,CAAA;AAEd,EAAA,OAAO,OAAO,KAAA,KAAU;AACtB,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,KAAA,EAAO;AACrC,MAAA,OAAO,MAAM,OAAA,CAAQ,OAAA;AAAA,IACvB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA;AAC9D,MAAA,MAAM,UAAU,gBAAA,CAAiB,OAAA;AAEjC,MAAA,KAAA,CAAM,OAAA,GAAU;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,YAAA,EAAc;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAGO,MAAM,uCAAA,GACX;;;;"}
|