Sfoglia il codice sorgente

@uppy/vue: migrate to Composition API with TS & drop Vue 2 support (#5043)

Merlijn Vos 1 anno fa
parent
commit
1f8ecd72cb

+ 6 - 0
.eslintrc.js

@@ -519,5 +519,11 @@ module.exports = {
         'no-unused-expressions': 'off',
       },
     },
+    {
+      files: ["packages/@uppy/vue/**"],
+      rules: {
+        'react-hooks/rules-of-hooks': 'off',
+      },
+    },
   ],
 }

+ 1 - 0
e2e/tsconfig.json

@@ -1,5 +1,6 @@
 {
   "compilerOptions": {
+    "module": "NodeNext",
     "moduleResolution": "NodeNext",
     "noEmit": true,
     "target": "es2020",

+ 0 - 24
examples/vue/.gitignore

@@ -1,24 +0,0 @@
-.DS_Store
-node_modules
-/dist
-/public
-
-
-# local env files
-.env.local
-.env.*.local
-
-# Log files
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-
-# Editor directories and files
-.idea
-.vscode
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?

+ 0 - 12
examples/vue/README.md

@@ -1,12 +0,0 @@
-# Vue 2 example
-
-You’re browsing the documentation for Vue v2.x and earlier. Check out
-[Vue 3 example](../vue3/) for new projects.
-
-To run the example, from the root directory of this repo, run the following commands:
-
-```sh
-corepack yarn install
-corepack yarn build
-corepack yarn workspace @uppy-example/vue2 dev
-```

+ 0 - 13
examples/vue/index.html

@@ -1,13 +0,0 @@
-<!doctype html>
-<html lang="en">
-  <head>
-    <meta charset="UTF-8" />
-    <link rel="icon" href="/favicon.ico" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Vite App</title>
-  </head>
-  <body>
-    <div id="app"></div>
-    <script type="module" src="/src/main.js"></script>
-  </body>
-</html>

+ 0 - 24
examples/vue/package.json

@@ -1,24 +0,0 @@
-{
-  "name": "@uppy-example/vue2",
-  "version": "0.0.0",
-  "private": true,
-  "scripts": {
-    "dev": "vite",
-    "build": "vite build",
-    "preview": "vite preview --port 5050"
-  },
-  "dependencies": {
-    "@uppy/core": "workspace:*",
-    "@uppy/dashboard": "workspace:*",
-    "@uppy/drag-drop": "workspace:*",
-    "@uppy/progress-bar": "workspace:*",
-    "@uppy/transloadit": "workspace:*",
-    "@uppy/vue": "workspace:*",
-    "vue": "^2.6.14"
-  },
-  "devDependencies": {
-    "vite": "^5.0.0",
-    "vite-plugin-vue2": "^2.0.1",
-    "vue-template-compiler": "^2.6.14"
-  }
-}

+ 0 - 111
examples/vue/src/App.vue

@@ -1,111 +0,0 @@
-<template>
-  <div id="app">
-    <h1>Welcome to Uppy Vue Demo!</h1>
-    <h2>Inline Dashboard</h2>
-    <label>
-      <input
-        type="checkbox"
-        :checked="showInlineDashboard"
-        @change="
-          (event) => {
-            showInlineDashboard = event.target.checked
-          }
-        "
-      />
-      Show Dashboard
-    </label>
-    <dashboard
-      v-if="showInlineDashboard"
-      :uppy="uppy"
-      :props="{
-        metaFields: [{ id: 'name', name: 'Name', placeholder: 'File name' }],
-      }"
-    />
-    <h2>Modal Dashboard</h2>
-    <div>
-      <button @click="open = true">Show Dashboard</button>
-      <dashboard-modal
-        :uppy="uppy2"
-        :open="open"
-        :props="{
-          onRequestCloseModal: handleClose,
-        }"
-      />
-    </div>
-
-    <h2>Drag Drop Area</h2>
-    <drag-drop
-      :uppy="uppy"
-      :props="{
-        locale: {
-          strings: {
-            chooseFile: 'Boop a file',
-            orDragDrop: 'or yoink it here',
-          },
-        },
-      }"
-    />
-
-    <h2>Progress Bar</h2>
-    <progress-bar
-      :uppy="uppy"
-      :props="{
-        hideAfterFinish: false,
-      }"
-    />
-  </div>
-</template>
-
-<script>
-// import HelloWorld from './components/HelloWorld.vue'
-import Vue from 'vue'
-import Uppy from '@uppy/core'
-import Tus from '@uppy/tus'
-import { Dashboard, DashboardModal, DragDrop, ProgressBar } from '@uppy/vue'
-
-export default {
-  name: 'App',
-  components: {
-    Dashboard,
-    DashboardModal,
-    DragDrop,
-    ProgressBar,
-  },
-  computed: {
-    uppy: () =>
-      new Uppy({ id: 'uppy1', autoProceed: true, debug: true }).use(Tus, {
-        endpoint: 'https://tusd.tusdemo.net/files/',
-      }),
-    uppy2: () =>
-      new Uppy({ id: 'uppy2', autoProceed: false, debug: true }).use(Tus, {
-        endpoint: 'https://tusd.tusdemo.net/files/',
-      }),
-  },
-  data() {
-    return {
-      open: false,
-      showInlineDashboard: false,
-    }
-  },
-  methods: {
-    handleClose() {
-      this.open = false
-    },
-  },
-}
-</script>
-<style src="@uppy/core/dist/style.css"></style>
-<style src="@uppy/dashboard/dist/style.css"></style>
-<style src="@uppy/drag-drop/dist/style.css"></style>
-<style src="@uppy/progress-bar/dist/style.css"></style>
-
-<style>
-#app {
-  font-family: Avenir, Helvetica, Arial, sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  text-align: center;
-  color: #2c3e50;
-  margin-top: 60px;
-}
-</style>

+ 0 - 8
examples/vue/src/main.js

@@ -1,8 +0,0 @@
-import Vue from 'vue'
-import App from './App.vue'
-
-Vue.config.productionTip = false
-
-new Vue({
-  render: h => h(App),
-}).$mount('#app')

+ 0 - 7
examples/vue/vite.config.js

@@ -1,7 +0,0 @@
-import { defineConfig } from 'vite'
-import { createVuePlugin } from 'vite-plugin-vue2'
-
-// https://vitejs.dev/config/
-export default defineConfig({
-  plugins: [createVuePlugin()],
-})

+ 1 - 0
examples/vue3/package.json

@@ -14,6 +14,7 @@
     "@uppy/progress-bar": "workspace:*",
     "@uppy/tus": "workspace:*",
     "@uppy/vue": "workspace:*",
+    "@uppy/webcam": "workspace:*",
     "vue": "^3.2.33"
   },
   "devDependencies": {

+ 15 - 10
examples/vue3/src/App.vue

@@ -1,7 +1,3 @@
-<script setup>
-import { Dashboard, DashboardModal, DragDrop, ProgressBar } from '@uppy/vue'
-</script>
-
 <template>
   <div id="app">
     <!-- <HelloWorld msg="Welcome to Uppy Vue Demo"/> -->
@@ -61,9 +57,14 @@ import { Dashboard, DashboardModal, DragDrop, ProgressBar } from '@uppy/vue'
   </div>
 </template>
 
+<script setup>
+import { Dashboard, DashboardModal, DragDrop, ProgressBar } from '@uppy/vue'
+</script>
+
 <script>
 import Uppy from '@uppy/core'
 import Tus from '@uppy/tus'
+import Webcam from '@uppy/webcam'
 import { defineComponent } from 'vue'
 
 const { VITE_TUS_ENDPOINT: TUS_ENDPOINT } = import.meta.env
@@ -71,13 +72,17 @@ const { VITE_TUS_ENDPOINT: TUS_ENDPOINT } = import.meta.env
 export default defineComponent({
   computed: {
     uppy: () =>
-      new Uppy({ id: 'uppy1', autoProceed: true, debug: true }).use(Tus, {
-        endpoint: TUS_ENDPOINT,
-      }),
+      new Uppy({ id: 'uppy1', autoProceed: true, debug: true })
+        .use(Tus, {
+          endpoint: TUS_ENDPOINT,
+        })
+        .use(Webcam),
     uppy2: () =>
-      new Uppy({ id: 'uppy2', autoProceed: false, debug: true }).use(Tus, {
-        endpoint: TUS_ENDPOINT,
-      }),
+      new Uppy({ id: 'uppy2', autoProceed: false, debug: true })
+        .use(Tus, {
+          endpoint: TUS_ENDPOINT,
+        })
+        .use(Webcam),
   },
   data() {
     return {

+ 1 - 0
packages/@uppy/file-input/src/index.ts

@@ -1 +1,2 @@
 export { default } from './FileInput.tsx'
+export type { FileInputOptions } from './FileInput.tsx'

+ 1 - 1
packages/@uppy/vue/.npmignore

@@ -1 +1 @@
-# This file need to be there so .gitignored files are still uploaded to the npm registry.
+tsconfig.*

+ 3 - 2
packages/@uppy/vue/package.json

@@ -2,12 +2,13 @@
   "name": "@uppy/vue",
   "version": "1.1.2",
   "license": "MIT",
+  "type": "module",
   "main": "lib/index.js",
   "dependencies": {
     "shallow-equal": "^1.2.1"
   },
   "devDependencies": {
-    "vue": "^2.6.14"
+    "vue": "^3.4.21"
   },
   "peerDependencies": {
     "@uppy/core": "workspace:^",
@@ -16,7 +17,7 @@
     "@uppy/file-input": "workspace:^",
     "@uppy/progress-bar": "workspace:^",
     "@uppy/status-bar": "workspace:^",
-    "vue": ">=2.6.11"
+    "vue": ">=3.0.0"
   },
   "peerDependenciesMeta": {
     "@uppy/dashboard": {

+ 0 - 92
packages/@uppy/vue/src/dashboard-modal.js

@@ -1,92 +0,0 @@
-import DashboardPlugin from '@uppy/dashboard'
-import { shallowEqualObjects } from 'shallow-equal'
-
-import * as Vue from 'vue'
-import { isVue2 } from './utils.js'
-
-export default {
-  data () {
-    return {
-      plugin: {},
-    }
-  },
-  props: {
-    uppy: {
-      required: true,
-    },
-    props: {
-      type: Object,
-    },
-    plugins: {
-      type: Array,
-    },
-    open: {
-      type: Boolean,
-      required: true,
-    },
-  },
-  mounted () {
-    this.installPlugin()
-  },
-  methods: {
-    installPlugin () {
-      const { uppy } = this
-      const options = {
-        id: 'vue:DashboardModal',
-        plugins: this.plugins,
-        ...this.props,
-        target: this.$refs.container,
-      }
-      uppy.use(DashboardPlugin, options)
-      this.plugin = uppy.getPlugin(options.id)
-      if (this.open) {
-        this.plugin.openModal()
-      }
-    },
-    uninstallPlugin (uppy) {
-      uppy.removePlugin(this.plugin)
-    },
-  },
-  beforeDestroy () {
-    this.uninstallPlugin(this.uppy)
-  },
-  beforeUnmount () {
-    this.uninstallPlugin(this.uppy)
-  },
-  watch: {
-    uppy (current, old) {
-      if (old !== current) {
-        this.uninstallPlugin(old)
-        this.installPlugin()
-      }
-    },
-    open (current, old) {
-      if (current && !old) {
-        this.plugin.openModal()
-      }
-      if (!current && old) {
-        this.plugin.closeModal()
-      }
-    },
-    props (current, old) {
-      if (!shallowEqualObjects(current, old)) {
-        this.plugin.setOptions({ ...current })
-      }
-    },
-  },
-  render (...args) {
-    // Hack to allow support for Vue 2 and 3
-    if (isVue2(...args)) {
-      // If it's first argument is a function, then it's a Vue 2 App
-      const [createElement] = args
-      return createElement('div', {
-        ref: 'container',
-      })
-    }
-
-    // Otherwise, we use the `h` function from the Vue package (in Vue 3 fashion)
-    return Vue.h('div', {
-      ref: 'container',
-    })
-  },
-}

+ 62 - 0
packages/@uppy/vue/src/dashboard-modal.ts

@@ -0,0 +1,62 @@
+import { defineComponent, ref, watch, h, type PropType } from 'vue'
+import DashboardPlugin, { type DashboardOptions } from '@uppy/dashboard'
+import { Uppy } from '@uppy/core'
+import type { Meta, Body } from '../../utils/src/UppyFile'
+import useUppy from './useUppy'
+
+type DashboardModalOptions<M extends Meta, B extends Body> = Omit<
+  DashboardOptions<M, B> & { inline: false },
+  'inline'
+>
+
+export default defineComponent({
+  name: 'DashboardModal',
+  props: {
+    uppy: {
+      type: Uppy<any, any>,
+      required: true,
+    },
+    props: {
+      type: Object as PropType<DashboardModalOptions<any, any>>,
+    },
+    open: {
+      type: Boolean,
+      required: true,
+    },
+  },
+  setup(props) {
+    const containerRef = ref<string>()
+    const pluginRef = ref<DashboardPlugin<any, any>>()
+    const propsRef = ref(props)
+    const onMount = () => {
+      const { uppy } = props
+      const options = {
+        id: 'DashboardModal',
+        inline: false,
+        ...props,
+        target: containerRef.value,
+      }
+      uppy.use(DashboardPlugin, options)
+      pluginRef.value = uppy.getPlugin(options.id) as DashboardPlugin<any, any>
+    }
+
+    useUppy(onMount, pluginRef, props.uppy, propsRef)
+
+    watch(
+      () => props.open,
+      (current, old) => {
+        if (current && !old) {
+          pluginRef.value!.openModal()
+        }
+        if (!current && old) {
+          pluginRef.value!.closeModal()
+        }
+      },
+    )
+
+    return () =>
+      h('div', {
+        ref: containerRef,
+      })
+  },
+})

+ 0 - 79
packages/@uppy/vue/src/dashboard.js

@@ -1,79 +0,0 @@
-import DashboardPlugin from '@uppy/dashboard'
-import { shallowEqualObjects } from 'shallow-equal'
-
-// Cross compatibility dependencies
-import * as Vue from 'vue'
-import { isVue2 } from './utils.js'
-
-export default {
-  data () {
-    return {
-      plugin: {},
-    }
-  },
-  props: {
-    uppy: {
-      required: true,
-    },
-    props: {
-      type: Object,
-    },
-    plugins: {
-      type: Array,
-    },
-  },
-  mounted () {
-    this.installPlugin()
-  },
-  methods: {
-    installPlugin () {
-      const { uppy } = this
-      const options = {
-        id: 'vue:Dashboard',
-        inline: true,
-        plugins: this.plugins,
-        ...this.props,
-        target: this.$refs.container,
-      }
-      uppy.use(DashboardPlugin, options)
-      this.plugin = uppy.getPlugin(options.id)
-    },
-    uninstallPlugin (uppy) {
-      uppy.removePlugin(this.plugin)
-    },
-  },
-  beforeDestroy () {
-    this.uninstallPlugin(this.uppy)
-  },
-  beforeUnmount () {
-    this.uninstallPlugin(this.uppy)
-  },
-  watch: {
-    uppy (current, old) {
-      if (old !== current) {
-        this.uninstallPlugin(old)
-        this.installPlugin()
-      }
-    },
-    props (current, old) {
-      if (!shallowEqualObjects(current, old)) {
-        this.plugin.setOptions({ ...current })
-      }
-    },
-  },
-  render (...args) {
-    // Hack to allow support for Vue 2 and 3
-    if (isVue2(...args)) {
-      // If it's first argument is a function, then it's a Vue 2 App
-      const [createElement] = args
-      return createElement('div', {
-        ref: 'container',
-      })
-    }
-
-    // Otherwise, we use the `h` function from the Vue package (in Vue 3 fashion)
-    return Vue.h('div', {
-      ref: 'container',
-    })
-  },
-}

+ 46 - 0
packages/@uppy/vue/src/dashboard.ts

@@ -0,0 +1,46 @@
+import { defineComponent, ref, h, type PropType } from 'vue'
+import DashboardPlugin, { type DashboardOptions } from '@uppy/dashboard'
+import type { Uppy } from '@uppy/core'
+import type { Meta, Body } from '../../utils/src/UppyFile'
+import useUppy from './useUppy'
+
+type DashboardInlineOptions<M extends Meta, B extends Body> = Omit<
+  DashboardOptions<M, B> & { inline: true },
+  'inline'
+>
+
+export default defineComponent({
+  name: 'Dashboard',
+  props: {
+    uppy: {
+      type: Object as PropType<Uppy<any, any>>,
+      required: true,
+    },
+    props: {
+      type: Object as PropType<DashboardInlineOptions<any, any>>,
+    },
+  },
+  setup(props) {
+    const containerRef = ref<string>()
+    const pluginRef = ref<DashboardPlugin<any, any>>()
+    const propsRef = ref(props.props)
+    const onMount = () => {
+      const { uppy } = props
+      const options = {
+        id: 'Dashboard',
+        inline: true,
+        ...props,
+        target: containerRef.value,
+      }
+      uppy.use(DashboardPlugin, options)
+      pluginRef.value = uppy.getPlugin(options.id) as DashboardPlugin<any, any>
+    }
+
+    useUppy(onMount, pluginRef, props.uppy, propsRef)
+
+    return () =>
+      h('div', {
+        ref: containerRef,
+      })
+  },
+})

+ 0 - 74
packages/@uppy/vue/src/drag-drop.js

@@ -1,74 +0,0 @@
-import DragDropPlugin from '@uppy/drag-drop'
-import { shallowEqualObjects } from 'shallow-equal'
-
-// Cross compatibility dependencies
-import * as Vue from 'vue'
-import { isVue2 } from './utils.js'
-
-export default {
-  data () {
-    return {
-      plugin: {},
-    }
-  },
-  props: {
-    uppy: {
-      required: true,
-    },
-    props: {
-      type: Object,
-    },
-  },
-  mounted () {
-    this.installPlugin()
-  },
-  methods: {
-    installPlugin () {
-      const { uppy } = this
-      const options = {
-        id: 'vue:DragDrop',
-        ...this.props,
-        target: this.$refs.container,
-      }
-      uppy.use(DragDropPlugin, options)
-      this.plugin = uppy.getPlugin(options.id)
-    },
-    uninstallPlugin (uppy) {
-      uppy.removePlugin(this.plugin)
-    },
-  },
-  beforeDestroy () {
-    this.uninstallPlugin(this.uppy)
-  },
-  beforeUnmount () {
-    this.uninstallPlugin(this.uppy)
-  },
-  watch: {
-    uppy (current, old) {
-      if (old !== current) {
-        this.uninstallPlugin(old)
-        this.installPlugin()
-      }
-    },
-    props (current, old) {
-      if (!shallowEqualObjects(current, old)) {
-        this.plugin.setOptions({ ...current })
-      }
-    },
-  },
-  render (...args) {
-    // Hack to allow support for Vue 2 and 3
-    if (isVue2(...args)) {
-      // If it's first argument is a function, then it's a Vue 2 App
-      const [createElement] = args
-      return createElement('div', {
-        ref: 'container',
-      })
-    }
-
-    // Otherwise, we import the `h` function from the Vue package (in Vue 3 fashion)
-    return Vue.h('div', {
-      ref: 'container',
-    })
-  },
-}

+ 39 - 0
packages/@uppy/vue/src/drag-drop.ts

@@ -0,0 +1,39 @@
+import { defineComponent, ref, h, type PropType } from 'vue'
+import DragDropPlugin, { type DragDropOptions } from '@uppy/drag-drop'
+import { Uppy } from '@uppy/core'
+import useUppy from './useUppy'
+
+export default defineComponent({
+  name: 'DragDrop',
+  props: {
+    uppy: {
+      type: Uppy<any, any>,
+      required: true,
+    },
+    props: {
+      type: Object as PropType<DragDropOptions>,
+    },
+  },
+  setup(props) {
+    const containerRef = ref<string>()
+    const pluginRef = ref<DragDropPlugin<any, any>>()
+    const propsRef = ref(props.props)
+    const onMount = () => {
+      const { uppy } = props
+      const options = {
+        id: 'DragDrop',
+        ...props,
+        target: containerRef.value,
+      }
+      uppy.use(DragDropPlugin, options)
+      pluginRef.value = uppy.getPlugin(options.id) as DragDropPlugin<any, any>
+    }
+
+    useUppy(onMount, pluginRef, props.uppy, propsRef)
+
+    return () =>
+      h('div', {
+        ref: containerRef,
+      })
+  },
+})

+ 0 - 74
packages/@uppy/vue/src/file-input.js

@@ -1,74 +0,0 @@
-import FileInputPlugin from '@uppy/file-input'
-import { shallowEqualObjects } from 'shallow-equal'
-
-// Cross compatibility dependencies
-import * as Vue from 'vue'
-import { isVue2 } from './utils.js'
-
-export default {
-  data () {
-    return {
-      plugin: {},
-    }
-  },
-  props: {
-    uppy: {
-      required: true,
-    },
-    props: {
-      type: Object,
-    },
-  },
-  mounted () {
-    this.installPlugin()
-  },
-  methods: {
-    installPlugin () {
-      const { uppy } = this
-      const options = {
-        id: 'vue:FileInput',
-        ...this.props,
-        target: this.$refs.container,
-      }
-      uppy.use(FileInputPlugin, options)
-      this.plugin = uppy.getPlugin(options.id)
-    },
-    uninstallPlugin (uppy) {
-      uppy.removePlugin(this.plugin)
-    },
-  },
-  beforeDestroy () {
-    this.uninstallPlugin(this.uppy)
-  },
-  beforeUnmount () {
-    this.uninstallPlugin(this.uppy)
-  },
-  watch: {
-    uppy (current, old) {
-      if (old !== current) {
-        this.uninstallPlugin(old)
-        this.installPlugin()
-      }
-    },
-    props (current, old) {
-      if (!shallowEqualObjects(current, old)) {
-        this.plugin.setOptions({ ...current })
-      }
-    },
-  },
-  render (...args) {
-    // Hack to allow support for Vue 2 and 3
-    if (isVue2(...args)) {
-      // If it's first argument is a function, then it's a Vue 2 App
-      const [createElement] = args
-      return createElement('div', {
-        ref: 'container',
-      })
-    }
-
-    // Otherwise, we import the `h` function from the Vue package (in Vue 3 fashion)
-    return Vue.h('div', {
-      ref: 'container',
-    })
-  },
-}

+ 39 - 0
packages/@uppy/vue/src/file-input.ts

@@ -0,0 +1,39 @@
+import { defineComponent, ref, h, type PropType } from 'vue'
+import FileInputPlugin, { type FileInputOptions } from '@uppy/file-input'
+import { Uppy } from '@uppy/core'
+import useUppy from './useUppy'
+
+export default defineComponent({
+  name: 'FileInput',
+  props: {
+    uppy: {
+      type: Uppy<any, any>,
+      required: true,
+    },
+    props: {
+      type: Object as PropType<FileInputOptions>,
+    },
+  },
+  setup(props) {
+    const containerRef = ref<string>()
+    const pluginRef = ref<FileInputPlugin<any, any>>()
+    const propsRef = ref(props.props)
+    const onMount = () => {
+      const { uppy } = props
+      const options = {
+        id: 'FileInput',
+        ...props,
+        target: containerRef.value,
+      }
+      uppy.use(FileInputPlugin, options)
+      pluginRef.value = uppy.getPlugin(options.id) as FileInputPlugin<any, any>
+    }
+
+    useUppy(onMount, pluginRef, props.uppy, propsRef)
+
+    return () =>
+      h('div', {
+        ref: containerRef,
+      })
+  },
+})

+ 0 - 6
packages/@uppy/vue/src/index.js

@@ -1,6 +0,0 @@
-export { default as Dashboard } from './dashboard.js'
-export { default as DashboardModal } from './dashboard-modal.js'
-export { default as DragDrop } from './drag-drop.js'
-export { default as ProgressBar } from './progress-bar.js'
-export { default as StatusBar } from './status-bar.js'
-export { default as FileInput } from './file-input.js'

+ 6 - 0
packages/@uppy/vue/src/index.ts

@@ -0,0 +1,6 @@
+export { default as Dashboard } from './dashboard.ts'
+export { default as DashboardModal } from './dashboard-modal.ts'
+export { default as DragDrop } from './drag-drop.ts'
+export { default as ProgressBar } from './progress-bar.ts'
+export { default as StatusBar } from './status-bar.ts'
+export { default as FileInput } from './file-input.ts'

+ 0 - 71
packages/@uppy/vue/src/progress-bar.js

@@ -1,71 +0,0 @@
-import ProgressBarPlugin from '@uppy/progress-bar'
-import { shallowEqualObjects } from 'shallow-equal'
-
-// Cross compatibility dependencies
-import * as Vue from 'vue'
-import { isVue2 } from './utils.js'
-
-export default {
-  data () {
-    return {
-      plugin: {},
-    }
-  },
-  props: {
-    uppy: {
-      required: true,
-    },
-    props: {
-      type: Object,
-    },
-  },
-  mounted () {
-    this.installPlugin()
-  },
-  methods: {
-    installPlugin () {
-      const { uppy } = this
-      const options = {
-        id: 'vue:ProgressBar',
-        ...this.props,
-        target: this.$refs.container,
-      }
-      uppy.use(ProgressBarPlugin, options)
-      this.plugin = uppy.getPlugin(options.id)
-    },
-    uninstallPlugin (uppy) {
-      uppy.removePlugin(this.plugin)
-    },
-  },
-  beforeDestroy () {
-    this.uninstallPlugin(this.uppy)
-  },
-  watch: {
-    uppy (current, old) {
-      if (old !== current) {
-        this.uninstallPlugin(old)
-        this.installPlugin()
-      }
-    },
-    props (current, old) {
-      if (!shallowEqualObjects(current, old)) {
-        this.plugin.setOptions({ ...current })
-      }
-    },
-  },
-  render (...args) {
-    // Hack to allow support for Vue 2 and 3
-    if (isVue2(...args)) {
-      // If it's first argument is a function, then it's a Vue 2 App
-      const [createElement] = args
-      return createElement('div', {
-        ref: 'container',
-      })
-    }
-
-    // Otherwise, we import the `h` function from the Vue package (in Vue 3 fashion)
-    return Vue.h('div', {
-      ref: 'container',
-    })
-  },
-}

+ 42 - 0
packages/@uppy/vue/src/progress-bar.ts

@@ -0,0 +1,42 @@
+import { defineComponent, ref, h, type PropType } from 'vue'
+import ProgressBarPlugin, { type ProgressBarOptions } from '@uppy/progress-bar'
+import { Uppy } from '@uppy/core'
+import useUppy from './useUppy'
+
+export default defineComponent({
+  name: 'ProgressBar',
+  props: {
+    uppy: {
+      type: Uppy<any, any>,
+      required: true,
+    },
+    props: {
+      type: Object as PropType<ProgressBarOptions>,
+    },
+  },
+  setup(props) {
+    const containerRef = ref<string>()
+    const pluginRef = ref<ProgressBarPlugin<any, any>>()
+    const propsRef = ref(props.props)
+    const onMount = () => {
+      const { uppy } = props
+      const options = {
+        id: 'ProgressBar',
+        ...props,
+        target: containerRef.value,
+      }
+      uppy.use(ProgressBarPlugin, options)
+      pluginRef.value = uppy.getPlugin(options.id) as ProgressBarPlugin<
+        any,
+        any
+      >
+    }
+
+    useUppy(onMount, pluginRef, props.uppy, propsRef)
+
+    return () =>
+      h('div', {
+        ref: containerRef,
+      })
+  },
+})

+ 0 - 74
packages/@uppy/vue/src/status-bar.js

@@ -1,74 +0,0 @@
-import StatusBarPlugin from '@uppy/status-bar'
-import { shallowEqualObjects } from 'shallow-equal'
-
-// Cross compatibility dependencies
-import * as Vue from 'vue'
-import { isVue2 } from './utils.js'
-
-export default {
-  data () {
-    return {
-      plugin: {},
-    }
-  },
-  props: {
-    uppy: {
-      required: true,
-    },
-    props: {
-      type: Object,
-    },
-  },
-  mounted () {
-    this.installPlugin()
-  },
-  methods: {
-    installPlugin () {
-      const { uppy } = this
-      const options = {
-        id: 'vue:StatusBar',
-        ...this.props,
-        target: this.$refs.container,
-      }
-      uppy.use(StatusBarPlugin, options)
-      this.plugin = uppy.getPlugin(options.id)
-    },
-    uninstallPlugin (uppy) {
-      uppy.removePlugin(this.plugin)
-    },
-  },
-  beforeDestroy () {
-    this.uninstallPlugin(this.uppy)
-  },
-  beforeUnmount () {
-    this.uninstallPlugin(this.uppy)
-  },
-  watch: {
-    uppy (current, old) {
-      if (old !== current) {
-        this.uninstallPlugin(old)
-        this.installPlugin()
-      }
-    },
-    props (current, old) {
-      if (!shallowEqualObjects(current, old)) {
-        this.plugin.setOptions({ ...current })
-      }
-    },
-  },
-  render (...args) {
-    // Hack to allow support for Vue 2 and 3
-    if (isVue2(...args)) {
-      // If it's first argument is a function, then it's a Vue 2 App
-      const [createElement] = args
-      return createElement('div', {
-        ref: 'container',
-      })
-    }
-
-    // Other wise, we import the `h` function from the Vue package (in Vue 3 fashion)
-    return Vue.h('div', {
-      ref: 'container',
-    })
-  },
-}

+ 39 - 0
packages/@uppy/vue/src/status-bar.ts

@@ -0,0 +1,39 @@
+import { defineComponent, ref, h, type PropType } from 'vue'
+import StatusBarPlugin, { type StatusBarOptions } from '@uppy/status-bar'
+import { Uppy } from '@uppy/core'
+import useUppy from './useUppy'
+
+export default defineComponent({
+  name: 'StatusBar',
+  props: {
+    uppy: {
+      type: Uppy<any, any>,
+      required: true,
+    },
+    props: {
+      type: Object as PropType<StatusBarOptions>,
+    },
+  },
+  setup(props) {
+    const containerRef = ref<string>()
+    const pluginRef = ref<StatusBarPlugin<any, any>>()
+    const propsRef = ref(props.props)
+    const onMount = () => {
+      const { uppy } = props
+      const options = {
+        id: 'StatusBar',
+        ...props,
+        target: containerRef.value,
+      }
+      uppy.use(StatusBarPlugin, options)
+      pluginRef.value = uppy.getPlugin(options.id) as StatusBarPlugin<any, any>
+    }
+
+    useUppy(onMount, pluginRef, props.uppy, propsRef)
+
+    return () =>
+      h('div', {
+        ref: containerRef,
+      })
+  },
+})

+ 29 - 0
packages/@uppy/vue/src/useUppy.ts

@@ -0,0 +1,29 @@
+import { onBeforeUnmount, onMounted, watch, type Ref } from 'vue'
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore untyped
+import { shallowEqualObjects } from 'shallow-equal'
+import type { UnknownPlugin, Uppy } from '@uppy/core'
+
+export default function useUppy<P extends UnknownPlugin<any, any>>(
+  installPlugin: () => void,
+  plugin: Ref<P | undefined>,
+  uppy: Uppy<any, any>,
+  props: Ref<Record<string, unknown> | undefined>,
+): void {
+  onMounted(() => {
+    installPlugin()
+  })
+
+  onBeforeUnmount(() => {
+    uppy.removePlugin(plugin.value!)
+  })
+
+  watch(
+    () => props.value,
+    (current, old) => {
+      if (!shallowEqualObjects(current, old)) {
+        plugin.value!.setOptions({ ...current })
+      }
+    },
+  )
+}

+ 0 - 4
packages/@uppy/vue/src/utils.js

@@ -1,4 +0,0 @@
-// eslint-disable-next-line import/prefer-default-export
-export const isVue2 = (...args) => {
-  return args.length > 0 && typeof args[0] === 'function'
-}

+ 46 - 0
packages/@uppy/vue/tsconfig.build.json

@@ -0,0 +1,46 @@
+{
+  "extends": "../../../tsconfig.shared",
+  "compilerOptions": {
+    "noImplicitAny": false,
+    "outDir": "./lib",
+    "paths": {
+      "@uppy/core": ["../core/src/index.js"],
+      "@uppy/core/lib/*": ["../core/src/*"],
+      "@uppy/dashboard": ["../dashboard/src/index.js"],
+      "@uppy/dashboard/lib/*": ["../dashboard/src/*"],
+      "@uppy/drag-drop": ["../drag-drop/src/index.js"],
+      "@uppy/drag-drop/lib/*": ["../drag-drop/src/*"],
+      "@uppy/file-input": ["../file-input/src/index.js"],
+      "@uppy/file-input/lib/*": ["../file-input/src/*"],
+      "@uppy/progress-bar": ["../progress-bar/src/index.js"],
+      "@uppy/progress-bar/lib/*": ["../progress-bar/src/*"],
+      "@uppy/status-bar": ["../status-bar/src/index.js"],
+      "@uppy/status-bar/lib/*": ["../status-bar/src/*"]
+    },
+    "resolveJsonModule": false,
+    "rootDir": "./src",
+    "skipLibCheck": true
+  },
+  "include": ["./src/**/*.*"],
+  "exclude": ["./src/**/*.test.ts"],
+  "references": [
+    {
+      "path": "../core/tsconfig.build.json"
+    },
+    {
+      "path": "../dashboard/tsconfig.build.json"
+    },
+    {
+      "path": "../drag-drop/tsconfig.build.json"
+    },
+    {
+      "path": "../file-input/tsconfig.build.json"
+    },
+    {
+      "path": "../progress-bar/tsconfig.build.json"
+    },
+    {
+      "path": "../status-bar/tsconfig.build.json"
+    }
+  ]
+}

+ 42 - 0
packages/@uppy/vue/tsconfig.json

@@ -0,0 +1,42 @@
+{
+  "extends": "../../../tsconfig.shared",
+  "compilerOptions": {
+    "emitDeclarationOnly": false,
+    "noEmit": true,
+    "paths": {
+      "@uppy/core": ["../core/src/index.js"],
+      "@uppy/core/lib/*": ["../core/src/*"],
+      "@uppy/dashboard": ["../dashboard/src/index.js"],
+      "@uppy/dashboard/lib/*": ["../dashboard/src/*"],
+      "@uppy/drag-drop": ["../drag-drop/src/index.js"],
+      "@uppy/drag-drop/lib/*": ["../drag-drop/src/*"],
+      "@uppy/file-input": ["../file-input/src/index.js"],
+      "@uppy/file-input/lib/*": ["../file-input/src/*"],
+      "@uppy/progress-bar": ["../progress-bar/src/index.js"],
+      "@uppy/progress-bar/lib/*": ["../progress-bar/src/*"],
+      "@uppy/status-bar": ["../status-bar/src/index.js"],
+      "@uppy/status-bar/lib/*": ["../status-bar/src/*"],
+    },
+  },
+  "include": ["./package.json", "./src/**/*.*"],
+  "references": [
+    {
+      "path": "../core/tsconfig.build.json",
+    },
+    {
+      "path": "../dashboard/tsconfig.build.json",
+    },
+    {
+      "path": "../drag-drop/tsconfig.build.json",
+    },
+    {
+      "path": "../file-input/tsconfig.build.json",
+    },
+    {
+      "path": "../progress-bar/tsconfig.build.json",
+    },
+    {
+      "path": "../status-bar/tsconfig.build.json",
+    },
+  ],
+}

+ 163 - 370
yarn.lock

@@ -2088,7 +2088,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/core@npm:^7.0.0, @babel/core@npm:^7.1.6, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.12.9, @babel/core@npm:^7.14.3, @babel/core@npm:^7.14.6, @babel/core@npm:^7.17.9, @babel/core@npm:^7.23.5":
+"@babel/core@npm:^7.0.0, @babel/core@npm:^7.1.6, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.12.9, @babel/core@npm:^7.14.6, @babel/core@npm:^7.23.5":
   version: 7.23.7
   resolution: "@babel/core@npm:7.23.7"
   dependencies:
@@ -2292,7 +2292,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.22.15":
+"@babel/helper-module-imports@npm:^7.22.15":
   version: 7.22.15
   resolution: "@babel/helper-module-imports@npm:7.22.15"
   dependencies:
@@ -2457,7 +2457,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.1.6, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.4, @babel/parser@npm:^7.17.9, @babel/parser@npm:^7.18.4, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.3, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6":
+"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.1.6, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.4, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.3, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6":
   version: 7.23.6
   resolution: "@babel/parser@npm:7.23.6"
   bin:
@@ -2511,7 +2511,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-proposal-class-properties@npm:^7.0.0, @babel/plugin-proposal-class-properties@npm:^7.1.0, @babel/plugin-proposal-class-properties@npm:^7.16.7":
+"@babel/plugin-proposal-class-properties@npm:^7.0.0, @babel/plugin-proposal-class-properties@npm:^7.1.0":
   version: 7.18.6
   resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6"
   dependencies:
@@ -2523,7 +2523,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-proposal-decorators@npm:^7.12.9, @babel/plugin-proposal-decorators@npm:^7.17.9":
+"@babel/plugin-proposal-decorators@npm:^7.12.9":
   version: 7.23.7
   resolution: "@babel/plugin-proposal-decorators@npm:7.23.7"
   dependencies:
@@ -2548,7 +2548,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.0.0, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.1.0, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.14.5, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.16.7":
+"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.0.0, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.1.0, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.14.5":
   version: 7.18.6
   resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6"
   dependencies:
@@ -2560,7 +2560,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-proposal-object-rest-spread@npm:^7.0.0, @babel/plugin-proposal-object-rest-spread@npm:^7.15.6, @babel/plugin-proposal-object-rest-spread@npm:^7.17.3":
+"@babel/plugin-proposal-object-rest-spread@npm:^7.0.0":
   version: 7.20.7
   resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7"
   dependencies:
@@ -2587,7 +2587,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-proposal-optional-chaining@npm:^7.0.0, @babel/plugin-proposal-optional-chaining@npm:^7.1.0, @babel/plugin-proposal-optional-chaining@npm:^7.14.2, @babel/plugin-proposal-optional-chaining@npm:^7.16.0, @babel/plugin-proposal-optional-chaining@npm:^7.16.7":
+"@babel/plugin-proposal-optional-chaining@npm:^7.0.0, @babel/plugin-proposal-optional-chaining@npm:^7.1.0, @babel/plugin-proposal-optional-chaining@npm:^7.16.0":
   version: 7.21.0
   resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0"
   dependencies:
@@ -2752,7 +2752,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.2.0, @babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.7.2":
+"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.7.2":
   version: 7.23.3
   resolution: "@babel/plugin-syntax-jsx@npm:7.23.3"
   dependencies:
@@ -2874,7 +2874,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.14.5, @babel/plugin-transform-arrow-functions@npm:^7.16.7, @babel/plugin-transform-arrow-functions@npm:^7.23.3":
+"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.23.3":
   version: 7.23.3
   resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3"
   dependencies:
@@ -2937,7 +2937,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.14.5, @babel/plugin-transform-block-scoping@npm:^7.16.7, @babel/plugin-transform-block-scoping@npm:^7.23.4":
+"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.23.4":
   version: 7.23.4
   resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4"
   dependencies:
@@ -2991,7 +2991,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.14.5, @babel/plugin-transform-computed-properties@npm:^7.16.7, @babel/plugin-transform-computed-properties@npm:^7.23.3":
+"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.23.3":
   version: 7.23.3
   resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3"
   dependencies:
@@ -3003,7 +3003,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.14.5, @babel/plugin-transform-destructuring@npm:^7.17.7, @babel/plugin-transform-destructuring@npm:^7.23.3":
+"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.23.3":
   version: 7.23.3
   resolution: "@babel/plugin-transform-destructuring@npm:7.23.3"
   dependencies:
@@ -3346,7 +3346,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.14.5, @babel/plugin-transform-parameters@npm:^7.16.7, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.23.3":
+"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.23.3":
   version: 7.23.3
   resolution: "@babel/plugin-transform-parameters@npm:7.23.3"
   dependencies:
@@ -3508,7 +3508,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.14.5, @babel/plugin-transform-spread@npm:^7.16.7, @babel/plugin-transform-spread@npm:^7.23.3":
+"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.23.3":
   version: 7.23.3
   resolution: "@babel/plugin-transform-spread@npm:7.23.3"
   dependencies:
@@ -3553,7 +3553,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-typescript@npm:^7.16.8, @babel/plugin-transform-typescript@npm:^7.22.10, @babel/plugin-transform-typescript@npm:^7.23.3, @babel/plugin-transform-typescript@npm:^7.5.0":
+"@babel/plugin-transform-typescript@npm:^7.22.10, @babel/plugin-transform-typescript@npm:^7.23.3, @babel/plugin-transform-typescript@npm:^7.5.0":
   version: 7.23.6
   resolution: "@babel/plugin-transform-typescript@npm:7.23.6"
   dependencies:
@@ -3933,7 +3933,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/types@npm:^7.0.0, @babel/types@npm:^7.14.5, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.23.6, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
+"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.23.6, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
   version: 7.23.6
   resolution: "@babel/types@npm:7.23.6"
   dependencies:
@@ -7220,7 +7220,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@rollup/pluginutils@npm:4, @rollup/pluginutils@npm:^4.2.1":
+"@rollup/pluginutils@npm:4":
   version: 4.2.1
   resolution: "@rollup/pluginutils@npm:4.2.1"
   dependencies:
@@ -9309,23 +9309,6 @@ __metadata:
   languageName: unknown
   linkType: soft
 
-"@uppy-example/vue2@workspace:examples/vue":
-  version: 0.0.0-use.local
-  resolution: "@uppy-example/vue2@workspace:examples/vue"
-  dependencies:
-    "@uppy/core": "workspace:*"
-    "@uppy/dashboard": "workspace:*"
-    "@uppy/drag-drop": "workspace:*"
-    "@uppy/progress-bar": "workspace:*"
-    "@uppy/transloadit": "workspace:*"
-    "@uppy/vue": "workspace:*"
-    vite: ^5.0.0
-    vite-plugin-vue2: ^2.0.1
-    vue: ^2.6.14
-    vue-template-compiler: ^2.6.14
-  languageName: unknown
-  linkType: soft
-
 "@uppy-example/vue3@workspace:examples/vue3":
   version: 0.0.0-use.local
   resolution: "@uppy-example/vue3@workspace:examples/vue3"
@@ -9336,6 +9319,7 @@ __metadata:
     "@uppy/progress-bar": "workspace:*"
     "@uppy/tus": "workspace:*"
     "@uppy/vue": "workspace:*"
+    "@uppy/webcam": "workspace:*"
     "@vitejs/plugin-vue": ^5.0.0
     vite: ^5.0.0
     vue: ^3.2.33
@@ -9968,7 +9952,7 @@ __metadata:
   resolution: "@uppy/vue@workspace:packages/@uppy/vue"
   dependencies:
     shallow-equal: ^1.2.1
-    vue: ^2.6.14
+    vue: ^3.4.21
   peerDependencies:
     "@uppy/core": "workspace:^"
     "@uppy/dashboard": "workspace:^"
@@ -9976,7 +9960,7 @@ __metadata:
     "@uppy/file-input": "workspace:^"
     "@uppy/progress-bar": "workspace:^"
     "@uppy/status-bar": "workspace:^"
-    vue: ">=2.6.11"
+    vue: ">=3.0.0"
   peerDependenciesMeta:
     "@uppy/dashboard":
       optional: true
@@ -10131,124 +10115,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@vue/babel-helper-vue-jsx-merge-props@npm:^1.2.1, @vue/babel-helper-vue-jsx-merge-props@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@vue/babel-helper-vue-jsx-merge-props@npm:1.4.0"
-  checksum: 2383ff7719b324da2330f7444472e6a2f0c8710d1ad0a1b5cccdda1c5a4160129d0e9db97e6404cc4a4ecb64a7e8510fde0bec381b3eb03103f814534f02b18d
-  languageName: node
-  linkType: hard
-
-"@vue/babel-plugin-transform-vue-jsx@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@vue/babel-plugin-transform-vue-jsx@npm:1.4.0"
-  dependencies:
-    "@babel/helper-module-imports": ^7.0.0
-    "@babel/plugin-syntax-jsx": ^7.2.0
-    "@vue/babel-helper-vue-jsx-merge-props": ^1.4.0
-    html-tags: ^2.0.0
-    lodash.kebabcase: ^4.1.1
-    svg-tags: ^1.0.0
-  peerDependencies:
-    "@babel/core": ^7.0.0-0
-  checksum: c737ad3d277efeacc091686a0159d3c41d330feb4a74203daa488d4a56a51178d14839fb28e4ce6f0ba5e69b628dc4f8dd556e95ad7cb18b6d91d1be8e5c31d0
-  languageName: node
-  linkType: hard
-
-"@vue/babel-preset-jsx@npm:^1.2.4":
-  version: 1.4.0
-  resolution: "@vue/babel-preset-jsx@npm:1.4.0"
-  dependencies:
-    "@vue/babel-helper-vue-jsx-merge-props": ^1.4.0
-    "@vue/babel-plugin-transform-vue-jsx": ^1.4.0
-    "@vue/babel-sugar-composition-api-inject-h": ^1.4.0
-    "@vue/babel-sugar-composition-api-render-instance": ^1.4.0
-    "@vue/babel-sugar-functional-vue": ^1.4.0
-    "@vue/babel-sugar-inject-h": ^1.4.0
-    "@vue/babel-sugar-v-model": ^1.4.0
-    "@vue/babel-sugar-v-on": ^1.4.0
-  peerDependencies:
-    "@babel/core": ^7.0.0-0
-    vue: "*"
-  peerDependenciesMeta:
-    vue:
-      optional: true
-  checksum: 19fc3d8606f115c9e74013c3e17df42e51538056aad732b66b33d63febfba0a5ccc12cca9dc352c56ebf0605f3dd58abdd05c2055363fdd2424ad10818acfbb1
-  languageName: node
-  linkType: hard
-
-"@vue/babel-sugar-composition-api-inject-h@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@vue/babel-sugar-composition-api-inject-h@npm:1.4.0"
-  dependencies:
-    "@babel/plugin-syntax-jsx": ^7.2.0
-  peerDependencies:
-    "@babel/core": ^7.0.0-0
-  checksum: 52a106dd7bd6614cb9bda90a39d6ac175ce849d797096bde5bacc4053bdc25b2ed6483d5b18b4a46fa7d7b51a4ac5987dda8ec88a8e712c4ee51709e9cfb8e1e
-  languageName: node
-  linkType: hard
-
-"@vue/babel-sugar-composition-api-render-instance@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@vue/babel-sugar-composition-api-render-instance@npm:1.4.0"
-  dependencies:
-    "@babel/plugin-syntax-jsx": ^7.2.0
-  peerDependencies:
-    "@babel/core": ^7.0.0-0
-  checksum: b7281b11353df729f66da37df5a32936060cf3dc219234add164c524ab6164e4905610b4080ef9ee3dfc94b046d4eba456eb7b5ea21caf011b7ad00835c962a2
-  languageName: node
-  linkType: hard
-
-"@vue/babel-sugar-functional-vue@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@vue/babel-sugar-functional-vue@npm:1.4.0"
-  dependencies:
-    "@babel/plugin-syntax-jsx": ^7.2.0
-  peerDependencies:
-    "@babel/core": ^7.0.0-0
-  checksum: 93a0338bc390fd6a869dab009c1d6739fbfc305f49c6135cea1499437a7574a4868cf07d83a939e3fba38fc1f0243af53d899dbd696d1882f2e486abb3d49d4b
-  languageName: node
-  linkType: hard
-
-"@vue/babel-sugar-inject-h@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@vue/babel-sugar-inject-h@npm:1.4.0"
-  dependencies:
-    "@babel/plugin-syntax-jsx": ^7.2.0
-  peerDependencies:
-    "@babel/core": ^7.0.0-0
-  checksum: d8dadf55d7135838316372867d390a4d2208f44604bdbe578349a49ca52e27b10c685cc48ddd662678413670cb6a8a8307426838758a62d1d3d88cb90cfd2b63
-  languageName: node
-  linkType: hard
-
-"@vue/babel-sugar-v-model@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@vue/babel-sugar-v-model@npm:1.4.0"
-  dependencies:
-    "@babel/plugin-syntax-jsx": ^7.2.0
-    "@vue/babel-helper-vue-jsx-merge-props": ^1.4.0
-    "@vue/babel-plugin-transform-vue-jsx": ^1.4.0
-    camelcase: ^5.0.0
-    html-tags: ^2.0.0
-    svg-tags: ^1.0.0
-  peerDependencies:
-    "@babel/core": ^7.0.0-0
-  checksum: fa2ad5a05f25a4a42de0e5f477c1897dff916185aea993a5a3af3a3aa38f46bb44d7d4ee083dcf6baa63e8a7930e3f5f67dcd01ec37a498257a38d2c35723664
-  languageName: node
-  linkType: hard
-
-"@vue/babel-sugar-v-on@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@vue/babel-sugar-v-on@npm:1.4.0"
-  dependencies:
-    "@babel/plugin-syntax-jsx": ^7.2.0
-    "@vue/babel-plugin-transform-vue-jsx": ^1.4.0
-    camelcase: ^5.0.0
-  peerDependencies:
-    "@babel/core": ^7.0.0-0
-  checksum: 77c9e7a6bc93e66d0949f51b06d51bff17a08b5eb3072674413f90dcf6736ea13f38bc931566efe63444fffa137098d0397e20e66f8648949f6b860c9bbd8cd1
-  languageName: node
-  linkType: hard
-
 "@vue/compiler-core@npm:3.2.38":
   version: 3.2.38
   resolution: "@vue/compiler-core@npm:3.2.38"
@@ -10273,6 +10139,19 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@vue/compiler-core@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/compiler-core@npm:3.4.21"
+  dependencies:
+    "@babel/parser": ^7.23.9
+    "@vue/shared": 3.4.21
+    entities: ^4.5.0
+    estree-walker: ^2.0.2
+    source-map-js: ^1.0.2
+  checksum: 0d6b7732bc5ca5b4561526bbe646f9acd09cd70561b6c822d15856347f21a009ebf30f2f85b1b7500f24f7c0333a2af8ee645c389abe52485c1f4724c982b306
+  languageName: node
+  linkType: hard
+
 "@vue/compiler-dom@npm:3.2.38":
   version: 3.2.38
   resolution: "@vue/compiler-dom@npm:3.2.38"
@@ -10293,14 +10172,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@vue/compiler-sfc@npm:2.7.10":
-  version: 2.7.10
-  resolution: "@vue/compiler-sfc@npm:2.7.10"
+"@vue/compiler-dom@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/compiler-dom@npm:3.4.21"
   dependencies:
-    "@babel/parser": ^7.18.4
-    postcss: ^8.4.14
-    source-map: ^0.6.1
-  checksum: f20d79183ed2b9242d2c1ff196ddc9c3c384f541b85ca59543842af098653c3c0732a9b2f28dd031383bb9e02a40a5a001b4c6bbcb12fbd389372225b12b9020
+    "@vue/compiler-core": 3.4.21
+    "@vue/shared": 3.4.21
+  checksum: f53e4f4e0afc954cede91a8cbeb3a4e053531a43a0f5999d1b18da443ca3f1f6fc9344a8741c72c5719a61bb34e18004ac88e16747bcf145ebc8a31188263690
   languageName: node
   linkType: hard
 
@@ -10322,6 +10200,23 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@vue/compiler-sfc@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/compiler-sfc@npm:3.4.21"
+  dependencies:
+    "@babel/parser": ^7.23.9
+    "@vue/compiler-core": 3.4.21
+    "@vue/compiler-dom": 3.4.21
+    "@vue/compiler-ssr": 3.4.21
+    "@vue/shared": 3.4.21
+    estree-walker: ^2.0.2
+    magic-string: ^0.30.7
+    postcss: ^8.4.35
+    source-map-js: ^1.0.2
+  checksum: 226dc404be96a2811777825918d971feb42650e262159183548d64a463c4153fab97cdc2647224c609c89dbc0d930c6d9dbe6528ef52a1396b4b22163c20569a
+  languageName: node
+  linkType: hard
+
 "@vue/compiler-sfc@npm:^3.2.27":
   version: 3.3.4
   resolution: "@vue/compiler-sfc@npm:3.3.4"
@@ -10360,23 +10255,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@vue/component-compiler-utils@npm:^3.3.0":
-  version: 3.3.0
-  resolution: "@vue/component-compiler-utils@npm:3.3.0"
+"@vue/compiler-ssr@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/compiler-ssr@npm:3.4.21"
   dependencies:
-    consolidate: ^0.15.1
-    hash-sum: ^1.0.2
-    lru-cache: ^4.1.2
-    merge-source-map: ^1.1.0
-    postcss: ^7.0.36
-    postcss-selector-parser: ^6.0.2
-    prettier: ^1.18.2 || ^2.0.0
-    source-map: ~0.6.1
-    vue-template-es2015-compiler: ^1.9.0
-  dependenciesMeta:
-    prettier:
-      optional: true
-  checksum: 70fee2289a4f54ec1be4d46136ee9b9893e31bf5622cead5be06c3dfb83449c3dbe6f8c03404625ccf302d0628ff9e2ea1debfae609d1bfe1d065d8f57c5dba8
+    "@vue/compiler-dom": 3.4.21
+    "@vue/shared": 3.4.21
+  checksum: c510bee68b1a5b7f8ae3fe771c10ce9c397f876a234ced9df89e4a8353f3874870857e929cbb37e6d785d355b43f2264dc3a7fd5cb6867dc5b39ddca607ea3ed
   languageName: node
   linkType: hard
 
@@ -10415,6 +10300,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@vue/reactivity@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/reactivity@npm:3.4.21"
+  dependencies:
+    "@vue/shared": 3.4.21
+  checksum: 79c7ebe3ec9295cdcb4d762e3a4c0e3eb67d7f12c9deb37baf372c4f48cd5914cdeeba14add433c3149b9c4dd890dc9891ee76e9d13c8ebcd521b5a754a8cc0d
+  languageName: node
+  linkType: hard
+
 "@vue/runtime-core@npm:3.2.38":
   version: 3.2.38
   resolution: "@vue/runtime-core@npm:3.2.38"
@@ -10425,6 +10319,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@vue/runtime-core@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/runtime-core@npm:3.4.21"
+  dependencies:
+    "@vue/reactivity": 3.4.21
+    "@vue/shared": 3.4.21
+  checksum: 4eb9b5d91fe58bc5b3f38293099d704ba7699a16d4ce68de03fbe5fc703e521ebfe3cefc156ef866d2ce0cbd1c2af1795674b39ab2b764bfedc069aa05233231
+  languageName: node
+  linkType: hard
+
 "@vue/runtime-dom@npm:3.2.38":
   version: 3.2.38
   resolution: "@vue/runtime-dom@npm:3.2.38"
@@ -10436,6 +10340,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@vue/runtime-dom@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/runtime-dom@npm:3.4.21"
+  dependencies:
+    "@vue/runtime-core": 3.4.21
+    "@vue/shared": 3.4.21
+    csstype: ^3.1.3
+  checksum: ebfdaa081fb7f18214a4e3324a7b58cc1bfe9b585cfc9dc5cf2ee480f233f992c32a6a3a3b595040babf26570ca18e748049d9284c42beceac8665e8f4ce5383
+  languageName: node
+  linkType: hard
+
 "@vue/server-renderer@npm:3.2.38":
   version: 3.2.38
   resolution: "@vue/server-renderer@npm:3.2.38"
@@ -10448,6 +10363,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@vue/server-renderer@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/server-renderer@npm:3.4.21"
+  dependencies:
+    "@vue/compiler-ssr": 3.4.21
+    "@vue/shared": 3.4.21
+  peerDependencies:
+    vue: 3.4.21
+  checksum: faa3dc48767fc4308ffa031d07a6dbb362f26b0b8893f82747e6d879f046c373978402d1c15ed08267ebc0f090809cd3d554e6a4f582affcefb5239be5d4860c
+  languageName: node
+  linkType: hard
+
 "@vue/shared@npm:3.2.38":
   version: 3.2.38
   resolution: "@vue/shared@npm:3.2.38"
@@ -10462,6 +10389,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@vue/shared@npm:3.4.21":
+  version: 3.4.21
+  resolution: "@vue/shared@npm:3.4.21"
+  checksum: 5f30a408911f339c647baa88c45c3a2f6d58dbdaf2bd404753690f24b612717bdfe9050401d8ffb02613a9a06dd0b43c8307420cd69fda6e92e6d65bf9bc0c6f
+  languageName: node
+  linkType: hard
+
 "@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5":
   version: 1.11.6
   resolution: "@webassemblyjs/ast@npm:1.11.6"
@@ -11905,7 +11839,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"bluebird@npm:3.7.2, bluebird@npm:^3.1.1, bluebird@npm:^3.7.2":
+"bluebird@npm:3.7.2, bluebird@npm:^3.7.2":
   version: 3.7.2
   resolution: "bluebird@npm:3.7.2"
   checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef
@@ -13147,15 +13081,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"consolidate@npm:^0.15.1":
-  version: 0.15.1
-  resolution: "consolidate@npm:0.15.1"
-  dependencies:
-    bluebird: ^3.1.1
-  checksum: 5a44ee975f8403dd3ff8ff3472fda7db0484b19f153eaac38e784465505a0741939c72d703befda7c75649739fc7a68f9659a86e2a62469336a8d531bd7a10df
-  languageName: node
-  linkType: hard
-
 "consolidate@npm:^0.16.0":
   version: 0.16.0
   resolution: "consolidate@npm:0.16.0"
@@ -13677,13 +13602,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"csstype@npm:^3.0.2, csstype@npm:^3.1.0":
+"csstype@npm:^3.0.2":
   version: 3.1.0
   resolution: "csstype@npm:3.1.0"
   checksum: 644e986cefab86525f0b674a06889cfdbb1f117e5b7d1ce0fc55b0423ecc58807a1ea42ecc75c4f18999d14fc42d1d255f84662a45003a52bb5840e977eb2ffd
   languageName: node
   linkType: hard
 
+"csstype@npm:^3.1.3":
+  version: 3.1.3
+  resolution: "csstype@npm:3.1.3"
+  checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7
+  languageName: node
+  linkType: hard
+
 "cuss@npm:^2.0.0":
   version: 2.0.0
   resolution: "cuss@npm:2.0.0"
@@ -13820,13 +13752,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"de-indent@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "de-indent@npm:1.0.2"
-  checksum: 8deacc0f4a397a4414a0fc4d0034d2b7782e7cb4eaf34943ea47754e08eccf309a0e71fa6f56cc48de429ede999a42d6b4bca761bf91683be0095422dbf24611
-  languageName: node
-  linkType: hard
-
 "debug@npm:2.6.9, debug@npm:^2.0.0, debug@npm:^2.2.0, debug@npm:^2.3.3":
   version: 2.6.9
   resolution: "debug@npm:2.6.9"
@@ -14679,7 +14604,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"entities@npm:^4.4.0":
+"entities@npm:^4.4.0, entities@npm:^4.5.0":
   version: 4.5.0
   resolution: "entities@npm:4.5.0"
   checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7
@@ -17879,20 +17804,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"hash-sum@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "hash-sum@npm:1.0.2"
-  checksum: 268553ba6c84333f502481d101a7d65cd39f61963544f12fc3ce60264718f471796dbc37348cee08c5529f04fafeba041886a4d35721e34d6440a48a42629283
-  languageName: node
-  linkType: hard
-
-"hash-sum@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "hash-sum@npm:2.0.0"
-  checksum: efeeacf09ecbd467202865403c3a1991fa15d4f4903c1148ecbe13223fdbf9ec6d7dc661e17e5ce6e776cd70d67b6ee4c82e0171318962435be45c1155175f3f
-  languageName: node
-  linkType: hard
-
 "hash.js@npm:^1.0.0, hash.js@npm:^1.0.3":
   version: 1.1.7
   resolution: "hash.js@npm:1.1.7"
@@ -18031,13 +17942,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"html-tags@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "html-tags@npm:2.0.0"
-  checksum: a02b47dd71de5572f16c9a1d88e2876fcc4d60bb36b7effce48cd3cd0bdd8fdcbf2602d968d2268d134767620d876edc08d8a6fc0abd9dc59a05e89d56251fbb
-  languageName: node
-  linkType: hard
-
 "html-tags@npm:^3.3.1":
   version: 3.3.1
   resolution: "html-tags@npm:3.3.1"
@@ -21291,13 +21195,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"lodash.kebabcase@npm:^4.1.1":
-  version: 4.1.1
-  resolution: "lodash.kebabcase@npm:4.1.1"
-  checksum: 5a6c59161914e1bae23438a298c7433e83d935e0f59853fa862e691164696bc07f6dfa4c313d499fbf41ba8d53314e9850416502376705a357d24ee6ca33af78
-  languageName: node
-  linkType: hard
-
 "lodash.memoize@npm:4.1.2, lodash.memoize@npm:^4.1.2":
   version: 4.1.2
   resolution: "lodash.memoize@npm:4.1.2"
@@ -21513,7 +21410,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"lru-cache@npm:^4.0.1, lru-cache@npm:^4.1.2":
+"lru-cache@npm:^4.0.1":
   version: 4.1.5
   resolution: "lru-cache@npm:4.1.5"
   dependencies:
@@ -21562,7 +21459,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"magic-string@npm:0.30.8":
+"magic-string@npm:0.30.8, magic-string@npm:^0.30.7":
   version: 0.30.8
   resolution: "magic-string@npm:0.30.8"
   dependencies:
@@ -21580,15 +21477,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"magic-string@npm:^0.26.1":
-  version: 0.26.7
-  resolution: "magic-string@npm:0.26.7"
-  dependencies:
-    sourcemap-codec: ^1.4.8
-  checksum: 89b0d60cbb32bbf3d1e23c46ea93db082d18a8230b972027aecb10a40bba51be519ecce0674f995571e3affe917b76b09f59d8dbc9a1b2c9c4102a2b6e8a2b01
-  languageName: node
-  linkType: hard
-
 "magic-string@npm:^0.27.0":
   version: 0.27.0
   resolution: "magic-string@npm:0.27.0"
@@ -21966,15 +21854,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"merge-source-map@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "merge-source-map@npm:1.1.0"
-  dependencies:
-    source-map: ^0.6.1
-  checksum: 945a83dcc59eff77dde709be1d3d6cb575c11cd7164a7ccdc1c6f0d463aad7c12750a510bdf84af2c05fac4615c4305d97ac90477975348bb901a905c8e92c4b
-  languageName: node
-  linkType: hard
-
 "merge-stream@npm:^2.0.0":
   version: 2.0.0
   resolution: "merge-stream@npm:2.0.0"
@@ -25151,13 +25030,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"picocolors@npm:^0.2.1":
-  version: 0.2.1
-  resolution: "picocolors@npm:0.2.1"
-  checksum: 3b0f441f0062def0c0f39e87b898ae7461c3a16ffc9f974f320b44c799418cabff17780ee647fda42b856a1dc45897e2c62047e1b546d94d6d5c6962f45427b2
-  languageName: node
-  linkType: hard
-
 "picocolors@npm:^1.0.0":
   version: 1.0.0
   resolution: "picocolors@npm:1.0.0"
@@ -25807,17 +25679,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss@npm:^7.0.36":
-  version: 7.0.39
-  resolution: "postcss@npm:7.0.39"
-  dependencies:
-    picocolors: ^0.2.1
-    source-map: ^0.6.1
-  checksum: 4ac793f506c23259189064bdc921260d869a115a82b5e713973c5af8e94fbb5721a5cc3e1e26840500d7e1f1fa42a209747c5b1a151918a9bc11f0d7ed9048e3
-  languageName: node
-  linkType: hard
-
-"postcss@npm:^8.1.10, postcss@npm:^8.2.14, postcss@npm:^8.4.14":
+"postcss@npm:^8.1.10, postcss@npm:^8.2.14":
   version: 8.4.16
   resolution: "postcss@npm:8.4.16"
   dependencies:
@@ -25872,7 +25734,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss@npm:^8.4.33, postcss@npm:^8.4.35":
+"postcss@npm:^8.4.33":
   version: 8.4.36
   resolution: "postcss@npm:8.4.36"
   dependencies:
@@ -25883,6 +25745,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"postcss@npm:^8.4.35":
+  version: 8.4.38
+  resolution: "postcss@npm:8.4.38"
+  dependencies:
+    nanoid: ^3.3.7
+    picocolors: ^1.0.0
+    source-map-js: ^1.2.0
+  checksum: 649f9e60a763ca4b5a7bbec446a069edf07f057f6d780a5a0070576b841538d1ecf7dd888f2fbfd1f76200e26c969e405aeeae66332e6927dbdc8bdcb90b9451
+  languageName: node
+  linkType: hard
+
 "posthtml-parser@npm:^0.10.1":
   version: 0.10.2
   resolution: "posthtml-parser@npm:0.10.2"
@@ -25974,15 +25847,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"prettier@npm:^1.18.2 || ^2.0.0, prettier@npm:^2.6.2":
-  version: 2.7.1
-  resolution: "prettier@npm:2.7.1"
-  bin:
-    prettier: bin-prettier.js
-  checksum: 55a4409182260866ab31284d929b3cb961e5fdb91fe0d2e099dac92eaecec890f36e524b4c19e6ceae839c99c6d7195817579cdffc8e2c80da0cb794463a748b
-  languageName: node
-  linkType: hard
-
 "prettier@npm:^3.0.3":
   version: 3.2.4
   resolution: "prettier@npm:3.2.4"
@@ -26300,13 +26164,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"querystring@npm:^0.2.1":
-  version: 0.2.1
-  resolution: "querystring@npm:0.2.1"
-  checksum: 7b83b45d641e75fd39cd6625ddfd44e7618e741c61e95281b57bbae8fde0afcc12cf851924559e5cc1ef9baa3b1e06e22b164ea1397d65dd94b801f678d9c8ce
-  languageName: node
-  linkType: hard
-
 "querystringify@npm:^2.1.1":
   version: 2.2.0
   resolution: "querystringify@npm:2.2.0"
@@ -27740,7 +27597,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rollup@npm:^2.60.2, rollup@npm:^2.70.2":
+"rollup@npm:^2.60.2":
   version: 2.79.0
   resolution: "rollup@npm:2.79.0"
   dependencies:
@@ -28839,6 +28696,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"source-map-js@npm:^1.2.0":
+  version: 1.2.0
+  resolution: "source-map-js@npm:1.2.0"
+  checksum: 791a43306d9223792e84293b00458bf102a8946e7188f3db0e4e22d8d530b5f80a4ce468eb5ec0bf585443ad55ebbd630bf379c98db0b1f317fd902500217f97
+  languageName: node
+  linkType: hard
+
 "source-map-loader@npm:5.0.0":
   version: 5.0.0
   resolution: "source-map-loader@npm:5.0.0"
@@ -31587,46 +31451,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"vite-plugin-vue2@npm:^2.0.1":
-  version: 2.0.3
-  resolution: "vite-plugin-vue2@npm:2.0.3"
-  dependencies:
-    "@babel/core": ^7.17.9
-    "@babel/parser": ^7.17.9
-    "@babel/plugin-proposal-class-properties": ^7.16.7
-    "@babel/plugin-proposal-decorators": ^7.17.9
-    "@babel/plugin-proposal-nullish-coalescing-operator": ^7.16.7
-    "@babel/plugin-proposal-object-rest-spread": ^7.17.3
-    "@babel/plugin-proposal-optional-chaining": ^7.16.7
-    "@babel/plugin-transform-arrow-functions": ^7.16.7
-    "@babel/plugin-transform-block-scoping": ^7.16.7
-    "@babel/plugin-transform-computed-properties": ^7.16.7
-    "@babel/plugin-transform-destructuring": ^7.17.7
-    "@babel/plugin-transform-parameters": ^7.16.7
-    "@babel/plugin-transform-spread": ^7.16.7
-    "@babel/plugin-transform-typescript": ^7.16.8
-    "@rollup/pluginutils": ^4.2.1
-    "@vue/babel-helper-vue-jsx-merge-props": ^1.2.1
-    "@vue/babel-preset-jsx": ^1.2.4
-    "@vue/component-compiler-utils": ^3.3.0
-    consolidate: ^0.16.0
-    debug: ^4.3.4
-    fs-extra: ^10.1.0
-    hash-sum: ^2.0.0
-    magic-string: ^0.26.1
-    prettier: ^2.6.2
-    querystring: ^0.2.1
-    rollup: ^2.70.2
-    slash: ^3.0.0
-    source-map: ^0.7.3
-    vue-template-babel-compiler: ^1.2.0
-  peerDependencies:
-    vite: ^2.0.0 || ^3.0.0 || ^4.0.0
-    vue-template-compiler: ^2.2.0
-  checksum: a4104e49769ad76eb8f0b7e733537ab05daf7bf4b778f2d1d80959712b5e6536794eb8588db44df94648be99674ff1e3e2dfde2ff7e19090fb835d8e3abeddc5
-  languageName: node
-  linkType: hard
-
 "vite@npm:5.1.5":
   version: 5.1.5
   resolution: "vite@npm:5.1.5"
@@ -31772,61 +31596,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"vue-template-babel-compiler@npm:^1.2.0":
-  version: 1.2.0
-  resolution: "vue-template-babel-compiler@npm:1.2.0"
-  dependencies:
-    "@babel/core": ^7.14.3
-    "@babel/plugin-proposal-nullish-coalescing-operator": ^7.14.5
-    "@babel/plugin-proposal-object-rest-spread": ^7.15.6
-    "@babel/plugin-proposal-optional-chaining": ^7.14.2
-    "@babel/plugin-transform-arrow-functions": ^7.14.5
-    "@babel/plugin-transform-block-scoping": ^7.14.5
-    "@babel/plugin-transform-computed-properties": ^7.14.5
-    "@babel/plugin-transform-destructuring": ^7.14.5
-    "@babel/plugin-transform-parameters": ^7.14.5
-    "@babel/plugin-transform-spread": ^7.14.5
-    "@babel/types": ^7.14.5
-    deepmerge: ^4.2.2
-  peerDependencies:
-    vue-template-compiler: ^2.6.0
-  checksum: aec01514927604b53db85962fa1d03d8126b026569fd1f89896bd9e04f258e94141e22ae86693085ee9785e242686e6fea398a3708818936a623782d33f403d8
-  languageName: node
-  linkType: hard
-
-"vue-template-compiler@npm:^2.6.14":
-  version: 2.7.10
-  resolution: "vue-template-compiler@npm:2.7.10"
-  dependencies:
-    de-indent: ^1.0.2
-    he: ^1.2.0
-  checksum: 52e4324d93ea5ecf6875c94eae99d3d4197cfb13538b6c2f5020df1776fb277e329325091c41da596b3cf1c7dabd56f50e2a538e2fc3d5ae23438d08471fdc8d
-  languageName: node
-  linkType: hard
-
 "vue-template-compiler@workspace:*, vue-template-compiler@workspace:private/vue-template-compiler":
   version: 0.0.0-use.local
   resolution: "vue-template-compiler@workspace:private/vue-template-compiler"
   languageName: unknown
   linkType: soft
 
-"vue-template-es2015-compiler@npm:^1.9.0":
-  version: 1.9.1
-  resolution: "vue-template-es2015-compiler@npm:1.9.1"
-  checksum: ad1e85662783be3ee262c323b05d12e6a5036fca24f16dc0f7ab92736b675919cb4fa4b79b28753eac73119b709d1b36789bf60e8ae423f50c4db35de9370e8b
-  languageName: node
-  linkType: hard
-
-"vue@npm:^2.6.14":
-  version: 2.7.10
-  resolution: "vue@npm:2.7.10"
-  dependencies:
-    "@vue/compiler-sfc": 2.7.10
-    csstype: ^3.1.0
-  checksum: 97887eea9ae0c7ec7309dcaed1ac9bb65803af235f63f629fe21df959be3c1b801f8aa7d1e85428624e149e5f47706950d0efe09f19b6a6e3b4d38a6352d5c71
-  languageName: node
-  linkType: hard
-
 "vue@npm:^3.2.33":
   version: 3.2.38
   resolution: "vue@npm:3.2.38"
@@ -31840,6 +31615,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"vue@npm:^3.4.21":
+  version: 3.4.21
+  resolution: "vue@npm:3.4.21"
+  dependencies:
+    "@vue/compiler-dom": 3.4.21
+    "@vue/compiler-sfc": 3.4.21
+    "@vue/runtime-dom": 3.4.21
+    "@vue/server-renderer": 3.4.21
+    "@vue/shared": 3.4.21
+  peerDependencies:
+    typescript: "*"
+  peerDependenciesMeta:
+    typescript:
+      optional: true
+  checksum: 3c477982a0a9aadfa512eb625b67f35809f123e98a268ace52e3ee738b23a9b8d9461cfc1f2b314fb098047ab3aab50f8beea657a2d3ebe5aae0e02aa4f903d2
+  languageName: node
+  linkType: hard
+
 "w3c-xmlserializer@npm:^4.0.0":
   version: 4.0.0
   resolution: "w3c-xmlserializer@npm:4.0.0"