@cube-dev/ui-kit 0.0.0-canary-1b2d462 → 0.0.0-canary-740dafc
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.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.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.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.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 +2 -2
- package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js.map +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/listNavigation.js +1 -1
- 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.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/backend.d.ts +1 -1
- package/dist/components/form/Form/backend.js +3 -3
- package/dist/components/form/Form/backend.js.map +1 -1
- package/dist/components/form/Form/index.js +1 -1
- 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 +34 -0
- package/dist/components/form/Form/modern/field-binding.js.map +1 -0
- package/dist/components/form/Form/modern/react.js +1 -1
- package/dist/components/form/Form/modern/store.js +14 -5
- package/dist/components/form/Form/modern/store.js.map +1 -1
- package/dist/components/form/Form/modern/types.d.ts +4 -1
- package/dist/components/form/Form/modern/values.js +1 -1
- package/dist/components/form/Form/use-field/types.d.ts +4 -1
- package/dist/components/form/Form/use-field/use-field-binding.js +93 -0
- package/dist/components/form/Form/use-field/use-field-binding.js.map +1 -0
- package/dist/components/form/Form/use-field/use-field-props.js +17 -10
- package/dist/components/form/Form/use-field/use-field-props.js.map +1 -1
- package/dist/components/form/Form/use-field/use-field.js +5 -4
- package/dist/components/form/Form/use-field/use-field.js.map +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.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- 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/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.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.js +1 -1
- 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 -0
- 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/Usage.md +1 -1
- package/docs/components/form/Form.md +4 -1
- package/package.json +1 -1
|
@@ -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-740dafc | Cube Dev Team */
|
|
2
2
|
import { FORM_BACKEND, isModernFormController } from "../backend.js";
|
|
3
3
|
import { createFormStore } from "./store.js";
|
|
4
4
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-740dafc | Cube Dev Team */
|
|
2
|
+
import { getFieldKey } from "./values.js";
|
|
3
|
+
import { getControllerInternals } from "./controller.js";
|
|
4
|
+
|
|
5
|
+
//#region src/components/form/Form/modern/field-binding.ts
|
|
6
|
+
function sameFieldView(a, b) {
|
|
7
|
+
return Object.is(a?.value, b?.value) && a?.errors === b?.errors && a?.status === b?.status;
|
|
8
|
+
}
|
|
9
|
+
function createModernFieldBackend(form, name) {
|
|
10
|
+
const { store, getServerSnapshot } = getControllerInternals(form, `The "${name}" field`);
|
|
11
|
+
const key = getFieldKey(name);
|
|
12
|
+
return {
|
|
13
|
+
subscribe: store.subscribe,
|
|
14
|
+
getSnapshot: () => store.getFieldSnapshot(name),
|
|
15
|
+
getServerSnapshot: () => getServerSnapshot().fields[key],
|
|
16
|
+
register: () => store.register(name),
|
|
17
|
+
change: (value, dontTouch) => store.setValue(name, value, {
|
|
18
|
+
source: "user",
|
|
19
|
+
touch: !dontTouch
|
|
20
|
+
}),
|
|
21
|
+
blur: () => store.touch(name)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function fieldRegistrationOptions(props) {
|
|
25
|
+
return {
|
|
26
|
+
...Object.hasOwn(props, "defaultValue") ? { defaultValue: props.defaultValue } : {},
|
|
27
|
+
preserve: props.preserve,
|
|
28
|
+
isEqual: props.isEqual
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
export { createModernFieldBackend, fieldRegistrationOptions, sameFieldView };
|
|
34
|
+
//# sourceMappingURL=field-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-binding.js","names":[],"sources":["../../../../../src/components/form/Form/modern/field-binding.ts"],"sourcesContent":["import { getControllerInternals } from './controller';\nimport { getFieldKey } from './values';\n\nimport type { ReactNode } from 'react';\nimport type { ValidateTrigger } from '../../../../shared/form';\nimport type { FormController } from './controller';\nimport type {\n FieldState,\n RegistrationOptions,\n RegistrationToken,\n} from './types';\n\n/** The only state a bound input renders; metadata stays in selector subscribers. */\nexport type FieldView = Pick<\n FieldState<ReactNode>,\n 'value' | 'errors' | 'status'\n>;\n\nexport interface FieldBackendHandle {\n subscribe(listener: () => void): () => void;\n getSnapshot(): FieldView | undefined;\n getServerSnapshot(): FieldView | undefined;\n register(): RegistrationToken | undefined;\n change(value: unknown, dontTouch: boolean, trigger: ValidateTrigger): void;\n blur(): void;\n}\n\nexport function sameFieldView(a?: FieldView, b?: FieldView) {\n return (\n Object.is(a?.value, b?.value) &&\n a?.errors === b?.errors &&\n a?.status === b?.status\n );\n}\n\nexport function createModernFieldBackend(\n form: FormController<any>,\n name: string,\n): FieldBackendHandle {\n const { store, getServerSnapshot } = getControllerInternals(\n form,\n `The \"${name}\" field`,\n );\n const key = getFieldKey(name);\n return {\n subscribe: store.subscribe,\n getSnapshot: () => store.getFieldSnapshot(name),\n getServerSnapshot: () => getServerSnapshot().fields[key],\n register: () => store.register(name),\n change: (value, dontTouch) =>\n store.setValue(name, value, { source: 'user', touch: !dontTouch }),\n blur: () => store.touch(name),\n };\n}\n\nexport function fieldRegistrationOptions(props: {\n defaultValue?: unknown;\n preserve?: boolean;\n isEqual?: (a: unknown, b: unknown) => boolean;\n}): RegistrationOptions {\n return {\n ...(Object.hasOwn(props, 'defaultValue')\n ? { defaultValue: props.defaultValue }\n : {}),\n preserve: props.preserve,\n isEqual: props.isEqual,\n };\n}\n"],"mappings":";;;;;AA2BA,SAAgB,cAAc,GAAe,GAAe;AAC1D,QACE,OAAO,GAAG,GAAG,OAAO,GAAG,MAAM,IAC7B,GAAG,WAAW,GAAG,UACjB,GAAG,WAAW,GAAG;;AAIrB,SAAgB,yBACd,MACA,MACoB;CACpB,MAAM,EAAE,OAAO,sBAAsB,uBACnC,MACA,QAAQ,KAAK,SACd;CACD,MAAM,MAAM,YAAY,KAAK;AAC7B,QAAO;EACL,WAAW,MAAM;EACjB,mBAAmB,MAAM,iBAAiB,KAAK;EAC/C,yBAAyB,mBAAmB,CAAC,OAAO;EACpD,gBAAgB,MAAM,SAAS,KAAK;EACpC,SAAS,OAAO,cACd,MAAM,SAAS,MAAM,OAAO;GAAE,QAAQ;GAAQ,OAAO,CAAC;GAAW,CAAC;EACpE,YAAY,MAAM,MAAM,KAAK;EAC9B;;AAGH,SAAgB,yBAAyB,OAIjB;AACtB,QAAO;EACL,GAAI,OAAO,OAAO,OAAO,eAAe,GACpC,EAAE,cAAc,MAAM,cAAc,GACpC,EAAE;EACN,UAAU,MAAM;EAChB,SAAS,MAAM;EAChB"}
|
|
@@ -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-740dafc | Cube Dev Team */
|
|
2
2
|
import { ModernControllerContext } from "./context.js";
|
|
3
3
|
import { createFormController, getControllerInternals } from "./controller.js";
|
|
4
4
|
import { useContext, useState } from "react";
|
|
@@ -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-740dafc | Cube Dev Team */
|
|
2
2
|
import { FORM_BACKEND } from "../backend.js";
|
|
3
3
|
import { createValueSnapshotter, defineValue, formValueEqual, freezeContainer, getFieldKey, hasPath, isPlainObject, normalizePath, readPath, readonlySet, sameMembers, writePath } from "./values.js";
|
|
4
4
|
|
|
@@ -340,7 +340,7 @@ function createFormStore(options = {}) {
|
|
|
340
340
|
seed(record, registration);
|
|
341
341
|
});
|
|
342
342
|
},
|
|
343
|
-
release() {
|
|
343
|
+
release(config = {}) {
|
|
344
344
|
if (released || disposed) return;
|
|
345
345
|
released = true;
|
|
346
346
|
batch(() => {
|
|
@@ -351,9 +351,18 @@ function createFormStore(options = {}) {
|
|
|
351
351
|
}
|
|
352
352
|
if (!record.registrations.size) {
|
|
353
353
|
if (registration.options.preserve === false) {
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
354
|
+
const removeValue = () => {
|
|
355
|
+
values = writePath(values, record.path, void 0, true);
|
|
356
|
+
record.touched = false;
|
|
357
|
+
for (const other of records.values()) if (other !== record && related(other.path, record.path)) invalidate(other);
|
|
358
|
+
if (!hasPath(defaults, record.path)) records.delete(record.name);
|
|
359
|
+
};
|
|
360
|
+
if (config.deferValueRemoval) {
|
|
361
|
+
const revision = record.validationRevision;
|
|
362
|
+
queueMicrotask(() => {
|
|
363
|
+
if (!disposed && records.get(record.name) === record && !record.registrations.size && record.validationRevision === revision) batch(removeValue);
|
|
364
|
+
});
|
|
365
|
+
} else removeValue();
|
|
357
366
|
}
|
|
358
367
|
if (!hasPath(values, record.path) && !hasPath(defaults, record.path)) records.delete(record.name);
|
|
359
368
|
}
|
|
@@ -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 {\n createValueSnapshotter,\n defineValue,\n formValueEqual,\n freezeContainer,\n getFieldKey,\n hasPath,\n isPlainObject,\n normalizePath,\n readonlySet,\n readPath,\n sameMembers,\n writePath,\n} from './values';\n\nimport type {\n FieldState,\n FormChange,\n FormState,\n FormStore,\n FormStoreOptions,\n RegistrationOptions,\n RegistrationToken,\n SetValueOptions,\n SubmissionToken,\n ValidationToken,\n} from './types';\nimport type { FormPath } from './values';\n\ninterface Registration {\n options: RegistrationOptions;\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>;\n owner?: Registration;\n fieldDefault?: { value: unknown };\n touched: boolean;\n errors: readonly ErrorValue[];\n status: FieldState['status'];\n validationRevision: number;\n validation?: AbortController;\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\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 * Phase 4's framework-neutral command layer. Not exported from the package.\n * React registration, root callbacks, rule execution and submit orchestration\n * are deliberately separate later phases; their state transitions live here.\n */\nexport function createFormStore<\n T extends object = Record<string, unknown>,\n ErrorValue = unknown,\n>(options: FormStoreOptions<T> = {}): FormStore<T, ErrorValue> {\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 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 Partial<T>,\n defaultValues: defaults as Partial<T>,\n activeValues: EMPTY_OBJECT,\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 invalidateRelated(path: readonly string[], previous: object) {\n for (const record of records.values()) {\n if (\n related(path, record.path) ||\n !Object.is(\n readPath(previous, record.path),\n readPath(values, record.path),\n ) ||\n hasPath(previous, record.path) !== hasPath(values, record.path)\n )\n invalidate(record);\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 Partial<T>,\n defaultValues: defaults as Partial<T>,\n activeValues: activeValues() as Partial<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 && options.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 = options.onValuesChange(published.values, change);\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);\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,\n ): RegistrationOptions {\n const prepared = { ...config };\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(record: FieldRecord<ErrorValue>, registration: Registration) {\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 = {},\n ): RegistrationToken {\n assertLive();\n const normalized = normalizePath(path);\n const prepared = prepareRegistration(normalized, config);\n const record = ensure(normalized);\n const registration: Registration = {\n options: prepared,\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) {\n if (released || disposed) return;\n const prepared = prepareRegistration(record.path, next);\n const hasNewDefault =\n !registration.defaultConsidered &&\n Object.hasOwn(prepared, 'defaultValue');\n if (\n !hasNewDefault &&\n (registration.options.preserve ?? true) ===\n (prepared.preserve ?? true) &&\n registration.options.isEqual === prepared.isEqual\n )\n return;\n batch(() => {\n registration.options = prepared;\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 if (record.owner !== registration) invalidate(record);\n record.owner = registration;\n seed(record, registration);\n });\n },\n release() {\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 values = writePath(values, record.path, undefined, true);\n record.touched = false;\n for (const other of records.values()) {\n if (other !== record && related(other.path, record.path))\n invalidate(other);\n }\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 if (\n !Object.is(\n readPath(previous, record.path),\n readPath(values, record.path),\n ) ||\n hasPath(previous, record.path) !== hasPath(values, record.path)\n ) {\n invalidate(record);\n names.push(record.name);\n }\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 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 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 Partial<T>,\n getActiveValues: () => activeValues() as Partial<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 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":";;;;;AAoDA,MAAM,eAAe,OAAO,OAAO,EAAE,CAAC;AACtC,MAAM,eAAe,OAAO,OAAO,EAAE,CAAC;AACtC,MAAM,eAAe,OAAO,OAAO,OAAO,OAAO,KAAK,CAAC;AAIvD,SAAS,QAAQ,GAAsB,GAA+B;AACpE,QAAO,EACJ,MAAM,GAAG,KAAK,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CACtC,OAAO,KAAK,UAAU,QAAQ,EAAE,OAAO;;;AAS5C,SAAS,cACP,OACA,MACA,UACS;AACT,KAAI,KAAK,SAAU,QAAO;CAC1B,MAAM,SAA8C,MAAM,QAAQ,MAAM,GACpE,EAAE,GACF,EAAE;AACN,KAAI,cAAc,MAAM,IAAI,MAAM,QAAQ,MAAM,CAC9C,MAAK,MAAM,CAAC,KAAK,UAAU,KAAK,UAAU;AACxC,MAAI,CAAC,OAAO,OAAO,OAAO,IAAI,CAAE;AAChC,cACE,QACA,KACA,cACE,QAAQ,IAAI,OAAO,IAAI,EACvB,OACA,SAAS,UAAU,CAAC,IAAI,CAAC,CAC1B,CACF;;AAGL,QAAO,eAAe,QAAQ,SAAS,GAAG,WAAW,gBAAgB,OAAO;;;;;;;AAQ9E,SAAgB,gBAGd,UAA+B,EAAE,EAA4B;CAC7D,MAAM,WAAW,wBAAwB;CACzC,MAAM,0BAAU,IAAI,KAAsC;CAE1D,MAAM,4BAAY,IAAI,KAA6B;CACnD,IAAI,SAAiB,SAAS,QAAQ,iBAAiB,EAAE,CAAC;CAC1D,IAAI,WAAW;CACf,IAAI;CACJ,IAAI;CACJ,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,IAAI,YAAY;CAChB,IAAI,WAAW;CACf,IAAI,UAAU;CACd,IAAI,UAAwB,EAAE;CAC9B,MAAM,gCAAgB,IAAI,KAAsB;CAEhD,IAAI,QAAkC,OAAO,OAAO;EAC1C;EACR,eAAe;EACf,cAAc;EACd,QAAQ;EACR,aAAa,YAAoB,EAAE,CAAC;EACpC,eAAe,YAAoB,EAAE,CAAC;EACtC,SAAS;EACT,WAAW;EACX,SAAS;EACT,WAAW;EACX,cAAc;EACd,cAAc;EACd,aAAa;EACb,UAAU;EACX,CAAC;CAEF,SAAS,aAAa;AACpB,MAAI,SAAU,OAAM,IAAI,MAAM,2CAA2C;;CAG3E,SAAS,OAAO,OAAgB;AAC9B,MAAI;AACF,OAAI,QAAQ,gBAAiB,SAAQ,gBAAgB,MAAM;OACtD,SAAQ,MAAM,gCAAgC,MAAM;WAClD,aAAa;AAEpB,WAAQ,MAAM,sCAAsC,YAAY;;;CAIpE,SAAS,iBAAiB,SAAiB;AACzC,+BAA6B,aAAc;AAC3C,MAAI;AACF,OAAI,QAAQ,mBAAoB,SAAQ,mBAAmB,QAAQ;OAC9D,SAAQ,MAAM,gBAAgB,UAAU;WACtC,OAAO;AACd,UAAO,MAAM;;;CAIjB,SAAS,OAAO,MAAgB,WAAW,MAA+B;EACxE,MAAM,aAAa,cAAc,KAAK;EACtC,MAAM,OAAO,YAAY,WAAW;EACpC,IAAI,SAAS,QAAQ,IAAI,KAAK;AAC9B,MAAI,CAAC,QAAQ;AACX,YAAS;IACP;IACA,MAAM;IACN;IACA,+BAAe,IAAI,KAAK;IACxB,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,oBAAoB;IACrB;AACD,WAAQ,IAAI,MAAM,OAAO;;AAE3B,SAAO,aAAa;AACpB,SAAO;;CAGT,SAAS,MAAM,QAA0C;AACvD,SACE,QAAQ,QAAQ,OAAO,KAAK,IAC5B,EAAE,OAAO,OAAO,QAAQ,WAAW,gBACjC,SAAS,QAAQ,OAAO,KAAK,EAC7B,SAAS,UAAU,OAAO,KAAK,CAChC;;CAIL,SAAS,WAAW,QAAiC,aAAa,OAAO;EACvE,MAAM,aAAa,OAAO;AAC1B,SAAO,aAAa;AACpB,SAAO;AACP,SAAO,SAAS;AAChB,MAAI,CAAC,WAAY,QAAO,SAAS;AAIjC,MAAI,WAAY,eAAc,IAAI,WAAW;;CAG/C,SAAS,gBAAgB;AACvB,OAAK,MAAM,cAAc,MAAM,KAAK,cAAc,EAAE;AAClD,iBAAc,OAAO,WAAW;AAChC,cAAW,OAAO;;;CAItB,SAAS,kBAAkB,MAAyB,UAAkB;AACpE,OAAK,MAAM,UAAU,QAAQ,QAAQ,CACnC,KACE,QAAQ,MAAM,OAAO,KAAK,IAC1B,CAAC,OAAO,GACN,SAAS,UAAU,OAAO,KAAK,EAC/B,SAAS,QAAQ,OAAO,KAAK,CAC9B,IACD,QAAQ,UAAU,OAAO,KAAK,KAAK,QAAQ,QAAQ,OAAO,KAAK,CAE/D,YAAW,OAAO;;CAIxB,SAAS,eAAuB;EAC9B,MAAM,OAAmB;GAAE,UAAU;GAAO,0BAAU,IAAI,KAAK;GAAE;AAGjE,OAAK,MAAM,UAAU,QAAQ,QAAQ,EAAE;AACrC,OAAI,CAAC,OAAO,cAAc,QAAQ,CAAC,QAAQ,QAAQ,OAAO,KAAK,CAAE;GACjE,IAAI,OAAO;AACX,QAAK,MAAM,OAAO,OAAO,MAAM;IAC7B,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI;AAClC,QAAI,CAAC,OAAO;AACV,aAAQ;MAAE,UAAU;MAAO,0BAAU,IAAI,KAAK;MAAE;AAChD,UAAK,SAAS,IAAI,KAAK,MAAM;;AAE/B,WAAO;;AAET,QAAK,WAAW;;AAElB,SAAO,cAAc,QAAQ,MAAM,MAAM,aAAa;;CAGxD,SAAS,gBAA0C;EACjD,MAAM,SAAiD,OAAO,OAAO,KAAK;EAC1E,MAAM,6BAAa,IAAI,KAAa;EACpC,MAAM,+BAAe,IAAI,KAAa;EACtC,IAAI,cAAc;EAClB,IAAI,aAAa;EACjB,IAAI,UAAU;EACd,IAAI,aAAa;AACjB,OAAK,MAAM,UAAU,QAAQ,QAAQ,EAAE;GACrC,MAAM,QAAgC;IACpC,MAAM,OAAO;IACb,OAAO,SAAS,QAAQ,OAAO,KAAK;IACpC,cAAc,SAAS,UAAU,OAAO,KAAK;IAC7C,QAAQ,OAAO;IACf,QAAQ,OAAO;IACf,SAAS,OAAO;IAChB,OAAO,MAAM,OAAO;IACpB,QAAQ,OAAO,cAAc,OAAO;IACpC,mBAAmB,OAAO,cAAc;IACxC,oBAAoB,OAAO;IAC5B;GACD,MAAM,WAAW,MAAM,OAAO,OAAO;AACrC,UAAO,eAAe,QAAQ,OAAO,MAAM;IACzC,OAAO,eAAe,OAAO,SAAS,GAClC,WACA,OAAO,OAAO,MAAM;IACxB,YAAY;IACb,CAAC;AACF,OAAI,MAAM,MAAO,YAAW,IAAI,OAAO,KAAK;AAC5C,OAAI,MAAM,QAAS,cAAa,IAAI,OAAO,KAAK;AAChD,OAAI,MAAM,QAAQ;AAChB;AACA,QAAI,MAAM,WAAW,QAAS;AAC9B,gBAAY,MAAM,WAAW;AAC7B,mBAAe,MAAM,WAAW;;;EAGpC,MAAM,OAAiC;GAC7B;GACR,eAAe;GACf,cAAc,cAAc;GAC5B,QAAQ,eAAe,QAAQ,MAAM,OAAO,GACxC,MAAM,SACN,OAAO,OAAO,OAAO;GACzB,aAAa,YAAY,YAAY,MAAM,YAAY,GACnD,MAAM,cACN,YAAY,WAAW;GAC3B,eAAe,YAAY,cAAc,MAAM,cAAc,GACzD,MAAM,gBACN,YAAY,aAAa;GAC7B,SAAS,WAAW,OAAO;GAC3B,WAAW,aAAa,OAAO;GAC/B,SAAS,cAAc,KAAK,eAAe;GAC3C,WAAW;GACX,cAAc;GACd,cAAc,CAAC,CAAC;GAChB;GACA,UAAU,MAAM;GACjB;AACD,MAAI,eAAe,MAAM,MAAM,CAAE,QAAO;AACxC,SAAO,OAAO,OAAO;GAAE,GAAG;GAAM,UAAU,MAAM,WAAW;GAAG,CAAC;;CAGjE,SAAS,QAAQ;AACf,MAAI,SAAS,aAAa,SAAU;AACpC,cAAY;AACZ,MAAI;AACF,WAAQ,WAAW,cAAc,SAAS,CAAC,UAAU;AACnD,cAAU;IACV,MAAM,SAAS;AACf,cAAU,EAAE;IACZ,MAAM,WAAW;AACjB,YAAQ,eAAe;IACvB,MAAM,YAAY;AAClB,QAAI,UAAU,SACZ,MAAK,MAAM,YAAY,MAAM,KAAK,UAAU,EAAE;AAC5C,SAAI,CAAC,UAAU,IAAI,SAAS,CAAE;AAC9B,SAAI;AACF,eAAS,QAAQ;cACV,OAAO;AACd,aAAO,MAAM;;;AAInB,QAAI,OAAO,UAAU,CAAC,YAAY,QAAQ,gBAAgB;KAGxD,MAAM,SAAqB,OAAO,OAAO;MACvC,OAAO,OAAO,OACZ,MAAM,KAAK,IAAI,IAAI,OAAO,SAAS,UAAU,MAAM,MAAM,CAAC,CAAC,CAC5D;MACD,QAAQ,OAAO,MAAM,UAAU,MAAM,WAAW,OAAO,GACnD,SACA;MACJ,MAAM,OAAO,OAAO,SAAS,GAAG;MACjC,CAAC;AACF,SAAI;MACF,MAAM,SAAS,QAAQ,eAAe,UAAU,QAAQ,OAAO;AAC/D,UAAI,OAAQ,SAAQ,QAAQ,OAAO,CAAC,MAAM,OAAO;cAC1C,OAAO;AACd,aAAO,MAAM;;;AAGjB,mBAAe;;YAET;AACR,eAAY;;;CAIhB,SAAS,MAAM,IAAgB;AAC7B,cAAY;AACZ;AACA,MAAI;AACF,OAAI;YACI;AACR;AACA,aAAU;AACV,UAAO;;;CAIX,SAAS,MACP,OACA,MACA,SAA+B,WAC/B;AACA,MAAI,MAAM,OAAQ,SAAQ,KAAK;GAAE;GAAO;GAAM;GAAQ,CAAC;;CAGzD,SAAS,MACP,MACA,OACA,SAA0B,EAAE,EACnB;EACT,MAAM,aAAa,cAAc,KAAK;EACtC,MAAM,WAAW;EACjB,MAAM,OAAO,UAAU,QAAQ,YAAY,SAAS,MAAM,CAAC;EAC3D,MAAM,SAAS,OAAO,WAAW;EACjC,MAAM,UAAU,SAAS;AACzB,MAAI,SAAS;AACX,YAAS;AACT,qBAAkB,OAAO,MAAM,SAAS;;AAE1C,MAAI,OAAO,SAAS,OAAO,WAAW,OAAQ,QAAO,UAAU;AAC/D,MAAI,YAAY,OAAO,UAAU,OAAO,WAAW,QACjD,OAAM,CAAC,OAAO,KAAK,EAAE,OAAO,OAAO,OAAO;AAE5C,SAAO;;CAGT,SAAS,SAAS,MAAgB,OAAgB,QAA0B;EAE1E,MAAM,aAAa,cAAc,KAAK;EACtC,MAAM,WAAW,EAAE,GAAG,QAAQ;AAC9B,cAAY;AACV,SAAM,YAAY,OAAO,SAAS;IAClC;;CAGJ,SAAS,UAAU,MAAkB,QAA0B;AAC7D,cAAY;EACZ,MAAM,WAAW,EAAE,GAAG,QAAQ;EAC9B,MAAM,UAAU,OAAO,QAAQ,KAAK,CAAC,KAClC,CAAC,MAAM,WAAW,CAAC,cAAc,KAAK,EAAE,SAAS,MAAM,CAAC,CAC1D;EAGD,IAAI,UAAU;AACd,OAAK,MAAM,CAAC,MAAM,UAAU,QAC1B,WAAU,UAAU,SAAS,MAAM,MAAM;AAC3C,cAAY;AACV,QAAK,MAAM,CAAC,MAAM,UAAU,QAAS,OAAM,MAAM,OAAO,SAAS;IACjE;;CAGJ,SAAS,oBACP,MACA,QACqB;EACrB,MAAM,WAAW,EAAE,GAAG,QAAQ;AAC9B,MAAI,OAAO,OAAO,UAAU,eAAe,EAAE;AAC3C,YAAS,eAAe,SAAS,SAAS,aAAa;GACvD,MAAM,aAAa,cAAc,KAAK;AACtC,OAAI,CAAC,QAAQ,QAAQ,WAAW,IAAI,CAAC,QAAQ,UAAU,WAAW,EAAE;AAClE,cAAU,QAAQ,YAAY,SAAS,aAAa;AACpD,cAAU,UAAU,YAAY,SAAS,aAAa;;;AAG1D,SAAO;;CAGT,SAAS,KAAK,QAAiC,cAA4B;AACzE,MACE,aAAa,qBACb,CAAC,OAAO,OAAO,aAAa,SAAS,eAAe,CAEpD;AACF,eAAa,oBAAoB;EACjC,MAAM,QAAQ,SAAS,aAAa,QAAQ,aAAa;AACzD,MAAI,CAAC,QAAQ,QAAQ,OAAO,KAAK,IAAI,CAAC,QAAQ,UAAU,OAAO,KAAK,EAAE;GACpE,MAAM,WAAW;AACjB,YAAS,UAAU,QAAQ,OAAO,MAAM,MAAM;AAC9C,cAAW,UAAU,UAAU,OAAO,MAAM,MAAM;AAClD,UAAO,eAAe,EAAE,OAAO;AAC/B,qBAAkB,OAAO,MAAM,SAAS;aAExC,OAAO,gBACP,OAAO,cAAc,OAAO,KAC5B,CAAC,eAAe,OAAO,aAAa,OAAO,MAAM,CAEjD,kBACE,UAAU,OAAO,KAAK,wEACvB;;CAIL,SAAS,SACP,MACA,SAA8B,EAAE,EACb;AACnB,cAAY;EACZ,MAAM,aAAa,cAAc,KAAK;EACtC,MAAM,WAAW,oBAAoB,YAAY,OAAO;EACxD,MAAM,SAAS,OAAO,WAAW;EACjC,MAAM,eAA6B;GACjC,SAAS;GACT,OAAO,EAAE;GACT,mBAAmB;GACpB;EACD,IAAI,WAAW;AACf,cAAY;AACV,UAAO,cAAc,IAAI,aAAa;AACtC,UAAO,QAAQ;AACf,QAAK,QAAQ,aAAa;AAC1B,cAAW,OAAO;IAClB;AACF,SAAO,OAAO,OAAO;GACnB,MAAM,OAAO;GACb,IAAI,WAAW;AACb,WAAO,YAAY;;GAErB,OAAO,MAA2B;AAChC,QAAI,YAAY,SAAU;IAC1B,MAAM,WAAW,oBAAoB,OAAO,MAAM,KAAK;AAIvD,QACE,EAHA,CAAC,aAAa,qBACd,OAAO,OAAO,UAAU,eAAe,MAGtC,aAAa,QAAQ,YAAY,WAC/B,SAAS,YAAY,SACxB,aAAa,QAAQ,YAAY,SAAS,QAE1C;AACF,gBAAY;AACV,kBAAa,UAAU;AACvB,kBAAa,QAAQ,EAAE;AAGvB,SAAI,OAAO,UAAU,aAAc,YAAW,OAAO;AACrD,YAAO,QAAQ;AACf,UAAK,QAAQ,aAAa;MAC1B;;GAEJ,UAAU;AACR,QAAI,YAAY,SAAU;AAC1B,eAAW;AACX,gBAAY;AACV,YAAO,cAAc,OAAO,aAAa;AACzC,SAAI,OAAO,UAAU,cAAc;AACjC,aAAO,QAAQ,MAAM,KAAK,OAAO,cAAc,CAAC,MAC7C,GAAG,MAAM,EAAE,QAAQ,EAAE,MACvB,CAAC;AACF,iBAAW,OAAO;;AAEpB,SAAI,CAAC,OAAO,cAAc,MAAM;AAC9B,UAAI,aAAa,QAAQ,aAAa,OAAO;AAC3C,gBAAS,UAAU,QAAQ,OAAO,MAAM,QAAW,KAAK;AACxD,cAAO,UAAU;AACjB,YAAK,MAAM,SAAS,QAAQ,QAAQ,CAClC,KAAI,UAAU,UAAU,QAAQ,MAAM,MAAM,OAAO,KAAK,CACtD,YAAW,MAAM;;AAGvB,UACE,CAAC,QAAQ,QAAQ,OAAO,KAAK,IAC7B,CAAC,QAAQ,UAAU,OAAO,KAAK,CAE/B,SAAQ,OAAO,OAAO,KAAK;;MAE/B;;GAEL,CAAC;;CAGJ,SAAS,gBAAgB,MAAkB;EACzC,MAAM,UAAU,OAAO,KAAK,KAAK;AACjC,UAAQ,SAAS,SAAS,cAAc,KAAK,CAAC;AAC9C,aAAW,SAAS,KAAK;AACzB,OAAK,MAAM,QAAQ,QAAS,QAAO,MAAM,MAAM;AAC/C,OAAK,MAAM,UAAU,QAAQ,QAAQ,CAAE,QAAO,eAAe;;CAG/D,SAAS,iBACP,MACA,SAAqD,EAAE,EACvD;EACA,MAAM,UAAU,OAAO,kBAAkB;AACzC,cAAY;AACV,mBAAgB,KAAK;AACrB,OAAI,SAAS;AACX,aAAS;AACT,SAAK,MAAM,UAAU,QAAQ,QAAQ,EAAE;AACrC,gBAAW,OAAO;AAClB,YAAO,UAAU;;AAEnB,UAAM,MAAM,KAAK,QAAQ,MAAM,CAAC,EAAE,WAAW;;IAE/C;;CAGJ,SAAS,mBACP,MACA,SAGI,EAAE,EACN;EACA,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,gBAAgB,OAAO,iBAAiB;AAC9C,cAAY;GAGV,MAAM,aAAa,MAAM,KAAK,QAAQ,QAAQ,CAAC;GAC/C,MAAM,YAAY,WACf,QAAQ,WAAW;AAGlB,QACE,CAAC,OAAO,YACR,WAAW,MACR,UACC,MAAM,YACN,MAAM,KAAK,SAAS,OAAO,KAAK,UAChC,QAAQ,OAAO,MAAM,MAAM,KAAK,CACnC,CAED,QAAO;AACT,WACG,SAAS,eAAe,OAAO,WAC/B,SAAS,WAAW,MAAM,OAAO,IACjC,iBAAiB,MAAM,OAAO;KAEjC,CACD,KAAK,YAAY;IAChB,MAAM,OAAO;IACb,QAAQ,QAAQ,QAAQ,OAAO,KAAK;IACpC,OAAO,SAAS,QAAQ,OAAO,KAAK;IACrC,EAAE;GACL,MAAM,WAAW;AACjB,mBAAgB,KAAK;AACrB,YAAS;AACT,QAAK,MAAM,SAAS,UAAU,MAC3B,GAAG,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,OAClC,CACC,UAAS,UAAU,QAAQ,MAAM,MAAM,MAAM,OAAO,CAAC,MAAM,OAAO;GAEpE,MAAM,QAAkB,EAAE;AAC1B,QAAK,MAAM,UAAU,QAAQ,QAAQ,CACnC,KACE,CAAC,OAAO,GACN,SAAS,UAAU,OAAO,KAAK,EAC/B,SAAS,QAAQ,OAAO,KAAK,CAC9B,IACD,QAAQ,UAAU,OAAO,KAAK,KAAK,QAAQ,QAAQ,OAAO,KAAK,EAC/D;AACA,eAAW,OAAO;AAClB,UAAM,KAAK,OAAO,KAAK;;AAG3B,SAAM,OAAO,QAAQ;IACrB;;CAGJ,SAAS,MAAM,SAAkC,EAAE,EAAE;AACnD,cAAY;AACV,OAAI,OAAO,OAAO,QAAQ,SAAS,CAAE,iBAAgB,OAAO,UAAU,EAAE,CAAC;AACzE,YAAS;GACT,MAAM,QAAQ,MAAM,KAAK,QAAQ,MAAM,CAAC;AACxC,QAAK,MAAM,UAAU,QAAQ,QAAQ,EAAE;AACrC,eAAW,OAAO;AAClB,WAAO,UAAU;AACjB,QAAI,CAAC,OAAO,cAAc,QAAQ,CAAC,QAAQ,QAAQ,OAAO,KAAK,CAC7D,SAAQ,OAAO,OAAO,KAAK;;GAE/B,MAAM,WAAW;AACjB,gBAAa;AACb,iBAAc;AACd,OAAI,SAAU,eAAc,IAAI,SAAS;AACzC,SAAM,OAAO,QAAQ;IACrB;;CAGJ,SAAS,eAAe,MAAgB,QAA+B;AACrE,cAAY;EACZ,MAAM,SAAS,OAAO,SAAS,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG;AAC5D,cAAY;GACV,MAAM,SAAS,OAAO,KAAK;GAC3B,MAAM,SAAS,OAAO,SAAS,YAAY;AAC3C,OAAI,OAAO,WAAW,UAAU,eAAe,OAAO,QAAQ,OAAO,CACnE;AACF,cAAW,OAAO;AAClB,UAAO,SAAS;AAChB,UAAO,SAAS;IAChB;;CAGJ,SAAS,gBAAgB,MAA6C;AACpE,cAAY;EACZ,MAAM,SAAS,QAAQ,IAAI,YAAY,KAAK,CAAC;AAC7C,MAAI,CAAC,QAAQ,cAAc,KACzB,OAAM,IAAI,MAAM,wCAAwC;EAC1D,MAAM,aAAa,IAAI,iBAAiB;AACxC,cAAY;AACV,cAAW,QAAQ,KAAK;AACxB,UAAO,aAAa;AACpB,UAAO,SAAS;IAChB;EACF,MAAM,gBACJ,CAAC,YACD,OAAO,eAAe,cACtB,CAAC,WAAW,OAAO;AACrB,SAAO,OAAO,OAAO;GACnB,QAAQ,WAAW;GACnB,SAAS,QAA+B;AACtC,QAAI,CAAC,SAAS,CAAE,QAAO;IACvB,MAAM,SAAS,OAAO,SAClB,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,GAC1B;AACJ,gBAAY;AACV,YAAO,aAAa;AACpB,YAAO,SAAS;AAChB,YAAO,SAAS,OAAO,SAAS,YAAY;MAC5C;AACF,WAAO;;GAET,SAAS;AACP,QAAI,SAAS,CACX,aAAY;AACV,gBAAW,QAAQ,KAAK;MACxB;;GAEP,CAAC;;CAGJ,SAAS,kBAA+C;AACtD,cAAY;AACZ,MAAI,WAAY,QAAO;EACvB,MAAM,aAAa,IAAI,iBAAiB;AACxC,cAAY;AACV,gBAAa;AACb,iBAAc;IACd;AACF,SAAO,OAAO,OAAO;GACnB,QAAQ,WAAW;GACnB,SAAS,QAA6B;AACpC,QAAI,YAAY,eAAe,cAAc,WAAW,OAAO,QAC7D,QAAO;IACT,MAAM,QAAQ,QAAQ;AACtB,gBAAY;AACV,kBAAa;AACb,mBAAc;MACd;AACF,WAAO;;GAEV,CAAC;;CAGJ,SAAS,UAAU,UAAsB;AACvC,cAAY;EACZ,MAAM,QAAQ,EAAE,QAAQ,UAAU;AAClC,YAAU,IAAI,MAAM;AACpB,eAAa;AACX,aAAU,OAAO,MAAM;;;CAI3B,SAAS,UAAU;AACjB,MAAI,SAAU;AACd,aAAW;AACX,YAAU,OAAO;AACjB,YAAU,EAAE;AACZ,YAAU;AACV,OAAK,MAAM,UAAU,QAAQ,QAAQ,EAAE;AACrC,UAAO,cAAc,OAAO;AAC5B,UAAO,QAAQ;AACf,cAAW,OAAO;;EAEpB,MAAM,WAAW;AACjB,eAAa;AACb,MAAI,SAAU,eAAc,IAAI,SAAS;AACzC,UAAQ,eAAe;AACvB,UAAQ,OAAO;AACf,iBAAe;;AAGjB,MAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,CAAE,QAAO,MAAM,MAAM;AAC3D,SAAQ,eAAe;AAEvB,QAAO,OAAO,OAAO;GAClB,eAAe;EAChB,mBAAmB;EACnB,mBAAmB,SAAmB,MAAM,OAAO,YAAY,KAAK;EACpE,WAAW,SAAmB,SAAS,QAAQ,cAAc,KAAK,CAAC;EACnE,iBAAiB;EACjB,uBAAuB,cAAc;EACrC;EACA,kBACE,UACA,UACA,UAAiD,OAAO,IACxD;GACA,IAAI,WAAW,SAAS,MAAM;AAC9B,UAAO,gBAAgB;IACrB,MAAM,OAAO,SAAS,MAAM;AAC5B,QAAI,QAAQ,UAAU,KAAK,CAAE;IAC7B,MAAM,WAAW;AACjB,eAAW;AACX,aAAS,MAAM,SAAS;KACxB;;EAEJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAM,MAAgB,UAAU,MAAM;AACpC,eAAY;AACV,WAAO,KAAK,CAAC,UAAU;KACvB;;EAEJ;EACA,mBAAmB,SAAmB,eAAe,MAAM,aAAa;EACxE;EACA;EACA,eAAe,OAAgB;AAC7B,eAAY;AACV,kBAAc;KACd;;EAEJ,mBAAmB;AACjB,eAAY;AACV,kBAAc;KACd;;EAEJ;EACA,OAAO,OAAO,OAAO;GACnB,qBAAqB,UAAU;GAC/B,yBACE,MAAM,KAAK,QAAQ,QAAQ,CAAC,CAAC,QAC1B,OAAO,WAAW,QAAQ,OAAO,cAAc,MAChD,EACD;GACJ,CAAC;EACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"store.js","names":[],"sources":["../../../../../src/components/form/Form/modern/store.ts"],"sourcesContent":["import { FORM_BACKEND } from '../backend';\n\nimport {\n createValueSnapshotter,\n defineValue,\n formValueEqual,\n freezeContainer,\n getFieldKey,\n hasPath,\n isPlainObject,\n normalizePath,\n readonlySet,\n readPath,\n sameMembers,\n writePath,\n} from './values';\n\nimport type {\n FieldState,\n FormChange,\n FormState,\n FormStore,\n FormStoreOptions,\n RegistrationOptions,\n RegistrationToken,\n SetValueOptions,\n SubmissionToken,\n ValidationToken,\n} from './types';\nimport type { FormPath } from './values';\n\ninterface Registration {\n options: RegistrationOptions;\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>;\n owner?: Registration;\n fieldDefault?: { value: unknown };\n touched: boolean;\n errors: readonly ErrorValue[];\n status: FieldState['status'];\n validationRevision: number;\n validation?: AbortController;\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\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 * Phase 4's framework-neutral command layer. Not exported from the package.\n * React registration, root callbacks, rule execution and submit orchestration\n * are deliberately separate later phases; their state transitions live here.\n */\nexport function createFormStore<\n T extends object = Record<string, unknown>,\n ErrorValue = unknown,\n>(options: FormStoreOptions<T> = {}): FormStore<T, ErrorValue> {\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 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 Partial<T>,\n defaultValues: defaults as Partial<T>,\n activeValues: EMPTY_OBJECT,\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 invalidateRelated(path: readonly string[], previous: object) {\n for (const record of records.values()) {\n if (\n related(path, record.path) ||\n !Object.is(\n readPath(previous, record.path),\n readPath(values, record.path),\n ) ||\n hasPath(previous, record.path) !== hasPath(values, record.path)\n )\n invalidate(record);\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 Partial<T>,\n defaultValues: defaults as Partial<T>,\n activeValues: activeValues() as Partial<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 && options.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 = options.onValuesChange(published.values, change);\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);\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,\n ): RegistrationOptions {\n const prepared = { ...config };\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(record: FieldRecord<ErrorValue>, registration: Registration) {\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 = {},\n ): RegistrationToken {\n assertLive();\n const normalized = normalizePath(path);\n const prepared = prepareRegistration(normalized, config);\n const record = ensure(normalized);\n const registration: Registration = {\n options: prepared,\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) {\n if (released || disposed) return;\n const prepared = prepareRegistration(record.path, next);\n const hasNewDefault =\n !registration.defaultConsidered &&\n Object.hasOwn(prepared, 'defaultValue');\n if (\n !hasNewDefault &&\n (registration.options.preserve ?? true) ===\n (prepared.preserve ?? true) &&\n registration.options.isEqual === prepared.isEqual\n )\n return;\n batch(() => {\n registration.options = prepared;\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 if (record.owner !== registration) invalidate(record);\n record.owner = registration;\n seed(record, registration);\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 values = writePath(values, record.path, undefined, true);\n record.touched = false;\n for (const other of records.values()) {\n if (other !== record && related(other.path, record.path))\n invalidate(other);\n }\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 if (\n !Object.is(\n readPath(previous, record.path),\n readPath(values, record.path),\n ) ||\n hasPath(previous, record.path) !== hasPath(values, record.path)\n ) {\n invalidate(record);\n names.push(record.name);\n }\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 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 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 Partial<T>,\n getActiveValues: () => activeValues() as Partial<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 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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"}
|
|
@@ -41,7 +41,10 @@ interface RegistrationToken {
|
|
|
41
41
|
readonly name: string;
|
|
42
42
|
readonly released: boolean;
|
|
43
43
|
update(options: RegistrationOptions): void;
|
|
44
|
-
|
|
44
|
+
/** React effect replay can reconnect before the queued value removal. */
|
|
45
|
+
release(options?: {
|
|
46
|
+
deferValueRemoval?: boolean;
|
|
47
|
+
}): void;
|
|
45
48
|
}
|
|
46
49
|
interface FormChange {
|
|
47
50
|
readonly names: readonly string[];
|
|
@@ -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-740dafc | 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) {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { FieldCoreProps, NecessityIndicator, ValidateTrigger, ValidationProps, ValidationState } from "../../../../shared/form.js";
|
|
3
3
|
import "../../../../shared/index.js";
|
|
4
4
|
import { CubeFieldData, FieldTypes } from "../types.js";
|
|
5
|
+
import { FormController } from "../modern/controller.js";
|
|
5
6
|
import { CubeFormInstance } from "../use-form.js";
|
|
6
7
|
import { ReactNode } from "react";
|
|
7
8
|
|
|
@@ -10,7 +11,7 @@ interface UseFieldProps<T extends FieldTypes> extends FieldCoreProps, Validation
|
|
|
10
11
|
/** The initial value of the input. */
|
|
11
12
|
defaultValue?: any;
|
|
12
13
|
/** The form instance */
|
|
13
|
-
form?: CubeFormInstance<T>;
|
|
14
|
+
form?: CubeFormInstance<T> | FormController<any>;
|
|
14
15
|
/**
|
|
15
16
|
* The validation state of the field
|
|
16
17
|
* @deprecated Use `isInvalid` / `isValid` instead.
|
|
@@ -18,6 +19,8 @@ interface UseFieldProps<T extends FieldTypes> extends FieldCoreProps, Validation
|
|
|
18
19
|
validationState?: ValidationState;
|
|
19
20
|
/** Whether to show valid state */
|
|
20
21
|
showValid?: boolean;
|
|
22
|
+
/** Explicit loading presentation overrides the modern validation state. */
|
|
23
|
+
isLoading?: boolean;
|
|
21
24
|
/** On which event perform the validation for the field */
|
|
22
25
|
validateTrigger?: ValidateTrigger;
|
|
23
26
|
/**
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-740dafc | Cube Dev Team */
|
|
2
|
+
import { useLayoutEffect as useLayoutEffect$1 } from "../../../../utils/react/useLayoutEffect.js";
|
|
3
|
+
import { useEvent } from "../../../../_internal/hooks/use-event.js";
|
|
4
|
+
import { isModernFormController } from "../backend.js";
|
|
5
|
+
import { useField } from "./use-field.js";
|
|
6
|
+
import { createModernFieldBackend, fieldRegistrationOptions, sameFieldView } from "../modern/field-binding.js";
|
|
7
|
+
import { useMemo, useRef } from "react";
|
|
8
|
+
import { useSyncExternalStoreWithSelector } from "use-sync-external-store/with-selector.js";
|
|
9
|
+
|
|
10
|
+
//#region src/components/form/Form/use-field/use-field-binding.ts
|
|
11
|
+
const noop = () => {};
|
|
12
|
+
const selectView = (view) => view;
|
|
13
|
+
/**
|
|
14
|
+
* One unconditional subscription/registration boundary. The frozen legacy
|
|
15
|
+
* adapter still runs its original hooks, inert on the modern path, so an input
|
|
16
|
+
* can cross backends without remounting or changing hook order. Its render-time
|
|
17
|
+
* mutations remain contained in use-field.ts; modern handles are pure to create.
|
|
18
|
+
*/
|
|
19
|
+
function useFieldBinding(props, params, generatedId) {
|
|
20
|
+
const modern = !params.unbound && isModernFormController(props.form);
|
|
21
|
+
const controller = modern ? props.form : void 0;
|
|
22
|
+
const name = props.name ?? "";
|
|
23
|
+
const legacy = useField(props, {
|
|
24
|
+
...params,
|
|
25
|
+
unbound: params.unbound || modern
|
|
26
|
+
});
|
|
27
|
+
const modernHandle = useMemo(() => controller ? createModernFieldBackend(controller, name) : void 0, [controller, name]);
|
|
28
|
+
const legacyHandle = useMemo(() => {
|
|
29
|
+
const snapshot = {
|
|
30
|
+
value: legacy.value,
|
|
31
|
+
errors: legacy.field?.errors ?? [],
|
|
32
|
+
status: legacy.field?.status ?? "unvalidated"
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
subscribe: () => noop,
|
|
36
|
+
getSnapshot: () => snapshot,
|
|
37
|
+
getServerSnapshot: () => snapshot,
|
|
38
|
+
register: () => void 0,
|
|
39
|
+
change: (value, dontTouch, trigger) => legacy.onChange?.(value, dontTouch, trigger),
|
|
40
|
+
blur: legacy.onBlur
|
|
41
|
+
};
|
|
42
|
+
}, [legacy]);
|
|
43
|
+
const handle = modernHandle ?? legacyHandle;
|
|
44
|
+
const field = useSyncExternalStoreWithSelector(handle.subscribe, handle.getSnapshot, handle.getServerSnapshot, selectView, sameFieldView);
|
|
45
|
+
const registration = useRef(void 0);
|
|
46
|
+
useLayoutEffect$1(() => {
|
|
47
|
+
const token = handle.register();
|
|
48
|
+
registration.current = token;
|
|
49
|
+
return () => {
|
|
50
|
+
token?.release({ deferValueRemoval: true });
|
|
51
|
+
if (registration.current === token) registration.current = void 0;
|
|
52
|
+
};
|
|
53
|
+
}, [handle]);
|
|
54
|
+
useLayoutEffect$1(() => {
|
|
55
|
+
registration.current?.update(fieldRegistrationOptions(props));
|
|
56
|
+
});
|
|
57
|
+
const trigger = props.validateTrigger ?? params.defaultValidationTrigger ?? "onBlur";
|
|
58
|
+
const onChange = useEvent((value, dontTouch) => {
|
|
59
|
+
if (controller && props.shouldUpdate !== void 0) {
|
|
60
|
+
const previous = controller.getValues();
|
|
61
|
+
if (props.shouldUpdate === false || typeof props.shouldUpdate === "function" && !props.shouldUpdate(previous, {
|
|
62
|
+
...previous,
|
|
63
|
+
[name]: value
|
|
64
|
+
})) return;
|
|
65
|
+
}
|
|
66
|
+
handle.change(value, dontTouch, trigger);
|
|
67
|
+
});
|
|
68
|
+
const onBlur = useEvent(() => handle.blur());
|
|
69
|
+
if (!controller) return legacy;
|
|
70
|
+
const required = props.isRequired || props.rules?.some((rule) => rule.required === true);
|
|
71
|
+
return {
|
|
72
|
+
form: controller,
|
|
73
|
+
name,
|
|
74
|
+
id: props.id ?? `${props.idPrefix ? `${props.idPrefix}_` : ""}${name}-${generatedId}`,
|
|
75
|
+
nonInput: false,
|
|
76
|
+
value: field ? field.value : props.defaultValue,
|
|
77
|
+
onChange,
|
|
78
|
+
onBlur,
|
|
79
|
+
validateTrigger: trigger,
|
|
80
|
+
isInvalid: props.isInvalid ?? !!field?.errors.length,
|
|
81
|
+
isValid: props.isValid ?? !!(props.showValid && field?.status === "valid"),
|
|
82
|
+
isLoading: props.isLoading ?? field?.status === "validating",
|
|
83
|
+
...required ? { isRequired: true } : {},
|
|
84
|
+
...required && !props.isRequired && props.necessityIndicator === void 0 ? { necessityIndicator: null } : {},
|
|
85
|
+
description: props.description,
|
|
86
|
+
message: props.message !== void 0 ? props.message : field?.errors[0],
|
|
87
|
+
errorMessage: props.errorMessage !== void 0 ? props.errorMessage : field?.errors[0]
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
export { useFieldBinding };
|
|
93
|
+
//# sourceMappingURL=use-field-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-field-binding.js","names":[],"sources":["../../../../../src/components/form/Form/use-field/use-field-binding.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js';\n\nimport { useEvent } from '../../../../_internal/hooks/use-event';\nimport { useLayoutEffect } from '../../../../utils/react/useLayoutEffect';\nimport { isModernFormController } from '../backend';\nimport {\n createModernFieldBackend,\n fieldRegistrationOptions,\n sameFieldView,\n} from '../modern/field-binding';\n\nimport { useField } from './use-field';\n\nimport type { FormController } from '../modern/controller';\nimport type { FieldBackendHandle, FieldView } from '../modern/field-binding';\nimport type { RegistrationToken } from '../modern/types';\nimport type { FieldTypes } from '../types';\nimport type { FieldReturnValue, UseFieldProps } from './types';\nimport type { UseFieldParams } from './use-field';\n\nconst noop = () => {};\nconst selectView = (view: FieldView | undefined) => view;\n\n/**\n * One unconditional subscription/registration boundary. The frozen legacy\n * adapter still runs its original hooks, inert on the modern path, so an input\n * can cross backends without remounting or changing hook order. Its render-time\n * mutations remain contained in use-field.ts; modern handles are pure to create.\n */\nexport function useFieldBinding<\n T extends FieldTypes,\n P extends UseFieldProps<T>,\n>(\n props: P,\n params: UseFieldParams,\n generatedId: string,\n): Omit<FieldReturnValue<T>, 'form'> & {\n form?: FieldReturnValue<T>['form'] | FormController<any>;\n isLoading?: boolean;\n} {\n const modern = !params.unbound && isModernFormController(props.form);\n const controller = modern\n ? (props.form as unknown as FormController<any>)\n : undefined;\n const name = props.name ?? '';\n const legacy = useField<T, P>(props, {\n ...params,\n unbound: params.unbound || modern,\n });\n const modernHandle = useMemo(\n () => (controller ? createModernFieldBackend(controller, name) : undefined),\n [controller, name],\n );\n const legacyHandle = useMemo<FieldBackendHandle>(() => {\n const snapshot: FieldView = {\n value: legacy.value,\n errors: legacy.field?.errors ?? [],\n status: legacy.field?.status ?? 'unvalidated',\n };\n return {\n subscribe: () => noop,\n getSnapshot: () => snapshot,\n getServerSnapshot: () => snapshot,\n register: () => undefined,\n change: (value, dontTouch, trigger) =>\n legacy.onChange?.(value, dontTouch, trigger),\n blur: legacy.onBlur,\n };\n }, [legacy]);\n const handle = modernHandle ?? legacyHandle;\n const field = useSyncExternalStoreWithSelector(\n handle.subscribe,\n handle.getSnapshot,\n handle.getServerSnapshot,\n selectView,\n sameFieldView,\n );\n const registration = useRef<RegistrationToken | undefined>(undefined);\n useLayoutEffect(() => {\n const token = handle.register();\n registration.current = token;\n return () => {\n token?.release({ deferValueRemoval: true });\n if (registration.current === token) registration.current = undefined;\n };\n }, [handle]);\n useLayoutEffect(() => {\n registration.current?.update(fieldRegistrationOptions(props));\n });\n const trigger =\n props.validateTrigger ?? params.defaultValidationTrigger ?? 'onBlur';\n const onChange = useEvent((value: unknown, dontTouch: boolean) => {\n if (controller && props.shouldUpdate !== undefined) {\n const previous = controller.getValues();\n if (\n props.shouldUpdate === false ||\n (typeof props.shouldUpdate === 'function' &&\n !props.shouldUpdate(previous, { ...previous, [name]: value }))\n )\n return;\n }\n handle.change(value, dontTouch, trigger);\n });\n const onBlur = useEvent(() => handle.blur());\n if (!controller) return legacy;\n\n const required =\n props.isRequired || props.rules?.some((rule) => rule.required === true);\n const id =\n props.id ??\n `${props.idPrefix ? `${props.idPrefix}_` : ''}${name}-${generatedId}`;\n return {\n form: controller,\n name,\n id,\n nonInput: false,\n value: field ? field.value : props.defaultValue,\n onChange,\n onBlur,\n validateTrigger: trigger,\n isInvalid: props.isInvalid ?? !!field?.errors.length,\n isValid: props.isValid ?? !!(props.showValid && field?.status === 'valid'),\n isLoading: props.isLoading ?? field?.status === 'validating',\n ...(required ? { isRequired: true } : {}),\n ...(required && !props.isRequired && props.necessityIndicator === undefined\n ? { necessityIndicator: null }\n : {}),\n description: props.description,\n message: props.message !== undefined ? props.message : field?.errors[0],\n errorMessage:\n props.errorMessage !== undefined ? props.errorMessage : field?.errors[0],\n };\n}\n"],"mappings":";;;;;;;;;;AAqBA,MAAM,aAAa;AACnB,MAAM,cAAc,SAAgC;;;;;;;AAQpD,SAAgB,gBAId,OACA,QACA,aAIA;CACA,MAAM,SAAS,CAAC,OAAO,WAAW,uBAAuB,MAAM,KAAK;CACpE,MAAM,aAAa,SACd,MAAM,OACP;CACJ,MAAM,OAAO,MAAM,QAAQ;CAC3B,MAAM,SAAS,SAAe,OAAO;EACnC,GAAG;EACH,SAAS,OAAO,WAAW;EAC5B,CAAC;CACF,MAAM,eAAe,cACZ,aAAa,yBAAyB,YAAY,KAAK,GAAG,QACjE,CAAC,YAAY,KAAK,CACnB;CACD,MAAM,eAAe,cAAkC;EACrD,MAAM,WAAsB;GAC1B,OAAO,OAAO;GACd,QAAQ,OAAO,OAAO,UAAU,EAAE;GAClC,QAAQ,OAAO,OAAO,UAAU;GACjC;AACD,SAAO;GACL,iBAAiB;GACjB,mBAAmB;GACnB,yBAAyB;GACzB,gBAAgB;GAChB,SAAS,OAAO,WAAW,YACzB,OAAO,WAAW,OAAO,WAAW,QAAQ;GAC9C,MAAM,OAAO;GACd;IACA,CAAC,OAAO,CAAC;CACZ,MAAM,SAAS,gBAAgB;CAC/B,MAAM,QAAQ,iCACZ,OAAO,WACP,OAAO,aACP,OAAO,mBACP,YACA,cACD;CACD,MAAM,eAAe,OAAsC,OAAU;AACrE,yBAAsB;EACpB,MAAM,QAAQ,OAAO,UAAU;AAC/B,eAAa,UAAU;AACvB,eAAa;AACX,UAAO,QAAQ,EAAE,mBAAmB,MAAM,CAAC;AAC3C,OAAI,aAAa,YAAY,MAAO,cAAa,UAAU;;IAE5D,CAAC,OAAO,CAAC;AACZ,yBAAsB;AACpB,eAAa,SAAS,OAAO,yBAAyB,MAAM,CAAC;GAC7D;CACF,MAAM,UACJ,MAAM,mBAAmB,OAAO,4BAA4B;CAC9D,MAAM,WAAW,UAAU,OAAgB,cAAuB;AAChE,MAAI,cAAc,MAAM,iBAAiB,QAAW;GAClD,MAAM,WAAW,WAAW,WAAW;AACvC,OACE,MAAM,iBAAiB,SACtB,OAAO,MAAM,iBAAiB,cAC7B,CAAC,MAAM,aAAa,UAAU;IAAE,GAAG;KAAW,OAAO;IAAO,CAAC,CAE/D;;AAEJ,SAAO,OAAO,OAAO,WAAW,QAAQ;GACxC;CACF,MAAM,SAAS,eAAe,OAAO,MAAM,CAAC;AAC5C,KAAI,CAAC,WAAY,QAAO;CAExB,MAAM,WACJ,MAAM,cAAc,MAAM,OAAO,MAAM,SAAS,KAAK,aAAa,KAAK;AAIzE,QAAO;EACL,MAAM;EACN;EACA,IALA,MAAM,MACN,GAAG,MAAM,WAAW,GAAG,MAAM,SAAS,KAAK,KAAK,KAAK,GAAG;EAKxD,UAAU;EACV,OAAO,QAAQ,MAAM,QAAQ,MAAM;EACnC;EACA;EACA,iBAAiB;EACjB,WAAW,MAAM,aAAa,CAAC,CAAC,OAAO,OAAO;EAC9C,SAAS,MAAM,WAAW,CAAC,EAAE,MAAM,aAAa,OAAO,WAAW;EAClE,WAAW,MAAM,aAAa,OAAO,WAAW;EAChD,GAAI,WAAW,EAAE,YAAY,MAAM,GAAG,EAAE;EACxC,GAAI,YAAY,CAAC,MAAM,cAAc,MAAM,uBAAuB,SAC9D,EAAE,oBAAoB,MAAM,GAC5B,EAAE;EACN,aAAa,MAAM;EACnB,SAAS,MAAM,YAAY,SAAY,MAAM,UAAU,OAAO,OAAO;EACrE,cACE,MAAM,iBAAiB,SAAY,MAAM,eAAe,OAAO,OAAO;EACzE"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-740dafc | Cube Dev Team */
|
|
2
2
|
import { mergeProps } from "../../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useEvent } from "../../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { warn } from "../../../../utils/warnings.js";
|
|
5
5
|
import { useProviderProps } from "../../../../provider.js";
|
|
6
6
|
import { useValidationProps } from "../../validation/use-validation-props.js";
|
|
7
|
+
import { isModernFormController } from "../backend.js";
|
|
7
8
|
import { useFormProps } from "../Form.js";
|
|
8
|
-
import {
|
|
9
|
+
import { useFieldBinding } from "./use-field-binding.js";
|
|
9
10
|
import { useInsideLegacyField } from "../Field.js";
|
|
10
11
|
import { useDebugValue, useId, useState } from "react";
|
|
11
12
|
|
|
@@ -35,15 +36,19 @@ function useFieldProps(inputProps, params = {}) {
|
|
|
35
36
|
const hasName = props.name != null;
|
|
36
37
|
const generatedId = useId();
|
|
37
38
|
const isBound = hasName && !isInsideLegacyField && !isDisabled;
|
|
38
|
-
const field =
|
|
39
|
+
const field = useFieldBinding(props, {
|
|
39
40
|
defaultValidationTrigger: params.defaultValidationTrigger,
|
|
40
41
|
unbound: !isBound
|
|
41
|
-
});
|
|
42
|
+
}, generatedId);
|
|
42
43
|
const isOutsideOfForm = field?.form == null;
|
|
43
44
|
const onChangeEvent = useEvent((value, dontTouch) => {
|
|
44
45
|
field?.onChange?.(value, dontTouch, field?.validateTrigger ?? defaultValidationTrigger);
|
|
45
46
|
});
|
|
46
|
-
const
|
|
47
|
+
const resolved = resolveResult();
|
|
48
|
+
const result = isModernFormController(resolved.form) ? {
|
|
49
|
+
...resolved,
|
|
50
|
+
form: void 0
|
|
51
|
+
} : resolved;
|
|
47
52
|
useDebugValue(result);
|
|
48
53
|
return result;
|
|
49
54
|
function resolveResult() {
|
|
@@ -73,11 +78,13 @@ function useFieldProps(inputProps, params = {}) {
|
|
|
73
78
|
validateTrigger: field.validateTrigger ?? defaultValidationTrigger,
|
|
74
79
|
onBlur: field.onBlur
|
|
75
80
|
});
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
return result.id ? {
|
|
82
|
+
...result,
|
|
83
|
+
labelProps: {
|
|
84
|
+
...result.labelProps,
|
|
85
|
+
for: result.id
|
|
86
|
+
}
|
|
87
|
+
} : result;
|
|
81
88
|
}
|
|
82
89
|
}
|
|
83
90
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-field-props.js","names":[],"sources":["../../../../../src/components/form/Form/use-field/use-field-props.tsx"],"sourcesContent":["import { useDebugValue, useId, useState } from 'react';\n\nimport { useEvent } from '../../../../_internal/index';\nimport { useProviderProps } from '../../../../provider';\nimport { mergeProps } from '../../../../utils/react/index';\nimport { warn } from '../../../../utils/warnings';\nimport { useValidationProps } from '../../validation/index';\nimport { useInsideLegacyField } from '../Field';\nimport { useFormProps } from '../Form';\n\nimport {
|
|
1
|
+
{"version":3,"file":"use-field-props.js","names":[],"sources":["../../../../../src/components/form/Form/use-field/use-field-props.tsx"],"sourcesContent":["import { useDebugValue, useId, useState } from 'react';\n\nimport { useEvent } from '../../../../_internal/index';\nimport { useProviderProps } from '../../../../provider';\nimport { mergeProps } from '../../../../utils/react/index';\nimport { warn } from '../../../../utils/warnings';\nimport { useValidationProps } from '../../validation/index';\nimport { isModernFormController } from '../backend';\nimport { useInsideLegacyField } from '../Field';\nimport { useFormProps } from '../Form';\n\nimport { useFieldBinding } from './use-field-binding';\n\nimport type { ValidateTrigger } from '../../../../shared/index';\nimport type { FieldTypes } from '../types';\nimport type { UseFieldProps } from './types';\n\nexport type UseFieldPropsParams = {\n valuePropsMapper?: ({ value, onChange }) => any;\n /**\n * @default 'onBlur'\n */\n defaultValidationTrigger?: ValidateTrigger;\n /**\n * prop helps to prevent calling hook conditionally, but changing this prop during render is unsafe and forbidden\n * If you want to change this prop after mount, remount the component with a new value.\n */\n unsafe__isDisabled?: boolean;\n};\n\n/**\n * The single entry point for input components (see\n * `docs/rules/input-components.md`).\n *\n * Every hook below runs on every render, whatever the mode: standalone (no\n * `name`), inside the deprecated `<Field>`, disabled through\n * `unsafe__isDisabled`, or bound to a form. The mode only decides which props\n * come back, so an input can gain or lose a `name`, or move between forms,\n * without changing its hook order. The legacy binding (`useField`) is the\n * legacy backend's adapter and is inert when the field is not bound to it.\n */\nexport function useFieldProps<\n T extends FieldTypes,\n Props extends UseFieldProps<T>,\n>(inputProps: Props, params: UseFieldPropsParams = {}): Props {\n // Provider defaults, then form context, then the normalization of the\n // deprecated `validationState` prop into `isInvalid`/`isValid`.\n const props: Props = useValidationProps(\n useFormProps(useProviderProps(inputProps)),\n );\n\n // The initial value is what counts: changing it after mount is unsupported.\n const [isDisabled] = useState(params.unsafe__isDisabled ?? false);\n\n const {\n valuePropsMapper = ({ value, onChange }) => {\n return {\n value: value ?? null,\n onChange,\n };\n },\n defaultValidationTrigger = 'onBlur',\n } = params;\n\n const isInsideLegacyField = useInsideLegacyField();\n\n if (props.rules && !props.name) {\n warn(\n `The \"rules\" prop is not suitable for fields that are not part of a form. Use \"name\" prop to link the field to a form.`,\n );\n }\n\n const hasName = props.name != null;\n const generatedId = useId();\n const isBound = hasName && !isInsideLegacyField && !isDisabled;\n\n const field = useFieldBinding<T, Props>(\n props,\n {\n defaultValidationTrigger: params.defaultValidationTrigger,\n unbound: !isBound,\n },\n generatedId,\n );\n\n const isOutsideOfForm = field?.form == null;\n\n const onChangeEvent = useEvent((value, dontTouch: boolean) => {\n field?.onChange?.(\n value,\n dontTouch,\n field?.validateTrigger ?? defaultValidationTrigger,\n );\n });\n\n const resolved = resolveResult();\n // React Aria forwards `form` to native inputs. A modern controller is a\n // binding source, never an HTML form id, including in standalone/group mode.\n const result = isModernFormController(resolved.form)\n ? { ...resolved, form: undefined }\n : resolved;\n\n useDebugValue(result);\n\n return result;\n\n function resolveResult(): Props {\n if (isInsideLegacyField || isDisabled) {\n return props;\n }\n\n if (!hasName) {\n // Standalone field - just add generated ID if not provided\n if (!props.id) {\n const result = { ...props, id: generatedId };\n\n if (result.id && !result.labelProps) {\n result.labelProps = { for: result.id };\n } else if (result.id && result.labelProps && !result.labelProps.for) {\n result.labelProps = { ...result.labelProps, for: result.id };\n }\n\n return result as Props;\n }\n return props;\n }\n\n if (props.rules && isOutsideOfForm) {\n warn(\n `The \"rules\" prop is not supported for fields that are not part of a form. The \"${props.name}\" field is placed outside the form.`,\n );\n }\n\n const valueProps = !isOutsideOfForm\n ? valuePropsMapper({\n value: field.value,\n onChange: onChangeEvent,\n })\n : {};\n\n // Exclude `form` (it must never reach a DOM node) and the field's own\n // handlers: `valueProps` already routes the component's change event into\n // `field.onChange` under the name the component listens to, and `onBlur` is\n // added once below. `mergeProps` chains same-named handlers, so merging them\n // here as well made every user change and every blur run the field handler\n // twice — and onChange/onBlur-triggered validation validate twice.\n const {\n form: _form,\n onChange: _fieldOnChange,\n onBlur: _fieldOnBlur,\n ...fieldRest\n } = field ?? {};\n\n const result: Props = isOutsideOfForm\n ? props\n : mergeProps(props, fieldRest, valueProps, {\n validateTrigger: field.validateTrigger ?? defaultValidationTrigger,\n // Chained after the caller's own `onBlur` by `mergeProps`.\n onBlur: field.onBlur,\n });\n\n return result.id\n ? { ...result, labelProps: { ...result.labelProps, for: result.id } }\n : result;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,cAGd,YAAmB,SAA8B,EAAE,EAAS;CAG5D,MAAM,QAAe,mBACnB,aAAa,iBAAiB,WAAW,CAAC,CAC3C;CAGD,MAAM,CAAC,cAAc,SAAS,OAAO,sBAAsB,MAAM;CAEjE,MAAM,EACJ,oBAAoB,EAAE,OAAO,eAAe;AAC1C,SAAO;GACL,OAAO,SAAS;GAChB;GACD;IAEH,2BAA2B,aACzB;CAEJ,MAAM,sBAAsB,sBAAsB;AAElD,KAAI,MAAM,SAAS,CAAC,MAAM,KACxB,MACE,wHACD;CAGH,MAAM,UAAU,MAAM,QAAQ;CAC9B,MAAM,cAAc,OAAO;CAC3B,MAAM,UAAU,WAAW,CAAC,uBAAuB,CAAC;CAEpD,MAAM,QAAQ,gBACZ,OACA;EACE,0BAA0B,OAAO;EACjC,SAAS,CAAC;EACX,EACD,YACD;CAED,MAAM,kBAAkB,OAAO,QAAQ;CAEvC,MAAM,gBAAgB,UAAU,OAAO,cAAuB;AAC5D,SAAO,WACL,OACA,WACA,OAAO,mBAAmB,yBAC3B;GACD;CAEF,MAAM,WAAW,eAAe;CAGhC,MAAM,SAAS,uBAAuB,SAAS,KAAK,GAChD;EAAE,GAAG;EAAU,MAAM;EAAW,GAChC;AAEJ,eAAc,OAAO;AAErB,QAAO;CAEP,SAAS,gBAAuB;AAC9B,MAAI,uBAAuB,WACzB,QAAO;AAGT,MAAI,CAAC,SAAS;AAEZ,OAAI,CAAC,MAAM,IAAI;IACb,MAAM,SAAS;KAAE,GAAG;KAAO,IAAI;KAAa;AAE5C,QAAI,OAAO,MAAM,CAAC,OAAO,WACvB,QAAO,aAAa,EAAE,KAAK,OAAO,IAAI;aAC7B,OAAO,MAAM,OAAO,cAAc,CAAC,OAAO,WAAW,IAC9D,QAAO,aAAa;KAAE,GAAG,OAAO;KAAY,KAAK,OAAO;KAAI;AAG9D,WAAO;;AAET,UAAO;;AAGT,MAAI,MAAM,SAAS,gBACjB,MACE,kFAAkF,MAAM,KAAK,qCAC9F;EAGH,MAAM,aAAa,CAAC,kBAChB,iBAAiB;GACf,OAAO,MAAM;GACb,UAAU;GACX,CAAC,GACF,EAAE;EAQN,MAAM,EACJ,MAAM,OACN,UAAU,gBACV,QAAQ,cACR,GAAG,cACD,SAAS,EAAE;EAEf,MAAM,SAAgB,kBAClB,QACA,WAAW,OAAO,WAAW,YAAY;GACvC,iBAAiB,MAAM,mBAAmB;GAE1C,QAAQ,MAAM;GACf,CAAC;AAEN,SAAO,OAAO,KACV;GAAE,GAAG;GAAQ,YAAY;IAAE,GAAG,OAAO;IAAY,KAAK,OAAO;IAAI;GAAE,GACnE"}
|
|
@@ -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-740dafc | Cube Dev Team */
|
|
2
2
|
import { useLayoutEffect as useLayoutEffect$1 } from "../../../../utils/react/useLayoutEffect.js";
|
|
3
3
|
import { useEvent } from "../../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { useIsFirstRender } from "../../../../_internal/hooks/use-is-first-render.js";
|
|
@@ -28,12 +28,13 @@ function removeId(name, id) {
|
|
|
28
28
|
}
|
|
29
29
|
function useField(props, params) {
|
|
30
30
|
props = useFormProps(props);
|
|
31
|
-
let { defaultValue, id, idPrefix, name, form, rules, message, description, errorMessage, validateTrigger = params.defaultValidationTrigger, validationDelay, showValid, shouldUpdate, isRequired: isRequiredProp, necessityIndicator: necessityIndicatorProp } = props;
|
|
31
|
+
let { defaultValue, id, idPrefix, name, form: sourceForm, rules, message, description, errorMessage, validateTrigger = params.defaultValidationTrigger, validationDelay, showValid, shouldUpdate, isRequired: isRequiredProp, necessityIndicator: necessityIndicatorProp } = props;
|
|
32
32
|
if (params.unbound) {
|
|
33
33
|
name = void 0;
|
|
34
|
-
|
|
34
|
+
sourceForm = void 0;
|
|
35
35
|
}
|
|
36
|
-
if (!params.unbound && isModernFormController(
|
|
36
|
+
if (!params.unbound && isModernFormController(sourceForm)) throw modernBackendUnavailableError(name != null ? `The "${name}" field` : "A field without a name");
|
|
37
|
+
const form = sourceForm;
|
|
37
38
|
const { isInvalid: isInvalidProp, isValid: isValidProp } = resolveValidationProps(props);
|
|
38
39
|
const processedRules = useMemo(() => {
|
|
39
40
|
let finalRules = rules;
|