@vizejs/composable 0.426.3 → 0.428.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,508 @@
|
|
|
1
|
+
import { readonly, ref, shallowRef, toRaw, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Minimal structural view of an `IDBRequest`. */
|
|
7
|
+
export interface IndexedDBRequestLike<Result> extends Pick<EventTarget, "addEventListener"> {
|
|
8
|
+
/** Result available after the `success` event. */
|
|
9
|
+
readonly result: Result;
|
|
10
|
+
|
|
11
|
+
/** Failure available after the `error` event. */
|
|
12
|
+
readonly error: unknown;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Minimal structural view of an `IDBObjectStore` using out-of-line keys. */
|
|
16
|
+
export interface IndexedDBObjectStoreLike {
|
|
17
|
+
/** Read the value stored under `key`. */
|
|
18
|
+
readonly get: (key: IDBValidKey) => IndexedDBRequestLike<unknown>;
|
|
19
|
+
|
|
20
|
+
/** Store `value` under `key`. */
|
|
21
|
+
readonly put: (value: unknown, key: IDBValidKey) => IndexedDBRequestLike<IDBValidKey>;
|
|
22
|
+
|
|
23
|
+
/** Delete `key`. */
|
|
24
|
+
readonly delete: (key: IDBValidKey) => IndexedDBRequestLike<undefined>;
|
|
25
|
+
|
|
26
|
+
/** List every key. */
|
|
27
|
+
readonly getAllKeys: () => IndexedDBRequestLike<IDBValidKey[]>;
|
|
28
|
+
|
|
29
|
+
/** Delete every entry. */
|
|
30
|
+
readonly clear: () => IndexedDBRequestLike<undefined>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Minimal structural view of an `IDBTransaction` (`complete`/`error`/`abort` events). */
|
|
34
|
+
export interface IndexedDBTransactionLike extends Pick<EventTarget, "addEventListener"> {
|
|
35
|
+
/** Access an object store in the transaction scope. */
|
|
36
|
+
readonly objectStore: (name: string) => IndexedDBObjectStoreLike;
|
|
37
|
+
|
|
38
|
+
/** Failure available after `error`/`abort`. */
|
|
39
|
+
readonly error: unknown;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Minimal structural view of an `IDBDatabase`. */
|
|
43
|
+
export interface IndexedDBDatabaseLike {
|
|
44
|
+
/** Current schema version. */
|
|
45
|
+
readonly version: number;
|
|
46
|
+
|
|
47
|
+
/** Names of the existing object stores. */
|
|
48
|
+
readonly objectStoreNames: { readonly contains: (name: string) => boolean };
|
|
49
|
+
|
|
50
|
+
/** Create an object store; only valid during `upgradeneeded`. */
|
|
51
|
+
readonly createObjectStore: (name: string) => unknown;
|
|
52
|
+
|
|
53
|
+
/** Start a transaction on one store. */
|
|
54
|
+
readonly transaction: (store: string, mode: "readonly" | "readwrite") => IndexedDBTransactionLike;
|
|
55
|
+
|
|
56
|
+
/** Close the connection. */
|
|
57
|
+
readonly close: () => void;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Minimal structural view of an `IDBFactory`; `window.indexedDB` satisfies it. */
|
|
61
|
+
export interface IndexedDBFactoryLike {
|
|
62
|
+
/** Open (and possibly upgrade) a database; fires `upgradeneeded`, `success`, `error`. */
|
|
63
|
+
readonly open: (name: string, version?: number) => IndexedDBRequestLike<IndexedDBDatabaseLike>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Options for {@link createIndexedDBKeyval}. */
|
|
67
|
+
export interface IndexedDBKeyvalOptions {
|
|
68
|
+
/**
|
|
69
|
+
* Database name.
|
|
70
|
+
*
|
|
71
|
+
* @default "vize-keyval"
|
|
72
|
+
*/
|
|
73
|
+
readonly database?: string;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Object store name; created on demand.
|
|
77
|
+
*
|
|
78
|
+
* @default "keyval"
|
|
79
|
+
*/
|
|
80
|
+
readonly store?: string;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* IndexedDB implementation.
|
|
84
|
+
*
|
|
85
|
+
* @default window.indexedDB when a browser window exists
|
|
86
|
+
*/
|
|
87
|
+
readonly factory?: IndexedDBFactoryLike | null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Promise-based key-value store returned by {@link createIndexedDBKeyval}. */
|
|
91
|
+
export interface IndexedDBKeyval {
|
|
92
|
+
/** Read a structured-cloned value, or `undefined` when absent. */
|
|
93
|
+
readonly get: (key: IDBValidKey) => Promise<unknown>;
|
|
94
|
+
|
|
95
|
+
/** Store a structured-cloneable value. Resolves when the transaction commits. */
|
|
96
|
+
readonly set: (key: IDBValidKey, value: unknown) => Promise<void>;
|
|
97
|
+
|
|
98
|
+
/** Delete a key. Resolves when the transaction commits. */
|
|
99
|
+
readonly delete: (key: IDBValidKey) => Promise<void>;
|
|
100
|
+
|
|
101
|
+
/** List every key. */
|
|
102
|
+
readonly keys: () => Promise<IDBValidKey[]>;
|
|
103
|
+
|
|
104
|
+
/** Delete every entry. */
|
|
105
|
+
readonly clear: () => Promise<void>;
|
|
106
|
+
|
|
107
|
+
/** Close the connection; the next operation reopens it. */
|
|
108
|
+
readonly close: () => void;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function browserFactory(): IndexedDBFactoryLike | undefined {
|
|
112
|
+
try {
|
|
113
|
+
return typeof window !== "undefined" ? (window.indexedDB ?? undefined) : undefined;
|
|
114
|
+
} catch {
|
|
115
|
+
// Accessing `indexedDB` throws in some privacy modes.
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function request<Result>(pending: IndexedDBRequestLike<Result>): Promise<Result> {
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
pending.addEventListener("success", () => resolve(pending.result));
|
|
123
|
+
pending.addEventListener("error", () => reject(pending.error));
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function committed(transaction: IndexedDBTransactionLike): Promise<void> {
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
transaction.addEventListener("complete", () => resolve());
|
|
130
|
+
transaction.addEventListener("error", () => reject(transaction.error));
|
|
131
|
+
transaction.addEventListener("abort", () => reject(transaction.error));
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function openDatabase(
|
|
136
|
+
factory: IndexedDBFactoryLike,
|
|
137
|
+
name: string,
|
|
138
|
+
store: string,
|
|
139
|
+
version?: number,
|
|
140
|
+
): Promise<IndexedDBDatabaseLike> {
|
|
141
|
+
const opening = factory.open(name, version);
|
|
142
|
+
opening.addEventListener("upgradeneeded", () => {
|
|
143
|
+
const database = opening.result;
|
|
144
|
+
if (!database.objectStoreNames.contains(store)) database.createObjectStore(store);
|
|
145
|
+
});
|
|
146
|
+
return request(opening).then((database) => {
|
|
147
|
+
if (database.objectStoreNames.contains(store)) return database;
|
|
148
|
+
// The database exists without our store: bump the version to create it.
|
|
149
|
+
const next = database.version + 1;
|
|
150
|
+
database.close();
|
|
151
|
+
return openDatabase(factory, name, store, next);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Create a small promise-based key-value store on one IndexedDB object
|
|
157
|
+
* store. The connection opens lazily on the first operation, the store is
|
|
158
|
+
* created on demand, and writes resolve once their transaction commits.
|
|
159
|
+
* Without IndexedDB (server rendering, privacy modes) every operation
|
|
160
|
+
* rejects with a tagged `[VIZE_COMPOSE_INDEXED_DB_UNAVAILABLE]` error.
|
|
161
|
+
*
|
|
162
|
+
* @param options Database, store, and implementation.
|
|
163
|
+
* @default options {}
|
|
164
|
+
* @returns Key-value operations.
|
|
165
|
+
*/
|
|
166
|
+
export function createIndexedDBKeyval(options: IndexedDBKeyvalOptions = {}): IndexedDBKeyval {
|
|
167
|
+
const name = options.database ?? "vize-keyval";
|
|
168
|
+
const store = options.store ?? "keyval";
|
|
169
|
+
let connection: Promise<IndexedDBDatabaseLike> | undefined;
|
|
170
|
+
|
|
171
|
+
const database = (): Promise<IndexedDBDatabaseLike> => {
|
|
172
|
+
if (connection !== undefined) return connection;
|
|
173
|
+
const factory = options.factory === undefined ? browserFactory() : options.factory;
|
|
174
|
+
if (!factory) {
|
|
175
|
+
return Promise.reject(
|
|
176
|
+
new Error("[VIZE_COMPOSE_INDEXED_DB_UNAVAILABLE] IndexedDB is not available"),
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
const opened = openDatabase(factory, name, store);
|
|
180
|
+
connection = opened;
|
|
181
|
+
opened.catch(() => {
|
|
182
|
+
if (connection === opened) connection = undefined;
|
|
183
|
+
});
|
|
184
|
+
return opened;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const read = async <Result>(
|
|
188
|
+
operation: (objects: IndexedDBObjectStoreLike) => IndexedDBRequestLike<Result>,
|
|
189
|
+
): Promise<Result> => {
|
|
190
|
+
const db = await database();
|
|
191
|
+
return request(operation(db.transaction(store, "readonly").objectStore(store)));
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
const write = async (
|
|
195
|
+
operation: (objects: IndexedDBObjectStoreLike) => unknown,
|
|
196
|
+
): Promise<void> => {
|
|
197
|
+
const db = await database();
|
|
198
|
+
const transaction = db.transaction(store, "readwrite");
|
|
199
|
+
const done = committed(transaction);
|
|
200
|
+
operation(transaction.objectStore(store));
|
|
201
|
+
await done;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
get: (key) => read((objects) => objects.get(key)),
|
|
206
|
+
set: (key, value) => write((objects) => objects.put(value, key)),
|
|
207
|
+
delete: (key) => write((objects) => objects.delete(key)),
|
|
208
|
+
keys: () => read((objects) => objects.getAllKeys()),
|
|
209
|
+
clear: () => write((objects) => objects.clear()),
|
|
210
|
+
close: () => {
|
|
211
|
+
const current = connection;
|
|
212
|
+
connection = undefined;
|
|
213
|
+
void current?.then(
|
|
214
|
+
(db) => db.close(),
|
|
215
|
+
() => undefined,
|
|
216
|
+
);
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Stable failure codes reported by {@link useIndexedDB}. */
|
|
222
|
+
export type IndexedDBErrorCode = "read-failed" | "invalid-value" | "write-failed";
|
|
223
|
+
|
|
224
|
+
/** Failure observed while synchronizing a value with IndexedDB. */
|
|
225
|
+
export interface IndexedDBFailure {
|
|
226
|
+
/** Which synchronization step failed. */
|
|
227
|
+
readonly code: IndexedDBErrorCode;
|
|
228
|
+
|
|
229
|
+
/** Key involved in the failure. */
|
|
230
|
+
readonly key: IDBValidKey;
|
|
231
|
+
|
|
232
|
+
/** Exact rejection, or the rejected candidate for `"invalid-value"`. */
|
|
233
|
+
readonly cause: unknown;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Options for {@link useIndexedDB}. */
|
|
237
|
+
export interface UseIndexedDBOptions<Value> {
|
|
238
|
+
/**
|
|
239
|
+
* Database name.
|
|
240
|
+
*
|
|
241
|
+
* @default "vize-keyval"
|
|
242
|
+
*/
|
|
243
|
+
readonly database?: string;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Object store name; created on demand.
|
|
247
|
+
*
|
|
248
|
+
* @default "keyval"
|
|
249
|
+
*/
|
|
250
|
+
readonly store?: string;
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Reactive IndexedDB implementation. `null`/`undefined` keeps the default
|
|
254
|
+
* value, which is also what happens during server rendering.
|
|
255
|
+
*
|
|
256
|
+
* @default window.indexedDB when a browser window exists
|
|
257
|
+
*/
|
|
258
|
+
readonly factory?: MaybeRefOrGetter<IndexedDBFactoryLike | null | undefined>;
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Validation hook applied to every loaded value.
|
|
262
|
+
*
|
|
263
|
+
* @default a structural check that the value has the default's kind
|
|
264
|
+
*/
|
|
265
|
+
readonly validate?: (candidate: unknown) => candidate is Value;
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Persist the default value when the key is absent.
|
|
269
|
+
*
|
|
270
|
+
* @default true
|
|
271
|
+
*/
|
|
272
|
+
readonly writeDefaults?: boolean;
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Watch nested mutations of object values.
|
|
276
|
+
*
|
|
277
|
+
* @default true
|
|
278
|
+
*/
|
|
279
|
+
readonly deep?: boolean;
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Write timing relative to component rendering.
|
|
283
|
+
*
|
|
284
|
+
* @default "pre"
|
|
285
|
+
*/
|
|
286
|
+
readonly flush?: "pre" | "post" | "sync";
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Observe failures. Failures never reject out of the composable.
|
|
290
|
+
*
|
|
291
|
+
* @default undefined
|
|
292
|
+
*/
|
|
293
|
+
readonly onError?: (failure: IndexedDBFailure) => void;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/** Reactive state and controls returned by {@link useIndexedDB}. */
|
|
297
|
+
export interface IndexedDBControls<Value> {
|
|
298
|
+
/** Writable value; assignments and nested mutations are persisted. */
|
|
299
|
+
readonly state: Ref<Value>;
|
|
300
|
+
|
|
301
|
+
/** Whether an IndexedDB implementation is attached. */
|
|
302
|
+
readonly supported: Readonly<Ref<boolean>>;
|
|
303
|
+
|
|
304
|
+
/** Whether the stored value for the current key has been loaded. */
|
|
305
|
+
readonly ready: Readonly<Ref<boolean>>;
|
|
306
|
+
|
|
307
|
+
/** Most recent failure, cleared by the next success. */
|
|
308
|
+
readonly error: Readonly<ShallowRef<IndexedDBFailure | undefined>>;
|
|
309
|
+
|
|
310
|
+
/** Reload the stored value. Never rejects. */
|
|
311
|
+
readonly refresh: () => Promise<void>;
|
|
312
|
+
|
|
313
|
+
/** Delete the key and restore the default value. Never rejects. */
|
|
314
|
+
readonly remove: () => Promise<void>;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function sameKind<Value>(defaults: Value, candidate: unknown): candidate is Value {
|
|
318
|
+
if (defaults === null || defaults === undefined) return true;
|
|
319
|
+
if (defaults instanceof Map) return candidate instanceof Map;
|
|
320
|
+
if (defaults instanceof Set) return candidate instanceof Set;
|
|
321
|
+
if (defaults instanceof Date) return candidate instanceof Date;
|
|
322
|
+
if (Array.isArray(defaults)) return Array.isArray(candidate);
|
|
323
|
+
if (typeof defaults === "object") {
|
|
324
|
+
return typeof candidate === "object" && candidate !== null && !Array.isArray(candidate);
|
|
325
|
+
}
|
|
326
|
+
return typeof candidate === typeof defaults;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Synchronize a reactive value with one IndexedDB key.
|
|
331
|
+
*
|
|
332
|
+
* Values are stored by structured clone, so objects, arrays, `Map`, `Set`,
|
|
333
|
+
* `Date`, typed arrays, and `Blob`s round-trip without a serializer. The
|
|
334
|
+
* value is loaded asynchronously: `state` holds the default until `ready`
|
|
335
|
+
* becomes `true`. Loaded values pass `validate` before they are accepted.
|
|
336
|
+
* Assignments and nested mutations are written back; changing the reactive
|
|
337
|
+
* `key` loads the new key (stale loads are discarded).
|
|
338
|
+
*
|
|
339
|
+
* Server rendering: without a browser `window` nothing is opened, `state`
|
|
340
|
+
* is the default, and `ready` stays `false`, so server and client first
|
|
341
|
+
* render identically. The connection closes and watchers stop with the
|
|
342
|
+
* owning reactive scope. Failures never reject; they are exposed through
|
|
343
|
+
* `error` and `onError`.
|
|
344
|
+
*
|
|
345
|
+
* @example
|
|
346
|
+
* ```ts
|
|
347
|
+
* const { state: draft, ready } = useIndexedDB("draft", { title: "", body: "" });
|
|
348
|
+
* ```
|
|
349
|
+
*
|
|
350
|
+
* @typeParam Value Stored value type, inferred from `defaultValue`.
|
|
351
|
+
* @param key Reactive IndexedDB key.
|
|
352
|
+
* @param defaultValue Value used until loaded, and when absent or invalid.
|
|
353
|
+
* @param options Database, store, implementation, and validation.
|
|
354
|
+
* @default options {}
|
|
355
|
+
* @returns The synchronized value and its controls.
|
|
356
|
+
*/
|
|
357
|
+
export function useIndexedDB<Value>(
|
|
358
|
+
key: MaybeRefOrGetter<IDBValidKey>,
|
|
359
|
+
defaultValue: Value,
|
|
360
|
+
options: UseIndexedDBOptions<Value> = {},
|
|
361
|
+
): IndexedDBControls<Value> {
|
|
362
|
+
// Stored values are plain structured-cloneable data, for which
|
|
363
|
+
// `UnwrapRef<Value>` and `Value` coincide; `ref` keeps nested mutations
|
|
364
|
+
// observable so they are persisted.
|
|
365
|
+
const state = ref(defaultValue) as Ref<Value>;
|
|
366
|
+
const supported = ref(false);
|
|
367
|
+
const ready = ref(false);
|
|
368
|
+
const error = shallowRef<IndexedDBFailure | undefined>(undefined);
|
|
369
|
+
const validate =
|
|
370
|
+
options.validate ??
|
|
371
|
+
((candidate: unknown): candidate is Value => sameKind(defaultValue, candidate));
|
|
372
|
+
let keyval: IndexedDBKeyval | undefined;
|
|
373
|
+
let generation = 0;
|
|
374
|
+
let applying = false;
|
|
375
|
+
let dirty = false;
|
|
376
|
+
|
|
377
|
+
const fail = (code: IndexedDBErrorCode, cause: unknown): void => {
|
|
378
|
+
const failure: IndexedDBFailure = { code, key: toValue(key), cause };
|
|
379
|
+
error.value = failure;
|
|
380
|
+
options.onError?.(failure);
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
const assign = (value: Value): void => {
|
|
384
|
+
applying = true;
|
|
385
|
+
try {
|
|
386
|
+
state.value = value;
|
|
387
|
+
} finally {
|
|
388
|
+
applying = false;
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
const persist = async (value: Value): Promise<void> => {
|
|
393
|
+
if (keyval === undefined) return;
|
|
394
|
+
try {
|
|
395
|
+
await keyval.set(toValue(key), toRaw(value));
|
|
396
|
+
error.value = undefined;
|
|
397
|
+
} catch (cause) {
|
|
398
|
+
fail("write-failed", cause);
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
const refresh = async (): Promise<void> => {
|
|
403
|
+
const current = ++generation;
|
|
404
|
+
if (keyval === undefined) return;
|
|
405
|
+
const store = keyval;
|
|
406
|
+
let stored: unknown;
|
|
407
|
+
try {
|
|
408
|
+
stored = await store.get(toValue(key));
|
|
409
|
+
} catch (cause) {
|
|
410
|
+
if (current === generation) fail("read-failed", cause);
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
if (current !== generation) return;
|
|
414
|
+
if (stored === undefined) {
|
|
415
|
+
assign(defaultValue);
|
|
416
|
+
ready.value = true;
|
|
417
|
+
if (options.writeDefaults ?? true) await persist(defaultValue);
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
if (!validate(stored)) {
|
|
421
|
+
fail("invalid-value", stored);
|
|
422
|
+
assign(defaultValue);
|
|
423
|
+
} else {
|
|
424
|
+
error.value = undefined;
|
|
425
|
+
assign(stored);
|
|
426
|
+
}
|
|
427
|
+
ready.value = true;
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
const remove = async (): Promise<void> => {
|
|
431
|
+
generation += 1;
|
|
432
|
+
assign(defaultValue);
|
|
433
|
+
if (keyval === undefined) return;
|
|
434
|
+
try {
|
|
435
|
+
await keyval.delete(toValue(key));
|
|
436
|
+
error.value = undefined;
|
|
437
|
+
} catch (cause) {
|
|
438
|
+
fail("write-failed", cause);
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
let currentFactory: IndexedDBFactoryLike | undefined;
|
|
443
|
+
const stopSource = watch(
|
|
444
|
+
[
|
|
445
|
+
() =>
|
|
446
|
+
(options.factory === undefined ? browserFactory() : toValue(options.factory)) ?? undefined,
|
|
447
|
+
() => toValue(key),
|
|
448
|
+
],
|
|
449
|
+
([factory]) => {
|
|
450
|
+
ready.value = false;
|
|
451
|
+
supported.value = factory !== undefined;
|
|
452
|
+
if (factory !== currentFactory) {
|
|
453
|
+
keyval?.close();
|
|
454
|
+
currentFactory = factory;
|
|
455
|
+
keyval =
|
|
456
|
+
factory === undefined
|
|
457
|
+
? undefined
|
|
458
|
+
: createIndexedDBKeyval({
|
|
459
|
+
factory,
|
|
460
|
+
...(options.database === undefined ? {} : { database: options.database }),
|
|
461
|
+
...(options.store === undefined ? {} : { store: options.store }),
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
if (keyval === undefined) {
|
|
465
|
+
generation += 1;
|
|
466
|
+
assign(defaultValue);
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
void refresh();
|
|
470
|
+
},
|
|
471
|
+
{ immediate: true, flush: "sync" },
|
|
472
|
+
);
|
|
473
|
+
|
|
474
|
+
const stopDirty = watch(
|
|
475
|
+
state,
|
|
476
|
+
() => {
|
|
477
|
+
if (!applying) dirty = true;
|
|
478
|
+
},
|
|
479
|
+
{ deep: options.deep ?? true, flush: "sync" },
|
|
480
|
+
);
|
|
481
|
+
const stopWrite = watch(
|
|
482
|
+
state,
|
|
483
|
+
(value) => {
|
|
484
|
+
if (!dirty) return;
|
|
485
|
+
dirty = false;
|
|
486
|
+
void persist(value);
|
|
487
|
+
},
|
|
488
|
+
{ deep: options.deep ?? true, flush: options.flush ?? "pre" },
|
|
489
|
+
);
|
|
490
|
+
|
|
491
|
+
tryOnScopeDispose(() => {
|
|
492
|
+
generation += 1;
|
|
493
|
+
stopSource();
|
|
494
|
+
stopDirty();
|
|
495
|
+
stopWrite();
|
|
496
|
+
keyval?.close();
|
|
497
|
+
keyval = undefined;
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
return {
|
|
501
|
+
state,
|
|
502
|
+
supported: readonly(supported),
|
|
503
|
+
ready: readonly(ready),
|
|
504
|
+
error,
|
|
505
|
+
refresh,
|
|
506
|
+
remove,
|
|
507
|
+
};
|
|
508
|
+
}
|