@vizejs/composable 0.426.2 → 0.427.0
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/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-storage.d.ts
|
|
4
|
+
/** Minimal synchronous key-value store compatible with the Web Storage API. */
|
|
5
|
+
interface StorageLike {
|
|
6
|
+
/** Read the raw string stored for `key`, or `null` when absent. */
|
|
7
|
+
readonly getItem: (key: string) => string | null;
|
|
8
|
+
/** Store `value` under `key`. May throw (for example on quota exhaustion). */
|
|
9
|
+
readonly setItem: (key: string, value: string) => void;
|
|
10
|
+
/** Remove `key`. Removing an absent key is a no-op. */
|
|
11
|
+
readonly removeItem: (key: string) => void;
|
|
12
|
+
}
|
|
13
|
+
/** Converts one value type to and from its stored string representation. */
|
|
14
|
+
interface StorageSerializer<Value> {
|
|
15
|
+
/** Decode a stored string. Throwing marks the stored value as unreadable. */
|
|
16
|
+
readonly read: (raw: string) => Value;
|
|
17
|
+
/** Encode a value for storage. */
|
|
18
|
+
readonly write: (value: Value) => string;
|
|
19
|
+
}
|
|
20
|
+
/** Built-in serializers selected by {@link inferStorageSerializerKind}. */
|
|
21
|
+
type StorageSerializerKind = "bigint" | "boolean" | "date" | "map" | "number" | "object" | "set" | "string";
|
|
22
|
+
/** Stable machine-readable failure codes reported by {@link useStorage}. */
|
|
23
|
+
type StorageErrorCode = "read-failed" | "invalid-value" | "write-failed" | "remove-failed";
|
|
24
|
+
/** Failure observed while synchronizing a value with storage. */
|
|
25
|
+
interface StorageFailure {
|
|
26
|
+
/** Which synchronization step failed. */
|
|
27
|
+
readonly code: StorageErrorCode;
|
|
28
|
+
/** Storage key involved in the failure. */
|
|
29
|
+
readonly key: string;
|
|
30
|
+
/** Exact thrown value, or the rejected candidate for `"invalid-value"`. */
|
|
31
|
+
readonly cause: unknown;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validate a decoded candidate before it replaces the reactive value.
|
|
35
|
+
*
|
|
36
|
+
* Return `true` to accept the candidate. A type guard narrows `unknown` to
|
|
37
|
+
* the value type; plug schema libraries in here (for example
|
|
38
|
+
* `(candidate) => schema.safeParse(candidate).success`).
|
|
39
|
+
*/
|
|
40
|
+
type StorageValidator<Value> = (candidate: unknown) => candidate is Value;
|
|
41
|
+
/** Options for {@link useStorage}. */
|
|
42
|
+
interface UseStorageOptions<Value> {
|
|
43
|
+
/**
|
|
44
|
+
* Reactive storage backend. `null`/`undefined` keeps the composable on its
|
|
45
|
+
* default value, which is also what happens during server rendering.
|
|
46
|
+
*
|
|
47
|
+
* @default window.localStorage when a browser window exists
|
|
48
|
+
*/
|
|
49
|
+
readonly storage?: MaybeRefOrGetter<StorageLike | null | undefined>;
|
|
50
|
+
/**
|
|
51
|
+
* Event target receiving cross-document `storage` events and same-document
|
|
52
|
+
* synchronization events between instances sharing a key.
|
|
53
|
+
*
|
|
54
|
+
* @default window when a browser window exists
|
|
55
|
+
*/
|
|
56
|
+
readonly eventTarget?: MaybeRefOrGetter<EventTarget | null | undefined>;
|
|
57
|
+
/**
|
|
58
|
+
* Explicit serializer. When omitted the serializer is inferred from the
|
|
59
|
+
* default value (see {@link inferStorageSerializerKind}).
|
|
60
|
+
*
|
|
61
|
+
* @default inferred from the default value
|
|
62
|
+
*/
|
|
63
|
+
readonly serializer?: StorageSerializer<Value>;
|
|
64
|
+
/**
|
|
65
|
+
* Schema validation hook applied to every decoded value. Rejected values
|
|
66
|
+
* fall back to the default and report an `"invalid-value"` failure.
|
|
67
|
+
*
|
|
68
|
+
* @default a structural check that the stored value has the default's kind
|
|
69
|
+
*/
|
|
70
|
+
readonly validate?: StorageValidator<Value>;
|
|
71
|
+
/**
|
|
72
|
+
* Merge a stored object with the default so newly added default keys are
|
|
73
|
+
* present. `true` performs a shallow merge; a function merges explicitly.
|
|
74
|
+
*
|
|
75
|
+
* @default false
|
|
76
|
+
*/
|
|
77
|
+
readonly mergeDefaults?: boolean | ((stored: Value, defaults: Value) => Value);
|
|
78
|
+
/**
|
|
79
|
+
* Persist the default value when the key is absent.
|
|
80
|
+
*
|
|
81
|
+
* @default true
|
|
82
|
+
*/
|
|
83
|
+
readonly writeDefaults?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Follow changes made by other documents and other instances.
|
|
86
|
+
*
|
|
87
|
+
* @default true
|
|
88
|
+
*/
|
|
89
|
+
readonly listenToStorageChanges?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Watch nested mutations of object values.
|
|
92
|
+
*
|
|
93
|
+
* @default true
|
|
94
|
+
*/
|
|
95
|
+
readonly deep?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Write timing relative to component rendering.
|
|
98
|
+
*
|
|
99
|
+
* @default "pre"
|
|
100
|
+
*/
|
|
101
|
+
readonly flush?: "pre" | "post" | "sync";
|
|
102
|
+
/**
|
|
103
|
+
* When the stored value is first read. `"post-flush"` keeps the default
|
|
104
|
+
* through the first render so server-rendered markup hydrates without a
|
|
105
|
+
* mismatch, then reads storage after mounting.
|
|
106
|
+
*
|
|
107
|
+
* @default "post-flush" inside a component, "sync" otherwise
|
|
108
|
+
*/
|
|
109
|
+
readonly initialRead?: "sync" | "post-flush";
|
|
110
|
+
/**
|
|
111
|
+
* Observe read, validation, write, and removal failures. Failures never
|
|
112
|
+
* throw out of the composable.
|
|
113
|
+
*
|
|
114
|
+
* @default undefined
|
|
115
|
+
*/
|
|
116
|
+
readonly onError?: (failure: StorageFailure) => void;
|
|
117
|
+
}
|
|
118
|
+
/** Reactive state and controls returned by {@link useStorage}. */
|
|
119
|
+
interface StorageControls<Value> {
|
|
120
|
+
/** Writable value synchronized with storage. */
|
|
121
|
+
readonly state: Ref<Value>;
|
|
122
|
+
/** Whether a storage backend is currently attached. */
|
|
123
|
+
readonly supported: Readonly<Ref<boolean>>;
|
|
124
|
+
/** Most recent synchronization failure, cleared by the next success. */
|
|
125
|
+
readonly error: Readonly<ShallowRef<StorageFailure | undefined>>;
|
|
126
|
+
/** Re-read the stored value, replacing the reactive value. */
|
|
127
|
+
readonly refresh: () => void;
|
|
128
|
+
/** Remove the key from storage and restore the default value. */
|
|
129
|
+
readonly remove: () => void;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Typed built-in serializers, usable directly as the `serializer` option.
|
|
133
|
+
*
|
|
134
|
+
* `object` round-trips JSON-compatible values; `map` and `set` store their
|
|
135
|
+
* entries as JSON arrays; `date` stores an ISO-8601 string.
|
|
136
|
+
*/
|
|
137
|
+
declare const storageSerializers: {
|
|
138
|
+
/** Decimal `bigint` text. */readonly bigint: StorageSerializer<bigint>; /** `"true"` / `"false"`. */
|
|
139
|
+
readonly boolean: StorageSerializer<boolean>; /** ISO-8601 timestamp. */
|
|
140
|
+
readonly date: StorageSerializer<Date>; /** JSON array of `[key, value]` entries. */
|
|
141
|
+
readonly map: StorageSerializer<Map<unknown, unknown>>; /** Decimal number text. */
|
|
142
|
+
readonly number: StorageSerializer<number>; /** JSON text. */
|
|
143
|
+
readonly object: StorageSerializer<unknown>; /** JSON array of members. */
|
|
144
|
+
readonly set: StorageSerializer<Set<unknown>>; /** Raw string. */
|
|
145
|
+
readonly string: StorageSerializer<string>;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Select the built-in serializer kind for a default value.
|
|
149
|
+
*
|
|
150
|
+
* `null`, arrays, and plain objects use JSON (`"object"`); `Map`, `Set`, and
|
|
151
|
+
* `Date` use their dedicated kinds; primitives use their `typeof`.
|
|
152
|
+
* Functions and symbols cannot be stored and fall back to `"string"`.
|
|
153
|
+
*
|
|
154
|
+
* @param value Default value supplied to {@link useStorage}.
|
|
155
|
+
* @returns The inferred serializer kind.
|
|
156
|
+
*/
|
|
157
|
+
declare function inferStorageSerializerKind(value: unknown): StorageSerializerKind;
|
|
158
|
+
/**
|
|
159
|
+
* Synchronize a typed reactive value with a Web Storage compatible backend.
|
|
160
|
+
*
|
|
161
|
+
* The serializer is inferred from `defaultValue` (numbers stay numbers,
|
|
162
|
+
* `Map`/`Set`/`Date` round-trip), and every decoded value passes the
|
|
163
|
+
* `validate` hook before it is accepted, so corrupted or foreign data falls
|
|
164
|
+
* back to the default instead of leaking the wrong type. Writes follow the
|
|
165
|
+
* reactive value; changes from other tabs (`storage` events) and from other
|
|
166
|
+
* instances in the same document using the same key are applied live.
|
|
167
|
+
*
|
|
168
|
+
* Server rendering: without a browser `window` no storage is touched and
|
|
169
|
+
* `state` holds the default. Node's global `localStorage` is intentionally
|
|
170
|
+
* ignored because it would be shared between requests. Inside a component
|
|
171
|
+
* `initialRead` defaults to `"post-flush"`, so hydrating markup that rendered
|
|
172
|
+
* the default matches before switching to the stored value.
|
|
173
|
+
*
|
|
174
|
+
* Failures (quota, disabled storage, malformed data) never throw; they are
|
|
175
|
+
* exposed through `error` and `onError`.
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```ts
|
|
179
|
+
* const { state: theme } = useStorage("theme", "light" as "light" | "dark");
|
|
180
|
+
* theme.value = "dark"; // persisted
|
|
181
|
+
* ```
|
|
182
|
+
*
|
|
183
|
+
* @typeParam Value Stored value type, inferred from `defaultValue`.
|
|
184
|
+
* @param key Reactive storage key; changing it re-reads the new key.
|
|
185
|
+
* @param defaultValue Value used when the key is absent or unreadable.
|
|
186
|
+
* @param options Backend, serialization, validation, and timing options.
|
|
187
|
+
* @default options {}
|
|
188
|
+
* @returns The synchronized value and its controls.
|
|
189
|
+
*/
|
|
190
|
+
declare function useStorage<Value>(key: MaybeRefOrGetter<string>, defaultValue: MaybeRefOrGetter<Value>, options?: UseStorageOptions<Value>): StorageControls<Value>;
|
|
191
|
+
/**
|
|
192
|
+
* {@link useStorage} bound to `window.localStorage` by default.
|
|
193
|
+
*
|
|
194
|
+
* @typeParam Value Stored value type, inferred from `defaultValue`.
|
|
195
|
+
* @param key Reactive storage key.
|
|
196
|
+
* @param defaultValue Value used when the key is absent or unreadable.
|
|
197
|
+
* @param options Serialization, validation, and timing options.
|
|
198
|
+
* @default options {}
|
|
199
|
+
* @returns The synchronized value and its controls.
|
|
200
|
+
*/
|
|
201
|
+
declare function useLocalStorage<Value>(key: MaybeRefOrGetter<string>, defaultValue: MaybeRefOrGetter<Value>, options?: UseStorageOptions<Value>): StorageControls<Value>;
|
|
202
|
+
/**
|
|
203
|
+
* {@link useStorage} bound to `window.sessionStorage` by default.
|
|
204
|
+
*
|
|
205
|
+
* @typeParam Value Stored value type, inferred from `defaultValue`.
|
|
206
|
+
* @param key Reactive storage key.
|
|
207
|
+
* @param defaultValue Value used when the key is absent or unreadable.
|
|
208
|
+
* @param options Serialization, validation, and timing options.
|
|
209
|
+
* @default options {}
|
|
210
|
+
* @returns The synchronized value and its controls.
|
|
211
|
+
*/
|
|
212
|
+
declare function useSessionStorage<Value>(key: MaybeRefOrGetter<string>, defaultValue: MaybeRefOrGetter<Value>, options?: UseStorageOptions<Value>): StorageControls<Value>;
|
|
213
|
+
//#endregion
|
|
214
|
+
export { StorageControls, StorageErrorCode, StorageFailure, StorageLike, StorageSerializer, StorageSerializerKind, StorageValidator, UseStorageOptions, inferStorageSerializerKind, storageSerializers, useLocalStorage, useSessionStorage, useStorage };
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { hasInjectionContext, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
3
|
+
//#region src/use-storage.ts
|
|
4
|
+
const SAME_DOCUMENT_EVENT = "vize:storage";
|
|
5
|
+
function jsonRead(raw) {
|
|
6
|
+
return JSON.parse(raw);
|
|
7
|
+
}
|
|
8
|
+
const codecs = {
|
|
9
|
+
bigint: {
|
|
10
|
+
read: (raw) => BigInt(raw),
|
|
11
|
+
write: (value) => String(value)
|
|
12
|
+
},
|
|
13
|
+
boolean: {
|
|
14
|
+
read: (raw) => raw === "true",
|
|
15
|
+
write: (value) => String(value)
|
|
16
|
+
},
|
|
17
|
+
date: {
|
|
18
|
+
read: (raw) => new Date(raw),
|
|
19
|
+
write: (value) => value instanceof Date ? value.toISOString() : String(value)
|
|
20
|
+
},
|
|
21
|
+
map: {
|
|
22
|
+
read: (raw) => {
|
|
23
|
+
const entries = jsonRead(raw);
|
|
24
|
+
return new Map(Array.isArray(entries) ? entries.filter(isEntry) : []);
|
|
25
|
+
},
|
|
26
|
+
write: (value) => JSON.stringify(value instanceof Map ? [...value.entries()] : [])
|
|
27
|
+
},
|
|
28
|
+
number: {
|
|
29
|
+
read: (raw) => Number.parseFloat(raw),
|
|
30
|
+
write: (value) => String(value)
|
|
31
|
+
},
|
|
32
|
+
object: {
|
|
33
|
+
read: jsonRead,
|
|
34
|
+
write: (value) => JSON.stringify(value)
|
|
35
|
+
},
|
|
36
|
+
set: {
|
|
37
|
+
read: (raw) => {
|
|
38
|
+
const values = jsonRead(raw);
|
|
39
|
+
return new Set(Array.isArray(values) ? values : []);
|
|
40
|
+
},
|
|
41
|
+
write: (value) => JSON.stringify(value instanceof Set ? [...value] : [])
|
|
42
|
+
},
|
|
43
|
+
string: {
|
|
44
|
+
read: (raw) => raw,
|
|
45
|
+
write: (value) => String(value)
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
function isEntry(candidate) {
|
|
49
|
+
return Array.isArray(candidate) && candidate.length === 2;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Typed built-in serializers, usable directly as the `serializer` option.
|
|
53
|
+
*
|
|
54
|
+
* `object` round-trips JSON-compatible values; `map` and `set` store their
|
|
55
|
+
* entries as JSON arrays; `date` stores an ISO-8601 string.
|
|
56
|
+
*/
|
|
57
|
+
const storageSerializers = {
|
|
58
|
+
bigint: {
|
|
59
|
+
read: (raw) => BigInt(raw),
|
|
60
|
+
write: (value) => value.toString()
|
|
61
|
+
},
|
|
62
|
+
boolean: {
|
|
63
|
+
read: (raw) => raw === "true",
|
|
64
|
+
write: (value) => String(value)
|
|
65
|
+
},
|
|
66
|
+
date: {
|
|
67
|
+
read: (raw) => new Date(raw),
|
|
68
|
+
write: (value) => value.toISOString()
|
|
69
|
+
},
|
|
70
|
+
map: {
|
|
71
|
+
read: (raw) => {
|
|
72
|
+
const entries = jsonRead(raw);
|
|
73
|
+
return new Map(Array.isArray(entries) ? entries.filter(isEntry) : []);
|
|
74
|
+
},
|
|
75
|
+
write: (value) => JSON.stringify([...value.entries()])
|
|
76
|
+
},
|
|
77
|
+
number: {
|
|
78
|
+
read: (raw) => Number.parseFloat(raw),
|
|
79
|
+
write: (value) => String(value)
|
|
80
|
+
},
|
|
81
|
+
object: {
|
|
82
|
+
read: jsonRead,
|
|
83
|
+
write: (value) => JSON.stringify(value)
|
|
84
|
+
},
|
|
85
|
+
set: {
|
|
86
|
+
read: (raw) => {
|
|
87
|
+
const values = jsonRead(raw);
|
|
88
|
+
return new Set(Array.isArray(values) ? values : []);
|
|
89
|
+
},
|
|
90
|
+
write: (value) => JSON.stringify([...value])
|
|
91
|
+
},
|
|
92
|
+
string: {
|
|
93
|
+
read: (raw) => raw,
|
|
94
|
+
write: (value) => value
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Select the built-in serializer kind for a default value.
|
|
99
|
+
*
|
|
100
|
+
* `null`, arrays, and plain objects use JSON (`"object"`); `Map`, `Set`, and
|
|
101
|
+
* `Date` use their dedicated kinds; primitives use their `typeof`.
|
|
102
|
+
* Functions and symbols cannot be stored and fall back to `"string"`.
|
|
103
|
+
*
|
|
104
|
+
* @param value Default value supplied to {@link useStorage}.
|
|
105
|
+
* @returns The inferred serializer kind.
|
|
106
|
+
*/
|
|
107
|
+
function inferStorageSerializerKind(value) {
|
|
108
|
+
if (value instanceof Map) return "map";
|
|
109
|
+
if (value instanceof Set) return "set";
|
|
110
|
+
if (value instanceof Date) return "date";
|
|
111
|
+
switch (typeof value) {
|
|
112
|
+
case "bigint": return "bigint";
|
|
113
|
+
case "boolean": return "boolean";
|
|
114
|
+
case "number": return "number";
|
|
115
|
+
case "object": return "object";
|
|
116
|
+
default: return "string";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function sameKind(defaults, candidate) {
|
|
120
|
+
const kind = inferStorageSerializerKind(defaults);
|
|
121
|
+
if (kind === "object") {
|
|
122
|
+
if (defaults === null) return true;
|
|
123
|
+
if (Array.isArray(defaults)) return Array.isArray(candidate);
|
|
124
|
+
return typeof candidate === "object" && candidate !== null && !Array.isArray(candidate);
|
|
125
|
+
}
|
|
126
|
+
if (kind === "number") return typeof candidate === "number" && !Number.isNaN(candidate);
|
|
127
|
+
if (kind === "date") return candidate instanceof Date && !Number.isNaN(candidate.getTime());
|
|
128
|
+
return inferStorageSerializerKind(candidate) === kind;
|
|
129
|
+
}
|
|
130
|
+
function isPlainObject(value) {
|
|
131
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
132
|
+
}
|
|
133
|
+
function shallowMerge(stored, defaults) {
|
|
134
|
+
if (!isPlainObject(stored) || !isPlainObject(defaults)) return stored;
|
|
135
|
+
const merged = {
|
|
136
|
+
...defaults,
|
|
137
|
+
...stored
|
|
138
|
+
};
|
|
139
|
+
return sameKind(defaults, merged) ? merged : stored;
|
|
140
|
+
}
|
|
141
|
+
function browserWindow() {
|
|
142
|
+
return typeof window !== "undefined" ? window : void 0;
|
|
143
|
+
}
|
|
144
|
+
function defaultStorage(area) {
|
|
145
|
+
try {
|
|
146
|
+
return browserWindow()?.[area] ?? void 0;
|
|
147
|
+
} catch {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function isSameDocumentDetail(detail) {
|
|
152
|
+
return isPlainObject(detail) && typeof detail.key === "string" && "storage" in detail;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Synchronize a typed reactive value with a Web Storage compatible backend.
|
|
156
|
+
*
|
|
157
|
+
* The serializer is inferred from `defaultValue` (numbers stay numbers,
|
|
158
|
+
* `Map`/`Set`/`Date` round-trip), and every decoded value passes the
|
|
159
|
+
* `validate` hook before it is accepted, so corrupted or foreign data falls
|
|
160
|
+
* back to the default instead of leaking the wrong type. Writes follow the
|
|
161
|
+
* reactive value; changes from other tabs (`storage` events) and from other
|
|
162
|
+
* instances in the same document using the same key are applied live.
|
|
163
|
+
*
|
|
164
|
+
* Server rendering: without a browser `window` no storage is touched and
|
|
165
|
+
* `state` holds the default. Node's global `localStorage` is intentionally
|
|
166
|
+
* ignored because it would be shared between requests. Inside a component
|
|
167
|
+
* `initialRead` defaults to `"post-flush"`, so hydrating markup that rendered
|
|
168
|
+
* the default matches before switching to the stored value.
|
|
169
|
+
*
|
|
170
|
+
* Failures (quota, disabled storage, malformed data) never throw; they are
|
|
171
|
+
* exposed through `error` and `onError`.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```ts
|
|
175
|
+
* const { state: theme } = useStorage("theme", "light" as "light" | "dark");
|
|
176
|
+
* theme.value = "dark"; // persisted
|
|
177
|
+
* ```
|
|
178
|
+
*
|
|
179
|
+
* @typeParam Value Stored value type, inferred from `defaultValue`.
|
|
180
|
+
* @param key Reactive storage key; changing it re-reads the new key.
|
|
181
|
+
* @param defaultValue Value used when the key is absent or unreadable.
|
|
182
|
+
* @param options Backend, serialization, validation, and timing options.
|
|
183
|
+
* @default options {}
|
|
184
|
+
* @returns The synchronized value and its controls.
|
|
185
|
+
*/
|
|
186
|
+
function useStorage(key, defaultValue, options = {}) {
|
|
187
|
+
const initial = toValue(defaultValue);
|
|
188
|
+
const state = ref(initial);
|
|
189
|
+
const supported = ref(false);
|
|
190
|
+
const error = shallowRef(void 0);
|
|
191
|
+
const identity = {};
|
|
192
|
+
const codec = options.serializer ?? codecs[inferStorageSerializerKind(initial)];
|
|
193
|
+
const validate = options.validate ?? ((candidate) => sameKind(initial, candidate));
|
|
194
|
+
const listen = options.listenToStorageChanges ?? true;
|
|
195
|
+
let ready = false;
|
|
196
|
+
let syncedRaw;
|
|
197
|
+
const resolveStorage = () => options.storage === void 0 ? defaultStorage("localStorage") : toValue(options.storage) ?? void 0;
|
|
198
|
+
const resolveEvents = () => options.eventTarget === void 0 ? browserWindow() : toValue(options.eventTarget) ?? void 0;
|
|
199
|
+
const fail = (code, cause) => {
|
|
200
|
+
const failure = {
|
|
201
|
+
code,
|
|
202
|
+
key: toValue(key),
|
|
203
|
+
cause
|
|
204
|
+
};
|
|
205
|
+
error.value = failure;
|
|
206
|
+
options.onError?.(failure);
|
|
207
|
+
};
|
|
208
|
+
const encode = (value) => {
|
|
209
|
+
try {
|
|
210
|
+
return codec.write(value);
|
|
211
|
+
} catch (cause) {
|
|
212
|
+
fail("write-failed", cause);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
const assign = (value, raw) => {
|
|
217
|
+
syncedRaw = raw ?? encode(value);
|
|
218
|
+
state.value = value;
|
|
219
|
+
};
|
|
220
|
+
const decode = (raw) => {
|
|
221
|
+
const defaults = toValue(defaultValue);
|
|
222
|
+
let candidate;
|
|
223
|
+
try {
|
|
224
|
+
candidate = codec.read(raw);
|
|
225
|
+
} catch (cause) {
|
|
226
|
+
fail("read-failed", cause);
|
|
227
|
+
return {
|
|
228
|
+
value: defaults,
|
|
229
|
+
accepted: false
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
if (!validate(candidate)) {
|
|
233
|
+
fail("invalid-value", candidate);
|
|
234
|
+
return {
|
|
235
|
+
value: defaults,
|
|
236
|
+
accepted: false
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
const merge = options.mergeDefaults ?? false;
|
|
240
|
+
if (merge === false) return {
|
|
241
|
+
value: candidate,
|
|
242
|
+
accepted: true
|
|
243
|
+
};
|
|
244
|
+
return {
|
|
245
|
+
value: merge === true ? shallowMerge(candidate, defaults) : merge(candidate, defaults),
|
|
246
|
+
accepted: true
|
|
247
|
+
};
|
|
248
|
+
};
|
|
249
|
+
const notify = (storage, raw) => {
|
|
250
|
+
const events = resolveEvents();
|
|
251
|
+
if (!events || !listen) return;
|
|
252
|
+
const detail = {
|
|
253
|
+
storage,
|
|
254
|
+
key: toValue(key),
|
|
255
|
+
raw,
|
|
256
|
+
source: identity
|
|
257
|
+
};
|
|
258
|
+
events.dispatchEvent(new CustomEvent(SAME_DOCUMENT_EVENT, { detail }));
|
|
259
|
+
};
|
|
260
|
+
const write = (storage, value) => {
|
|
261
|
+
const raw = encode(value);
|
|
262
|
+
if (raw === void 0) return;
|
|
263
|
+
try {
|
|
264
|
+
storage.setItem(toValue(key), raw);
|
|
265
|
+
} catch (cause) {
|
|
266
|
+
fail("write-failed", cause);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
syncedRaw = raw;
|
|
270
|
+
error.value = void 0;
|
|
271
|
+
notify(storage, raw);
|
|
272
|
+
};
|
|
273
|
+
const applyRaw = (raw) => {
|
|
274
|
+
if (raw === null) {
|
|
275
|
+
assign(toValue(defaultValue), void 0);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const decoded = decode(raw);
|
|
279
|
+
assign(decoded.value, decoded.accepted ? raw : void 0);
|
|
280
|
+
};
|
|
281
|
+
const refresh = () => {
|
|
282
|
+
const storage = resolveStorage();
|
|
283
|
+
supported.value = storage !== void 0;
|
|
284
|
+
if (!storage) {
|
|
285
|
+
assign(toValue(defaultValue), void 0);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
let raw;
|
|
289
|
+
try {
|
|
290
|
+
raw = storage.getItem(toValue(key));
|
|
291
|
+
} catch (cause) {
|
|
292
|
+
fail("read-failed", cause);
|
|
293
|
+
assign(toValue(defaultValue), void 0);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
error.value = void 0;
|
|
297
|
+
applyRaw(raw);
|
|
298
|
+
if (raw === null && (options.writeDefaults ?? true)) write(storage, state.value);
|
|
299
|
+
};
|
|
300
|
+
const remove = () => {
|
|
301
|
+
const storage = resolveStorage();
|
|
302
|
+
if (storage) try {
|
|
303
|
+
storage.removeItem(toValue(key));
|
|
304
|
+
notify(storage, null);
|
|
305
|
+
} catch (cause) {
|
|
306
|
+
fail("remove-failed", cause);
|
|
307
|
+
}
|
|
308
|
+
assign(toValue(defaultValue), void 0);
|
|
309
|
+
};
|
|
310
|
+
const applyExternal = (storage, changedKey, raw) => {
|
|
311
|
+
if (!ready || storage !== resolveStorage()) return;
|
|
312
|
+
if (changedKey === null) applyRaw(null);
|
|
313
|
+
else if (changedKey === toValue(key)) applyRaw(raw);
|
|
314
|
+
};
|
|
315
|
+
const onStorageEvent = (event) => {
|
|
316
|
+
if (!("storageArea" in event) || !("key" in event) || !("newValue" in event)) return;
|
|
317
|
+
const { storageArea, key: changedKey, newValue } = event;
|
|
318
|
+
if (typeof changedKey !== "string" && changedKey !== null) return;
|
|
319
|
+
if (typeof newValue !== "string" && newValue !== null) return;
|
|
320
|
+
const storage = resolveStorage();
|
|
321
|
+
if (storage === void 0 || storageArea !== storage) return;
|
|
322
|
+
applyExternal(storage, changedKey, newValue);
|
|
323
|
+
};
|
|
324
|
+
const onSameDocumentEvent = (event) => {
|
|
325
|
+
if (!(event instanceof CustomEvent)) return;
|
|
326
|
+
const detail = event.detail;
|
|
327
|
+
if (!isSameDocumentDetail(detail) || detail.source === identity) return;
|
|
328
|
+
applyExternal(detail.storage, detail.key, detail.raw);
|
|
329
|
+
};
|
|
330
|
+
const stopSource = watch([() => toValue(key), resolveStorage], () => {
|
|
331
|
+
if (ready) refresh();
|
|
332
|
+
}, { flush: "sync" });
|
|
333
|
+
const stopEvents = watch(resolveEvents, (events, _previous, onCleanup) => {
|
|
334
|
+
if (!events || !listen) return;
|
|
335
|
+
events.addEventListener("storage", onStorageEvent);
|
|
336
|
+
events.addEventListener(SAME_DOCUMENT_EVENT, onSameDocumentEvent);
|
|
337
|
+
onCleanup(() => {
|
|
338
|
+
events.removeEventListener("storage", onStorageEvent);
|
|
339
|
+
events.removeEventListener(SAME_DOCUMENT_EVENT, onSameDocumentEvent);
|
|
340
|
+
});
|
|
341
|
+
}, {
|
|
342
|
+
immediate: true,
|
|
343
|
+
flush: "sync"
|
|
344
|
+
});
|
|
345
|
+
const stopWrite = watch(state, (value) => {
|
|
346
|
+
if (!ready) return;
|
|
347
|
+
const storage = resolveStorage();
|
|
348
|
+
if (!storage) return;
|
|
349
|
+
const raw = encode(value);
|
|
350
|
+
if (raw === void 0 || raw === syncedRaw) return;
|
|
351
|
+
write(storage, value);
|
|
352
|
+
}, {
|
|
353
|
+
deep: options.deep ?? true,
|
|
354
|
+
flush: options.flush ?? "pre"
|
|
355
|
+
});
|
|
356
|
+
const start = () => {
|
|
357
|
+
ready = true;
|
|
358
|
+
refresh();
|
|
359
|
+
};
|
|
360
|
+
let stopDeferred;
|
|
361
|
+
if ((options.initialRead ?? (hasInjectionContext() ? "post-flush" : "sync")) === "sync") start();
|
|
362
|
+
else {
|
|
363
|
+
const trigger = ref(0);
|
|
364
|
+
stopDeferred = watch(trigger, () => {
|
|
365
|
+
stopDeferred?.();
|
|
366
|
+
start();
|
|
367
|
+
}, { flush: "post" });
|
|
368
|
+
trigger.value += 1;
|
|
369
|
+
}
|
|
370
|
+
tryOnScopeDispose(() => {
|
|
371
|
+
ready = false;
|
|
372
|
+
stopDeferred?.();
|
|
373
|
+
stopSource();
|
|
374
|
+
stopEvents();
|
|
375
|
+
stopWrite();
|
|
376
|
+
});
|
|
377
|
+
return {
|
|
378
|
+
state,
|
|
379
|
+
supported: readonly(supported),
|
|
380
|
+
error: readonly(error),
|
|
381
|
+
refresh,
|
|
382
|
+
remove
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* {@link useStorage} bound to `window.localStorage` by default.
|
|
387
|
+
*
|
|
388
|
+
* @typeParam Value Stored value type, inferred from `defaultValue`.
|
|
389
|
+
* @param key Reactive storage key.
|
|
390
|
+
* @param defaultValue Value used when the key is absent or unreadable.
|
|
391
|
+
* @param options Serialization, validation, and timing options.
|
|
392
|
+
* @default options {}
|
|
393
|
+
* @returns The synchronized value and its controls.
|
|
394
|
+
*/
|
|
395
|
+
function useLocalStorage(key, defaultValue, options = {}) {
|
|
396
|
+
return useStorage(key, defaultValue, options);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* {@link useStorage} bound to `window.sessionStorage` by default.
|
|
400
|
+
*
|
|
401
|
+
* @typeParam Value Stored value type, inferred from `defaultValue`.
|
|
402
|
+
* @param key Reactive storage key.
|
|
403
|
+
* @param defaultValue Value used when the key is absent or unreadable.
|
|
404
|
+
* @param options Serialization, validation, and timing options.
|
|
405
|
+
* @default options {}
|
|
406
|
+
* @returns The synchronized value and its controls.
|
|
407
|
+
*/
|
|
408
|
+
function useSessionStorage(key, defaultValue, options = {}) {
|
|
409
|
+
return useStorage(key, defaultValue, {
|
|
410
|
+
...options,
|
|
411
|
+
storage: options.storage === void 0 ? () => defaultStorage("sessionStorage") : options.storage
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
//#endregion
|
|
415
|
+
export { inferStorageSerializerKind, storageSerializers, useLocalStorage, useSessionStorage, useStorage };
|