@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,295 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { hasInjectionContext, onMounted, readonly, ref, shallowReactive, toValue, watch } from "vue";
|
|
3
|
+
//#region src/use-url-search-params.ts
|
|
4
|
+
function single(definition) {
|
|
5
|
+
return {
|
|
6
|
+
default: definition.default,
|
|
7
|
+
parse(values) {
|
|
8
|
+
const [first] = values;
|
|
9
|
+
return first === void 0 ? definition.default : definition.parse(first);
|
|
10
|
+
},
|
|
11
|
+
serialize(value) {
|
|
12
|
+
return [definition.serialize(value)];
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function sameJsonKind(defaults, candidate) {
|
|
17
|
+
if (defaults === null) return true;
|
|
18
|
+
if (Array.isArray(defaults)) return Array.isArray(candidate);
|
|
19
|
+
if (typeof defaults === "object") return typeof candidate === "object" && candidate !== null && !Array.isArray(candidate);
|
|
20
|
+
return typeof candidate === typeof defaults;
|
|
21
|
+
}
|
|
22
|
+
function arrayCodec(item) {
|
|
23
|
+
if (item === void 0) return {
|
|
24
|
+
default: [],
|
|
25
|
+
parse: (values) => [...values],
|
|
26
|
+
serialize: (value) => value
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
default: [],
|
|
30
|
+
parse: (values) => values.map((value) => item.parse([value])),
|
|
31
|
+
serialize: (value) => value.flatMap((entry) => item.serialize(entry))
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Built-in typed codecs for {@link useUrlSearchParams} schemas. */
|
|
35
|
+
const searchParam = {
|
|
36
|
+
/**
|
|
37
|
+
* Raw string value.
|
|
38
|
+
*
|
|
39
|
+
* @param fallback Value for an absent key.
|
|
40
|
+
* @default fallback ""
|
|
41
|
+
* @returns A string codec.
|
|
42
|
+
*/
|
|
43
|
+
string(fallback = "") {
|
|
44
|
+
return single({
|
|
45
|
+
parse: (raw) => raw,
|
|
46
|
+
serialize: (value) => value,
|
|
47
|
+
default: fallback
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* Finite number; non-numeric input selects the default.
|
|
52
|
+
*
|
|
53
|
+
* @param fallback Value for an absent or invalid key.
|
|
54
|
+
* @default fallback 0
|
|
55
|
+
* @returns A number codec.
|
|
56
|
+
*/
|
|
57
|
+
number(fallback = 0) {
|
|
58
|
+
return single({
|
|
59
|
+
parse: (raw) => {
|
|
60
|
+
const value = raw.trim() === "" ? NaN : Number(raw);
|
|
61
|
+
return Number.isFinite(value) ? value : fallback;
|
|
62
|
+
},
|
|
63
|
+
serialize: String,
|
|
64
|
+
default: fallback
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
/**
|
|
68
|
+
* Boolean: `true`/`1`/empty read as `true`, `false`/`0` as `false`.
|
|
69
|
+
*
|
|
70
|
+
* @param fallback Value for an absent or unrecognized key.
|
|
71
|
+
* @default fallback false
|
|
72
|
+
* @returns A boolean codec.
|
|
73
|
+
*/
|
|
74
|
+
boolean(fallback = false) {
|
|
75
|
+
return single({
|
|
76
|
+
parse: (raw) => {
|
|
77
|
+
if (raw === "" || raw === "true" || raw === "1") return true;
|
|
78
|
+
if (raw === "false" || raw === "0") return false;
|
|
79
|
+
return fallback;
|
|
80
|
+
},
|
|
81
|
+
serialize: String,
|
|
82
|
+
default: fallback
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
/**
|
|
86
|
+
* One of a closed set of string literals.
|
|
87
|
+
*
|
|
88
|
+
* @param values Allowed values.
|
|
89
|
+
* @param fallback Value for an absent or unknown key.
|
|
90
|
+
* @returns A literal-union codec.
|
|
91
|
+
*/
|
|
92
|
+
enum(values, fallback) {
|
|
93
|
+
const allowed = new Set(values);
|
|
94
|
+
const isAllowed = (raw) => allowed.has(raw);
|
|
95
|
+
return single({
|
|
96
|
+
parse: (raw) => isAllowed(raw) ? raw : fallback,
|
|
97
|
+
serialize: (value) => value,
|
|
98
|
+
default: fallback
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
/**
|
|
102
|
+
* Repeated key (`?tag=a&tag=b`) decoded item by item.
|
|
103
|
+
*
|
|
104
|
+
* @param item Single-value codec applied to every value.
|
|
105
|
+
* @default item searchParam.string()
|
|
106
|
+
* @returns An array codec whose default is `[]`.
|
|
107
|
+
*/
|
|
108
|
+
array: arrayCodec,
|
|
109
|
+
/**
|
|
110
|
+
* JSON value checked by `validate`, or by kind against the default.
|
|
111
|
+
*
|
|
112
|
+
* @param fallback Value for an absent or invalid key.
|
|
113
|
+
* @param validate Type guard applied to the decoded JSON.
|
|
114
|
+
* @default validate the decoded value has the default's kind
|
|
115
|
+
* @returns A JSON codec.
|
|
116
|
+
*/
|
|
117
|
+
json(fallback, validate) {
|
|
118
|
+
const accept = validate ?? ((candidate) => sameJsonKind(fallback, candidate));
|
|
119
|
+
return single({
|
|
120
|
+
parse: (raw) => {
|
|
121
|
+
const candidate = JSON.parse(raw);
|
|
122
|
+
return accept(candidate) ? candidate : fallback;
|
|
123
|
+
},
|
|
124
|
+
serialize: (value) => JSON.stringify(value),
|
|
125
|
+
default: fallback
|
|
126
|
+
});
|
|
127
|
+
},
|
|
128
|
+
/**
|
|
129
|
+
* Single-value codec from explicit parse/serialize functions.
|
|
130
|
+
*
|
|
131
|
+
* @param definition Parse, serialize, and default.
|
|
132
|
+
* @returns The codec.
|
|
133
|
+
*/
|
|
134
|
+
custom(definition) {
|
|
135
|
+
return single(definition);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
function safeParse(codec, values) {
|
|
139
|
+
try {
|
|
140
|
+
return codec.parse(values);
|
|
141
|
+
} catch {
|
|
142
|
+
return codec.default;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function toSearch(source) {
|
|
146
|
+
if (source instanceof URLSearchParams) return new URLSearchParams(source);
|
|
147
|
+
if (source instanceof URL) return new URLSearchParams(source.search);
|
|
148
|
+
const withoutHash = source.split("#", 1)[0] ?? "";
|
|
149
|
+
const query = withoutHash.indexOf("?");
|
|
150
|
+
return new URLSearchParams(query === -1 ? "" : withoutHash.slice(query + 1));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Decode search parameters with a schema. Pure and SSR-safe.
|
|
154
|
+
*
|
|
155
|
+
* @typeParam Schema Parameter codecs.
|
|
156
|
+
* @param schema Parameter codecs.
|
|
157
|
+
* @param search URL, URL string, query string, or parsed parameters.
|
|
158
|
+
* @returns One typed value per schema key.
|
|
159
|
+
*/
|
|
160
|
+
function parseSearchParams(schema, search) {
|
|
161
|
+
const params = toSearch(search);
|
|
162
|
+
const entries = Object.keys(schema).map((key) => {
|
|
163
|
+
const codec = schema[key];
|
|
164
|
+
return [key, codec === void 0 ? void 0 : safeParse(codec, params.getAll(key))];
|
|
165
|
+
});
|
|
166
|
+
return Object.fromEntries(entries);
|
|
167
|
+
}
|
|
168
|
+
function sameValues(left, right) {
|
|
169
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Encode typed values with a schema. Pure and SSR-safe.
|
|
173
|
+
*
|
|
174
|
+
* @typeParam Schema Parameter codecs.
|
|
175
|
+
* @param schema Parameter codecs.
|
|
176
|
+
* @param values Values to encode; keys absent from `values` keep the base.
|
|
177
|
+
* @param options Base parameters and default removal.
|
|
178
|
+
* @default options {}
|
|
179
|
+
* @returns The encoded parameters.
|
|
180
|
+
*/
|
|
181
|
+
function serializeSearchParams(schema, values, options = {}) {
|
|
182
|
+
const params = options.base === void 0 ? new URLSearchParams() : toSearch(options.base);
|
|
183
|
+
const removeDefaults = options.removeDefaults ?? true;
|
|
184
|
+
for (const key of Object.keys(schema)) {
|
|
185
|
+
const codec = schema[key];
|
|
186
|
+
if (codec === void 0 || !(key in values)) continue;
|
|
187
|
+
const encoded = codec.serialize(values[key]);
|
|
188
|
+
const [first, ...rest] = encoded;
|
|
189
|
+
if (first === void 0 || removeDefaults && sameValues(encoded, codec.serialize(codec.default))) {
|
|
190
|
+
params.delete(key);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
params.set(key, first);
|
|
194
|
+
for (const value of rest) params.append(key, value);
|
|
195
|
+
}
|
|
196
|
+
return params;
|
|
197
|
+
}
|
|
198
|
+
function browserHost() {
|
|
199
|
+
return typeof window !== "undefined" ? window : void 0;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Two-way bind typed URL search parameters described by a codec schema.
|
|
203
|
+
*
|
|
204
|
+
* Every property type is inferred from its codec. Assigning a property
|
|
205
|
+
* rewrites the query through `history.replaceState` (or `pushState` with
|
|
206
|
+
* `mode: "push"`), keeping parameters outside the schema and the fragment,
|
|
207
|
+
* and dropping values equal to their default. Back/forward navigation
|
|
208
|
+
* (`popstate`) re-reads the URL.
|
|
209
|
+
*
|
|
210
|
+
* Server rendering: no global is read. Pass `ssrUrl` (the request URL) so
|
|
211
|
+
* the server renders the same values the client reads during hydration.
|
|
212
|
+
* Inside a component the browser URL is first read after mounting, so the
|
|
213
|
+
* hydrating client renders the `ssrUrl` state before switching to it.
|
|
214
|
+
* Listeners are removed with the owning reactive scope or `stop()`.
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```ts
|
|
218
|
+
* const { params } = useUrlSearchParams({
|
|
219
|
+
* page: searchParam.number(1),
|
|
220
|
+
* sort: searchParam.enum(["new", "top"], "new"),
|
|
221
|
+
* tags: searchParam.array(),
|
|
222
|
+
* });
|
|
223
|
+
* params.page += 1; // ?page=2
|
|
224
|
+
* ```
|
|
225
|
+
*
|
|
226
|
+
* @typeParam Schema Parameter codecs.
|
|
227
|
+
* @param schema Parameter codecs.
|
|
228
|
+
* @param options Host, history mode, default removal, and server URL.
|
|
229
|
+
* @default options {}
|
|
230
|
+
* @returns Typed reactive parameters and controls.
|
|
231
|
+
*/
|
|
232
|
+
function useUrlSearchParams(schema, options = {}) {
|
|
233
|
+
const resolveHost = () => options.host === void 0 ? browserHost() : toValue(options.host) ?? void 0;
|
|
234
|
+
const removeDefaults = options.removeDefaults ?? true;
|
|
235
|
+
const params = shallowReactive(parseSearchParams(schema, toValue(options.ssrUrl) ?? ""));
|
|
236
|
+
const supported = ref(false);
|
|
237
|
+
let syncedSearch;
|
|
238
|
+
let applying = false;
|
|
239
|
+
const encode = (host) => serializeSearchParams(schema, params, {
|
|
240
|
+
base: host.location.search,
|
|
241
|
+
removeDefaults
|
|
242
|
+
}).toString();
|
|
243
|
+
const refresh = () => {
|
|
244
|
+
const host = resolveHost();
|
|
245
|
+
supported.value = host !== void 0;
|
|
246
|
+
const source = host === void 0 ? toValue(options.ssrUrl) ?? "" : host.location.search;
|
|
247
|
+
applying = true;
|
|
248
|
+
try {
|
|
249
|
+
Object.assign(params, parseSearchParams(schema, source));
|
|
250
|
+
} finally {
|
|
251
|
+
applying = false;
|
|
252
|
+
}
|
|
253
|
+
if (host !== void 0) syncedSearch = encode(host);
|
|
254
|
+
};
|
|
255
|
+
let stopHost = () => void 0;
|
|
256
|
+
const startHost = () => {
|
|
257
|
+
stopHost = watch(resolveHost, (host, _previous, onCleanup) => {
|
|
258
|
+
refresh();
|
|
259
|
+
if (host === void 0) return;
|
|
260
|
+
host.addEventListener("popstate", refresh);
|
|
261
|
+
onCleanup(() => host.removeEventListener("popstate", refresh));
|
|
262
|
+
}, {
|
|
263
|
+
immediate: true,
|
|
264
|
+
flush: "sync"
|
|
265
|
+
});
|
|
266
|
+
};
|
|
267
|
+
if (hasInjectionContext()) onMounted(startHost);
|
|
268
|
+
else startHost();
|
|
269
|
+
const stopWrite = watch(() => {
|
|
270
|
+
const host = resolveHost();
|
|
271
|
+
return host === void 0 ? void 0 : encode(host);
|
|
272
|
+
}, (search) => {
|
|
273
|
+
const host = resolveHost();
|
|
274
|
+
if (applying || search === void 0 || host === void 0) return;
|
|
275
|
+
if (search === syncedSearch) return;
|
|
276
|
+
syncedSearch = search;
|
|
277
|
+
const { pathname, hash } = host.location;
|
|
278
|
+
const url = `${pathname}${search === "" ? "" : `?${search}`}${hash}`;
|
|
279
|
+
if ((options.mode ?? "replace") === "push") host.history.pushState(null, "", url);
|
|
280
|
+
else host.history.replaceState(host.history.state, "", url);
|
|
281
|
+
}, { flush: "sync" });
|
|
282
|
+
const stop = () => {
|
|
283
|
+
stopHost();
|
|
284
|
+
stopWrite();
|
|
285
|
+
};
|
|
286
|
+
tryOnScopeDispose(stop);
|
|
287
|
+
return {
|
|
288
|
+
params,
|
|
289
|
+
supported: readonly(supported),
|
|
290
|
+
refresh,
|
|
291
|
+
stop
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
//#endregion
|
|
295
|
+
export { parseSearchParams, searchParam, serializeSearchParams, useUrlSearchParams };
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-usb.d.ts
|
|
4
|
+
/** Device filter for `requestDevice`. */
|
|
5
|
+
interface USBDeviceFilter {
|
|
6
|
+
/** USB vendor id. */
|
|
7
|
+
readonly vendorId?: number;
|
|
8
|
+
/** USB product id. */
|
|
9
|
+
readonly productId?: number;
|
|
10
|
+
/** Device or interface class code. */
|
|
11
|
+
readonly classCode?: number;
|
|
12
|
+
/** Device or interface subclass code. */
|
|
13
|
+
readonly subclassCode?: number;
|
|
14
|
+
/** Device or interface protocol code. */
|
|
15
|
+
readonly protocolCode?: number;
|
|
16
|
+
/** Serial number. */
|
|
17
|
+
readonly serialNumber?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Transfer status reported by WebUSB. */
|
|
20
|
+
type USBTransferStatus = "ok" | "stall" | "babble";
|
|
21
|
+
/** Result of an IN transfer. */
|
|
22
|
+
interface USBInTransferResultLike {
|
|
23
|
+
/** Transfer status. */
|
|
24
|
+
readonly status: USBTransferStatus;
|
|
25
|
+
/** Received bytes. */
|
|
26
|
+
readonly data?: DataView | null;
|
|
27
|
+
}
|
|
28
|
+
/** Result of an OUT transfer. */
|
|
29
|
+
interface USBOutTransferResultLike {
|
|
30
|
+
/** Transfer status. */
|
|
31
|
+
readonly status: USBTransferStatus;
|
|
32
|
+
/** Number of bytes written. */
|
|
33
|
+
readonly bytesWritten: number;
|
|
34
|
+
}
|
|
35
|
+
/** Setup packet of a control transfer. */
|
|
36
|
+
interface USBControlTransferSetup {
|
|
37
|
+
/** Request category. */
|
|
38
|
+
readonly requestType: "standard" | "class" | "vendor";
|
|
39
|
+
/** Request target. */
|
|
40
|
+
readonly recipient: "device" | "interface" | "endpoint" | "other";
|
|
41
|
+
/** `bRequest`. */
|
|
42
|
+
readonly request: number;
|
|
43
|
+
/** `wValue`. */
|
|
44
|
+
readonly value: number;
|
|
45
|
+
/** `wIndex`. */
|
|
46
|
+
readonly index: number;
|
|
47
|
+
}
|
|
48
|
+
/** Minimal `USBDevice` used by {@link useUSB}. */
|
|
49
|
+
interface USBDeviceLike {
|
|
50
|
+
/** USB vendor id. */
|
|
51
|
+
readonly vendorId: number;
|
|
52
|
+
/** USB product id. */
|
|
53
|
+
readonly productId: number;
|
|
54
|
+
/** Product name. */
|
|
55
|
+
readonly productName?: string | undefined;
|
|
56
|
+
/** Serial number. */
|
|
57
|
+
readonly serialNumber?: string | undefined;
|
|
58
|
+
/** Whether a session is open. */
|
|
59
|
+
readonly opened: boolean;
|
|
60
|
+
/** Start a session. */
|
|
61
|
+
open(): Promise<void>;
|
|
62
|
+
/** End the session. */
|
|
63
|
+
close(): Promise<void>;
|
|
64
|
+
/** Select a configuration by value. */
|
|
65
|
+
selectConfiguration(configurationValue: number): Promise<void>;
|
|
66
|
+
/** Claim an interface. */
|
|
67
|
+
claimInterface(interfaceNumber: number): Promise<void>;
|
|
68
|
+
/** Release a claimed interface. */
|
|
69
|
+
releaseInterface(interfaceNumber: number): Promise<void>;
|
|
70
|
+
/** Bulk/interrupt IN transfer. */
|
|
71
|
+
transferIn(endpointNumber: number, length: number): Promise<USBInTransferResultLike>;
|
|
72
|
+
/** Bulk/interrupt OUT transfer. */
|
|
73
|
+
transferOut(endpointNumber: number, data: BufferSource): Promise<USBOutTransferResultLike>;
|
|
74
|
+
/** Control IN transfer. */
|
|
75
|
+
controlTransferIn(setup: USBControlTransferSetup, length: number): Promise<USBInTransferResultLike>;
|
|
76
|
+
/** Control OUT transfer. */
|
|
77
|
+
controlTransferOut(setup: USBControlTransferSetup, data?: BufferSource): Promise<USBOutTransferResultLike>;
|
|
78
|
+
}
|
|
79
|
+
/** `navigator.usb`-like capability used by {@link useUSB}. */
|
|
80
|
+
interface USBHost extends EventTarget {
|
|
81
|
+
/** Devices the page already has access to. */
|
|
82
|
+
getDevices(): Promise<USBDeviceLike[]>;
|
|
83
|
+
/** Prompt the user for a device. */
|
|
84
|
+
requestDevice(options: {
|
|
85
|
+
readonly filters: USBDeviceFilter[];
|
|
86
|
+
}): Promise<USBDeviceLike>;
|
|
87
|
+
}
|
|
88
|
+
/** Plain, reactive-friendly description of a granted device. */
|
|
89
|
+
interface USBDeviceInfo {
|
|
90
|
+
/** The live device, for passing back to the actions. */
|
|
91
|
+
readonly device: USBDeviceLike;
|
|
92
|
+
/** USB vendor id. */
|
|
93
|
+
readonly vendorId: number;
|
|
94
|
+
/** USB product id. */
|
|
95
|
+
readonly productId: number;
|
|
96
|
+
/** Product name (empty when unknown). */
|
|
97
|
+
readonly productName: string;
|
|
98
|
+
/** Serial number (empty when unknown). */
|
|
99
|
+
readonly serialNumber: string;
|
|
100
|
+
/** Whether a session was open when the list was refreshed. */
|
|
101
|
+
readonly opened: boolean;
|
|
102
|
+
}
|
|
103
|
+
/** Options for {@link useUSB}. */
|
|
104
|
+
interface UseUSBOptions {
|
|
105
|
+
/**
|
|
106
|
+
* `navigator.usb`-like capability.
|
|
107
|
+
*
|
|
108
|
+
* @default window.navigator.usb when it exists
|
|
109
|
+
*/
|
|
110
|
+
readonly host?: MaybeRefOrGetter<USBHost | null | undefined>;
|
|
111
|
+
}
|
|
112
|
+
/** Reactive state and actions returned by {@link useUSB}. */
|
|
113
|
+
interface USBControls {
|
|
114
|
+
/** Whether WebUSB is available. */
|
|
115
|
+
readonly supported: ComputedRef<boolean>;
|
|
116
|
+
/** Granted devices, refreshed on `connect` / `disconnect` and after every action. */
|
|
117
|
+
readonly devices: Readonly<ShallowRef<readonly USBDeviceInfo[]>>;
|
|
118
|
+
/** Most recent failure. */
|
|
119
|
+
readonly error: Readonly<ShallowRef<unknown>>;
|
|
120
|
+
/**
|
|
121
|
+
* Prompt the user for a device (requires user activation).
|
|
122
|
+
*
|
|
123
|
+
* @returns The chosen device, or `undefined` when cancelled or failed.
|
|
124
|
+
*/
|
|
125
|
+
readonly requestDevice: (filters?: USBDeviceFilter[]) => Promise<USBDeviceLike | undefined>;
|
|
126
|
+
/**
|
|
127
|
+
* Refresh `devices`.
|
|
128
|
+
*
|
|
129
|
+
* @returns The granted devices.
|
|
130
|
+
*/
|
|
131
|
+
readonly getDevices: () => Promise<readonly USBDeviceInfo[]>;
|
|
132
|
+
/**
|
|
133
|
+
* Open a session.
|
|
134
|
+
*
|
|
135
|
+
* @returns Whether it succeeded.
|
|
136
|
+
*/
|
|
137
|
+
readonly open: (device: USBDeviceLike) => Promise<boolean>;
|
|
138
|
+
/**
|
|
139
|
+
* Close a session.
|
|
140
|
+
*
|
|
141
|
+
* @returns Whether it succeeded.
|
|
142
|
+
*/
|
|
143
|
+
readonly close: (device: USBDeviceLike) => Promise<boolean>;
|
|
144
|
+
/**
|
|
145
|
+
* Select a configuration.
|
|
146
|
+
*
|
|
147
|
+
* @returns Whether it succeeded.
|
|
148
|
+
*/
|
|
149
|
+
readonly selectConfiguration: (device: USBDeviceLike, value: number) => Promise<boolean>;
|
|
150
|
+
/**
|
|
151
|
+
* Claim an interface.
|
|
152
|
+
*
|
|
153
|
+
* @returns Whether it succeeded.
|
|
154
|
+
*/
|
|
155
|
+
readonly claimInterface: (device: USBDeviceLike, interfaceNumber: number) => Promise<boolean>;
|
|
156
|
+
/**
|
|
157
|
+
* Release an interface.
|
|
158
|
+
*
|
|
159
|
+
* @returns Whether it succeeded.
|
|
160
|
+
*/
|
|
161
|
+
readonly releaseInterface: (device: USBDeviceLike, interfaceNumber: number) => Promise<boolean>;
|
|
162
|
+
/**
|
|
163
|
+
* Bulk/interrupt IN transfer.
|
|
164
|
+
*
|
|
165
|
+
* @returns The result, or `undefined` on failure.
|
|
166
|
+
*/
|
|
167
|
+
readonly transferIn: (device: USBDeviceLike, endpoint: number, length: number) => Promise<USBInTransferResultLike | undefined>;
|
|
168
|
+
/**
|
|
169
|
+
* Bulk/interrupt OUT transfer.
|
|
170
|
+
*
|
|
171
|
+
* @returns The result, or `undefined` on failure.
|
|
172
|
+
*/
|
|
173
|
+
readonly transferOut: (device: USBDeviceLike, endpoint: number, data: BufferSource) => Promise<USBOutTransferResultLike | undefined>;
|
|
174
|
+
/**
|
|
175
|
+
* Control IN transfer.
|
|
176
|
+
*
|
|
177
|
+
* @returns The result, or `undefined` on failure.
|
|
178
|
+
*/
|
|
179
|
+
readonly controlTransferIn: (device: USBDeviceLike, setup: USBControlTransferSetup, length: number) => Promise<USBInTransferResultLike | undefined>;
|
|
180
|
+
/**
|
|
181
|
+
* Control OUT transfer.
|
|
182
|
+
*
|
|
183
|
+
* @returns The result, or `undefined` on failure.
|
|
184
|
+
*/
|
|
185
|
+
readonly controlTransferOut: (device: USBDeviceLike, setup: USBControlTransferSetup, data?: BufferSource) => Promise<USBOutTransferResultLike | undefined>;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Talk to USB devices with the WebUSB API.
|
|
189
|
+
*
|
|
190
|
+
* `devices` lists granted devices as plain snapshots and follows the host's
|
|
191
|
+
* `connect` / `disconnect` events. The device actions are thin wrappers over
|
|
192
|
+
* `USBDevice` that resolve to a boolean or the transfer result and record
|
|
193
|
+
* failures in `error` instead of rejecting. Host listeners are removed and
|
|
194
|
+
* sessions opened through `open()` are closed when the owning reactive scope
|
|
195
|
+
* stops; outside a scope call `close()` per device.
|
|
196
|
+
*
|
|
197
|
+
* Server rendering: `supported` is false and `devices` is empty.
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```ts
|
|
201
|
+
* const usb = useUSB();
|
|
202
|
+
* const device = await usb.requestDevice([{ vendorId: 0x2341 }]);
|
|
203
|
+
* if (device && (await usb.open(device))) await usb.claimInterface(device, 0);
|
|
204
|
+
* ```
|
|
205
|
+
*
|
|
206
|
+
* @param options Capability host.
|
|
207
|
+
* @default options {}
|
|
208
|
+
* @returns USB state and actions.
|
|
209
|
+
*/
|
|
210
|
+
declare function useUSB(options?: UseUSBOptions): USBControls;
|
|
211
|
+
//#endregion
|
|
212
|
+
export { USBControlTransferSetup, USBControls, USBDeviceFilter, USBDeviceInfo, USBDeviceLike, USBHost, USBInTransferResultLike, USBOutTransferResultLike, USBTransferStatus, UseUSBOptions, useUSB };
|
package/dist/use-usb.mjs
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { computed, hasInjectionContext, readonly, shallowReadonly, shallowRef, toValue, watch, watchPostEffect } from "vue";
|
|
3
|
+
//#region src/use-usb.ts
|
|
4
|
+
function browserUSBHost() {
|
|
5
|
+
if (typeof window === "undefined") return void 0;
|
|
6
|
+
const { navigator } = window;
|
|
7
|
+
const usb = "usb" in navigator ? navigator.usb : void 0;
|
|
8
|
+
return isUSBHost(usb) ? usb : void 0;
|
|
9
|
+
}
|
|
10
|
+
function isUSBHost(value) {
|
|
11
|
+
return typeof value === "object" && value !== null && "requestDevice" in value;
|
|
12
|
+
}
|
|
13
|
+
function describe(device) {
|
|
14
|
+
return {
|
|
15
|
+
device,
|
|
16
|
+
vendorId: device.vendorId,
|
|
17
|
+
productId: device.productId,
|
|
18
|
+
productName: device.productName ?? "",
|
|
19
|
+
serialNumber: device.serialNumber ?? "",
|
|
20
|
+
opened: device.opened
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Talk to USB devices with the WebUSB API.
|
|
25
|
+
*
|
|
26
|
+
* `devices` lists granted devices as plain snapshots and follows the host's
|
|
27
|
+
* `connect` / `disconnect` events. The device actions are thin wrappers over
|
|
28
|
+
* `USBDevice` that resolve to a boolean or the transfer result and record
|
|
29
|
+
* failures in `error` instead of rejecting. Host listeners are removed and
|
|
30
|
+
* sessions opened through `open()` are closed when the owning reactive scope
|
|
31
|
+
* stops; outside a scope call `close()` per device.
|
|
32
|
+
*
|
|
33
|
+
* Server rendering: `supported` is false and `devices` is empty.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const usb = useUSB();
|
|
38
|
+
* const device = await usb.requestDevice([{ vendorId: 0x2341 }]);
|
|
39
|
+
* if (device && (await usb.open(device))) await usb.claimInterface(device, 0);
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @param options Capability host.
|
|
43
|
+
* @default options {}
|
|
44
|
+
* @returns USB state and actions.
|
|
45
|
+
*/
|
|
46
|
+
function useUSB(options = {}) {
|
|
47
|
+
const devices = shallowRef([]);
|
|
48
|
+
const error = shallowRef(void 0);
|
|
49
|
+
const owned = /* @__PURE__ */ new Set();
|
|
50
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
51
|
+
if (!hydrated.value) watchPostEffect(() => {
|
|
52
|
+
hydrated.value = true;
|
|
53
|
+
});
|
|
54
|
+
const resolveHost = () => !hydrated.value ? void 0 : options.host === void 0 ? browserUSBHost() : toValue(options.host) ?? void 0;
|
|
55
|
+
const snapshot = () => {
|
|
56
|
+
devices.value = devices.value.map((entry) => describe(entry.device));
|
|
57
|
+
};
|
|
58
|
+
const attempt = async (action) => {
|
|
59
|
+
try {
|
|
60
|
+
const value = await action();
|
|
61
|
+
error.value = void 0;
|
|
62
|
+
return value;
|
|
63
|
+
} catch (cause) {
|
|
64
|
+
error.value = cause;
|
|
65
|
+
return;
|
|
66
|
+
} finally {
|
|
67
|
+
snapshot();
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const succeeded = async (action) => await attempt(() => action().then(() => true)) === true;
|
|
71
|
+
const getDevices = async () => {
|
|
72
|
+
const host = resolveHost();
|
|
73
|
+
if (!host) return devices.value;
|
|
74
|
+
try {
|
|
75
|
+
devices.value = (await host.getDevices()).map(describe);
|
|
76
|
+
} catch (cause) {
|
|
77
|
+
error.value = cause;
|
|
78
|
+
}
|
|
79
|
+
return devices.value;
|
|
80
|
+
};
|
|
81
|
+
const requestDevice = async (filters = []) => {
|
|
82
|
+
const host = resolveHost();
|
|
83
|
+
if (!host) return void 0;
|
|
84
|
+
const chosen = await attempt(() => host.requestDevice({ filters }));
|
|
85
|
+
if (chosen) await getDevices();
|
|
86
|
+
return chosen;
|
|
87
|
+
};
|
|
88
|
+
const open = async (device) => {
|
|
89
|
+
const opened = await succeeded(() => device.open());
|
|
90
|
+
if (opened) owned.add(device);
|
|
91
|
+
return opened;
|
|
92
|
+
};
|
|
93
|
+
const close = (device) => {
|
|
94
|
+
owned.delete(device);
|
|
95
|
+
return succeeded(() => device.close());
|
|
96
|
+
};
|
|
97
|
+
const onConnectionChange = () => {
|
|
98
|
+
getDevices();
|
|
99
|
+
};
|
|
100
|
+
watch(resolveHost, (host, _previous, onCleanup) => {
|
|
101
|
+
if (!host) {
|
|
102
|
+
devices.value = [];
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
host.addEventListener("connect", onConnectionChange);
|
|
106
|
+
host.addEventListener("disconnect", onConnectionChange);
|
|
107
|
+
onCleanup(() => {
|
|
108
|
+
host.removeEventListener("connect", onConnectionChange);
|
|
109
|
+
host.removeEventListener("disconnect", onConnectionChange);
|
|
110
|
+
});
|
|
111
|
+
getDevices();
|
|
112
|
+
}, {
|
|
113
|
+
immediate: true,
|
|
114
|
+
flush: "sync"
|
|
115
|
+
});
|
|
116
|
+
tryOnScopeDispose(() => {
|
|
117
|
+
for (const device of owned) if (device.opened) close(device);
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
supported: computed(() => resolveHost() !== void 0),
|
|
121
|
+
devices: shallowReadonly(devices),
|
|
122
|
+
error: readonly(error),
|
|
123
|
+
requestDevice,
|
|
124
|
+
getDevices,
|
|
125
|
+
open,
|
|
126
|
+
close,
|
|
127
|
+
selectConfiguration: (device, value) => succeeded(() => device.selectConfiguration(value)),
|
|
128
|
+
claimInterface: (device, number) => succeeded(() => device.claimInterface(number)),
|
|
129
|
+
releaseInterface: (device, number) => succeeded(() => device.releaseInterface(number)),
|
|
130
|
+
transferIn: (device, endpoint, length) => attempt(() => device.transferIn(endpoint, length)),
|
|
131
|
+
transferOut: (device, endpoint, data) => attempt(() => device.transferOut(endpoint, data)),
|
|
132
|
+
controlTransferIn: (device, setup, length) => attempt(() => device.controlTransferIn(setup, length)),
|
|
133
|
+
controlTransferOut: (device, setup, data) => attempt(() => data === void 0 ? device.controlTransferOut(setup) : device.controlTransferOut(setup, data))
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//#endregion
|
|
137
|
+
export { useUSB };
|