From bf7d4add930ee0166e0a283afff5dd415774d25e Mon Sep 17 00:00:00 2001 From: "Michael J. Roberts" Date: Thu, 16 Jun 2022 16:22:21 +0100 Subject: [PATCH] feat(useBluetooth): new function --- package.json | 1 + packages/core/index.ts | 1 + packages/core/useBluetooth/demo.vue | 44 +++++ packages/core/useBluetooth/index.md | 109 +++++++++++ packages/core/useBluetooth/index.test.ts | 7 + packages/core/useBluetooth/index.ts | 133 +++++++++++++ pnpm-lock.yaml | 229 ++++++++++------------- tsconfig.json | 3 +- 8 files changed, 393 insertions(+), 134 deletions(-) create mode 100644 packages/core/useBluetooth/demo.vue create mode 100644 packages/core/useBluetooth/index.md create mode 100644 packages/core/useBluetooth/index.test.ts create mode 100644 packages/core/useBluetooth/index.ts diff --git a/package.json b/package.json index c7becbc9a72..b293c8549cb 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@types/prettier": "^2.6.3", "@types/semver": "^7.3.10", "@types/sharp": "^0.30.4", + "@types/web-bluetooth": "^0.0.14", "@vitest/ui": "^0.15.1", "@vue/compiler-sfc": "^3.2.37", "@vue/composition-api": "^1.6.2", diff --git a/packages/core/index.ts b/packages/core/index.ts index 29f0c2ee7c2..bebfc8af531 100644 --- a/packages/core/index.ts +++ b/packages/core/index.ts @@ -12,6 +12,7 @@ export * from './useAsyncQueue' export * from './useAsyncState' export * from './useBase64' export * from './useBattery' +export * from './useBluetooth' export * from './useBreakpoints' export * from './useBroadcastChannel' export * from './useBrowserLocation' diff --git a/packages/core/useBluetooth/demo.vue b/packages/core/useBluetooth/demo.vue new file mode 100644 index 00000000000..f1869a33e81 --- /dev/null +++ b/packages/core/useBluetooth/demo.vue @@ -0,0 +1,44 @@ + + + diff --git a/packages/core/useBluetooth/index.md b/packages/core/useBluetooth/index.md new file mode 100644 index 00000000000..6bf2d62a921 --- /dev/null +++ b/packages/core/useBluetooth/index.md @@ -0,0 +1,109 @@ +--- +category: Browser +--- + +# useBluetooth + +A reactive for working with the [Web Bluetooth API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API) which provides the ability to connect and interact with Bluetooth Low Energy peripherals. + +The Web Bluetooth API lets websites discover and communicate with devices over the Bluetooth 4 wireless standard using the Generic Attribute Profile (GATT). + +N.B. It is currently partially implemented in Android M, Chrome OS, Mac, and Windows 10. For a full overview of browser compatibility please see [Web Bluetooth API Browser Compatibility](https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API#browser_compatibility) + +N.B. There are a number of caveats to be aware of with the web bluetooth API specification. Please refer to the [Web Bluetooth W3C Draft Report](https://webbluetoothcg.github.io/web-bluetooth/) for numerous caveats around device detection and connection. + +N.B. This API is not available in Web Workers (not exposed via WorkerNavigator). + +## Usage Default + +```ts +import { useBluetooth } from '@vueuse/core' + +const { + isSupported, + isConnected, + device, + requestDevice, + server, +} = useBluetooth({ + acceptAllDevices: true, +}) +``` + +```vue + +``` + +When the device has paired and is connected, you can then work with the server object as you wish. + +## Usage Battery Level Example + +This sample illustrates the use of the Web Bluetooth API to read battery level and be notified of changes from a nearby Bluetooth Device advertising Battery information with Bluetooth Low Energy. + +Here, we use the characteristicvaluechanged event listener to handle reading battery level characteristic value. This event listener will optionally handle upcoming notifications as well. + +```ts +import { pausableWatch, useBluetooth } from '@vueuse/core' + +const { + isSupported, + isConnected, + device, + requestDevice, + server, +} = useBluetooth({ + acceptAllDevices: true, + optionalServices: [ + 'battery_service', + ], +}) + +const batteryPercent = ref() + +const isGettingBatteryLevels = ref(false) + +const getBatteryLevels = async () => { + isGettingBatteryLevels.value = true + + // Get the battery service: + const batteryService = await server.getPrimaryService('battery_service') + + // Get the current battery level + const batteryLevelCharacteristic = await batteryService.getCharacteristic( + 'battery_level', + ) + + // Listen to when characteristic value changes on `characteristicvaluechanged` event: + batteryLevelCharacteristic.addEventListener('characteristicvaluechanged', (event) => { + batteryPercent.value = event.target.value.getUint8(0) + }) + + // Convert received buffer to number: + const batteryLevel = await batteryLevelCharacteristic.readValue() + + batteryPercent.value = await batteryLevel.getUint8(0) +} + +const { stop } = pausableWatch(isConnected, (newIsConnected) => { + if (!newIsConnected || !server.value || isGettingBatteryLevels.value) + return + // Attempt to get the battery levels of the device: + getBatteryLevels() + // We only want to run this on the initial connection, as we will use a event listener to handle updates: + stop() +}) +``` + +```vue + +``` + +More samples can be found on [Google Chrome's Web Bluetooth Samples](https://googlechrome.github.io/samples/web-bluetooth/). diff --git a/packages/core/useBluetooth/index.test.ts b/packages/core/useBluetooth/index.test.ts new file mode 100644 index 00000000000..27d44f00c61 --- /dev/null +++ b/packages/core/useBluetooth/index.test.ts @@ -0,0 +1,7 @@ +import { useBluetooth } from '.' + +describe('useBluetooth', () => { + it('should be defined', () => { + expect(useBluetooth).toBeDefined() + }) +}) diff --git a/packages/core/useBluetooth/index.ts b/packages/core/useBluetooth/index.ts new file mode 100644 index 00000000000..0ff27fd5cdc --- /dev/null +++ b/packages/core/useBluetooth/index.ts @@ -0,0 +1,133 @@ +import { computed, ref, watch } from 'vue-demi' +import { tryOnMounted, tryOnScopeDispose } from '@vueuse/shared' +import type { ConfigurableNavigator } from '../_configurable' + +import { defaultNavigator } from '../_configurable' + +export interface UseBluetoothRequestDeviceOptions { + /** + * + * An array of BluetoothScanFilters. This filter consists of an array + * of BluetoothServiceUUIDs, a name parameter, and a namePrefix parameter. + * + */ + filters?: BluetoothLEScanFilter[] | undefined + /** + * + * An array of BluetoothServiceUUIDs. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/BluetoothRemoteGATTService/uuid + * + */ + optionalServices?: BluetoothServiceUUID[] | undefined +} + +export interface UseBluetoothOptions extends UseBluetoothRequestDeviceOptions, ConfigurableNavigator { + /** + * + * A boolean value indicating that the requesting script can accept all Bluetooth + * devices. The default is false. + * + * !! This may result in a bunch of unrelated devices being shown + * in the chooser and energy being wasted as there are no filters. + * + * + * Use it with caution. + * + * @default false + * + */ + acceptAllDevices?: boolean +} + +export function useBluetooth(options?: UseBluetoothOptions) { + let { + acceptAllDevices = false, + } = options || {} + + const { + filters = undefined, + optionalServices = undefined, + navigator = defaultNavigator, + } = options || {} + + const isSupported = navigator && 'bluetooth' in navigator + + const device = ref(undefined) + + const error = ref(null) + + watch(device, () => { + connectToBluetoothGATTServer() + }) + + async function requestDevice(): Promise { + // This is the function can only be called if Bluetooth API is supported: + if (!isSupported) + return + + // Reset any errors we currently have: + error.value = null + + // If filters specified, we need to ensure we don't accept all devices: + if (filters && filters.length > 0) + acceptAllDevices = false + + try { + device.value = await navigator?.bluetooth.requestDevice({ + acceptAllDevices, + filters, + optionalServices, + }) + } + catch (err) { + error.value = err + } + } + + const server = ref() + + const isConnected = computed((): boolean => { + return server.value?.connected || false + }) + + async function connectToBluetoothGATTServer() { + // Reset any errors we currently have: + error.value = null + + if (device.value && device.value.gatt) { + // Add callback to gattserverdisconnected event: + device.value.addEventListener('gattserverdisconnected', () => {}) + + try { + // Connect to the device: + server.value = await device.value.gatt.connect() + } + catch (err) { + error.value = err + } + } + } + + tryOnMounted(() => { + if (device.value) + device.value.gatt?.connect() + }) + + tryOnScopeDispose(() => { + if (device.value) + device.value.gatt?.disconnect() + }) + + return { + isSupported, + isConnected, + // Device: + device, + requestDevice, + // Server: + server, + // Errors: + error, + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba4a48f0c0c..5ada387d439 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.4 +lockfileVersion: 5.3 neverBuiltDependencies: - electron @@ -23,6 +23,7 @@ importers: '@types/prettier': ^2.6.3 '@types/semver': ^7.3.10 '@types/sharp': ^0.30.4 + '@types/web-bluetooth': ^0.0.14 '@vitest/ui': ^0.15.1 '@vue/compiler-sfc': ^3.2.37 '@vue/composition-api': ^1.6.2 @@ -75,7 +76,7 @@ importers: vue: ^3.2.37 vue2: npm:vue@^2.6.14 devDependencies: - '@antfu/eslint-config': 0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4 + '@antfu/eslint-config': 0.25.1_eslint@8.17.0+typescript@4.7.3 '@antfu/ni': 0.16.2 '@iconify/json': 2.1.62 '@rollup/plugin-json': 4.1.0_rollup@2.75.6 @@ -88,11 +89,12 @@ importers: '@types/prettier': 2.6.3 '@types/semver': 7.3.10 '@types/sharp': 0.30.4 + '@types/web-bluetooth': 0.0.14 '@vitest/ui': 0.15.1 '@vue/compiler-sfc': 3.2.37 '@vue/composition-api': 1.6.2_vue@3.2.37 '@vue/test-utils': 2.0.1_vue@3.2.37 - '@vue/theme': 1.0.2_u2gkp2u25pdfnxvdjnifvavkfu + '@vue/theme': 1.0.2_a68ca7ea9aebc656dea34b505a82aa2d axios: 0.27.2 bumpp: 8.1.0 consola: 2.15.3 @@ -123,20 +125,20 @@ importers: remove-markdown: 0.5.0 rimraf: 3.0.2 rollup: 2.75.6 - rollup-plugin-dts: 4.2.2_fgms252lqu3rk7srzpqqayl4ya + rollup-plugin-dts: 4.2.2_rollup@2.75.6+typescript@4.7.3 rollup-plugin-esbuild: 4.9.1_rollup@2.75.6 sharp: 0.30.6 simple-git: 3.7.1 simple-git-hooks: 2.8.0 typescript: 4.7.3 unocss: 0.39.0_vite@2.9.12 - unplugin-icons: 0.14.4_ejsnpqou4nfm2n5ceyopg5oln4 - unplugin-vue-components: 0.19.6_c3b6sm4px3fa2jwmzsgimzlpaq + unplugin-icons: 0.14.4_2264d7c1d4e34acd37a2261cf375cb6f + unplugin-vue-components: 0.19.6_16c3e9338fbeca0d26cccc8c86656f04 vite: 2.9.12 vite-plugin-inspect: 0.5.0_vite@2.9.12 vite-plugin-pwa: 0.12.0_vite@2.9.12 vitepress: 0.22.4 - vitest: 0.15.1_rqksfb2zouqeecq65nznjx2td4 + vitest: 0.15.1_@vitest+ui@0.15.1+jsdom@19.0.0 vue: 3.2.37 vue2: /vue/2.6.14 @@ -390,16 +392,16 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.4 - /@antfu/eslint-config-basic/0.25.1_c75vrstjak6ulzoy6wy5a4ug4i: + /@antfu/eslint-config-basic/0.25.1_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-FiOC33yoqHJCElFjSPJ9rHIjGSvJSqbYE58PgRXtJE9E4MM00vwzbA9iKILLnj27o3r3V+1sngHWlIeGaQu/iA==} peerDependencies: eslint: '>=7.4.0' dependencies: eslint: 8.17.0 - eslint-plugin-antfu: 0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4 + eslint-plugin-antfu: 0.25.1_eslint@8.17.0+typescript@4.7.3 eslint-plugin-eslint-comments: 3.2.0_eslint@8.17.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_n4dyx7lg25q5n6bft3gdtbivxa + eslint-plugin-import: 2.26.0_eslint@8.17.0 eslint-plugin-jsonc: 2.2.1_eslint@8.17.0 eslint-plugin-markdown: 2.2.1_eslint@8.17.0 eslint-plugin-n: 15.2.0_eslint@8.17.0 @@ -409,73 +411,64 @@ packages: jsonc-eslint-parser: 2.1.0 yaml-eslint-parser: 1.0.1 transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - typescript dev: true - /@antfu/eslint-config-react/0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4: + /@antfu/eslint-config-react/0.25.1_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-gLdRj4nmOk4W9ORzvkwf8kklCkSxY7ox7BKE97HYcGtaq5oAQjibYC+WPkLklj2+BQuOXcZdGbqJgx/+qHfRrw==} peerDependencies: eslint: '>=7.4.0' dependencies: - '@antfu/eslint-config-ts': 0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4 + '@antfu/eslint-config-ts': 0.25.1_eslint@8.17.0+typescript@4.7.3 eslint: 8.17.0 eslint-plugin-react: 7.30.0_eslint@8.17.0 transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - typescript dev: true - /@antfu/eslint-config-ts/0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4: + /@antfu/eslint-config-ts/0.25.1_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-bKaSOah8Qb5ND0i14x3kcpfMA5euxy/9VYVwZQ2XJgY6hkjEY1wTyC0Jw6JQvTYglEycEc2SDrtEZ0+0SKA/jg==} peerDependencies: eslint: '>=7.4.0' typescript: '>=3.9' dependencies: - '@antfu/eslint-config-basic': 0.25.1_c75vrstjak6ulzoy6wy5a4ug4i - '@typescript-eslint/eslint-plugin': 5.26.0_c75vrstjak6ulzoy6wy5a4ug4i - '@typescript-eslint/parser': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 + '@antfu/eslint-config-basic': 0.25.1_eslint@8.17.0+typescript@4.7.3 + '@typescript-eslint/eslint-plugin': 5.26.0_17fb58ca6902bd45e5d8f5b1d07286e2 + '@typescript-eslint/parser': 5.26.0_eslint@8.17.0+typescript@4.7.3 eslint: 8.17.0 typescript: 4.7.3 transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color dev: true - /@antfu/eslint-config-vue/0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4: + /@antfu/eslint-config-vue/0.25.1_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-Z9MCGYKZO50eU8YwgqBYWx+GVSOfDHxbIf6+BLxpDmrVGUuJQMqT5CIcihSRkQMeH/drQwPmQKbSSmVdjOLHrg==} peerDependencies: eslint: '>=7.4.0' dependencies: - '@antfu/eslint-config-ts': 0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4 + '@antfu/eslint-config-ts': 0.25.1_eslint@8.17.0+typescript@4.7.3 eslint: 8.17.0 eslint-plugin-vue: 9.0.1_eslint@8.17.0 transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - typescript dev: true - /@antfu/eslint-config/0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4: + /@antfu/eslint-config/0.25.1_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-CRg2LL6bh+lWWfG5TDJh3TUQTh+immu6IWkiVaJJn4jVD7jFQSewvIQUoPo7/YEPFpL2TTCCUjmT2YpmSbnedg==} peerDependencies: eslint: '>=7.4.0' dependencies: - '@antfu/eslint-config-react': 0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4 - '@antfu/eslint-config-vue': 0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4 - '@typescript-eslint/eslint-plugin': 5.26.0_c75vrstjak6ulzoy6wy5a4ug4i - '@typescript-eslint/parser': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 + '@antfu/eslint-config-react': 0.25.1_eslint@8.17.0+typescript@4.7.3 + '@antfu/eslint-config-vue': 0.25.1_eslint@8.17.0+typescript@4.7.3 + '@typescript-eslint/eslint-plugin': 5.26.0_17fb58ca6902bd45e5d8f5b1d07286e2 + '@typescript-eslint/parser': 5.26.0_eslint@8.17.0+typescript@4.7.3 eslint: 8.17.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.17.0 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.26.0_n4dyx7lg25q5n6bft3gdtbivxa + eslint-plugin-import: 2.26.0_eslint@8.17.0 eslint-plugin-jsonc: 2.2.1_eslint@8.17.0 eslint-plugin-n: 15.2.0_eslint@8.17.0 eslint-plugin-promise: 6.0.0_eslint@8.17.0 @@ -485,8 +478,6 @@ packages: jsonc-eslint-parser: 2.1.0 yaml-eslint-parser: 1.0.1 transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - typescript dev: true @@ -1846,7 +1837,7 @@ packages: resolution: {integrity: sha512-kbMawY0WRPyL/lbknBkme4CNLl+Gw+E9G4OpNeXAauqoQiNkBgpIvZYy7BRT4sNGhZbxdxXxXbruqUwDzLmvTw==} dev: true - /@firebase/analytics/0.6.18_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/analytics/0.6.18_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-FXNtYDxbs9ynPbzUVuG94BjFPOPpgJ7156660uvCBuKgoBCIVcNqKkJQQ7TH8384fqvGjbjdcgARY9jgAHbtog==} peerDependencies: '@firebase/app': 0.x @@ -1856,7 +1847,7 @@ packages: '@firebase/app': 0.6.30 '@firebase/app-types': 0.6.3 '@firebase/component': 0.5.6 - '@firebase/installations': 0.4.32_z3hxu6tufpxc3mjsqzr74ipb4a + '@firebase/installations': 0.4.32_cecf7a7a742bee2db1328663fe21e1e0 '@firebase/logger': 0.2.6 '@firebase/util': 1.3.0 tslib: 2.3.1 @@ -1870,7 +1861,7 @@ packages: resolution: {integrity: sha512-KJ+BqJbdNsx4QT/JIT1yDj5p6D+QN97iJs3GuHnORrqL+DU3RWc9nSYQsrY6Tv9jVWcOkMENXAgDT484vzsm2w==} dev: true - /@firebase/app-check/0.3.2_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/app-check/0.3.2_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-YjpsnV1xVTO1B836IKijRcDeceLgHQNJ/DWa+Vky9UHkm1Mi4qosddX8LZzldaWRTWKX7BN1MbZOLY8r7M/MZQ==} peerDependencies: '@firebase/app': 0.x @@ -1902,7 +1893,7 @@ packages: xmlhttprequest: 1.8.0 dev: true - /@firebase/auth-interop-types/0.1.6_btkbmd3h5b2xery5rhjafs7ybe: + /@firebase/auth-interop-types/0.1.6_0cd4160f67e87572471d89d202cbf809: resolution: {integrity: sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==} peerDependencies: '@firebase/app-types': 0.x @@ -1912,7 +1903,7 @@ packages: '@firebase/util': 1.3.0 dev: true - /@firebase/auth-types/0.10.3_btkbmd3h5b2xery5rhjafs7ybe: + /@firebase/auth-types/0.10.3_0cd4160f67e87572471d89d202cbf809: resolution: {integrity: sha512-zExrThRqyqGUbXOFrH/sowuh2rRtfKHp9SBVY2vOqKWdCX1Ztn682n9WLtlUDsiYVIbBcwautYWk2HyCGFv0OA==} peerDependencies: '@firebase/app-types': 0.x @@ -1922,13 +1913,13 @@ packages: '@firebase/util': 1.3.0 dev: true - /@firebase/auth/0.16.8_aozjwb6f4ndokleblc2fqhe7cu: + /@firebase/auth/0.16.8_03b29b07c5e346e52c8158b4581c9f15: resolution: {integrity: sha512-mR0UXG4LirWIfOiCWxVmvz1o23BuKGxeItQ2cCUgXLTjNtWJXdcky/356iTUsd7ZV5A78s2NHeN5tIDDG6H4rg==} peerDependencies: '@firebase/app': 0.x dependencies: '@firebase/app': 0.6.30 - '@firebase/auth-types': 0.10.3_btkbmd3h5b2xery5rhjafs7ybe + '@firebase/auth-types': 0.10.3_0cd4160f67e87572471d89d202cbf809 transitivePeerDependencies: - '@firebase/app-types' - '@firebase/util' @@ -1951,7 +1942,7 @@ packages: /@firebase/database/0.11.0_@firebase+app-types@0.6.3: resolution: {integrity: sha512-b/kwvCubr6G9coPlo48PbieBDln7ViFBHOGeVt/bt82yuv5jYZBEYAac/mtOVSxpf14aMo/tAN+Edl6SWqXApw==} dependencies: - '@firebase/auth-interop-types': 0.1.6_btkbmd3h5b2xery5rhjafs7ybe + '@firebase/auth-interop-types': 0.1.6_0cd4160f67e87572471d89d202cbf809 '@firebase/component': 0.5.6 '@firebase/database-types': 0.8.0 '@firebase/logger': 0.2.6 @@ -1962,7 +1953,7 @@ packages: - '@firebase/app-types' dev: true - /@firebase/firestore-types/2.4.0_btkbmd3h5b2xery5rhjafs7ybe: + /@firebase/firestore-types/2.4.0_0cd4160f67e87572471d89d202cbf809: resolution: {integrity: sha512-0dgwfuNP7EN6/OlK2HSNSQiQNGLGaRBH0gvgr1ngtKKJuJFuq0Z48RBMeJX9CGjV4TP9h2KaB+KrUKJ5kh1hMg==} peerDependencies: '@firebase/app-types': 0.x @@ -1972,7 +1963,7 @@ packages: '@firebase/util': 1.3.0 dev: true - /@firebase/firestore/2.4.0_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/firestore/2.4.0_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-PQ6+lWNrvh74GvFTHT4gCutFipDmtu8D1tNNawKe+/SyL6XFgeuMYgZIpKQgkTSezVDogC7EGQTJBFnewF9pOg==} engines: {node: ^8.13.0 || >=10.10.0} peerDependencies: @@ -1982,7 +1973,7 @@ packages: '@firebase/app': 0.6.30 '@firebase/app-types': 0.6.3 '@firebase/component': 0.5.6 - '@firebase/firestore-types': 2.4.0_btkbmd3h5b2xery5rhjafs7ybe + '@firebase/firestore-types': 2.4.0_0cd4160f67e87572471d89d202cbf809 '@firebase/logger': 0.2.6 '@firebase/util': 1.3.0 '@firebase/webchannel-wrapper': 0.5.1 @@ -1996,7 +1987,7 @@ packages: resolution: {integrity: sha512-3KElyO3887HNxtxNF1ytGFrNmqD+hheqjwmT3sI09FaDCuaxGbOnsXAXH2eQ049XRXw9YQpHMgYws/aUNgXVyQ==} dev: true - /@firebase/functions/0.6.15_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/functions/0.6.15_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-b7RpLwFXi0N+HgkfK8cmkarSOoBeSrc1jNdadkCacQt+vIePkKM3E9EJXF4roWSa8GwTruodpBsvH+lK9iCAKQ==} peerDependencies: '@firebase/app': 0.x @@ -2019,7 +2010,7 @@ packages: '@firebase/app-types': 0.6.3 dev: true - /@firebase/installations/0.4.32_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/installations/0.4.32_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-K4UlED1Vrhd2rFQQJih+OgEj8OTtrtH4+Izkx7ip2bhXSc+unk8ZhnF69D0kmh7zjXAqEDJrmHs9O5fI3rV6Tw==} peerDependencies: '@firebase/app': 0.x @@ -2046,7 +2037,7 @@ packages: '@firebase/app-types': 0.6.3 dev: true - /@firebase/messaging/0.8.0_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/messaging/0.8.0_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-hkFHDyVe1kMcY9KEG+prjCbvS6MtLUgVFUbbQqq7JQfiv58E07YCzRUcMrJolbNi/1QHH6Jv16DxNWjJB9+/qA==} peerDependencies: '@firebase/app': 0.x @@ -2055,7 +2046,7 @@ packages: '@firebase/app': 0.6.30 '@firebase/app-types': 0.6.3 '@firebase/component': 0.5.6 - '@firebase/installations': 0.4.32_z3hxu6tufpxc3mjsqzr74ipb4a + '@firebase/installations': 0.4.32_cecf7a7a742bee2db1328663fe21e1e0 '@firebase/messaging-types': 0.5.0_@firebase+app-types@0.6.3 '@firebase/util': 1.3.0 idb: 3.0.2 @@ -2066,7 +2057,7 @@ packages: resolution: {integrity: sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA==} dev: true - /@firebase/performance/0.4.18_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/performance/0.4.18_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-lvZW/TVDne2TyOpWbv++zjRn277HZpbjxbIPfwtnmKjVY1gJ+H77Qi1c2avVIc9hg80uGX/5tNf4pOApNDJLVg==} peerDependencies: '@firebase/app': 0.x @@ -2075,7 +2066,7 @@ packages: '@firebase/app': 0.6.30 '@firebase/app-types': 0.6.3 '@firebase/component': 0.5.6 - '@firebase/installations': 0.4.32_z3hxu6tufpxc3mjsqzr74ipb4a + '@firebase/installations': 0.4.32_cecf7a7a742bee2db1328663fe21e1e0 '@firebase/logger': 0.2.6 '@firebase/performance-types': 0.0.13 '@firebase/util': 1.3.0 @@ -2094,7 +2085,7 @@ packages: resolution: {integrity: sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA==} dev: true - /@firebase/remote-config/0.1.43_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/remote-config/0.1.43_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-laNM4MN0CfeSp7XCVNjYOC4DdV6mj0l2rzUh42x4v2wLTweCoJ/kc1i4oWMX9TI7Jw8Am5Wl71Awn1J2pVe5xA==} peerDependencies: '@firebase/app': 0.x @@ -2103,14 +2094,14 @@ packages: '@firebase/app': 0.6.30 '@firebase/app-types': 0.6.3 '@firebase/component': 0.5.6 - '@firebase/installations': 0.4.32_z3hxu6tufpxc3mjsqzr74ipb4a + '@firebase/installations': 0.4.32_cecf7a7a742bee2db1328663fe21e1e0 '@firebase/logger': 0.2.6 '@firebase/remote-config-types': 0.1.9 '@firebase/util': 1.3.0 tslib: 2.3.1 dev: true - /@firebase/storage-types/0.5.0_btkbmd3h5b2xery5rhjafs7ybe: + /@firebase/storage-types/0.5.0_0cd4160f67e87572471d89d202cbf809: resolution: {integrity: sha512-6Wv3Lu7s18hsgW7HG4BFwycTquZ3m/C8bjBoOsmPu0TD6M1GKwCzOC7qBdN7L6tRYPh8ipTj5+rPFrmhGfUVKA==} peerDependencies: '@firebase/app-types': 0.x @@ -2120,7 +2111,7 @@ packages: '@firebase/util': 1.3.0 dev: true - /@firebase/storage/0.7.0_z3hxu6tufpxc3mjsqzr74ipb4a: + /@firebase/storage/0.7.0_cecf7a7a742bee2db1328663fe21e1e0: resolution: {integrity: sha512-ebDFKJbM5HOxVtZV+RhVEBVtlWHK+Z5L3kA5uDBA2jMYcn+8NV/crozJnEE+iRsGEco6dLK5JS+Er4qtKLpH5A==} peerDependencies: '@firebase/app': 0.x @@ -2129,7 +2120,7 @@ packages: '@firebase/app': 0.6.30 '@firebase/app-types': 0.6.3 '@firebase/component': 0.5.6 - '@firebase/storage-types': 0.5.0_btkbmd3h5b2xery5rhjafs7ybe + '@firebase/storage-types': 0.5.0_0cd4160f67e87572471d89d202cbf809 '@firebase/util': 1.3.0 node-fetch: 2.6.1 tslib: 2.3.1 @@ -2380,7 +2371,7 @@ packages: resolution: {integrity: sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=} dev: true - /@rollup/plugin-babel/5.3.0_an4qjjpi7rcyhdxzdltbigqffm: + /@rollup/plugin-babel/5.3.0_@babel+core@7.17.7+rollup@2.75.6: resolution: {integrity: sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2647,7 +2638,11 @@ packages: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: true - /@typescript-eslint/eslint-plugin/5.26.0_c75vrstjak6ulzoy6wy5a4ug4i: + /@types/web-bluetooth/0.0.14: + resolution: {integrity: sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==} + dev: true + + /@typescript-eslint/eslint-plugin/5.26.0_17fb58ca6902bd45e5d8f5b1d07286e2: resolution: {integrity: sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2658,10 +2653,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 + '@typescript-eslint/parser': 5.26.0_eslint@8.17.0+typescript@4.7.3 '@typescript-eslint/scope-manager': 5.26.0 - '@typescript-eslint/type-utils': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 - '@typescript-eslint/utils': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 + '@typescript-eslint/type-utils': 5.26.0_eslint@8.17.0+typescript@4.7.3 + '@typescript-eslint/utils': 5.26.0_eslint@8.17.0+typescript@4.7.3 debug: 4.3.4 eslint: 8.17.0 functional-red-black-tree: 1.0.1 @@ -2674,7 +2669,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4: + /@typescript-eslint/parser/5.26.0_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2702,7 +2697,7 @@ packages: '@typescript-eslint/visitor-keys': 5.26.0 dev: true - /@typescript-eslint/type-utils/5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4: + /@typescript-eslint/type-utils/5.26.0_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2712,7 +2707,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 + '@typescript-eslint/utils': 5.26.0_eslint@8.17.0+typescript@4.7.3 debug: 4.3.4 eslint: 8.17.0 tsutils: 3.21.0_typescript@4.7.3 @@ -2747,7 +2742,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4: + /@typescript-eslint/utils/5.26.0_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3027,12 +3022,12 @@ packages: vue: 3.2.37 dev: true - /@vue/theme/1.0.2_u2gkp2u25pdfnxvdjnifvavkfu: + /@vue/theme/1.0.2_a68ca7ea9aebc656dea34b505a82aa2d: resolution: {integrity: sha512-jBALidvFMLgcR76UQ2foi4yD5gHn1YrigXJglZe3Rb0rm4KRVLxPeCe/CAfD42Wsm9xAfSNDUxRneQfbQpA1eg==} dependencies: '@docsearch/css': 3.0.0-alpha.42 '@docsearch/js': 3.0.0-alpha.42 - '@vueuse/core': 7.4.1_u2gkp2u25pdfnxvdjnifvavkfu + '@vueuse/core': 7.4.1_a68ca7ea9aebc656dea34b505a82aa2d body-scroll-lock: 3.1.5 normalize.css: 8.0.1 shiki: 0.9.15 @@ -3045,7 +3040,7 @@ packages: - vue dev: true - /@vueuse/core/7.4.1_u2gkp2u25pdfnxvdjnifvavkfu: + /@vueuse/core/7.4.1_a68ca7ea9aebc656dea34b505a82aa2d: resolution: {integrity: sha512-8UeLPCAieeQLXFHF1/28SIEK6ILLPb/4hp03hR+xkXF00gB/YUp0CEVcRAL9uQ8HTZa3S2T/jTISMc1ZjilM0A==} peerDependencies: '@vue/composition-api': ^1.1.0 @@ -3057,12 +3052,12 @@ packages: optional: true dependencies: '@vue/composition-api': 1.6.2_vue@3.2.37 - '@vueuse/shared': 7.4.1_u2gkp2u25pdfnxvdjnifvavkfu + '@vueuse/shared': 7.4.1_a68ca7ea9aebc656dea34b505a82aa2d vue: 3.2.37 - vue-demi: 0.13.0_u2gkp2u25pdfnxvdjnifvavkfu + vue-demi: 0.13.0_a68ca7ea9aebc656dea34b505a82aa2d dev: true - /@vueuse/shared/7.4.1_u2gkp2u25pdfnxvdjnifvavkfu: + /@vueuse/shared/7.4.1_a68ca7ea9aebc656dea34b505a82aa2d: resolution: {integrity: sha512-Pzb7XoHIcgPwwBJ5Ow9lZb0HTDyaLDV3pgxKauPGTMN9qvEylG06kUG+VTjJXkPsRtiGu46di8XyFeMw2dongA==} peerDependencies: '@vue/composition-api': ^1.1.0 @@ -3075,7 +3070,7 @@ packages: dependencies: '@vue/composition-api': 1.6.2_vue@3.2.37 vue: 3.2.37 - vue-demi: 0.13.0_u2gkp2u25pdfnxvdjnifvavkfu + vue-demi: 0.13.0_a68ca7ea9aebc656dea34b505a82aa2d dev: true /@xmldom/xmldom/0.7.5: @@ -3954,22 +3949,12 @@ packages: /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true dependencies: ms: 2.0.0 dev: true /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true dependencies: ms: 2.1.3 dev: true @@ -4751,40 +4736,20 @@ packages: dependencies: debug: 3.2.7 resolve: 1.22.0 - transitivePeerDependencies: - - supports-color dev: true - /eslint-module-utils/2.7.3_zhgf6mw2wzy6dnrak3ta47vb3m: + /eslint-module-utils/2.7.3: resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true dependencies: - '@typescript-eslint/parser': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 debug: 3.2.7 - eslint-import-resolver-node: 0.3.6 find-up: 2.1.0 - transitivePeerDependencies: - - supports-color dev: true - /eslint-plugin-antfu/0.25.1_ud6rd4xtew5bv4yhvkvu24pzm4: + /eslint-plugin-antfu/0.25.1_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-xZrk0BIHZFfrUkr2Ff1uZdnzTmCM6ZQccOxpn7/IKfUENe16sSMuZ8YHKaVrUSAMIPoUOFKG2Qpu2UxwIRTd9w==} dependencies: - '@typescript-eslint/utils': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 + '@typescript-eslint/utils': 5.26.0_eslint@8.17.0+typescript@4.7.3 transitivePeerDependencies: - eslint - supports-color @@ -4819,24 +4784,19 @@ packages: htmlparser2: 7.2.0 dev: true - /eslint-plugin-import/2.26.0_n4dyx7lg25q5n6bft3gdtbivxa: + /eslint-plugin-import/2.26.0_eslint@8.17.0: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: - '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true dependencies: - '@typescript-eslint/parser': 5.26.0_ud6rd4xtew5bv4yhvkvu24pzm4 array-includes: 3.1.5 array.prototype.flat: 1.2.5 debug: 2.6.9 doctrine: 2.1.0 eslint: 8.17.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_zhgf6mw2wzy6dnrak3ta47vb3m + eslint-module-utils: 2.7.3 has: 1.0.3 is-core-module: 2.8.1 is-glob: 4.0.3 @@ -4844,10 +4804,6 @@ packages: object.values: 1.1.5 resolve: 1.22.0 tsconfig-paths: 3.14.1 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color dev: true /eslint-plugin-jsonc/2.2.1_eslint@8.17.0: @@ -5189,6 +5145,7 @@ packages: terser: 5.10.0 yargs: 17.3.1 transitivePeerDependencies: + - acorn - supports-color dev: true @@ -5331,20 +5288,20 @@ packages: resolution: {integrity: sha512-GCABTbJdo88QgzX5OH/vsfKBWvTRbLUylGlYXtO7uYo1VErfGd2BWW9ATlJP5Gxx+ClDfyvVTvcs2rcNWn3uUA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: - '@firebase/analytics': 0.6.18_z3hxu6tufpxc3mjsqzr74ipb4a + '@firebase/analytics': 0.6.18_cecf7a7a742bee2db1328663fe21e1e0 '@firebase/app': 0.6.30 - '@firebase/app-check': 0.3.2_z3hxu6tufpxc3mjsqzr74ipb4a + '@firebase/app-check': 0.3.2_cecf7a7a742bee2db1328663fe21e1e0 '@firebase/app-types': 0.6.3 - '@firebase/auth': 0.16.8_aozjwb6f4ndokleblc2fqhe7cu + '@firebase/auth': 0.16.8_03b29b07c5e346e52c8158b4581c9f15 '@firebase/database': 0.11.0_@firebase+app-types@0.6.3 - '@firebase/firestore': 2.4.0_z3hxu6tufpxc3mjsqzr74ipb4a - '@firebase/functions': 0.6.15_z3hxu6tufpxc3mjsqzr74ipb4a - '@firebase/installations': 0.4.32_z3hxu6tufpxc3mjsqzr74ipb4a - '@firebase/messaging': 0.8.0_z3hxu6tufpxc3mjsqzr74ipb4a - '@firebase/performance': 0.4.18_z3hxu6tufpxc3mjsqzr74ipb4a + '@firebase/firestore': 2.4.0_cecf7a7a742bee2db1328663fe21e1e0 + '@firebase/functions': 0.6.15_cecf7a7a742bee2db1328663fe21e1e0 + '@firebase/installations': 0.4.32_cecf7a7a742bee2db1328663fe21e1e0 + '@firebase/messaging': 0.8.0_cecf7a7a742bee2db1328663fe21e1e0 + '@firebase/performance': 0.4.18_cecf7a7a742bee2db1328663fe21e1e0 '@firebase/polyfill': 0.3.36 - '@firebase/remote-config': 0.1.43_z3hxu6tufpxc3mjsqzr74ipb4a - '@firebase/storage': 0.7.0_z3hxu6tufpxc3mjsqzr74ipb4a + '@firebase/remote-config': 0.1.43_cecf7a7a742bee2db1328663fe21e1e0 + '@firebase/storage': 0.7.0_cecf7a7a742bee2db1328663fe21e1e0 '@firebase/util': 1.3.0 dev: true @@ -7740,7 +7697,7 @@ packages: dev: true optional: true - /rollup-plugin-dts/4.2.2_fgms252lqu3rk7srzpqqayl4ya: + /rollup-plugin-dts/4.2.2_rollup@2.75.6+typescript@4.7.3: resolution: {integrity: sha512-A3g6Rogyko/PXeKoUlkjxkP++8UDVpgA7C+Tdl77Xj4fgEaIjPSnxRmR53EzvoYy97VMVwLAOcWJudaVAuxneQ==} engines: {node: '>=v12.22.11'} peerDependencies: @@ -7781,6 +7738,8 @@ packages: rollup: 2.75.6 serialize-javascript: 4.0.0 terser: 5.10.0 + transitivePeerDependencies: + - acorn dev: true /rollup/2.75.6: @@ -8412,6 +8371,8 @@ packages: resolution: {integrity: sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==} engines: {node: '>=10'} hasBin: true + peerDependencies: + acorn: ^8.5.0 peerDependenciesMeta: acorn: optional: true @@ -8761,7 +8722,7 @@ packages: - vite dev: true - /unplugin-icons/0.14.4_ejsnpqou4nfm2n5ceyopg5oln4: + /unplugin-icons/0.14.4_2264d7c1d4e34acd37a2261cf375cb6f: resolution: {integrity: sha512-+5+U5MV/d1HU3rW9bHqPLCC+rikt6OCXwjW9gSbryE2qyezzOyJ7ZNnwWLksxf5A+cVj1D6pcAbpmSjojN8zCg==} peerDependencies: '@svgr/core': '>=5.5.0' @@ -8794,7 +8755,7 @@ packages: - webpack dev: true - /unplugin-vue-components/0.19.6_c3b6sm4px3fa2jwmzsgimzlpaq: + /unplugin-vue-components/0.19.6_16c3e9338fbeca0d26cccc8c86656f04: resolution: {integrity: sha512-APvrJ9Hpid1MLT0G4PWerMJgARhNw6dzz0pcCwCxaO2DR7VyvDacMqjOQNC6ukq7FSw3wzD8VH+9i3EFXwkGmw==} engines: {node: '>=14'} peerDependencies: @@ -9014,6 +8975,7 @@ packages: workbox-window: 6.5.3 transitivePeerDependencies: - '@types/babel__core' + - acorn - supports-color dev: true @@ -9061,7 +9023,7 @@ packages: - stylus dev: true - /vitest/0.15.1_rqksfb2zouqeecq65nznjx2td4: + /vitest/0.15.1_@vitest+ui@0.15.1+jsdom@19.0.0: resolution: {integrity: sha512-NaNFi93JKSuvV4YGnfQ0l0GKYxH0EsLcTrrXaCzd6qfVEZM/RJpjwSevg6waNFqu2DyN6e0aHHdrCZW5/vh5NA==} engines: {node: '>=v14.16.0'} hasBin: true @@ -9119,7 +9081,7 @@ packages: optional: true dev: false - /vue-demi/0.13.0_u2gkp2u25pdfnxvdjnifvavkfu: + /vue-demi/0.13.0_a68ca7ea9aebc656dea34b505a82aa2d: resolution: {integrity: sha512-pu9R4Nydj+LMcKkIL1cnP1L2anJBTmVZzVWSdy5P1rkSRs9fxGCFrZmXdPTEsN37m5JtBVBSYKPk6xnORfjUsQ==} engines: {node: '>=12'} hasBin: true @@ -9326,7 +9288,7 @@ packages: '@babel/core': 7.17.7 '@babel/preset-env': 7.16.5_@babel+core@7.17.7 '@babel/runtime': 7.16.5 - '@rollup/plugin-babel': 5.3.0_an4qjjpi7rcyhdxzdltbigqffm + '@rollup/plugin-babel': 5.3.0_@babel+core@7.17.7+rollup@2.75.6 '@rollup/plugin-node-resolve': 11.2.1_rollup@2.75.6 '@rollup/plugin-replace': 2.4.2_rollup@2.75.6 '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -9361,6 +9323,7 @@ packages: workbox-window: 6.5.3 transitivePeerDependencies: - '@types/babel__core' + - acorn - supports-color dev: true diff --git a/tsconfig.json b/tsconfig.json index 7bb50fe71cf..6dc88aa399b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,7 +28,8 @@ }, "types": [ "vitest", - "vitest/globals" + "vitest/globals", + "@types/web-bluetooth" ] }, "include": [