@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,500 @@
|
|
|
1
|
+
import { computed, hasInjectionContext, inject, provide, shallowRef, watch } from "vue";
|
|
2
|
+
import type { InjectionKey, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
import { useMounted } from "./use-mounted.ts";
|
|
6
|
+
|
|
7
|
+
/** `SameSite` attribute values. */
|
|
8
|
+
export type CookieSameSite = "lax" | "strict" | "none";
|
|
9
|
+
|
|
10
|
+
/** Attributes written with a cookie (RFC 6265bis). */
|
|
11
|
+
export interface CookieAttributes {
|
|
12
|
+
/**
|
|
13
|
+
* `Path` attribute.
|
|
14
|
+
*
|
|
15
|
+
* @default "/" when written by {@link useCookie}; omitted by {@link serializeCookie}
|
|
16
|
+
*/
|
|
17
|
+
readonly path?: string;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* `Domain` attribute.
|
|
21
|
+
*
|
|
22
|
+
* @default omitted (host-only cookie)
|
|
23
|
+
*/
|
|
24
|
+
readonly domain?: string;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* `Max-Age` in integer seconds; `0` or less expires the cookie.
|
|
28
|
+
*
|
|
29
|
+
* @default omitted (session cookie)
|
|
30
|
+
*/
|
|
31
|
+
readonly maxAge?: number;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* `Expires` date.
|
|
35
|
+
*
|
|
36
|
+
* @default omitted (session cookie)
|
|
37
|
+
*/
|
|
38
|
+
readonly expires?: Date;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* `SameSite` policy. `"none"` requires `secure`.
|
|
42
|
+
*
|
|
43
|
+
* @default omitted (browser default, usually lax)
|
|
44
|
+
*/
|
|
45
|
+
readonly sameSite?: CookieSameSite;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* `Secure` flag.
|
|
49
|
+
*
|
|
50
|
+
* @default false
|
|
51
|
+
*/
|
|
52
|
+
readonly secure?: boolean;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* `HttpOnly` flag. Only honored by server adapters: browsers ignore
|
|
56
|
+
* cookies with this flag written through `document.cookie`.
|
|
57
|
+
*
|
|
58
|
+
* @default false
|
|
59
|
+
*/
|
|
60
|
+
readonly httpOnly?: boolean;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* `Partitioned` flag (CHIPS). Requires `secure`.
|
|
64
|
+
*
|
|
65
|
+
* @default false
|
|
66
|
+
*/
|
|
67
|
+
readonly partitioned?: boolean;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const TOKEN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
71
|
+
const DOMAIN =
|
|
72
|
+
/^\.?[0-9A-Za-z]([0-9A-Za-z-]*[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]*[0-9A-Za-z])?)*$/;
|
|
73
|
+
// oxlint-disable-next-line no-control-regex -- control characters are exactly what is rejected.
|
|
74
|
+
const UNSAFE_PATH = /[\u0000-\u001f\u007f;]/;
|
|
75
|
+
|
|
76
|
+
function decode(value: string): string {
|
|
77
|
+
try {
|
|
78
|
+
return decodeURIComponent(value);
|
|
79
|
+
} catch {
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Parse a `Cookie` request header (or `document.cookie`) into name/value
|
|
86
|
+
* pairs. Values are percent-decoded; the first occurrence of a name wins,
|
|
87
|
+
* matching how browsers order more specific cookies first. Pure and
|
|
88
|
+
* SSR-safe.
|
|
89
|
+
*
|
|
90
|
+
* @param header Raw header value.
|
|
91
|
+
* @returns Cookie values by name.
|
|
92
|
+
*/
|
|
93
|
+
export function parseCookieHeader(header: string): Record<string, string> {
|
|
94
|
+
const cookies = new Map<string, string>();
|
|
95
|
+
for (const part of header.split(";")) {
|
|
96
|
+
const separator = part.indexOf("=");
|
|
97
|
+
if (separator === -1) continue;
|
|
98
|
+
const name = part.slice(0, separator).trim();
|
|
99
|
+
if (name === "" || cookies.has(name)) continue;
|
|
100
|
+
let value = part.slice(separator + 1).trim();
|
|
101
|
+
if (value.length >= 2 && value.startsWith('"') && value.endsWith('"')) {
|
|
102
|
+
value = value.slice(1, -1);
|
|
103
|
+
}
|
|
104
|
+
cookies.set(name, decode(value));
|
|
105
|
+
}
|
|
106
|
+
return Object.fromEntries(cookies);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Serialize one cookie as a `Set-Cookie` header value (also accepted by
|
|
111
|
+
* `document.cookie`). The value is percent-encoded so any string is safe.
|
|
112
|
+
*
|
|
113
|
+
* @param name Cookie name; must be an RFC 6265 token.
|
|
114
|
+
* @param value Unencoded cookie value.
|
|
115
|
+
* @param attributes Cookie attributes.
|
|
116
|
+
* @default attributes {}
|
|
117
|
+
* @throws {TypeError} `[VIZE_COMPOSE_COOKIE_INVALID_NAME]`,
|
|
118
|
+
* `[VIZE_COMPOSE_COOKIE_INVALID_DOMAIN]`, `[VIZE_COMPOSE_COOKIE_INVALID_PATH]`,
|
|
119
|
+
* or `[VIZE_COMPOSE_COOKIE_REQUIRES_SECURE]` for malformed attributes.
|
|
120
|
+
* @throws {RangeError} `[VIZE_COMPOSE_COOKIE_INVALID_MAX_AGE]` or
|
|
121
|
+
* `[VIZE_COMPOSE_COOKIE_INVALID_EXPIRES]` for invalid lifetimes.
|
|
122
|
+
* @returns The serialized cookie.
|
|
123
|
+
*/
|
|
124
|
+
export function serializeCookie(
|
|
125
|
+
name: string,
|
|
126
|
+
value: string,
|
|
127
|
+
attributes: CookieAttributes = {},
|
|
128
|
+
): string {
|
|
129
|
+
if (!TOKEN.test(name)) {
|
|
130
|
+
throw new TypeError(
|
|
131
|
+
`[VIZE_COMPOSE_COOKIE_INVALID_NAME] cookie names must be RFC 6265 tokens; received ${JSON.stringify(name)}`,
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
let cookie = `${name}=${encodeURIComponent(value)}`;
|
|
135
|
+
if (attributes.maxAge !== undefined) {
|
|
136
|
+
if (!Number.isSafeInteger(attributes.maxAge)) {
|
|
137
|
+
throw new RangeError(
|
|
138
|
+
`[VIZE_COMPOSE_COOKIE_INVALID_MAX_AGE] maxAge must be an integer number of seconds; received ${String(attributes.maxAge)}`,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
cookie += `; Max-Age=${String(attributes.maxAge)}`;
|
|
142
|
+
}
|
|
143
|
+
if (attributes.expires !== undefined) {
|
|
144
|
+
if (Number.isNaN(attributes.expires.getTime())) {
|
|
145
|
+
throw new RangeError("[VIZE_COMPOSE_COOKIE_INVALID_EXPIRES] expires must be a valid Date");
|
|
146
|
+
}
|
|
147
|
+
cookie += `; Expires=${attributes.expires.toUTCString()}`;
|
|
148
|
+
}
|
|
149
|
+
if (attributes.domain !== undefined) {
|
|
150
|
+
if (!DOMAIN.test(attributes.domain)) {
|
|
151
|
+
throw new TypeError(
|
|
152
|
+
`[VIZE_COMPOSE_COOKIE_INVALID_DOMAIN] invalid cookie domain ${JSON.stringify(attributes.domain)}`,
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
cookie += `; Domain=${attributes.domain}`;
|
|
156
|
+
}
|
|
157
|
+
if (attributes.path !== undefined) {
|
|
158
|
+
if (UNSAFE_PATH.test(attributes.path)) {
|
|
159
|
+
throw new TypeError(
|
|
160
|
+
`[VIZE_COMPOSE_COOKIE_INVALID_PATH] cookie paths cannot contain ';' or control characters; received ${JSON.stringify(attributes.path)}`,
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
cookie += `; Path=${attributes.path}`;
|
|
164
|
+
}
|
|
165
|
+
const secure = attributes.secure ?? false;
|
|
166
|
+
if ((attributes.sameSite === "none" || attributes.partitioned === true) && !secure) {
|
|
167
|
+
throw new TypeError(
|
|
168
|
+
"[VIZE_COMPOSE_COOKIE_REQUIRES_SECURE] SameSite=None and Partitioned cookies must be Secure",
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
if (attributes.sameSite !== undefined) {
|
|
172
|
+
const sameSite = attributes.sameSite;
|
|
173
|
+
cookie += `; SameSite=${sameSite === "lax" ? "Lax" : sameSite === "strict" ? "Strict" : "None"}`;
|
|
174
|
+
}
|
|
175
|
+
if (secure) cookie += "; Secure";
|
|
176
|
+
if (attributes.httpOnly === true) cookie += "; HttpOnly";
|
|
177
|
+
if (attributes.partitioned === true) cookie += "; Partitioned";
|
|
178
|
+
return cookie;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Request/response bridge used by {@link useCookie}.
|
|
183
|
+
*
|
|
184
|
+
* On the server, `read` returns the incoming `Cookie` header and `write`
|
|
185
|
+
* appends a `Set-Cookie` header to the response. In the browser the default
|
|
186
|
+
* adapter reads and writes `document.cookie`.
|
|
187
|
+
*/
|
|
188
|
+
export interface CookieAdapter {
|
|
189
|
+
/** Return the current `Cookie` header (`name=value; …`). */
|
|
190
|
+
readonly read: () => string;
|
|
191
|
+
|
|
192
|
+
/** Persist one serialized cookie (a `Set-Cookie` header value). */
|
|
193
|
+
readonly write: (setCookie: string) => void;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Injection key for an app- or subtree-wide {@link CookieAdapter}. */
|
|
197
|
+
export const COOKIE_ADAPTER_KEY: InjectionKey<CookieAdapter> = Symbol("vize:cookie-adapter");
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Provide a {@link CookieAdapter} to descendant components (for example the
|
|
201
|
+
* request/response pair of a server render). Must be called during setup;
|
|
202
|
+
* use `app.provide(COOKIE_ADAPTER_KEY, adapter)` for a whole app.
|
|
203
|
+
*
|
|
204
|
+
* @param adapter Adapter used by descendants' {@link useCookie} calls.
|
|
205
|
+
*/
|
|
206
|
+
export function provideCookieAdapter(adapter: CookieAdapter): void {
|
|
207
|
+
provide(COOKIE_ADAPTER_KEY, adapter);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Converts a cookie value to and from its string form. */
|
|
211
|
+
export interface CookieSerializer<Value> {
|
|
212
|
+
/** Decode the percent-decoded cookie value. Throwing selects the default. */
|
|
213
|
+
readonly read: (raw: string) => Value;
|
|
214
|
+
|
|
215
|
+
/** Encode a value; the result is percent-encoded when written. */
|
|
216
|
+
readonly write: (value: Value) => string;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Stable failure codes reported by {@link useCookie}. */
|
|
220
|
+
export type CookieErrorCode = "read-failed" | "invalid-value" | "write-failed";
|
|
221
|
+
|
|
222
|
+
/** Failure observed while synchronizing a cookie. */
|
|
223
|
+
export interface CookieFailure {
|
|
224
|
+
/** Which synchronization step failed. */
|
|
225
|
+
readonly code: CookieErrorCode;
|
|
226
|
+
|
|
227
|
+
/** Cookie name involved in the failure. */
|
|
228
|
+
readonly name: string;
|
|
229
|
+
|
|
230
|
+
/** Exact thrown value, or the rejected candidate for `"invalid-value"`. */
|
|
231
|
+
readonly cause: unknown;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** Options for {@link useCookie}. */
|
|
235
|
+
export interface UseCookieOptions<Value> extends CookieAttributes {
|
|
236
|
+
/**
|
|
237
|
+
* Value used when the cookie is absent or unreadable. Also selects the
|
|
238
|
+
* serializer: strings are stored raw, everything else as JSON.
|
|
239
|
+
*
|
|
240
|
+
* @default undefined (the state is `string | undefined`)
|
|
241
|
+
*/
|
|
242
|
+
readonly default?: Value;
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Explicit serializer.
|
|
246
|
+
*
|
|
247
|
+
* @default raw strings for string defaults, JSON otherwise
|
|
248
|
+
*/
|
|
249
|
+
readonly serializer?: CookieSerializer<Value>;
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Validation hook applied to every decoded value.
|
|
253
|
+
*
|
|
254
|
+
* @default a check that the value has the default's kind
|
|
255
|
+
*/
|
|
256
|
+
readonly validate?: (candidate: unknown) => candidate is Value;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Request/response adapter. Takes precedence over an injected adapter.
|
|
260
|
+
*
|
|
261
|
+
* @default the injected adapter, else `document.cookie` in browsers
|
|
262
|
+
*/
|
|
263
|
+
readonly adapter?: CookieAdapter | null;
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Observe failures. Failures never throw out of the composable.
|
|
267
|
+
*
|
|
268
|
+
* @default undefined
|
|
269
|
+
*/
|
|
270
|
+
readonly onError?: (failure: CookieFailure) => void;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** Reactive state and controls returned by {@link useCookie}. */
|
|
274
|
+
export interface CookieControls<Value> {
|
|
275
|
+
/** Writable cookie value; assignments write the cookie. */
|
|
276
|
+
readonly state: Ref<Value>;
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Whether an adapter is attached. With the implicit `document.cookie`
|
|
280
|
+
* adapter inside a component it stays `false` until mounted, matching a
|
|
281
|
+
* server render without an adapter.
|
|
282
|
+
*/
|
|
283
|
+
readonly supported: Readonly<Ref<boolean>>;
|
|
284
|
+
|
|
285
|
+
/** Most recent failure, cleared by the next success. */
|
|
286
|
+
readonly error: Readonly<ShallowRef<CookieFailure | undefined>>;
|
|
287
|
+
|
|
288
|
+
/** Re-read the cookie from the adapter. */
|
|
289
|
+
readonly refresh: () => void;
|
|
290
|
+
|
|
291
|
+
/** Expire the cookie and restore the default value. */
|
|
292
|
+
readonly remove: () => void;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function browserAdapter(): CookieAdapter | undefined {
|
|
296
|
+
if (typeof window === "undefined") return undefined;
|
|
297
|
+
const document = window.document;
|
|
298
|
+
return {
|
|
299
|
+
read: () => document.cookie,
|
|
300
|
+
write: (setCookie) => {
|
|
301
|
+
document.cookie = setCookie;
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function sameKind<Value>(defaults: Value, candidate: unknown): candidate is Value {
|
|
307
|
+
if (defaults === null || defaults === undefined) return true;
|
|
308
|
+
if (Array.isArray(defaults)) return Array.isArray(candidate);
|
|
309
|
+
if (typeof defaults === "object") {
|
|
310
|
+
return typeof candidate === "object" && candidate !== null && !Array.isArray(candidate);
|
|
311
|
+
}
|
|
312
|
+
return typeof candidate === typeof defaults;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
interface CookieCodec {
|
|
316
|
+
readonly read: (raw: string) => unknown;
|
|
317
|
+
readonly write: (value: unknown) => string;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const rawCodec: CookieCodec = { read: (raw) => raw, write: (value) => String(value) };
|
|
321
|
+
const jsonCodec: CookieCodec = {
|
|
322
|
+
read: (raw): unknown => JSON.parse(raw),
|
|
323
|
+
write: (value) => JSON.stringify(value),
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Read and write one cookie with a typed default.
|
|
328
|
+
*
|
|
329
|
+
* @typeParam Value Cookie value type, inferred from `default`.
|
|
330
|
+
* @param name Cookie name.
|
|
331
|
+
* @param options Default, serializer, validation, attributes, and adapter.
|
|
332
|
+
* @returns The typed cookie value and its controls.
|
|
333
|
+
*/
|
|
334
|
+
export function useCookie<Value>(
|
|
335
|
+
name: string,
|
|
336
|
+
options: UseCookieOptions<Value> & { readonly default: Value },
|
|
337
|
+
): CookieControls<Value>;
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Read and write one raw string cookie; absent cookies are `undefined`.
|
|
341
|
+
*
|
|
342
|
+
* @param name Cookie name.
|
|
343
|
+
* @param options Attributes and adapter.
|
|
344
|
+
* @returns The cookie string and its controls.
|
|
345
|
+
*/
|
|
346
|
+
export function useCookie(
|
|
347
|
+
name: string,
|
|
348
|
+
options?: UseCookieOptions<string>,
|
|
349
|
+
): CookieControls<string | undefined>;
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Synchronize a typed reactive value with one cookie, on the server and in
|
|
353
|
+
* the browser.
|
|
354
|
+
*
|
|
355
|
+
* The adapter is resolved from `options.adapter`, then from
|
|
356
|
+
* {@link COOKIE_ADAPTER_KEY} (see {@link provideCookieAdapter}), then from
|
|
357
|
+
* `document.cookie` in browsers. During a server render with an adapter the
|
|
358
|
+
* value comes from the request `Cookie` header and assignments emit
|
|
359
|
+
* `Set-Cookie` headers through `adapter.write`, so server and client render
|
|
360
|
+
* the same value and hydrate without a mismatch. Without any adapter (plain
|
|
361
|
+
* SSR) the default is used and nothing is written.
|
|
362
|
+
*
|
|
363
|
+
* String defaults are stored raw; other defaults as JSON checked by
|
|
364
|
+
* `validate` (by default: same kind as the default). Assigning `undefined`
|
|
365
|
+
* (or calling `remove`) expires the cookie. Cookies are written with
|
|
366
|
+
* `Path=/` unless `path` is given. Failures never throw; they are exposed
|
|
367
|
+
* through `error` and `onError`. The write watcher stops with the owning
|
|
368
|
+
* reactive scope.
|
|
369
|
+
*
|
|
370
|
+
* @example
|
|
371
|
+
* ```ts
|
|
372
|
+
* // server entry: app.provide(COOKIE_ADAPTER_KEY, { read: () => req.headers.cookie ?? "",
|
|
373
|
+
* // write: (value) => res.appendHeader("Set-Cookie", value) });
|
|
374
|
+
* const { state: locale } = useCookie("locale", { default: "en", maxAge: 31_536_000 });
|
|
375
|
+
* ```
|
|
376
|
+
*
|
|
377
|
+
* @param name Cookie name (an RFC 6265 token).
|
|
378
|
+
* @param options Default, serializer, validation, attributes, and adapter.
|
|
379
|
+
* @default options {}
|
|
380
|
+
* @returns The synchronized value and its controls.
|
|
381
|
+
*/
|
|
382
|
+
export function useCookie<Value>(
|
|
383
|
+
name: string,
|
|
384
|
+
options: UseCookieOptions<Value> = {},
|
|
385
|
+
): CookieControls<Value | undefined> {
|
|
386
|
+
const injected = hasInjectionContext() ? inject(COOKIE_ADAPTER_KEY, undefined) : undefined;
|
|
387
|
+
const adapter =
|
|
388
|
+
options.adapter === undefined ? (injected ?? browserAdapter()) : (options.adapter ?? undefined);
|
|
389
|
+
const fallback = options.default;
|
|
390
|
+
const codec: CookieCodec | CookieSerializer<Value> =
|
|
391
|
+
options.serializer ??
|
|
392
|
+
(fallback === undefined || typeof fallback === "string" ? rawCodec : jsonCodec);
|
|
393
|
+
const validate =
|
|
394
|
+
options.validate ?? ((candidate: unknown): candidate is Value => sameKind(fallback, candidate));
|
|
395
|
+
const state = shallowRef<Value | undefined>(fallback);
|
|
396
|
+
const error = shallowRef<CookieFailure | undefined>(undefined);
|
|
397
|
+
const implicitBrowserAdapter = options.adapter === undefined && injected === undefined;
|
|
398
|
+
const mounted = implicitBrowserAdapter && hasInjectionContext() ? useMounted() : undefined;
|
|
399
|
+
const supported = computed(() => (mounted?.value ?? true) && adapter !== undefined);
|
|
400
|
+
const attributes: CookieAttributes = {
|
|
401
|
+
path: "/",
|
|
402
|
+
...(options.domain === undefined ? {} : { domain: options.domain }),
|
|
403
|
+
...(options.path === undefined ? {} : { path: options.path }),
|
|
404
|
+
...(options.maxAge === undefined ? {} : { maxAge: options.maxAge }),
|
|
405
|
+
...(options.expires === undefined ? {} : { expires: options.expires }),
|
|
406
|
+
...(options.sameSite === undefined ? {} : { sameSite: options.sameSite }),
|
|
407
|
+
...(options.secure === undefined ? {} : { secure: options.secure }),
|
|
408
|
+
...(options.httpOnly === undefined ? {} : { httpOnly: options.httpOnly }),
|
|
409
|
+
...(options.partitioned === undefined ? {} : { partitioned: options.partitioned }),
|
|
410
|
+
};
|
|
411
|
+
let syncedRaw: string | undefined;
|
|
412
|
+
|
|
413
|
+
const fail = (code: CookieErrorCode, cause: unknown): void => {
|
|
414
|
+
const failure: CookieFailure = { code, name, cause };
|
|
415
|
+
error.value = failure;
|
|
416
|
+
options.onError?.(failure);
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
// Values read from the adapter (or restored defaults) are not written back.
|
|
420
|
+
let applying = false;
|
|
421
|
+
const assign = (value: Value | undefined, raw: string | undefined): void => {
|
|
422
|
+
syncedRaw = raw;
|
|
423
|
+
applying = true;
|
|
424
|
+
try {
|
|
425
|
+
state.value = value;
|
|
426
|
+
} finally {
|
|
427
|
+
applying = false;
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
const refresh = (): void => {
|
|
432
|
+
if (adapter === undefined) return;
|
|
433
|
+
let raw: string | undefined;
|
|
434
|
+
try {
|
|
435
|
+
raw = parseCookieHeader(adapter.read())[name];
|
|
436
|
+
} catch (cause) {
|
|
437
|
+
fail("read-failed", cause);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
if (raw === undefined) {
|
|
441
|
+
assign(fallback, undefined);
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
let candidate: unknown;
|
|
445
|
+
try {
|
|
446
|
+
candidate = codec.read(raw);
|
|
447
|
+
} catch (cause) {
|
|
448
|
+
fail("read-failed", cause);
|
|
449
|
+
assign(fallback, raw);
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
if (!validate(candidate)) {
|
|
453
|
+
fail("invalid-value", candidate);
|
|
454
|
+
assign(fallback, raw);
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
error.value = undefined;
|
|
458
|
+
assign(candidate, raw);
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
const writeCookie = (value: Value | undefined): void => {
|
|
462
|
+
if (adapter === undefined) return;
|
|
463
|
+
try {
|
|
464
|
+
if (value === undefined) {
|
|
465
|
+
adapter.write(
|
|
466
|
+
serializeCookie(name, "", { ...attributes, maxAge: 0, expires: new Date(0) }),
|
|
467
|
+
);
|
|
468
|
+
syncedRaw = undefined;
|
|
469
|
+
} else {
|
|
470
|
+
const raw = codec.write(value);
|
|
471
|
+
if (raw === syncedRaw) return;
|
|
472
|
+
adapter.write(serializeCookie(name, raw, attributes));
|
|
473
|
+
syncedRaw = raw;
|
|
474
|
+
}
|
|
475
|
+
} catch (cause) {
|
|
476
|
+
fail("write-failed", cause);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
error.value = undefined;
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
refresh();
|
|
483
|
+
|
|
484
|
+
const stopWrite = watch(
|
|
485
|
+
state,
|
|
486
|
+
(value) => {
|
|
487
|
+
if (!applying) writeCookie(value);
|
|
488
|
+
},
|
|
489
|
+
{ flush: "sync" },
|
|
490
|
+
);
|
|
491
|
+
|
|
492
|
+
const remove = (): void => {
|
|
493
|
+
writeCookie(undefined);
|
|
494
|
+
assign(fallback, undefined);
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
tryOnScopeDispose(stopWrite);
|
|
498
|
+
|
|
499
|
+
return { state, supported, error, refresh, remove };
|
|
500
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { computed, shallowRef, toValue } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { useIntervalFn } from "./use-interval.ts";
|
|
5
|
+
import type { IntervalScheduler, PausableControls } from "./use-interval.ts";
|
|
6
|
+
|
|
7
|
+
/** Options for {@link useCountdown}. */
|
|
8
|
+
export interface UseCountdownOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Milliseconds between two decrements. Reactive.
|
|
11
|
+
*
|
|
12
|
+
* @default 1000
|
|
13
|
+
*/
|
|
14
|
+
readonly intervalMs?: MaybeRefOrGetter<number>;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Start counting down as soon as the composable is created.
|
|
18
|
+
*
|
|
19
|
+
* @default false
|
|
20
|
+
*/
|
|
21
|
+
readonly immediate?: boolean;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Invoked after every decrement with the remaining count.
|
|
25
|
+
*
|
|
26
|
+
* @default undefined
|
|
27
|
+
*/
|
|
28
|
+
readonly onTick?: (remaining: number) => void;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Invoked once when the count reaches zero.
|
|
32
|
+
*
|
|
33
|
+
* @default undefined
|
|
34
|
+
*/
|
|
35
|
+
readonly onComplete?: () => void;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Starts host timers when no browser `window` is available.
|
|
39
|
+
*
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
readonly runOnServer?: boolean;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Repeating timer host.
|
|
46
|
+
*
|
|
47
|
+
* @default globalThis timer functions
|
|
48
|
+
*/
|
|
49
|
+
readonly scheduler?: IntervalScheduler;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** State and controls returned by {@link useCountdown}. */
|
|
53
|
+
export interface CountdownControls extends PausableControls {
|
|
54
|
+
/** Remaining whole ticks; never negative. */
|
|
55
|
+
readonly remaining: Readonly<ShallowRef<number>>;
|
|
56
|
+
|
|
57
|
+
/** Whether the countdown reached zero. */
|
|
58
|
+
readonly isComplete: ComputedRef<boolean>;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Reset to `count` (default: the initial count) and start ticking.
|
|
62
|
+
*
|
|
63
|
+
* @param count Replacement starting count.
|
|
64
|
+
*/
|
|
65
|
+
readonly start: (count?: number) => void;
|
|
66
|
+
|
|
67
|
+
/** Pause and reset to `count` (default: the initial count). */
|
|
68
|
+
readonly reset: (count?: number) => void;
|
|
69
|
+
|
|
70
|
+
/** Pause and jump to zero without firing `onComplete`. */
|
|
71
|
+
readonly stop: () => void;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function resolveCount(value: number): number {
|
|
75
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
76
|
+
throw new RangeError(
|
|
77
|
+
`[VIZE_COMPOSE_COUNTDOWN_INVALID_COUNT] count must be finite and at least zero; received ${String(value)}`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
return Math.trunc(value);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Count down from a number of ticks to zero.
|
|
85
|
+
*
|
|
86
|
+
* Builds on {@link useIntervalFn}: pause/resume keep the remaining count,
|
|
87
|
+
* `start` and `reset` restore it, and the timer pauses itself at zero after
|
|
88
|
+
* calling `onComplete`. The initial count is reactive only for later
|
|
89
|
+
* `start()`/`reset()` calls without an argument. Server rendering is
|
|
90
|
+
* hydration-stable (no timer, remaining stays at the initial count).
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* const { remaining, start } = useCountdown(60, { onComplete: resendAvailable });
|
|
95
|
+
* start();
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @param initialCount Reactive starting count in ticks.
|
|
99
|
+
* @param options Cadence, callbacks, and scheduler policy.
|
|
100
|
+
* @default options {}
|
|
101
|
+
* @throws `RangeError` tagged `VIZE_COMPOSE_COUNTDOWN_INVALID_COUNT` when a
|
|
102
|
+
* count is negative or not finite.
|
|
103
|
+
* @returns Remaining count, completion flag, and controls.
|
|
104
|
+
*/
|
|
105
|
+
export function useCountdown(
|
|
106
|
+
initialCount: MaybeRefOrGetter<number>,
|
|
107
|
+
options: UseCountdownOptions = {},
|
|
108
|
+
): CountdownControls {
|
|
109
|
+
const remaining = shallowRef(resolveCount(toValue(initialCount)));
|
|
110
|
+
const isComplete = computed(() => remaining.value === 0);
|
|
111
|
+
|
|
112
|
+
const interval = useIntervalFn(
|
|
113
|
+
() => {
|
|
114
|
+
if (remaining.value === 0) return;
|
|
115
|
+
remaining.value -= 1;
|
|
116
|
+
options.onTick?.(remaining.value);
|
|
117
|
+
if (remaining.value === 0) {
|
|
118
|
+
interval.pause();
|
|
119
|
+
options.onComplete?.();
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
options.intervalMs ?? 1_000,
|
|
123
|
+
{
|
|
124
|
+
immediate: false,
|
|
125
|
+
runOnServer: options.runOnServer ?? false,
|
|
126
|
+
...(options.scheduler === undefined ? {} : { scheduler: options.scheduler }),
|
|
127
|
+
},
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
const reset = (count?: number): void => {
|
|
131
|
+
interval.pause();
|
|
132
|
+
remaining.value = resolveCount(count ?? toValue(initialCount));
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const start = (count?: number): void => {
|
|
136
|
+
reset(count);
|
|
137
|
+
if (remaining.value > 0) interval.resume();
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const stop = (): void => {
|
|
141
|
+
interval.pause();
|
|
142
|
+
remaining.value = 0;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const resume = (): void => {
|
|
146
|
+
if (remaining.value > 0) interval.resume();
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
if ((options.immediate ?? false) && remaining.value > 0) interval.resume();
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
isActive: interval.isActive,
|
|
153
|
+
pause: interval.pause,
|
|
154
|
+
resume,
|
|
155
|
+
remaining,
|
|
156
|
+
isComplete,
|
|
157
|
+
start,
|
|
158
|
+
reset,
|
|
159
|
+
stop,
|
|
160
|
+
};
|
|
161
|
+
}
|