@vizejs/composable 0.426.3 → 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,524 @@
|
|
|
1
|
+
import { computed, inject, shallowReactive, shallowRef } from "vue";
|
|
2
|
+
import type { App, ComputedRef, InjectionKey, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { createMessageFormatter } from "./icu-message.ts";
|
|
5
|
+
import type {
|
|
6
|
+
FormatMessageOptions,
|
|
7
|
+
MessageArgument,
|
|
8
|
+
MessageArguments,
|
|
9
|
+
MessageFormatter,
|
|
10
|
+
ResolveMessageArguments,
|
|
11
|
+
} from "./icu-message.ts";
|
|
12
|
+
import { useLocale } from "./locale.ts";
|
|
13
|
+
import type { LocaleControls, TextDirection } from "./locale.ts";
|
|
14
|
+
|
|
15
|
+
/* -------------------------------------------------------------------------- */
|
|
16
|
+
/* Catalog types */
|
|
17
|
+
/* -------------------------------------------------------------------------- */
|
|
18
|
+
|
|
19
|
+
/** A nested message catalog: leaves are ICU message strings. */
|
|
20
|
+
export interface MessageTree {
|
|
21
|
+
readonly [key: string]: string | MessageTree;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Catalogs keyed by locale. */
|
|
25
|
+
export type MessageCatalogs = Readonly<Record<string, MessageTree>>;
|
|
26
|
+
|
|
27
|
+
/** Dotted message keys of one catalog, e.g. `"home.title"`. */
|
|
28
|
+
export type MessageKeysOf<Tree> = {
|
|
29
|
+
[Key in keyof Tree & string]: Tree[Key] extends string
|
|
30
|
+
? Key
|
|
31
|
+
: `${Key}.${MessageKeysOf<Tree[Key]>}`;
|
|
32
|
+
}[keyof Tree & string];
|
|
33
|
+
|
|
34
|
+
/** Message literal stored at a dotted key. */
|
|
35
|
+
export type MessageAt<Tree, Path extends string> = Path extends `${infer Head}.${infer Rest}`
|
|
36
|
+
? Head extends keyof Tree
|
|
37
|
+
? MessageAt<Tree[Head], Rest>
|
|
38
|
+
: never
|
|
39
|
+
: Path extends keyof Tree
|
|
40
|
+
? Tree[Path] extends string
|
|
41
|
+
? Tree[Path]
|
|
42
|
+
: never
|
|
43
|
+
: never;
|
|
44
|
+
|
|
45
|
+
/** Every key present in any locale of a catalog set. */
|
|
46
|
+
export type MessageKey<Catalogs> = {
|
|
47
|
+
[Locale in keyof Catalogs]: MessageKeysOf<Catalogs[Locale]>;
|
|
48
|
+
}[keyof Catalogs];
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Parameters `t(key)` needs: the arguments of every translation of `Key`,
|
|
52
|
+
* merged (a typed occurrence in any locale wins over a plain `{name}`).
|
|
53
|
+
*/
|
|
54
|
+
export type MessageParamsFor<Catalogs, Key extends string> = ResolveMessageArguments<
|
|
55
|
+
Extract<
|
|
56
|
+
{
|
|
57
|
+
[Locale in keyof Catalogs]: MessageAt<Catalogs[Locale], Key> extends infer Message extends
|
|
58
|
+
string
|
|
59
|
+
? MessageArguments<Message>
|
|
60
|
+
: never;
|
|
61
|
+
}[keyof Catalogs],
|
|
62
|
+
MessageArgument
|
|
63
|
+
>
|
|
64
|
+
>;
|
|
65
|
+
|
|
66
|
+
/** Keys whose merged parameters contain an impossible (`never`) value. */
|
|
67
|
+
type ConflictingKeys<Catalogs> = {
|
|
68
|
+
[Key in MessageKey<Catalogs> & string]: {
|
|
69
|
+
[Param in keyof MessageParamsFor<Catalogs, Key>]: [
|
|
70
|
+
MessageParamsFor<Catalogs, Key>[Param],
|
|
71
|
+
] extends [never]
|
|
72
|
+
? Param
|
|
73
|
+
: never;
|
|
74
|
+
}[keyof MessageParamsFor<Catalogs, Key>] extends never
|
|
75
|
+
? never
|
|
76
|
+
: Key;
|
|
77
|
+
}[MessageKey<Catalogs> & string];
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Compile-time validation mixed into the `defineMessages` argument. A
|
|
81
|
+
* locale that misses keys other locales define must carry a
|
|
82
|
+
* `__missingTranslations` property (which it cannot), so the compiler
|
|
83
|
+
* reports the missing keys; incompatible parameter types across locales are
|
|
84
|
+
* reported the same way through `__incompatibleParams`.
|
|
85
|
+
*/
|
|
86
|
+
export type ValidateCatalogs<Catalogs> = {
|
|
87
|
+
readonly [Locale in keyof Catalogs]: (Exclude<
|
|
88
|
+
MessageKey<Catalogs>,
|
|
89
|
+
MessageKeysOf<Catalogs[Locale]>
|
|
90
|
+
> extends infer Missing
|
|
91
|
+
? [Missing] extends [never]
|
|
92
|
+
? unknown
|
|
93
|
+
: { readonly __missingTranslations: Missing }
|
|
94
|
+
: unknown) &
|
|
95
|
+
([ConflictingKeys<Catalogs>] extends [never]
|
|
96
|
+
? unknown
|
|
97
|
+
: { readonly __incompatibleParams: ConflictingKeys<Catalogs> });
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/** Same key structure as a catalog, with any string as message. */
|
|
101
|
+
export type MessageShape<Tree> = {
|
|
102
|
+
readonly [Key in keyof Tree]: Tree[Key] extends string ? string : MessageShape<Tree[Key]>;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/** Catalog shape a lazily loaded locale must provide. */
|
|
106
|
+
export type LocaleMessages<Catalogs> = MessageShape<Catalogs[keyof Catalogs]>;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Per-key check for {@link defineLocale}: a translation may only use
|
|
110
|
+
* parameters the schema knows, with compatible types.
|
|
111
|
+
*/
|
|
112
|
+
type ValidateTranslation<Catalogs, Tree, Prefix extends string = ""> = {
|
|
113
|
+
readonly [Key in keyof Tree & string]: Tree[Key] extends infer Message extends string
|
|
114
|
+
? keyof ResolveMessageArguments<MessageArguments<Message>> extends keyof MessageParamsFor<
|
|
115
|
+
Catalogs,
|
|
116
|
+
`${Prefix}${Key}`
|
|
117
|
+
>
|
|
118
|
+
? MessageParamsFor<Catalogs, `${Prefix}${Key}`> extends ResolveMessageArguments<
|
|
119
|
+
MessageArguments<Message>
|
|
120
|
+
>
|
|
121
|
+
? Message
|
|
122
|
+
: `incompatible parameter types for "${Prefix}${Key}"`
|
|
123
|
+
: `unknown parameter in "${Prefix}${Key}"`
|
|
124
|
+
: ValidateTranslation<Catalogs, Tree[Key], `${Prefix}${Key}.`>;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/* -------------------------------------------------------------------------- */
|
|
128
|
+
/* defineMessages / defineLocale */
|
|
129
|
+
/* -------------------------------------------------------------------------- */
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Declare typed message catalogs for several locales.
|
|
133
|
+
*
|
|
134
|
+
* The literal messages are preserved, so {@link MessageParamsFor} knows the
|
|
135
|
+
* ICU parameters of every key. The compiler rejects catalogs whose locales
|
|
136
|
+
* do not share the same keys (`__missingTranslations`) or whose
|
|
137
|
+
* translations need incompatible parameter types (`__incompatibleParams`).
|
|
138
|
+
* Returns the catalogs unchanged; the function exists for inference and
|
|
139
|
+
* validation only.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```ts
|
|
143
|
+
* const messages = defineMessages({
|
|
144
|
+
* en: { cart: "{count, plural, one {# item} other {# items}}" },
|
|
145
|
+
* ja: { cart: "{count, plural, other {# 個}}" },
|
|
146
|
+
* });
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @param catalogs Messages keyed by locale, then by (nested) key.
|
|
150
|
+
* @throws `TypeError` tagged `VIZE_COMPOSE_I18N_INVALID_KEY` when a key
|
|
151
|
+
* contains a dot (dots separate nested keys).
|
|
152
|
+
* @returns The same catalogs.
|
|
153
|
+
*/
|
|
154
|
+
export function defineMessages<const Catalogs extends MessageCatalogs>(
|
|
155
|
+
catalogs: Catalogs & ValidateCatalogs<Catalogs>,
|
|
156
|
+
): Catalogs {
|
|
157
|
+
for (const tree of Object.values(catalogs)) assertKeys(tree, "");
|
|
158
|
+
return catalogs;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Declare one additional locale (typically a lazily loaded module) against
|
|
163
|
+
* the catalogs produced by {@link defineMessages}.
|
|
164
|
+
*
|
|
165
|
+
* The keys must match exactly, and every translation may only use
|
|
166
|
+
* parameters the schema declares, with compatible types.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```ts
|
|
170
|
+
* // fr.ts
|
|
171
|
+
* export default defineLocale<typeof messages>()({ cart: "{count, plural, one {# article} other {# articles}}" });
|
|
172
|
+
* ```
|
|
173
|
+
*
|
|
174
|
+
* @returns A function that validates and returns the locale catalog.
|
|
175
|
+
*/
|
|
176
|
+
export function defineLocale<Catalogs extends MessageCatalogs>(): <
|
|
177
|
+
const Tree extends LocaleMessages<Catalogs>,
|
|
178
|
+
>(
|
|
179
|
+
catalog: Tree & ValidateTranslation<Catalogs, Tree>,
|
|
180
|
+
) => Tree {
|
|
181
|
+
return (catalog) => {
|
|
182
|
+
assertKeys(catalog, "");
|
|
183
|
+
return catalog;
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function assertKeys(tree: MessageTree, prefix: string): void {
|
|
188
|
+
for (const [key, value] of Object.entries(tree)) {
|
|
189
|
+
if (key.includes(".")) {
|
|
190
|
+
throw new TypeError(
|
|
191
|
+
`[VIZE_COMPOSE_I18N_INVALID_KEY] message keys must not contain "."; received "${prefix}${key}"`,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
if (typeof value !== "string") assertKeys(value, `${prefix}${key}.`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* -------------------------------------------------------------------------- */
|
|
199
|
+
/* Runtime */
|
|
200
|
+
/* -------------------------------------------------------------------------- */
|
|
201
|
+
|
|
202
|
+
/** Loader returning the catalog of a lazily loaded locale. */
|
|
203
|
+
export type LocaleLoader<Catalogs> = () => Promise<
|
|
204
|
+
LocaleMessages<Catalogs> | { readonly default: LocaleMessages<Catalogs> }
|
|
205
|
+
>;
|
|
206
|
+
|
|
207
|
+
/** Static configuration shared by every request, passed to {@link defineI18n}. */
|
|
208
|
+
export interface DefineI18nOptions<
|
|
209
|
+
Catalogs extends MessageCatalogs,
|
|
210
|
+
Lazy extends string,
|
|
211
|
+
> extends FormatMessageOptions {
|
|
212
|
+
/** Eagerly bundled catalogs (see {@link defineMessages}). */
|
|
213
|
+
readonly messages: Catalogs;
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Locale used when a key is missing in the active locale.
|
|
217
|
+
*
|
|
218
|
+
* @default the first eager locale
|
|
219
|
+
*/
|
|
220
|
+
readonly fallbackLocale?: keyof Catalogs & string;
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Loaders for locales fetched on demand.
|
|
224
|
+
*
|
|
225
|
+
* @default {}
|
|
226
|
+
*/
|
|
227
|
+
readonly loaders?: { readonly [Locale in Lazy]: LocaleLoader<Catalogs> };
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Called when a key is missing in the active and fallback locales; the
|
|
231
|
+
* key itself is rendered.
|
|
232
|
+
*
|
|
233
|
+
* @default undefined
|
|
234
|
+
*/
|
|
235
|
+
readonly onMissing?: (key: string, locale: string) => void;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** Arguments of `t(key, …)`: the params object is optional only when empty. */
|
|
239
|
+
export type TranslateArguments<Params> = {} extends Params ? [params?: Params] : [params: Params];
|
|
240
|
+
|
|
241
|
+
/** Per-request i18n state and typed translation functions. */
|
|
242
|
+
export interface I18n<Catalogs extends MessageCatalogs, Lazy extends string> {
|
|
243
|
+
/** Active locale. Change it with {@link I18n.setLocale}. */
|
|
244
|
+
readonly locale: Readonly<ShallowRef<(keyof Catalogs & string) | Lazy>>;
|
|
245
|
+
|
|
246
|
+
/** Every locale this instance can switch to. */
|
|
247
|
+
readonly availableLocales: readonly ((keyof Catalogs & string) | Lazy)[];
|
|
248
|
+
|
|
249
|
+
/** Locales whose messages are available right now. */
|
|
250
|
+
readonly loadedLocales: ComputedRef<((keyof Catalogs & string) | Lazy)[]>;
|
|
251
|
+
|
|
252
|
+
/** Whether a lazy locale is being loaded. */
|
|
253
|
+
readonly isLoading: Readonly<ShallowRef<boolean>>;
|
|
254
|
+
|
|
255
|
+
/** Most recent loader failure, cleared on success. */
|
|
256
|
+
readonly error: Readonly<ShallowRef<unknown>>;
|
|
257
|
+
|
|
258
|
+
/** Text direction of the active locale. */
|
|
259
|
+
readonly direction: ComputedRef<TextDirection>;
|
|
260
|
+
|
|
261
|
+
/** `Intl` helpers bound to the active locale (from `useLocale`). */
|
|
262
|
+
readonly intl: LocaleControls;
|
|
263
|
+
|
|
264
|
+
/** Resolves once the initial locale's messages are loaded. */
|
|
265
|
+
readonly ready: Promise<void>;
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Translate a key. Parameters are typed from the ICU messages of every
|
|
269
|
+
* locale. Reactive: reading inside a render re-renders on locale change.
|
|
270
|
+
*
|
|
271
|
+
* @returns The formatted message, or the key when it is missing.
|
|
272
|
+
*/
|
|
273
|
+
readonly t: <Key extends MessageKey<Catalogs> & string>(
|
|
274
|
+
key: Key,
|
|
275
|
+
...params: TranslateArguments<MessageParamsFor<Catalogs, Key>>
|
|
276
|
+
) => string;
|
|
277
|
+
|
|
278
|
+
/** Whether `key` exists in the active locale. */
|
|
279
|
+
readonly te: (key: MessageKey<Catalogs> & string) => boolean;
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Load (if needed) and activate a locale.
|
|
283
|
+
*
|
|
284
|
+
* @returns Resolves once the locale is active; rejects when loading fails.
|
|
285
|
+
*/
|
|
286
|
+
readonly setLocale: (locale: (keyof Catalogs & string) | Lazy) => Promise<void>;
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Load a lazy locale without activating it (for example on hover).
|
|
290
|
+
*
|
|
291
|
+
* @returns Resolves once its messages are available.
|
|
292
|
+
*/
|
|
293
|
+
readonly loadLocale: (locale: (keyof Catalogs & string) | Lazy) => Promise<void>;
|
|
294
|
+
|
|
295
|
+
/** Vue plugin hook: provides this instance to the app. */
|
|
296
|
+
readonly install: (app: App) => void;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/** Options for {@link I18nDefinition.create}. */
|
|
300
|
+
export interface CreateI18nOptions<Locale extends string> {
|
|
301
|
+
/**
|
|
302
|
+
* Initial locale. Pass the locale resolved for the request (server) and
|
|
303
|
+
* the same value on the client so hydration renders identical text.
|
|
304
|
+
*
|
|
305
|
+
* @default the fallback locale
|
|
306
|
+
*/
|
|
307
|
+
readonly locale?: Locale;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/** Static i18n definition returned by {@link defineI18n}. */
|
|
311
|
+
export interface I18nDefinition<Catalogs extends MessageCatalogs, Lazy extends string> {
|
|
312
|
+
/** Injection key under which instances are provided. */
|
|
313
|
+
readonly key: InjectionKey<I18n<Catalogs, Lazy>>;
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Create a per-request (per-app) instance. Never share one instance
|
|
317
|
+
* between server requests.
|
|
318
|
+
*
|
|
319
|
+
* @returns The instance; await `ready` before rendering a lazy locale.
|
|
320
|
+
*/
|
|
321
|
+
readonly create: (
|
|
322
|
+
options?: CreateI18nOptions<(keyof Catalogs & string) | Lazy>,
|
|
323
|
+
) => I18n<Catalogs, Lazy>;
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Inject the instance provided by an ancestor (or `app.use(instance)`).
|
|
327
|
+
*
|
|
328
|
+
* @returns The typed instance.
|
|
329
|
+
*/
|
|
330
|
+
readonly use: () => I18n<Catalogs, Lazy>;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function readMessage(tree: MessageTree | undefined, key: string): string | undefined {
|
|
334
|
+
let node: string | MessageTree | undefined = tree;
|
|
335
|
+
for (const part of key.split(".")) {
|
|
336
|
+
if (node === undefined || typeof node === "string") return undefined;
|
|
337
|
+
node = node[part];
|
|
338
|
+
}
|
|
339
|
+
return typeof node === "string" ? node : undefined;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function unwrapModule<Tree>(loaded: Tree | { readonly default: Tree }): Tree {
|
|
343
|
+
return typeof loaded === "object" && loaded !== null && "default" in loaded
|
|
344
|
+
? loaded.default
|
|
345
|
+
: loaded;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Define the typed i18n setup of an application.
|
|
350
|
+
*
|
|
351
|
+
* The definition holds only static configuration (catalogs, loaders,
|
|
352
|
+
* formats) and an injection key; it has no mutable module state. Call
|
|
353
|
+
* `create()` per request on the server and once on the client, install the
|
|
354
|
+
* instance with `app.use(instance)`, and read it in components with
|
|
355
|
+
* `definition.use()` (or {@link useI18n}). Locale changes are reactive
|
|
356
|
+
* through `setLocale`, which loads lazy locales first; `Intl` formatting
|
|
357
|
+
* follows the locale through the existing `useLocale` composable.
|
|
358
|
+
*
|
|
359
|
+
* Hydration: locale detection is never automatic. Resolve the locale per
|
|
360
|
+
* request, pass it to `create({ locale })` on both sides, and await
|
|
361
|
+
* `instance.ready` before rendering or mounting when it is lazy.
|
|
362
|
+
* `date`/`time` arguments use a fixed time zone (UTC unless configured).
|
|
363
|
+
*
|
|
364
|
+
* @example
|
|
365
|
+
* ```ts
|
|
366
|
+
* export const appI18n = defineI18n({
|
|
367
|
+
* messages,
|
|
368
|
+
* loaders: { fr: () => import("./locales/fr.ts") },
|
|
369
|
+
* });
|
|
370
|
+
* // per request / client entry
|
|
371
|
+
* const i18n = appI18n.create({ locale: "fr" });
|
|
372
|
+
* await i18n.ready;
|
|
373
|
+
* app.use(i18n);
|
|
374
|
+
* // component
|
|
375
|
+
* const { t } = appI18n.use();
|
|
376
|
+
* t("cart", { count: 2 });
|
|
377
|
+
* ```
|
|
378
|
+
*
|
|
379
|
+
* @param options Catalogs, fallback, loaders, formats, and missing-key hook.
|
|
380
|
+
* @returns The i18n definition.
|
|
381
|
+
*/
|
|
382
|
+
export function defineI18n<
|
|
383
|
+
const Catalogs extends MessageCatalogs,
|
|
384
|
+
const Lazy extends string = never,
|
|
385
|
+
>(options: DefineI18nOptions<Catalogs, Lazy>): I18nDefinition<Catalogs, Lazy> {
|
|
386
|
+
type Locale = (keyof Catalogs & string) | Lazy;
|
|
387
|
+
const key: InjectionKey<I18n<Catalogs, Lazy>> = Symbol("vize-i18n");
|
|
388
|
+
const eager = Object.keys(options.messages);
|
|
389
|
+
const lazy: string[] = Object.keys(options.loaders ?? {});
|
|
390
|
+
const fallbackLocale = options.fallbackLocale ?? eager[0] ?? "en";
|
|
391
|
+
const isLocale = (value: string): value is Locale =>
|
|
392
|
+
eager.includes(value) || lazy.includes(value);
|
|
393
|
+
const availableLocales = [...eager, ...lazy].filter(isLocale);
|
|
394
|
+
|
|
395
|
+
const create = (createOptions: CreateI18nOptions<Locale> = {}): I18n<Catalogs, Lazy> => {
|
|
396
|
+
const initial = createOptions.locale ?? fallbackLocale;
|
|
397
|
+
if (!isLocale(initial)) {
|
|
398
|
+
throw new RangeError(
|
|
399
|
+
`[VIZE_COMPOSE_I18N_UNKNOWN_LOCALE] unknown locale "${String(initial)}"`,
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
const catalogs = shallowReactive(
|
|
403
|
+
new Map<string, MessageTree>(Object.entries(options.messages)),
|
|
404
|
+
);
|
|
405
|
+
const pending = new Map<string, Promise<void>>();
|
|
406
|
+
const formatters = new Map<string, MessageFormatter>();
|
|
407
|
+
const locale = shallowRef<Locale>(initial);
|
|
408
|
+
const isLoading = shallowRef(false);
|
|
409
|
+
const error = shallowRef<unknown>(undefined);
|
|
410
|
+
const intl = useLocale(locale, { detect: () => undefined, fallback: fallbackLocale });
|
|
411
|
+
|
|
412
|
+
const formatterFor = (localeTag: string): MessageFormatter => {
|
|
413
|
+
let formatter = formatters.get(localeTag);
|
|
414
|
+
if (formatter === undefined) {
|
|
415
|
+
formatter = createMessageFormatter(localeTag, options);
|
|
416
|
+
formatters.set(localeTag, formatter);
|
|
417
|
+
}
|
|
418
|
+
return formatter;
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
const loadLocale = (target: Locale): Promise<void> => {
|
|
422
|
+
if (catalogs.has(target)) return Promise.resolve();
|
|
423
|
+
const existing = pending.get(target);
|
|
424
|
+
if (existing !== undefined) return existing;
|
|
425
|
+
const loaders: Partial<Record<string, LocaleLoader<Catalogs>>> = options.loaders ?? {};
|
|
426
|
+
const loader = loaders[target];
|
|
427
|
+
if (loader === undefined) {
|
|
428
|
+
return Promise.reject(
|
|
429
|
+
new RangeError(`[VIZE_COMPOSE_I18N_UNKNOWN_LOCALE] unknown locale "${target}"`),
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
isLoading.value = true;
|
|
433
|
+
const task = loader()
|
|
434
|
+
.then((loaded) => {
|
|
435
|
+
assertKeys(unwrapModule(loaded), "");
|
|
436
|
+
catalogs.set(target, unwrapModule(loaded));
|
|
437
|
+
error.value = undefined;
|
|
438
|
+
})
|
|
439
|
+
.catch((cause: unknown) => {
|
|
440
|
+
error.value = cause;
|
|
441
|
+
throw cause;
|
|
442
|
+
})
|
|
443
|
+
.finally(() => {
|
|
444
|
+
pending.delete(target);
|
|
445
|
+
isLoading.value = pending.size > 0;
|
|
446
|
+
});
|
|
447
|
+
pending.set(target, task);
|
|
448
|
+
return task;
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
const setLocale = async (target: Locale): Promise<void> => {
|
|
452
|
+
await loadLocale(target);
|
|
453
|
+
locale.value = target;
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
const translate = (messageKey: string, params?: Readonly<Record<string, unknown>>): string => {
|
|
457
|
+
const active = locale.value;
|
|
458
|
+
for (const candidate of [active, fallbackLocale]) {
|
|
459
|
+
const message = readMessage(catalogs.get(candidate), messageKey);
|
|
460
|
+
if (message !== undefined) {
|
|
461
|
+
return formatterFor(candidate === active ? intl.locale.value : candidate).format(
|
|
462
|
+
message,
|
|
463
|
+
params,
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
options.onMissing?.(messageKey, active);
|
|
468
|
+
return messageKey;
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
const instance: I18n<Catalogs, Lazy> = {
|
|
472
|
+
locale,
|
|
473
|
+
availableLocales,
|
|
474
|
+
loadedLocales: computed(() => [...catalogs.keys()].filter(isLocale)),
|
|
475
|
+
isLoading,
|
|
476
|
+
error,
|
|
477
|
+
direction: intl.direction,
|
|
478
|
+
intl,
|
|
479
|
+
ready: loadLocale(initial),
|
|
480
|
+
t: (messageKey, ...params) => translate(messageKey, params[0]),
|
|
481
|
+
te: (messageKey) => readMessage(catalogs.get(locale.value), messageKey) !== undefined,
|
|
482
|
+
setLocale,
|
|
483
|
+
loadLocale,
|
|
484
|
+
install: (app) => {
|
|
485
|
+
app.provide(key, instance);
|
|
486
|
+
},
|
|
487
|
+
};
|
|
488
|
+
// The initial load's failure is also exposed through `error`.
|
|
489
|
+
instance.ready.catch(() => undefined);
|
|
490
|
+
return instance;
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
const use = (): I18n<Catalogs, Lazy> => {
|
|
494
|
+
const instance = inject(key, null);
|
|
495
|
+
if (instance === null) {
|
|
496
|
+
throw new Error(
|
|
497
|
+
"[VIZE_COMPOSE_I18N_NOT_PROVIDED] no i18n instance was provided; call app.use(definition.create())",
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
return instance;
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
return { key, create, use };
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Inject the i18n instance of a definition. Equivalent to
|
|
508
|
+
* `definition.use()`; must run inside `setup` (or `app.runWithContext`).
|
|
509
|
+
*
|
|
510
|
+
* @example
|
|
511
|
+
* ```ts
|
|
512
|
+
* const { t, setLocale } = useI18n(appI18n);
|
|
513
|
+
* ```
|
|
514
|
+
*
|
|
515
|
+
* @param definition Result of {@link defineI18n}.
|
|
516
|
+
* @throws `Error` tagged `VIZE_COMPOSE_I18N_NOT_PROVIDED` when no instance
|
|
517
|
+
* was provided.
|
|
518
|
+
* @returns The typed instance.
|
|
519
|
+
*/
|
|
520
|
+
export function useI18n<Catalogs extends MessageCatalogs, Lazy extends string>(
|
|
521
|
+
definition: I18nDefinition<Catalogs, Lazy>,
|
|
522
|
+
): I18n<Catalogs, Lazy> {
|
|
523
|
+
return definition.use();
|
|
524
|
+
}
|