@cnamts/synapse 1.0.23 → 1.0.24
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/dist/AutocompleteFilter-BWLR3U7W.js +114 -0
- package/dist/AutocompleteFilter-D9jzRzAL.cjs +1 -0
- package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BpwFexzi.js} +1 -1
- package/dist/DateFilter-DTUl8hb1.cjs +1 -0
- package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-Bz_NTdX9.js} +3 -3
- package/dist/NumberFilter-MAEojdk0.cjs +1 -0
- package/dist/PeriodFilter-CC4WgIhl.cjs +1 -0
- package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-DX_wy9g-.js} +1 -1
- package/dist/SelectFilter-BR3fvl-a.cjs +1 -0
- package/dist/SelectFilter-xqiPtPgX.js +135 -0
- package/dist/{TextFilter-B84dpnoq.js → TextFilter-BBl3JFqK.js} +7 -7
- package/dist/TextFilter-CCfYFl5F.cjs +1 -0
- package/dist/apLightTheme-CFSRrjv2.cjs +1 -0
- package/dist/apLightTheme-D1P4jcD0.js +1231 -0
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
- package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
- package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +108 -146
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +28 -506
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +65 -85
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -771
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -402
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -155
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
- package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +4 -4
- package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
- package/dist/components/MonthPicker/MonthPicker.d.ts +86 -122
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -121
- package/dist/components/NirField/NirField.d.ts +206 -270
- package/dist/components/NirField/locales.d.ts +10 -10
- package/dist/components/NirField/useNirValidation.d.ts +64 -0
- package/dist/components/PasswordField/PasswordField.d.ts +8 -9
- package/dist/components/PeriodField/PeriodField.d.ts +1352 -1640
- package/dist/components/PhoneField/PhoneField.d.ts +88 -124
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
- package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
- package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +9 -6
- package/dist/components/Tables/SyTable/SyTable.d.ts +9 -6
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +17 -19
- package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
- package/dist/components/Tables/common/filters/locales.d.ts +0 -1
- package/dist/components/Tables/common/types.d.ts +19 -3
- package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
- package/dist/components/Tables/common/usePagination.d.ts +3 -1
- package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
- package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
- package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +6 -6
- package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
- package/dist/composables/rules/useFieldValidation.d.ts +4 -4
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
- package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
- package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
- package/dist/composables/validation/useFormValidation.d.ts +11 -2
- package/dist/composables/validation/useValidation.d.ts +15 -9
- package/dist/design-system-v3.d.ts +2 -0
- package/dist/design-system-v3.js +186 -187
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/{main-aLKwdMi1.js → main-BtTqyn4z.js} +16434 -15672
- package/dist/main-C1e3eoxd.cjs +1067 -0
- package/dist/main.d.ts +0 -1
- package/dist/synapse.css +1 -0
- package/dist/tooth-11-D3sLWv2n.cjs +1 -0
- package/dist/tooth-12-CXrLuH03.cjs +1 -0
- package/dist/tooth-13-BSfo5fpT.cjs +1 -0
- package/dist/tooth-14-DMzulx0h.cjs +1 -0
- package/dist/tooth-15-BKRFVi-9.cjs +1 -0
- package/dist/tooth-16-CpuxAbuM.cjs +1 -0
- package/dist/tooth-17-BPoahUdg.cjs +1 -0
- package/dist/tooth-18-DhHJz8sy.cjs +1 -0
- package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
- package/dist/tooth-22-C2Tn19sB.cjs +1 -0
- package/dist/tooth-23-C9uaaSGb.cjs +1 -0
- package/dist/tooth-24-BrK9UGpf.cjs +1 -0
- package/dist/tooth-25-CE_EfGNp.cjs +1 -0
- package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
- package/dist/tooth-27-C5J7JkWM.cjs +1 -0
- package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
- package/dist/tooth-31-BrYqmkTi.cjs +1 -0
- package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
- package/dist/tooth-33-DuxvqO2J.cjs +1 -0
- package/dist/tooth-34-BCSCXMB6.cjs +1 -0
- package/dist/tooth-35-BLUXkX88.cjs +1 -0
- package/dist/tooth-36-IrKHYqlA.cjs +1 -0
- package/dist/tooth-37-BYqpdMwo.cjs +1 -0
- package/dist/tooth-38-B_eNXXdu.cjs +1 -0
- package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
- package/dist/tooth-42-szcDqlM0.cjs +1 -0
- package/dist/tooth-43-B3ka6rQm.cjs +1 -0
- package/dist/tooth-44-CazyQucj.cjs +1 -0
- package/dist/tooth-45-B4HQtc8n.cjs +1 -0
- package/dist/tooth-46-BPM40gbG.cjs +1 -0
- package/dist/tooth-47-Dvr20dlh.cjs +1 -0
- package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
- package/dist/tooth-51-OBpwCOF3.cjs +1 -0
- package/dist/tooth-52-aKxyHcmq.cjs +1 -0
- package/dist/tooth-53-vCwJjTOc.cjs +1 -0
- package/dist/tooth-54-DsWu2iFy.cjs +1 -0
- package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
- package/dist/tooth-61-BbLvxMQi.cjs +1 -0
- package/dist/tooth-62-CmTkWczP.cjs +1 -0
- package/dist/tooth-63-DI7l_2qI.cjs +1 -0
- package/dist/tooth-64-B21sOsJh.cjs +1 -0
- package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
- package/dist/tooth-71-D473PPO5.cjs +1 -0
- package/dist/tooth-72-Drh1wnNu.cjs +1 -0
- package/dist/tooth-73-DzlwYI23.cjs +1 -0
- package/dist/tooth-74-8aGvcZPg.cjs +1 -0
- package/dist/tooth-75-BFK7At_r.cjs +1 -0
- package/dist/tooth-81-BZmR-I0M.cjs +1 -0
- package/dist/tooth-82-euVfUUZV.cjs +1 -0
- package/dist/tooth-83-KV010j64.cjs +1 -0
- package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
- package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
- package/dist/vuetifyConfig.js +561 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +10 -4
- package/src/assets/overrides/_btns.scss +0 -6
- package/src/assets/overrides/_icons.scss +9 -1
- package/src/assets/overrides/_typography.scss +0 -10
- package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
- package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
- package/src/components/ChipList/ChipList.stories.ts +0 -15
- package/src/components/ChipList/ChipList.vue +5 -1
- package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
- package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +22 -5
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +143 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +8 -9
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.vue +14 -11
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +54 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -11
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +35 -0
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
- package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +29 -27
- package/src/components/Customs/SyTextField/SyTextField.vue +154 -157
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +330 -223
- package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +195 -159
- package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +10 -10
- package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
- package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
- package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
- package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
- package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +63 -57
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
- package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
- package/src/components/DatePicker/composables/index.ts +1 -0
- package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
- package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
- package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
- package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
- package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
- package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
- package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
- package/src/components/DatePicker/composables/useDateTextField.ts +7 -6
- package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
- package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
- package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
- package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
- package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
- package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
- package/src/components/NirField/NirField.stories.ts +4 -0
- package/src/components/NirField/NirField.vue +64 -260
- package/src/components/NirField/accessibilite/Accessibility.mdx +2 -2
- package/src/components/NirField/locales.ts +1 -1
- package/src/components/NirField/tests/NirField.spec.ts +6 -0
- package/src/components/NirField/useNirValidation.ts +271 -0
- package/src/components/PasswordField/PasswordField.stories.ts +4 -4
- package/src/components/PasswordField/PasswordField.vue +18 -24
- package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
- package/src/components/PeriodField/PeriodField.stories.ts +4 -4
- package/src/components/PeriodField/PeriodField.vue +57 -57
- package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
- package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
- package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
- package/src/components/PhoneField/PhoneField.vue +5 -6
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/RangeField/RangeField.vue +6 -0
- package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
- package/src/components/SyTextArea/SyTextArea.vue +53 -23
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
- package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +673 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +148 -91
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +58 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +122 -0
- package/src/components/Tables/SyTable/SyTable.mdx +25 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +452 -1
- package/src/components/Tables/SyTable/SyTable.vue +130 -56
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +57 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +108 -0
- package/src/components/Tables/common/SyTableFilter.vue +22 -2
- package/src/components/Tables/common/TableHeader.vue +5 -1
- package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
- package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
- package/src/components/Tables/common/filters/SelectFilter.vue +10 -11
- package/src/components/Tables/common/filters/TextFilter.vue +1 -1
- package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
- package/src/components/Tables/common/filters/locales.ts +0 -1
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
- package/src/components/Tables/common/tableFilterUtils.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +48 -4
- package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
- package/src/components/Tables/common/types.ts +13 -4
- package/src/components/Tables/common/useClickableTableRow.ts +103 -0
- package/src/components/Tables/common/usePagination.ts +13 -0
- package/src/components/Tables/common/usePinnedColumns.ts +237 -0
- package/src/components/Tables/common/useTableHeaders.ts +3 -3
- package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
- package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
- package/src/composables/date/useDatePickerAccessibility.ts +42 -207
- package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
- package/src/composables/rules/useFieldValidation.ts +34 -17
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
- package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
- package/src/composables/unifyValidation/useValidation.ts +190 -0
- package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
- package/src/composables/useFormFieldErrorHandling.ts +4 -7
- package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
- package/src/composables/validation/tests/useValidation.spec.ts +116 -21
- package/src/composables/validation/useFormValidation.ts +20 -13
- package/src/composables/validation/useValidatable.ts +8 -1
- package/src/composables/validation/useValidation.ts +135 -99
- package/src/composantsVuetify/Introduction.mdx +48 -0
- package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
- package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
- package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +2 -2
- package/src/main.ts +0 -2
- package/src/stories/Components/Components.stories.ts +74 -9
- package/src/stories/Demarrer/Accueil.stories.ts +3 -3
- package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
- package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
- package/dist/SelectFilter-BioGT6Nn.js +0 -136
- package/dist/style.css +0 -1
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
|
@@ -33,48 +33,48 @@ describe('useFieldValidation', () => {
|
|
|
33
33
|
global.Date = originalDate
|
|
34
34
|
})
|
|
35
35
|
|
|
36
|
-
it('should validate required rule', () => {
|
|
36
|
+
it('should validate required rule', async () => {
|
|
37
37
|
const rules = generateRules([{ type: 'required', options: { message: 'This field is required.' } }])
|
|
38
38
|
const rule = rules[0]!
|
|
39
39
|
|
|
40
|
-
expect(rule('')).toEqual({ error: 'This field is required.' })
|
|
41
|
-
expect(rule('value')).toEqual({ success: 'Le champ est valide.' })
|
|
42
|
-
expect(rule(new Date())).toEqual({ success: 'Le champ est valide.' })
|
|
43
|
-
expect(rule({ key: 'value' })).toEqual({ success: 'Le champ est valide.' })
|
|
44
|
-
expect(rule(null)).toEqual({ error: 'This field is required.' })
|
|
40
|
+
expect(await rule('')).toEqual({ error: 'This field is required.' })
|
|
41
|
+
expect(await rule('value')).toEqual({ success: 'Le champ est valide.' })
|
|
42
|
+
expect(await rule(new Date())).toEqual({ success: 'Le champ est valide.' })
|
|
43
|
+
expect(await rule({ key: 'value' })).toEqual({ success: 'Le champ est valide.' })
|
|
44
|
+
expect(await rule(null)).toEqual({ error: 'This field is required.' })
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
it('should validate min rule', () => {
|
|
47
|
+
it('should validate min rule', async () => {
|
|
48
48
|
const rules = generateRules([{ type: 'min', options: { value: 5, message: 'Value must be at least 5.' } }])
|
|
49
49
|
const rule = rules[0]!
|
|
50
50
|
|
|
51
|
-
expect(rule(3)).toEqual({ error: 'Value must be at least 5.' })
|
|
52
|
-
expect(rule(5)).toEqual({ success: 'Le champ est valide.' })
|
|
53
|
-
expect(rule(10)).toEqual({ success: 'Le champ est valide.' })
|
|
54
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
51
|
+
expect(await rule(3)).toEqual({ error: 'Value must be at least 5.' })
|
|
52
|
+
expect(await rule(5)).toEqual({ success: 'Le champ est valide.' })
|
|
53
|
+
expect(await rule(10)).toEqual({ success: 'Le champ est valide.' })
|
|
54
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
55
55
|
})
|
|
56
56
|
|
|
57
|
-
it('should validate max rule', () => {
|
|
57
|
+
it('should validate max rule', async () => {
|
|
58
58
|
const rules = generateRules([{ type: 'max', options: { value: 10, message: 'Value must be at most 10.' } }])
|
|
59
59
|
const rule = rules[0]!
|
|
60
60
|
|
|
61
|
-
expect(rule(15)).toEqual({ error: 'Value must be at most 10.' })
|
|
62
|
-
expect(rule(10)).toEqual({ success: 'Le champ est valide.' })
|
|
63
|
-
expect(rule(5)).toEqual({ success: 'Le champ est valide.' })
|
|
64
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
61
|
+
expect(await rule(15)).toEqual({ error: 'Value must be at most 10.' })
|
|
62
|
+
expect(await rule(10)).toEqual({ success: 'Le champ est valide.' })
|
|
63
|
+
expect(await rule(5)).toEqual({ success: 'Le champ est valide.' })
|
|
64
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
65
65
|
})
|
|
66
66
|
|
|
67
|
-
it('should validate minLength rule', () => {
|
|
67
|
+
it('should validate minLength rule', async () => {
|
|
68
68
|
const rules = generateRules([{ type: 'minLength', options: { length: 5, message: 'Minimum length is 5.' } }])
|
|
69
69
|
const rule = rules[0]!
|
|
70
70
|
|
|
71
|
-
expect(rule('1234')).toEqual({ error: 'Minimum length is 5.' })
|
|
72
|
-
expect(rule('12345')).toEqual({ success: 'Le champ est valide.' })
|
|
73
|
-
expect(rule('123456')).toEqual({ success: 'Le champ est valide.' })
|
|
74
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
71
|
+
expect(await rule('1234')).toEqual({ error: 'Minimum length is 5.' })
|
|
72
|
+
expect(await rule('12345')).toEqual({ success: 'Le champ est valide.' })
|
|
73
|
+
expect(await rule('123456')).toEqual({ success: 'Le champ est valide.' })
|
|
74
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
75
75
|
})
|
|
76
76
|
|
|
77
|
-
it('should validate minLength rule with ignoreSpace option', () => {
|
|
77
|
+
it('should validate minLength rule with ignoreSpace option', async () => {
|
|
78
78
|
const rules = generateRules([{
|
|
79
79
|
type: 'minLength',
|
|
80
80
|
options: {
|
|
@@ -85,21 +85,21 @@ describe('useFieldValidation', () => {
|
|
|
85
85
|
}])
|
|
86
86
|
const rule = rules[0]!
|
|
87
87
|
|
|
88
|
-
expect(rule('1 2 3 4')).toEqual({ error: 'Minimum length is 5.' }) // Length without spaces is 4
|
|
89
|
-
expect(rule('1 2 3 4 5')).toEqual({ success: 'Le champ est valide.' }) // Length without spaces is 5
|
|
88
|
+
expect(await rule('1 2 3 4')).toEqual({ error: 'Minimum length is 5.' }) // Length without spaces is 4
|
|
89
|
+
expect(await rule('1 2 3 4 5')).toEqual({ success: 'Le champ est valide.' }) // Length without spaces is 5
|
|
90
90
|
})
|
|
91
91
|
|
|
92
|
-
it('should validate maxLength rule', () => {
|
|
92
|
+
it('should validate maxLength rule', async () => {
|
|
93
93
|
const rules = generateRules([{ type: 'maxLength', options: { length: 5, message: 'Maximum length is 5.' } }])
|
|
94
94
|
const rule = rules[0]!
|
|
95
95
|
|
|
96
|
-
expect(rule('123456')).toEqual({ error: 'Maximum length is 5.' })
|
|
97
|
-
expect(rule('12345')).toEqual({ success: 'Le champ est valide.' })
|
|
98
|
-
expect(rule('1234')).toEqual({ success: 'Le champ est valide.' })
|
|
99
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
96
|
+
expect(await rule('123456')).toEqual({ error: 'Maximum length is 5.' })
|
|
97
|
+
expect(await rule('12345')).toEqual({ success: 'Le champ est valide.' })
|
|
98
|
+
expect(await rule('1234')).toEqual({ success: 'Le champ est valide.' })
|
|
99
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
100
100
|
})
|
|
101
101
|
|
|
102
|
-
it('should validate maxLength rule with ignoreSpace option', () => {
|
|
102
|
+
it('should validate maxLength rule with ignoreSpace option', async () => {
|
|
103
103
|
const rules = generateRules([{
|
|
104
104
|
type: 'maxLength',
|
|
105
105
|
options: {
|
|
@@ -110,21 +110,21 @@ describe('useFieldValidation', () => {
|
|
|
110
110
|
}])
|
|
111
111
|
const rule = rules[0]!
|
|
112
112
|
|
|
113
|
-
expect(rule('1 2 3 4 5 6')).toEqual({ error: 'Maximum length is 5.' }) // Length without spaces is 6
|
|
114
|
-
expect(rule('1 2 3 4 5')).toEqual({ success: 'Le champ est valide.' }) // Length without spaces is 5
|
|
113
|
+
expect(await rule('1 2 3 4 5 6')).toEqual({ error: 'Maximum length is 5.' }) // Length without spaces is 6
|
|
114
|
+
expect(await rule('1 2 3 4 5')).toEqual({ success: 'Le champ est valide.' }) // Length without spaces is 5
|
|
115
115
|
})
|
|
116
116
|
|
|
117
|
-
it('should validate exactLength rule', () => {
|
|
117
|
+
it('should validate exactLength rule', async () => {
|
|
118
118
|
const rules = generateRules([{ type: 'exactLength', options: { length: 5, message: 'Length must be exactly 5.' } }])
|
|
119
119
|
const rule = rules[0]!
|
|
120
120
|
|
|
121
|
-
expect(rule('1234')).toEqual({ error: 'Length must be exactly 5.' })
|
|
122
|
-
expect(rule('123456')).toEqual({ error: 'Length must be exactly 5.' })
|
|
123
|
-
expect(rule('12345')).toEqual({ success: 'Le champ est valide.' })
|
|
124
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
121
|
+
expect(await rule('1234')).toEqual({ error: 'Length must be exactly 5.' })
|
|
122
|
+
expect(await rule('123456')).toEqual({ error: 'Length must be exactly 5.' })
|
|
123
|
+
expect(await rule('12345')).toEqual({ success: 'Le champ est valide.' })
|
|
124
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
125
125
|
})
|
|
126
126
|
|
|
127
|
-
it('should validate exactLength rule with ignoreSpace option', () => {
|
|
127
|
+
it('should validate exactLength rule with ignoreSpace option', async () => {
|
|
128
128
|
const rules = generateRules([{
|
|
129
129
|
type: 'exactLength',
|
|
130
130
|
options: {
|
|
@@ -135,12 +135,12 @@ describe('useFieldValidation', () => {
|
|
|
135
135
|
}])
|
|
136
136
|
const rule = rules[0]!
|
|
137
137
|
|
|
138
|
-
expect(rule('1 2 3 4')).toEqual({ error: 'Length must be exactly 5.' }) // Length without spaces is 4
|
|
139
|
-
expect(rule('1 2 3 4 5 6')).toEqual({ error: 'Length must be exactly 5.' }) // Length without spaces is 6
|
|
140
|
-
expect(rule('1 2 3 4 5')).toEqual({ success: 'Le champ est valide.' }) // Length without spaces is 5
|
|
138
|
+
expect(await rule('1 2 3 4')).toEqual({ error: 'Length must be exactly 5.' }) // Length without spaces is 4
|
|
139
|
+
expect(await rule('1 2 3 4 5 6')).toEqual({ error: 'Length must be exactly 5.' }) // Length without spaces is 6
|
|
140
|
+
expect(await rule('1 2 3 4 5')).toEqual({ success: 'Le champ est valide.' }) // Length without spaces is 5
|
|
141
141
|
})
|
|
142
142
|
|
|
143
|
-
it('should validate email rule', () => {
|
|
143
|
+
it('should validate email rule', async () => {
|
|
144
144
|
// Vérifions d'abord que la regex EMAIL_REGEXP fonctionne comme prévu
|
|
145
145
|
expect(EMAIL_REGEXP.test('invalid-email')).toBe(false)
|
|
146
146
|
// Note: La regex actuelle considère test@example comme valide
|
|
@@ -150,26 +150,26 @@ describe('useFieldValidation', () => {
|
|
|
150
150
|
const rules = generateRules([{ type: 'email', options: { message: 'Invalid email address.' } }])
|
|
151
151
|
const rule = rules[0]!
|
|
152
152
|
|
|
153
|
-
expect(rule('invalid-email')).toEqual({ error: 'Invalid email address.' })
|
|
154
|
-
expect(rule('test@example.com')).toEqual({ success: 'Le champ est valide.' })
|
|
155
|
-
expect(rule('test.name@example.co.uk')).toEqual({ success: 'Le champ est valide.' })
|
|
156
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
153
|
+
expect(await rule('invalid-email')).toEqual({ error: 'Invalid email address.' })
|
|
154
|
+
expect(await rule('test@example.com')).toEqual({ success: 'Le champ est valide.' })
|
|
155
|
+
expect(await rule('test.name@example.co.uk')).toEqual({ success: 'Le champ est valide.' })
|
|
156
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
157
157
|
})
|
|
158
158
|
|
|
159
|
-
it('should validate matchPattern rule', () => {
|
|
159
|
+
it('should validate matchPattern rule', async () => {
|
|
160
160
|
const rules = generateRules([{
|
|
161
161
|
type: 'matchPattern',
|
|
162
162
|
options: { pattern: /^[a-z]+$/, message: 'Invalid format.' },
|
|
163
163
|
}])
|
|
164
164
|
const rule = rules[0]!
|
|
165
165
|
|
|
166
|
-
expect(rule('123')).toEqual({ error: 'Invalid format.' })
|
|
167
|
-
expect(rule('aBc')).toEqual({ error: 'Invalid format.' })
|
|
168
|
-
expect(rule('abc')).toEqual({ success: 'Le champ est valide.' })
|
|
169
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
166
|
+
expect(await rule('123')).toEqual({ error: 'Invalid format.' })
|
|
167
|
+
expect(await rule('aBc')).toEqual({ error: 'Invalid format.' })
|
|
168
|
+
expect(await rule('abc')).toEqual({ success: 'Le champ est valide.' })
|
|
169
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
170
170
|
})
|
|
171
171
|
|
|
172
|
-
it('should validate notWeekend rule', () => {
|
|
172
|
+
it('should validate notWeekend rule', async () => {
|
|
173
173
|
const rules = generateRules([{
|
|
174
174
|
type: 'notWeekend',
|
|
175
175
|
options: { message: 'Date cannot be on a weekend.' },
|
|
@@ -177,15 +177,15 @@ describe('useFieldValidation', () => {
|
|
|
177
177
|
const rule = rules[0]!
|
|
178
178
|
|
|
179
179
|
// 15 janvier 2023 est un dimanche (jour 0)
|
|
180
|
-
expect(rule(new Date(2023, 0, 15))).toEqual({ error: 'Date cannot be on a weekend.' })
|
|
180
|
+
expect(await rule(new Date(2023, 0, 15))).toEqual({ error: 'Date cannot be on a weekend.' })
|
|
181
181
|
// 14 janvier 2023 est un samedi (jour 6)
|
|
182
|
-
expect(rule(new Date(2023, 0, 14))).toEqual({ error: 'Date cannot be on a weekend.' })
|
|
182
|
+
expect(await rule(new Date(2023, 0, 14))).toEqual({ error: 'Date cannot be on a weekend.' })
|
|
183
183
|
// 13 janvier 2023 est un vendredi (jour 5)
|
|
184
|
-
expect(rule(new Date(2023, 0, 13))).toEqual({ success: 'Le champ est valide.' })
|
|
185
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
184
|
+
expect(await rule(new Date(2023, 0, 13))).toEqual({ success: 'Le champ est valide.' })
|
|
185
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
186
186
|
})
|
|
187
187
|
|
|
188
|
-
it('should validate notBeforeToday rule', () => {
|
|
188
|
+
it('should validate notBeforeToday rule', async () => {
|
|
189
189
|
const rules = generateRules([{
|
|
190
190
|
type: 'notBeforeToday',
|
|
191
191
|
options: { message: 'Date cannot be before today.' },
|
|
@@ -193,15 +193,15 @@ describe('useFieldValidation', () => {
|
|
|
193
193
|
const rule = rules[0]!
|
|
194
194
|
|
|
195
195
|
// 14 janvier 2023 est avant aujourd'hui (15 janvier 2023)
|
|
196
|
-
expect(rule(new Date(2023, 0, 14))).toEqual({ error: 'Date cannot be before today.' })
|
|
196
|
+
expect(await rule(new Date(2023, 0, 14))).toEqual({ error: 'Date cannot be before today.' })
|
|
197
197
|
// 15 janvier 2023 est aujourd'hui
|
|
198
|
-
expect(rule(new Date(2023, 0, 15))).toEqual({ success: 'Le champ est valide.' })
|
|
198
|
+
expect(await rule(new Date(2023, 0, 15))).toEqual({ success: 'Le champ est valide.' })
|
|
199
199
|
// 16 janvier 2023 est après aujourd'hui
|
|
200
|
-
expect(rule(new Date(2023, 0, 16))).toEqual({ success: 'Le champ est valide.' })
|
|
201
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
200
|
+
expect(await rule(new Date(2023, 0, 16))).toEqual({ success: 'Le champ est valide.' })
|
|
201
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
202
202
|
})
|
|
203
203
|
|
|
204
|
-
it('should validate notAfterToday rule', () => {
|
|
204
|
+
it('should validate notAfterToday rule', async () => {
|
|
205
205
|
const rules = generateRules([{
|
|
206
206
|
type: 'notAfterToday',
|
|
207
207
|
options: { message: 'Date cannot be after today.' },
|
|
@@ -209,12 +209,12 @@ describe('useFieldValidation', () => {
|
|
|
209
209
|
const rule = rules[0]!
|
|
210
210
|
|
|
211
211
|
// 16 janvier 2023 est après aujourd'hui (15 janvier 2023)
|
|
212
|
-
expect(rule(new Date(2023, 0, 16))).toEqual({ error: 'Date cannot be after today.' })
|
|
212
|
+
expect(await rule(new Date(2023, 0, 16))).toEqual({ error: 'Date cannot be after today.' })
|
|
213
213
|
// 15 janvier 2023 est aujourd'hui
|
|
214
|
-
expect(rule(new Date(2023, 0, 15))).toEqual({ success: 'Le champ est valide.' })
|
|
214
|
+
expect(await rule(new Date(2023, 0, 15))).toEqual({ success: 'Le champ est valide.' })
|
|
215
215
|
// 14 janvier 2023 est avant aujourd'hui
|
|
216
|
-
expect(rule(new Date(2023, 0, 14))).toEqual({ success: 'Le champ est valide.' })
|
|
217
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
216
|
+
expect(await rule(new Date(2023, 0, 14))).toEqual({ success: 'Le champ est valide.' })
|
|
217
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
218
218
|
})
|
|
219
219
|
|
|
220
220
|
it('should test parseDate function directly', () => {
|
|
@@ -259,7 +259,7 @@ describe('useFieldValidation', () => {
|
|
|
259
259
|
expect(parseDate('31/02/2023', 'DD/MM/YYYY')).toBeNull()
|
|
260
260
|
})
|
|
261
261
|
|
|
262
|
-
it('should validate notBeforeDate rule', () => {
|
|
262
|
+
it('should validate notBeforeDate rule', async () => {
|
|
263
263
|
const rules = generateRules([{
|
|
264
264
|
type: 'notBeforeDate',
|
|
265
265
|
options: {
|
|
@@ -270,36 +270,36 @@ describe('useFieldValidation', () => {
|
|
|
270
270
|
const rule = rules[0]!
|
|
271
271
|
|
|
272
272
|
// 9 janvier 2023 est avant la date de référence
|
|
273
|
-
expect(rule(new Date(2023, 0, 9))).toEqual({ error: 'Date cannot be before reference date.' })
|
|
273
|
+
expect(await rule(new Date(2023, 0, 9))).toEqual({ error: 'Date cannot be before reference date.' })
|
|
274
274
|
// 10 janvier 2023 est la date de référence
|
|
275
|
-
expect(rule(new Date(2023, 0, 10))).toEqual({ success: 'Le champ est valide.' })
|
|
275
|
+
expect(await rule(new Date(2023, 0, 10))).toEqual({ success: 'Le champ est valide.' })
|
|
276
276
|
// 11 janvier 2023 est après la date de référence
|
|
277
|
-
expect(rule(new Date(2023, 0, 11))).toEqual({ success: 'Le champ est valide.' })
|
|
277
|
+
expect(await rule(new Date(2023, 0, 11))).toEqual({ success: 'Le champ est valide.' })
|
|
278
278
|
// Test avec une date invalide
|
|
279
|
-
expect(rule('invalid-date')).toEqual({ error: 'Date invalide' })
|
|
279
|
+
expect(await rule('invalid-date')).toEqual({ error: 'Date invalide' })
|
|
280
280
|
// Test sans option date
|
|
281
281
|
const ruleWithoutDate = generateRules([{
|
|
282
282
|
type: 'notBeforeDate',
|
|
283
283
|
options: { message: 'Date cannot be before reference date.' },
|
|
284
284
|
}])[0]!
|
|
285
|
-
expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
286
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
285
|
+
expect(await ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
286
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
287
287
|
|
|
288
288
|
const ruleWithEmptyDate = generateRules([{
|
|
289
289
|
type: 'notBeforeDate',
|
|
290
290
|
options: { date: '', message: 'Date cannot be before reference date.' },
|
|
291
291
|
}])[0]!
|
|
292
|
-
expect(ruleWithEmptyDate(new Date())).toEqual({})
|
|
292
|
+
expect(await ruleWithEmptyDate(new Date())).toEqual({})
|
|
293
293
|
|
|
294
294
|
const ruleWithUndefinedDate = generateRules([{
|
|
295
295
|
type: 'notBeforeDate',
|
|
296
296
|
options: { date: undefined as unknown as string, message: 'Date cannot be before reference date.' },
|
|
297
297
|
}])[0]!
|
|
298
|
-
expect(ruleWithUndefinedDate(new Date())).toEqual({})
|
|
298
|
+
expect(await ruleWithUndefinedDate(new Date())).toEqual({})
|
|
299
299
|
})
|
|
300
300
|
|
|
301
|
-
it('should throw when date reference is not a string in notBeforeDate rule', () => {
|
|
302
|
-
expect(() => {
|
|
301
|
+
it('should throw when date reference is not a string in notBeforeDate rule', async () => {
|
|
302
|
+
await expect(async () => {
|
|
303
303
|
const invalidRule = generateRules([{
|
|
304
304
|
type: 'notBeforeDate',
|
|
305
305
|
options: {
|
|
@@ -307,11 +307,11 @@ describe('useFieldValidation', () => {
|
|
|
307
307
|
message: 'Date cannot be before reference date.',
|
|
308
308
|
},
|
|
309
309
|
}])[0]!
|
|
310
|
-
invalidRule(new Date())
|
|
311
|
-
}).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
310
|
+
await invalidRule(new Date())
|
|
311
|
+
}).rejects.toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
312
312
|
})
|
|
313
313
|
|
|
314
|
-
it('should validate notAfterDate rule', () => {
|
|
314
|
+
it('should validate notAfterDate rule', async () => {
|
|
315
315
|
const rules = generateRules([{
|
|
316
316
|
type: 'notAfterDate',
|
|
317
317
|
options: {
|
|
@@ -322,36 +322,36 @@ describe('useFieldValidation', () => {
|
|
|
322
322
|
const rule = rules[0]!
|
|
323
323
|
|
|
324
324
|
// 21 janvier 2023 est après la date de référence
|
|
325
|
-
expect(rule(new Date(2023, 0, 21))).toEqual({ error: 'Date cannot be after reference date.' })
|
|
325
|
+
expect(await rule(new Date(2023, 0, 21))).toEqual({ error: 'Date cannot be after reference date.' })
|
|
326
326
|
// 20 janvier 2023 est la date de référence
|
|
327
|
-
expect(rule(new Date(2023, 0, 20))).toEqual({ success: 'Le champ est valide.' })
|
|
327
|
+
expect(await rule(new Date(2023, 0, 20))).toEqual({ success: 'Le champ est valide.' })
|
|
328
328
|
// 19 janvier 2023 est avant la date de référence
|
|
329
|
-
expect(rule(new Date(2023, 0, 19))).toEqual({ success: 'Le champ est valide.' })
|
|
329
|
+
expect(await rule(new Date(2023, 0, 19))).toEqual({ success: 'Le champ est valide.' })
|
|
330
330
|
// Test avec une date invalide
|
|
331
|
-
expect(rule('invalid-date')).toEqual({ error: 'Date invalide' })
|
|
331
|
+
expect(await rule('invalid-date')).toEqual({ error: 'Date invalide' })
|
|
332
332
|
// Test sans option date
|
|
333
333
|
const ruleWithoutDate = generateRules([{
|
|
334
334
|
type: 'notAfterDate',
|
|
335
335
|
options: { message: 'Date cannot be after reference date.' },
|
|
336
336
|
}])[0]!
|
|
337
|
-
expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
338
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
337
|
+
expect(await ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
338
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
339
339
|
|
|
340
340
|
const ruleWithEmptyDate = generateRules([{
|
|
341
341
|
type: 'notAfterDate',
|
|
342
342
|
options: { date: '', message: 'Date cannot be after reference date.' },
|
|
343
343
|
}])[0]!
|
|
344
|
-
expect(ruleWithEmptyDate(new Date())).toEqual({})
|
|
344
|
+
expect(await ruleWithEmptyDate(new Date())).toEqual({})
|
|
345
345
|
|
|
346
346
|
const ruleWithUndefinedDate = generateRules([{
|
|
347
347
|
type: 'notAfterDate',
|
|
348
348
|
options: { date: undefined as unknown as string, message: 'Date cannot be after reference date.' },
|
|
349
349
|
}])[0]!
|
|
350
|
-
expect(ruleWithUndefinedDate(new Date())).toEqual({})
|
|
350
|
+
expect(await ruleWithUndefinedDate(new Date())).toEqual({})
|
|
351
351
|
})
|
|
352
352
|
|
|
353
|
-
it('should throw when date reference is not a string in notAfterDate rule', () => {
|
|
354
|
-
expect(() => {
|
|
353
|
+
it('should throw when date reference is not a string in notAfterDate rule', async () => {
|
|
354
|
+
await expect(async () => {
|
|
355
355
|
const invalidRule = generateRules([{
|
|
356
356
|
type: 'notAfterDate',
|
|
357
357
|
options: {
|
|
@@ -359,11 +359,11 @@ describe('useFieldValidation', () => {
|
|
|
359
359
|
message: 'Date cannot be after reference date.',
|
|
360
360
|
},
|
|
361
361
|
}])[0]!
|
|
362
|
-
invalidRule(new Date())
|
|
363
|
-
}).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
362
|
+
await invalidRule(new Date())
|
|
363
|
+
}).rejects.toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
364
364
|
})
|
|
365
365
|
|
|
366
|
-
it('should validate dateExact rule', () => {
|
|
366
|
+
it('should validate dateExact rule', async () => {
|
|
367
367
|
const rules = generateRules([{
|
|
368
368
|
type: 'dateExact',
|
|
369
369
|
options: {
|
|
@@ -374,36 +374,36 @@ describe('useFieldValidation', () => {
|
|
|
374
374
|
const rule = rules[0]!
|
|
375
375
|
|
|
376
376
|
// 14 janvier 2023 n'est pas la date exacte
|
|
377
|
-
expect(rule(new Date(2023, 0, 14))).toEqual({ error: 'Date must be exactly the reference date.' })
|
|
377
|
+
expect(await rule(new Date(2023, 0, 14))).toEqual({ error: 'Date must be exactly the reference date.' })
|
|
378
378
|
// 15 janvier 2023 est la date exacte
|
|
379
|
-
expect(rule(new Date(2023, 0, 15))).toEqual({ success: 'Le champ est valide.' })
|
|
379
|
+
expect(await rule(new Date(2023, 0, 15))).toEqual({ success: 'Le champ est valide.' })
|
|
380
380
|
// 16 janvier 2023 n'est pas la date exacte
|
|
381
|
-
expect(rule(new Date(2023, 0, 16))).toEqual({ error: 'Date must be exactly the reference date.' })
|
|
381
|
+
expect(await rule(new Date(2023, 0, 16))).toEqual({ error: 'Date must be exactly the reference date.' })
|
|
382
382
|
// Test avec une date invalide
|
|
383
|
-
expect(rule('invalid-date')).toEqual({ error: 'Date invalide' })
|
|
383
|
+
expect(await rule('invalid-date')).toEqual({ error: 'Date invalide' })
|
|
384
384
|
// Test sans option date
|
|
385
385
|
const ruleWithoutDate = generateRules([{
|
|
386
386
|
type: 'dateExact',
|
|
387
387
|
options: { message: 'Date must be exactly the reference date.' },
|
|
388
388
|
}])[0]!
|
|
389
|
-
expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
390
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
389
|
+
expect(await ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
|
|
390
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
391
391
|
|
|
392
392
|
const ruleWithEmptyDate = generateRules([{
|
|
393
393
|
type: 'dateExact',
|
|
394
394
|
options: { date: '', message: 'Date must be exactly the reference date.' },
|
|
395
395
|
}])[0]!
|
|
396
|
-
expect(ruleWithEmptyDate(new Date())).toEqual({})
|
|
396
|
+
expect(await ruleWithEmptyDate(new Date())).toEqual({})
|
|
397
397
|
|
|
398
398
|
const ruleWithUndefinedDate = generateRules([{
|
|
399
399
|
type: 'dateExact',
|
|
400
400
|
options: { date: undefined as unknown as string, message: 'Date must be exactly the reference date.' },
|
|
401
401
|
}])[0]!
|
|
402
|
-
expect(ruleWithUndefinedDate(new Date())).toEqual({})
|
|
402
|
+
expect(await ruleWithUndefinedDate(new Date())).toEqual({})
|
|
403
403
|
})
|
|
404
404
|
|
|
405
|
-
it('should throw when date reference is not a string in dateExact rule', () => {
|
|
406
|
-
expect(() => {
|
|
405
|
+
it('should throw when date reference is not a string in dateExact rule', async () => {
|
|
406
|
+
await expect(async () => {
|
|
407
407
|
const invalidRule = generateRules([{
|
|
408
408
|
type: 'dateExact',
|
|
409
409
|
options: {
|
|
@@ -411,30 +411,30 @@ describe('useFieldValidation', () => {
|
|
|
411
411
|
message: 'Date must be exactly the reference date.',
|
|
412
412
|
},
|
|
413
413
|
}])[0]!
|
|
414
|
-
invalidRule(new Date())
|
|
415
|
-
}).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
414
|
+
await invalidRule(new Date())
|
|
415
|
+
}).rejects.toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
|
|
416
416
|
})
|
|
417
417
|
|
|
418
|
-
it('should validate custom rule', () => {
|
|
418
|
+
it('should validate custom rule', async () => {
|
|
419
419
|
const rules = generateRules([{
|
|
420
420
|
type: 'custom',
|
|
421
421
|
options: { validate: (value: unknown) => value === 'valid', message: 'Custom validation failed.' },
|
|
422
422
|
}])
|
|
423
423
|
const rule = rules[0]!
|
|
424
424
|
|
|
425
|
-
expect(rule('invalid')).toEqual({ error: 'Custom validation failed.' })
|
|
426
|
-
expect(rule('valid')).toEqual({ success: 'Le champ est valide.' })
|
|
427
|
-
expect(rule('')).toEqual({}) // Empty string should be ignored
|
|
425
|
+
expect(await rule('invalid')).toEqual({ error: 'Custom validation failed.' })
|
|
426
|
+
expect(await rule('valid')).toEqual({ success: 'Le champ est valide.' })
|
|
427
|
+
expect(await rule('')).toEqual({}) // Empty string should be ignored
|
|
428
428
|
|
|
429
429
|
// Test avec un message personnalisé
|
|
430
430
|
const customMessageRule = generateRules([{
|
|
431
431
|
type: 'custom',
|
|
432
432
|
options: { validate: (value: unknown) => value === 'valid' ? true : 'Custom error message' },
|
|
433
433
|
}])[0]!
|
|
434
|
-
expect(customMessageRule('invalid')).toEqual({ error: 'Custom error message' })
|
|
434
|
+
expect(await customMessageRule('invalid')).toEqual({ error: 'Custom error message' })
|
|
435
435
|
})
|
|
436
436
|
|
|
437
|
-
it('should handle warning mode instead of error', () => {
|
|
437
|
+
it('should handle warning mode instead of error', async () => {
|
|
438
438
|
const rules = generateRules([{
|
|
439
439
|
type: 'required',
|
|
440
440
|
options: {
|
|
@@ -444,7 +444,7 @@ describe('useFieldValidation', () => {
|
|
|
444
444
|
}])
|
|
445
445
|
const rule = rules[0]!
|
|
446
446
|
|
|
447
|
-
expect(rule('')).toEqual({ warning: 'This field is required.' })
|
|
447
|
+
expect(await rule('')).toEqual({ warning: 'This field is required.' })
|
|
448
448
|
|
|
449
449
|
// Test avec un message d'avertissement personnalisé
|
|
450
450
|
const warningMessageRule = generateRules([{
|
|
@@ -454,10 +454,10 @@ describe('useFieldValidation', () => {
|
|
|
454
454
|
isWarning: true,
|
|
455
455
|
},
|
|
456
456
|
}])[0]!
|
|
457
|
-
expect(warningMessageRule('')).toEqual({ warning: 'Warning: this field should be filled.' })
|
|
457
|
+
expect(await warningMessageRule('')).toEqual({ warning: 'Warning: this field should be filled.' })
|
|
458
458
|
})
|
|
459
459
|
|
|
460
|
-
it('should handle custom field identifiers', () => {
|
|
460
|
+
it('should handle custom field identifiers', async () => {
|
|
461
461
|
const rules = generateRules([{
|
|
462
462
|
type: 'required',
|
|
463
463
|
options: {
|
|
@@ -466,7 +466,7 @@ describe('useFieldValidation', () => {
|
|
|
466
466
|
}])
|
|
467
467
|
const rule = rules[0]!
|
|
468
468
|
|
|
469
|
-
expect(rule('')).toEqual({ error: 'Vous devez renseigner Email.' })
|
|
469
|
+
expect(await rule('')).toEqual({ error: 'Vous devez renseigner Email.' })
|
|
470
470
|
|
|
471
471
|
const fieldIdentifierRule = generateRules([{
|
|
472
472
|
type: 'required',
|
|
@@ -474,10 +474,10 @@ describe('useFieldValidation', () => {
|
|
|
474
474
|
fieldIdentifier: 'l\'adresse email',
|
|
475
475
|
},
|
|
476
476
|
}])[0]!
|
|
477
|
-
expect(fieldIdentifierRule('')).toEqual({ error: 'Vous devez renseigner l\'adresse email.' })
|
|
477
|
+
expect(await fieldIdentifierRule('')).toEqual({ error: 'Vous devez renseigner l\'adresse email.' })
|
|
478
478
|
})
|
|
479
479
|
|
|
480
|
-
it('should handle success messages', () => {
|
|
480
|
+
it('should handle success messages', async () => {
|
|
481
481
|
const rules = generateRules([{
|
|
482
482
|
type: 'required',
|
|
483
483
|
options: {
|
|
@@ -486,16 +486,16 @@ describe('useFieldValidation', () => {
|
|
|
486
486
|
}])
|
|
487
487
|
const rule = rules[0]!
|
|
488
488
|
|
|
489
|
-
expect(rule('value')).toEqual({ success: 'Field is valid!' })
|
|
489
|
+
expect(await rule('value')).toEqual({ success: 'Field is valid!' })
|
|
490
490
|
})
|
|
491
491
|
|
|
492
|
-
it('should handle invalid rule types', () => {
|
|
492
|
+
it('should handle invalid rule types', async () => {
|
|
493
493
|
const rules = generateRules([{
|
|
494
494
|
type: 'invalidRuleType',
|
|
495
495
|
options: { message: 'This should show an error.' },
|
|
496
496
|
}])
|
|
497
497
|
const rule = rules[0]!
|
|
498
498
|
|
|
499
|
-
expect(rule('any value')).toEqual({ error: 'La règle spécifiée pour ce champ n\'existe pas.' })
|
|
499
|
+
expect(await rule('any value')).toEqual({ error: 'La règle spécifiée pour ce champ n\'existe pas.' })
|
|
500
500
|
})
|
|
501
501
|
})
|
|
@@ -10,25 +10,24 @@ export type ValidationResult = {
|
|
|
10
10
|
warning?: string
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
export type RuleOptions<T = any> = {
|
|
14
15
|
message?: string
|
|
15
16
|
successMessage?: string
|
|
16
17
|
warningMessage?: string
|
|
17
18
|
fieldName?: string
|
|
18
19
|
fieldIdentifier?: string
|
|
19
|
-
|
|
20
|
-
value?: any
|
|
20
|
+
value?: T
|
|
21
21
|
length?: number
|
|
22
22
|
pattern?: RegExp
|
|
23
23
|
ignoreSpace?: boolean
|
|
24
24
|
isWarning?: boolean // Si true, la règle génère un warning au lieu d'une erreur
|
|
25
|
-
//
|
|
26
|
-
validate?: (value: any) => boolean | string
|
|
25
|
+
validate?: ((value: T) => boolean | string) | ((value: T) => Promise<boolean | string>) // Fonction de validation personnalisée pour les règles de type 'custom'
|
|
27
26
|
date?: string | Date // Date de référence pour les règles notBeforeDate et notAfterDate
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
31
|
-
export type ValidationRule = (value: any) => ValidationResult
|
|
30
|
+
export type ValidationRule = (value: any) => ValidationResult | Promise<ValidationResult>
|
|
32
31
|
|
|
33
32
|
export function useFieldValidation() {
|
|
34
33
|
const getValueLength = (value: string, ignoreSpace?: boolean): number => {
|
|
@@ -93,7 +92,7 @@ export function useFieldValidation() {
|
|
|
93
92
|
|
|
94
93
|
const createRule = (type: string, options: RuleOptions = {}): ValidationRule => {
|
|
95
94
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
96
|
-
return (value: any): ValidationResult => {
|
|
95
|
+
return (value: any): ValidationResult | Promise<ValidationResult> => {
|
|
97
96
|
// Gestion des champs vides non obligatoires
|
|
98
97
|
if (type !== 'required' && typeof value === 'string' && value.trim() === '') {
|
|
99
98
|
return {}
|
|
@@ -377,20 +376,38 @@ export function useFieldValidation() {
|
|
|
377
376
|
}
|
|
378
377
|
|
|
379
378
|
case 'custom': {
|
|
380
|
-
|
|
381
|
-
if (result === true) {
|
|
382
|
-
return { success: options.successMessage || baseMessages.success }
|
|
383
|
-
}
|
|
384
|
-
// If result is undefined or falsy but not true, treat as invalid
|
|
385
|
-
if (result === false) {
|
|
379
|
+
if (!options.validate) {
|
|
386
380
|
return options.isWarning
|
|
387
381
|
? { warning: options.warningMessage || baseMessages.warning }
|
|
388
382
|
: { error: options.message || baseMessages.error }
|
|
389
383
|
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
384
|
+
|
|
385
|
+
const handleCustomResult = (res: boolean | string): ValidationResult => {
|
|
386
|
+
if (res === true) {
|
|
387
|
+
return { success: options.successMessage || baseMessages.success }
|
|
388
|
+
}
|
|
389
|
+
// If result is undefined or falsy but not true, treat as invalid
|
|
390
|
+
if (res === false) {
|
|
391
|
+
return options.isWarning
|
|
392
|
+
? { warning: options.warningMessage || baseMessages.warning }
|
|
393
|
+
: { error: options.message || baseMessages.error }
|
|
394
|
+
}
|
|
395
|
+
// If result is a string, use it as error/warning message
|
|
396
|
+
return options.isWarning
|
|
397
|
+
? { warning: typeof res === 'string' ? res : options.warningMessage || baseMessages.warning }
|
|
398
|
+
: { error: typeof res === 'string' ? res : options.message || baseMessages.error }
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const result = options.validate(value)
|
|
402
|
+
if (result instanceof Promise) {
|
|
403
|
+
return result.then(handleCustomResult).catch((err: unknown) => {
|
|
404
|
+
const message = err instanceof Error ? err.message : String(err)
|
|
405
|
+
return options.isWarning
|
|
406
|
+
? { warning: options.warningMessage || message || baseMessages.warning } as ValidationResult
|
|
407
|
+
: { error: options.message || message || baseMessages.error } as ValidationResult
|
|
408
|
+
})
|
|
409
|
+
}
|
|
410
|
+
return handleCustomResult(result)
|
|
394
411
|
}
|
|
395
412
|
|
|
396
413
|
default:
|