@mittwald/flow-react-components 0.2.0-alpha.380 → 0.2.0-alpha.382

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/assets/doc-properties.json +3108 -3089
  3. package/dist/js/@mittwald/password-tools-js.mjs +3 -2
  4. package/dist/js/@mittwald/password-tools-js.mjs.map +1 -1
  5. package/dist/js/_virtual/_.locale.json@95341064edeb0e38b66d786dbd62955c.mjs +2 -0
  6. package/dist/js/_virtual/_.locale.json@95341064edeb0e38b66d786dbd62955c.mjs.map +1 -1
  7. package/dist/js/components/src/components/NumberField/NumberField.mjs +3 -9
  8. package/dist/js/components/src/components/NumberField/NumberField.mjs.map +1 -1
  9. package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs +31 -65
  10. package/dist/js/components/src/components/PasswordCreationField/PasswordCreationField.mjs.map +1 -1
  11. package/dist/js/components/src/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton.mjs +8 -3
  12. package/dist/js/components/src/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton.mjs.map +1 -1
  13. package/dist/js/components/src/components/PasswordCreationField/components/ValidationResultEntry/ValidationResultEntry.mjs +6 -2
  14. package/dist/js/components/src/components/PasswordCreationField/components/ValidationResultEntry/ValidationResultEntry.mjs.map +1 -1
  15. package/dist/js/components/src/components/PasswordCreationField/defaultPasswordCreationPolicy.mjs +1 -0
  16. package/dist/js/components/src/components/PasswordCreationField/defaultPasswordCreationPolicy.mjs.map +1 -1
  17. package/dist/js/components/src/components/PasswordCreationField/lib/generatePasswordCreationFieldValidation.mjs +1 -1
  18. package/dist/js/components/src/components/PasswordCreationField/lib/generatePasswordCreationFieldValidation.mjs.map +1 -1
  19. package/dist/js/components/src/components/PasswordCreationField/lib/generateValidationTranslation.mjs +2 -0
  20. package/dist/js/components/src/components/PasswordCreationField/lib/generateValidationTranslation.mjs.map +1 -1
  21. package/dist/js/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs +9 -1
  22. package/dist/js/components/src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.mjs.map +1 -1
  23. package/dist/js/components/src/components/PasswordCreationField/lib/usePolicyValidationResult.mjs +47 -0
  24. package/dist/js/components/src/components/PasswordCreationField/lib/usePolicyValidationResult.mjs.map +1 -0
  25. package/dist/js/components/src/components/PasswordCreationField/worker/generatePassword.mjs +2 -0
  26. package/dist/js/components/src/components/PasswordCreationField/worker/generatePassword.mjs.map +1 -1
  27. package/dist/types/components/NumberField/NumberField.d.ts.map +1 -1
  28. package/dist/types/components/PasswordCreationField/PasswordCreationField.d.ts +2 -4
  29. package/dist/types/components/PasswordCreationField/PasswordCreationField.d.ts.map +1 -1
  30. package/dist/types/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton.d.ts.map +1 -1
  31. package/dist/types/components/PasswordCreationField/components/ValidationResultEntry/ValidationResultEntry.d.ts.map +1 -1
  32. package/dist/types/components/PasswordCreationField/defaultPasswordCreationPolicy.d.ts +1 -1
  33. package/dist/types/components/PasswordCreationField/defaultPasswordCreationPolicy.d.ts.map +1 -1
  34. package/dist/types/components/PasswordCreationField/lib/generatePasswordCreationFieldValidation.d.ts +1 -1
  35. package/dist/types/components/PasswordCreationField/lib/generatePasswordCreationFieldValidation.d.ts.map +1 -1
  36. package/dist/types/components/PasswordCreationField/lib/generateValidationTranslation.d.ts +1 -1
  37. package/dist/types/components/PasswordCreationField/lib/generateValidationTranslation.d.ts.map +1 -1
  38. package/dist/types/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.d.ts.map +1 -1
  39. package/dist/types/components/PasswordCreationField/lib/usePolicyValidationResult.d.ts +8 -0
  40. package/dist/types/components/PasswordCreationField/lib/usePolicyValidationResult.d.ts.map +1 -0
  41. package/dist/types/components/PasswordCreationField/stories/Default.stories.d.ts.map +1 -1
  42. package/dist/types/components/PasswordCreationField/worker/generatePassword.d.ts +1 -1
  43. package/dist/types/components/PasswordCreationField/worker/generatePassword.d.ts.map +1 -1
  44. package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts +6 -2
  45. package/dist/types/integrations/@mittwald/password-tools-js/index.d.ts.map +1 -1
  46. package/dist/types/integrations/react-hook-form/components/Field/stories/NumberField.stories.d.ts.map +1 -1
  47. package/package.json +5 -5
@@ -1,5 +1,6 @@
1
1
  "use client"
2
2
  /* */
3
- export * from '@mittwald/password-tools-js/policy';
4
- export * from '@mittwald/password-tools-js/rules';
3
+ export { Policy } from '@mittwald/password-tools-js/policy';
4
+ export { AsyncRule, RegexFlags, RuleType, SequenceType, SyncRule } from '@mittwald/password-tools-js/rules';
5
+ export { Generator } from '@mittwald/password-tools-js/generator';
5
6
  //# sourceMappingURL=password-tools-js.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"password-tools-js.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"password-tools-js.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -25,6 +25,7 @@ const locales = {"de-DE": { "button.generate": `Generieren`,
25
25
  "validation.general.failingComplexity": `Bitte erhöhe die Komplexität deines Passwortes.`,
26
26
  "validation.general.optimizeComplexity": `Dein Passwort erfüllt die Minimalanforderungen.`,
27
27
  "validation.general.securePassword": `Sehr gut! Dein Passwort ist sicher.`,
28
+ "validation.general.short.unspecified": `Keine spezifischen Anforderungen`,
28
29
  "validation.hibp": (args, formatter) => `${formatter.select({true: `Das Passwort ist nicht kompromittiert.`, other: `Das Passwort ist kompromittiert. Bitte vergib ein neues.`}, args.isValid)}`,
29
30
  "validation.hibp.short": (args, formatter) => `${formatter.select({true: `Nicht kompromittiert`, other: `Kompromittiert`}, args.isValid)}`,
30
31
  "validation.length.max": (args, formatter) => `${formatter.plural(args.max, {one: `Bitte wähle ein Passwort mit maximal einem Zeichen.`, other: () => `Bitte wähle ein Passwort mit maximal ${args.max} Zeichen.`})}`,
@@ -62,6 +63,7 @@ const locales = {"de-DE": { "button.generate": `Generieren`,
62
63
  "validation.general.failingComplexity": `Please increase the complexity of your password.`,
63
64
  "validation.general.optimizeComplexity": `Your password meets the minimum requirements.`,
64
65
  "validation.general.securePassword": `Awesome! Your password is secure.`,
66
+ "validation.general.short.unspecified": `No specific requirements`,
65
67
  "validation.hibp": (args, formatter) => `${formatter.select({true: `The password is not compromised.`, other: `The password has been compromised. Please set a new one.`}, args.isValid)}`,
66
68
  "validation.hibp.short": (args, formatter) => `${formatter.select({true: `Not compromised`, other: `Compromised`}, args.isValid)}`,
67
69
  "validation.length.max": (args, formatter) => `${formatter.plural(args.max, {one: `Please choose a password with a maximum of one character.`, other: () => `Please choose a password with a maximum of ${args.max} characters.`})}`,
@@ -1 +1 @@
1
- {"version":3,"file":"_.locale.json@95341064edeb0e38b66d786dbd62955c.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"_.locale.json@95341064edeb0e38b66d786dbd62955c.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -46,8 +46,9 @@ const NumberField = flowComponent("NumberField", (props) => {
46
46
  return /* @__PURE__ */ jsx(ClearPropsContext, { children: /* @__PURE__ */ jsxs(
47
47
  Aria.NumberField,
48
48
  {
49
- isWheelDisabled,
50
49
  ...rest,
50
+ isWheelDisabled,
51
+ defaultValue,
51
52
  className: rootClassName,
52
53
  children: [
53
54
  /* @__PURE__ */ jsxs(Aria.Group, { className: styles.group, children: [
@@ -70,14 +71,7 @@ const NumberField = flowComponent("NumberField", (props) => {
70
71
  {
71
72
  inputContext: Aria.InputContext,
72
73
  props,
73
- children: /* @__PURE__ */ jsx(
74
- Aria.Input,
75
- {
76
- className: styles.input,
77
- ref,
78
- defaultValue
79
- }
80
- )
74
+ children: /* @__PURE__ */ jsx(Aria.Input, { className: styles.input, ref })
81
75
  }
82
76
  ),
83
77
  /* @__PURE__ */ jsxs(
@@ -1 +1 @@
1
- {"version":3,"file":"NumberField.mjs","sources":["../../../../../../src/components/NumberField/NumberField.tsx"],"sourcesContent":["import type { PropsWithChildren } from \"react\";\nimport * as Aria from \"react-aria-components\";\nimport formFieldStyles from \"../FormField/FormField.module.scss\";\nimport styles from \"./NumberField.module.scss\";\nimport clsx from \"clsx\";\nimport type { PropsContext } from \"@/lib/propsContext\";\nimport ClearPropsContext from \"@/components/ClearPropsContext/ClearPropsContext\";\nimport { PropsContextProvider } from \"@/lib/propsContext\";\nimport { FieldError } from \"@/components/FieldError\";\nimport { Button } from \"@/components/Button\";\nimport {\n IconChevronDown,\n IconChevronUp,\n IconMinus,\n IconPlus,\n} from \"@/components/Icon/components/icons\";\nimport type { FlowComponentProps } from \"@/lib/componentFactory/flowComponent\";\nimport { flowComponent } from \"@/lib/componentFactory/flowComponent\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\n\nexport interface NumberFieldProps\n extends PropsWithChildren<Omit<Aria.NumberFieldProps, \"children\">>,\n FlowComponentProps<HTMLInputElement> {}\n\n/**\n * @flr-generate all\n * @flr-clear-props-context\n */\nexport const NumberField = flowComponent(\"NumberField\", (props) => {\n const {\n children,\n className,\n ref,\n defaultValue,\n isWheelDisabled = true,\n ...rest\n } = props;\n\n const rootClassName = clsx(formFieldStyles.formField, className);\n\n const propsContext: PropsContext = {\n Label: {\n className: formFieldStyles.label,\n optional: !props.isRequired,\n },\n FieldDescription: {\n className: formFieldStyles.fieldDescription,\n },\n FieldError: {\n className: formFieldStyles.customFieldError,\n },\n };\n\n return (\n <ClearPropsContext>\n <Aria.NumberField\n isWheelDisabled={isWheelDisabled}\n {...rest}\n className={rootClassName}\n >\n <Aria.Group className={styles.group}>\n <Button\n ariaSlot=\"decrement\"\n className={styles.decrementButton}\n size=\"s\"\n variant=\"plain\"\n color=\"secondary\"\n >\n <IconChevronDown />\n <IconMinus className={styles.coarsePointerIcon} />\n </Button>\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={props}\n >\n <Aria.Input\n className={styles.input}\n ref={ref}\n defaultValue={defaultValue}\n />\n </ReactAriaControlledValueFix>\n <Button\n ariaSlot=\"increment\"\n className={styles.incrementButton}\n size=\"s\"\n variant=\"plain\"\n color=\"secondary\"\n >\n <IconChevronUp />\n <IconPlus className={styles.coarsePointerIcon} />\n </Button>\n </Aria.Group>\n <PropsContextProvider props={propsContext}>\n {children}\n </PropsContextProvider>\n <FieldError className={formFieldStyles.fieldError} />\n </Aria.NumberField>\n </ClearPropsContext>\n );\n});\n\nexport default NumberField;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BO,MAAM,WAAc,GAAA,aAAA,CAAc,aAAe,EAAA,CAAC,KAAU,KAAA;AACjE,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAkB,GAAA,IAAA;AAAA,IAClB,GAAG;AAAA,GACD,GAAA,KAAA;AAEJ,EAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,eAAgB,CAAA,SAAA,EAAW,SAAS,CAAA;AAE/D,EAAA,MAAM,YAA6B,GAAA;AAAA,IACjC,KAAO,EAAA;AAAA,MACL,WAAW,eAAgB,CAAA,KAAA;AAAA,MAC3B,QAAA,EAAU,CAAC,KAAM,CAAA;AAAA,KACnB;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,WAAW,eAAgB,CAAA;AAAA,KAC7B;AAAA,IACA,UAAY,EAAA;AAAA,MACV,WAAW,eAAgB,CAAA;AAAA;AAC7B,GACF;AAEA,EAAA,2BACG,iBACC,EAAA,EAAA,QAAA,kBAAA,IAAA;AAAA,IAAC,IAAK,CAAA,WAAA;AAAA,IAAL;AAAA,MACC,eAAA;AAAA,MACC,GAAG,IAAA;AAAA,MACJ,SAAW,EAAA,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,IAAK,CAAA,KAAA,EAAL,EAAW,SAAA,EAAW,OAAO,KAC5B,EAAA,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,QAAS,EAAA,WAAA;AAAA,cACT,WAAW,MAAO,CAAA,eAAA;AAAA,cAClB,IAAK,EAAA,GAAA;AAAA,cACL,OAAQ,EAAA,OAAA;AAAA,cACR,KAAM,EAAA,WAAA;AAAA,cAEN,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,eAAgB,EAAA,EAAA,CAAA;AAAA,gCAChB,GAAA,CAAA,SAAA,EAAA,EAAU,SAAW,EAAA,MAAA,CAAO,iBAAmB,EAAA;AAAA;AAAA;AAAA,WAClD;AAAA,0BACA,GAAA;AAAA,YAAC,2BAAA;AAAA,YAAA;AAAA,cACC,cAAc,IAAK,CAAA,YAAA;AAAA,cACnB,KAAA;AAAA,cAEA,QAAA,kBAAA,GAAA;AAAA,gBAAC,IAAK,CAAA,KAAA;AAAA,gBAAL;AAAA,kBACC,WAAW,MAAO,CAAA,KAAA;AAAA,kBAClB,GAAA;AAAA,kBACA;AAAA;AAAA;AACF;AAAA,WACF;AAAA,0BACA,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,QAAS,EAAA,WAAA;AAAA,cACT,WAAW,MAAO,CAAA,eAAA;AAAA,cAClB,IAAK,EAAA,GAAA;AAAA,cACL,OAAQ,EAAA,OAAA;AAAA,cACR,KAAM,EAAA,WAAA;AAAA,cAEN,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,aAAc,EAAA,EAAA,CAAA;AAAA,gCACd,GAAA,CAAA,QAAA,EAAA,EAAS,SAAW,EAAA,MAAA,CAAO,iBAAmB,EAAA;AAAA;AAAA;AAAA;AACjD,SACF,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,oBAAA,EAAA,EAAqB,KAAO,EAAA,YAAA,EAC1B,QACH,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,UAAA,EAAA,EAAW,SAAW,EAAA,eAAA,CAAgB,UAAY,EAAA;AAAA;AAAA;AAAA,GAEvD,EAAA,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"NumberField.mjs","sources":["../../../../../../src/components/NumberField/NumberField.tsx"],"sourcesContent":["import type { PropsWithChildren } from \"react\";\nimport * as Aria from \"react-aria-components\";\nimport formFieldStyles from \"../FormField/FormField.module.scss\";\nimport styles from \"./NumberField.module.scss\";\nimport clsx from \"clsx\";\nimport type { PropsContext } from \"@/lib/propsContext\";\nimport ClearPropsContext from \"@/components/ClearPropsContext/ClearPropsContext\";\nimport { PropsContextProvider } from \"@/lib/propsContext\";\nimport { FieldError } from \"@/components/FieldError\";\nimport { Button } from \"@/components/Button\";\nimport {\n IconChevronDown,\n IconChevronUp,\n IconMinus,\n IconPlus,\n} from \"@/components/Icon/components/icons\";\nimport type { FlowComponentProps } from \"@/lib/componentFactory/flowComponent\";\nimport { flowComponent } from \"@/lib/componentFactory/flowComponent\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\n\nexport interface NumberFieldProps\n extends PropsWithChildren<Omit<Aria.NumberFieldProps, \"children\">>,\n FlowComponentProps<HTMLInputElement> {}\n\n/**\n * @flr-generate all\n * @flr-clear-props-context\n */\nexport const NumberField = flowComponent(\"NumberField\", (props) => {\n const {\n children,\n className,\n ref,\n defaultValue,\n isWheelDisabled = true,\n ...rest\n } = props;\n\n const rootClassName = clsx(formFieldStyles.formField, className);\n\n const propsContext: PropsContext = {\n Label: {\n className: formFieldStyles.label,\n optional: !props.isRequired,\n },\n FieldDescription: {\n className: formFieldStyles.fieldDescription,\n },\n FieldError: {\n className: formFieldStyles.customFieldError,\n },\n };\n\n return (\n <ClearPropsContext>\n <Aria.NumberField\n {...rest}\n isWheelDisabled={isWheelDisabled}\n defaultValue={defaultValue}\n className={rootClassName}\n >\n <Aria.Group className={styles.group}>\n <Button\n ariaSlot=\"decrement\"\n className={styles.decrementButton}\n size=\"s\"\n variant=\"plain\"\n color=\"secondary\"\n >\n <IconChevronDown />\n <IconMinus className={styles.coarsePointerIcon} />\n </Button>\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={props}\n >\n <Aria.Input className={styles.input} ref={ref} />\n </ReactAriaControlledValueFix>\n <Button\n ariaSlot=\"increment\"\n className={styles.incrementButton}\n size=\"s\"\n variant=\"plain\"\n color=\"secondary\"\n >\n <IconChevronUp />\n <IconPlus className={styles.coarsePointerIcon} />\n </Button>\n </Aria.Group>\n <PropsContextProvider props={propsContext}>\n {children}\n </PropsContextProvider>\n <FieldError className={formFieldStyles.fieldError} />\n </Aria.NumberField>\n </ClearPropsContext>\n );\n});\n\nexport default NumberField;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BO,MAAM,WAAc,GAAA,aAAA,CAAc,aAAe,EAAA,CAAC,KAAU,KAAA;AACjE,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAkB,GAAA,IAAA;AAAA,IAClB,GAAG;AAAA,GACD,GAAA,KAAA;AAEJ,EAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,eAAgB,CAAA,SAAA,EAAW,SAAS,CAAA;AAE/D,EAAA,MAAM,YAA6B,GAAA;AAAA,IACjC,KAAO,EAAA;AAAA,MACL,WAAW,eAAgB,CAAA,KAAA;AAAA,MAC3B,QAAA,EAAU,CAAC,KAAM,CAAA;AAAA,KACnB;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,WAAW,eAAgB,CAAA;AAAA,KAC7B;AAAA,IACA,UAAY,EAAA;AAAA,MACV,WAAW,eAAgB,CAAA;AAAA;AAC7B,GACF;AAEA,EAAA,2BACG,iBACC,EAAA,EAAA,QAAA,kBAAA,IAAA;AAAA,IAAC,IAAK,CAAA,WAAA;AAAA,IAAL;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,eAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAW,EAAA,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,IAAK,CAAA,KAAA,EAAL,EAAW,SAAA,EAAW,OAAO,KAC5B,EAAA,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,QAAS,EAAA,WAAA;AAAA,cACT,WAAW,MAAO,CAAA,eAAA;AAAA,cAClB,IAAK,EAAA,GAAA;AAAA,cACL,OAAQ,EAAA,OAAA;AAAA,cACR,KAAM,EAAA,WAAA;AAAA,cAEN,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,eAAgB,EAAA,EAAA,CAAA;AAAA,gCAChB,GAAA,CAAA,SAAA,EAAA,EAAU,SAAW,EAAA,MAAA,CAAO,iBAAmB,EAAA;AAAA;AAAA;AAAA,WAClD;AAAA,0BACA,GAAA;AAAA,YAAC,2BAAA;AAAA,YAAA;AAAA,cACC,cAAc,IAAK,CAAA,YAAA;AAAA,cACnB,KAAA;AAAA,cAEA,8BAAC,IAAK,CAAA,KAAA,EAAL,EAAW,SAAW,EAAA,MAAA,CAAO,OAAO,GAAU,EAAA;AAAA;AAAA,WACjD;AAAA,0BACA,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,QAAS,EAAA,WAAA;AAAA,cACT,WAAW,MAAO,CAAA,eAAA;AAAA,cAClB,IAAK,EAAA,GAAA;AAAA,cACL,OAAQ,EAAA,OAAA;AAAA,cACR,KAAM,EAAA,WAAA;AAAA,cAEN,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,aAAc,EAAA,EAAA,CAAA;AAAA,gCACd,GAAA,CAAA,QAAA,EAAA,EAAS,SAAW,EAAA,MAAA,CAAO,iBAAmB,EAAA;AAAA;AAAA;AAAA;AACjD,SACF,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,oBAAA,EAAA,EAAqB,KAAO,EAAA,YAAA,EAC1B,QACH,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,UAAA,EAAA,EAAW,SAAW,EAAA,eAAA,CAAgB,UAAY,EAAA;AAAA;AAAA;AAAA,GAEvD,EAAA,CAAA;AAEJ,CAAC;;;;"}
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
  /* */
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
- import { useState, useDeferredValue, useEffect, startTransition } from 'react';
4
+ import { useState, useMemo, useDeferredValue } from 'react';
5
5
  import { ClearPropsContext } from '../ClearPropsContext/ClearPropsContext.mjs';
6
6
  import '../../lib/propsContext/propsContext.mjs';
7
7
  import { dynamic } from '../../lib/propsContext/dynamicProps/dynamic.mjs';
@@ -20,8 +20,6 @@ import { generateValidationTranslation } from './lib/generateValidationTranslati
20
20
  import { FieldError } from '../FieldError/FieldError.mjs';
21
21
  import { FieldDescription } from '../FieldDescription/FieldDescription.mjs';
22
22
  import { ComplexityIndicator } from './components/ComplexityIndicator/ComplexityIndicator.mjs';
23
- import '@mittwald/password-tools-js/policy';
24
- import '@mittwald/password-tools-js/rules';
25
23
  import { generatePassword } from './worker/generatePassword.mjs';
26
24
  import { TogglePasswordVisibilityButton } from './components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton.mjs';
27
25
  import { defaultPasswordCreationPolicy } from './defaultPasswordCreationPolicy.mjs';
@@ -30,7 +28,10 @@ import { ReactAriaControlledValueFix } from '../../lib/react/ReactAriaControlled
30
28
  import { ValidationResultButton } from './components/ValidationResultButton/ValidationResultButton.mjs';
31
29
  import { PasswordGenerateButton } from './components/PasswordGenerateButton/PasswordGenerateButton.mjs';
32
30
  import { useLocalizedContextStringFormatter } from '../TranslationProvider/useLocalizedContextStringFormatter.mjs';
33
- import { isPromise } from 'remeda';
31
+ import { Policy } from '@mittwald/password-tools-js/policy';
32
+ import '@mittwald/password-tools-js/rules';
33
+ import '@mittwald/password-tools-js/generator';
34
+ import { usePolicyValidationResult } from './lib/usePolicyValidationResult.mjs';
34
35
 
35
36
  const PasswordCreationField = flowComponent(
36
37
  "PasswordCreationField",
@@ -43,12 +44,18 @@ const PasswordCreationField = flowComponent(
43
44
  onChange: onChangeFromProps,
44
45
  onValidationResult,
45
46
  isInvalid: invalidFromProps,
46
- validationPolicy = defaultPasswordCreationPolicy,
47
+ validationPolicy: validationPolicyFromProps = defaultPasswordCreationPolicy,
47
48
  isRequired,
48
49
  value: valueFromProps,
49
50
  defaultValue,
50
51
  ...rest
51
52
  } = props;
53
+ const [isLoading, setIsLoading] = useState(false);
54
+ const translate = useLocalizedContextStringFormatter(locales);
55
+ const validationPolicy = useMemo(
56
+ () => Policy.fromDeclaration(validationPolicyFromProps),
57
+ [validationPolicyFromProps]
58
+ );
52
59
  const isControlled = typeof valueFromProps !== "undefined";
53
60
  const hasDefaultValue = typeof defaultValue !== "undefined";
54
61
  const [internalValue, setInternalValue] = useState(
@@ -56,19 +63,8 @@ const PasswordCreationField = flowComponent(
56
63
  );
57
64
  const value = isControlled ? valueFromProps : internalValue;
58
65
  const deferredValue = useDeferredValue(value);
59
- const onChangeHandler = (value2) => {
60
- if (onChangeFromProps) {
61
- onChangeFromProps(value2);
62
- }
63
- if (!isControlled) {
64
- setInternalValue(() => value2);
65
- }
66
- };
67
- const translate = useLocalizedContextStringFormatter(locales);
68
66
  const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);
69
- const [isLoading, setIsLoading] = useState(false);
70
67
  const initialPolicyValidationState = {
71
- initialValidate: true,
72
68
  isValid: false,
73
69
  complexity: {
74
70
  min: validationPolicy.minComplexity,
@@ -80,6 +76,16 @@ const PasswordCreationField = flowComponent(
80
76
  const [policyValidationResult, setPolicyValidationResult] = useState(
81
77
  initialPolicyValidationState
82
78
  );
79
+ usePolicyValidationResult(
80
+ validationPolicy,
81
+ deferredValue,
82
+ () => setIsLoading(() => true),
83
+ ({ password, isValid, results }) => {
84
+ setIsLoading(() => false);
85
+ setPolicyValidationResult(() => results);
86
+ onValidationResult?.({ password, isValid });
87
+ }
88
+ );
83
89
  const stateFromValidationResult = getStateFromLatestPolicyValidationResult(
84
90
  policyValidationResult
85
91
  );
@@ -98,61 +104,21 @@ const PasswordCreationField = flowComponent(
98
104
  const isInvalidFromValidationResult = !isEmptyValue && !stateFromValidationResult?.isValid;
99
105
  const isInvalid = invalidFromProps || isInvalidFromValidationResult;
100
106
  const setOptimisticPolicyValidationResult = (state = {}) => {
107
+ setIsLoading(() => false);
101
108
  setPolicyValidationResult(() => ({
102
109
  ...initialPolicyValidationState,
103
110
  ...state,
104
111
  isValid: state.isValid ?? true
105
112
  }));
106
113
  };
107
- useEffect(() => {
108
- startTransition(async () => {
109
- const validationResult = validationPolicy.validate(deferredValue);
110
- if (!isPromise(validationResult.isValid)) {
111
- const isValid = validationResult.isValid;
112
- setIsLoading(() => false);
113
- setPolicyValidationResult((old) => {
114
- if (!old.initialValidate) {
115
- onValidationResult?.({ password: deferredValue, isValid });
116
- }
117
- return {
118
- initialValidate: false,
119
- isValid,
120
- ruleResults: validationResult.ruleResults,
121
- complexity: validationResult.complexity
122
- };
123
- });
124
- return;
125
- }
126
- const nonPromiseValidationsInvalid = validationResult.ruleResults.filter((r) => !(r instanceof Promise)).some((r) => !r.isValid);
127
- if (!isEmptyValue) {
128
- setIsLoading(() => true);
129
- }
130
- if (!nonPromiseValidationsInvalid) {
131
- setOptimisticPolicyValidationResult();
132
- }
133
- void Promise.all([
134
- Promise.resolve(deferredValue),
135
- ...validationResult.ruleResults.map(async (r) => {
136
- return r;
137
- })
138
- ]).then(([resolvedValue, ...validationResults]) => {
139
- startTransition(() => {
140
- const isValid = !validationResults.some((r) => !r.isValid);
141
- setIsLoading(() => false);
142
- setPolicyValidationResult((old) => {
143
- if (!old.initialValidate) {
144
- onValidationResult?.({ password: resolvedValue, isValid });
145
- }
146
- return {
147
- ...old,
148
- isValid,
149
- ruleResults: validationResults
150
- };
151
- });
152
- });
153
- });
154
- });
155
- }, [deferredValue]);
114
+ const onChangeHandler = (value2) => {
115
+ if (onChangeFromProps) {
116
+ onChangeFromProps(value2);
117
+ }
118
+ if (!isControlled) {
119
+ setInternalValue(() => value2);
120
+ }
121
+ };
156
122
  const onPasswordGenerateHandler = async () => {
157
123
  const generatedPassword = await generatePassword(validationPolicy);
158
124
  setOptimisticPolicyValidationResult();
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import React, {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n startTransition,\n useEffect,\n} from \"react\";\nimport {\n ClearPropsContext,\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 formFieldStyles from \"@/components/FormField/FormField.module.scss\";\nimport clsx from \"clsx\";\nimport { TunnelExit, TunnelProvider } from \"@mittwald/react-tunnel\";\nimport type { Policy } from \"@mittwald/password-tools-js/policy\";\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 { FieldError } from \"@/components/FieldError\";\nimport FieldDescription from \"@/components/FieldDescription\";\nimport ComplexityIndicator from \"@/components/PasswordCreationField/components/ComplexityIndicator/ComplexityIndicator\";\nimport { type PolicyValidationResult } from \"@mittwald/password-tools-js/policy\";\nimport { type RuleValidationResult } from \"@mittwald/password-tools-js/rules\";\nimport { generatePassword } from \"@/components/PasswordCreationField/worker/generatePassword\";\nimport TogglePasswordVisibilityButton from \"@/components/PasswordCreationField/components/TogglePasswordVisibilityButton/TogglePasswordVisibilityButton\";\nimport { defaultPasswordCreationPolicy } from \"@/components/PasswordCreationField/defaultPasswordCreationPolicy\";\nimport { FieldErrorContext } from \"react-aria-components\";\nimport { Wrap } from \"@/components/Wrap\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\nimport { isPromise } from \"remeda\";\n\nexport interface PasswordCreationFieldProps\n extends 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?: Policy;\n}\n\nexport interface ResolvedPolicyValidationResult\n extends Omit<PolicyValidationResult, \"isValid\"> {\n initialValidate: boolean;\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/**\n * @flr-generate all\n * @flr-clear-props-context\n */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onChange: onChangeFromProps,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy = defaultPasswordCreationPolicy,\n isRequired,\n value: valueFromProps,\n defaultValue,\n ...rest\n } = props;\n\n const isControlled = typeof valueFromProps !== \"undefined\";\n const hasDefaultValue = typeof defaultValue !== \"undefined\";\n const [internalValue, setInternalValue] = useState(\n hasDefaultValue ? defaultValue : \"\",\n );\n const value = isControlled ? valueFromProps : internalValue;\n const deferredValue = useDeferredValue(value);\n\n const onChangeHandler = (value: string) => {\n if (onChangeFromProps) {\n onChangeFromProps(value);\n }\n\n if (!isControlled) {\n setInternalValue(() => value);\n }\n };\n\n const translate = useLocalizedContextStringFormatter(locales);\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n initialValidate: true,\n isValid: false,\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 stateFromValidationResult = getStateFromLatestPolicyValidationResult(\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 isEmptyValue = !value;\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 setPolicyValidationResult(() => ({\n ...initialPolicyValidationState,\n ...state,\n isValid: state.isValid ?? true,\n }));\n };\n\n useEffect(() => {\n startTransition(async () => {\n const validationResult = validationPolicy.validate(deferredValue);\n if (!isPromise(validationResult.isValid)) {\n const isValid = validationResult.isValid as boolean;\n\n setIsLoading(() => false);\n setPolicyValidationResult((old) => {\n if (!old.initialValidate) {\n onValidationResult?.({ password: deferredValue, isValid });\n }\n\n return {\n initialValidate: false,\n isValid,\n ruleResults:\n validationResult.ruleResults as RuleValidationResult[],\n complexity: validationResult.complexity,\n };\n });\n return;\n }\n\n const nonPromiseValidationsInvalid = validationResult.ruleResults\n .filter((r): r is RuleValidationResult => !(r instanceof Promise))\n .some((r) => !r.isValid);\n\n if (!isEmptyValue) {\n setIsLoading(() => true);\n }\n if (!nonPromiseValidationsInvalid) {\n setOptimisticPolicyValidationResult();\n }\n\n void Promise.all([\n Promise.resolve(deferredValue),\n ...validationResult.ruleResults.map(async (r) => {\n return r;\n }),\n ]).then(([resolvedValue, ...validationResults]) => {\n startTransition(() => {\n const isValid = !validationResults.some((r) => !r.isValid);\n\n setIsLoading(() => false);\n setPolicyValidationResult((old) => {\n if (!old.initialValidate) {\n onValidationResult?.({ password: resolvedValue, isValid });\n }\n\n return {\n ...old,\n isValid,\n ruleResults: validationResults,\n };\n });\n });\n });\n });\n }, [deferredValue]);\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n onChangeHandler(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData.getData(\"text\");\n if (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 Button: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n className: formFieldStyles.label,\n tunnelId: \"label\",\n optional: !isRequired,\n isDisabled: isDisabled,\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 FieldDescription: {\n className: formFieldStyles.fieldDescription,\n },\n FieldError: {\n className: formFieldStyles.customFieldError,\n children: dynamic(() => {\n if (latestValidationErrorText) {\n return latestValidationErrorText;\n }\n }),\n },\n };\n\n return (\n <ClearPropsContext>\n <TunnelProvider>\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={onChangeHandler}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, formFieldStyles.formField)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <TunnelExit id=\"label\" />\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={{ ...props, value }}\n >\n <Aria.Input ref={ref} className={styles.input} />\n </ReactAriaControlledValueFix>\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <TunnelExit id=\"button\" />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n />\n </Aria.Group>\n <PropsContextProvider props={propsContext}>\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n {isInvalidFromValidationResult &&\n policyValidationResult.isValid !== \"indeterminate\" && (\n <FieldError>{latestValidationErrorText}</FieldError>\n )}\n <Wrap if={isInvalidFromValidationResult}>\n <FieldErrorContext.Provider\n value={{\n isInvalid: false,\n validationErrors: [],\n validationDetails: {\n customError: false,\n valid: true,\n typeMismatch: false,\n stepMismatch: false,\n valueMissing: false,\n tooShort: false,\n tooLong: false,\n rangeUnderflow: false,\n patternMismatch: false,\n badInput: false,\n rangeOverflow: false,\n },\n }}\n >\n {children}\n </FieldErrorContext.Provider>\n </Wrap>\n </PropsContextProvider>\n </Aria.TextField>\n </TunnelProvider>\n </ClearPropsContext>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"PasswordCreationField.mjs","sources":["../../../../../../src/components/PasswordCreationField/PasswordCreationField.tsx"],"sourcesContent":["import React, {\n type PropsWithChildren,\n useState,\n type ClipboardEvent,\n useDeferredValue,\n useMemo,\n} from \"react\";\nimport {\n ClearPropsContext,\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 formFieldStyles from \"@/components/FormField/FormField.module.scss\";\nimport clsx from \"clsx\";\nimport { TunnelExit, TunnelProvider } from \"@mittwald/react-tunnel\";\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 { FieldError } from \"@/components/FieldError\";\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 { defaultPasswordCreationPolicy } from \"@/components/PasswordCreationField/defaultPasswordCreationPolicy\";\nimport { FieldErrorContext } from \"react-aria-components\";\nimport { Wrap } from \"@/components/Wrap\";\nimport { ReactAriaControlledValueFix } from \"@/lib/react/ReactAriaControlledValueFix\";\nimport { ValidationResultButton } from \"@/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton\";\nimport { PasswordGenerateButton } from \"@/components/PasswordCreationField/components/PasswordGenerateButton/PasswordGenerateButton\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\nimport type {\n PolicyValidationResult,\n PolicyGenericDeclaration,\n RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\nimport { Policy } from \"@/integrations/@mittwald/password-tools-js\";\nimport { usePolicyValidationResult } from \"@/components/PasswordCreationField/lib/usePolicyValidationResult\";\n\nexport interface PasswordCreationFieldProps\n extends 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\n extends Omit<PolicyValidationResult, \"isValid\"> {\n isValid: boolean | \"indeterminate\";\n ruleResults: RuleValidationResult[];\n}\n\n/**\n * @flr-generate all\n * @flr-clear-props-context\n */\nexport const PasswordCreationField = flowComponent(\n \"PasswordCreationField\",\n (props) => {\n const {\n children,\n className,\n ref,\n isDisabled,\n onChange: onChangeFromProps,\n onValidationResult,\n isInvalid: invalidFromProps,\n validationPolicy:\n validationPolicyFromProps = defaultPasswordCreationPolicy,\n isRequired,\n value: valueFromProps,\n defaultValue,\n ...rest\n } = props;\n\n const [isLoading, setIsLoading] = useState(false);\n const translate = useLocalizedContextStringFormatter(locales);\n const validationPolicy = useMemo(\n () => Policy.fromDeclaration(validationPolicyFromProps),\n [validationPolicyFromProps],\n );\n\n const isControlled = typeof valueFromProps !== \"undefined\";\n const hasDefaultValue = typeof defaultValue !== \"undefined\";\n const [internalValue, setInternalValue] = useState(\n hasDefaultValue ? defaultValue : \"\",\n );\n const value = isControlled ? valueFromProps : internalValue;\n const deferredValue = useDeferredValue(value);\n\n const [isPasswordRevealed, setIsPasswordRevealed] = useState(false);\n const initialPolicyValidationState: ResolvedPolicyValidationResult = {\n isValid: false,\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 () => setIsLoading(() => true),\n ({ password, isValid, results }) => {\n setIsLoading(() => false);\n setPolicyValidationResult(() => results);\n onValidationResult?.({ password, isValid });\n },\n );\n\n const stateFromValidationResult = getStateFromLatestPolicyValidationResult(\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 isEmptyValue = !value;\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: state.isValid ?? true,\n }));\n };\n\n const onChangeHandler = (value: string) => {\n if (onChangeFromProps) {\n onChangeFromProps(value);\n }\n\n if (!isControlled) {\n setInternalValue(() => value);\n }\n };\n\n const onPasswordGenerateHandler: ActionFn = async () => {\n const generatedPassword = await generatePassword(validationPolicy);\n setOptimisticPolicyValidationResult();\n setIsPasswordRevealed(true);\n onChangeHandler(generatedPassword);\n };\n\n const onPasswordPasteHandler = (event: ClipboardEvent) => {\n const pastedValue = event.clipboardData.getData(\"text\");\n if (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 Button: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n },\n CopyButton: {\n tunnelId: \"button\",\n size: \"m\",\n variant: \"plain\",\n color: \"secondary\",\n isDisabled: isDisabled,\n className: styles.button,\n text: value,\n },\n Label: {\n className: formFieldStyles.label,\n tunnelId: \"label\",\n optional: !isRequired,\n isDisabled: isDisabled,\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 FieldDescription: {\n className: formFieldStyles.fieldDescription,\n },\n FieldError: {\n className: formFieldStyles.customFieldError,\n children: dynamic(() => {\n if (latestValidationErrorText) {\n return latestValidationErrorText;\n }\n }),\n },\n };\n\n return (\n <ClearPropsContext>\n <TunnelProvider>\n <Aria.TextField\n {...rest}\n value={value}\n type={isPasswordRevealed ? \"text\" : \"password\"}\n onChange={onChangeHandler}\n onPaste={onPasswordPasteHandler}\n className={clsx(className, formFieldStyles.formField)}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n isRequired={isRequired}\n >\n <TunnelExit id=\"label\" />\n <Aria.Group\n isDisabled={isDisabled}\n className={clsx(styles.inputGroup)}\n >\n <ReactAriaControlledValueFix\n inputContext={Aria.InputContext}\n props={{ ...props, value }}\n >\n <Aria.Input ref={ref} className={styles.input} />\n </ReactAriaControlledValueFix>\n <Aria.Group className={styles.buttonContainer}>\n <TogglePasswordVisibilityButton\n className={styles.button}\n isVisible={isPasswordRevealed}\n isDisabled={isDisabled}\n onPress={togglePasswordVisibilityHandler}\n />\n <TunnelExit id=\"button\" />\n </Aria.Group>\n <ComplexityIndicator\n isEmptyValue={isEmptyValue}\n isLoading={isLoading}\n policyValidationResult={policyValidationResult}\n />\n </Aria.Group>\n <PropsContextProvider props={propsContext}>\n {isValidFromValidationResult && (\n <FieldDescription>{latestValidationErrorText}</FieldDescription>\n )}\n {isInvalidFromValidationResult &&\n policyValidationResult.isValid !== \"indeterminate\" && (\n <FieldError>{latestValidationErrorText}</FieldError>\n )}\n <Wrap if={isInvalidFromValidationResult}>\n <FieldErrorContext.Provider\n value={{\n isInvalid: false,\n validationErrors: [],\n validationDetails: {\n customError: false,\n valid: true,\n typeMismatch: false,\n stepMismatch: false,\n valueMissing: false,\n tooShort: false,\n tooLong: false,\n rangeUnderflow: false,\n patternMismatch: false,\n badInput: false,\n rangeOverflow: false,\n },\n }}\n >\n {children}\n </FieldErrorContext.Provider>\n </Wrap>\n </PropsContextProvider>\n </Aria.TextField>\n </TunnelProvider>\n </ClearPropsContext>\n );\n },\n);\n\nexport default PasswordCreationField;\n"],"names":["value"],"mappings":"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"}
@@ -13,9 +13,13 @@ import { Heading } from '../../../Heading/Heading.mjs';
13
13
  const ValidationResultButton = (props) => {
14
14
  const { policyValidationResult, isDisabled, isEmptyValue, className } = props;
15
15
  const translate = useLocalizedStringFormatter(locales);
16
- const validationResultComponents = policyValidationResult?.ruleResults?.filter((r) => {
16
+ let validationResults = policyValidationResult?.ruleResults?.filter((r) => {
17
17
  return isEmptyValue ? !r.isValid : true;
18
- }).map((result, index) => {
18
+ });
19
+ if (validationResults && validationResults.length === 0 && isEmptyValue) {
20
+ validationResults = policyValidationResult?.ruleResults;
21
+ }
22
+ const validationResultComponents = validationResults?.map((result, index) => {
19
23
  return /* @__PURE__ */ jsx(
20
24
  ValidationResultEntry,
21
25
  {
@@ -23,7 +27,7 @@ const ValidationResultButton = (props) => {
23
27
  },
24
28
  `${result.identifier}-${index}`
25
29
  );
26
- });
30
+ }) ?? [];
27
31
  return /* @__PURE__ */ jsxs(ContextualHelpTrigger, { children: [
28
32
  /* @__PURE__ */ jsx(
29
33
  Button,
@@ -35,6 +39,7 @@ const ValidationResultButton = (props) => {
35
39
  ),
36
40
  /* @__PURE__ */ jsxs(ContextualHelp, { children: [
37
41
  /* @__PURE__ */ jsx(Heading, { children: translate.format("password.requirements.heading") }),
42
+ validationResultComponents.length === 0 && /* @__PURE__ */ jsx(ValidationResultEntry, { result: { isValid: true }, unspecifiedRules: true }),
38
43
  validationResultComponents
39
44
  ] })
40
45
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationResultButton.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton.tsx"],"sourcesContent":["import React, { type FC } from \"react\";\nimport { useLocalizedStringFormatter } from \"react-aria\";\n\nimport locales from \"./../../locales/*.locale.json\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport ValidationResultEntry from \"@/components/PasswordCreationField/components/ValidationResultEntry/ValidationResultEntry\";\nimport { Button } from \"@/components/Button\";\nimport {\n ContextualHelp,\n ContextualHelpTrigger,\n} from \"@/components/ContextualHelp\";\nimport { Heading } from \"@/components/Heading\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\n\ninterface Props extends PropsWithClassName {\n policyValidationResult?: ResolvedPolicyValidationResult;\n isDisabled?: boolean;\n isEmptyValue: boolean;\n}\n\nexport const ValidationResultButton: FC<Props> = (props) => {\n const { policyValidationResult, isDisabled, isEmptyValue, className } = props;\n\n const translate = useLocalizedStringFormatter(locales);\n\n const validationResultComponents = policyValidationResult?.ruleResults\n ?.filter((r) => {\n return isEmptyValue ? !r.isValid : true;\n })\n .map((result, index) => {\n return (\n <ValidationResultEntry\n key={`${result.identifier}-${index}`}\n result={result}\n />\n );\n });\n\n return (\n <ContextualHelpTrigger>\n <Button\n data-component=\"showPasswordRules\"\n isDisabled={isDisabled}\n className={className}\n />\n <ContextualHelp>\n <Heading>{translate.format(\"password.requirements.heading\")}</Heading>\n {validationResultComponents}\n </ContextualHelp>\n </ContextualHelpTrigger>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAoBa,MAAA,sBAAA,GAAoC,CAAC,KAAU,KAAA;AAC1D,EAAA,MAAM,EAAE,sBAAA,EAAwB,UAAY,EAAA,YAAA,EAAc,WAAc,GAAA,KAAA;AAExE,EAAM,MAAA,SAAA,GAAY,4BAA4B,OAAO,CAAA;AAErD,EAAA,MAAM,0BAA6B,GAAA,sBAAA,EAAwB,WACvD,EAAA,MAAA,CAAO,CAAC,CAAM,KAAA;AACd,IAAO,OAAA,YAAA,GAAe,CAAC,CAAA,CAAE,OAAU,GAAA,IAAA;AAAA,GACpC,CAAA,CACA,GAAI,CAAA,CAAC,QAAQ,KAAU,KAAA;AACtB,IACE,uBAAA,GAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QAEC;AAAA,OAAA;AAAA,MADK,CAAG,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,KAEpC;AAAA,GAEH,CAAA;AAEH,EAAA,4BACG,qBACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,gBAAe,EAAA,mBAAA;AAAA,QACf,UAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,yBACC,cACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAS,EAAA,EAAA,QAAA,EAAA,SAAA,CAAU,MAAO,CAAA,+BAA+B,CAAE,EAAA,CAAA;AAAA,MAC3D;AAAA,KACH,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ValidationResultButton.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/components/ValidationResultButton/ValidationResultButton.tsx"],"sourcesContent":["import React, { type FC } from \"react\";\nimport { useLocalizedStringFormatter } from \"react-aria\";\n\nimport locales from \"./../../locales/*.locale.json\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\nimport ValidationResultEntry from \"@/components/PasswordCreationField/components/ValidationResultEntry/ValidationResultEntry\";\nimport { Button } from \"@/components/Button\";\nimport {\n ContextualHelp,\n ContextualHelpTrigger,\n} from \"@/components/ContextualHelp\";\nimport { Heading } from \"@/components/Heading\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\n\ninterface Props extends PropsWithClassName {\n policyValidationResult?: ResolvedPolicyValidationResult;\n isDisabled?: boolean;\n isEmptyValue: boolean;\n}\n\nexport const ValidationResultButton: FC<Props> = (props) => {\n const { policyValidationResult, isDisabled, isEmptyValue, className } = props;\n\n const translate = useLocalizedStringFormatter(locales);\n\n let validationResults = policyValidationResult?.ruleResults?.filter((r) => {\n return isEmptyValue ? !r.isValid : true;\n });\n if (validationResults && validationResults.length === 0 && isEmptyValue) {\n // if we have no rules to show on first info - just list them all\n validationResults = policyValidationResult?.ruleResults;\n }\n\n const validationResultComponents =\n validationResults?.map((result, index) => {\n return (\n <ValidationResultEntry\n key={`${result.identifier}-${index}`}\n result={result}\n />\n );\n }) ?? [];\n\n return (\n <ContextualHelpTrigger>\n <Button\n data-component=\"showPasswordRules\"\n isDisabled={isDisabled}\n className={className}\n />\n <ContextualHelp>\n <Heading>{translate.format(\"password.requirements.heading\")}</Heading>\n {validationResultComponents.length === 0 && (\n <ValidationResultEntry result={{ isValid: true }} unspecifiedRules />\n )}\n {validationResultComponents}\n </ContextualHelp>\n </ContextualHelpTrigger>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAoBa,MAAA,sBAAA,GAAoC,CAAC,KAAU,KAAA;AAC1D,EAAA,MAAM,EAAE,sBAAA,EAAwB,UAAY,EAAA,YAAA,EAAc,WAAc,GAAA,KAAA;AAExE,EAAM,MAAA,SAAA,GAAY,4BAA4B,OAAO,CAAA;AAErD,EAAA,IAAI,iBAAoB,GAAA,sBAAA,EAAwB,WAAa,EAAA,MAAA,CAAO,CAAC,CAAM,KAAA;AACzE,IAAO,OAAA,YAAA,GAAe,CAAC,CAAA,CAAE,OAAU,GAAA,IAAA;AAAA,GACpC,CAAA;AACD,EAAA,IAAI,iBAAqB,IAAA,iBAAA,CAAkB,MAAW,KAAA,CAAA,IAAK,YAAc,EAAA;AAEvE,IAAA,iBAAA,GAAoB,sBAAwB,EAAA,WAAA;AAAA;AAG9C,EAAA,MAAM,0BACJ,GAAA,iBAAA,EAAmB,GAAI,CAAA,CAAC,QAAQ,KAAU,KAAA;AACxC,IACE,uBAAA,GAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QAEC;AAAA,OAAA;AAAA,MADK,CAAG,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,KAEpC;AAAA,GAEH,KAAK,EAAC;AAET,EAAA,4BACG,qBACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,gBAAe,EAAA,mBAAA;AAAA,QACf,UAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,yBACC,cACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAS,EAAA,EAAA,QAAA,EAAA,SAAA,CAAU,MAAO,CAAA,+BAA+B,CAAE,EAAA,CAAA;AAAA,MAC3D,0BAAA,CAA2B,MAAW,KAAA,CAAA,oBACpC,GAAA,CAAA,qBAAA,EAAA,EAAsB,MAAQ,EAAA,EAAE,OAAS,EAAA,IAAA,EAAQ,EAAA,gBAAA,EAAgB,IAAC,EAAA,CAAA;AAAA,MAEpE;AAAA,KACH,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -10,13 +10,17 @@ import styles from './ValidationResultEntry.module.scss.mjs';
10
10
  import { useLocalizedContextStringFormatter } from '../../../TranslationProvider/useLocalizedContextStringFormatter.mjs';
11
11
 
12
12
  const ValidationResultEntry = (props) => {
13
- const { result } = props;
13
+ const { result, unspecifiedRules = false } = props;
14
14
  const translate = useLocalizedContextStringFormatter(locales);
15
15
  const icon = result.isValid ? /* @__PURE__ */ jsx(IconCircleCheck, { color: "green" }) : /* @__PURE__ */ jsx(IconCircleMinus, { color: "red" });
16
- const [translationKey, translationValues] = generateValidationTranslation(
16
+ let [translationKey, translationValues] = generateValidationTranslation(
17
17
  result,
18
18
  true
19
19
  );
20
+ if (unspecifiedRules) {
21
+ translationKey = `${translationKey}.unspecified`;
22
+ translationValues = {};
23
+ }
20
24
  return /* @__PURE__ */ jsxs(
21
25
  Text,
22
26
  {
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationResultEntry.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/components/ValidationResultEntry/ValidationResultEntry.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport React from \"react\";\nimport { Text } from \"@/components/Text\";\nimport { IconCircleCheck, IconCircleMinus } from \"@tabler/icons-react\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport locales from \"./../../locales/*.locale.json\";\nimport styles from \"./ValidationResultEntry.module.scss\";\nimport type { RuleValidationResult } from \"@mittwald/password-tools-js/rules\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\n\ninterface Props {\n result: RuleValidationResult;\n}\n\n/** @internal */\nexport const ValidationResultEntry: FC<Props> = (props) => {\n const { result } = props;\n const translate = useLocalizedContextStringFormatter(locales);\n\n const icon = result.isValid ? (\n <IconCircleCheck color=\"green\" />\n ) : (\n <IconCircleMinus color=\"red\" />\n );\n\n const [translationKey, translationValues] = generateValidationTranslation(\n result,\n true,\n );\n\n return (\n <Text\n className={styles.validationResultEntry}\n data-rule={result.ruleType}\n data-rule-valid={result.isValid}\n key={translationKey}\n >\n {icon}\n {translate.format(translationKey, translationValues)}\n </Text>\n );\n};\n\nexport default ValidationResultEntry;\n"],"names":[],"mappings":";;;;;;;;;AAea,MAAA,qBAAA,GAAmC,CAAC,KAAU,KAAA;AACzD,EAAM,MAAA,EAAE,QAAW,GAAA,KAAA;AACnB,EAAM,MAAA,SAAA,GAAY,mCAAmC,OAAO,CAAA;AAE5D,EAAM,MAAA,IAAA,GAAO,MAAO,CAAA,OAAA,mBACjB,GAAA,CAAA,eAAA,EAAA,EAAgB,KAAM,EAAA,OAAA,EAAQ,CAE/B,mBAAA,GAAA,CAAC,eAAgB,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,CAAA;AAG/B,EAAM,MAAA,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,6BAAA;AAAA,IAC1C,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAO,CAAA,qBAAA;AAAA,MAClB,aAAW,MAAO,CAAA,QAAA;AAAA,MAClB,mBAAiB,MAAO,CAAA,OAAA;AAAA,MAGvB,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA,SAAA,CAAU,MAAO,CAAA,cAAA,EAAgB,iBAAiB;AAAA;AAAA,KAAA;AAAA,IAH9C;AAAA,GAIP;AAEJ;;;;"}
1
+ {"version":3,"file":"ValidationResultEntry.mjs","sources":["../../../../../../../../src/components/PasswordCreationField/components/ValidationResultEntry/ValidationResultEntry.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport React from \"react\";\nimport { Text } from \"@/components/Text\";\nimport { IconCircleCheck, IconCircleMinus } from \"@tabler/icons-react\";\nimport generateValidationTranslation from \"@/components/PasswordCreationField/lib/generateValidationTranslation\";\nimport locales from \"./../../locales/*.locale.json\";\nimport styles from \"./ValidationResultEntry.module.scss\";\nimport type { RuleValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport { useLocalizedContextStringFormatter } from \"@/components/TranslationProvider/useLocalizedContextStringFormatter\";\n\ninterface Props {\n result: Partial<RuleValidationResult>;\n unspecifiedRules?: boolean;\n}\n\n/** @internal */\nexport const ValidationResultEntry: FC<Props> = (props) => {\n const { result, unspecifiedRules = false } = props;\n const translate = useLocalizedContextStringFormatter(locales);\n\n const icon = result.isValid ? (\n <IconCircleCheck color=\"green\" />\n ) : (\n <IconCircleMinus color=\"red\" />\n );\n\n let [translationKey, translationValues] = generateValidationTranslation(\n result,\n true,\n );\n\n if (unspecifiedRules) {\n translationKey = `${translationKey}.unspecified`;\n translationValues = {};\n }\n\n return (\n <Text\n className={styles.validationResultEntry}\n data-rule={result.ruleType}\n data-rule-valid={result.isValid}\n key={translationKey}\n >\n {icon}\n {translate.format(translationKey, translationValues)}\n </Text>\n );\n};\n\nexport default ValidationResultEntry;\n"],"names":[],"mappings":";;;;;;;;;AAgBa,MAAA,qBAAA,GAAmC,CAAC,KAAU,KAAA;AACzD,EAAA,MAAM,EAAE,MAAA,EAAQ,gBAAmB,GAAA,KAAA,EAAU,GAAA,KAAA;AAC7C,EAAM,MAAA,SAAA,GAAY,mCAAmC,OAAO,CAAA;AAE5D,EAAM,MAAA,IAAA,GAAO,MAAO,CAAA,OAAA,mBACjB,GAAA,CAAA,eAAA,EAAA,EAAgB,KAAM,EAAA,OAAA,EAAQ,CAE/B,mBAAA,GAAA,CAAC,eAAgB,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,CAAA;AAG/B,EAAI,IAAA,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,6BAAA;AAAA,IACxC,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAA,cAAA,GAAiB,GAAG,cAAc,CAAA,YAAA,CAAA;AAClC,IAAA,iBAAA,GAAoB,EAAC;AAAA;AAGvB,EACE,uBAAA,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAO,CAAA,qBAAA;AAAA,MAClB,aAAW,MAAO,CAAA,QAAA;AAAA,MAClB,mBAAiB,MAAO,CAAA,OAAA;AAAA,MAGvB,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA,SAAA,CAAU,MAAO,CAAA,cAAA,EAAgB,iBAAiB;AAAA;AAAA,KAAA;AAAA,IAH9C;AAAA,GAIP;AAEJ;;;;"}
@@ -2,6 +2,7 @@
2
2
  /* */
3
3
  import { Policy } from '@mittwald/password-tools-js/policy';
4
4
  import { RuleType } from '@mittwald/password-tools-js/rules';
5
+ import '@mittwald/password-tools-js/generator';
5
6
 
6
7
  const defaultPasswordCreationPolicy = Policy.fromDeclaration({
7
8
  minComplexity: 3,
@@ -1 +1 @@
1
- {"version":3,"file":"defaultPasswordCreationPolicy.mjs","sources":["../../../../../../src/components/PasswordCreationField/defaultPasswordCreationPolicy.ts"],"sourcesContent":["import { Policy } from \"@mittwald/password-tools-js/policy\";\nimport { RuleType } from \"@mittwald/password-tools-js/rules\";\n\nexport const defaultPasswordCreationPolicy = Policy.fromDeclaration({\n minComplexity: 3,\n rules: [\n {\n ruleType: RuleType.length,\n min: 12,\n },\n {\n ruleType: RuleType.hibp,\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":";;;AAGa,MAAA,6BAAA,GAAgC,OAAO,eAAgB,CAAA;AAAA,EAClE,aAAe,EAAA,CAAA;AAAA,EACf,KAAO,EAAA;AAAA,IACL;AAAA,MACE,UAAU,QAAS,CAAA,MAAA;AAAA,MACnB,GAAK,EAAA;AAAA,KACP;AAAA,IACA;AAAA,MACE,UAAU,QAAS,CAAA;AAAA,KACrB;AAAA,IACA;AAAA,MACE,UAAY,EAAA,SAAA;AAAA,MACZ,UAAU,QAAS,CAAA,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA,KACvB;AAAA,IACA;AAAA,MACE,UAAY,EAAA,SAAA;AAAA,MACZ,UAAU,QAAS,CAAA,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA;AACvB;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"defaultPasswordCreationPolicy.mjs","sources":["../../../../../../src/components/PasswordCreationField/defaultPasswordCreationPolicy.ts"],"sourcesContent":["import { Policy, RuleType } from \"@/integrations/@mittwald/password-tools-js\";\n\nexport const defaultPasswordCreationPolicy = Policy.fromDeclaration({\n minComplexity: 3,\n rules: [\n {\n ruleType: RuleType.length,\n min: 12,\n },\n {\n ruleType: RuleType.hibp,\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":";;;;AAEa,MAAA,6BAAA,GAAgC,OAAO,eAAgB,CAAA;AAAA,EAClE,aAAe,EAAA,CAAA;AAAA,EACf,KAAO,EAAA;AAAA,IACL;AAAA,MACE,UAAU,QAAS,CAAA,MAAA;AAAA,MACnB,GAAK,EAAA;AAAA,KACP;AAAA,IACA;AAAA,MACE,UAAU,QAAS,CAAA;AAAA,KACrB;AAAA,IACA;AAAA,MACE,UAAY,EAAA,SAAA;AAAA,MACZ,UAAU,QAAS,CAAA,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA,KACvB;AAAA,IACA;AAAA,MACE,UAAY,EAAA,SAAA;AAAA,MACZ,UAAU,QAAS,CAAA,QAAA;AAAA,MACnB,SAAA,EAAW,CAAC,SAAS;AAAA;AACvB;AAEJ,CAAC;;;;"}
@@ -7,7 +7,7 @@ const generatePasswordCreationFieldValidation = (validationPolicy = defaultPassw
7
7
  if (!value) {
8
8
  return true;
9
9
  }
10
- const validationResult = validationPolicy.validate(value);
10
+ const validationResult = await validationPolicy.validate(value);
11
11
  if (isPromise(validationResult.isValid)) {
12
12
  return await validationResult.isValid;
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generatePasswordCreationFieldValidation.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/generatePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { Policy } from \"@mittwald/password-tools-js/policy\";\nimport { defaultPasswordCreationPolicy } from \"@/components/PasswordCreationField/defaultPasswordCreationPolicy\";\nimport { isPromise } from \"remeda\";\n\nexport const generatePasswordCreationFieldValidation =\n (validationPolicy: Policy = defaultPasswordCreationPolicy) =>\n async (value: string) => {\n if (!value) {\n return true;\n }\n\n const validationResult = validationPolicy.validate(value);\n\n if (isPromise(validationResult.isValid)) {\n return await validationResult.isValid;\n }\n\n return validationResult.isValid;\n };\n"],"names":[],"mappings":";;;AAIO,MAAM,uCACX,GAAA,CAAC,gBAA2B,GAAA,6BAAA,KAC5B,OAAO,KAAkB,KAAA;AACvB,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAO,OAAA,IAAA;AAAA;AAGT,EAAM,MAAA,gBAAA,GAAmB,gBAAiB,CAAA,QAAA,CAAS,KAAK,CAAA;AAExD,EAAI,IAAA,SAAA,CAAU,gBAAiB,CAAA,OAAO,CAAG,EAAA;AACvC,IAAA,OAAO,MAAM,gBAAiB,CAAA,OAAA;AAAA;AAGhC,EAAA,OAAO,gBAAiB,CAAA,OAAA;AAC1B;;;;"}
1
+ {"version":3,"file":"generatePasswordCreationFieldValidation.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/generatePasswordCreationFieldValidation.ts"],"sourcesContent":["import type { Policy } from \"@/integrations/@mittwald/password-tools-js\";\nimport { defaultPasswordCreationPolicy } from \"@/components/PasswordCreationField/defaultPasswordCreationPolicy\";\nimport { isPromise } from \"remeda\";\n\nexport const generatePasswordCreationFieldValidation =\n (validationPolicy: Policy = defaultPasswordCreationPolicy) =>\n async (value: string) => {\n if (!value) {\n return true;\n }\n\n const validationResult = await validationPolicy.validate(value);\n\n if (isPromise(validationResult.isValid)) {\n return await validationResult.isValid;\n }\n\n return validationResult.isValid;\n };\n"],"names":[],"mappings":";;;AAIO,MAAM,uCACX,GAAA,CAAC,gBAA2B,GAAA,6BAAA,KAC5B,OAAO,KAAkB,KAAA;AACvB,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAM,gBAAmB,GAAA,MAAM,gBAAiB,CAAA,QAAA,CAAS,KAAK,CAAA;AAE9D,EAAI,IAAA,SAAA,CAAU,gBAAiB,CAAA,OAAO,CAAG,EAAA;AACvC,IAAA,OAAO,MAAM,gBAAiB,CAAA,OAAA;AAAA;AAGhC,EAAA,OAAO,gBAAiB,CAAA,OAAA;AAC1B;;;;"}
@@ -1,6 +1,8 @@
1
1
  "use client"
2
2
  /* */
3
+ import '@mittwald/password-tools-js/policy';
3
4
  import { RuleType } from '@mittwald/password-tools-js/rules';
5
+ import '@mittwald/password-tools-js/generator';
4
6
 
5
7
  const generateTranslationString = (rule, shortVersion = false) => {
6
8
  if (rule.translationKey) {
@@ -1 +1 @@
1
- {"version":3,"file":"generateValidationTranslation.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/generateValidationTranslation.ts"],"sourcesContent":["import {\n RuleType,\n type RuleValidationResult,\n} from \"@mittwald/password-tools-js/rules\";\n\nconst generateTranslationString = (\n rule: Partial<RuleValidationResult> & { translationKey?: string },\n shortVersion = false,\n): string => {\n if (rule.translationKey) {\n return `validation.${rule.translationKey}`;\n }\n const translateString = `validation.${rule.ruleType ?? \"general\"}`;\n let finalTranslationString = \"\";\n\n if (\n (\"min\" in rule && rule.min !== undefined) ||\n (\"max\" in rule && rule.max !== undefined)\n ) {\n const breakingBoundaryProperty = rule.failingBoundary\n ? rule.failingBoundary\n : rule.min\n ? \"min\"\n : \"max\";\n\n if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}.${breakingBoundaryProperty}`;\n } else {\n finalTranslationString = `${translateString}.${breakingBoundaryProperty}`;\n }\n } else if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}`;\n } else {\n finalTranslationString = translateString;\n }\n\n return shortVersion\n ? `${finalTranslationString}.short`\n : finalTranslationString;\n};\n\nexport const generateValidationTranslation = (\n r: Partial<RuleValidationResult>,\n shotVersion = false,\n): [string, Record<string, string | number | boolean> | undefined] => {\n const translationKey = generateTranslationString(r, shotVersion);\n\n if (r.ruleType === RuleType.char && r.chars) {\n return [\n translationKey,\n { ...r, chars: r.chars.map((c) => c.char).join(\"\") },\n ];\n }\n\n return [\n translationKey,\n r as unknown as Record<string, string | number | boolean> | undefined,\n ];\n};\n\nexport default generateValidationTranslation;\n"],"names":[],"mappings":";;AAKA,MAAM,yBAA4B,GAAA,CAChC,IACA,EAAA,YAAA,GAAe,KACJ,KAAA;AACX,EAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,IAAO,OAAA,CAAA,WAAA,EAAc,KAAK,cAAc,CAAA,CAAA;AAAA;AAE1C,EAAA,MAAM,eAAkB,GAAA,CAAA,WAAA,EAAc,IAAK,CAAA,QAAA,IAAY,SAAS,CAAA,CAAA;AAChE,EAAA,IAAI,sBAAyB,GAAA,EAAA;AAE7B,EACG,IAAA,KAAA,IAAS,QAAQ,IAAK,CAAA,GAAA,KAAQ,UAC9B,KAAS,IAAA,IAAA,IAAQ,IAAK,CAAA,GAAA,KAAQ,MAC/B,EAAA;AACA,IAAA,MAAM,2BAA2B,IAAK,CAAA,eAAA,GAClC,KAAK,eACL,GAAA,IAAA,CAAK,MACH,KACA,GAAA,KAAA;AAEN,IAAA,IAAI,KAAK,UAAY,EAAA;AACnB,MAAA,sBAAA,GAAyB,GAAG,eAAe,CAAA,CAAA,EAAI,IAAK,CAAA,UAAU,IAAI,wBAAwB,CAAA,CAAA;AAAA,KACrF,MAAA;AACL,MAAyB,sBAAA,GAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,wBAAwB,CAAA,CAAA;AAAA;AACzE,GACF,MAAA,IAAW,KAAK,UAAY,EAAA;AAC1B,IAAA,sBAAA,GAAyB,CAAG,EAAA,eAAe,CAAI,CAAA,EAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,GACzD,MAAA;AACL,IAAyB,sBAAA,GAAA,eAAA;AAAA;AAG3B,EAAO,OAAA,YAAA,GACH,CAAG,EAAA,sBAAsB,CACzB,MAAA,CAAA,GAAA,sBAAA;AACN,CAAA;AAEO,MAAM,6BAAgC,GAAA,CAC3C,CACA,EAAA,WAAA,GAAc,KACsD,KAAA;AACpE,EAAM,MAAA,cAAA,GAAiB,yBAA0B,CAAA,CAAA,EAAG,WAAW,CAAA;AAE/D,EAAA,IAAI,CAAE,CAAA,QAAA,KAAa,QAAS,CAAA,IAAA,IAAQ,EAAE,KAAO,EAAA;AAC3C,IAAO,OAAA;AAAA,MACL,cAAA;AAAA,MACA,EAAE,GAAG,CAAG,EAAA,KAAA,EAAO,EAAE,KAAM,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,EAAE,CAAE;AAAA,KACrD;AAAA;AAGF,EAAO,OAAA;AAAA,IACL,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"generateValidationTranslation.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/generateValidationTranslation.ts"],"sourcesContent":["import {\n RuleType,\n type RuleValidationResult,\n} from \"@/integrations/@mittwald/password-tools-js\";\n\nconst generateTranslationString = (\n rule: Partial<RuleValidationResult> & { translationKey?: string },\n shortVersion = false,\n): string => {\n if (rule.translationKey) {\n return `validation.${rule.translationKey}`;\n }\n const translateString = `validation.${rule.ruleType ?? \"general\"}`;\n let finalTranslationString = \"\";\n\n if (\n (\"min\" in rule && rule.min !== undefined) ||\n (\"max\" in rule && rule.max !== undefined)\n ) {\n const breakingBoundaryProperty = rule.failingBoundary\n ? rule.failingBoundary\n : rule.min\n ? \"min\"\n : \"max\";\n\n if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}.${breakingBoundaryProperty}`;\n } else {\n finalTranslationString = `${translateString}.${breakingBoundaryProperty}`;\n }\n } else if (rule.identifier) {\n finalTranslationString = `${translateString}.${rule.identifier}`;\n } else {\n finalTranslationString = translateString;\n }\n\n return shortVersion\n ? `${finalTranslationString}.short`\n : finalTranslationString;\n};\n\nexport const generateValidationTranslation = (\n r: Partial<RuleValidationResult>,\n shotVersion = false,\n): [string, Record<string, string | number | boolean> | undefined] => {\n const translationKey = generateTranslationString(r, shotVersion);\n\n if (r.ruleType === RuleType.char && r.chars) {\n return [\n translationKey,\n { ...r, chars: r.chars.map((c) => c.char).join(\"\") },\n ];\n }\n\n return [\n translationKey,\n r as unknown as Record<string, string | number | boolean> | undefined,\n ];\n};\n\nexport default generateValidationTranslation;\n"],"names":[],"mappings":";;;;AAKA,MAAM,yBAA4B,GAAA,CAChC,IACA,EAAA,YAAA,GAAe,KACJ,KAAA;AACX,EAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,IAAO,OAAA,CAAA,WAAA,EAAc,KAAK,cAAc,CAAA,CAAA;AAAA;AAE1C,EAAA,MAAM,eAAkB,GAAA,CAAA,WAAA,EAAc,IAAK,CAAA,QAAA,IAAY,SAAS,CAAA,CAAA;AAChE,EAAA,IAAI,sBAAyB,GAAA,EAAA;AAE7B,EACG,IAAA,KAAA,IAAS,QAAQ,IAAK,CAAA,GAAA,KAAQ,UAC9B,KAAS,IAAA,IAAA,IAAQ,IAAK,CAAA,GAAA,KAAQ,MAC/B,EAAA;AACA,IAAA,MAAM,2BAA2B,IAAK,CAAA,eAAA,GAClC,KAAK,eACL,GAAA,IAAA,CAAK,MACH,KACA,GAAA,KAAA;AAEN,IAAA,IAAI,KAAK,UAAY,EAAA;AACnB,MAAA,sBAAA,GAAyB,GAAG,eAAe,CAAA,CAAA,EAAI,IAAK,CAAA,UAAU,IAAI,wBAAwB,CAAA,CAAA;AAAA,KACrF,MAAA;AACL,MAAyB,sBAAA,GAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,wBAAwB,CAAA,CAAA;AAAA;AACzE,GACF,MAAA,IAAW,KAAK,UAAY,EAAA;AAC1B,IAAA,sBAAA,GAAyB,CAAG,EAAA,eAAe,CAAI,CAAA,EAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,GACzD,MAAA;AACL,IAAyB,sBAAA,GAAA,eAAA;AAAA;AAG3B,EAAO,OAAA,YAAA,GACH,CAAG,EAAA,sBAAsB,CACzB,MAAA,CAAA,GAAA,sBAAA;AACN,CAAA;AAEO,MAAM,6BAAgC,GAAA,CAC3C,CACA,EAAA,WAAA,GAAc,KACsD,KAAA;AACpE,EAAM,MAAA,cAAA,GAAiB,yBAA0B,CAAA,CAAA,EAAG,WAAW,CAAA;AAE/D,EAAA,IAAI,CAAE,CAAA,QAAA,KAAa,QAAS,CAAA,IAAA,IAAQ,EAAE,KAAO,EAAA;AAC3C,IAAO,OAAA;AAAA,MACL,cAAA;AAAA,MACA,EAAE,GAAG,CAAG,EAAA,KAAA,EAAO,EAAE,KAAM,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,EAAE,CAAE;AAAA,KACrD;AAAA;AAGF,EAAO,OAAA;AAAA,IACL,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1,6 +1,8 @@
1
1
  "use client"
2
2
  /* */
3
+ import '@mittwald/password-tools-js/policy';
3
4
  import '@mittwald/password-tools-js/rules';
5
+ import '@mittwald/password-tools-js/generator';
4
6
 
5
7
  const getStateFromLatestPolicyValidationResult = (result) => {
6
8
  if (!result.isValid && result.ruleResults.length >= 1) {
@@ -16,7 +18,13 @@ const getStateFromLatestPolicyValidationResult = (result) => {
16
18
  if (result.isValid === "indeterminate") {
17
19
  return void 0;
18
20
  }
19
- if (result.complexity.actual <= result.complexity.min) {
21
+ if (result.complexity.actual < result.complexity.min) {
22
+ return {
23
+ isValid: false,
24
+ identifier: "failingComplexity"
25
+ };
26
+ }
27
+ if (result.complexity.actual === result.complexity.min) {
20
28
  return {
21
29
  isValid: result.isValid,
22
30
  identifier: "optimizeComplexity"
@@ -1 +1 @@
1
- {"version":3,"file":"getStateFromLatestPolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/getStateFromLatestPolicyValidationResult.ts"],"sourcesContent":["import { type RuleValidationResult } from \"@mittwald/password-tools-js/rules\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\n\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n result: ResolvedPolicyValidationResult,\n): undefined | Partial<RuleValidationResult> => {\n if (!result.isValid && result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (!failingRule) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n return failingRule;\n }\n\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\n if (result.complexity.actual <= result.complexity.min) {\n return {\n isValid: result.isValid,\n identifier: \"optimizeComplexity\",\n };\n }\n return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":";;AAIa,MAAA,wCAAA,GAA2C,CACtD,MAC8C,KAAA;AAC9C,EAAA,IAAI,CAAC,MAAO,CAAA,OAAA,IAAW,MAAO,CAAA,WAAA,CAAY,UAAU,CAAG,EAAA;AACrD,IAAM,MAAA,WAAA,GAAc,OAAO,WAAY,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,KAAA;AAAA,QACT,UAAY,EAAA;AAAA,OACd;AAAA;AAGF,IAAO,OAAA,WAAA;AAAA;AAGT,EAAI,IAAA,MAAA,CAAO,YAAY,eAAiB,EAAA;AACtC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAA,IAAI,MAAO,CAAA,UAAA,CAAW,MAAU,IAAA,MAAA,CAAO,WAAW,GAAK,EAAA;AACrD,IAAO,OAAA;AAAA,MACL,SAAS,MAAO,CAAA,OAAA;AAAA,MAChB,UAAY,EAAA;AAAA,KACd;AAAA;AAEF,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA;AAAA,GACd;AACF;;;;"}
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\n/** @internal */\nexport const getStateFromLatestPolicyValidationResult = (\n result: ResolvedPolicyValidationResult,\n): undefined | Partial<RuleValidationResult> => {\n if (!result.isValid && result.ruleResults.length >= 1) {\n const failingRule = result.ruleResults.find((r) => !r.isValid);\n if (!failingRule) {\n return {\n isValid: false,\n identifier: \"failingComplexity\",\n };\n }\n\n return failingRule;\n }\n\n if (result.isValid === \"indeterminate\") {\n return undefined;\n }\n\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 return {\n isValid: true,\n identifier: \"securePassword\",\n };\n};\n\nexport default getStateFromLatestPolicyValidationResult;\n"],"names":[],"mappings":";;;;AAIa,MAAA,wCAAA,GAA2C,CACtD,MAC8C,KAAA;AAC9C,EAAA,IAAI,CAAC,MAAO,CAAA,OAAA,IAAW,MAAO,CAAA,WAAA,CAAY,UAAU,CAAG,EAAA;AACrD,IAAM,MAAA,WAAA,GAAc,OAAO,WAAY,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAC,EAAE,OAAO,CAAA;AAC7D,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,KAAA;AAAA,QACT,UAAY,EAAA;AAAA,OACd;AAAA;AAGF,IAAO,OAAA,WAAA;AAAA;AAGT,EAAI,IAAA,MAAA,CAAO,YAAY,eAAiB,EAAA;AACtC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAA,IAAI,MAAO,CAAA,UAAA,CAAW,MAAS,GAAA,MAAA,CAAO,WAAW,GAAK,EAAA;AACpD,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,UAAY,EAAA;AAAA,KACd;AAAA;AAGF,EAAA,IAAI,MAAO,CAAA,UAAA,CAAW,MAAW,KAAA,MAAA,CAAO,WAAW,GAAK,EAAA;AACtD,IAAO,OAAA;AAAA,MACL,SAAS,MAAO,CAAA,OAAA;AAAA,MAChB,UAAY,EAAA;AAAA,KACd;AAAA;AAEF,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,IAAA;AAAA,IACT,UAAY,EAAA;AAAA,GACd;AACF;;;;"}
@@ -0,0 +1,47 @@
1
+ "use client"
2
+ /* */
3
+ import { useEffect, startTransition } from 'react';
4
+ import { isPromise } from 'remeda';
5
+
6
+ const usePolicyValidationResult = (validationPolicy, password, onValidationStart, onValidationResult) => {
7
+ useEffect(() => {
8
+ onValidationStart?.();
9
+ validationPolicy.validate(password).then((validationResult) => {
10
+ const setValidationResult = (password2, policyValidationResult) => {
11
+ const isValid = Boolean(policyValidationResult.isValid);
12
+ onValidationResult?.({
13
+ password: password2,
14
+ isValid,
15
+ results: policyValidationResult
16
+ });
17
+ };
18
+ startTransition(async () => {
19
+ if (!isPromise(validationResult.isValid)) {
20
+ return setValidationResult(password, validationResult);
21
+ }
22
+ void Promise.all([
23
+ Promise.resolve(password),
24
+ Promise.resolve(validationResult),
25
+ ...validationResult.ruleResults
26
+ ]).then(
27
+ ([
28
+ resolvedValue,
29
+ resolvedValidationResult,
30
+ ...resolvedValidationRuleResults
31
+ ]) => {
32
+ startTransition(() => {
33
+ setValidationResult(resolvedValue, {
34
+ complexity: resolvedValidationResult.complexity,
35
+ ruleResults: resolvedValidationRuleResults,
36
+ isValid: resolvedValidationResult.isValid && resolvedValidationRuleResults.every((r) => r.isValid)
37
+ });
38
+ });
39
+ }
40
+ );
41
+ });
42
+ });
43
+ }, [password, validationPolicy]);
44
+ };
45
+
46
+ export { usePolicyValidationResult };
47
+ //# sourceMappingURL=usePolicyValidationResult.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePolicyValidationResult.mjs","sources":["../../../../../../../src/components/PasswordCreationField/lib/usePolicyValidationResult.ts"],"sourcesContent":["import { startTransition, useEffect } from \"react\";\nimport type { PolicyValidationResult } from \"@/integrations/@mittwald/password-tools-js\";\nimport { isPromise } from \"remeda\";\nimport type { Policy } from \"@/integrations/@mittwald/password-tools-js\";\nimport type { ResolvedPolicyValidationResult } from \"@/components/PasswordCreationField/PasswordCreationField\";\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 useEffect(() => {\n onValidationStart?.();\n validationPolicy.validate(password).then((validationResult) => {\n const setValidationResult = (\n password: string,\n policyValidationResult: PolicyValidationResult,\n ) => {\n const isValid = Boolean(policyValidationResult.isValid);\n onValidationResult?.({\n password,\n isValid,\n results: policyValidationResult as ResolvedPolicyValidationResult,\n });\n };\n\n startTransition(async () => {\n if (!isPromise(validationResult.isValid)) {\n return setValidationResult(password, validationResult);\n }\n\n void Promise.all([\n Promise.resolve(password),\n Promise.resolve(validationResult),\n ...validationResult.ruleResults,\n ]).then(\n ([\n resolvedValue,\n resolvedValidationResult,\n ...resolvedValidationRuleResults\n ]) => {\n startTransition(() => {\n setValidationResult(resolvedValue, {\n complexity: resolvedValidationResult.complexity,\n ruleResults: resolvedValidationRuleResults,\n isValid:\n resolvedValidationResult.isValid &&\n resolvedValidationRuleResults.every((r) => r.isValid),\n });\n });\n },\n );\n });\n });\n }, [password, validationPolicy]);\n};\n"],"names":["password"],"mappings":";;;AAMO,MAAM,yBAA4B,GAAA,CACvC,gBACA,EAAA,QAAA,EACA,mBACA,kBAKG,KAAA;AACH,EAAA,SAAA,CAAU,MAAM;AACd,IAAoB,iBAAA,IAAA;AACpB,IAAA,gBAAA,CAAiB,QAAS,CAAA,QAAQ,CAAE,CAAA,IAAA,CAAK,CAAC,gBAAqB,KAAA;AAC7D,MAAM,MAAA,mBAAA,GAAsB,CAC1BA,SAAAA,EACA,sBACG,KAAA;AACH,QAAM,MAAA,OAAA,GAAU,OAAQ,CAAA,sBAAA,CAAuB,OAAO,CAAA;AACtD,QAAqB,kBAAA,GAAA;AAAA,UACnB,QAAAA,EAAAA,SAAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAS,EAAA;AAAA,SACV,CAAA;AAAA,OACH;AAEA,MAAA,eAAA,CAAgB,YAAY;AAC1B,QAAA,IAAI,CAAC,SAAA,CAAU,gBAAiB,CAAA,OAAO,CAAG,EAAA;AACxC,UAAO,OAAA,mBAAA,CAAoB,UAAU,gBAAgB,CAAA;AAAA;AAGvD,QAAA,KAAK,QAAQ,GAAI,CAAA;AAAA,UACf,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAAA,UACxB,OAAA,CAAQ,QAAQ,gBAAgB,CAAA;AAAA,UAChC,GAAG,gBAAiB,CAAA;AAAA,SACrB,CAAE,CAAA,IAAA;AAAA,UACD,CAAC;AAAA,YACC,aAAA;AAAA,YACA,wBAAA;AAAA,YACG,GAAA;AAAA,WACC,KAAA;AACJ,YAAA,eAAA,CAAgB,MAAM;AACpB,cAAA,mBAAA,CAAoB,aAAe,EAAA;AAAA,gBACjC,YAAY,wBAAyB,CAAA,UAAA;AAAA,gBACrC,WAAa,EAAA,6BAAA;AAAA,gBACb,OAAA,EACE,yBAAyB,OACzB,IAAA,6BAAA,CAA8B,MAAM,CAAC,CAAA,KAAM,EAAE,OAAO;AAAA,eACvD,CAAA;AAAA,aACF,CAAA;AAAA;AACH,SACF;AAAA,OACD,CAAA;AAAA,KACF,CAAA;AAAA,GACA,EAAA,CAAC,QAAU,EAAA,gBAAgB,CAAC,CAAA;AACjC;;;;"}
@@ -1,5 +1,7 @@
1
1
  "use client"
2
2
  /* */
3
+ import '@mittwald/password-tools-js/policy';
4
+ import '@mittwald/password-tools-js/rules';
3
5
  import { Generator } from '@mittwald/password-tools-js/generator';
4
6
 
5
7
  const generatePassword = async (validationPolicy) => {