@cube-dev/ui-kit 0.0.0-canary-448aeb3 → 0.0.0-canary-b861864
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.d.ts +1 -0
- package/dist/components/actions/Button/Button.js +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemActionsWrapper.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/actions-run.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.js +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.d.ts +14 -14
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +1 -1
- package/dist/components/content/Tree/TreeNode.js +1 -1
- package/dist/components/content/Tree/styled.js +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/data/DataTable/DataTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
- package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
- package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
- package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +1 -1
- package/dist/components/data/TableBase/column-menu.js +1 -1
- package/dist/components/data/TableBase/column-tint.js +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.d.ts +2 -1
- package/dist/components/data/TableBase/styled.js +1 -1
- package/dist/components/data/TableBase/table-tree.js +1 -1
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/use-cell-selection.d.ts +1 -0
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-order.js +1 -1
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
- package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
- package/dist/components/fields/DatePicker/YearPicker.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/period.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
- package/dist/components/fields/ListBoxPopover/index.d.ts +1 -0
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +2 -0
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/TriggerActions.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +1 -1
- package/dist/components/fields/color/channels.js +1 -1
- package/dist/components/fields/color/color.js +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ModernFormRoot.d.ts +3 -1
- package/dist/components/form/Form/ModernFormRoot.js +2 -3
- package/dist/components/form/Form/ModernFormRoot.js.map +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.d.ts +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js.map +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/backend.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/modern/actions.js +11 -7
- package/dist/components/form/Form/modern/actions.js.map +1 -1
- package/dist/components/form/Form/modern/context.d.ts +1 -0
- package/dist/components/form/Form/modern/context.js +1 -1
- package/dist/components/form/Form/modern/controller.js +1 -1
- package/dist/components/form/Form/modern/field-binding.js +1 -1
- package/dist/components/form/Form/modern/field.js +9 -3
- package/dist/components/form/Form/modern/field.js.map +1 -1
- package/dist/components/form/Form/modern/react.js +6 -4
- package/dist/components/form/Form/modern/react.js.map +1 -1
- package/dist/components/form/Form/modern/store.js +28 -13
- package/dist/components/form/Form/modern/store.js.map +1 -1
- package/dist/components/form/Form/modern/types.d.ts +11 -1
- package/dist/components/form/Form/modern/validation.js +4 -4
- package/dist/components/form/Form/modern/validation.js.map +1 -1
- package/dist/components/form/Form/modern/values.js +12 -2
- package/dist/components/form/Form/modern/values.js.map +1 -1
- package/dist/components/form/Form/use-field/use-field-binding.js +4 -4
- package/dist/components/form/Form/use-field/use-field-binding.js.map +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +2 -2
- package/dist/components/form/Form/use-field/use-field-props.js.map +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/validation/ValidationIndicator.js +1 -1
- package/dist/components/form/validation/resolve-validation-props.js +1 -1
- package/dist/components/form/validation/use-validation-props.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Board/Board.js +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/BoardResponsive.js +1 -1
- package/dist/components/layout/Board/Widget.js +1 -1
- package/dist/components/layout/Board/WidgetHost.js +1 -1
- package/dist/components/layout/Board/board-context.js +1 -1
- package/dist/components/layout/Board/board-store.js +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/placement.js +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +1 -1
- package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
- package/dist/components/layout/Board/use-board-selection.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.d.ts +2 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.d.ts +1 -0
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Modal/types.d.ts +1 -0
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.d.ts +2 -0
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.d.ts +2 -0
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/index.d.ts +1 -0
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/eslint-plugin/defaults.generated.js +1 -1
- package/dist/eslint-plugin/index.js +1 -1
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
- package/dist/i18n/I18nProvider.js +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/instance.js +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +1 -1
- package/dist/i18n/locales/en-US/uikit.js +1 -1
- package/dist/i18n/locales/es-ES/uikit.js +1 -1
- package/dist/i18n/locales/es-MX/uikit.js +1 -1
- package/dist/i18n/locales/fr-FR/uikit.js +1 -1
- package/dist/i18n/locales/it-IT/uikit.js +1 -1
- package/dist/i18n/locales/ja-JP/uikit.js +1 -1
- package/dist/i18n/locales/nb-NO/uikit.js +1 -1
- package/dist/i18n/locales/pt-BR/uikit.js +1 -1
- package/dist/i18n/locales/pt-PT/uikit.js +1 -1
- package/dist/i18n/locales/sv-SE/uikit.js +1 -1
- package/dist/i18n/locales/vi-VN/uikit.js +1 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/ArrowNarrowDownIcon.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PipetteIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.js +1 -1
- package/dist/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/shared/form.d.ts +4 -2
- package/dist/tokens/all-tokens.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/color-seed.js +1 -1
- package/dist/tokens/color-theme.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/legacy-color.js +1 -1
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette.js +1 -1
- package/dist/tokens/resolve.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/colors.js +1 -1
- package/dist/utils/dotize.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/disabledProps.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useBufferedValue.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useScheme.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +2 -2
- package/docs/CreateComponent.md +1 -1
- package/docs/FieldProperties.md +2 -2
- package/docs/Usage.md +1 -1
- package/docs/components/form/Form.md +4 -4
- package/docs/modern-form-migration.md +15 -5
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-b861864 | Cube Dev Team */
|
|
2
2
|
import { FORM_BACKEND } from "../backend.js";
|
|
3
|
-
import { rulesSignature, runRules } from "./validation.js";
|
|
4
3
|
import { createValueSnapshotter, defineValue, formValueEqual, freezeContainer, getFieldKey, hasPath, isPlainObject, normalizePath, pathValueChanged, readPath, readonlySet, sameMembers, writePath } from "./values.js";
|
|
4
|
+
import { rulesSignature, runRules } from "./validation.js";
|
|
5
5
|
|
|
6
6
|
//#region src/components/form/Form/modern/store.ts
|
|
7
7
|
const EMPTY_ERRORS = Object.freeze([]);
|
|
@@ -13,6 +13,9 @@ function related(a, b) {
|
|
|
13
13
|
function sameDependencies(a = [], b = []) {
|
|
14
14
|
return a.length === b.length && a.every((value, index) => Object.is(value, b[index]));
|
|
15
15
|
}
|
|
16
|
+
function samePaths(a = [], b = []) {
|
|
17
|
+
return a.length === b.length && a.every((path, index) => sameDependencies(path, b[index]));
|
|
18
|
+
}
|
|
16
19
|
/** Only traverse path ancestors; a field's value (even cyclic data) is a leaf. */
|
|
17
20
|
function projectActive(value, path, previous) {
|
|
18
21
|
if (path.terminal) return value;
|
|
@@ -57,6 +60,7 @@ function createFormStore(inputOptions = {}) {
|
|
|
57
60
|
isInvalid: false,
|
|
58
61
|
isValidating: false,
|
|
59
62
|
isSubmitting: false,
|
|
63
|
+
canReset: false,
|
|
60
64
|
submitError: void 0,
|
|
61
65
|
revision: 0
|
|
62
66
|
});
|
|
@@ -106,6 +110,8 @@ function createFormStore(inputOptions = {}) {
|
|
|
106
110
|
function invalidate(record, keepErrors = false) {
|
|
107
111
|
const controller = record.validation;
|
|
108
112
|
record.validation = void 0;
|
|
113
|
+
record.reads = void 0;
|
|
114
|
+
record.readsAll = false;
|
|
109
115
|
record.validationRevision++;
|
|
110
116
|
record.status = "unvalidated";
|
|
111
117
|
if (!keepErrors) record.errors = EMPTY_ERRORS;
|
|
@@ -118,16 +124,20 @@ function createFormStore(inputOptions = {}) {
|
|
|
118
124
|
}
|
|
119
125
|
}
|
|
120
126
|
function dependencyChanged(record, previous) {
|
|
127
|
+
return record.owner?.options.dependsOn?.some((path) => pathValueChanged(previous, values, path)) ?? false;
|
|
128
|
+
}
|
|
129
|
+
function validationReadChanged(record, previous) {
|
|
130
|
+
if (!record.validation) return false;
|
|
121
131
|
if (record.readsAll && previous !== values) return true;
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
return [...(declared ?? []).map(normalizePath), ...record.reads?.values() ?? []].some((path) => pathValueChanged(previous, values, path));
|
|
132
|
+
for (const path of record.reads?.values() ?? []) if (pathValueChanged(previous, values, path)) return true;
|
|
133
|
+
return false;
|
|
125
134
|
}
|
|
126
135
|
function invalidateRelated(path, previous, config) {
|
|
127
136
|
for (const record of records.values()) {
|
|
128
137
|
const dependency = dependencyChanged(record, previous);
|
|
129
|
-
|
|
130
|
-
|
|
138
|
+
const fieldChanged = related(path, record.path) || pathValueChanged(previous, values, record.path);
|
|
139
|
+
if (fieldChanged || dependency || validationReadChanged(record, previous)) {
|
|
140
|
+
const revalidate = (fieldChanged || dependency) && !!config && !!record.registrations.size && (config.validate === "always" || config.validate !== "never" && (record.owner?.options.validateTrigger === "onChange" || !!record.errors.length || dependency && record.status !== "unvalidated"));
|
|
131
141
|
invalidate(record, revalidate);
|
|
132
142
|
if (revalidate) validateRecord(record, false);
|
|
133
143
|
}
|
|
@@ -164,6 +174,7 @@ function createFormStore(inputOptions = {}) {
|
|
|
164
174
|
let validCount = 0;
|
|
165
175
|
let invalid = false;
|
|
166
176
|
let validating = false;
|
|
177
|
+
let resettable = submitError != null;
|
|
167
178
|
for (const record of records.values()) {
|
|
168
179
|
const field = {
|
|
169
180
|
name: record.name,
|
|
@@ -184,6 +195,7 @@ function createFormStore(inputOptions = {}) {
|
|
|
184
195
|
});
|
|
185
196
|
if (field.dirty) dirtyNames.add(record.name);
|
|
186
197
|
if (field.touched) touchedNames.add(record.name);
|
|
198
|
+
resettable ||= field.dirty || field.touched || !!field.errors.length || field.status !== "unvalidated";
|
|
187
199
|
if (field.active) {
|
|
188
200
|
activeCount++;
|
|
189
201
|
if (field.status === "valid") validCount++;
|
|
@@ -204,6 +216,7 @@ function createFormStore(inputOptions = {}) {
|
|
|
204
216
|
isInvalid: invalid,
|
|
205
217
|
isValidating: validating,
|
|
206
218
|
isSubmitting: !!submission,
|
|
219
|
+
canReset: !submission && resettable,
|
|
207
220
|
submitError,
|
|
208
221
|
revision: state.revision
|
|
209
222
|
};
|
|
@@ -336,7 +349,7 @@ function createFormStore(inputOptions = {}) {
|
|
|
336
349
|
assertLive();
|
|
337
350
|
const normalized = normalizePath(path);
|
|
338
351
|
const prepared = prepareRegistration(normalized, config);
|
|
339
|
-
const signature = rulesSignature(prepared.rules);
|
|
352
|
+
const signature = rulesSignature(prepared.rules, { hashFunctions: prepared.rulesKey === void 0 });
|
|
340
353
|
const record = ensure(normalized);
|
|
341
354
|
const registration = {
|
|
342
355
|
options: prepared,
|
|
@@ -359,8 +372,8 @@ function createFormStore(inputOptions = {}) {
|
|
|
359
372
|
update(next) {
|
|
360
373
|
if (released || disposed) return;
|
|
361
374
|
const prepared = prepareRegistration(record.path, next);
|
|
362
|
-
const signature = rulesSignature(prepared.rules);
|
|
363
|
-
const validationChanged = registration.signature !== signature || registration.options.rulesKey !== prepared.rulesKey || !sameDependencies(registration.options.deps, prepared.deps) ||
|
|
375
|
+
const signature = rulesSignature(prepared.rules, { hashFunctions: prepared.rulesKey === void 0 });
|
|
376
|
+
const validationChanged = registration.signature !== signature || registration.options.rulesKey !== prepared.rulesKey || !sameDependencies(registration.options.deps, prepared.deps) || !samePaths(registration.options.dependsOn, prepared.dependsOn) || registration.options.validationDelay !== prepared.validationDelay || registration.options.validateTrigger !== prepared.validateTrigger || registration.options.errorPolicy !== prepared.errorPolicy;
|
|
364
377
|
if (!(!registration.defaultConsidered && Object.hasOwn(prepared, "defaultValue")) && !validationChanged && (registration.options.preserve ?? true) === (prepared.preserve ?? true) && registration.options.isEqual === prepared.isEqual) {
|
|
365
378
|
registration.options = prepared;
|
|
366
379
|
return;
|
|
@@ -448,7 +461,7 @@ function createFormStore(inputOptions = {}) {
|
|
|
448
461
|
const names = [];
|
|
449
462
|
for (const record of records.values()) {
|
|
450
463
|
const changed = pathValueChanged(previous, values, record.path);
|
|
451
|
-
if (changed || dependencyChanged(record, previous)) invalidate(record);
|
|
464
|
+
if (changed || dependencyChanged(record, previous) || validationReadChanged(record, previous)) invalidate(record);
|
|
452
465
|
if (changed) names.push(record.name);
|
|
453
466
|
}
|
|
454
467
|
event(names, "adopt");
|
|
@@ -501,6 +514,8 @@ function createFormStore(inputOptions = {}) {
|
|
|
501
514
|
const copied = errors.length ? Object.freeze([...errors]) : EMPTY_ERRORS;
|
|
502
515
|
batch(() => {
|
|
503
516
|
record.validation = void 0;
|
|
517
|
+
record.reads = void 0;
|
|
518
|
+
record.readsAll = false;
|
|
504
519
|
record.errors = copied;
|
|
505
520
|
record.status = copied.length ? "invalid" : "valid";
|
|
506
521
|
});
|
|
@@ -583,14 +598,14 @@ function createFormStore(inputOptions = {}) {
|
|
|
583
598
|
signal: token.signal,
|
|
584
599
|
getValue: (path) => {
|
|
585
600
|
const normalized = normalizePath(path);
|
|
586
|
-
if (!token.signal.aborted) {
|
|
601
|
+
if (!settled && !token.signal.aborted) {
|
|
587
602
|
reads.set(getFieldKey(normalized), normalized);
|
|
588
603
|
if (pathValueChanged(validationValues, values, normalized)) token.cancel();
|
|
589
604
|
}
|
|
590
605
|
return readPath(validationValues, normalized);
|
|
591
606
|
},
|
|
592
607
|
getValues: () => {
|
|
593
|
-
if (!token.signal.aborted) {
|
|
608
|
+
if (!settled && !token.signal.aborted) {
|
|
594
609
|
record.readsAll = true;
|
|
595
610
|
if (values !== validationValues) token.cancel();
|
|
596
611
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","names":[],"sources":["../../../../../src/components/form/Form/modern/store.ts"],"sourcesContent":["import { FORM_BACKEND } from '../backend';\n\nimport { rulesSignature, runRules } from './validation';\nimport {\n createValueSnapshotter,\n defineValue,\n formValueEqual,\n freezeContainer,\n getFieldKey,\n hasPath,\n isPlainObject,\n normalizePath,\n pathValueChanged,\n readonlySet,\n readPath,\n sameMembers,\n writePath,\n} from './values';\n\nimport type { FormValues } from './read-types';\nimport type {\n CallbackBinding,\n FieldState,\n FormCallbacks,\n FormChange,\n FormState,\n FormStore,\n FormStoreOptions,\n ModernFieldValidationResult,\n ModernSubmitResult,\n ModernValidationResult,\n RegistrationOptions,\n RegistrationToken,\n SetValueOptions,\n SubmissionToken,\n ValidationToken,\n} from './types';\nimport type { FormPath } from './values';\n\ninterface Registration<ErrorValue> {\n options: RegistrationOptions<ErrorValue>;\n signature: string;\n order: number;\n defaultConsidered: boolean;\n}\n\ninterface FieldRecord<ErrorValue> {\n name: string;\n path: readonly string[];\n /** Defaults create aggregate metadata; explicit commands/fields own guards. */\n explicit: boolean;\n registrations: Set<Registration<ErrorValue>>;\n owner?: Registration<ErrorValue>;\n fieldDefault?: { value: unknown };\n touched: boolean;\n errors: readonly ErrorValue[];\n status: FieldState['status'];\n validationRevision: number;\n validation?: AbortController;\n reads?: Map<string, readonly string[]>;\n readsAll?: boolean;\n}\n\nconst EMPTY_ERRORS = Object.freeze([]);\nconst EMPTY_OBJECT = Object.freeze({});\nconst EMPTY_FIELDS = Object.freeze(Object.create(null)) as Readonly<\n Record<string, never>\n>;\n\nfunction related(a: readonly string[], b: readonly string[]): boolean {\n return a\n .slice(0, Math.min(a.length, b.length))\n .every((key, index) => key === b[index]);\n}\n\nfunction sameDependencies(\n a: readonly unknown[] = [],\n b: readonly unknown[] = [],\n) {\n return (\n a.length === b.length &&\n a.every((value, index) => Object.is(value, b[index]))\n );\n}\n\ninterface ActivePath {\n terminal: boolean;\n children: Map<string, ActivePath>;\n}\n\n/** Only traverse path ancestors; a field's value (even cyclic data) is a leaf. */\nfunction projectActive(\n value: unknown,\n path: ActivePath,\n previous: unknown,\n): unknown {\n if (path.terminal) return value;\n const result: Record<string, unknown> | unknown[] = Array.isArray(value)\n ? []\n : {};\n if (isPlainObject(value) || Array.isArray(value)) {\n for (const [key, child] of path.children) {\n if (!Object.hasOwn(value, key)) continue;\n defineValue(\n result,\n key,\n projectActive(\n Reflect.get(value, key),\n child,\n readPath(previous, [key]),\n ),\n );\n }\n }\n return formValueEqual(result, previous) ? previous : freezeContainer(result);\n}\n\n/**\n * Framework-neutral store, registration ownership, and async pipelines.\n * Not exported from the package; React receives the public command facade.\n */\nexport function createFormStore<\n T extends object = Record<string, unknown>,\n ErrorValue = unknown,\n>(\n inputOptions: FormStoreOptions<T, ErrorValue> = {},\n): FormStore<T, ErrorValue> {\n const options = { ...inputOptions };\n const ownValue = createValueSnapshotter();\n const records = new Map<string, FieldRecord<ErrorValue>>();\n // Subscription identity belongs to the registration, not to the callback.\n const listeners = new Set<{ notify: () => void }>();\n let values: object = ownValue(options.defaultValues ?? {});\n let defaults = values;\n let submitError: unknown;\n let submission: AbortController | undefined;\n let binding: { callbacks: FormCallbacks<T, ErrorValue> } | undefined;\n let order = 0;\n let depth = 0;\n let notifying = false;\n let disposed = false;\n let pending = false;\n let changes: FormChange[] = [];\n const cancellations = new Set<AbortController>();\n\n let state: FormState<T, ErrorValue> = Object.freeze({\n values: values as FormValues<T>,\n defaultValues: defaults as FormValues<T>,\n activeValues: EMPTY_OBJECT as FormValues<T>,\n fields: EMPTY_FIELDS,\n dirtyFields: readonlySet<string>([]),\n touchedFields: readonlySet<string>([]),\n isDirty: false,\n isTouched: false,\n isValid: false,\n isInvalid: false,\n isValidating: false,\n isSubmitting: false,\n submitError: undefined,\n revision: 0,\n });\n\n function assertLive() {\n if (disposed) throw new Error('Cannot use a disposed modern form store.');\n }\n\n function report(error: unknown) {\n try {\n if (options.onListenerError) options.onListenerError(error);\n else console.error('[form-store] Listener failed', error);\n } catch (reportError) {\n // An error reporter must not break delivery to the remaining listeners.\n console.error('[form-store] Error reporter failed', reportError);\n }\n }\n\n function developmentError(message: string) {\n if (process.env.NODE_ENV === 'production') return;\n try {\n if (options.onDevelopmentError) options.onDevelopmentError(message);\n else console.error(`[form-store] ${message}`);\n } catch (error) {\n report(error);\n }\n }\n\n function ensure(path: FormPath, explicit = true): FieldRecord<ErrorValue> {\n const normalized = normalizePath(path);\n const name = getFieldKey(normalized);\n let record = records.get(name);\n if (!record) {\n record = {\n name,\n path: normalized,\n explicit,\n registrations: new Set(),\n touched: false,\n errors: EMPTY_ERRORS,\n status: 'unvalidated',\n validationRevision: 0,\n };\n records.set(name, record);\n }\n record.explicit ||= explicit;\n return record;\n }\n\n function dirty(record: FieldRecord<ErrorValue>): boolean {\n return (\n hasPath(values, record.path) &&\n !(record.owner?.options.isEqual ?? formValueEqual)(\n readPath(values, record.path),\n readPath(defaults, record.path),\n )\n );\n }\n\n function invalidate(record: FieldRecord<ErrorValue>, keepErrors = false) {\n const controller = record.validation;\n record.validation = undefined;\n record.validationRevision++;\n record.status = 'unvalidated';\n if (!keepErrors) record.errors = EMPTY_ERRORS;\n // Abort handlers are user code. Deliver them after the complete snapshot\n // publishes, so they cannot interleave writes with the command cancelling\n // them (or resurrect a token that command later overwrites).\n if (controller) cancellations.add(controller);\n }\n\n function cancelPending() {\n for (const controller of Array.from(cancellations)) {\n cancellations.delete(controller);\n controller.abort();\n }\n }\n\n function dependencyChanged(\n record: FieldRecord<ErrorValue>,\n previous: object,\n ) {\n if (record.readsAll && previous !== values) return true;\n const declared = record.owner?.options.dependsOn;\n if (!declared?.length && !record.reads?.size) return false;\n const paths = [\n ...(declared ?? []).map(normalizePath),\n ...(record.reads?.values() ?? []),\n ];\n return paths.some((path) => pathValueChanged(previous, values, path));\n }\n\n function invalidateRelated(\n path: readonly string[],\n previous: object,\n config?: SetValueOptions,\n ) {\n for (const record of records.values()) {\n const dependency = dependencyChanged(record, previous);\n if (\n related(path, record.path) ||\n dependency ||\n pathValueChanged(previous, values, record.path)\n ) {\n const revalidate =\n !!config &&\n !!record.registrations.size &&\n (config.validate === 'always' ||\n (config.validate !== 'never' &&\n (record.owner?.options.validateTrigger === 'onChange' ||\n !!record.errors.length ||\n (dependency && record.status !== 'unvalidated'))));\n invalidate(record, revalidate);\n if (revalidate) void validateRecord(record, false);\n }\n }\n }\n\n function activeValues(): object {\n const tree: ActivePath = { terminal: false, children: new Map() };\n // A registered parent includes its complete object, including inactive\n // descendants. Register only the leaves to submit only those leaves.\n for (const record of records.values()) {\n if (!record.registrations.size || !hasPath(values, record.path)) continue;\n let node = tree;\n for (const key of record.path) {\n let child = node.children.get(key);\n if (!child) {\n child = { terminal: false, children: new Map() };\n node.children.set(key, child);\n }\n node = child;\n }\n node.terminal = true;\n }\n return projectActive(values, tree, state.activeValues) as object;\n }\n\n function buildSnapshot(): FormState<T, ErrorValue> {\n const fields: Record<string, FieldState<ErrorValue>> = Object.create(null);\n const dirtyNames = new Set<string>();\n const touchedNames = new Set<string>();\n let activeCount = 0;\n let validCount = 0;\n let invalid = false;\n let validating = false;\n for (const record of records.values()) {\n const field: FieldState<ErrorValue> = {\n name: record.name,\n value: readPath(values, record.path),\n defaultValue: readPath(defaults, record.path),\n errors: record.errors,\n status: record.status,\n touched: record.touched,\n dirty: dirty(record),\n active: record.registrations.size > 0,\n registrationCount: record.registrations.size,\n validationRevision: record.validationRevision,\n };\n const previous = state.fields[record.name];\n Object.defineProperty(fields, record.name, {\n value: formValueEqual(field, previous)\n ? previous\n : Object.freeze(field),\n enumerable: true,\n });\n if (field.dirty) dirtyNames.add(record.name);\n if (field.touched) touchedNames.add(record.name);\n if (field.active) {\n activeCount++;\n if (field.status === 'valid') validCount++;\n invalid ||= field.status === 'invalid';\n validating ||= field.status === 'validating';\n }\n }\n const next: FormState<T, ErrorValue> = {\n values: values as FormValues<T>,\n defaultValues: defaults as FormValues<T>,\n activeValues: activeValues() as FormValues<T>,\n fields: formValueEqual(fields, state.fields)\n ? state.fields\n : Object.freeze(fields),\n dirtyFields: sameMembers(dirtyNames, state.dirtyFields)\n ? state.dirtyFields\n : readonlySet(dirtyNames),\n touchedFields: sameMembers(touchedNames, state.touchedFields)\n ? state.touchedFields\n : readonlySet(touchedNames),\n isDirty: dirtyNames.size > 0,\n isTouched: touchedNames.size > 0,\n isValid: activeCount > 0 && validCount === activeCount,\n isInvalid: invalid,\n isValidating: validating,\n isSubmitting: !!submission,\n submitError,\n revision: state.revision,\n };\n if (formValueEqual(next, state)) return state;\n return Object.freeze({ ...next, revision: state.revision + 1 });\n }\n\n function flush() {\n if (depth || notifying || disposed) return;\n notifying = true;\n try {\n while ((pending || cancellations.size) && !disposed) {\n pending = false;\n const events = changes;\n changes = [];\n const previous = state;\n state = buildSnapshot();\n const published = state;\n if (state !== previous) {\n for (const listener of Array.from(listeners)) {\n if (!listeners.has(listener)) continue;\n try {\n listener.notify();\n } catch (error) {\n report(error);\n }\n }\n }\n if (events.length && !disposed && resolveCallbacks().onValuesChange) {\n // One callback per transaction; names are unioned, user source wins,\n // and the final command supplies the transaction's kind.\n const change: FormChange = Object.freeze({\n names: Object.freeze(\n Array.from(new Set(events.flatMap((event) => event.names))),\n ),\n source: events.some((event) => event.source === 'user')\n ? 'user'\n : 'program',\n kind: events[events.length - 1].kind,\n });\n try {\n const result = resolveCallbacks().onValuesChange?.(\n published.values,\n change,\n );\n if (result) Promise.resolve(result).catch(report);\n } catch (error) {\n report(error);\n }\n }\n cancelPending();\n }\n } finally {\n notifying = false;\n }\n }\n\n function batch(fn: () => void) {\n assertLive();\n depth++;\n try {\n fn();\n } finally {\n depth--;\n pending = true;\n flush();\n }\n }\n\n function event(\n names: string[],\n kind: FormChange['kind'],\n source: FormChange['source'] = 'program',\n ) {\n if (names.length) changes.push({ names, kind, source });\n }\n\n function write(\n path: FormPath,\n value: unknown,\n config: SetValueOptions = {},\n ): boolean {\n const normalized = normalizePath(path);\n const previous = values;\n const next = writePath(values, normalized, ownValue(value));\n const record = ensure(normalized);\n const changed = next !== values;\n if (changed) {\n values = next;\n invalidateRelated(record.path, previous, config);\n }\n if (config.touch ?? config.source === 'user') record.touched = true;\n if (changed && (config.notify ?? config.source === 'user')) {\n event([record.name], 'set', config.source);\n }\n return changed;\n }\n\n function setValue(path: FormPath, value: unknown, config?: SetValueOptions) {\n // Validate paths before entering a transaction (no partial invalid writes).\n const normalized = normalizePath(path);\n const prepared = { ...config };\n batch(() => {\n write(normalized, value, prepared);\n });\n }\n\n function setValues(next: Partial<T>, config?: SetValueOptions) {\n assertLive();\n const prepared = { ...config };\n const entries = Object.entries(next).map(\n ([name, value]) => [normalizePath(name), ownValue(value)] as const,\n );\n // Copying input or an invalid array-length write can throw. Check every\n // value/path before the first write, including when inside an outer batch.\n let checked = values;\n for (const [path, value] of entries)\n checked = writePath(checked, path, value);\n batch(() => {\n for (const [path, value] of entries) write(path, value, prepared);\n });\n }\n\n function prepareRegistration(\n path: FormPath,\n config: RegistrationOptions<ErrorValue>,\n ): RegistrationOptions<ErrorValue> {\n const prepared = {\n ...config,\n deps: config.deps ? Object.freeze([...config.deps]) : undefined,\n dependsOn: config.dependsOn?.map((dependency) =>\n Object.freeze(normalizePath(dependency)),\n ),\n rules: config.rules?.map((rule) =>\n Object.freeze({\n ...rule,\n ...(rule.enum ? { enum: Object.freeze([...rule.enum]) } : {}),\n }),\n ),\n };\n if (Object.hasOwn(prepared, 'defaultValue')) {\n prepared.defaultValue = ownValue(prepared.defaultValue);\n const normalized = normalizePath(path);\n if (!hasPath(values, normalized) && !hasPath(defaults, normalized)) {\n writePath(values, normalized, prepared.defaultValue);\n writePath(defaults, normalized, prepared.defaultValue);\n }\n }\n return prepared;\n }\n\n function seed(\n record: FieldRecord<ErrorValue>,\n registration: Registration<ErrorValue>,\n ) {\n if (\n registration.defaultConsidered ||\n !Object.hasOwn(registration.options, 'defaultValue')\n )\n return;\n registration.defaultConsidered = true;\n const value = ownValue(registration.options.defaultValue);\n if (!hasPath(values, record.path) && !hasPath(defaults, record.path)) {\n const previous = values;\n values = writePath(values, record.path, value);\n defaults = writePath(defaults, record.path, value);\n record.fieldDefault = { value };\n invalidateRelated(record.path, previous);\n } else if (\n record.fieldDefault &&\n record.registrations.size > 1 &&\n !formValueEqual(record.fieldDefault.value, value)\n ) {\n developmentError(\n `Field \"${record.name}\" registered with conflicting defaultValue; the first default is kept.`,\n );\n }\n }\n\n function register(\n path: FormPath,\n config: RegistrationOptions<ErrorValue> = {},\n ): RegistrationToken<ErrorValue> {\n assertLive();\n const normalized = normalizePath(path);\n const prepared = prepareRegistration(normalized, config);\n const signature = rulesSignature(prepared.rules);\n const record = ensure(normalized);\n const registration: Registration<ErrorValue> = {\n options: prepared,\n signature,\n order: ++order,\n defaultConsidered: false,\n };\n let released = false;\n batch(() => {\n record.registrations.add(registration);\n record.owner = registration;\n seed(record, registration);\n invalidate(record);\n });\n return Object.freeze({\n name: record.name,\n get released() {\n return released || disposed;\n },\n update(next: RegistrationOptions<ErrorValue>) {\n if (released || disposed) return;\n const prepared = prepareRegistration(record.path, next);\n const signature = rulesSignature(prepared.rules);\n const validationChanged =\n registration.signature !== signature ||\n registration.options.rulesKey !== prepared.rulesKey ||\n !sameDependencies(registration.options.deps, prepared.deps) ||\n JSON.stringify(registration.options.dependsOn) !==\n JSON.stringify(prepared.dependsOn) ||\n registration.options.validationDelay !== prepared.validationDelay ||\n registration.options.validateTrigger !== prepared.validateTrigger ||\n registration.options.errorPolicy !== prepared.errorPolicy;\n const hasNewDefault =\n !registration.defaultConsidered &&\n Object.hasOwn(prepared, 'defaultValue');\n if (\n !hasNewDefault &&\n !validationChanged &&\n (registration.options.preserve ?? true) ===\n (prepared.preserve ?? true) &&\n registration.options.isEqual === prepared.isEqual\n ) {\n // Keep the latest closures/messages without invalidating equivalent rules.\n registration.options = prepared;\n return;\n }\n batch(() => {\n registration.options = prepared;\n registration.signature = signature;\n registration.order = ++order;\n // Only an ownership change invalidates; equivalent options pushed\n // after every React commit must not cause a publication loop.\n const revalidate =\n validationChanged && record.status !== 'unvalidated';\n if (record.owner !== registration || validationChanged)\n invalidate(record, revalidate);\n record.owner = registration;\n seed(record, registration);\n if (revalidate) void validateRecord(record, false);\n });\n },\n release(config: { deferValueRemoval?: boolean } = {}) {\n if (released || disposed) return;\n released = true;\n batch(() => {\n record.registrations.delete(registration);\n if (record.owner === registration) {\n record.owner = Array.from(record.registrations).sort(\n (a, b) => b.order - a.order,\n )[0];\n invalidate(record);\n }\n if (!record.registrations.size) {\n if (registration.options.preserve === false) {\n const removeValue = () => {\n const previous = values;\n values = writePath(values, record.path, undefined, true);\n record.touched = false;\n invalidateRelated(record.path, previous, { validate: 'auto' });\n if (!hasPath(defaults, record.path))\n records.delete(record.name);\n };\n if (config.deferValueRemoval) {\n // Unregister and abort immediately. Only destructive retention\n // cleanup waits one microtask, allowing Strict Mode's effect\n // replay to reconnect without losing the current value.\n const revision = record.validationRevision;\n queueMicrotask(() => {\n if (\n !disposed &&\n records.get(record.name) === record &&\n !record.registrations.size &&\n record.validationRevision === revision\n )\n batch(removeValue);\n });\n } else removeValue();\n }\n if (\n !hasPath(values, record.path) &&\n !hasPath(defaults, record.path)\n )\n records.delete(record.name);\n }\n });\n },\n });\n }\n\n function replaceDefaults(next: Partial<T>) {\n const entries = Object.keys(next);\n entries.forEach((name) => normalizePath(name));\n defaults = ownValue(next);\n for (const name of entries) ensure(name, false);\n for (const record of records.values()) record.fieldDefault = undefined;\n }\n\n function setDefaultValues(\n next: Partial<T>,\n config: { currentValues?: 'preserve' | 'replace' } = {},\n ) {\n const replace = config.currentValues === 'replace';\n batch(() => {\n replaceDefaults(next);\n if (replace) {\n values = defaults;\n for (const record of records.values()) {\n invalidate(record);\n record.touched = false;\n }\n event(Array.from(records.keys()), 'defaults');\n }\n });\n }\n\n function adoptDefaultValues(\n next: Partial<T>,\n config: {\n when?: 'untouched' | 'clean' | 'always';\n preserveDirty?: boolean;\n } = {},\n ) {\n const when = config.when ?? 'untouched';\n const preserveDirty = config.preserveDirty ?? false;\n batch(() => {\n // Retain edits at the narrowest guarded field path. This also protects a\n // nested edited leaf when the server replaces its containing object.\n const candidates = Array.from(records.values());\n const preserved = candidates\n .filter((record) => {\n // An implicitly tracked parent must not shield untouched siblings\n // when an explicit nested field is the actual edited control.\n if (\n !record.explicit &&\n candidates.some(\n (child) =>\n child.explicit &&\n child.path.length > record.path.length &&\n related(record.path, child.path),\n )\n )\n return false;\n return (\n (when === 'untouched' && record.touched) ||\n (when === 'clean' && dirty(record)) ||\n (preserveDirty && dirty(record))\n );\n })\n .map((record) => ({\n path: record.path,\n exists: hasPath(values, record.path),\n value: readPath(values, record.path),\n }));\n const previous = values;\n replaceDefaults(next);\n values = defaults;\n for (const saved of preserved.sort(\n (a, b) => a.path.length - b.path.length,\n )) {\n values = writePath(values, saved.path, saved.value, !saved.exists);\n }\n const names: string[] = [];\n for (const record of records.values()) {\n const changed = pathValueChanged(previous, values, record.path);\n if (changed || dependencyChanged(record, previous)) invalidate(record);\n if (changed) names.push(record.name);\n }\n event(names, 'adopt');\n });\n }\n\n function reset(config: { values?: Partial<T> } = {}) {\n batch(() => {\n if (Object.hasOwn(config, 'values')) replaceDefaults(config.values ?? {});\n values = defaults;\n const names = Array.from(records.keys());\n for (const record of records.values()) {\n invalidate(record);\n record.touched = false;\n if (!record.registrations.size && !hasPath(values, record.path))\n records.delete(record.name);\n }\n const previous = submission;\n submission = undefined;\n submitError = undefined;\n if (previous) cancellations.add(previous);\n event(names, 'reset');\n });\n }\n\n function setFieldErrors(path: FormPath, errors: readonly ErrorValue[]) {\n assertLive();\n const copied = errors.length ? Object.freeze([...errors]) : EMPTY_ERRORS;\n batch(() => {\n const record = ensure(path);\n const status = copied.length ? 'invalid' : 'valid';\n if (record.status === status && formValueEqual(record.errors, copied))\n return;\n invalidate(record);\n record.errors = copied;\n record.status = status;\n });\n }\n\n function startValidation(path: FormPath): ValidationToken<ErrorValue> {\n assertLive();\n const record = records.get(getFieldKey(path));\n if (!record?.registrations.size)\n throw new Error('Only active form fields can validate.');\n const controller = new AbortController();\n batch(() => {\n invalidate(record, true);\n record.validation = controller;\n record.status = 'validating';\n });\n const current = () =>\n !disposed &&\n record.validation === controller &&\n !controller.signal.aborted;\n return Object.freeze({\n signal: controller.signal,\n complete(errors: readonly ErrorValue[]) {\n if (!current()) return false;\n const copied = errors.length\n ? Object.freeze([...errors])\n : EMPTY_ERRORS;\n batch(() => {\n record.validation = undefined;\n record.errors = copied;\n record.status = copied.length ? 'invalid' : 'valid';\n });\n return true;\n },\n cancel() {\n if (current())\n batch(() => {\n invalidate(record, true);\n });\n },\n });\n }\n\n function startSubmission(): SubmissionToken | undefined {\n assertLive();\n if (submission) return undefined;\n const controller = new AbortController();\n batch(() => {\n submission = controller;\n submitError = undefined;\n });\n return Object.freeze({\n signal: controller.signal,\n complete(result?: { error: unknown }) {\n if (disposed || submission !== controller || controller.signal.aborted)\n return false;\n const error = result?.error;\n batch(() => {\n submission = undefined;\n submitError = error;\n });\n return true;\n },\n });\n }\n\n function validateRecord(\n record: FieldRecord<ErrorValue>,\n immediate: boolean,\n parentSignal?: AbortSignal,\n ): Promise<ModernFieldValidationResult<ErrorValue>> {\n const result = (errors: readonly ErrorValue[], stale = false) => ({\n name: record.name,\n errors,\n isValid: !stale && !errors.length,\n stale,\n });\n if (parentSignal?.aborted)\n return Promise.resolve(result(EMPTY_ERRORS, true));\n const config = record.owner?.options;\n const rules = config?.rules ?? [];\n const token = startValidation(record.path);\n const revision = record.validationRevision;\n if (token.signal.aborted || parentSignal?.aborted) {\n token.cancel();\n return Promise.resolve(result(EMPTY_ERRORS, true));\n }\n if (!rules.length) {\n record.reads = undefined;\n record.readsAll = false;\n const committed = token.complete(EMPTY_ERRORS);\n return Promise.resolve(\n result(\n EMPTY_ERRORS,\n !committed || record.validationRevision !== revision,\n ),\n );\n }\n const validationValues = values;\n const reads = new Map<string, readonly string[]>();\n record.reads = reads;\n record.readsAll = false;\n const value = readPath(validationValues, record.path);\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let settled = false;\n const finish = (errors: readonly ErrorValue[], stale: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n token.signal.removeEventListener('abort', abort);\n parentSignal?.removeEventListener('abort', cancel);\n resolve(result(errors, stale));\n };\n const abort = () => finish(EMPTY_ERRORS, true);\n const cancel = () => token.cancel();\n token.signal.addEventListener('abort', abort, { once: true });\n parentSignal?.addEventListener('abort', cancel, { once: true });\n const run = async () => {\n timer = undefined;\n const errors = await runRules(\n value,\n rules,\n {\n name: record.name,\n signal: token.signal,\n getValue: (path) => {\n const normalized = normalizePath(path);\n if (!token.signal.aborted) {\n reads.set(getFieldKey(normalized), normalized);\n if (pathValueChanged(validationValues, values, normalized))\n token.cancel();\n }\n return readPath(validationValues, normalized);\n },\n getValues: () => {\n if (!token.signal.aborted) {\n record.readsAll = true;\n if (values !== validationValues) token.cancel();\n }\n return validationValues as FormValues<T>;\n },\n },\n config?.errorPolicy ?? options.errorPolicy ?? 'first',\n );\n if (!settled) {\n const committed = token.complete(errors);\n finish(\n Object.freeze(errors),\n !committed ||\n record.validationRevision !== revision ||\n !!parentSignal?.aborted,\n );\n }\n };\n const delay = immediate ? 0 : config?.validationDelay ?? 0;\n if (delay > 0) timer = setTimeout(() => void run(), delay);\n else void run();\n });\n }\n\n function validate(\n paths?: readonly FormPath[],\n config: { immediate?: boolean; signal?: AbortSignal } = {},\n ): Promise<ModernValidationResult<ErrorValue>> {\n assertLive();\n const targets = paths\n ? Array.from(new Set(paths.map(getFieldKey))).map((key) =>\n records.get(key),\n )\n : Array.from(records.values());\n const active = targets.filter(\n (record): record is FieldRecord<ErrorValue> =>\n !!record?.registrations.size,\n );\n let runs: Promise<ModernFieldValidationResult<ErrorValue>>[] = [];\n let revisions: number[] = [];\n batch(() => {\n runs = active.map((record) =>\n validateRecord(record, config.immediate ?? true, config.signal),\n );\n // Capture before publishing: a synchronous subscriber can edit/reset.\n revisions = active.map((record) => record.validationRevision);\n });\n return Promise.all(runs).then((results) => {\n const fields = results.map((result, index) => {\n const record = active[index];\n return record.validationRevision === revisions[index] &&\n !!record.registrations.size &&\n !config.signal?.aborted\n ? result\n : { ...result, stale: true, isValid: false };\n });\n return {\n fields,\n stale: fields.some((field) => field.stale) || !!config.signal?.aborted,\n isValid: !!fields.length && fields.every((field) => field.isValid),\n };\n });\n }\n\n function resolveCallbacks(): FormCallbacks<T, ErrorValue> {\n return { ...options, ...binding?.callbacks };\n }\n\n function cancelSubmission() {\n batch(() => {\n if (submission) cancellations.add(submission);\n submission = undefined;\n });\n }\n\n function bindCallbacks(\n callbacks: FormCallbacks<T, ErrorValue>,\n ): CallbackBinding<T, ErrorValue> {\n assertLive();\n if (binding)\n developmentError(\n 'A second Form root owns this controller; the newest callback binding wins.',\n );\n const own = { callbacks: { ...callbacks } };\n binding = own;\n let released = false;\n return Object.freeze({\n update(next: FormCallbacks<T, ErrorValue>) {\n if (!released && !disposed && binding === own)\n own.callbacks = { ...next };\n },\n release() {\n if (released || disposed) return;\n released = true;\n if (binding === own) {\n binding = undefined;\n cancelSubmission();\n }\n },\n });\n }\n\n async function submit(\n config: { include?: 'active' | 'all' } = {},\n ): Promise<ModernSubmitResult<ErrorValue>> {\n const token = startSubmission();\n if (!token) return { status: 'ignored', reason: 'submitting' };\n const include = config.include ?? 'active';\n // Cancellation settles promptly even if a validator or callback ignores its signal.\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: ModernSubmitResult<ErrorValue>) => {\n if (settled) return;\n settled = true;\n token.signal.removeEventListener('abort', abort);\n resolve(result);\n };\n const abort = () => finish({ status: 'stale' });\n token.signal.addEventListener('abort', abort, { once: true });\n if (token.signal.aborted) {\n abort();\n return;\n }\n const run = async () => {\n const pendingValidation = validate(undefined, { signal: token.signal });\n const validatedRecords = Array.from(records.values()).filter(\n (record) => record.registrations.size,\n );\n const revisions = validatedRecords.map(\n (record) => record.validationRevision,\n );\n const validation = await pendingValidation;\n if (settled) return;\n const changedSinceValidation =\n validatedRecords.length !== validation.fields.length ||\n validatedRecords.length !==\n Array.from(records.values()).filter(\n (record) => record.registrations.size,\n ).length ||\n validatedRecords.some(\n (record, index) =>\n !record.registrations.size ||\n record.validationRevision !== revisions[index],\n );\n if (validation.stale || changedSinceValidation) {\n token.complete();\n finish({ status: 'stale' });\n return;\n }\n const callbacks = resolveCallbacks();\n let result: ModernSubmitResult<ErrorValue>;\n if (!validation.isValid) {\n const errors = Object.fromEntries(\n validation.fields\n .filter((field) => !field.isValid)\n .map((field) => [field.name, field.errors]),\n );\n result = { status: 'invalid', errors: Object.freeze(errors) };\n try {\n await callbacks.onSubmitFailed?.({\n status: 'invalid',\n errors: Object.freeze(errors),\n });\n } catch (error) {\n report(error);\n }\n if (!settled) {\n token.complete();\n finish(result);\n }\n return;\n }\n try {\n await callbacks.onSubmit?.(\n (include === 'all' ? values : activeValues()) as FormValues<T>,\n { include, signal: token.signal },\n );\n result = { status: 'submitted' };\n } catch (error) {\n if (settled) return;\n // Keep the guard active while failure callbacks run.\n batch(() => {\n submitError = error;\n });\n try {\n await callbacks.onSubmitFailed?.({ status: 'failed', error });\n } catch (failure) {\n report(failure);\n }\n result = { status: 'failed', error };\n }\n if (!settled) {\n token.complete(\n result.status === 'failed' ? { error: result.error } : undefined,\n );\n finish(result);\n }\n };\n void run().catch((error) => {\n if (!settled) {\n token.complete({ error });\n finish({ status: 'failed', error });\n }\n });\n });\n }\n\n function subscribe(listener: () => void) {\n assertLive();\n const entry = { notify: listener };\n listeners.add(entry);\n return () => {\n listeners.delete(entry);\n };\n }\n\n function dispose() {\n if (disposed) return;\n disposed = true;\n listeners.clear();\n binding = undefined;\n changes = [];\n pending = false;\n for (const record of records.values()) {\n record.registrations.clear();\n record.owner = undefined;\n invalidate(record);\n }\n const previous = submission;\n submission = undefined;\n if (previous) cancellations.add(previous);\n state = buildSnapshot();\n records.clear();\n cancelPending();\n }\n\n for (const name of Object.keys(values)) ensure(name, false);\n state = buildSnapshot();\n\n return Object.freeze({\n [FORM_BACKEND]: 'modern' as const,\n getSnapshot: () => state,\n getFieldSnapshot: (path: FormPath) => state.fields[getFieldKey(path)],\n getValue: (path: FormPath) => readPath(values, normalizePath(path)),\n getValues: () => values as FormValues<T>,\n getActiveValues: () => activeValues() as FormValues<T>,\n subscribe,\n subscribeSelector<Selected>(\n selector: (snapshot: FormState<T, ErrorValue>) => Selected,\n listener: (value: Selected, previous: Selected) => void,\n isEqual: (a: Selected, b: Selected) => boolean = Object.is,\n ) {\n let selected = selector(state);\n return subscribe(() => {\n const next = selector(state);\n if (isEqual(selected, next)) return;\n const previous = selected;\n selected = next;\n listener(next, previous);\n });\n },\n register,\n validate,\n submit,\n bindCallbacks,\n updateCallbacks(callbacks: FormCallbacks<T, ErrorValue>) {\n options.onSubmit = callbacks.onSubmit;\n options.onSubmitFailed = callbacks.onSubmitFailed;\n options.onValuesChange = callbacks.onValuesChange;\n },\n blur(path: FormPath) {\n const record = records.get(getFieldKey(path));\n if (!record?.registrations.size) return;\n batch(() => {\n record.touched = true;\n if ((record.owner?.options.validateTrigger ?? 'onBlur') === 'onBlur')\n void validateRecord(record, false);\n });\n },\n setValue,\n setValues,\n batch,\n setDefaultValues,\n adoptDefaultValues,\n reset,\n touch(path: FormPath, touched = true) {\n batch(() => {\n ensure(path).touched = touched;\n });\n },\n setFieldErrors,\n clearFieldErrors: (path: FormPath) => setFieldErrors(path, EMPTY_ERRORS),\n startValidation,\n startSubmission,\n setSubmitError(error: unknown) {\n batch(() => {\n submitError = error;\n });\n },\n clearSubmitError() {\n batch(() => {\n submitError = undefined;\n });\n },\n dispose,\n debug: Object.freeze({\n listenerCount: () => listeners.size,\n registrationCount: () =>\n Array.from(records.values()).reduce(\n (count, record) => count + record.registrations.size,\n 0,\n ),\n }),\n }) as FormStore<T, ErrorValue>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","names":[],"sources":["../../../../../src/components/form/Form/modern/store.ts"],"sourcesContent":["import { FORM_BACKEND } from '../backend';\n\nimport { rulesSignature, runRules } from './validation';\nimport {\n createValueSnapshotter,\n defineValue,\n formValueEqual,\n freezeContainer,\n getFieldKey,\n hasPath,\n isPlainObject,\n normalizePath,\n pathValueChanged,\n readonlySet,\n readPath,\n sameMembers,\n writePath,\n} from './values';\n\nimport type { FormValues } from './read-types';\nimport type {\n CallbackBinding,\n FieldState,\n FormCallbacks,\n FormChange,\n FormState,\n FormStore,\n FormStoreOptions,\n ModernFieldValidationResult,\n ModernSubmitResult,\n ModernValidationResult,\n RegistrationOptions,\n RegistrationToken,\n SetValueOptions,\n SubmissionToken,\n ValidationToken,\n} from './types';\nimport type { FormPath } from './values';\n\ninterface PreparedRegistration<ErrorValue>\n extends Omit<RegistrationOptions<ErrorValue>, 'dependsOn'> {\n readonly dependsOn?: readonly (readonly string[])[];\n}\n\ninterface Registration<ErrorValue> {\n options: PreparedRegistration<ErrorValue>;\n signature: string;\n order: number;\n defaultConsidered: boolean;\n}\n\ninterface FieldRecord<ErrorValue> {\n name: string;\n path: readonly string[];\n /** Defaults create aggregate metadata; explicit commands/fields own guards. */\n explicit: boolean;\n registrations: Set<Registration<ErrorValue>>;\n owner?: Registration<ErrorValue>;\n fieldDefault?: { value: unknown };\n touched: boolean;\n errors: readonly ErrorValue[];\n status: FieldState['status'];\n validationRevision: number;\n validation?: AbortController;\n reads?: Map<string, readonly string[]>;\n readsAll?: boolean;\n}\n\nconst EMPTY_ERRORS = Object.freeze([]);\nconst EMPTY_OBJECT = Object.freeze({});\nconst EMPTY_FIELDS = Object.freeze(Object.create(null)) as Readonly<\n Record<string, never>\n>;\n\nfunction related(a: readonly string[], b: readonly string[]): boolean {\n return a\n .slice(0, Math.min(a.length, b.length))\n .every((key, index) => key === b[index]);\n}\n\nfunction sameDependencies(\n a: readonly unknown[] = [],\n b: readonly unknown[] = [],\n) {\n return (\n a.length === b.length &&\n a.every((value, index) => Object.is(value, b[index]))\n );\n}\n\nfunction samePaths(\n a: readonly (readonly string[])[] = [],\n b: readonly (readonly string[])[] = [],\n) {\n return (\n a.length === b.length &&\n a.every((path, index) => sameDependencies(path, b[index]))\n );\n}\n\ninterface ActivePath {\n terminal: boolean;\n children: Map<string, ActivePath>;\n}\n\n/** Only traverse path ancestors; a field's value (even cyclic data) is a leaf. */\nfunction projectActive(\n value: unknown,\n path: ActivePath,\n previous: unknown,\n): unknown {\n if (path.terminal) return value;\n const result: Record<string, unknown> | unknown[] = Array.isArray(value)\n ? []\n : {};\n if (isPlainObject(value) || Array.isArray(value)) {\n for (const [key, child] of path.children) {\n if (!Object.hasOwn(value, key)) continue;\n defineValue(\n result,\n key,\n projectActive(\n Reflect.get(value, key),\n child,\n readPath(previous, [key]),\n ),\n );\n }\n }\n return formValueEqual(result, previous) ? previous : freezeContainer(result);\n}\n\n/**\n * Framework-neutral store, registration ownership, and async pipelines.\n * Not exported from the package; React receives the public command facade.\n */\nexport function createFormStore<\n T extends object = Record<string, unknown>,\n ErrorValue = unknown,\n>(\n inputOptions: FormStoreOptions<T, ErrorValue> = {},\n): FormStore<T, ErrorValue> {\n const options = { ...inputOptions };\n const ownValue = createValueSnapshotter();\n const records = new Map<string, FieldRecord<ErrorValue>>();\n // Subscription identity belongs to the registration, not to the callback.\n const listeners = new Set<{ notify: () => void }>();\n let values: object = ownValue(options.defaultValues ?? {});\n let defaults = values;\n let submitError: unknown;\n let submission: AbortController | undefined;\n let binding: { callbacks: FormCallbacks<T, ErrorValue> } | undefined;\n let order = 0;\n let depth = 0;\n let notifying = false;\n let disposed = false;\n let pending = false;\n let changes: FormChange[] = [];\n const cancellations = new Set<AbortController>();\n\n let state: FormState<T, ErrorValue> = Object.freeze({\n values: values as FormValues<T>,\n defaultValues: defaults as FormValues<T>,\n activeValues: EMPTY_OBJECT as FormValues<T>,\n fields: EMPTY_FIELDS,\n dirtyFields: readonlySet<string>([]),\n touchedFields: readonlySet<string>([]),\n isDirty: false,\n isTouched: false,\n isValid: false,\n isInvalid: false,\n isValidating: false,\n isSubmitting: false,\n canReset: false,\n submitError: undefined,\n revision: 0,\n });\n\n function assertLive() {\n if (disposed) throw new Error('Cannot use a disposed modern form store.');\n }\n\n function report(error: unknown) {\n try {\n if (options.onListenerError) options.onListenerError(error);\n else console.error('[form-store] Listener failed', error);\n } catch (reportError) {\n // An error reporter must not break delivery to the remaining listeners.\n console.error('[form-store] Error reporter failed', reportError);\n }\n }\n\n function developmentError(message: string) {\n if (process.env.NODE_ENV === 'production') return;\n try {\n if (options.onDevelopmentError) options.onDevelopmentError(message);\n else console.error(`[form-store] ${message}`);\n } catch (error) {\n report(error);\n }\n }\n\n function ensure(path: FormPath, explicit = true): FieldRecord<ErrorValue> {\n const normalized = normalizePath(path);\n const name = getFieldKey(normalized);\n let record = records.get(name);\n if (!record) {\n record = {\n name,\n path: normalized,\n explicit,\n registrations: new Set(),\n touched: false,\n errors: EMPTY_ERRORS,\n status: 'unvalidated',\n validationRevision: 0,\n };\n records.set(name, record);\n }\n record.explicit ||= explicit;\n return record;\n }\n\n function dirty(record: FieldRecord<ErrorValue>): boolean {\n return (\n hasPath(values, record.path) &&\n !(record.owner?.options.isEqual ?? formValueEqual)(\n readPath(values, record.path),\n readPath(defaults, record.path),\n )\n );\n }\n\n function invalidate(record: FieldRecord<ErrorValue>, keepErrors = false) {\n const controller = record.validation;\n record.validation = undefined;\n record.reads = undefined;\n record.readsAll = false;\n record.validationRevision++;\n record.status = 'unvalidated';\n if (!keepErrors) record.errors = EMPTY_ERRORS;\n // Abort handlers are user code. Deliver them after the complete snapshot\n // publishes, so they cannot interleave writes with the command cancelling\n // them (or resurrect a token that command later overwrites).\n if (controller) cancellations.add(controller);\n }\n\n function cancelPending() {\n for (const controller of Array.from(cancellations)) {\n cancellations.delete(controller);\n controller.abort();\n }\n }\n\n function dependencyChanged(\n record: FieldRecord<ErrorValue>,\n previous: object,\n ) {\n return (\n record.owner?.options.dependsOn?.some((path) =>\n pathValueChanged(previous, values, path),\n ) ?? false\n );\n }\n\n function validationReadChanged(\n record: FieldRecord<ErrorValue>,\n previous: object,\n ) {\n if (!record.validation) return false;\n if (record.readsAll && previous !== values) return true;\n for (const path of record.reads?.values() ?? []) {\n if (pathValueChanged(previous, values, path)) return true;\n }\n return false;\n }\n\n function invalidateRelated(\n path: readonly string[],\n previous: object,\n config?: SetValueOptions,\n ) {\n for (const record of records.values()) {\n const dependency = dependencyChanged(record, previous);\n const fieldChanged =\n related(path, record.path) ||\n pathValueChanged(previous, values, record.path);\n if (\n fieldChanged ||\n dependency ||\n validationReadChanged(record, previous)\n ) {\n const revalidate =\n (fieldChanged || dependency) &&\n !!config &&\n !!record.registrations.size &&\n (config.validate === 'always' ||\n (config.validate !== 'never' &&\n (record.owner?.options.validateTrigger === 'onChange' ||\n !!record.errors.length ||\n (dependency && record.status !== 'unvalidated'))));\n invalidate(record, revalidate);\n if (revalidate) void validateRecord(record, false);\n }\n }\n }\n\n function activeValues(): object {\n const tree: ActivePath = { terminal: false, children: new Map() };\n // A registered parent includes its complete object, including inactive\n // descendants. Register only the leaves to submit only those leaves.\n for (const record of records.values()) {\n if (!record.registrations.size || !hasPath(values, record.path)) continue;\n let node = tree;\n for (const key of record.path) {\n let child = node.children.get(key);\n if (!child) {\n child = { terminal: false, children: new Map() };\n node.children.set(key, child);\n }\n node = child;\n }\n node.terminal = true;\n }\n return projectActive(values, tree, state.activeValues) as object;\n }\n\n function buildSnapshot(): FormState<T, ErrorValue> {\n const fields: Record<string, FieldState<ErrorValue>> = Object.create(null);\n const dirtyNames = new Set<string>();\n const touchedNames = new Set<string>();\n let activeCount = 0;\n let validCount = 0;\n let invalid = false;\n let validating = false;\n let resettable = submitError != null;\n for (const record of records.values()) {\n const field: FieldState<ErrorValue> = {\n name: record.name,\n value: readPath(values, record.path),\n defaultValue: readPath(defaults, record.path),\n errors: record.errors,\n status: record.status,\n touched: record.touched,\n dirty: dirty(record),\n active: record.registrations.size > 0,\n registrationCount: record.registrations.size,\n validationRevision: record.validationRevision,\n };\n const previous = state.fields[record.name];\n Object.defineProperty(fields, record.name, {\n value: formValueEqual(field, previous)\n ? previous\n : Object.freeze(field),\n enumerable: true,\n });\n if (field.dirty) dirtyNames.add(record.name);\n if (field.touched) touchedNames.add(record.name);\n resettable ||=\n field.dirty ||\n field.touched ||\n !!field.errors.length ||\n field.status !== 'unvalidated';\n if (field.active) {\n activeCount++;\n if (field.status === 'valid') validCount++;\n invalid ||= field.status === 'invalid';\n validating ||= field.status === 'validating';\n }\n }\n const next: FormState<T, ErrorValue> = {\n values: values as FormValues<T>,\n defaultValues: defaults as FormValues<T>,\n activeValues: activeValues() as FormValues<T>,\n fields: formValueEqual(fields, state.fields)\n ? state.fields\n : Object.freeze(fields),\n dirtyFields: sameMembers(dirtyNames, state.dirtyFields)\n ? state.dirtyFields\n : readonlySet(dirtyNames),\n touchedFields: sameMembers(touchedNames, state.touchedFields)\n ? state.touchedFields\n : readonlySet(touchedNames),\n isDirty: dirtyNames.size > 0,\n isTouched: touchedNames.size > 0,\n isValid: activeCount > 0 && validCount === activeCount,\n isInvalid: invalid,\n isValidating: validating,\n isSubmitting: !!submission,\n canReset: !submission && resettable,\n submitError,\n revision: state.revision,\n };\n if (formValueEqual(next, state)) return state;\n return Object.freeze({ ...next, revision: state.revision + 1 });\n }\n\n function flush() {\n if (depth || notifying || disposed) return;\n notifying = true;\n try {\n while ((pending || cancellations.size) && !disposed) {\n pending = false;\n const events = changes;\n changes = [];\n const previous = state;\n state = buildSnapshot();\n const published = state;\n if (state !== previous) {\n for (const listener of Array.from(listeners)) {\n if (!listeners.has(listener)) continue;\n try {\n listener.notify();\n } catch (error) {\n report(error);\n }\n }\n }\n if (events.length && !disposed && resolveCallbacks().onValuesChange) {\n // One callback per transaction; names are unioned, user source wins,\n // and the final command supplies the transaction's kind.\n const change: FormChange = Object.freeze({\n names: Object.freeze(\n Array.from(new Set(events.flatMap((event) => event.names))),\n ),\n source: events.some((event) => event.source === 'user')\n ? 'user'\n : 'program',\n kind: events[events.length - 1].kind,\n });\n try {\n const result = resolveCallbacks().onValuesChange?.(\n published.values,\n change,\n );\n if (result) Promise.resolve(result).catch(report);\n } catch (error) {\n report(error);\n }\n }\n cancelPending();\n }\n } finally {\n notifying = false;\n }\n }\n\n function batch(fn: () => void) {\n assertLive();\n depth++;\n try {\n fn();\n } finally {\n depth--;\n pending = true;\n flush();\n }\n }\n\n function event(\n names: string[],\n kind: FormChange['kind'],\n source: FormChange['source'] = 'program',\n ) {\n if (names.length) changes.push({ names, kind, source });\n }\n\n function write(\n path: FormPath,\n value: unknown,\n config: SetValueOptions = {},\n ): boolean {\n const normalized = normalizePath(path);\n const previous = values;\n const next = writePath(values, normalized, ownValue(value));\n const record = ensure(normalized);\n const changed = next !== values;\n if (changed) {\n values = next;\n invalidateRelated(record.path, previous, config);\n }\n if (config.touch ?? config.source === 'user') record.touched = true;\n if (changed && (config.notify ?? config.source === 'user')) {\n event([record.name], 'set', config.source);\n }\n return changed;\n }\n\n function setValue(path: FormPath, value: unknown, config?: SetValueOptions) {\n // Validate paths before entering a transaction (no partial invalid writes).\n const normalized = normalizePath(path);\n const prepared = { ...config };\n batch(() => {\n write(normalized, value, prepared);\n });\n }\n\n function setValues(next: Partial<T>, config?: SetValueOptions) {\n assertLive();\n const prepared = { ...config };\n const entries = Object.entries(next).map(\n ([name, value]) => [normalizePath(name), ownValue(value)] as const,\n );\n // Copying input or an invalid array-length write can throw. Check every\n // value/path before the first write, including when inside an outer batch.\n let checked = values;\n for (const [path, value] of entries)\n checked = writePath(checked, path, value);\n batch(() => {\n for (const [path, value] of entries) write(path, value, prepared);\n });\n }\n\n function prepareRegistration(\n path: FormPath,\n config: RegistrationOptions<ErrorValue>,\n ): PreparedRegistration<ErrorValue> {\n const prepared = {\n ...config,\n deps: config.deps ? Object.freeze([...config.deps]) : undefined,\n dependsOn: config.dependsOn?.map((dependency) =>\n Object.freeze(normalizePath(dependency)),\n ),\n rules: config.rules?.map((rule) =>\n Object.freeze({\n ...rule,\n ...(rule.enum ? { enum: Object.freeze([...rule.enum]) } : {}),\n }),\n ),\n };\n if (Object.hasOwn(prepared, 'defaultValue')) {\n prepared.defaultValue = ownValue(prepared.defaultValue);\n const normalized = normalizePath(path);\n if (!hasPath(values, normalized) && !hasPath(defaults, normalized)) {\n writePath(values, normalized, prepared.defaultValue);\n writePath(defaults, normalized, prepared.defaultValue);\n }\n }\n return prepared;\n }\n\n function seed(\n record: FieldRecord<ErrorValue>,\n registration: Registration<ErrorValue>,\n ) {\n if (\n registration.defaultConsidered ||\n !Object.hasOwn(registration.options, 'defaultValue')\n )\n return;\n registration.defaultConsidered = true;\n const value = ownValue(registration.options.defaultValue);\n if (!hasPath(values, record.path) && !hasPath(defaults, record.path)) {\n const previous = values;\n values = writePath(values, record.path, value);\n defaults = writePath(defaults, record.path, value);\n record.fieldDefault = { value };\n invalidateRelated(record.path, previous);\n } else if (\n record.fieldDefault &&\n record.registrations.size > 1 &&\n !formValueEqual(record.fieldDefault.value, value)\n ) {\n developmentError(\n `Field \"${record.name}\" registered with conflicting defaultValue; the first default is kept.`,\n );\n }\n }\n\n function register(\n path: FormPath,\n config: RegistrationOptions<ErrorValue> = {},\n ): RegistrationToken<ErrorValue> {\n assertLive();\n const normalized = normalizePath(path);\n const prepared = prepareRegistration(normalized, config);\n const signature = rulesSignature(prepared.rules, {\n hashFunctions: prepared.rulesKey === undefined,\n });\n const record = ensure(normalized);\n const registration: Registration<ErrorValue> = {\n options: prepared,\n signature,\n order: ++order,\n defaultConsidered: false,\n };\n let released = false;\n batch(() => {\n record.registrations.add(registration);\n record.owner = registration;\n seed(record, registration);\n invalidate(record);\n });\n return Object.freeze({\n name: record.name,\n get released() {\n return released || disposed;\n },\n update(next: RegistrationOptions<ErrorValue>) {\n if (released || disposed) return;\n const prepared = prepareRegistration(record.path, next);\n const signature = rulesSignature(prepared.rules, {\n hashFunctions: prepared.rulesKey === undefined,\n });\n const validationChanged =\n registration.signature !== signature ||\n registration.options.rulesKey !== prepared.rulesKey ||\n !sameDependencies(registration.options.deps, prepared.deps) ||\n !samePaths(registration.options.dependsOn, prepared.dependsOn) ||\n registration.options.validationDelay !== prepared.validationDelay ||\n registration.options.validateTrigger !== prepared.validateTrigger ||\n registration.options.errorPolicy !== prepared.errorPolicy;\n const hasNewDefault =\n !registration.defaultConsidered &&\n Object.hasOwn(prepared, 'defaultValue');\n if (\n !hasNewDefault &&\n !validationChanged &&\n (registration.options.preserve ?? true) ===\n (prepared.preserve ?? true) &&\n registration.options.isEqual === prepared.isEqual\n ) {\n // Keep the latest closures/messages without invalidating equivalent rules.\n registration.options = prepared;\n return;\n }\n batch(() => {\n registration.options = prepared;\n registration.signature = signature;\n registration.order = ++order;\n // Only an ownership change invalidates; equivalent options pushed\n // after every React commit must not cause a publication loop.\n const revalidate =\n validationChanged && record.status !== 'unvalidated';\n if (record.owner !== registration || validationChanged)\n invalidate(record, revalidate);\n record.owner = registration;\n seed(record, registration);\n if (revalidate) void validateRecord(record, false);\n });\n },\n release(config: { deferValueRemoval?: boolean } = {}) {\n if (released || disposed) return;\n released = true;\n batch(() => {\n record.registrations.delete(registration);\n if (record.owner === registration) {\n record.owner = Array.from(record.registrations).sort(\n (a, b) => b.order - a.order,\n )[0];\n invalidate(record);\n }\n if (!record.registrations.size) {\n if (registration.options.preserve === false) {\n const removeValue = () => {\n const previous = values;\n values = writePath(values, record.path, undefined, true);\n record.touched = false;\n invalidateRelated(record.path, previous, { validate: 'auto' });\n if (!hasPath(defaults, record.path))\n records.delete(record.name);\n };\n if (config.deferValueRemoval) {\n // Unregister and abort immediately. Only destructive retention\n // cleanup waits one microtask, allowing Strict Mode's effect\n // replay to reconnect without losing the current value.\n const revision = record.validationRevision;\n queueMicrotask(() => {\n if (\n !disposed &&\n records.get(record.name) === record &&\n !record.registrations.size &&\n record.validationRevision === revision\n )\n batch(removeValue);\n });\n } else removeValue();\n }\n if (\n !hasPath(values, record.path) &&\n !hasPath(defaults, record.path)\n )\n records.delete(record.name);\n }\n });\n },\n });\n }\n\n function replaceDefaults(next: Partial<T>) {\n const entries = Object.keys(next);\n entries.forEach((name) => normalizePath(name));\n defaults = ownValue(next);\n for (const name of entries) ensure(name, false);\n for (const record of records.values()) record.fieldDefault = undefined;\n }\n\n function setDefaultValues(\n next: Partial<T>,\n config: { currentValues?: 'preserve' | 'replace' } = {},\n ) {\n const replace = config.currentValues === 'replace';\n batch(() => {\n replaceDefaults(next);\n if (replace) {\n values = defaults;\n for (const record of records.values()) {\n invalidate(record);\n record.touched = false;\n }\n event(Array.from(records.keys()), 'defaults');\n }\n });\n }\n\n function adoptDefaultValues(\n next: Partial<T>,\n config: {\n when?: 'untouched' | 'clean' | 'always';\n preserveDirty?: boolean;\n } = {},\n ) {\n const when = config.when ?? 'untouched';\n const preserveDirty = config.preserveDirty ?? false;\n batch(() => {\n // Retain edits at the narrowest guarded field path. This also protects a\n // nested edited leaf when the server replaces its containing object.\n const candidates = Array.from(records.values());\n const preserved = candidates\n .filter((record) => {\n // An implicitly tracked parent must not shield untouched siblings\n // when an explicit nested field is the actual edited control.\n if (\n !record.explicit &&\n candidates.some(\n (child) =>\n child.explicit &&\n child.path.length > record.path.length &&\n related(record.path, child.path),\n )\n )\n return false;\n return (\n (when === 'untouched' && record.touched) ||\n (when === 'clean' && dirty(record)) ||\n (preserveDirty && dirty(record))\n );\n })\n .map((record) => ({\n path: record.path,\n exists: hasPath(values, record.path),\n value: readPath(values, record.path),\n }));\n const previous = values;\n replaceDefaults(next);\n values = defaults;\n for (const saved of preserved.sort(\n (a, b) => a.path.length - b.path.length,\n )) {\n values = writePath(values, saved.path, saved.value, !saved.exists);\n }\n const names: string[] = [];\n for (const record of records.values()) {\n const changed = pathValueChanged(previous, values, record.path);\n if (\n changed ||\n dependencyChanged(record, previous) ||\n validationReadChanged(record, previous)\n )\n invalidate(record);\n if (changed) names.push(record.name);\n }\n event(names, 'adopt');\n });\n }\n\n function reset(config: { values?: Partial<T> } = {}) {\n batch(() => {\n if (Object.hasOwn(config, 'values')) replaceDefaults(config.values ?? {});\n values = defaults;\n const names = Array.from(records.keys());\n for (const record of records.values()) {\n invalidate(record);\n record.touched = false;\n if (!record.registrations.size && !hasPath(values, record.path))\n records.delete(record.name);\n }\n const previous = submission;\n submission = undefined;\n submitError = undefined;\n if (previous) cancellations.add(previous);\n event(names, 'reset');\n });\n }\n\n function setFieldErrors(path: FormPath, errors: readonly ErrorValue[]) {\n assertLive();\n const copied = errors.length ? Object.freeze([...errors]) : EMPTY_ERRORS;\n batch(() => {\n const record = ensure(path);\n const status = copied.length ? 'invalid' : 'valid';\n if (record.status === status && formValueEqual(record.errors, copied))\n return;\n invalidate(record);\n record.errors = copied;\n record.status = status;\n });\n }\n\n function startValidation(path: FormPath): ValidationToken<ErrorValue> {\n assertLive();\n const record = records.get(getFieldKey(path));\n if (!record?.registrations.size)\n throw new Error('Only active form fields can validate.');\n const controller = new AbortController();\n batch(() => {\n invalidate(record, true);\n record.validation = controller;\n record.status = 'validating';\n });\n const current = () =>\n !disposed &&\n record.validation === controller &&\n !controller.signal.aborted;\n return Object.freeze({\n signal: controller.signal,\n complete(errors: readonly ErrorValue[]) {\n if (!current()) return false;\n const copied = errors.length\n ? Object.freeze([...errors])\n : EMPTY_ERRORS;\n batch(() => {\n record.validation = undefined;\n record.reads = undefined;\n record.readsAll = false;\n record.errors = copied;\n record.status = copied.length ? 'invalid' : 'valid';\n });\n return true;\n },\n cancel() {\n if (current())\n batch(() => {\n invalidate(record, true);\n });\n },\n });\n }\n\n function startSubmission(): SubmissionToken | undefined {\n assertLive();\n if (submission) return undefined;\n const controller = new AbortController();\n batch(() => {\n submission = controller;\n submitError = undefined;\n });\n return Object.freeze({\n signal: controller.signal,\n complete(result?: { error: unknown }) {\n if (disposed || submission !== controller || controller.signal.aborted)\n return false;\n const error = result?.error;\n batch(() => {\n submission = undefined;\n submitError = error;\n });\n return true;\n },\n });\n }\n\n function validateRecord(\n record: FieldRecord<ErrorValue>,\n immediate: boolean,\n parentSignal?: AbortSignal,\n ): Promise<ModernFieldValidationResult<ErrorValue>> {\n const result = (errors: readonly ErrorValue[], stale = false) => ({\n name: record.name,\n errors,\n isValid: !stale && !errors.length,\n stale,\n });\n if (parentSignal?.aborted)\n return Promise.resolve(result(EMPTY_ERRORS, true));\n const config = record.owner?.options;\n const rules = config?.rules ?? [];\n const token = startValidation(record.path);\n const revision = record.validationRevision;\n if (token.signal.aborted || parentSignal?.aborted) {\n token.cancel();\n return Promise.resolve(result(EMPTY_ERRORS, true));\n }\n if (!rules.length) {\n record.reads = undefined;\n record.readsAll = false;\n const committed = token.complete(EMPTY_ERRORS);\n return Promise.resolve(\n result(\n EMPTY_ERRORS,\n !committed || record.validationRevision !== revision,\n ),\n );\n }\n const validationValues = values;\n const reads = new Map<string, readonly string[]>();\n record.reads = reads;\n record.readsAll = false;\n const value = readPath(validationValues, record.path);\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let settled = false;\n const finish = (errors: readonly ErrorValue[], stale: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n token.signal.removeEventListener('abort', abort);\n parentSignal?.removeEventListener('abort', cancel);\n resolve(result(errors, stale));\n };\n const abort = () => finish(EMPTY_ERRORS, true);\n const cancel = () => token.cancel();\n token.signal.addEventListener('abort', abort, { once: true });\n parentSignal?.addEventListener('abort', cancel, { once: true });\n const run = async () => {\n timer = undefined;\n const errors = await runRules(\n value,\n rules,\n {\n name: record.name,\n signal: token.signal,\n getValue: (path) => {\n const normalized = normalizePath(path);\n if (!settled && !token.signal.aborted) {\n reads.set(getFieldKey(normalized), normalized);\n if (pathValueChanged(validationValues, values, normalized))\n token.cancel();\n }\n return readPath(validationValues, normalized);\n },\n getValues: () => {\n if (!settled && !token.signal.aborted) {\n record.readsAll = true;\n if (values !== validationValues) token.cancel();\n }\n return validationValues as FormValues<T>;\n },\n },\n config?.errorPolicy ?? options.errorPolicy ?? 'first',\n );\n if (!settled) {\n const committed = token.complete(errors);\n finish(\n Object.freeze(errors),\n !committed ||\n record.validationRevision !== revision ||\n !!parentSignal?.aborted,\n );\n }\n };\n const delay = immediate ? 0 : config?.validationDelay ?? 0;\n if (delay > 0) timer = setTimeout(() => void run(), delay);\n else void run();\n });\n }\n\n function validate(\n paths?: readonly FormPath[],\n config: { immediate?: boolean; signal?: AbortSignal } = {},\n ): Promise<ModernValidationResult<ErrorValue>> {\n assertLive();\n const targets = paths\n ? Array.from(new Set(paths.map(getFieldKey))).map((key) =>\n records.get(key),\n )\n : Array.from(records.values());\n const active = targets.filter(\n (record): record is FieldRecord<ErrorValue> =>\n !!record?.registrations.size,\n );\n let runs: Promise<ModernFieldValidationResult<ErrorValue>>[] = [];\n let revisions: number[] = [];\n batch(() => {\n runs = active.map((record) =>\n validateRecord(record, config.immediate ?? true, config.signal),\n );\n // Capture before publishing: a synchronous subscriber can edit/reset.\n revisions = active.map((record) => record.validationRevision);\n });\n return Promise.all(runs).then((results) => {\n const fields = results.map((result, index) => {\n const record = active[index];\n return record.validationRevision === revisions[index] &&\n !!record.registrations.size &&\n !config.signal?.aborted\n ? result\n : { ...result, stale: true, isValid: false };\n });\n return {\n fields,\n stale: fields.some((field) => field.stale) || !!config.signal?.aborted,\n isValid: !!fields.length && fields.every((field) => field.isValid),\n };\n });\n }\n\n function resolveCallbacks(): FormCallbacks<T, ErrorValue> {\n return { ...options, ...binding?.callbacks };\n }\n\n function cancelSubmission() {\n batch(() => {\n if (submission) cancellations.add(submission);\n submission = undefined;\n });\n }\n\n function bindCallbacks(\n callbacks: FormCallbacks<T, ErrorValue>,\n ): CallbackBinding<T, ErrorValue> {\n assertLive();\n if (binding)\n developmentError(\n 'A second Form root owns this controller; the newest callback binding wins.',\n );\n const own = { callbacks: { ...callbacks } };\n binding = own;\n let released = false;\n return Object.freeze({\n update(next: FormCallbacks<T, ErrorValue>) {\n if (!released && !disposed && binding === own)\n own.callbacks = { ...next };\n },\n release() {\n if (released || disposed) return;\n released = true;\n if (binding === own) {\n binding = undefined;\n cancelSubmission();\n }\n },\n });\n }\n\n async function submit(\n config: { include?: 'active' | 'all' } = {},\n ): Promise<ModernSubmitResult<ErrorValue>> {\n const token = startSubmission();\n if (!token) return { status: 'ignored', reason: 'submitting' };\n const include = config.include ?? 'active';\n // Cancellation settles promptly even if a validator or callback ignores its signal.\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: ModernSubmitResult<ErrorValue>) => {\n if (settled) return;\n settled = true;\n token.signal.removeEventListener('abort', abort);\n resolve(result);\n };\n const abort = () => finish({ status: 'stale' });\n token.signal.addEventListener('abort', abort, { once: true });\n if (token.signal.aborted) {\n abort();\n return;\n }\n const run = async () => {\n const pendingValidation = validate(undefined, { signal: token.signal });\n const validatedRecords = Array.from(records.values()).filter(\n (record) => record.registrations.size,\n );\n const revisions = validatedRecords.map(\n (record) => record.validationRevision,\n );\n const validation = await pendingValidation;\n if (settled) return;\n const changedSinceValidation =\n validatedRecords.length !== validation.fields.length ||\n validatedRecords.length !==\n Array.from(records.values()).filter(\n (record) => record.registrations.size,\n ).length ||\n validatedRecords.some(\n (record, index) =>\n !record.registrations.size ||\n record.validationRevision !== revisions[index],\n );\n if (validation.stale || changedSinceValidation) {\n token.complete();\n finish({ status: 'stale' });\n return;\n }\n const callbacks = resolveCallbacks();\n let result: ModernSubmitResult<ErrorValue>;\n if (!validation.isValid) {\n const errors = Object.fromEntries(\n validation.fields\n .filter((field) => !field.isValid)\n .map((field) => [field.name, field.errors]),\n );\n result = { status: 'invalid', errors: Object.freeze(errors) };\n try {\n await callbacks.onSubmitFailed?.({\n status: 'invalid',\n errors: Object.freeze(errors),\n });\n } catch (error) {\n report(error);\n }\n if (!settled) {\n token.complete();\n finish(result);\n }\n return;\n }\n try {\n await callbacks.onSubmit?.(\n (include === 'all' ? values : activeValues()) as FormValues<T>,\n { include, signal: token.signal },\n );\n result = { status: 'submitted' };\n } catch (error) {\n if (settled) return;\n // Keep the guard active while failure callbacks run.\n batch(() => {\n submitError = error;\n });\n try {\n await callbacks.onSubmitFailed?.({ status: 'failed', error });\n } catch (failure) {\n report(failure);\n }\n result = { status: 'failed', error };\n }\n if (!settled) {\n token.complete(\n result.status === 'failed' ? { error: result.error } : undefined,\n );\n finish(result);\n }\n };\n void run().catch((error) => {\n if (!settled) {\n token.complete({ error });\n finish({ status: 'failed', error });\n }\n });\n });\n }\n\n function subscribe(listener: () => void) {\n assertLive();\n const entry = { notify: listener };\n listeners.add(entry);\n return () => {\n listeners.delete(entry);\n };\n }\n\n function dispose() {\n if (disposed) return;\n disposed = true;\n listeners.clear();\n binding = undefined;\n changes = [];\n pending = false;\n for (const record of records.values()) {\n record.registrations.clear();\n record.owner = undefined;\n invalidate(record);\n }\n const previous = submission;\n submission = undefined;\n if (previous) cancellations.add(previous);\n state = buildSnapshot();\n records.clear();\n cancelPending();\n }\n\n for (const name of Object.keys(values)) ensure(name, false);\n state = buildSnapshot();\n\n return Object.freeze({\n [FORM_BACKEND]: 'modern' as const,\n getSnapshot: () => state,\n getFieldSnapshot: (path: FormPath) => state.fields[getFieldKey(path)],\n getValue: (path: FormPath) => readPath(values, normalizePath(path)),\n getValues: () => values as FormValues<T>,\n getActiveValues: () => activeValues() as FormValues<T>,\n subscribe,\n subscribeSelector<Selected>(\n selector: (snapshot: FormState<T, ErrorValue>) => Selected,\n listener: (value: Selected, previous: Selected) => void,\n isEqual: (a: Selected, b: Selected) => boolean = Object.is,\n ) {\n let selected = selector(state);\n return subscribe(() => {\n const next = selector(state);\n if (isEqual(selected, next)) return;\n const previous = selected;\n selected = next;\n listener(next, previous);\n });\n },\n register,\n validate,\n submit,\n bindCallbacks,\n updateCallbacks(callbacks: FormCallbacks<T, ErrorValue>) {\n options.onSubmit = callbacks.onSubmit;\n options.onSubmitFailed = callbacks.onSubmitFailed;\n options.onValuesChange = callbacks.onValuesChange;\n },\n blur(path: FormPath) {\n const record = records.get(getFieldKey(path));\n if (!record?.registrations.size) return;\n batch(() => {\n record.touched = true;\n if ((record.owner?.options.validateTrigger ?? 'onBlur') === 'onBlur')\n void validateRecord(record, false);\n });\n },\n setValue,\n setValues,\n batch,\n setDefaultValues,\n adoptDefaultValues,\n reset,\n touch(path: FormPath, touched = true) {\n batch(() => {\n ensure(path).touched = touched;\n });\n },\n setFieldErrors,\n clearFieldErrors: (path: FormPath) => setFieldErrors(path, EMPTY_ERRORS),\n startValidation,\n startSubmission,\n setSubmitError(error: unknown) {\n batch(() => {\n submitError = error;\n });\n },\n clearSubmitError() {\n batch(() => {\n submitError = undefined;\n });\n },\n dispose,\n debug: Object.freeze({\n listenerCount: () => listeners.size,\n registrationCount: () =>\n Array.from(records.values()).reduce(\n (count, record) => count + record.registrations.size,\n 0,\n ),\n }),\n }) as FormStore<T, ErrorValue>;\n}\n"],"mappings":"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"}
|
|
@@ -31,13 +31,16 @@ interface FormState<T extends object, ErrorValue = unknown> {
|
|
|
31
31
|
readonly isInvalid: boolean;
|
|
32
32
|
readonly isValidating: boolean;
|
|
33
33
|
readonly isSubmitting: boolean;
|
|
34
|
+
/** Reset would clear edits, touched/validation state, or a submit error; false while submitting. */
|
|
35
|
+
readonly canReset: boolean;
|
|
34
36
|
readonly submitError: unknown;
|
|
35
37
|
readonly revision: number;
|
|
36
38
|
}
|
|
37
39
|
interface RegistrationOptions<ErrorValue = unknown> {
|
|
38
40
|
readonly rules?: readonly ModernValidationRule<ErrorValue>[];
|
|
41
|
+
/** Manual function revision, skipping source comparison. Declarative constraints are always compared. */
|
|
39
42
|
readonly rulesKey?: string;
|
|
40
|
-
/** Field paths
|
|
43
|
+
/** Field paths that trigger revalidation after this field has been validated. Declare conditional reads too. */
|
|
41
44
|
readonly dependsOn?: readonly FormPath[];
|
|
42
45
|
/** External validator inputs, compared by Object.is. */
|
|
43
46
|
readonly deps?: readonly unknown[];
|
|
@@ -73,8 +76,11 @@ interface ModernSubmitContext {
|
|
|
73
76
|
readonly signal: AbortSignal;
|
|
74
77
|
}
|
|
75
78
|
interface FormCallbacks<T extends object, ErrorValue = unknown> {
|
|
79
|
+
/** Form.useController commits the latest callback after each render. */
|
|
76
80
|
readonly onSubmit?: (values: FormValues<T>, context: ModernSubmitContext) => void | Promise<void>;
|
|
81
|
+
/** Form.useController commits the latest callback after each render. */
|
|
77
82
|
readonly onSubmitFailed?: (failure: ModernSubmitFailure<ErrorValue>) => void | Promise<void>;
|
|
83
|
+
/** Form.useController commits the latest callback after each render. */
|
|
78
84
|
readonly onValuesChange?: (values: FormValues<T>, change: FormChange) => void | Promise<void>;
|
|
79
85
|
}
|
|
80
86
|
type ModernSubmitFailure<ErrorValue = unknown> = {
|
|
@@ -108,9 +114,13 @@ type ModernSubmitResult<ErrorValue = unknown> = ModernSubmitFailure<ErrorValue>
|
|
|
108
114
|
status: 'submitted';
|
|
109
115
|
};
|
|
110
116
|
interface FormStoreOptions<T extends object, ErrorValue = unknown> extends FormCallbacks<T, ErrorValue> {
|
|
117
|
+
/** Initial default policy; later hook renders do not change it. Fields can override it. */
|
|
111
118
|
readonly errorPolicy?: 'first' | 'all';
|
|
119
|
+
/** Initial values only. Use setDefaultValues/adoptDefaultValues/reset to change them. */
|
|
112
120
|
readonly defaultValues?: Partial<T>;
|
|
121
|
+
/** Initial listener-error handler; later hook renders do not change it. */
|
|
113
122
|
readonly onListenerError?: (error: unknown) => void;
|
|
123
|
+
/** Initial development-error handler; later hook renders do not change it. */
|
|
114
124
|
readonly onDevelopmentError?: (message: string) => void;
|
|
115
125
|
}
|
|
116
126
|
/** Internal state token owned by the validation pipeline. */
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-b861864 | Cube Dev Team */
|
|
2
2
|
import { applyRule } from "../validation.js";
|
|
3
3
|
|
|
4
4
|
//#region src/components/form/Form/modern/validation.ts
|
|
5
|
-
/** Compare
|
|
6
|
-
function rulesSignature(rules = []) {
|
|
5
|
+
/** Compare constraints and function source; captures still need deps/rulesKey. */
|
|
6
|
+
function rulesSignature(rules = [], { hashFunctions = true } = {}) {
|
|
7
7
|
const seen = /* @__PURE__ */ new Set();
|
|
8
8
|
const signature = (value) => {
|
|
9
|
-
if (typeof value === "function") return "function";
|
|
9
|
+
if (typeof value === "function") return hashFunctions ? `function:${value.toString()}` : "function";
|
|
10
10
|
if (value instanceof RegExp) return `regexp:${value.source}/${value.flags}`;
|
|
11
11
|
if (!value || typeof value !== "object") return `${typeof value}:${String(value)}`;
|
|
12
12
|
if (seen.has(value)) return "cycle";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","names":[],"sources":["../../../../../src/components/form/Form/modern/validation.ts"],"sourcesContent":["import { applyRule } from '../validation';\n\nimport type { FormValues } from './read-types';\nimport type { FormPath } from './values';\n\nexport interface ModernValidationContext<\n T extends object = Record<string, unknown>,\n> {\n readonly name: string;\n readonly signal: AbortSignal;\n getValue(path: FormPath): unknown;\n getValues(): FormValues<T>;\n}\n\n/** Library-neutral: return an error, or throw/reject; undefined/null means success. */\nexport interface ModernValidationRule<ErrorValue = unknown> {\n required?: boolean;\n min?: number;\n max?: number;\n len?: number;\n pattern?: RegExp;\n type?: string;\n enum?: readonly unknown[];\n whitespace?: boolean;\n transform?: (value: any) => unknown;\n message?: ErrorValue;\n validator?: (\n rule: ModernValidationRule<ErrorValue>,\n value: any,\n context: ModernValidationContext<any>,\n ) => ErrorValue | void | Promise<ErrorValue | void>;\n}\n\n/** Compare
|
|
1
|
+
{"version":3,"file":"validation.js","names":[],"sources":["../../../../../src/components/form/Form/modern/validation.ts"],"sourcesContent":["import { applyRule } from '../validation';\n\nimport type { FormValues } from './read-types';\nimport type { FormPath } from './values';\n\nexport interface ModernValidationContext<\n T extends object = Record<string, unknown>,\n> {\n readonly name: string;\n readonly signal: AbortSignal;\n getValue(path: FormPath): unknown;\n getValues(): FormValues<T>;\n}\n\n/** Library-neutral: return an error, or throw/reject; undefined/null means success. */\nexport interface ModernValidationRule<ErrorValue = unknown> {\n required?: boolean;\n min?: number;\n max?: number;\n len?: number;\n pattern?: RegExp;\n type?: string;\n enum?: readonly unknown[];\n whitespace?: boolean;\n transform?: (value: any) => unknown;\n message?: ErrorValue;\n validator?: (\n rule: ModernValidationRule<ErrorValue>,\n value: any,\n context: ModernValidationContext<any>,\n ) => ErrorValue | void | Promise<ErrorValue | void>;\n}\n\n/** Compare constraints and function source; captures still need deps/rulesKey. */\nexport function rulesSignature<ErrorValue>(\n rules: readonly ModernValidationRule<ErrorValue>[] = [],\n { hashFunctions = true }: { hashFunctions?: boolean } = {},\n): string {\n const seen = new Set<object>();\n const signature = (value: unknown): string => {\n if (typeof value === 'function')\n return hashFunctions ? `function:${value.toString()}` : 'function';\n if (value instanceof RegExp) return `regexp:${value.source}/${value.flags}`;\n if (!value || typeof value !== 'object')\n return `${typeof value}:${String(value)}`;\n if (seen.has(value)) return 'cycle';\n seen.add(value);\n const result = JSON.stringify(\n Object.keys(value)\n .filter((key) => key !== 'message')\n .sort()\n .map((key) => [key, signature(Reflect.get(value, key))]),\n );\n seen.delete(value);\n return result;\n };\n return signature(rules);\n}\n\nexport async function runRules<ErrorValue>(\n value: unknown,\n rules: readonly ModernValidationRule<ErrorValue>[],\n context: ModernValidationContext<any>,\n policy: 'first' | 'all',\n): Promise<ErrorValue[]> {\n const errors: ErrorValue[] = [];\n for (const rule of rules) {\n if (context.signal.aborted) break;\n const { validator, transform, ...checks } = rule;\n try {\n const transformed = transform ? transform(value) : value;\n await applyRule(transformed, checks, undefined);\n if (context.signal.aborted) break;\n const result = await validator?.(rule, transformed, context);\n if (result !== undefined && result !== null && result !== '')\n errors.push(result as ErrorValue);\n } catch (error) {\n errors.push(\n ((error instanceof Error ? error.message || rule.message : error) ??\n rule.message ??\n (rule.required ? 'Required' : 'Invalid value')) as ErrorValue,\n );\n }\n if (errors.length && policy === 'first') break;\n }\n return errors;\n}\n"],"mappings":";;;;;AAkCA,SAAgB,eACd,QAAqD,EAAE,EACvD,EAAE,gBAAgB,SAAsC,EAAE,EAClD;CACR,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,aAAa,UAA2B;AAC5C,MAAI,OAAO,UAAU,WACnB,QAAO,gBAAgB,YAAY,MAAM,UAAU,KAAK;AAC1D,MAAI,iBAAiB,OAAQ,QAAO,UAAU,MAAM,OAAO,GAAG,MAAM;AACpE,MAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO,GAAG,OAAO,MAAM,GAAG,OAAO,MAAM;AACzC,MAAI,KAAK,IAAI,MAAM,CAAE,QAAO;AAC5B,OAAK,IAAI,MAAM;EACf,MAAM,SAAS,KAAK,UAClB,OAAO,KAAK,MAAM,CACf,QAAQ,QAAQ,QAAQ,UAAU,CAClC,MAAM,CACN,KAAK,QAAQ,CAAC,KAAK,UAAU,QAAQ,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAC3D;AACD,OAAK,OAAO,MAAM;AAClB,SAAO;;AAET,QAAO,UAAU,MAAM;;AAGzB,eAAsB,SACpB,OACA,OACA,SACA,QACuB;CACvB,MAAM,SAAuB,EAAE;AAC/B,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,QAAQ,OAAO,QAAS;EAC5B,MAAM,EAAE,WAAW,WAAW,GAAG,WAAW;AAC5C,MAAI;GACF,MAAM,cAAc,YAAY,UAAU,MAAM,GAAG;AACnD,SAAM,UAAU,aAAa,QAAQ,OAAU;AAC/C,OAAI,QAAQ,OAAO,QAAS;GAC5B,MAAM,SAAS,MAAM,YAAY,MAAM,aAAa,QAAQ;AAC5D,OAAI,WAAW,UAAa,WAAW,QAAQ,WAAW,GACxD,QAAO,KAAK,OAAqB;WAC5B,OAAO;AACd,UAAO,MACH,iBAAiB,QAAQ,MAAM,WAAW,KAAK,UAAU,UACzD,KAAK,YACJ,KAAK,WAAW,aAAa,iBACjC;;AAEH,MAAI,OAAO,UAAU,WAAW,QAAS;;AAE3C,QAAO"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-b861864 | Cube Dev Team */
|
|
2
2
|
//#region src/components/form/Form/modern/values.ts
|
|
3
3
|
const ownedContainers = /* @__PURE__ */ new WeakSet();
|
|
4
4
|
function freezeContainer(value) {
|
|
@@ -56,6 +56,16 @@ function normalizePath(path) {
|
|
|
56
56
|
function getFieldKey(path) {
|
|
57
57
|
return normalizePath(path).map((part) => part.replace(/\\/g, "\\\\").replace(/\./g, "\\.")).join(".");
|
|
58
58
|
}
|
|
59
|
+
/** Inverse of getFieldKey, for stable keys produced by this module. */
|
|
60
|
+
function getFieldPath(key) {
|
|
61
|
+
const path = [""];
|
|
62
|
+
for (let index = 0; index < key.length; index++) {
|
|
63
|
+
const part = key[index];
|
|
64
|
+
if (part === ".") path.push("");
|
|
65
|
+
else path[path.length - 1] += part === "\\" ? key[++index] : part;
|
|
66
|
+
}
|
|
67
|
+
return Object.freeze(path);
|
|
68
|
+
}
|
|
59
69
|
function readPath(root, path) {
|
|
60
70
|
let value = root;
|
|
61
71
|
for (const key of path) {
|
|
@@ -144,5 +154,5 @@ function sameMembers(a, b) {
|
|
|
144
154
|
}
|
|
145
155
|
|
|
146
156
|
//#endregion
|
|
147
|
-
export { createValueSnapshotter, defineValue, formValueEqual, freezeContainer, getFieldKey, hasPath, isPlainObject, normalizePath, pathValueChanged, readPath, readonlySet, sameMembers, writePath };
|
|
157
|
+
export { createValueSnapshotter, defineValue, formValueEqual, freezeContainer, getFieldKey, getFieldPath, hasPath, isPlainObject, normalizePath, pathValueChanged, readPath, readonlySet, sameMembers, writePath };
|
|
148
158
|
//# sourceMappingURL=values.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.js","names":[],"sources":["../../../../../src/components/form/Form/modern/values.ts"],"sourcesContent":["/** A string is a literal field name; tuples explicitly address nested values. */\nexport type FormPath = string | readonly (string | number)[];\n\ntype Container = Record<string, unknown> | unknown[];\n\n// Path copies and ingress copies share ownership, including across stores.\n// A WeakSet does not keep old snapshots alive after subscribers release them.\nconst ownedContainers = new WeakSet<object>();\n\nexport function freezeContainer<T extends object>(value: T): T {\n ownedContainers.add(value);\n return Object.freeze(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isContainer(value: unknown): value is Container {\n return Array.isArray(value) || isPlainObject(value);\n}\n\nfunction enumerableKeys(value: object): (string | symbol)[] {\n return Reflect.ownKeys(value).filter((key) =>\n Object.prototype.propertyIsEnumerable.call(value, key),\n );\n}\n\n/** Preserve the special non-enumerable descriptor of an array's length. */\nexport function defineValue(\n container: object,\n key: PropertyKey,\n value: unknown,\n) {\n Object.defineProperty(\n container,\n key,\n Array.isArray(container) && key === 'length'\n ? { value }\n : { value, enumerable: true, writable: true, configurable: true },\n );\n}\n\nfunction emptyCopy(value: Container): Container {\n return Array.isArray(value)\n ? new Array(value.length)\n : Object.create(Object.getPrototypeOf(value));\n}\n\nfunction copyContainer(value: Container): Container {\n const copy = emptyCopy(value);\n for (const key of enumerableKeys(value))\n defineValue(copy, key, Reflect.get(value, key));\n return copy;\n}\n\n/** The ADR's default dirty comparator: Object.is, then one structural level. */\nexport function formValueEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (!isContainer(a) || !isContainer(b)) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b) && a.length !== b.length)\n return false;\n const keys = enumerableKeys(a);\n return (\n keys.length === enumerableKeys(b).length &&\n keys.every(\n (key) =>\n Object.hasOwn(b, key) &&\n Object.is(Reflect.get(a, key), Reflect.get(b, key)),\n )\n );\n}\n\nexport function normalizePath(path: FormPath): readonly string[] {\n const parts = typeof path === 'string' ? [path] : path;\n if (!parts.length) throw new Error('A form field path must not be empty.');\n return Object.freeze(\n Array.from(parts, (part) => {\n if (\n typeof part !== 'string' &&\n (!Number.isSafeInteger(part) || part < 0)\n ) {\n throw new Error(\n 'A numeric form path segment must be a non-negative safe integer.',\n );\n }\n const key = String(part);\n if (key === '__proto__' || key === 'prototype' || key === 'constructor') {\n throw new Error(`Unsafe form path segment: ${key}`);\n }\n return key;\n }),\n );\n}\n\n/** Escaping keeps literal dotted names distinct from nested tuple paths. */\nexport function getFieldKey(path: FormPath): string {\n return normalizePath(path)\n .map((part) => part.replace(/\\\\/g, '\\\\\\\\').replace(/\\./g, '\\\\.'))\n .join('.');\n}\n\nexport function readPath(root: unknown, path: readonly string[]): unknown {\n let value = root;\n for (const key of path) {\n if (!isContainer(value) || !Object.hasOwn(value, key)) return undefined;\n value = Reflect.get(value, key);\n }\n return value;\n}\n\nexport function hasPath(root: unknown, path: readonly string[]): boolean {\n const parent = readPath(root, path.slice(0, -1));\n return isContainer(parent) && Object.hasOwn(parent, path[path.length - 1]);\n}\n\n/** Missing and explicitly undefined values are distinct form states. */\nexport function pathValueChanged(\n previous: object,\n next: object,\n path: readonly string[],\n): boolean {\n return (\n !Object.is(readPath(previous, path), readPath(next, path)) ||\n hasPath(previous, path) !== hasPath(next, path)\n );\n}\n\n/** Copy just the ancestor chain. Array deletion leaves indices in place. */\nexport function writePath(\n root: object,\n path: readonly string[],\n value: unknown,\n remove = false,\n): object {\n function write(current: unknown, depth: number): unknown {\n const key = path[depth];\n const container = isContainer(current) ? current : undefined;\n const exists = !!container && Object.hasOwn(container, key);\n const previous = exists ? Reflect.get(container!, key) : undefined;\n if (remove && !exists) return current;\n const last = depth === path.length - 1;\n const next = last ? value : write(previous, depth + 1);\n if (!remove && exists && Object.is(previous, next)) return current;\n if (remove && !last && Object.is(previous, next)) return current;\n // Array length cannot be removed, even for preserve:false registrations.\n if (remove && last && Array.isArray(container) && key === 'length')\n return current;\n const copy: Container = container\n ? copyContainer(container)\n : depth > 0 && /^(0|[1-9]\\d*)$/.test(key)\n ? []\n : {};\n if (remove && last) Reflect.deleteProperty(copy, key);\n else defineValue(copy, key, next);\n return freezeContainer(copy);\n }\n return write(root, 0) as object;\n}\n\n/**\n * Own plain data without freezing caller-owned objects. Non-plain values (dates,\n * files, ReactNode errors, etc.) are opaque and must be treated as immutable.\n * Reusing an input reference means reusing its value, just like React state.\n */\nexport function createValueSnapshotter() {\n const copies = new WeakMap<object, unknown>();\n function snapshot<T>(value: T): T {\n // Commit the ownership cache only after the entire graph copied. A throwing\n // getter must not leave an incomplete, mutable snapshot cached for a retry.\n const pending = new WeakMap<object, object>();\n const entries: [object, object][] = [];\n function clone(input: unknown): unknown {\n if (!isContainer(input) || ownedContainers.has(input)) return input;\n if (copies.has(input)) return copies.get(input);\n if (pending.has(input)) return pending.get(input);\n const copy = emptyCopy(input);\n pending.set(input, copy);\n entries.push([input, copy]);\n for (const key of enumerableKeys(input)) {\n defineValue(copy, key, clone(Reflect.get(input, key)));\n }\n return copy;\n }\n const result = clone(value);\n for (const [input, copy] of entries) {\n freezeContainer(copy);\n copies.set(input, copy);\n }\n return result as T;\n }\n return snapshot;\n}\n\n/** Object.freeze(new Set()) still permits add/delete. Hide the writable set. */\nexport function readonlySet<T>(values: Iterable<T>): ReadonlySet<T> {\n const set = new Set(values);\n const view: ReadonlySet<T> = Object.freeze({\n get size() {\n return set.size;\n },\n has: (value: T) => set.has(value),\n entries: () => set.entries(),\n keys: () => set.keys(),\n values: () => set.values(),\n [Symbol.iterator]: () => set[Symbol.iterator](),\n forEach: (\n callback: (value: T, key: T, set: ReadonlySet<T>) => void,\n thisArg?: unknown,\n ) => {\n set.forEach((value) => callback.call(thisArg, value, value, view));\n },\n });\n return view;\n}\n\nexport function sameMembers<T>(a: ReadonlySet<T>, b: ReadonlySet<T>): boolean {\n return a.size === b.size && Array.from(a).every((value) => b.has(value));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"values.js","names":[],"sources":["../../../../../src/components/form/Form/modern/values.ts"],"sourcesContent":["/** A string is a literal field name; tuples explicitly address nested values. */\nexport type FormPath = string | readonly (string | number)[];\n\ntype Container = Record<string, unknown> | unknown[];\n\n// Path copies and ingress copies share ownership, including across stores.\n// A WeakSet does not keep old snapshots alive after subscribers release them.\nconst ownedContainers = new WeakSet<object>();\n\nexport function freezeContainer<T extends object>(value: T): T {\n ownedContainers.add(value);\n return Object.freeze(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isContainer(value: unknown): value is Container {\n return Array.isArray(value) || isPlainObject(value);\n}\n\nfunction enumerableKeys(value: object): (string | symbol)[] {\n return Reflect.ownKeys(value).filter((key) =>\n Object.prototype.propertyIsEnumerable.call(value, key),\n );\n}\n\n/** Preserve the special non-enumerable descriptor of an array's length. */\nexport function defineValue(\n container: object,\n key: PropertyKey,\n value: unknown,\n) {\n Object.defineProperty(\n container,\n key,\n Array.isArray(container) && key === 'length'\n ? { value }\n : { value, enumerable: true, writable: true, configurable: true },\n );\n}\n\nfunction emptyCopy(value: Container): Container {\n return Array.isArray(value)\n ? new Array(value.length)\n : Object.create(Object.getPrototypeOf(value));\n}\n\nfunction copyContainer(value: Container): Container {\n const copy = emptyCopy(value);\n for (const key of enumerableKeys(value))\n defineValue(copy, key, Reflect.get(value, key));\n return copy;\n}\n\n/** The ADR's default dirty comparator: Object.is, then one structural level. */\nexport function formValueEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (!isContainer(a) || !isContainer(b)) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b) && a.length !== b.length)\n return false;\n const keys = enumerableKeys(a);\n return (\n keys.length === enumerableKeys(b).length &&\n keys.every(\n (key) =>\n Object.hasOwn(b, key) &&\n Object.is(Reflect.get(a, key), Reflect.get(b, key)),\n )\n );\n}\n\nexport function normalizePath(path: FormPath): readonly string[] {\n const parts = typeof path === 'string' ? [path] : path;\n if (!parts.length) throw new Error('A form field path must not be empty.');\n return Object.freeze(\n Array.from(parts, (part) => {\n if (\n typeof part !== 'string' &&\n (!Number.isSafeInteger(part) || part < 0)\n ) {\n throw new Error(\n 'A numeric form path segment must be a non-negative safe integer.',\n );\n }\n const key = String(part);\n if (key === '__proto__' || key === 'prototype' || key === 'constructor') {\n throw new Error(`Unsafe form path segment: ${key}`);\n }\n return key;\n }),\n );\n}\n\n/** Escaping keeps literal dotted names distinct from nested tuple paths. */\nexport function getFieldKey(path: FormPath): string {\n return normalizePath(path)\n .map((part) => part.replace(/\\\\/g, '\\\\\\\\').replace(/\\./g, '\\\\.'))\n .join('.');\n}\n\n/** Inverse of getFieldKey, for stable keys produced by this module. */\nexport function getFieldPath(key: string): readonly string[] {\n const path = [''];\n for (let index = 0; index < key.length; index++) {\n const part = key[index];\n if (part === '.') path.push('');\n else path[path.length - 1] += part === '\\\\' ? key[++index] : part;\n }\n return Object.freeze(path);\n}\n\nexport function readPath(root: unknown, path: readonly string[]): unknown {\n let value = root;\n for (const key of path) {\n if (!isContainer(value) || !Object.hasOwn(value, key)) return undefined;\n value = Reflect.get(value, key);\n }\n return value;\n}\n\nexport function hasPath(root: unknown, path: readonly string[]): boolean {\n const parent = readPath(root, path.slice(0, -1));\n return isContainer(parent) && Object.hasOwn(parent, path[path.length - 1]);\n}\n\n/** Missing and explicitly undefined values are distinct form states. */\nexport function pathValueChanged(\n previous: object,\n next: object,\n path: readonly string[],\n): boolean {\n return (\n !Object.is(readPath(previous, path), readPath(next, path)) ||\n hasPath(previous, path) !== hasPath(next, path)\n );\n}\n\n/** Copy just the ancestor chain. Array deletion leaves indices in place. */\nexport function writePath(\n root: object,\n path: readonly string[],\n value: unknown,\n remove = false,\n): object {\n function write(current: unknown, depth: number): unknown {\n const key = path[depth];\n const container = isContainer(current) ? current : undefined;\n const exists = !!container && Object.hasOwn(container, key);\n const previous = exists ? Reflect.get(container!, key) : undefined;\n if (remove && !exists) return current;\n const last = depth === path.length - 1;\n const next = last ? value : write(previous, depth + 1);\n if (!remove && exists && Object.is(previous, next)) return current;\n if (remove && !last && Object.is(previous, next)) return current;\n // Array length cannot be removed, even for preserve:false registrations.\n if (remove && last && Array.isArray(container) && key === 'length')\n return current;\n const copy: Container = container\n ? copyContainer(container)\n : depth > 0 && /^(0|[1-9]\\d*)$/.test(key)\n ? []\n : {};\n if (remove && last) Reflect.deleteProperty(copy, key);\n else defineValue(copy, key, next);\n return freezeContainer(copy);\n }\n return write(root, 0) as object;\n}\n\n/**\n * Own plain data without freezing caller-owned objects. Non-plain values (dates,\n * files, ReactNode errors, etc.) are opaque and must be treated as immutable.\n * Reusing an input reference means reusing its value, just like React state.\n */\nexport function createValueSnapshotter() {\n const copies = new WeakMap<object, unknown>();\n function snapshot<T>(value: T): T {\n // Commit the ownership cache only after the entire graph copied. A throwing\n // getter must not leave an incomplete, mutable snapshot cached for a retry.\n const pending = new WeakMap<object, object>();\n const entries: [object, object][] = [];\n function clone(input: unknown): unknown {\n if (!isContainer(input) || ownedContainers.has(input)) return input;\n if (copies.has(input)) return copies.get(input);\n if (pending.has(input)) return pending.get(input);\n const copy = emptyCopy(input);\n pending.set(input, copy);\n entries.push([input, copy]);\n for (const key of enumerableKeys(input)) {\n defineValue(copy, key, clone(Reflect.get(input, key)));\n }\n return copy;\n }\n const result = clone(value);\n for (const [input, copy] of entries) {\n freezeContainer(copy);\n copies.set(input, copy);\n }\n return result as T;\n }\n return snapshot;\n}\n\n/** Object.freeze(new Set()) still permits add/delete. Hide the writable set. */\nexport function readonlySet<T>(values: Iterable<T>): ReadonlySet<T> {\n const set = new Set(values);\n const view: ReadonlySet<T> = Object.freeze({\n get size() {\n return set.size;\n },\n has: (value: T) => set.has(value),\n entries: () => set.entries(),\n keys: () => set.keys(),\n values: () => set.values(),\n [Symbol.iterator]: () => set[Symbol.iterator](),\n forEach: (\n callback: (value: T, key: T, set: ReadonlySet<T>) => void,\n thisArg?: unknown,\n ) => {\n set.forEach((value) => callback.call(thisArg, value, value, view));\n },\n });\n return view;\n}\n\nexport function sameMembers<T>(a: ReadonlySet<T>, b: ReadonlySet<T>): boolean {\n return a.size === b.size && Array.from(a).every((value) => b.has(value));\n}\n"],"mappings":"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"}
|