@portnet/ui 6.0.2 → 6.0.3
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/CHANGELOG.md +652 -0
- package/dist/esm/index.js +72 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/v2/__tests__/AppMain.test.js +130 -0
- package/dist/esm/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js +180 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js +150 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js +93 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +71 -38
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FieldNaming.test.js +160 -0
- package/dist/esm/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js +11 -11
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FileCard.test.js +18 -17
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +87 -179
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +32 -44
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js +101 -0
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +118 -199
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -42
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js +165 -0
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js +156 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +37 -52
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/esm/v2/__tests__/apiError.test.js +50 -69
- package/dist/esm/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/banned-patterns.test.js +41 -122
- package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/esm/v2/__tests__/chart-palette.test.js +204 -0
- package/dist/esm/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/esm/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/esm/v2/__tests__/fileValidation.test.js +134 -0
- package/dist/esm/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js +321 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js +68 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js +218 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js +17 -21
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/esm/v2/__tests__/locale-fallback.test.js +35 -40
- package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js +143 -0
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/rowActions.test.js +182 -0
- package/dist/esm/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js +155 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js +266 -402
- package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js +120 -0
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/esm/v2/components/Accordion.js +48 -70
- package/dist/esm/v2/components/Accordion.js.map +1 -1
- package/dist/esm/v2/components/ActionStrip.js +31 -43
- package/dist/esm/v2/components/ActionStrip.js.map +1 -1
- package/dist/esm/v2/components/Banner.js +25 -22
- package/dist/esm/v2/components/Banner.js.map +1 -1
- package/dist/esm/v2/components/Busy.js +14 -19
- package/dist/esm/v2/components/Busy.js.map +1 -1
- package/dist/esm/v2/components/Button.js +34 -45
- package/dist/esm/v2/components/Button.js.map +1 -1
- package/dist/esm/v2/components/CategoryTag.js +44 -27
- package/dist/esm/v2/components/CategoryTag.js.map +1 -1
- package/dist/esm/v2/components/Checkbox.js +32 -38
- package/dist/esm/v2/components/Checkbox.js.map +1 -1
- package/dist/esm/v2/components/Chip.js +23 -36
- package/dist/esm/v2/components/Chip.js.map +1 -1
- package/dist/esm/v2/components/Combobox.js +112 -136
- package/dist/esm/v2/components/Combobox.js.map +1 -1
- package/dist/esm/v2/components/CommandPalette.js +113 -198
- package/dist/esm/v2/components/CommandPalette.js.map +1 -1
- package/dist/esm/v2/components/ConfirmDialog.js +36 -45
- package/dist/esm/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/esm/v2/components/DatePicker.js +78 -81
- package/dist/esm/v2/components/DatePicker.js.map +1 -1
- package/dist/esm/v2/components/DateRangePicker.js +63 -74
- package/dist/esm/v2/components/DateRangePicker.js.map +1 -1
- package/dist/esm/v2/components/DateTimePicker.js +81 -86
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -1
- package/dist/esm/v2/components/Drawer.js +71 -65
- package/dist/esm/v2/components/Drawer.js.map +1 -1
- package/dist/esm/v2/components/Dropzone.js +130 -177
- package/dist/esm/v2/components/Dropzone.js.map +1 -1
- package/dist/esm/v2/components/EmptyState.js +9 -9
- package/dist/esm/v2/components/EmptyState.js.map +1 -1
- package/dist/esm/v2/components/FavoriteToggle.js +24 -33
- package/dist/esm/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/esm/v2/components/Field.js +155 -59
- package/dist/esm/v2/components/Field.js.map +1 -1
- package/dist/esm/v2/components/FieldError.js +9 -13
- package/dist/esm/v2/components/FieldError.js.map +1 -1
- package/dist/esm/v2/components/FieldHelp.js +28 -49
- package/dist/esm/v2/components/FieldHelp.js.map +1 -1
- package/dist/esm/v2/components/FileCard.js +14 -19
- package/dist/esm/v2/components/FileCard.js.map +1 -1
- package/dist/esm/v2/components/FilterTab.js +22 -31
- package/dist/esm/v2/components/FilterTab.js.map +1 -1
- package/dist/esm/v2/components/ForbiddenPage.js +28 -8
- package/dist/esm/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/esm/v2/components/FormGrid.js +48 -54
- package/dist/esm/v2/components/FormGrid.js.map +1 -1
- package/dist/esm/v2/components/FormikDisplay.js +98 -24
- package/dist/esm/v2/components/FormikDisplay.js.map +1 -1
- package/dist/esm/v2/components/Input.js +75 -34
- package/dist/esm/v2/components/Input.js.map +1 -1
- package/dist/esm/v2/components/KPICard.js +42 -51
- package/dist/esm/v2/components/KPICard.js.map +1 -1
- package/dist/esm/v2/components/KPIStrip.js +9 -15
- package/dist/esm/v2/components/KPIStrip.js.map +1 -1
- package/dist/esm/v2/components/KV.js +16 -23
- package/dist/esm/v2/components/KV.js.map +1 -1
- package/dist/esm/v2/components/KVGrid.js +15 -23
- package/dist/esm/v2/components/KVGrid.js.map +1 -1
- package/dist/esm/v2/components/Layout.js +81 -117
- package/dist/esm/v2/components/Layout.js.map +1 -1
- package/dist/esm/v2/components/MobileRowCard.js +64 -75
- package/dist/esm/v2/components/MobileRowCard.js.map +1 -1
- package/dist/esm/v2/components/Modal.js +44 -53
- package/dist/esm/v2/components/Modal.js.map +1 -1
- package/dist/esm/v2/components/NetworkErrorPage.js +28 -11
- package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/esm/v2/components/NotFoundPage.js +28 -9
- package/dist/esm/v2/components/NotFoundPage.js.map +1 -1
- package/dist/esm/v2/components/NumberInput.js +77 -107
- package/dist/esm/v2/components/NumberInput.js.map +1 -1
- package/dist/esm/v2/components/OverflowMenu.js +24 -42
- package/dist/esm/v2/components/OverflowMenu.js.map +1 -1
- package/dist/esm/v2/components/PdfViewer.js +24 -33
- package/dist/esm/v2/components/PdfViewer.js.map +1 -1
- package/dist/esm/v2/components/ProgressBar.js +28 -36
- package/dist/esm/v2/components/ProgressBar.js.map +1 -1
- package/dist/esm/v2/components/Radio.js +49 -57
- package/dist/esm/v2/components/Radio.js.map +1 -1
- package/dist/esm/v2/components/SectionErrorBoundary.js +84 -130
- package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/esm/v2/components/SectionHeader.js +24 -31
- package/dist/esm/v2/components/SectionHeader.js.map +1 -1
- package/dist/esm/v2/components/Segmented.js +59 -84
- package/dist/esm/v2/components/Segmented.js.map +1 -1
- package/dist/esm/v2/components/Select.js +100 -138
- package/dist/esm/v2/components/Select.js.map +1 -1
- package/dist/esm/v2/components/ServerErrorPage.js +27 -10
- package/dist/esm/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/esm/v2/components/Skeleton.js +81 -96
- package/dist/esm/v2/components/Skeleton.js.map +1 -1
- package/dist/esm/v2/components/SkipLink.js +6 -7
- package/dist/esm/v2/components/SkipLink.js.map +1 -1
- package/dist/esm/v2/components/Spinner.js +13 -22
- package/dist/esm/v2/components/Spinner.js.map +1 -1
- package/dist/esm/v2/components/Status.js +14 -25
- package/dist/esm/v2/components/Status.js.map +1 -1
- package/dist/esm/v2/components/Stepper.js +68 -71
- package/dist/esm/v2/components/Stepper.js.map +1 -1
- package/dist/esm/v2/components/Surface.js +25 -44
- package/dist/esm/v2/components/Surface.js.map +1 -1
- package/dist/esm/v2/components/Switch.js +21 -29
- package/dist/esm/v2/components/Switch.js.map +1 -1
- package/dist/esm/v2/components/TabPanel.js +84 -0
- package/dist/esm/v2/components/TabPanel.js.map +1 -0
- package/dist/esm/v2/components/Tabs.js +43 -19
- package/dist/esm/v2/components/Tabs.js.map +1 -1
- package/dist/esm/v2/components/TelInput.js +75 -108
- package/dist/esm/v2/components/TelInput.js.map +1 -1
- package/dist/esm/v2/components/Textarea.js +21 -30
- package/dist/esm/v2/components/Textarea.js.map +1 -1
- package/dist/esm/v2/components/TimePicker.js +59 -69
- package/dist/esm/v2/components/TimePicker.js.map +1 -1
- package/dist/esm/v2/components/Toast.js +109 -163
- package/dist/esm/v2/components/Toast.js.map +1 -1
- package/dist/esm/v2/components/Tooltip.js +18 -31
- package/dist/esm/v2/components/Tooltip.js.map +1 -1
- package/dist/esm/v2/components/_ErrorPageBody.js +6 -5
- package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/esm/v2/components/_pickerShared.js +2 -2
- package/dist/esm/v2/components/_pickerShared.js.map +1 -1
- package/dist/esm/v2/components/index.js +37 -0
- package/dist/esm/v2/components/index.js.map +1 -1
- package/dist/esm/v2/hooks/index.js +62 -0
- package/dist/esm/v2/hooks/index.js.map +1 -1
- package/dist/esm/v2/hooks/useAppliedFilters.js +112 -0
- package/dist/esm/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js +82 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js +5 -19
- package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/esm/v2/hooks/useDensity.js +13 -17
- package/dist/esm/v2/hooks/useDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusFirstError.js +25 -33
- package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js +81 -0
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusTrap.js +19 -23
- package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/esm/v2/hooks/useFormAutoSave.js +38 -53
- package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/esm/v2/hooks/useFormCompletionProgress.js +32 -51
- package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js +125 -0
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js +99 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js +2 -10
- package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useSortedRows.js +3 -5
- package/dist/esm/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/esm/v2/hooks/useTabLoading.js +6 -21
- package/dist/esm/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/esm/v2/index.js +2 -3
- package/dist/esm/v2/index.js.map +1 -1
- package/dist/esm/v2/modalContext.js +2 -2
- package/dist/esm/v2/modalContext.js.map +1 -1
- package/dist/esm/v2/models/favorite.js.map +1 -1
- package/dist/esm/v2/models/personalization.js.map +1 -1
- package/dist/esm/v2/models/referentiel.js.map +1 -1
- package/dist/esm/v2/models/savedFilter.js.map +1 -1
- package/dist/esm/v2/patterns/ActionBar.js +115 -159
- package/dist/esm/v2/patterns/ActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/AppMain.js +108 -0
- package/dist/esm/v2/patterns/AppMain.js.map +1 -0
- package/dist/esm/v2/patterns/BulkActionBar.js +31 -34
- package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/ChartFigure.js +151 -0
- package/dist/esm/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js +111 -152
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/ColumnsToggle.js +43 -77
- package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/esm/v2/patterns/DataGrid.js +221 -255
- package/dist/esm/v2/patterns/DataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js +76 -94
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridToolbar.js +85 -89
- package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridVirtualized.js +141 -182
- package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +26 -30
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/esm/v2/patterns/DetailSplit.js +108 -0
- package/dist/esm/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js +15 -17
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/esm/v2/patterns/FavoritesFilter.js +30 -39
- package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/esm/v2/patterns/FilterTabBar.js +112 -0
- package/dist/esm/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js +12 -13
- package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/esm/v2/patterns/FormPageShell.js +43 -41
- package/dist/esm/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/FormSection.js +30 -38
- package/dist/esm/v2/patterns/FormSection.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckbox.js +29 -39
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js +56 -60
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCombobox.js +51 -69
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorFocus.js +22 -23
- package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorSummary.js +89 -0
- package/dist/esm/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/esm/v2/patterns/FormikFile.js +94 -78
- package/dist/esm/v2/patterns/FormikFile.js.map +1 -1
- package/dist/esm/v2/patterns/FormikInput.js +40 -53
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +39 -51
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikReferentielField.js +49 -59
- package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/FormikSelect.js +64 -87
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +30 -46
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +53 -71
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/esm/v2/patterns/NetworkErrorBanner.js +6 -7
- package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/esm/v2/patterns/PageContent.js +10 -14
- package/dist/esm/v2/patterns/PageContent.js.map +1 -1
- package/dist/esm/v2/patterns/PreviewDrawer.js +153 -0
- package/dist/esm/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/esm/v2/patterns/ReferentielField.js +327 -312
- package/dist/esm/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/RowFavoriteToggle.js +27 -22
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -1
- package/dist/esm/v2/patterns/SaveFilterDialog.js +38 -66
- package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/esm/v2/patterns/SavedFiltersMenu.js +62 -81
- package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/esm/v2/patterns/SkeletonPageShell.js +106 -129
- package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/SortableHeader.js +22 -45
- package/dist/esm/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/esm/v2/patterns/Tour.js +94 -120
- package/dist/esm/v2/patterns/Tour.js.map +1 -1
- package/dist/esm/v2/patterns/_dataGridShared.js +107 -128
- package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/esm/v2/patterns/_pickerSerialisation.js +6 -8
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -1
- package/dist/esm/v2/patterns/_sort.js +17 -33
- package/dist/esm/v2/patterns/_sort.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnReorder.js +122 -160
- package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnResize.js +78 -96
- package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/esm/v2/patterns/filterCriteria.js +102 -0
- package/dist/esm/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +152 -0
- package/dist/esm/v2/patterns/index.js.map +1 -1
- package/dist/esm/v2/patterns/rowActions.js +223 -0
- package/dist/esm/v2/patterns/rowActions.js.map +1 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js +50 -47
- package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +22 -23
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +13 -13
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favorites.js +36 -60
- package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favoritesView.js +22 -34
- package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js +28 -34
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js +119 -0
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js +90 -98
- package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/esm/v2/personalization/createPersonalizationStore.js +78 -181
- package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/esm/v2/personalization/index.js +17 -0
- package/dist/esm/v2/personalization/index.js.map +1 -1
- package/dist/esm/v2/personalization/personalizationContext.js +9 -9
- package/dist/esm/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/esm/v2/personalization/schema.js +8 -9
- package/dist/esm/v2/personalization/schema.js.map +1 -1
- package/dist/esm/v2/referentiel/ReferentielProvider.js +27 -42
- package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/esm/v2/referentiel/types.js +2 -0
- package/dist/esm/v2/referentiel/types.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js +10 -11
- package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielOptions.js +60 -117
- package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielSearch.js +37 -91
- package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/esm/v2/theme/_brand.js +8 -24
- package/dist/esm/v2/theme/_brand.js.map +1 -1
- package/dist/esm/v2/theme/_brandSecondary.js +8 -24
- package/dist/esm/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/esm/v2/theme/createPortnetTheme.js +51 -61
- package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/esm/v2/theme/cssVariables.js +62 -69
- package/dist/esm/v2/theme/cssVariables.js.map +1 -1
- package/dist/esm/v2/theme/index.js +5 -5
- package/dist/esm/v2/theme/index.js.map +1 -1
- package/dist/esm/v2/tokens/breakpoints.js +14 -14
- package/dist/esm/v2/tokens/breakpoints.js.map +1 -1
- package/dist/esm/v2/tokens/chart.js +261 -0
- package/dist/esm/v2/tokens/chart.js.map +1 -0
- package/dist/esm/v2/tokens/colors.js +22 -22
- package/dist/esm/v2/tokens/colors.js.map +1 -1
- package/dist/esm/v2/tokens/density.js +62 -7
- package/dist/esm/v2/tokens/density.js.map +1 -1
- package/dist/esm/v2/tokens/index.js +49 -34
- package/dist/esm/v2/tokens/index.js.map +1 -1
- package/dist/esm/v2/tokens/motion.js +12 -20
- package/dist/esm/v2/tokens/motion.js.map +1 -1
- package/dist/esm/v2/tokens/radius.js +1 -1
- package/dist/esm/v2/tokens/radius.js.map +1 -1
- package/dist/esm/v2/tokens/shadows.js +6 -6
- package/dist/esm/v2/tokens/shadows.js.map +1 -1
- package/dist/esm/v2/tokens/spacing.js +2 -2
- package/dist/esm/v2/tokens/spacing.js.map +1 -1
- package/dist/esm/v2/tokens/state.js +1 -1
- package/dist/esm/v2/tokens/state.js.map +1 -1
- package/dist/esm/v2/tokens/statusPalette.js +17 -21
- package/dist/esm/v2/tokens/statusPalette.js.map +1 -1
- package/dist/esm/v2/tokens/tokens.json +6 -1
- package/dist/esm/v2/tokens/typography.js +13 -13
- package/dist/esm/v2/tokens/typography.js.map +1 -1
- package/dist/esm/v2/tokens/zIndex.js +1 -1
- package/dist/esm/v2/tokens/zIndex.js.map +1 -1
- package/dist/esm/v2/types/datagrid.js.map +1 -1
- package/dist/esm/v2/utils/apiError.js +16 -37
- package/dist/esm/v2/utils/apiError.js.map +1 -1
- package/dist/esm/v2/utils/contrast.js +31 -32
- package/dist/esm/v2/utils/contrast.js.map +1 -1
- package/dist/esm/v2/utils/cx.js +5 -25
- package/dist/esm/v2/utils/cx.js.map +1 -1
- package/dist/esm/v2/utils/fileDownload.js +23 -26
- package/dist/esm/v2/utils/fileDownload.js.map +1 -1
- package/dist/esm/v2/utils/fileValidation.js +209 -0
- package/dist/esm/v2/utils/fileValidation.js.map +1 -0
- package/dist/esm/v2/utils/fmtDate.js +111 -0
- package/dist/esm/v2/utils/fmtDate.js.map +1 -0
- package/dist/esm/v2/utils/fmtMoney.js +8 -10
- package/dist/esm/v2/utils/fmtMoney.js.map +1 -1
- package/dist/esm/v2/utils/formikErrors.js +78 -0
- package/dist/esm/v2/utils/formikErrors.js.map +1 -0
- package/dist/esm/v2/utils/index.js +35 -2
- package/dist/esm/v2/utils/index.js.map +1 -1
- package/dist/esm/v2/utils/mergeLabels.js +7 -12
- package/dist/esm/v2/utils/mergeLabels.js.map +1 -1
- package/dist/esm/v2/utils/networkStatus.js +12 -12
- package/dist/esm/v2/utils/networkStatus.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +110 -49
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/AppMain.test.js +133 -0
- package/dist/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/v2/__tests__/ChartFigure.test.js +183 -0
- package/dist/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js +153 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js +94 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/v2/__tests__/FieldError.test.js +82 -49
- package/dist/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/v2/__tests__/FieldNaming.test.js +161 -0
- package/dist/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/v2/__tests__/FieldWidth.test.js +23 -25
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/v2/__tests__/FileCard.test.js +29 -28
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +90 -183
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +38 -48
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDisplayWidth.test.js +102 -0
- package/dist/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js +123 -204
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/v2/__tests__/MobileRowCard.test.js +63 -61
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/v2/__tests__/PreviewDrawer.test.js +169 -0
- package/dist/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js +159 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +53 -68
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/v2/__tests__/apiError.test.js +50 -69
- package/dist/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/v2/__tests__/banned-patterns.test.js +42 -123
- package/dist/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/v2/__tests__/chart-palette.test.js +205 -0
- package/dist/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/v2/__tests__/fileValidation.test.js +136 -0
- package/dist/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/v2/__tests__/filterCriteria.test.js +324 -0
- package/dist/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/fmtDate.test.js +69 -0
- package/dist/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js +221 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/v2/__tests__/labels-merge.test.js +23 -27
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/v2/__tests__/locale-fallback.test.js +47 -52
- package/dist/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/v2/__tests__/reviveSavedCriteria.test.js +144 -0
- package/dist/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/rowActions.test.js +186 -0
- package/dist/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js +156 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusTrap.test.js +270 -407
- package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js +123 -0
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/v2/components/Accordion.js +60 -82
- package/dist/v2/components/Accordion.js.map +1 -1
- package/dist/v2/components/ActionStrip.js +40 -52
- package/dist/v2/components/ActionStrip.js.map +1 -1
- package/dist/v2/components/Banner.js +42 -41
- package/dist/v2/components/Banner.js.map +1 -1
- package/dist/v2/components/Busy.js +22 -27
- package/dist/v2/components/Busy.js.map +1 -1
- package/dist/v2/components/Button.js +39 -50
- package/dist/v2/components/Button.js.map +1 -1
- package/dist/v2/components/CategoryTag.d.ts.map +1 -1
- package/dist/v2/components/CategoryTag.js +49 -32
- package/dist/v2/components/CategoryTag.js.map +1 -1
- package/dist/v2/components/Checkbox.js +39 -45
- package/dist/v2/components/Checkbox.js.map +1 -1
- package/dist/v2/components/Chip.js +29 -42
- package/dist/v2/components/Chip.js.map +1 -1
- package/dist/v2/components/Combobox.js +122 -144
- package/dist/v2/components/Combobox.js.map +1 -1
- package/dist/v2/components/CommandPalette.js +138 -225
- package/dist/v2/components/CommandPalette.js.map +1 -1
- package/dist/v2/components/ConfirmDialog.js +46 -56
- package/dist/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/v2/components/DatePicker.js +81 -86
- package/dist/v2/components/DatePicker.js.map +1 -1
- package/dist/v2/components/DateRangePicker.js +77 -87
- package/dist/v2/components/DateRangePicker.js.map +1 -1
- package/dist/v2/components/DateTimePicker.js +84 -91
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Drawer.d.ts.map +1 -1
- package/dist/v2/components/Drawer.js +93 -88
- package/dist/v2/components/Drawer.js.map +1 -1
- package/dist/v2/components/Dropzone.js +150 -196
- package/dist/v2/components/Dropzone.js.map +1 -1
- package/dist/v2/components/EmptyState.js +18 -20
- package/dist/v2/components/EmptyState.js.map +1 -1
- package/dist/v2/components/FavoriteToggle.js +28 -39
- package/dist/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/v2/components/Field.d.ts +62 -4
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +169 -70
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/FieldError.js +18 -21
- package/dist/v2/components/FieldError.js.map +1 -1
- package/dist/v2/components/FieldHelp.js +40 -60
- package/dist/v2/components/FieldHelp.js.map +1 -1
- package/dist/v2/components/FileCard.js +27 -31
- package/dist/v2/components/FileCard.js.map +1 -1
- package/dist/v2/components/FilterTab.js +30 -38
- package/dist/v2/components/FilterTab.js.map +1 -1
- package/dist/v2/components/ForbiddenPage.d.ts +25 -1
- package/dist/v2/components/ForbiddenPage.d.ts.map +1 -1
- package/dist/v2/components/ForbiddenPage.js +37 -17
- package/dist/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/v2/components/FormGrid.js +53 -59
- package/dist/v2/components/FormGrid.js.map +1 -1
- package/dist/v2/components/FormikDisplay.d.ts +50 -1
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
- package/dist/v2/components/FormikDisplay.js +108 -33
- package/dist/v2/components/FormikDisplay.js.map +1 -1
- package/dist/v2/components/Input.d.ts +40 -0
- package/dist/v2/components/Input.d.ts.map +1 -1
- package/dist/v2/components/Input.js +81 -41
- package/dist/v2/components/Input.js.map +1 -1
- package/dist/v2/components/KPICard.js +57 -67
- package/dist/v2/components/KPICard.js.map +1 -1
- package/dist/v2/components/KPIStrip.js +16 -22
- package/dist/v2/components/KPIStrip.js.map +1 -1
- package/dist/v2/components/KV.js +25 -31
- package/dist/v2/components/KV.js.map +1 -1
- package/dist/v2/components/KVGrid.js +19 -26
- package/dist/v2/components/KVGrid.js.map +1 -1
- package/dist/v2/components/Layout.js +91 -120
- package/dist/v2/components/Layout.js.map +1 -1
- package/dist/v2/components/MobileRowCard.js +79 -91
- package/dist/v2/components/MobileRowCard.js.map +1 -1
- package/dist/v2/components/Modal.js +61 -69
- package/dist/v2/components/Modal.js.map +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts +19 -1
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
- package/dist/v2/components/NetworkErrorPage.js +38 -21
- package/dist/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/v2/components/NotFoundPage.d.ts +17 -1
- package/dist/v2/components/NotFoundPage.d.ts.map +1 -1
- package/dist/v2/components/NotFoundPage.js +37 -18
- package/dist/v2/components/NotFoundPage.js.map +1 -1
- package/dist/v2/components/NumberInput.js +88 -118
- package/dist/v2/components/NumberInput.js.map +1 -1
- package/dist/v2/components/OverflowMenu.js +38 -56
- package/dist/v2/components/OverflowMenu.js.map +1 -1
- package/dist/v2/components/PdfViewer.js +34 -45
- package/dist/v2/components/PdfViewer.js.map +1 -1
- package/dist/v2/components/ProgressBar.js +42 -49
- package/dist/v2/components/ProgressBar.js.map +1 -1
- package/dist/v2/components/Radio.js +59 -67
- package/dist/v2/components/Radio.js.map +1 -1
- package/dist/v2/components/SectionErrorBoundary.js +90 -135
- package/dist/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/v2/components/SectionHeader.js +34 -41
- package/dist/v2/components/SectionHeader.js.map +1 -1
- package/dist/v2/components/Segmented.js +69 -93
- package/dist/v2/components/Segmented.js.map +1 -1
- package/dist/v2/components/Select.d.ts +26 -2
- package/dist/v2/components/Select.d.ts.map +1 -1
- package/dist/v2/components/Select.js +120 -155
- package/dist/v2/components/Select.js.map +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts +27 -1
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
- package/dist/v2/components/ServerErrorPage.js +37 -20
- package/dist/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/v2/components/Skeleton.js +86 -100
- package/dist/v2/components/Skeleton.js.map +1 -1
- package/dist/v2/components/SkipLink.js +9 -12
- package/dist/v2/components/SkipLink.js.map +1 -1
- package/dist/v2/components/Spinner.js +16 -25
- package/dist/v2/components/Spinner.js.map +1 -1
- package/dist/v2/components/Status.js +18 -29
- package/dist/v2/components/Status.js.map +1 -1
- package/dist/v2/components/Stepper.js +80 -82
- package/dist/v2/components/Stepper.js.map +1 -1
- package/dist/v2/components/Surface.js +34 -49
- package/dist/v2/components/Surface.js.map +1 -1
- package/dist/v2/components/Switch.js +29 -37
- package/dist/v2/components/Switch.js.map +1 -1
- package/dist/v2/components/TabPanel.d.ts +17 -0
- package/dist/v2/components/TabPanel.d.ts.map +1 -0
- package/dist/v2/components/TabPanel.js +90 -0
- package/dist/v2/components/TabPanel.js.map +1 -0
- package/dist/v2/components/Tabs.d.ts +25 -0
- package/dist/v2/components/Tabs.d.ts.map +1 -1
- package/dist/v2/components/Tabs.js +53 -29
- package/dist/v2/components/Tabs.js.map +1 -1
- package/dist/v2/components/TelInput.js +80 -115
- package/dist/v2/components/TelInput.js.map +1 -1
- package/dist/v2/components/Textarea.js +26 -35
- package/dist/v2/components/Textarea.js.map +1 -1
- package/dist/v2/components/TimePicker.js +62 -74
- package/dist/v2/components/TimePicker.js.map +1 -1
- package/dist/v2/components/Toast.js +119 -174
- package/dist/v2/components/Toast.js.map +1 -1
- package/dist/v2/components/Tooltip.js +23 -38
- package/dist/v2/components/Tooltip.js.map +1 -1
- package/dist/v2/components/_ErrorPageBody.js +15 -16
- package/dist/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/v2/components/_pickerShared.js +5 -5
- package/dist/v2/components/_pickerShared.js.map +1 -1
- package/dist/v2/components/index.d.ts +40 -1
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js +153 -136
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/hooks/index.d.ts +65 -0
- package/dist/v2/hooks/index.d.ts.map +1 -1
- package/dist/v2/hooks/index.js +63 -24
- package/dist/v2/hooks/index.js.map +1 -1
- package/dist/v2/hooks/useAppliedFilters.d.ts +102 -0
- package/dist/v2/hooks/useAppliedFilters.d.ts.map +1 -0
- package/dist/v2/hooks/useAppliedFilters.js +117 -0
- package/dist/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts +64 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.js +87 -0
- package/dist/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/v2/hooks/useDelayedFlag.js +6 -20
- package/dist/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/v2/hooks/useDensity.d.ts.map +1 -1
- package/dist/v2/hooks/useDensity.js +14 -18
- package/dist/v2/hooks/useDensity.js.map +1 -1
- package/dist/v2/hooks/useFocusFirstError.js +26 -34
- package/dist/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts +65 -0
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts.map +1 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js +88 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/v2/hooks/useFocusTrap.js +20 -24
- package/dist/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.d.ts +4 -4
- package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.js +39 -54
- package/dist/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.js +33 -52
- package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts +25 -0
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js +132 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts +56 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js +105 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/v2/hooks/useResolvedDensity.js +5 -13
- package/dist/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/v2/hooks/useSortedRows.js +4 -6
- package/dist/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/v2/hooks/useTabLoading.js +7 -22
- package/dist/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/v2/index.js +143 -145
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/modalContext.js +2 -2
- package/dist/v2/modalContext.js.map +1 -1
- package/dist/v2/models/favorite.d.ts +8 -9
- package/dist/v2/models/favorite.d.ts.map +1 -1
- package/dist/v2/models/favorite.js.map +1 -1
- package/dist/v2/models/index.js +4 -4
- package/dist/v2/models/index.js.map +1 -1
- package/dist/v2/models/personalization.d.ts +44 -48
- package/dist/v2/models/personalization.d.ts.map +1 -1
- package/dist/v2/models/personalization.js.map +1 -1
- package/dist/v2/models/referentiel.d.ts +32 -50
- package/dist/v2/models/referentiel.d.ts.map +1 -1
- package/dist/v2/models/referentiel.js.map +1 -1
- package/dist/v2/models/savedFilter.d.ts +8 -17
- package/dist/v2/models/savedFilter.d.ts.map +1 -1
- package/dist/v2/models/savedFilter.js.map +1 -1
- package/dist/v2/patterns/ActionBar.js +152 -187
- package/dist/v2/patterns/ActionBar.js.map +1 -1
- package/dist/v2/patterns/AppMain.d.ts +109 -0
- package/dist/v2/patterns/AppMain.d.ts.map +1 -0
- package/dist/v2/patterns/AppMain.js +115 -0
- package/dist/v2/patterns/AppMain.js.map +1 -0
- package/dist/v2/patterns/BulkActionBar.js +40 -42
- package/dist/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/v2/patterns/ChartFigure.d.ts +124 -0
- package/dist/v2/patterns/ChartFigure.d.ts.map +1 -0
- package/dist/v2/patterns/ChartFigure.js +159 -0
- package/dist/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/v2/patterns/CollapsibleDataGrid.js +138 -174
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.js +60 -94
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/v2/patterns/DataGrid.d.ts.map +1 -1
- package/dist/v2/patterns/DataGrid.js +262 -297
- package/dist/v2/patterns/DataGrid.js.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -0
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.js +104 -121
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.js +103 -106
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.js +179 -217
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js +32 -35
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/v2/patterns/DetailSplit.d.ts +87 -0
- package/dist/v2/patterns/DetailSplit.d.ts.map +1 -0
- package/dist/v2/patterns/DetailSplit.js +116 -0
- package/dist/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/v2/patterns/FavoriteColumn.js +22 -23
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.js +36 -44
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/v2/patterns/FilterTabBar.d.ts +28 -0
- package/dist/v2/patterns/FilterTabBar.d.ts.map +1 -0
- package/dist/v2/patterns/FilterTabBar.js +120 -0
- package/dist/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/v2/patterns/FormErrorSummary.js +20 -23
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/v2/patterns/FormPageShell.js +53 -50
- package/dist/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/v2/patterns/FormSection.d.ts +8 -3
- package/dist/v2/patterns/FormSection.d.ts.map +1 -1
- package/dist/v2/patterns/FormSection.js +44 -51
- package/dist/v2/patterns/FormSection.js.map +1 -1
- package/dist/v2/patterns/FormikCheckbox.js +36 -45
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +17 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.js +62 -65
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +55 -72
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +50 -64
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.js +50 -64
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -1
- package/dist/v2/patterns/FormikErrorFocus.js +25 -26
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/v2/patterns/FormikErrorSummary.d.ts +74 -0
- package/dist/v2/patterns/FormikErrorSummary.d.ts.map +1 -0
- package/dist/v2/patterns/FormikErrorSummary.js +97 -0
- package/dist/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/v2/patterns/FormikFile.d.ts +14 -1
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
- package/dist/v2/patterns/FormikFile.js +99 -83
- package/dist/v2/patterns/FormikFile.js.map +1 -1
- package/dist/v2/patterns/FormikInput.js +45 -58
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.js +45 -56
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts +12 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.js +54 -64
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +70 -92
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +35 -51
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +60 -80
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.js +13 -16
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/v2/patterns/PageContent.js +17 -20
- package/dist/v2/patterns/PageContent.js.map +1 -1
- package/dist/v2/patterns/PreviewDrawer.d.ts +49 -0
- package/dist/v2/patterns/PreviewDrawer.d.ts.map +1 -0
- package/dist/v2/patterns/PreviewDrawer.js +159 -0
- package/dist/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/v2/patterns/ReferentielField.d.ts +86 -2
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/ReferentielField.js +347 -327
- package/dist/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.d.ts +6 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.js +38 -30
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -1
- package/dist/v2/patterns/SaveFilterDialog.js +50 -77
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.js +89 -107
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.js +122 -143
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/v2/patterns/SortableHeader.js +35 -57
- package/dist/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/v2/patterns/Tour.js +121 -142
- package/dist/v2/patterns/Tour.js.map +1 -1
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
- package/dist/v2/patterns/_dataGridShared.js +131 -147
- package/dist/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/v2/patterns/_pickerSerialisation.js +9 -10
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -1
- package/dist/v2/patterns/_sort.js +17 -33
- package/dist/v2/patterns/_sort.js.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.js +124 -163
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/v2/patterns/_useColumnResize.js +80 -99
- package/dist/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/v2/patterns/filterCriteria.d.ts +78 -0
- package/dist/v2/patterns/filterCriteria.d.ts.map +1 -0
- package/dist/v2/patterns/filterCriteria.js +110 -0
- package/dist/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/v2/patterns/index.d.ts +160 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +157 -79
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/patterns/rowActions.d.ts +150 -0
- package/dist/v2/patterns/rowActions.d.ts.map +1 -0
- package/dist/v2/patterns/rowActions.js +232 -0
- package/dist/v2/patterns/rowActions.js.map +1 -0
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.js +57 -53
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +25 -24
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.js +14 -14
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/index.js +5 -5
- package/dist/v2/personalization/adapters/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/favorites.js +39 -62
- package/dist/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.js +25 -37
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/v2/personalization/capabilities/gridPreferences.js +31 -36
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +12 -12
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts +88 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js +126 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/v2/personalization/capabilities/savedFilters.js +93 -100
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.js +81 -182
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/v2/personalization/index.d.ts +16 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +30 -23
- package/dist/v2/personalization/index.js.map +1 -1
- package/dist/v2/personalization/personalizationContext.js +10 -12
- package/dist/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/v2/personalization/schema.js +8 -9
- package/dist/v2/personalization/schema.js.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.js +31 -45
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/v2/referentiel/index.js +11 -13
- package/dist/v2/referentiel/index.js.map +1 -1
- package/dist/v2/referentiel/types.d.ts +105 -0
- package/dist/v2/referentiel/types.d.ts.map +1 -0
- package/dist/v2/referentiel/types.js +6 -0
- package/dist/v2/referentiel/types.js.map +1 -0
- package/dist/v2/referentiel/useReferentielClient.js +13 -16
- package/dist/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.d.ts +7 -17
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.js +63 -120
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.d.ts +7 -48
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.js +40 -95
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/v2/theme/_brand.js +12 -26
- package/dist/v2/theme/_brand.js.map +1 -1
- package/dist/v2/theme/_brandSecondary.js +12 -26
- package/dist/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/v2/theme/createPortnetTheme.js +41 -49
- package/dist/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/v2/theme/cssVariables.d.ts +3 -3
- package/dist/v2/theme/cssVariables.d.ts.map +1 -1
- package/dist/v2/theme/cssVariables.js +65 -70
- package/dist/v2/theme/cssVariables.js.map +1 -1
- package/dist/v2/theme/index.js +10 -10
- package/dist/v2/theme/index.js.map +1 -1
- package/dist/v2/tokens/breakpoints.js +16 -16
- package/dist/v2/tokens/breakpoints.js.map +1 -1
- package/dist/v2/tokens/chart.d.ts +103 -0
- package/dist/v2/tokens/chart.d.ts.map +1 -0
- package/dist/v2/tokens/chart.js +270 -0
- package/dist/v2/tokens/chart.js.map +1 -0
- package/dist/v2/tokens/colors.js +24 -24
- package/dist/v2/tokens/colors.js.map +1 -1
- package/dist/v2/tokens/density.d.ts +104 -0
- package/dist/v2/tokens/density.d.ts.map +1 -1
- package/dist/v2/tokens/density.js +67 -12
- package/dist/v2/tokens/density.js.map +1 -1
- package/dist/v2/tokens/index.d.ts +50 -1
- package/dist/v2/tokens/index.d.ts.map +1 -1
- package/dist/v2/tokens/index.js +116 -68
- package/dist/v2/tokens/index.js.map +1 -1
- package/dist/v2/tokens/motion.js +16 -22
- package/dist/v2/tokens/motion.js.map +1 -1
- package/dist/v2/tokens/radius.js +3 -3
- package/dist/v2/tokens/radius.js.map +1 -1
- package/dist/v2/tokens/shadows.js +8 -8
- package/dist/v2/tokens/shadows.js.map +1 -1
- package/dist/v2/tokens/spacing.js +4 -4
- package/dist/v2/tokens/spacing.js.map +1 -1
- package/dist/v2/tokens/state.js +3 -3
- package/dist/v2/tokens/state.js.map +1 -1
- package/dist/v2/tokens/statusPalette.js +21 -23
- package/dist/v2/tokens/statusPalette.js.map +1 -1
- package/dist/v2/tokens/tokens.json +6 -1
- package/dist/v2/tokens/typography.js +15 -15
- package/dist/v2/tokens/typography.js.map +1 -1
- package/dist/v2/tokens/zIndex.js +3 -3
- package/dist/v2/tokens/zIndex.js.map +1 -1
- package/dist/v2/types/datagrid.d.ts +9 -1
- package/dist/v2/types/datagrid.d.ts.map +1 -1
- package/dist/v2/types/datagrid.js.map +1 -1
- package/dist/v2/types/index.js +2 -2
- package/dist/v2/types/index.js.map +1 -1
- package/dist/v2/utils/apiError.js +16 -37
- package/dist/v2/utils/apiError.js.map +1 -1
- package/dist/v2/utils/contrast.js +31 -32
- package/dist/v2/utils/contrast.js.map +1 -1
- package/dist/v2/utils/cx.js +7 -27
- package/dist/v2/utils/cx.js.map +1 -1
- package/dist/v2/utils/fileDownload.js +25 -28
- package/dist/v2/utils/fileDownload.js.map +1 -1
- package/dist/v2/utils/fileValidation.d.ts +116 -0
- package/dist/v2/utils/fileValidation.d.ts.map +1 -0
- package/dist/v2/utils/fileValidation.js +220 -0
- package/dist/v2/utils/fileValidation.js.map +1 -0
- package/dist/v2/utils/fmtDate.d.ts +103 -0
- package/dist/v2/utils/fmtDate.d.ts.map +1 -0
- package/dist/v2/utils/fmtDate.js +119 -0
- package/dist/v2/utils/fmtDate.js.map +1 -0
- package/dist/v2/utils/fmtMoney.d.ts +3 -3
- package/dist/v2/utils/fmtMoney.d.ts.map +1 -1
- package/dist/v2/utils/fmtMoney.js +9 -11
- package/dist/v2/utils/fmtMoney.js.map +1 -1
- package/dist/v2/utils/formikErrors.d.ts +67 -0
- package/dist/v2/utils/formikErrors.d.ts.map +1 -0
- package/dist/v2/utils/formikErrors.js +85 -0
- package/dist/v2/utils/formikErrors.js.map +1 -0
- package/dist/v2/utils/index.d.ts +5 -0
- package/dist/v2/utils/index.d.ts.map +1 -1
- package/dist/v2/utils/index.js +67 -18
- package/dist/v2/utils/index.js.map +1 -1
- package/dist/v2/utils/mergeLabels.js +9 -14
- package/dist/v2/utils/mergeLabels.js.map +1 -1
- package/dist/v2/utils/networkStatus.js +14 -14
- package/dist/v2/utils/networkStatus.js.map +1 -1
- package/package.json +26 -9
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
2
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
3
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
-
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
6
|
-
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
7
1
|
import { DEFAULT_API_ERROR_MESSAGE, getApiErrorDetail, getApiErrorMessage, getApiErrorStatus } from "../utils/apiError";
|
|
8
2
|
|
|
9
3
|
/**
|
|
@@ -29,65 +23,52 @@ import { DEFAULT_API_ERROR_MESSAGE, getApiErrorDetail, getApiErrorMessage, getAp
|
|
|
29
23
|
*/
|
|
30
24
|
|
|
31
25
|
/** Minimal axios-shaped rejection. Duck-typed on purpose — see the file header. */
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}, dataMessage === undefined ? {} : {
|
|
26
|
+
const axiosLike = (status, message, dataMessage) => ({
|
|
27
|
+
message,
|
|
28
|
+
response: {
|
|
29
|
+
status,
|
|
30
|
+
...(dataMessage === undefined ? {} : {
|
|
38
31
|
data: {
|
|
39
32
|
message: dataMessage
|
|
40
33
|
}
|
|
41
34
|
})
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
describe("getApiErrorMessage — resolution order",
|
|
45
|
-
test("a non-empty string rejection is returned as-is",
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
describe("getApiErrorMessage — resolution order", () => {
|
|
38
|
+
test("a non-empty string rejection is returned as-is", () => {
|
|
46
39
|
expect(getApiErrorMessage("Trop de tentatives.")).toBe("Trop de tentatives.");
|
|
47
40
|
});
|
|
48
|
-
test("the backend message wins over everything else",
|
|
49
|
-
|
|
41
|
+
test("the backend message wins over everything else", () => {
|
|
42
|
+
const err = axiosLike(422, "Request failed with status code 422", "Le numéro de titre est invalide.");
|
|
50
43
|
expect(getApiErrorMessage(err, "Échec.")).toBe("Le numéro de titre est invalide.");
|
|
51
44
|
});
|
|
52
|
-
test("falls back when nothing usable is present",
|
|
45
|
+
test("falls back when nothing usable is present", () => {
|
|
53
46
|
expect(getApiErrorMessage({}, "Échec de l'envoi.")).toBe("Échec de l'envoi.");
|
|
54
47
|
});
|
|
55
|
-
test("uses the platform default when no fallback is supplied",
|
|
48
|
+
test("uses the platform default when no fallback is supplied", () => {
|
|
56
49
|
expect(getApiErrorMessage({})).toBe(DEFAULT_API_ERROR_MESSAGE);
|
|
57
50
|
});
|
|
58
|
-
test("never returns an empty string",
|
|
51
|
+
test("never returns an empty string", () => {
|
|
59
52
|
expect(getApiErrorMessage("")).toBe(DEFAULT_API_ERROR_MESSAGE);
|
|
60
53
|
expect(getApiErrorMessage({
|
|
61
54
|
message: ""
|
|
62
55
|
})).toBe(DEFAULT_API_ERROR_MESSAGE);
|
|
63
56
|
});
|
|
64
|
-
test("never throws on hostile input",
|
|
65
|
-
expect(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
expect(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}).not.toThrow();
|
|
77
|
-
expect(function () {
|
|
78
|
-
return getApiErrorMessage({
|
|
79
|
-
response: null
|
|
80
|
-
});
|
|
81
|
-
}).not.toThrow();
|
|
82
|
-
expect(function () {
|
|
83
|
-
return getApiErrorMessage({
|
|
84
|
-
response: {
|
|
85
|
-
data: {
|
|
86
|
-
message: 42
|
|
87
|
-
}
|
|
57
|
+
test("never throws on hostile input", () => {
|
|
58
|
+
expect(() => getApiErrorMessage(null)).not.toThrow();
|
|
59
|
+
expect(() => getApiErrorMessage(undefined)).not.toThrow();
|
|
60
|
+
expect(() => getApiErrorMessage(0)).not.toThrow();
|
|
61
|
+
expect(() => getApiErrorMessage([])).not.toThrow();
|
|
62
|
+
expect(() => getApiErrorMessage({
|
|
63
|
+
response: null
|
|
64
|
+
})).not.toThrow();
|
|
65
|
+
expect(() => getApiErrorMessage({
|
|
66
|
+
response: {
|
|
67
|
+
data: {
|
|
68
|
+
message: 42
|
|
88
69
|
}
|
|
89
|
-
}
|
|
90
|
-
}).not.toThrow();
|
|
70
|
+
}
|
|
71
|
+
})).not.toThrow();
|
|
91
72
|
});
|
|
92
73
|
});
|
|
93
74
|
|
|
@@ -95,20 +76,20 @@ describe("getApiErrorMessage — resolution order", function () {
|
|
|
95
76
|
* G-07 — THE REGRESSION GUARD. If any of these fail, a transport string is
|
|
96
77
|
* reaching end users again.
|
|
97
78
|
*/
|
|
98
|
-
describe("getApiErrorMessage — transport strings are suppressed (G-07)",
|
|
99
|
-
|
|
100
|
-
test.each(["Request failed with status code 500", "Request failed with status code 404", "Network Error", "timeout of 15000ms exceeded", "timeout exceeded", "Request aborted", "canceled", "socket hang up", "ECONNREFUSED", "ETIMEDOUT", "ECONNRESET", "ENOTFOUND", "EPIPE", "ERR_NETWORK", "ERR_CANCELED", "ERR_BAD_RESPONSE"])("suppresses %p in favour of the caller's copy",
|
|
79
|
+
describe("getApiErrorMessage — transport strings are suppressed (G-07)", () => {
|
|
80
|
+
const FALLBACK = "Le service est momentanément indisponible.";
|
|
81
|
+
test.each(["Request failed with status code 500", "Request failed with status code 404", "Network Error", "timeout of 15000ms exceeded", "timeout exceeded", "Request aborted", "canceled", "socket hang up", "ECONNREFUSED", "ETIMEDOUT", "ECONNRESET", "ENOTFOUND", "EPIPE", "ERR_NETWORK", "ERR_CANCELED", "ERR_BAD_RESPONSE"])("suppresses %p in favour of the caller's copy", message => {
|
|
101
82
|
expect(getApiErrorMessage({
|
|
102
|
-
message
|
|
83
|
+
message
|
|
103
84
|
}, FALLBACK)).toBe(FALLBACK);
|
|
104
85
|
});
|
|
105
|
-
test("matching is case-insensitive and tolerates padding",
|
|
86
|
+
test("matching is case-insensitive and tolerates padding", () => {
|
|
106
87
|
expect(getApiErrorMessage({
|
|
107
88
|
message: " network error "
|
|
108
89
|
}, FALLBACK)).toBe(FALLBACK);
|
|
109
90
|
});
|
|
110
|
-
test("a 500 with an empty body falls back rather than leaking the status line",
|
|
111
|
-
|
|
91
|
+
test("a 500 with an empty body falls back rather than leaking the status line", () => {
|
|
92
|
+
const err = axiosLike(500, "Request failed with status code 500");
|
|
112
93
|
expect(getApiErrorMessage(err, FALLBACK)).toBe(FALLBACK);
|
|
113
94
|
});
|
|
114
95
|
});
|
|
@@ -118,14 +99,14 @@ describe("getApiErrorMessage — transport strings are suppressed (G-07)", funct
|
|
|
118
99
|
* false positive silently replaces a real business message with a generic one,
|
|
119
100
|
* which is more damaging than showing one ugly string.
|
|
120
101
|
*/
|
|
121
|
-
describe("getApiErrorMessage — deliberate messages still pass through",
|
|
102
|
+
describe("getApiErrorMessage — deliberate messages still pass through", () => {
|
|
122
103
|
test.each(["Ce titre ne peut pas être supprimé car il est en cours de validation.", "Le quota de dossiers est atteint.", "Session expirée. Reconnectez-vous.",
|
|
123
104
|
// Mentions a status but is human-written — must NOT be suppressed.
|
|
124
105
|
"Le service a répondu par une erreur (500). Réessayez.",
|
|
125
106
|
// Contains a transport phrase but is not one — anchored patterns only.
|
|
126
|
-
"Network Error détecté par la passerelle, contactez le support."])("passes %p through",
|
|
107
|
+
"Network Error détecté par la passerelle, contactez le support."])("passes %p through", message => {
|
|
127
108
|
expect(getApiErrorMessage({
|
|
128
|
-
message
|
|
109
|
+
message
|
|
129
110
|
}, "unused")).toBe(message);
|
|
130
111
|
});
|
|
131
112
|
|
|
@@ -139,38 +120,38 @@ describe("getApiErrorMessage — deliberate messages still pass through", functi
|
|
|
139
120
|
* business message is lost. That failure is silent in production — the user
|
|
140
121
|
* simply sees the wrong text — so it has to fail here instead.
|
|
141
122
|
*/
|
|
142
|
-
test.each(["erreur", "expiré", "échec", "envoi", "erreurs"])("does not mistake the French word %p for an errno code",
|
|
123
|
+
test.each(["erreur", "expiré", "échec", "envoi", "erreurs"])("does not mistake the French word %p for an errno code", message => {
|
|
143
124
|
expect(getApiErrorMessage({
|
|
144
|
-
message
|
|
125
|
+
message
|
|
145
126
|
}, "unused")).toBe(message);
|
|
146
127
|
});
|
|
147
|
-
test("a module-thrown Error keeps its message",
|
|
148
|
-
|
|
128
|
+
test("a module-thrown Error keeps its message", () => {
|
|
129
|
+
const err = new Error("Le montant FOB doit être positif.");
|
|
149
130
|
expect(getApiErrorMessage(err, "unused")).toBe("Le montant FOB doit être positif.");
|
|
150
131
|
});
|
|
151
132
|
});
|
|
152
|
-
describe("getApiErrorDetail — unfiltered, for logs",
|
|
153
|
-
test("returns the transport string that getApiErrorMessage hides",
|
|
154
|
-
|
|
133
|
+
describe("getApiErrorDetail — unfiltered, for logs", () => {
|
|
134
|
+
test("returns the transport string that getApiErrorMessage hides", () => {
|
|
135
|
+
const err = axiosLike(502, "Request failed with status code 502");
|
|
155
136
|
expect(getApiErrorMessage(err, "Indisponible.")).toBe("Indisponible.");
|
|
156
137
|
expect(getApiErrorDetail(err)).toBe("Request failed with status code 502");
|
|
157
138
|
});
|
|
158
|
-
test("returns undefined when there is nothing to log",
|
|
139
|
+
test("returns undefined when there is nothing to log", () => {
|
|
159
140
|
expect(getApiErrorDetail({})).toBeUndefined();
|
|
160
141
|
expect(getApiErrorDetail(null)).toBeUndefined();
|
|
161
142
|
});
|
|
162
143
|
});
|
|
163
|
-
describe("getApiErrorStatus",
|
|
164
|
-
test("returns the HTTP status when the server answered",
|
|
144
|
+
describe("getApiErrorStatus", () => {
|
|
145
|
+
test("returns the HTTP status when the server answered", () => {
|
|
165
146
|
expect(getApiErrorStatus(axiosLike(404, "Not Found"))).toBe(404);
|
|
166
147
|
});
|
|
167
|
-
test("returns undefined when there was no answer at all (R-4.3)",
|
|
148
|
+
test("returns undefined when there was no answer at all (R-4.3)", () => {
|
|
168
149
|
expect(getApiErrorStatus({
|
|
169
150
|
message: "Network Error"
|
|
170
151
|
})).toBeUndefined();
|
|
171
152
|
expect(getApiErrorStatus(null)).toBeUndefined();
|
|
172
153
|
});
|
|
173
|
-
test("ignores a non-numeric status",
|
|
154
|
+
test("ignores a non-numeric status", () => {
|
|
174
155
|
expect(getApiErrorStatus({
|
|
175
156
|
response: {
|
|
176
157
|
status: "500"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiError.test.js","names":["DEFAULT_API_ERROR_MESSAGE","getApiErrorDetail","getApiErrorMessage","getApiErrorStatus","axiosLike","status","message","dataMessage","response","_objectSpread","undefined","data","describe","test","expect","toBe","err","not","toThrow","FALLBACK","each","Error","toBeUndefined"],"sources":["../../../../src/lib/v2/__tests__/apiError.test.ts"],"sourcesContent":["import {\r\n DEFAULT_API_ERROR_MESSAGE,\r\n getApiErrorDetail,\r\n getApiErrorMessage,\r\n getApiErrorStatus,\r\n} from \"../utils/apiError\";\r\n\r\n/**\r\n * Contract tests for apiError — the platform's `unknown`-rejection narrower.\r\n *\r\n * Two contracts are load-bearing here, and both were regressions waiting to\r\n * happen:\r\n *\r\n * 1. G-04 — this helper exists so consuming sagas do not hand-roll\r\n * `(error as { response?: … })` to get around `useUnknownInCatchVariables`.\r\n * Two modules had already done exactly that before it was added.\r\n *\r\n * 2. G-07 — `error.message` must NOT reach a user when it is an axios\r\n * transport artefact. Before the fix, any server error without a\r\n * `response.data.message` rendered \"Request failed with status code 500\"\r\n * into a toast (Charter §09.3 forbids raw technical detail), and every\r\n * consumer's French fallback was effectively unreachable.\r\n *\r\n * The second contract is invisible to `tsc` and to the build: suppressing a\r\n * string is a behavioural property, so without these tests the fix would\r\n * silently rot the first time someone \"simplified\" the resolution chain back to\r\n * a plain `asNonEmptyString`.\r\n */\r\n\r\n/** Minimal axios-shaped rejection. Duck-typed on purpose — see the file header. */\r\nconst axiosLike = (status: number, message: string, dataMessage?: string) => ({\r\n message,\r\n response: {\r\n status,\r\n ...(dataMessage === undefined ? {} : { data: { message: dataMessage } }),\r\n },\r\n});\r\n\r\ndescribe(\"getApiErrorMessage — resolution order\", () => {\r\n test(\"a non-empty string rejection is returned as-is\", () => {\r\n expect(getApiErrorMessage(\"Trop de tentatives.\")).toBe(\r\n \"Trop de tentatives.\"\r\n );\r\n });\r\n\r\n test(\"the backend message wins over everything else\", () => {\r\n const err = axiosLike(\r\n 422,\r\n \"Request failed with status code 422\",\r\n \"Le numéro de titre est invalide.\"\r\n );\r\n expect(getApiErrorMessage(err, \"Échec.\")).toBe(\r\n \"Le numéro de titre est invalide.\"\r\n );\r\n });\r\n\r\n test(\"falls back when nothing usable is present\", () => {\r\n expect(getApiErrorMessage({}, \"Échec de l'envoi.\")).toBe(\r\n \"Échec de l'envoi.\"\r\n );\r\n });\r\n\r\n test(\"uses the platform default when no fallback is supplied\", () => {\r\n expect(getApiErrorMessage({})).toBe(DEFAULT_API_ERROR_MESSAGE);\r\n });\r\n\r\n test(\"never returns an empty string\", () => {\r\n expect(getApiErrorMessage(\"\")).toBe(DEFAULT_API_ERROR_MESSAGE);\r\n expect(getApiErrorMessage({ message: \"\" })).toBe(DEFAULT_API_ERROR_MESSAGE);\r\n });\r\n\r\n test(\"never throws on hostile input\", () => {\r\n expect(() => getApiErrorMessage(null)).not.toThrow();\r\n expect(() => getApiErrorMessage(undefined)).not.toThrow();\r\n expect(() => getApiErrorMessage(0)).not.toThrow();\r\n expect(() => getApiErrorMessage([])).not.toThrow();\r\n expect(() => getApiErrorMessage({ response: null })).not.toThrow();\r\n expect(() =>\r\n getApiErrorMessage({ response: { data: { message: 42 } } })\r\n ).not.toThrow();\r\n });\r\n});\r\n\r\n/**\r\n * G-07 — THE REGRESSION GUARD. If any of these fail, a transport string is\r\n * reaching end users again.\r\n */\r\ndescribe(\"getApiErrorMessage — transport strings are suppressed (G-07)\", () => {\r\n const FALLBACK = \"Le service est momentanément indisponible.\";\r\n\r\n test.each([\r\n \"Request failed with status code 500\",\r\n \"Request failed with status code 404\",\r\n \"Network Error\",\r\n \"timeout of 15000ms exceeded\",\r\n \"timeout exceeded\",\r\n \"Request aborted\",\r\n \"canceled\",\r\n \"socket hang up\",\r\n \"ECONNREFUSED\",\r\n \"ETIMEDOUT\",\r\n \"ECONNRESET\",\r\n \"ENOTFOUND\",\r\n \"EPIPE\",\r\n \"ERR_NETWORK\",\r\n \"ERR_CANCELED\",\r\n \"ERR_BAD_RESPONSE\",\r\n ])(\"suppresses %p in favour of the caller's copy\", (message) => {\r\n expect(getApiErrorMessage({ message }, FALLBACK)).toBe(FALLBACK);\r\n });\r\n\r\n test(\"matching is case-insensitive and tolerates padding\", () => {\r\n expect(\r\n getApiErrorMessage({ message: \" network error \" }, FALLBACK)\r\n ).toBe(FALLBACK);\r\n });\r\n\r\n test(\"a 500 with an empty body falls back rather than leaking the status line\", () => {\r\n const err = axiosLike(500, \"Request failed with status code 500\");\r\n expect(getApiErrorMessage(err, FALLBACK)).toBe(FALLBACK);\r\n });\r\n});\r\n\r\n/**\r\n * The other half of the same contract: the deny-list must stay CONSERVATIVE. A\r\n * false positive silently replaces a real business message with a generic one,\r\n * which is more damaging than showing one ugly string.\r\n */\r\ndescribe(\"getApiErrorMessage — deliberate messages still pass through\", () => {\r\n test.each([\r\n \"Ce titre ne peut pas être supprimé car il est en cours de validation.\",\r\n \"Le quota de dossiers est atteint.\",\r\n \"Session expirée. Reconnectez-vous.\",\r\n // Mentions a status but is human-written — must NOT be suppressed.\r\n \"Le service a répondu par une erreur (500). Réessayez.\",\r\n // Contains a transport phrase but is not one — anchored patterns only.\r\n \"Network Error détecté par la passerelle, contactez le support.\",\r\n ])(\"passes %p through\", (message) => {\r\n expect(getApiErrorMessage({ message }, \"unused\")).toBe(message);\r\n });\r\n\r\n /**\r\n * Guards the CASE-SENSITIVITY of the two errno patterns.\r\n *\r\n * They are the only patterns in the list without `/i`, precisely so that a\r\n * lowercase French word beginning with \"e\" is not mistaken for an errno\r\n * constant. If someone \"tidies\" them to `/^e[a-z]+$/i` for consistency with\r\n * their neighbours, every one of these becomes a generic fallback and a real\r\n * business message is lost. That failure is silent in production — the user\r\n * simply sees the wrong text — so it has to fail here instead.\r\n */\r\n test.each([\"erreur\", \"expiré\", \"échec\", \"envoi\", \"erreurs\"])(\r\n \"does not mistake the French word %p for an errno code\",\r\n (message) => {\r\n expect(getApiErrorMessage({ message }, \"unused\")).toBe(message);\r\n }\r\n );\r\n\r\n test(\"a module-thrown Error keeps its message\", () => {\r\n const err = new Error(\"Le montant FOB doit être positif.\");\r\n expect(getApiErrorMessage(err, \"unused\")).toBe(\r\n \"Le montant FOB doit être positif.\"\r\n );\r\n });\r\n});\r\n\r\ndescribe(\"getApiErrorDetail — unfiltered, for logs\", () => {\r\n test(\"returns the transport string that getApiErrorMessage hides\", () => {\r\n const err = axiosLike(502, \"Request failed with status code 502\");\r\n expect(getApiErrorMessage(err, \"Indisponible.\")).toBe(\"Indisponible.\");\r\n expect(getApiErrorDetail(err)).toBe(\"Request failed with status code 502\");\r\n });\r\n\r\n test(\"returns undefined when there is nothing to log\", () => {\r\n expect(getApiErrorDetail({})).toBeUndefined();\r\n expect(getApiErrorDetail(null)).toBeUndefined();\r\n });\r\n});\r\n\r\ndescribe(\"getApiErrorStatus\", () => {\r\n test(\"returns the HTTP status when the server answered\", () => {\r\n expect(getApiErrorStatus(axiosLike(404, \"Not Found\"))).toBe(404);\r\n });\r\n\r\n test(\"returns undefined when there was no answer at all (R-4.3)\", () => {\r\n expect(getApiErrorStatus({ message: \"Network Error\" })).toBeUndefined();\r\n expect(getApiErrorStatus(null)).toBeUndefined();\r\n });\r\n\r\n test(\"ignores a non-numeric status\", () => {\r\n expect(\r\n getApiErrorStatus({ response: { status: \"500\" } })\r\n ).toBeUndefined();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"apiError.test.js","names":["DEFAULT_API_ERROR_MESSAGE","getApiErrorDetail","getApiErrorMessage","getApiErrorStatus","axiosLike","status","message","dataMessage","response","undefined","data","describe","test","expect","toBe","err","not","toThrow","FALLBACK","each","Error","toBeUndefined"],"sources":["../../../../src/lib/v2/__tests__/apiError.test.ts"],"sourcesContent":["import {\r\n DEFAULT_API_ERROR_MESSAGE,\r\n getApiErrorDetail,\r\n getApiErrorMessage,\r\n getApiErrorStatus,\r\n} from \"../utils/apiError\";\r\n\r\n/**\r\n * Contract tests for apiError — the platform's `unknown`-rejection narrower.\r\n *\r\n * Two contracts are load-bearing here, and both were regressions waiting to\r\n * happen:\r\n *\r\n * 1. G-04 — this helper exists so consuming sagas do not hand-roll\r\n * `(error as { response?: … })` to get around `useUnknownInCatchVariables`.\r\n * Two modules had already done exactly that before it was added.\r\n *\r\n * 2. G-07 — `error.message` must NOT reach a user when it is an axios\r\n * transport artefact. Before the fix, any server error without a\r\n * `response.data.message` rendered \"Request failed with status code 500\"\r\n * into a toast (Charter §09.3 forbids raw technical detail), and every\r\n * consumer's French fallback was effectively unreachable.\r\n *\r\n * The second contract is invisible to `tsc` and to the build: suppressing a\r\n * string is a behavioural property, so without these tests the fix would\r\n * silently rot the first time someone \"simplified\" the resolution chain back to\r\n * a plain `asNonEmptyString`.\r\n */\r\n\r\n/** Minimal axios-shaped rejection. Duck-typed on purpose — see the file header. */\r\nconst axiosLike = (status: number, message: string, dataMessage?: string) => ({\r\n message,\r\n response: {\r\n status,\r\n ...(dataMessage === undefined ? {} : { data: { message: dataMessage } }),\r\n },\r\n});\r\n\r\ndescribe(\"getApiErrorMessage — resolution order\", () => {\r\n test(\"a non-empty string rejection is returned as-is\", () => {\r\n expect(getApiErrorMessage(\"Trop de tentatives.\")).toBe(\r\n \"Trop de tentatives.\"\r\n );\r\n });\r\n\r\n test(\"the backend message wins over everything else\", () => {\r\n const err = axiosLike(\r\n 422,\r\n \"Request failed with status code 422\",\r\n \"Le numéro de titre est invalide.\"\r\n );\r\n expect(getApiErrorMessage(err, \"Échec.\")).toBe(\r\n \"Le numéro de titre est invalide.\"\r\n );\r\n });\r\n\r\n test(\"falls back when nothing usable is present\", () => {\r\n expect(getApiErrorMessage({}, \"Échec de l'envoi.\")).toBe(\r\n \"Échec de l'envoi.\"\r\n );\r\n });\r\n\r\n test(\"uses the platform default when no fallback is supplied\", () => {\r\n expect(getApiErrorMessage({})).toBe(DEFAULT_API_ERROR_MESSAGE);\r\n });\r\n\r\n test(\"never returns an empty string\", () => {\r\n expect(getApiErrorMessage(\"\")).toBe(DEFAULT_API_ERROR_MESSAGE);\r\n expect(getApiErrorMessage({ message: \"\" })).toBe(DEFAULT_API_ERROR_MESSAGE);\r\n });\r\n\r\n test(\"never throws on hostile input\", () => {\r\n expect(() => getApiErrorMessage(null)).not.toThrow();\r\n expect(() => getApiErrorMessage(undefined)).not.toThrow();\r\n expect(() => getApiErrorMessage(0)).not.toThrow();\r\n expect(() => getApiErrorMessage([])).not.toThrow();\r\n expect(() => getApiErrorMessage({ response: null })).not.toThrow();\r\n expect(() =>\r\n getApiErrorMessage({ response: { data: { message: 42 } } })\r\n ).not.toThrow();\r\n });\r\n});\r\n\r\n/**\r\n * G-07 — THE REGRESSION GUARD. If any of these fail, a transport string is\r\n * reaching end users again.\r\n */\r\ndescribe(\"getApiErrorMessage — transport strings are suppressed (G-07)\", () => {\r\n const FALLBACK = \"Le service est momentanément indisponible.\";\r\n\r\n test.each([\r\n \"Request failed with status code 500\",\r\n \"Request failed with status code 404\",\r\n \"Network Error\",\r\n \"timeout of 15000ms exceeded\",\r\n \"timeout exceeded\",\r\n \"Request aborted\",\r\n \"canceled\",\r\n \"socket hang up\",\r\n \"ECONNREFUSED\",\r\n \"ETIMEDOUT\",\r\n \"ECONNRESET\",\r\n \"ENOTFOUND\",\r\n \"EPIPE\",\r\n \"ERR_NETWORK\",\r\n \"ERR_CANCELED\",\r\n \"ERR_BAD_RESPONSE\",\r\n ])(\"suppresses %p in favour of the caller's copy\", (message) => {\r\n expect(getApiErrorMessage({ message }, FALLBACK)).toBe(FALLBACK);\r\n });\r\n\r\n test(\"matching is case-insensitive and tolerates padding\", () => {\r\n expect(\r\n getApiErrorMessage({ message: \" network error \" }, FALLBACK)\r\n ).toBe(FALLBACK);\r\n });\r\n\r\n test(\"a 500 with an empty body falls back rather than leaking the status line\", () => {\r\n const err = axiosLike(500, \"Request failed with status code 500\");\r\n expect(getApiErrorMessage(err, FALLBACK)).toBe(FALLBACK);\r\n });\r\n});\r\n\r\n/**\r\n * The other half of the same contract: the deny-list must stay CONSERVATIVE. A\r\n * false positive silently replaces a real business message with a generic one,\r\n * which is more damaging than showing one ugly string.\r\n */\r\ndescribe(\"getApiErrorMessage — deliberate messages still pass through\", () => {\r\n test.each([\r\n \"Ce titre ne peut pas être supprimé car il est en cours de validation.\",\r\n \"Le quota de dossiers est atteint.\",\r\n \"Session expirée. Reconnectez-vous.\",\r\n // Mentions a status but is human-written — must NOT be suppressed.\r\n \"Le service a répondu par une erreur (500). Réessayez.\",\r\n // Contains a transport phrase but is not one — anchored patterns only.\r\n \"Network Error détecté par la passerelle, contactez le support.\",\r\n ])(\"passes %p through\", (message) => {\r\n expect(getApiErrorMessage({ message }, \"unused\")).toBe(message);\r\n });\r\n\r\n /**\r\n * Guards the CASE-SENSITIVITY of the two errno patterns.\r\n *\r\n * They are the only patterns in the list without `/i`, precisely so that a\r\n * lowercase French word beginning with \"e\" is not mistaken for an errno\r\n * constant. If someone \"tidies\" them to `/^e[a-z]+$/i` for consistency with\r\n * their neighbours, every one of these becomes a generic fallback and a real\r\n * business message is lost. That failure is silent in production — the user\r\n * simply sees the wrong text — so it has to fail here instead.\r\n */\r\n test.each([\"erreur\", \"expiré\", \"échec\", \"envoi\", \"erreurs\"])(\r\n \"does not mistake the French word %p for an errno code\",\r\n (message) => {\r\n expect(getApiErrorMessage({ message }, \"unused\")).toBe(message);\r\n }\r\n );\r\n\r\n test(\"a module-thrown Error keeps its message\", () => {\r\n const err = new Error(\"Le montant FOB doit être positif.\");\r\n expect(getApiErrorMessage(err, \"unused\")).toBe(\r\n \"Le montant FOB doit être positif.\"\r\n );\r\n });\r\n});\r\n\r\ndescribe(\"getApiErrorDetail — unfiltered, for logs\", () => {\r\n test(\"returns the transport string that getApiErrorMessage hides\", () => {\r\n const err = axiosLike(502, \"Request failed with status code 502\");\r\n expect(getApiErrorMessage(err, \"Indisponible.\")).toBe(\"Indisponible.\");\r\n expect(getApiErrorDetail(err)).toBe(\"Request failed with status code 502\");\r\n });\r\n\r\n test(\"returns undefined when there is nothing to log\", () => {\r\n expect(getApiErrorDetail({})).toBeUndefined();\r\n expect(getApiErrorDetail(null)).toBeUndefined();\r\n });\r\n});\r\n\r\ndescribe(\"getApiErrorStatus\", () => {\r\n test(\"returns the HTTP status when the server answered\", () => {\r\n expect(getApiErrorStatus(axiosLike(404, \"Not Found\"))).toBe(404);\r\n });\r\n\r\n test(\"returns undefined when there was no answer at all (R-4.3)\", () => {\r\n expect(getApiErrorStatus({ message: \"Network Error\" })).toBeUndefined();\r\n expect(getApiErrorStatus(null)).toBeUndefined();\r\n });\r\n\r\n test(\"ignores a non-numeric status\", () => {\r\n expect(\r\n getApiErrorStatus({ response: { status: \"500\" } })\r\n ).toBeUndefined();\r\n });\r\n});\r\n"],"mappings":"AAAA,SACEA,yBAAyB,EACzBC,iBAAiB,EACjBC,kBAAkB,EAClBC,iBAAiB,QACZ,mBAAmB;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAMC,SAAS,GAAGA,CAACC,MAAc,EAAEC,OAAe,EAAEC,WAAoB,MAAM;EAC5ED,OAAO;EACPE,QAAQ,EAAE;IACRH,MAAM;IACN,IAAIE,WAAW,KAAKE,SAAS,GAAG,CAAC,CAAC,GAAG;MAAEC,IAAI,EAAE;QAAEJ,OAAO,EAAEC;MAAY;IAAE,CAAC;EACzE;AACF,CAAC,CAAC;AAEFI,QAAQ,CAAC,uCAAuC,EAAE,MAAM;EACtDC,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3DC,MAAM,CAACX,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,CAACY,IAAI,CACpD,qBACF,CAAC;EACH,CAAC,CAAC;EAEFF,IAAI,CAAC,+CAA+C,EAAE,MAAM;IAC1D,MAAMG,GAAG,GAAGX,SAAS,CACnB,GAAG,EACH,qCAAqC,EACrC,kCACF,CAAC;IACDS,MAAM,CAACX,kBAAkB,CAACa,GAAG,EAAE,QAAQ,CAAC,CAAC,CAACD,IAAI,CAC5C,kCACF,CAAC;EACH,CAAC,CAAC;EAEFF,IAAI,CAAC,2CAA2C,EAAE,MAAM;IACtDC,MAAM,CAACX,kBAAkB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAACY,IAAI,CACtD,mBACF,CAAC;EACH,CAAC,CAAC;EAEFF,IAAI,CAAC,wDAAwD,EAAE,MAAM;IACnEC,MAAM,CAACX,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAACY,IAAI,CAACd,yBAAyB,CAAC;EAChE,CAAC,CAAC;EAEFY,IAAI,CAAC,+BAA+B,EAAE,MAAM;IAC1CC,MAAM,CAACX,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAACY,IAAI,CAACd,yBAAyB,CAAC;IAC9Da,MAAM,CAACX,kBAAkB,CAAC;MAAEI,OAAO,EAAE;IAAG,CAAC,CAAC,CAAC,CAACQ,IAAI,CAACd,yBAAyB,CAAC;EAC7E,CAAC,CAAC;EAEFY,IAAI,CAAC,+BAA+B,EAAE,MAAM;IAC1CC,MAAM,CAAC,MAAMX,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAACc,GAAG,CAACC,OAAO,CAAC,CAAC;IACpDJ,MAAM,CAAC,MAAMX,kBAAkB,CAACO,SAAS,CAAC,CAAC,CAACO,GAAG,CAACC,OAAO,CAAC,CAAC;IACzDJ,MAAM,CAAC,MAAMX,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAACc,GAAG,CAACC,OAAO,CAAC,CAAC;IACjDJ,MAAM,CAAC,MAAMX,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAACc,GAAG,CAACC,OAAO,CAAC,CAAC;IAClDJ,MAAM,CAAC,MAAMX,kBAAkB,CAAC;MAAEM,QAAQ,EAAE;IAAK,CAAC,CAAC,CAAC,CAACQ,GAAG,CAACC,OAAO,CAAC,CAAC;IAClEJ,MAAM,CAAC,MACLX,kBAAkB,CAAC;MAAEM,QAAQ,EAAE;QAAEE,IAAI,EAAE;UAAEJ,OAAO,EAAE;QAAG;MAAE;IAAE,CAAC,CAC5D,CAAC,CAACU,GAAG,CAACC,OAAO,CAAC,CAAC;EACjB,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACAN,QAAQ,CAAC,8DAA8D,EAAE,MAAM;EAC7E,MAAMO,QAAQ,GAAG,4CAA4C;EAE7DN,IAAI,CAACO,IAAI,CAAC,CACR,qCAAqC,EACrC,qCAAqC,EACrC,eAAe,EACf,6BAA6B,EAC7B,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,WAAW,EACX,OAAO,EACP,aAAa,EACb,cAAc,EACd,kBAAkB,CACnB,CAAC,CAAC,8CAA8C,EAAGb,OAAO,IAAK;IAC9DO,MAAM,CAACX,kBAAkB,CAAC;MAAEI;IAAQ,CAAC,EAAEY,QAAQ,CAAC,CAAC,CAACJ,IAAI,CAACI,QAAQ,CAAC;EAClE,CAAC,CAAC;EAEFN,IAAI,CAAC,oDAAoD,EAAE,MAAM;IAC/DC,MAAM,CACJX,kBAAkB,CAAC;MAAEI,OAAO,EAAE;IAAoB,CAAC,EAAEY,QAAQ,CAC/D,CAAC,CAACJ,IAAI,CAACI,QAAQ,CAAC;EAClB,CAAC,CAAC;EAEFN,IAAI,CAAC,yEAAyE,EAAE,MAAM;IACpF,MAAMG,GAAG,GAAGX,SAAS,CAAC,GAAG,EAAE,qCAAqC,CAAC;IACjES,MAAM,CAACX,kBAAkB,CAACa,GAAG,EAAEG,QAAQ,CAAC,CAAC,CAACJ,IAAI,CAACI,QAAQ,CAAC;EAC1D,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACAP,QAAQ,CAAC,6DAA6D,EAAE,MAAM;EAC5EC,IAAI,CAACO,IAAI,CAAC,CACR,uEAAuE,EACvE,mCAAmC,EACnC,oCAAoC;EACpC;EACA,uDAAuD;EACvD;EACA,gEAAgE,CACjE,CAAC,CAAC,mBAAmB,EAAGb,OAAO,IAAK;IACnCO,MAAM,CAACX,kBAAkB,CAAC;MAAEI;IAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAACQ,IAAI,CAACR,OAAO,CAAC;EACjE,CAAC,CAAC;;EAEF;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEM,IAAI,CAACO,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAC1D,uDAAuD,EACtDb,OAAO,IAAK;IACXO,MAAM,CAACX,kBAAkB,CAAC;MAAEI;IAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAACQ,IAAI,CAACR,OAAO,CAAC;EACjE,CACF,CAAC;EAEDM,IAAI,CAAC,yCAAyC,EAAE,MAAM;IACpD,MAAMG,GAAG,GAAG,IAAIK,KAAK,CAAC,mCAAmC,CAAC;IAC1DP,MAAM,CAACX,kBAAkB,CAACa,GAAG,EAAE,QAAQ,CAAC,CAAC,CAACD,IAAI,CAC5C,mCACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFH,QAAQ,CAAC,0CAA0C,EAAE,MAAM;EACzDC,IAAI,CAAC,4DAA4D,EAAE,MAAM;IACvE,MAAMG,GAAG,GAAGX,SAAS,CAAC,GAAG,EAAE,qCAAqC,CAAC;IACjES,MAAM,CAACX,kBAAkB,CAACa,GAAG,EAAE,eAAe,CAAC,CAAC,CAACD,IAAI,CAAC,eAAe,CAAC;IACtED,MAAM,CAACZ,iBAAiB,CAACc,GAAG,CAAC,CAAC,CAACD,IAAI,CAAC,qCAAqC,CAAC;EAC5E,CAAC,CAAC;EAEFF,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3DC,MAAM,CAACZ,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAACoB,aAAa,CAAC,CAAC;IAC7CR,MAAM,CAACZ,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAACoB,aAAa,CAAC,CAAC;EACjD,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFV,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAClCC,IAAI,CAAC,kDAAkD,EAAE,MAAM;IAC7DC,MAAM,CAACV,iBAAiB,CAACC,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAACU,IAAI,CAAC,GAAG,CAAC;EAClE,CAAC,CAAC;EAEFF,IAAI,CAAC,2DAA2D,EAAE,MAAM;IACtEC,MAAM,CAACV,iBAAiB,CAAC;MAAEG,OAAO,EAAE;IAAgB,CAAC,CAAC,CAAC,CAACe,aAAa,CAAC,CAAC;IACvER,MAAM,CAACV,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAACkB,aAAa,CAAC,CAAC;EACjD,CAAC,CAAC;EAEFT,IAAI,CAAC,8BAA8B,EAAE,MAAM;IACzCC,MAAM,CACJV,iBAAiB,CAAC;MAAEK,QAAQ,EAAE;QAAEH,MAAM,EAAE;MAAM;IAAE,CAAC,CACnD,CAAC,CAACgB,aAAa,CAAC,CAAC;EACnB,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
2
|
-
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
|
|
3
|
-
var _marked = /*#__PURE__*/_regeneratorRuntime().mark(walk);
|
|
4
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
5
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
7
|
-
/* eslint-env node */
|
|
8
1
|
import * as fs from "fs";
|
|
9
2
|
import * as path from "path";
|
|
10
3
|
|
|
@@ -17,7 +10,7 @@ import * as path from "path";
|
|
|
17
10
|
* not just what it forbids.
|
|
18
11
|
*/
|
|
19
12
|
|
|
20
|
-
|
|
13
|
+
const V2_ROOT = path.resolve(__dirname, "..");
|
|
21
14
|
/**
|
|
22
15
|
* Recursively walk a directory, yielding paths of source files that
|
|
23
16
|
* are eligible for scanning. Excludes nested __tests__ folders so
|
|
@@ -25,95 +18,35 @@ var V2_ROOT = path.resolve(__dirname, "..");
|
|
|
25
18
|
* the rule. Scans .js/.jsx/.ts/.tsx/.css (ambient .d.ts excluded — no
|
|
26
19
|
* runtime style/breakpoint literals live there).
|
|
27
20
|
*/
|
|
28
|
-
function walk(dir) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
_iterator.s();
|
|
39
|
-
case 3:
|
|
40
|
-
if ((_step = _iterator.n()).done) {
|
|
41
|
-
_context.next = 17;
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
entry = _step.value;
|
|
45
|
-
p = path.join(dir, entry.name);
|
|
46
|
-
if (!entry.isDirectory()) {
|
|
47
|
-
_context.next = 12;
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
if (!(entry.name === "__tests__" || entry.name === "node_modules")) {
|
|
51
|
-
_context.next = 9;
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
return _context.abrupt("continue", 15);
|
|
55
|
-
case 9:
|
|
56
|
-
return _context.delegateYield(walk(p), "t0", 10);
|
|
57
|
-
case 10:
|
|
58
|
-
_context.next = 15;
|
|
59
|
-
break;
|
|
60
|
-
case 12:
|
|
61
|
-
if (!(entry.isFile() && /\.(?:jsx?|tsx?|css)$/.test(entry.name) && !entry.name.endsWith(".d.ts"))) {
|
|
62
|
-
_context.next = 15;
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
_context.next = 15;
|
|
66
|
-
return p;
|
|
67
|
-
case 15:
|
|
68
|
-
_context.next = 3;
|
|
69
|
-
break;
|
|
70
|
-
case 17:
|
|
71
|
-
_context.next = 22;
|
|
72
|
-
break;
|
|
73
|
-
case 19:
|
|
74
|
-
_context.prev = 19;
|
|
75
|
-
_context.t1 = _context["catch"](1);
|
|
76
|
-
_iterator.e(_context.t1);
|
|
77
|
-
case 22:
|
|
78
|
-
_context.prev = 22;
|
|
79
|
-
_iterator.f();
|
|
80
|
-
return _context.finish(22);
|
|
81
|
-
case 25:
|
|
82
|
-
case "end":
|
|
83
|
-
return _context.stop();
|
|
84
|
-
}
|
|
21
|
+
function* walk(dir) {
|
|
22
|
+
for (const entry of fs.readdirSync(dir, {
|
|
23
|
+
withFileTypes: true
|
|
24
|
+
})) {
|
|
25
|
+
const p = path.join(dir, entry.name);
|
|
26
|
+
if (entry.isDirectory()) {
|
|
27
|
+
if (entry.name === "__tests__" || entry.name === "node_modules") continue;
|
|
28
|
+
yield* walk(p);
|
|
29
|
+
} else if (entry.isFile() && /\.(?:jsx?|tsx?|css)$/.test(entry.name) && !entry.name.endsWith(".d.ts")) {
|
|
30
|
+
yield p;
|
|
85
31
|
}
|
|
86
|
-
}
|
|
32
|
+
}
|
|
87
33
|
}
|
|
88
34
|
function readAllSourceFiles() {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
files.push({
|
|
96
|
-
path: file,
|
|
97
|
-
content: fs.readFileSync(file, "utf8")
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
} catch (err) {
|
|
101
|
-
_iterator2.e(err);
|
|
102
|
-
} finally {
|
|
103
|
-
_iterator2.f();
|
|
35
|
+
const files = [];
|
|
36
|
+
for (const file of walk(V2_ROOT)) {
|
|
37
|
+
files.push({
|
|
38
|
+
path: file,
|
|
39
|
+
content: fs.readFileSync(file, "utf8")
|
|
40
|
+
});
|
|
104
41
|
}
|
|
105
42
|
return files;
|
|
106
43
|
}
|
|
107
44
|
function findOffenders(files, predicate) {
|
|
108
|
-
return files.filter(
|
|
109
|
-
return predicate(f.content);
|
|
110
|
-
}).map(function (f) {
|
|
111
|
-
return path.relative(V2_ROOT, f.path);
|
|
112
|
-
});
|
|
45
|
+
return files.filter(f => predicate(f.content)).map(f => path.relative(V2_ROOT, f.path));
|
|
113
46
|
}
|
|
114
|
-
describe("Banned patterns in src/lib/v2/ (regression guard)",
|
|
115
|
-
|
|
116
|
-
beforeAll(
|
|
47
|
+
describe("Banned patterns in src/lib/v2/ (regression guard)", () => {
|
|
48
|
+
let files;
|
|
49
|
+
beforeAll(() => {
|
|
117
50
|
files = readAllSourceFiles();
|
|
118
51
|
// Sanity check — make sure the walker actually found source.
|
|
119
52
|
// A misconfigured path would silently make every test pass with
|
|
@@ -153,16 +86,12 @@ describe("Banned patterns in src/lib/v2/ (regression guard)", function () {
|
|
|
153
86
|
* `__tests__` is excluded from `walk`, which is why this docstring may name
|
|
154
87
|
* the token freely.
|
|
155
88
|
*/
|
|
156
|
-
test("no `--fw-black` references anywhere in src/lib/v2/",
|
|
157
|
-
|
|
158
|
-
return c.includes("--fw-black");
|
|
159
|
-
});
|
|
89
|
+
test("no `--fw-black` references anywhere in src/lib/v2/", () => {
|
|
90
|
+
const offenders = findOffenders(files, c => c.includes("--fw-black"));
|
|
160
91
|
expect(offenders).toEqual([]);
|
|
161
92
|
});
|
|
162
|
-
test("no `var(--fw-black)` consumption (paranoid duplicate of the above)",
|
|
163
|
-
|
|
164
|
-
return c.includes("var(--fw-black)");
|
|
165
|
-
});
|
|
93
|
+
test("no `var(--fw-black)` consumption (paranoid duplicate of the above)", () => {
|
|
94
|
+
const offenders = findOffenders(files, c => c.includes("var(--fw-black)"));
|
|
166
95
|
expect(offenders).toEqual([]);
|
|
167
96
|
});
|
|
168
97
|
|
|
@@ -174,13 +103,11 @@ describe("Banned patterns in src/lib/v2/ (regression guard)", function () {
|
|
|
174
103
|
* FilterTab). Each time it took a careful read to spot, since
|
|
175
104
|
* 650 looks "close enough" to semibold (600).
|
|
176
105
|
*/
|
|
177
|
-
test("no `fontWeight: 650` literal in component sx / inline style",
|
|
106
|
+
test("no `fontWeight: 650` literal in component sx / inline style", () => {
|
|
178
107
|
// Match `fontWeight: 650` and `fontWeight:650` (with or without space).
|
|
179
108
|
// Word boundary on the right so we don't false-match 6500.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
return re.test(c);
|
|
183
|
-
});
|
|
109
|
+
const re = /fontWeight\s*:\s*650\b/;
|
|
110
|
+
const offenders = findOffenders(files, c => re.test(c));
|
|
184
111
|
expect(offenders).toEqual([]);
|
|
185
112
|
});
|
|
186
113
|
|
|
@@ -189,11 +116,9 @@ describe("Banned patterns in src/lib/v2/ (regression guard)", function () {
|
|
|
189
116
|
* Same rationale as above but for the kebab-case form used inside
|
|
190
117
|
* .css files (base.css and friends).
|
|
191
118
|
*/
|
|
192
|
-
test("no `font-weight: 650` in CSS files",
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
return re.test(c);
|
|
196
|
-
});
|
|
119
|
+
test("no `font-weight: 650` in CSS files", () => {
|
|
120
|
+
const re = /font-weight\s*:\s*650\b/;
|
|
121
|
+
const offenders = findOffenders(files, c => re.test(c));
|
|
197
122
|
expect(offenders).toEqual([]);
|
|
198
123
|
});
|
|
199
124
|
|
|
@@ -212,11 +137,9 @@ describe("Banned patterns in src/lib/v2/ (regression guard)", function () {
|
|
|
212
137
|
* they never match. Feature queries (prefers-reduced-motion,
|
|
213
138
|
* pointer, print) carry no width literal and are unaffected.
|
|
214
139
|
*/
|
|
215
|
-
test("no hardcoded px-width @media query (use mq.up/down or theme.breakpoints)",
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return re.test(c);
|
|
219
|
-
});
|
|
140
|
+
test("no hardcoded px-width @media query (use mq.up/down or theme.breakpoints)", () => {
|
|
141
|
+
const re = /@media[^{]*\b(?:min|max)-width\s*:\s*\d/;
|
|
142
|
+
const offenders = findOffenders(files, c => re.test(c));
|
|
220
143
|
expect(offenders).toEqual([]);
|
|
221
144
|
});
|
|
222
145
|
|
|
@@ -229,11 +152,9 @@ describe("Banned patterns in src/lib/v2/ (regression guard)", function () {
|
|
|
229
152
|
* only the string-literal form: the theme-callback form has no quote
|
|
230
153
|
* immediately after the opening paren and is unaffected.
|
|
231
154
|
*/
|
|
232
|
-
test("no useMediaQuery() with a literal px breakpoint string",
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
return re.test(c);
|
|
236
|
-
});
|
|
155
|
+
test("no useMediaQuery() with a literal px breakpoint string", () => {
|
|
156
|
+
const re = /useMediaQuery\(\s*["'`][^)]*\d+\s*px/;
|
|
157
|
+
const offenders = findOffenders(files, c => re.test(c));
|
|
237
158
|
expect(offenders).toEqual([]);
|
|
238
159
|
});
|
|
239
160
|
|
|
@@ -259,11 +180,9 @@ describe("Banned patterns in src/lib/v2/ (regression guard)", function () {
|
|
|
259
180
|
* display:grid site in the v2 surface (KVGrid, components/FormGrid,
|
|
260
181
|
* patterns/FormGrid, FormGrid.Item, KeyboardShortcutsHelp).
|
|
261
182
|
*/
|
|
262
|
-
test("no hardcoded px floor in a CSS-grid minmax() track (clamp with min(…,100%))",
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
return re.test(c);
|
|
266
|
-
});
|
|
183
|
+
test("no hardcoded px floor in a CSS-grid minmax() track (clamp with min(…,100%))", () => {
|
|
184
|
+
const re = /minmax\(\s*\d+(?:\.\d+)?\s*px/i;
|
|
185
|
+
const offenders = findOffenders(files, c => re.test(c));
|
|
267
186
|
expect(offenders).toEqual([]);
|
|
268
187
|
});
|
|
269
188
|
});
|