native-document 1.0.164 → 1.0.166
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/components.d.ts +2 -0
- package/devtools/widget.js +1 -1
- package/dist/native-document.components.min.js +11074 -2735
- package/dist/native-document.dev.js +2269 -392
- package/dist/native-document.dev.js.map +1 -1
- package/dist/native-document.min.js +1 -1
- package/eslint.config.js +28 -33
- package/i18n.js +1 -1
- package/i18n.ts +2 -0
- package/index.js +4 -1
- package/package.json +3 -2
- package/src/components/$traits/has-draggable/HasDraggable.d.ts +4 -0
- package/src/components/$traits/has-draggable/HasDraggable.js +13 -0
- package/src/components/$traits/has-items/HasItems.d.ts +9 -0
- package/src/components/$traits/has-items/HasItems.js +6 -6
- package/src/components/$traits/has-position/HasFullPosition.d.ts +14 -0
- package/src/components/$traits/has-position/HasFullPosition.js +44 -0
- package/src/components/$traits/has-position/HasPosition.d.ts +7 -0
- package/src/components/$traits/has-position/HasPosition.js +23 -1
- package/src/components/$traits/has-resizable/HasResizable.d.ts +13 -0
- package/src/components/$traits/has-resizable/HasResizable.js +9 -0
- package/src/components/$traits/has-validation/HasValidation.d.ts +17 -0
- package/src/components/$traits/has-validation/HasValidation.js +54 -7
- package/src/components/BaseComponent.d.ts +32 -0
- package/src/components/BaseComponent.js +65 -9
- package/src/components/accordion/Accordion.js +39 -14
- package/src/components/accordion/AccordionItem.js +45 -14
- package/src/components/accordion/index.js +2 -2
- package/src/components/accordion/types/Accordion.d.ts +47 -0
- package/src/components/accordion/types/AccordionItem.d.ts +48 -0
- package/src/components/alert/Alert.js +70 -38
- package/src/components/alert/index.js +2 -2
- package/src/components/alert/types/Alert.d.ts +62 -0
- package/src/components/avatar/Avatar.js +49 -12
- package/src/components/avatar/AvatarGroup.js +50 -2
- package/src/components/avatar/index.js +2 -2
- package/src/components/avatar/types/Avatar.d.ts +74 -0
- package/src/components/avatar/types/AvatarGroup.d.ts +32 -0
- package/src/components/badge/Badge.js +125 -5
- package/src/components/badge/index.js +2 -2
- package/src/components/badge/types/Badge.d.ts +51 -0
- package/src/components/breadcrumb/BreadCrumb.js +61 -5
- package/src/components/breadcrumb/index.js +2 -2
- package/src/components/breadcrumb/types/BreadCrumb.d.ts +42 -0
- package/src/components/button/Button.js +164 -9
- package/src/components/button/index.js +1 -1
- package/src/components/button/types/Button.d.ts +62 -0
- package/src/components/card/Card.js +128 -10
- package/src/components/card/index.js +3 -3
- package/src/components/card/types/Card.d.ts +42 -0
- package/src/components/context-menu/ContextMenu.js +49 -5
- package/src/components/context-menu/ContextMenuGroup.js +15 -2
- package/src/components/context-menu/ContextMenuItem.js +14 -2
- package/src/components/context-menu/index.js +5 -5
- package/src/components/context-menu/types/ContextMenu.d.ts +30 -0
- package/src/components/context-menu/types/ContextMenuGroup.d.ts +18 -0
- package/src/components/context-menu/types/ContextMenuItem.d.ts +18 -0
- package/src/components/divider/Divider.js +120 -4
- package/src/components/divider/index.js +3 -3
- package/src/components/divider/types/Divider.d.ts +55 -0
- package/src/components/dropdown/Dropdown.js +239 -16
- package/src/components/dropdown/DropdownDivider.js +22 -2
- package/src/components/dropdown/DropdownGroup.js +44 -5
- package/src/components/dropdown/DropdownItem.js +76 -3
- package/src/components/dropdown/DropdownTrigger.js +49 -20
- package/src/components/dropdown/helpers.js +1 -1
- package/src/components/dropdown/index.js +6 -6
- package/src/components/dropdown/types/Dropdown.d.ts +88 -0
- package/src/components/dropdown/types/DropdownDivider.d.ts +20 -0
- package/src/components/dropdown/types/DropdownGroup.d.ts +25 -0
- package/src/components/dropdown/types/DropdownItem.d.ts +41 -0
- package/src/components/dropdown/types/DropdownTrigger.d.ts +32 -0
- package/src/components/form/FormControl.js +156 -13
- package/src/components/form/field/Field.js +172 -9
- package/src/components/form/field/FieldCollection.js +116 -12
- package/src/components/form/field/types/AutocompleteField.js +92 -2
- package/src/components/form/field/types/CheckboxField.js +43 -2
- package/src/components/form/field/types/CheckboxGroupField.js +83 -6
- package/src/components/form/field/types/ColorField.js +56 -3
- package/src/components/form/field/types/DateField.js +155 -4
- package/src/components/form/field/types/EmailField.js +54 -4
- package/src/components/form/field/types/FileField.js +140 -6
- package/src/components/form/field/types/HiddenField.js +27 -1
- package/src/components/form/field/types/ImageField.js +82 -3
- package/src/components/form/field/types/NumberField.js +97 -4
- package/src/components/form/field/types/PasswordField.js +103 -7
- package/src/components/form/field/types/RadioField.js +75 -4
- package/src/components/form/field/types/RangeField.js +67 -1
- package/src/components/form/field/types/SearchField.js +41 -2
- package/src/components/form/field/types/SelectField.js +133 -4
- package/src/components/form/field/types/StringField.js +91 -2
- package/src/components/form/field/types/TelField.js +55 -4
- package/src/components/form/field/types/TextAreaField.js +76 -2
- package/src/components/form/field/types/TimeField.js +120 -5
- package/src/components/form/field/types/UrlField.js +59 -4
- package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +83 -4
- package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +61 -3
- package/src/components/form/field/types/file-field-mode/FileItemPreview.js +79 -3
- package/src/components/form/field/types/file-field-mode/FileNativeMode.js +24 -2
- package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +64 -3
- package/src/components/form/field/types/file-field-mode/FileWallMode.js +56 -3
- package/src/components/form/index.js +28 -28
- package/src/components/form/types/Field.d.ts +73 -0
- package/src/components/form/types/FieldCollection.d.ts +53 -0
- package/src/components/form/types/FormControl.d.ts +64 -0
- package/src/components/form/types/fields/AutocompleteField.d.ts +48 -0
- package/src/components/form/types/fields/CheckboxField.d.ts +33 -0
- package/src/components/form/types/fields/CheckboxGroupField.d.ts +49 -0
- package/src/components/form/types/fields/ColorField.d.ts +37 -0
- package/src/components/form/types/fields/DateField.d.ts +70 -0
- package/src/components/form/types/fields/EmailField.d.ts +35 -0
- package/src/components/form/types/fields/FileAvatarMode.d.ts +46 -0
- package/src/components/form/types/fields/FileDropzoneMode.d.ts +28 -0
- package/src/components/form/types/fields/FileField.d.ts +56 -0
- package/src/components/form/types/fields/FileItemPreview.d.ts +35 -0
- package/src/components/form/types/fields/FileNativeMode.d.ts +21 -0
- package/src/components/form/types/fields/FileUploadButtonMode.d.ts +34 -0
- package/src/components/form/types/fields/FileWallMode.d.ts +32 -0
- package/src/components/form/types/fields/HiddenField.d.ts +26 -0
- package/src/components/form/types/fields/ImageField.d.ts +45 -0
- package/src/components/form/types/fields/NumberField.d.ts +48 -0
- package/src/components/form/types/fields/PasswordField.d.ts +46 -0
- package/src/components/form/types/fields/RadioField.d.ts +48 -0
- package/src/components/form/types/fields/RangeField.d.ts +44 -0
- package/src/components/form/types/fields/SearchField.d.ts +34 -0
- package/src/components/form/types/fields/SelectField.d.ts +71 -0
- package/src/components/form/types/fields/StringField.d.ts +48 -0
- package/src/components/form/types/fields/TelField.d.ts +37 -0
- package/src/components/form/types/fields/TextAreaField.d.ts +44 -0
- package/src/components/form/types/fields/TimeField.d.ts +51 -0
- package/src/components/form/types/fields/UrlField.d.ts +35 -0
- package/src/components/form/validation/Validation.js +54 -54
- package/src/components/index.d.ts +160 -0
- package/src/components/list/List.js +99 -15
- package/src/components/list/ListGroup.js +58 -8
- package/src/components/list/ListItem.js +79 -18
- package/src/components/list/index.js +5 -5
- package/src/components/list/types/List.d.ts +43 -0
- package/src/components/list/types/ListGroup.d.ts +37 -0
- package/src/components/list/types/ListItem.d.ts +42 -0
- package/src/components/menu/HasMenuItem.js +55 -6
- package/src/components/menu/Menu.js +113 -22
- package/src/components/menu/MenuDivider.js +18 -2
- package/src/components/menu/MenuGroup.js +61 -6
- package/src/components/menu/MenuItem.js +95 -11
- package/src/components/menu/MenuLink.js +27 -2
- package/src/components/menu/index.js +6 -6
- package/src/components/menu/types/Menu.d.ts +60 -0
- package/src/components/menu/types/MenuDivider.d.ts +19 -0
- package/src/components/menu/types/MenuGroup.d.ts +44 -0
- package/src/components/menu/types/MenuItem.d.ts +46 -0
- package/src/components/menu/types/MenuLink.d.ts +16 -0
- package/src/components/modal/Modal.js +258 -17
- package/src/components/modal/index.js +3 -3
- package/src/components/modal/types/Modal.d.ts +94 -0
- package/src/components/pagination/Pagination.js +155 -7
- package/src/components/pagination/index.js +3 -3
- package/src/components/pagination/types/Pagination.d.ts +68 -0
- package/src/components/popover/Popover.js +198 -11
- package/src/components/popover/PopoverFooter.js +33 -9
- package/src/components/popover/PopoverHeader.js +33 -8
- package/src/components/popover/index.js +4 -4
- package/src/components/popover/types/Popover.d.ts +83 -0
- package/src/components/popover/types/PopoverFooter.d.ts +24 -0
- package/src/components/popover/types/PopoverHeader.d.ts +26 -0
- package/src/components/progress/Progress.js +182 -13
- package/src/components/progress/index.js +3 -3
- package/src/components/progress/types/Progress.d.ts +77 -0
- package/src/components/skeleton/Skeleton.js +117 -49
- package/src/components/skeleton/index.js +3 -3
- package/src/components/skeleton/types/Skeleton.d.ts +55 -0
- package/src/components/slider/Slider.js +207 -10
- package/src/components/slider/index.js +2 -2
- package/src/components/slider/types/Slider.d.ts +82 -0
- package/src/components/spacer/Spacer.js +11 -2
- package/src/components/spacer/index.js +2 -2
- package/src/components/spacer/types/Spacer.d.ts +19 -0
- package/src/components/spinner/Spinner.js +180 -9
- package/src/components/spinner/index.js +3 -3
- package/src/components/spinner/types/Spinner.d.ts +71 -0
- package/src/components/splitter/Splitter.js +76 -13
- package/src/components/splitter/SplitterGutter.js +67 -5
- package/src/components/splitter/SplitterPanel.js +69 -2
- package/src/components/splitter/index.js +5 -5
- package/src/components/splitter/types/Splitter.d.ts +38 -0
- package/src/components/splitter/types/SplitterGutter.d.ts +38 -0
- package/src/components/splitter/types/SplitterPanel.d.ts +41 -0
- package/src/components/stacks/AbsoluteStack.js +23 -3
- package/src/components/stacks/FixedStack.js +23 -3
- package/src/components/stacks/HStack.js +24 -3
- package/src/components/stacks/PositionStack.js +111 -3
- package/src/components/stacks/RelativeStack.js +23 -3
- package/src/components/stacks/Stack.js +73 -2
- package/src/components/stacks/VStack.js +24 -4
- package/src/components/stacks/index.js +7 -7
- package/src/components/stacks/types/AbsoluteStack.d.ts +16 -0
- package/src/components/stacks/types/FixedStack.d.ts +16 -0
- package/src/components/stacks/types/HStack.d.ts +16 -0
- package/src/components/stacks/types/PositionStack.d.ts +54 -0
- package/src/components/stacks/types/RelativeStack.d.ts +17 -0
- package/src/components/stacks/types/Stack.d.ts +39 -0
- package/src/components/stacks/types/VStack.d.ts +16 -0
- package/src/components/stepper/Stepper.js +152 -12
- package/src/components/stepper/StepperStep.js +104 -3
- package/src/components/stepper/index.js +4 -4
- package/src/components/stepper/types/Stepper.d.ts +68 -0
- package/src/components/stepper/types/StepperStep.d.ts +54 -0
- package/src/components/switch/Switch.js +143 -6
- package/src/components/switch/index.js +1 -1
- package/src/components/switch/types/Switch.d.ts +55 -0
- package/src/components/table/Column.js +105 -6
- package/src/components/table/ColumnGroup.js +48 -3
- package/src/components/table/DataTable.js +256 -19
- package/src/components/table/SimpleTable.js +58 -4
- package/src/components/table/index.js +2 -2
- package/src/components/table/types/Column.d.ts +49 -0
- package/src/components/table/types/ColumnGroup.d.ts +28 -0
- package/src/components/table/types/DataTable.d.ts +97 -0
- package/src/components/table/types/SimpleTable.d.ts +40 -0
- package/src/components/tabs/Tabs.js +192 -5
- package/src/components/tabs/index.js +3 -3
- package/src/components/tabs/types/Tabs.d.ts +78 -0
- package/src/components/toast/Toast.js +133 -5
- package/src/components/toast/index.js +3 -3
- package/src/components/toast/types/Toast.d.ts +57 -0
- package/src/components/toast/types/ToastError.d.ts +7 -0
- package/src/components/toast/types/ToastInfo.d.ts +7 -0
- package/src/components/toast/types/ToastSuccess.d.ts +7 -0
- package/src/components/toast/types/ToastWarning.d.ts +7 -0
- package/src/components/tooltip/Tooltip.js +157 -13
- package/src/components/tooltip/index.js +2 -2
- package/src/components/tooltip/prototypes.js +1 -1
- package/src/components/tooltip/types/Tooltip.d.ts +65 -0
- package/src/core/data/MemoryManager.js +2 -2
- package/src/core/data/Observable.js +15 -18
- package/src/core/data/ObservableArray.js +118 -46
- package/src/core/data/ObservableChecker.js +2 -2
- package/src/core/data/ObservableItem.js +135 -21
- package/src/core/data/ObservableObject.js +126 -35
- package/src/core/data/ObservableResource.js +113 -3
- package/src/core/data/Store.js +142 -26
- package/src/core/data/observable-helpers/observable.is-to.js +196 -1
- package/src/core/data/observable-helpers/observable.prototypes.js +33 -8
- package/src/core/elements/anchor/anchor-with-sentinel.js +23 -2
- package/src/core/elements/anchor/anchor.js +16 -7
- package/src/core/elements/anchor/one-child-anchor-overwriting.js +2 -2
- package/src/core/elements/content-formatter.js +1 -1
- package/src/core/elements/control/for-each-array.js +9 -9
- package/src/core/elements/control/for-each.js +14 -14
- package/src/core/elements/control/show-if.js +11 -11
- package/src/core/elements/control/show-when.js +5 -5
- package/src/core/elements/control/switch.js +14 -14
- package/src/core/elements/description-list.js +1 -1
- package/src/core/elements/form.js +2 -2
- package/src/core/elements/fragment.js +1 -1
- package/src/core/elements/html5-semantics.js +1 -1
- package/src/core/elements/img.js +3 -3
- package/src/core/elements/interactive.js +1 -1
- package/src/core/elements/list.js +1 -1
- package/src/core/elements/medias.js +1 -1
- package/src/core/elements/meta-data.js +1 -1
- package/src/core/elements/svg.js +1 -1
- package/src/core/elements/table.js +1 -1
- package/src/core/errors/ArgTypesError.js +1 -1
- package/src/core/utils/HasEventEmitter.js +36 -2
- package/src/core/utils/args-types.js +9 -9
- package/src/core/utils/cache.js +1 -1
- package/src/core/utils/callback-handler.js +29 -0
- package/src/core/utils/debug-manager.js +6 -6
- package/src/core/utils/events.js +139 -139
- package/src/core/utils/filters/date.js +84 -3
- package/src/core/utils/filters/standard.js +136 -11
- package/src/core/utils/filters/strings.js +34 -2
- package/src/core/utils/filters/utils.js +40 -4
- package/src/core/utils/formatters.js +4 -4
- package/src/core/utils/helpers.js +39 -7
- package/src/core/utils/localstorage.js +11 -11
- package/src/core/utils/memoize.js +56 -3
- package/src/core/utils/plugins-manager.js +3 -3
- package/src/core/utils/property-accumulator.js +6 -6
- package/src/core/utils/prototypes.js +26 -1
- package/src/core/utils/shortcut-manager.js +2 -2
- package/src/core/utils/validator.js +8 -8
- package/src/core/wrappers/AttributesWrapper.js +32 -22
- package/src/core/wrappers/DocumentObserver.js +3 -3
- package/src/core/wrappers/ElementCreator.js +5 -5
- package/src/core/wrappers/HtmlElementWrapper.js +38 -12
- package/src/core/wrappers/NDElement.js +328 -22
- package/src/core/wrappers/NdPrototype.js +60 -16
- package/src/core/wrappers/SingletonView.js +50 -2
- package/src/core/wrappers/SvgElementWrapper.js +1 -1
- package/src/core/wrappers/constants.js +35 -2
- package/src/core/wrappers/prototypes/attributes-extensions.js +7 -7
- package/src/core/wrappers/prototypes/nd-element-extensions.js +72 -6
- package/src/core/wrappers/prototypes/nd-element.transition.extensions.js +42 -2
- package/src/core/wrappers/template-cloner/NodeCloner.js +53 -8
- package/src/core/wrappers/template-cloner/TemplateCloner.js +75 -6
- package/src/core/wrappers/template-cloner/attributes-hydrator.js +58 -2
- package/src/core/wrappers/template-cloner/utils.js +42 -6
- package/src/fetch/NativeFetch.js +3 -3
- package/src/i18n/bin/scan.js +6 -6
- package/src/i18n/index.d.ts +2 -0
- package/src/i18n/service/I18nService.d.ts +27 -0
- package/src/i18n/service/I18nService.js +5 -5
- package/src/i18n/service/functions.d.ts +22 -0
- package/src/i18n/service/functions.js +2 -2
- package/src/router/Route.js +3 -3
- package/src/router/RouteGroupHelper.js +2 -2
- package/src/router/Router.js +15 -15
- package/src/router/RouterComponent.js +33 -7
- package/src/router/link.js +4 -4
- package/src/router/modes/HashRouter.js +2 -2
- package/src/router/modes/HistoryRouter.js +2 -2
- package/src/router/modes/MemoryRouter.js +1 -1
- package/src/ui/components/accordion/AccordionItemRender.js +3 -3
- package/src/ui/components/accordion/AccordionRender.js +1 -1
- package/src/ui/components/alert/AlertRender.js +10 -10
- package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +1 -1
- package/src/ui/components/avatar/avatar/AvatarRender.js +1 -1
- package/src/ui/components/breadcrumb/BreadcrumbRender.js +2 -2
- package/src/ui/components/button/ButtonRender.js +1 -1
- package/src/ui/components/contextmenu/ContextmenuRender.js +5 -5
- package/src/ui/components/dropdown/DropdownRender.js +8 -8
- package/src/ui/components/dropdown/group/DropdownGroupRender.js +2 -2
- package/src/ui/components/dropdown/item/DropdownItemRender.js +1 -1
- package/src/ui/components/form/FieldCollectionRender.js +2 -2
- package/src/ui/components/form/FormControlRender.js +5 -5
- package/src/ui/components/form/fields/AutocompleteFieldRender.js +3 -3
- package/src/ui/components/form/fields/CheckboxFieldRender.js +1 -1
- package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +1 -1
- package/src/ui/components/form/fields/DateFieldRender.js +7 -7
- package/src/ui/components/form/fields/EmailFieldRender.js +1 -1
- package/src/ui/components/form/fields/FieldRender.js +4 -4
- package/src/ui/components/form/fields/FileFieldRender.js +1 -1
- package/src/ui/components/form/fields/PasswordFieldRender.js +2 -2
- package/src/ui/components/form/fields/RadioFieldRender.js +1 -1
- package/src/ui/components/form/fields/RangeFieldRender.js +1 -1
- package/src/ui/components/form/fields/SelectFieldRender.js +2 -2
- package/src/ui/components/form/fields/SliderFieldRender.js +6 -6
- package/src/ui/components/form/fields/StringFieldRender.js +1 -1
- package/src/ui/components/form/fields/TelFieldRender.js +1 -1
- package/src/ui/components/form/fields/TextAreaFieldRender.js +1 -1
- package/src/ui/components/form/fields/TimeFieldRender.js +3 -3
- package/src/ui/components/form/fields/UrlFieldRender.js +1 -1
- package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +1 -1
- package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +2 -2
- package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +2 -2
- package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +1 -1
- package/src/ui/components/form/helpers.js +8 -8
- package/src/ui/components/form/index.js +27 -27
- package/src/ui/components/menu/MenuDividerRender.js +1 -1
- package/src/ui/components/menu/MenuGroupRender.js +3 -3
- package/src/ui/components/menu/MenuItemRender.js +2 -2
- package/src/ui/components/menu/MenuLinkRender.js +3 -3
- package/src/ui/components/menu/helpers.js +4 -4
- package/src/ui/components/modal/ModalRender.js +4 -4
- package/src/ui/components/pagination/PaginationRender.js +9 -9
- package/src/ui/components/popover/PopoverRender.js +7 -7
- package/src/ui/components/progress/ProgressRender.js +12 -12
- package/src/ui/components/skeleton/SkeletonRender.js +56 -0
- package/src/ui/components/splitter/SplitterGutterRender.js +1 -1
- package/src/ui/components/splitter/SplitterPanelRender.js +2 -2
- package/src/ui/components/stacks/PositionStackRender.js +1 -1
- package/src/ui/components/stacks/StackRender.js +1 -1
- package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +1 -1
- package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +1 -1
- package/src/ui/components/stacks/h-stack/HStackRender.js +1 -1
- package/src/ui/components/stacks/index.js +5 -5
- package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +1 -1
- package/src/ui/components/stacks/v-stack/VStackRender.js +1 -1
- package/src/ui/components/stepper/StepperRender.js +2 -2
- package/src/ui/components/stepper/StepperStepRender.js +4 -4
- package/src/ui/components/switch/SwitchRender.js +4 -4
- package/src/ui/components/table/data-table/DataTableRender.js +5 -5
- package/src/ui/components/table/data-table/bulk-actions.js +7 -7
- package/src/ui/components/table/data-table/pagination.js +6 -6
- package/src/ui/components/table/data-table/tables.js +25 -25
- package/src/ui/components/table/data-table/toolbar.js +3 -3
- package/src/ui/components/table/simple-table/SimpleTableRender.js +8 -8
- package/src/ui/components/tabs/TabsRender.js +11 -11
- package/src/ui/components/toast/ToastRender.js +3 -3
- package/src/ui/components/tooltip/TooltipRender.js +1 -1
- package/src/ui/index.js +36 -36
- package/types/elements.d.ts +163 -1037
- package/types/forms.d.ts +16 -20
- package/types/globals.d.ts +543 -0
- package/types/images.d.ts +2 -2
- package/types/observable-resource.d.ts +3 -0
- package/types/property-accumulator.d.ts +4 -4
- package/types/store.d.ts +26 -2
- package/types/validator.ts +3 -3
- package/ui.js +1 -0
- package/src/components/form/field/DefaultRender.js +0 -77
- package/src/components/form/field/FieldFactory.js +0 -107
- package/src/components/skeleton/SkeletonCard.js +0 -0
- package/src/components/skeleton/SkeletonList.js +0 -0
- package/src/components/skeleton/SkeletonParagraph.js +0 -0
- package/src/components/skeleton/SkeletonTable.js +0 -0
|
@@ -1,47 +1,116 @@
|
|
|
1
|
-
import Validator from
|
|
2
|
-
import { createFilter, createMultiSourceFilter } from
|
|
3
|
-
import DebugManager from
|
|
4
|
-
|
|
1
|
+
import Validator from '../../utils/validator';
|
|
2
|
+
import { createFilter, createMultiSourceFilter } from './utils';
|
|
3
|
+
import DebugManager from '../debug-manager';
|
|
5
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Creates a filter that passes values strictly equal to the target.
|
|
7
|
+
*
|
|
8
|
+
* @param {*|ObservableItem} observableOrValue - Static value or observable to compare against
|
|
9
|
+
* @returns {FilterResult}
|
|
10
|
+
* @example
|
|
11
|
+
* const statusFilter = equals('active');
|
|
12
|
+
* users.where({ status: statusFilter });
|
|
13
|
+
*/
|
|
6
14
|
export function equals(observableOrValue){
|
|
7
15
|
return createFilter(observableOrValue, (value, target) => value === target);
|
|
8
16
|
}
|
|
9
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Creates a filter that passes values not strictly equal to the target.
|
|
20
|
+
*
|
|
21
|
+
* @param {*|ObservableItem} observableOrValue - Static value or observable
|
|
22
|
+
* @returns {FilterResult}
|
|
23
|
+
*/
|
|
10
24
|
export function notEquals(observableOrValue){
|
|
11
25
|
return createFilter(observableOrValue, (value, target) => value !== target);
|
|
12
26
|
}
|
|
13
27
|
|
|
28
|
+
/**
|
|
29
|
+
* Creates a filter that passes values greater than the target.
|
|
30
|
+
*
|
|
31
|
+
* @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
|
|
32
|
+
* @returns {FilterResult}
|
|
33
|
+
*/
|
|
14
34
|
export function greaterThan(observableOrValue){
|
|
15
35
|
return createFilter(observableOrValue, (value, target) => value > target);
|
|
16
36
|
}
|
|
17
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Creates a filter that passes values greater than or equal to the target.
|
|
40
|
+
*
|
|
41
|
+
* @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
|
|
42
|
+
* @returns {FilterResult}
|
|
43
|
+
*/
|
|
18
44
|
export function greaterThanOrEqual(observableOrValue){
|
|
19
45
|
return createFilter(observableOrValue, (value, target) => value >= target);
|
|
20
46
|
}
|
|
21
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Creates a filter that passes values less than the target.
|
|
50
|
+
*
|
|
51
|
+
* @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
|
|
52
|
+
* @returns {FilterResult}
|
|
53
|
+
*/
|
|
22
54
|
export function lessThan(observableOrValue){
|
|
23
55
|
return createFilter(observableOrValue, (value, target) => value < target);
|
|
24
56
|
}
|
|
25
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Creates a filter that passes values less than or equal to the target.
|
|
60
|
+
*
|
|
61
|
+
* @param {number|ObservableItem<number>} observableOrValue - Threshold value or observable
|
|
62
|
+
* @returns {FilterResult}
|
|
63
|
+
*/
|
|
26
64
|
export function lessThanOrEqual(observableOrValue){
|
|
27
65
|
return createFilter(observableOrValue, (value, target) => value <= target);
|
|
28
66
|
}
|
|
29
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Creates a filter that passes values between min and max (inclusive).
|
|
70
|
+
* Both min and max can be static values or observables.
|
|
71
|
+
*
|
|
72
|
+
* @param {number|ObservableItem<number>} minObservableOrValue - Lower bound
|
|
73
|
+
* @param {number|ObservableItem<number>} maxObservableOrValue - Upper bound
|
|
74
|
+
* @returns {FilterResult}
|
|
75
|
+
* @example
|
|
76
|
+
* items.where({ age: between(18, 65) });
|
|
77
|
+
*/
|
|
30
78
|
export function between(minObservableOrValue, maxObservableOrValue){
|
|
31
79
|
return createMultiSourceFilter(
|
|
32
80
|
[minObservableOrValue, maxObservableOrValue],
|
|
33
|
-
(value, [min, max]) => value >= min && value <= max
|
|
81
|
+
(value, [min, max]) => value >= min && value <= max,
|
|
34
82
|
);
|
|
35
83
|
}
|
|
36
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Creates a filter that passes values included in the given array.
|
|
87
|
+
*
|
|
88
|
+
* @param {Array|ObservableItem<Array>} observableOrArray - Array to check membership in
|
|
89
|
+
* @returns {FilterResult}
|
|
90
|
+
* @example
|
|
91
|
+
* items.where({ role: inArray(['admin', 'editor']) });
|
|
92
|
+
*/
|
|
37
93
|
export function inArray(observableOrArray){
|
|
38
94
|
return createFilter(observableOrArray, (value, arr) => arr.includes(value));
|
|
39
95
|
}
|
|
40
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Creates a filter that passes values not included in the given array.
|
|
99
|
+
*
|
|
100
|
+
* @param {Array|ObservableItem<Array>} observableOrArray - Array to check exclusion from
|
|
101
|
+
* @returns {FilterResult}
|
|
102
|
+
*/
|
|
41
103
|
export function notIn(observableOrArray){
|
|
42
104
|
return createFilter(observableOrArray, (value, arr) => !arr.includes(value));
|
|
43
105
|
}
|
|
44
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Creates a filter that passes when the value is empty (null, undefined, empty string, or empty array).
|
|
109
|
+
* Pass false as the argument to filter for non-empty values instead.
|
|
110
|
+
*
|
|
111
|
+
* @param {boolean|ObservableItem<boolean>} [observableOrValue=true] - If true, filters empty values; if false, filters non-empty
|
|
112
|
+
* @returns {FilterResult}
|
|
113
|
+
*/
|
|
45
114
|
export function isEmpty(observableOrValue = true){
|
|
46
115
|
return createFilter(observableOrValue, (value, shouldBeEmpty) => {
|
|
47
116
|
const isActuallyEmpty = !value || value === '' ||
|
|
@@ -51,6 +120,13 @@ export function isEmpty(observableOrValue = true){
|
|
|
51
120
|
});
|
|
52
121
|
}
|
|
53
122
|
|
|
123
|
+
/**
|
|
124
|
+
* Creates a filter that passes when the value is not empty.
|
|
125
|
+
* Pass false as the argument to filter for empty values instead.
|
|
126
|
+
*
|
|
127
|
+
* @param {boolean|ObservableItem<boolean>} [observableOrValue=true] - If true, filters non-empty values
|
|
128
|
+
* @returns {FilterResult}
|
|
129
|
+
*/
|
|
54
130
|
export function isNotEmpty(observableOrValue = true){
|
|
55
131
|
return createFilter(observableOrValue, (value, shouldBeNotEmpty) => {
|
|
56
132
|
const isActuallyNotEmpty = !!value && value !== '' &&
|
|
@@ -60,6 +136,18 @@ export function isNotEmpty(observableOrValue = true){
|
|
|
60
136
|
});
|
|
61
137
|
}
|
|
62
138
|
|
|
139
|
+
/**
|
|
140
|
+
* Creates a filter that tests the value against a pattern (string or regex).
|
|
141
|
+
*
|
|
142
|
+
* @param {string|RegExp|ObservableItem} patternObservableOrValue - Pattern to match against
|
|
143
|
+
* @param {boolean|ObservableItem<boolean>} [asRegexObservableOrValue=true] - If true, treat pattern as a regex; if false, use case-insensitive substring match
|
|
144
|
+
* @param {string|ObservableItem<string>} [flagsObservableOrValue=''] - Regex flags (e.g. 'i', 'g')
|
|
145
|
+
* @returns {FilterResult}
|
|
146
|
+
* @example
|
|
147
|
+
* const search = Observable('john');
|
|
148
|
+
* users.where({ name: match(search) }); // regex match, reactive
|
|
149
|
+
* users.where({ name: match('john', false) }); // case-insensitive substring
|
|
150
|
+
*/
|
|
63
151
|
export function match(patternObservableOrValue, asRegexObservableOrValue = true, flagsObservableOrValue = ''){
|
|
64
152
|
return createMultiSourceFilter(
|
|
65
153
|
[patternObservableOrValue, asRegexObservableOrValue, flagsObservableOrValue],
|
|
@@ -80,10 +168,19 @@ export function match(patternObservableOrValue, asRegexObservableOrValue = true,
|
|
|
80
168
|
return String(value).toLowerCase().includes(String(pattern).toLowerCase());
|
|
81
169
|
}
|
|
82
170
|
return String(value).includes(String(pattern));
|
|
83
|
-
}
|
|
171
|
+
},
|
|
84
172
|
);
|
|
85
173
|
}
|
|
86
174
|
|
|
175
|
+
/**
|
|
176
|
+
* Combines multiple filters with AND logic — all filters must pass.
|
|
177
|
+
* Merges dependencies from all child filters automatically.
|
|
178
|
+
*
|
|
179
|
+
* @param {...FilterResult} filters - Filters to combine
|
|
180
|
+
* @returns {FilterResult}
|
|
181
|
+
* @example
|
|
182
|
+
* items.where({ _: and(greaterThan(18), lessThan(65)) });
|
|
183
|
+
*/
|
|
87
184
|
export function and(...filters){
|
|
88
185
|
const dependencies = filters
|
|
89
186
|
.flatMap(f => f.dependencies ? (Array.isArray(f.dependencies) ? f.dependencies : [f.dependencies]) : [])
|
|
@@ -91,10 +188,19 @@ export function and(...filters){
|
|
|
91
188
|
|
|
92
189
|
return {
|
|
93
190
|
dependencies: dependencies.length > 0 ? dependencies : null,
|
|
94
|
-
callback: (value) => filters.every(f => f.callback(value))
|
|
191
|
+
callback: (value) => filters.every(f => f.callback(value)),
|
|
95
192
|
};
|
|
96
193
|
}
|
|
97
194
|
|
|
195
|
+
/**
|
|
196
|
+
* Combines multiple filters with OR logic — at least one filter must pass.
|
|
197
|
+
* Merges dependencies from all child filters automatically.
|
|
198
|
+
*
|
|
199
|
+
* @param {...FilterResult} filters - Filters to combine
|
|
200
|
+
* @returns {FilterResult}
|
|
201
|
+
* @example
|
|
202
|
+
* items.where({ _: or(equals('admin'), equals('editor')) });
|
|
203
|
+
*/
|
|
98
204
|
export function or(...filters){
|
|
99
205
|
const dependencies = filters
|
|
100
206
|
.flatMap(f => f.dependencies ? (Array.isArray(f.dependencies) ? f.dependencies : [f.dependencies]) : [])
|
|
@@ -102,17 +208,36 @@ export function or(...filters){
|
|
|
102
208
|
|
|
103
209
|
return {
|
|
104
210
|
dependencies: dependencies.length > 0 ? dependencies : null,
|
|
105
|
-
callback: (value) => filters.some(f => f.callback(value))
|
|
211
|
+
callback: (value) => filters.some(f => f.callback(value)),
|
|
106
212
|
};
|
|
107
213
|
}
|
|
108
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Negates a filter — passes when the given filter does not pass.
|
|
217
|
+
*
|
|
218
|
+
* @param {FilterResult} filter - Filter to negate
|
|
219
|
+
* @returns {FilterResult}
|
|
220
|
+
* @example
|
|
221
|
+
* items.where({ status: not(equals('deleted')) });
|
|
222
|
+
*/
|
|
109
223
|
export function not(filter){
|
|
110
224
|
return {
|
|
111
225
|
dependencies: filter.dependencies,
|
|
112
|
-
callback: (value) => !filter.callback(value)
|
|
226
|
+
callback: (value) => !filter.callback(value),
|
|
113
227
|
};
|
|
114
228
|
}
|
|
115
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Creates a custom filter from a callback and a list of observable dependencies.
|
|
232
|
+
* The callback receives the item value followed by the current values of all observables.
|
|
233
|
+
*
|
|
234
|
+
* @param {(value: *, ...depValues: any[]) => boolean} callbackFn - Filter function
|
|
235
|
+
* @param {...ObservableItem} observables - Observable dependencies passed as extra arguments to callback
|
|
236
|
+
* @returns {FilterResult}
|
|
237
|
+
* @example
|
|
238
|
+
* const minAge = Observable(18);
|
|
239
|
+
* items.where({ age: custom((age, min) => age >= min, minAge) });
|
|
240
|
+
*/
|
|
116
241
|
export function custom(callbackFn, ...observables){
|
|
117
242
|
const dependencies = observables.filter(Validator.isObservable);
|
|
118
243
|
|
|
@@ -120,10 +245,10 @@ export function custom(callbackFn, ...observables){
|
|
|
120
245
|
dependencies: dependencies.length > 0 ? dependencies : null,
|
|
121
246
|
callback: (value) => {
|
|
122
247
|
const values = observables.map(o =>
|
|
123
|
-
Validator.isObservable(o) ? o.val() : o
|
|
248
|
+
Validator.isObservable(o) ? o.val() : o,
|
|
124
249
|
);
|
|
125
250
|
return callbackFn(value, ...values);
|
|
126
|
-
}
|
|
251
|
+
},
|
|
127
252
|
};
|
|
128
253
|
}
|
|
129
254
|
|
|
@@ -1,6 +1,18 @@
|
|
|
1
|
-
import { createFilter, createMultiSourceFilter } from
|
|
2
|
-
|
|
1
|
+
import { createFilter, createMultiSourceFilter } from './utils';
|
|
3
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Creates a filter that passes when the value includes the given query string.
|
|
5
|
+
* Case-insensitive by default.
|
|
6
|
+
* Alias: contains
|
|
7
|
+
*
|
|
8
|
+
* @param {string|ObservableItem<string>} observableOrValue - Substring to search for
|
|
9
|
+
* @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
|
|
10
|
+
* @returns {FilterResult}
|
|
11
|
+
* @example
|
|
12
|
+
* const search = Observable('john');
|
|
13
|
+
* users.where({ name: includes(search) }); // reactive, case-insensitive
|
|
14
|
+
* users.where({ name: includes('John', true) }); // case-sensitive
|
|
15
|
+
*/
|
|
4
16
|
export function includes(observableOrValue, caseSensitive = false){
|
|
5
17
|
return createFilter(observableOrValue, (value, query) => {
|
|
6
18
|
if (!value) return false;
|
|
@@ -14,6 +26,16 @@ export function includes(observableOrValue, caseSensitive = false){
|
|
|
14
26
|
|
|
15
27
|
export const contains = includes;
|
|
16
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Creates a filter that passes when the value starts with the given query string.
|
|
31
|
+
* Case-insensitive by default.
|
|
32
|
+
*
|
|
33
|
+
* @param {string|ObservableItem<string>} observableOrValue - Prefix to search for
|
|
34
|
+
* @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
|
|
35
|
+
* @returns {FilterResult}
|
|
36
|
+
* @example
|
|
37
|
+
* users.where({ name: startsWith('Jo') });
|
|
38
|
+
*/
|
|
17
39
|
export function startsWith(observableOrValue, caseSensitive = false){
|
|
18
40
|
return createFilter(observableOrValue, (value, query) => {
|
|
19
41
|
if (!query) return true;
|
|
@@ -24,6 +46,16 @@ export function startsWith(observableOrValue, caseSensitive = false){
|
|
|
24
46
|
});
|
|
25
47
|
}
|
|
26
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Creates a filter that passes when the value ends with the given query string.
|
|
51
|
+
* Case-insensitive by default.
|
|
52
|
+
*
|
|
53
|
+
* @param {string|ObservableItem<string>} observableOrValue - Suffix to search for
|
|
54
|
+
* @param {boolean} [caseSensitive=false] - If true, comparison is case-sensitive
|
|
55
|
+
* @returns {FilterResult}
|
|
56
|
+
* @example
|
|
57
|
+
* files.where({ name: endsWith('.js') });
|
|
58
|
+
*/
|
|
27
59
|
export function endsWith(observableOrValue, caseSensitive = false){
|
|
28
60
|
return createFilter(observableOrValue, (value, query) => {
|
|
29
61
|
if (!query) return true;
|
|
@@ -1,10 +1,23 @@
|
|
|
1
|
-
import Validator from
|
|
1
|
+
import Validator from '../../utils/validator';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Converts a value to a Date object. Returns the value as-is if it's already a Date.
|
|
5
|
+
*
|
|
6
|
+
* @param {Date|number|string} value - Value to convert
|
|
7
|
+
* @returns {Date}
|
|
8
|
+
*/
|
|
3
9
|
export function toDate(value) {
|
|
4
10
|
if (value instanceof Date) return value;
|
|
5
11
|
return new Date(value);
|
|
6
12
|
}
|
|
7
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Returns true if two date values fall on the same calendar day (year, month, day).
|
|
16
|
+
*
|
|
17
|
+
* @param {Date|number|string} date1 - First date
|
|
18
|
+
* @param {Date|number|string} date2 - Second date
|
|
19
|
+
* @returns {boolean}
|
|
20
|
+
*/
|
|
8
21
|
export function isSameDay(date1, date2) {
|
|
9
22
|
const d1 = toDate(date1);
|
|
10
23
|
const d2 = toDate(date2);
|
|
@@ -13,29 +26,52 @@ export function isSameDay(date1, date2) {
|
|
|
13
26
|
d1.getDate() === d2.getDate();
|
|
14
27
|
}
|
|
15
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Returns the total number of seconds elapsed since midnight for the given date's time component.
|
|
31
|
+
* Used internally for time range comparisons.
|
|
32
|
+
*
|
|
33
|
+
* @param {Date|number|string} date - Date value to extract time from
|
|
34
|
+
* @returns {number} Seconds since midnight (0–86399)
|
|
35
|
+
*/
|
|
16
36
|
export function getSecondsOfDay(date) {
|
|
17
37
|
const d = toDate(date);
|
|
18
38
|
return (d.getHours() * 3600) + (d.getMinutes() * 60) + d.getSeconds();
|
|
19
39
|
}
|
|
20
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Creates a FilterResult from a single observable or static value and a comparison callback.
|
|
43
|
+
* If the value is an observable, it is registered as a dependency so the filter reacts to changes.
|
|
44
|
+
*
|
|
45
|
+
* @param {*|ObservableItem} observableOrValue - Observable or static value used as the comparison target
|
|
46
|
+
* @param {(value: *, target: *) => boolean} callbackFn - Filter function receiving (item value, target value)
|
|
47
|
+
* @returns {{ dependencies: ObservableItem|null, callback: (value: *) => boolean }} FilterResult
|
|
48
|
+
*/
|
|
21
49
|
export function createFilter(observableOrValue, callbackFn){
|
|
22
50
|
const isObservable = Validator.isObservable(observableOrValue);
|
|
23
51
|
|
|
24
52
|
return {
|
|
25
53
|
dependencies: isObservable ? observableOrValue : null,
|
|
26
|
-
callback: (value) => callbackFn(value, isObservable ? observableOrValue.val() : observableOrValue)
|
|
54
|
+
callback: (value) => callbackFn(value, isObservable ? observableOrValue.val() : observableOrValue),
|
|
27
55
|
};
|
|
28
56
|
}
|
|
29
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Creates a FilterResult from multiple observable or static sources and a multi-value comparison callback.
|
|
60
|
+
* All observable sources are registered as dependencies.
|
|
61
|
+
*
|
|
62
|
+
* @param {Array<*|ObservableItem>} sources - Array of observables or static values
|
|
63
|
+
* @param {(value: *, targets: any[]) => boolean} callbackFn - Filter function receiving (item value, array of resolved source values)
|
|
64
|
+
* @returns {{ dependencies: ObservableItem[]|null, callback: (value: *) => boolean }} FilterResult
|
|
65
|
+
*/
|
|
30
66
|
export function createMultiSourceFilter(sources, callbackFn){
|
|
31
67
|
const observables = sources.filter(Validator.isObservable);
|
|
32
68
|
|
|
33
69
|
const getValues = () => sources.map(src =>
|
|
34
|
-
Validator.isObservable(src) ? src.val() : src
|
|
70
|
+
Validator.isObservable(src) ? src.val() : src,
|
|
35
71
|
);
|
|
36
72
|
|
|
37
73
|
return {
|
|
38
74
|
dependencies: observables.length > 0 ? observables : null,
|
|
39
|
-
callback: (value) => callbackFn(value, getValues())
|
|
75
|
+
callback: (value) => callbackFn(value, getValues()),
|
|
40
76
|
};
|
|
41
77
|
}
|
|
@@ -12,7 +12,7 @@ const $parseDateParts = (value, locale) => {
|
|
|
12
12
|
}).formatToParts(d).reduce((acc, { type, value }) => {
|
|
13
13
|
acc[type] = value;
|
|
14
14
|
return acc;
|
|
15
|
-
}, {})
|
|
15
|
+
}, {}),
|
|
16
16
|
};
|
|
17
17
|
};
|
|
18
18
|
|
|
@@ -38,20 +38,20 @@ export const Formatters = {
|
|
|
38
38
|
currency,
|
|
39
39
|
notation,
|
|
40
40
|
minimumFractionDigits,
|
|
41
|
-
maximumFractionDigits
|
|
41
|
+
maximumFractionDigits,
|
|
42
42
|
}).format(value),
|
|
43
43
|
|
|
44
44
|
number: (value, locale, { notation, minimumFractionDigits, maximumFractionDigits } = {}) =>
|
|
45
45
|
new Intl.NumberFormat(locale, {
|
|
46
46
|
notation,
|
|
47
47
|
minimumFractionDigits,
|
|
48
|
-
maximumFractionDigits
|
|
48
|
+
maximumFractionDigits,
|
|
49
49
|
}).format(value),
|
|
50
50
|
|
|
51
51
|
percent: (value, locale, { decimals = 1 } = {}) =>
|
|
52
52
|
new Intl.NumberFormat(locale, {
|
|
53
53
|
style: 'percent',
|
|
54
|
-
maximumFractionDigits: decimals
|
|
54
|
+
maximumFractionDigits: decimals,
|
|
55
55
|
}).format(value),
|
|
56
56
|
|
|
57
57
|
date: (value, locale, { format, dateStyle = 'long' } = {}) => {
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import Validator from
|
|
1
|
+
import Validator from './validator';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Calls a function with the given arguments and optional context.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
* @param {Function} fn - Function to invoke
|
|
8
|
+
* @param {Array} args - Arguments to pass
|
|
9
|
+
* @param {Object|null} [context] - `this` context, or null to call without binding
|
|
10
|
+
*/
|
|
3
11
|
const invoke = function(fn, args, context) {
|
|
4
12
|
if(context) {
|
|
5
13
|
fn.apply(context, args);
|
|
@@ -32,7 +40,7 @@ export const debounce = function(fn, delay, options = {}) {
|
|
|
32
40
|
// debounce mode: reset the timer for each call
|
|
33
41
|
clearTimeout(timer);
|
|
34
42
|
timer = setTimeout(() => invoke(fn, lastArgs, context), delay);
|
|
35
|
-
}
|
|
43
|
+
};
|
|
36
44
|
};
|
|
37
45
|
|
|
38
46
|
export const nextTick = function(fn) {
|
|
@@ -48,12 +56,18 @@ export const nextTick = function(fn) {
|
|
|
48
56
|
};
|
|
49
57
|
};
|
|
50
58
|
|
|
59
|
+
|
|
51
60
|
/**
|
|
61
|
+
* Returns the unique key for a given item, used by ForEach and ForEachArray for DOM diffing.
|
|
62
|
+
* Resolution order:
|
|
63
|
+
* 1. If key is a function: calls key(item, defaultKey)
|
|
64
|
+
* 2. If key is a string: reads item[key] (unwrapping observables)
|
|
65
|
+
* 3. Otherwise: returns item value or defaultKey
|
|
52
66
|
*
|
|
53
|
-
* @param {*} item
|
|
54
|
-
* @param {string|
|
|
55
|
-
* @param {
|
|
56
|
-
* @returns {
|
|
67
|
+
* @param {*} item - The item to extract a key from
|
|
68
|
+
* @param {string|number} defaultKey - Fallback key (usually the array index)
|
|
69
|
+
* @param {string|Function|null} key - Key property name or custom key function
|
|
70
|
+
* @returns {string|number} The resolved unique key
|
|
57
71
|
*/
|
|
58
72
|
export const getKey = (item, defaultKey, key) => {
|
|
59
73
|
if (Validator.isString(key)) {
|
|
@@ -70,10 +84,28 @@ export const getKey = (item, defaultKey, key) => {
|
|
|
70
84
|
return val ?? defaultKey;
|
|
71
85
|
};
|
|
72
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Trims all leading and trailing occurrences of char from str.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} str - String to trim
|
|
91
|
+
* @param {string} char - Character to remove from both ends
|
|
92
|
+
* @returns {string} Trimmed string
|
|
93
|
+
* @example
|
|
94
|
+
* trim('/foo/bar/', '/'); // 'foo/bar'
|
|
95
|
+
*/
|
|
73
96
|
export const trim = function(str, char) {
|
|
74
97
|
return str.replace(new RegExp(`^[${char}]+|[${char}]+$`, 'g'), '');
|
|
75
|
-
}
|
|
98
|
+
};
|
|
76
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Deep clones a value. Uses structuredClone when available.
|
|
102
|
+
* Handles: primitives, Dates, Arrays, plain Objects.
|
|
103
|
+
* Observables are kept by reference (not cloned); onObservableFound is called for each.
|
|
104
|
+
*
|
|
105
|
+
* @param {*} value - Value to clone
|
|
106
|
+
* @param {((observable: ObservableItem) => void)?} [onObservableFound] - Called for each observable encountered
|
|
107
|
+
* @returns {*} Deep clone of the value
|
|
108
|
+
*/
|
|
77
109
|
export const deepClone = (value, onObservableFound) => {
|
|
78
110
|
try {
|
|
79
111
|
if(window.structuredClone !== undefined) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import NativeDocumentError from
|
|
1
|
+
import NativeDocumentError from '../errors/NativeDocumentError';
|
|
2
2
|
|
|
3
3
|
export const LocalStorage = {
|
|
4
4
|
getJson(key) {
|
|
5
|
-
|
|
5
|
+
const value = localStorage.getItem(key);
|
|
6
6
|
try {
|
|
7
7
|
return JSON.parse(value);
|
|
8
8
|
} catch (e) {
|
|
@@ -33,25 +33,25 @@ export const LocalStorage = {
|
|
|
33
33
|
},
|
|
34
34
|
has(key) {
|
|
35
35
|
return localStorage.getItem(key) != null;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
38
|
|
|
39
39
|
export const $getFromStorage = (key, value) => {
|
|
40
40
|
if(!LocalStorage.has(key)) {
|
|
41
41
|
return value;
|
|
42
42
|
}
|
|
43
43
|
switch (typeof value) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
case 'object': return LocalStorage.getJson(key) ?? value;
|
|
45
|
+
case 'boolean': return LocalStorage.getBool(key) ?? value;
|
|
46
|
+
case 'number': return LocalStorage.getNumber(key) ?? value;
|
|
47
|
+
default: return LocalStorage.get(key, value) ?? value;
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
50
|
|
|
51
51
|
export const $saveToStorage = (value) => {
|
|
52
52
|
switch (typeof value) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
case 'object': return LocalStorage.setJson;
|
|
54
|
+
case 'boolean': return LocalStorage.setBool;
|
|
55
|
+
default: return LocalStorage.set;
|
|
56
56
|
}
|
|
57
57
|
};
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Wraps a function so it executes at most once.
|
|
5
|
+
* Later calls return the cached result without re-executing the function.
|
|
6
|
+
*
|
|
7
|
+
* @template T
|
|
8
|
+
* @param {(...args: any[]) => T} fn - Function to wrap
|
|
9
|
+
* @returns {(...args: any[]) => T} Memoized function
|
|
10
|
+
* @example
|
|
11
|
+
* const init = once(() => expensiveSetup());
|
|
12
|
+
* init(); // runs setup
|
|
13
|
+
* init(); // returns cached result
|
|
14
|
+
*/
|
|
3
15
|
export const once = (fn) => {
|
|
4
16
|
let result = null;
|
|
5
17
|
return (...args) => {
|
|
@@ -11,6 +23,18 @@ export const once = (fn) => {
|
|
|
11
23
|
};
|
|
12
24
|
};
|
|
13
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Creates a lazy proxy that calls fn() once on first property access,
|
|
28
|
+
* then returns properties from the cached result for all later accesses.
|
|
29
|
+
*
|
|
30
|
+
* @template T
|
|
31
|
+
* @param {() => T} fn - Factory function to call once
|
|
32
|
+
* @returns {T} Proxy to the lazily created object
|
|
33
|
+
* @example
|
|
34
|
+
* const store = autoOnce(() => createExpensiveStore());
|
|
35
|
+
* store.count; // triggers createExpensiveStore() on first access
|
|
36
|
+
* store.name; // uses a cached result
|
|
37
|
+
*/
|
|
14
38
|
export const autoOnce = (fn) => {
|
|
15
39
|
let target = null;
|
|
16
40
|
return new Proxy({}, {
|
|
@@ -20,10 +44,22 @@ export const autoOnce = (fn) => {
|
|
|
20
44
|
}
|
|
21
45
|
target = fn();
|
|
22
46
|
return target[key];
|
|
23
|
-
}
|
|
47
|
+
},
|
|
24
48
|
});
|
|
25
49
|
};
|
|
26
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Wraps a function with key-based memoization.
|
|
53
|
+
* The first argument is used as the cache key; later arguments are passed to fn.
|
|
54
|
+
*
|
|
55
|
+
* @template T
|
|
56
|
+
* @param {(...args: any[]) => T} fn - Function to memoize
|
|
57
|
+
* @returns {(key: any, ...args: any[]) => T} Memoized function
|
|
58
|
+
* @example
|
|
59
|
+
* const getUser = memoize((id) => fetchUser(id));
|
|
60
|
+
* getUser('user-1', 1); // fetches
|
|
61
|
+
* getUser('user-1', 1); // returns cached
|
|
62
|
+
*/
|
|
27
63
|
export const memoize = (fn) => {
|
|
28
64
|
const cache = new Map();
|
|
29
65
|
return (...args) => {
|
|
@@ -38,6 +74,23 @@ export const memoize = (fn) => {
|
|
|
38
74
|
};
|
|
39
75
|
};
|
|
40
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Creates a proxy where each property access memorizes the result of calling fn with the property key.
|
|
79
|
+
* If fn accepts arguments (fn.length > 0), the proxy returns a memoized function instead.
|
|
80
|
+
*
|
|
81
|
+
* @template T
|
|
82
|
+
* @param {((key: string|symbol, ...args?: any[]) => T)} fn - Factory function
|
|
83
|
+
* @returns {Record<string|symbol, T>} Proxy with per-key memoized results
|
|
84
|
+
* @example
|
|
85
|
+
* // fn with no args — result memoized by key
|
|
86
|
+
* const icons = autoMemoize((name) => loadIcon(name));
|
|
87
|
+
* icons.home; // calls loadIcon('home'), caches result
|
|
88
|
+
* icons.home; // returns cached
|
|
89
|
+
*
|
|
90
|
+
* // fn with args — returns a memoized function per key
|
|
91
|
+
* const formatters = autoMemoize((locale, value) => format(value, locale));
|
|
92
|
+
* formatters.fr('hello'); // calls format('hello', 'fr'), caches under 'fr'
|
|
93
|
+
*/
|
|
41
94
|
export const autoMemoize = (fn) => {
|
|
42
95
|
const cache = new Map();
|
|
43
96
|
return new Proxy({}, {
|
|
@@ -52,11 +105,11 @@ export const autoMemoize = (fn) => {
|
|
|
52
105
|
const result = fn(...args, key);
|
|
53
106
|
cache.set(key, result);
|
|
54
107
|
return result;
|
|
55
|
-
}
|
|
108
|
+
};
|
|
56
109
|
}
|
|
57
110
|
const result = fn(key);
|
|
58
111
|
cache.set(key, result);
|
|
59
112
|
return result;
|
|
60
|
-
}
|
|
113
|
+
},
|
|
61
114
|
});
|
|
62
115
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import DebugManager from
|
|
1
|
+
import DebugManager from './debug-manager';
|
|
2
2
|
|
|
3
3
|
let PluginsManager = null;
|
|
4
4
|
|
|
@@ -18,7 +18,7 @@ if(process.env.NODE_ENV === 'development') {
|
|
|
18
18
|
}
|
|
19
19
|
name = name || plugin.name;
|
|
20
20
|
if (!name || typeof name !== 'string') {
|
|
21
|
-
throw new Error(
|
|
21
|
+
throw new Error('Please, provide a valid plugin name');
|
|
22
22
|
}
|
|
23
23
|
if($plugins.has(name)) {
|
|
24
24
|
return;
|
|
@@ -73,7 +73,7 @@ if(process.env.NODE_ENV === 'development') {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
|
-
}
|
|
76
|
+
},
|
|
77
77
|
};
|
|
78
78
|
}());
|
|
79
79
|
}
|