diff --git a/packages/playground/tsconfig.json b/packages/playground/tsconfig.json
index 1b6cd5fdf929b7..465f0a26880aff 100644
--- a/packages/playground/tsconfig.json
+++ b/packages/playground/tsconfig.json
@@ -5,6 +5,7 @@
"outDir": "dist",
"allowJs": true,
"esModuleInterop": true,
- "baseUrl": "."
+ "baseUrl": ".",
+ "jsx": "preserve"
}
}
diff --git a/packages/playground/vue-jsx/Comp.tsx b/packages/playground/vue-jsx/Comp.tsx
new file mode 100644
index 00000000000000..fe8add4d428a2c
--- /dev/null
+++ b/packages/playground/vue-jsx/Comp.tsx
@@ -0,0 +1,14 @@
+import { defineComponent, ref } from 'vue'
+
+const Default = defineComponent(() => {
+ const count = ref(3)
+ const inc = () => count.value++
+
+ return () => (
+
+ )
+})
+
+export default Default
diff --git a/packages/playground/vue-jsx/Comps.jsx b/packages/playground/vue-jsx/Comps.jsx
new file mode 100644
index 00000000000000..e5cc405a77581b
--- /dev/null
+++ b/packages/playground/vue-jsx/Comps.jsx
@@ -0,0 +1,35 @@
+import { defineComponent, ref } from 'vue'
+
+export const Named = defineComponent(() => {
+ const count = ref(0)
+ const inc = () => count.value++
+
+ return () => (
+
+ )
+})
+
+const NamedSpec = defineComponent(() => {
+ const count = ref(1)
+ const inc = () => count.value++
+
+ return () => (
+
+ )
+})
+export { NamedSpec }
+
+export default defineComponent(() => {
+ const count = ref(2)
+ const inc = () => count.value++
+
+ return () => (
+
+ )
+})
diff --git a/packages/playground/vue-jsx/__tests__/vue-jsx.spec.ts b/packages/playground/vue-jsx/__tests__/vue-jsx.spec.ts
new file mode 100644
index 00000000000000..3a54cfdbf011e4
--- /dev/null
+++ b/packages/playground/vue-jsx/__tests__/vue-jsx.spec.ts
@@ -0,0 +1,74 @@
+import { editFile, isBuild, untilUpdated } from '../../testUtils'
+
+test('should render', async () => {
+ expect(await page.textContent('.named')).toMatch('0')
+ expect(await page.textContent('.named-specifier')).toMatch('1')
+ expect(await page.textContent('.default')).toMatch('2')
+ expect(await page.textContent('.default-tsx')).toMatch('3')
+})
+
+test('should update', async () => {
+ await page.click('.named')
+ expect(await page.textContent('.named')).toMatch('1')
+ await page.click('.named-specifier')
+ expect(await page.textContent('.named-specifier')).toMatch('2')
+ await page.click('.default')
+ expect(await page.textContent('.default')).toMatch('3')
+ await page.click('.default-tsx')
+ expect(await page.textContent('.default-tsx')).toMatch('4')
+})
+
+if (!isBuild) {
+ test('hmr: named export', async () => {
+ editFile('Comps.jsx', (code) =>
+ code.replace('named {count', 'named updated {count')
+ )
+ await untilUpdated(() => page.textContent('.named'), 'named updated 0')
+
+ // should not affect other components on the page
+ expect(await page.textContent('.named-specifier')).toMatch('2')
+ expect(await page.textContent('.default')).toMatch('3')
+ expect(await page.textContent('.default-tsx')).toMatch('4')
+ })
+
+ test('hmr: named export via specifier', async () => {
+ editFile('Comps.jsx', (code) =>
+ code.replace('named specifier {count', 'named specifier updated {count')
+ )
+ await untilUpdated(
+ () => page.textContent('.named-specifier'),
+ 'named specifier updated 1'
+ )
+
+ // should not affect other components on the page
+ expect(await page.textContent('.default')).toMatch('3')
+ expect(await page.textContent('.default-tsx')).toMatch('4')
+ })
+
+ test('hmr: default export', async () => {
+ editFile('Comps.jsx', (code) =>
+ code.replace('default {count', 'default updated {count')
+ )
+ await untilUpdated(() => page.textContent('.default'), 'default updated 2')
+
+ // should not affect other components on the page
+ expect(await page.textContent('.default-tsx')).toMatch('4')
+ })
+
+ test('hmr: named export via specifier', async () => {
+ // update another component
+ await page.click('.named')
+ expect(await page.textContent('.named')).toMatch('1')
+
+ editFile('Comp.tsx', (code) =>
+ code.replace('default tsx {count', 'default tsx updated {count')
+ )
+ await untilUpdated(
+ () => page.textContent('.default-tsx'),
+ 'default tsx updated 3'
+ )
+
+ // should not affect other components on the page
+ expect(await page.textContent('.named')).toMatch('1')
+ })
+}
diff --git a/packages/playground/vue-jsx/index.html b/packages/playground/vue-jsx/index.html
new file mode 100644
index 00000000000000..aac41137236e7e
--- /dev/null
+++ b/packages/playground/vue-jsx/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/packages/playground/vue-jsx/main.jsx b/packages/playground/vue-jsx/main.jsx
new file mode 100644
index 00000000000000..b0cb108d6c7c88
--- /dev/null
+++ b/packages/playground/vue-jsx/main.jsx
@@ -0,0 +1,16 @@
+import { createApp } from 'vue'
+import { Named, NamedSpec, default as Default } from './Comps'
+import { default as TsxDefault } from './Comp'
+
+function App() {
+ return (
+ <>
+
+
+
+
+ >
+ )
+}
+
+createApp(App).mount('#app')
diff --git a/packages/playground/vue-jsx/package.json b/packages/playground/vue-jsx/package.json
new file mode 100644
index 00000000000000..8c1ad4c2d27032
--- /dev/null
+++ b/packages/playground/vue-jsx/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "test-vue-jsx",
+ "private": true,
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "debug": "node --inspect-brk ../../vite/bin/vite"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue-jsx": "^1.0.0"
+ }
+}
diff --git a/packages/playground/vue-jsx/vite.config.js b/packages/playground/vue-jsx/vite.config.js
new file mode 100644
index 00000000000000..7e5f39e87bf0e6
--- /dev/null
+++ b/packages/playground/vue-jsx/vite.config.js
@@ -0,0 +1,8 @@
+const vueJsxPlugin = require('@vitejs/plugin-vue-jsx')
+
+/**
+ * @type {import('vite').UserConfig}
+ */
+module.exports = {
+ plugins: [vueJsxPlugin()]
+}
diff --git a/packages/plugin-react-refresh/index.d.ts b/packages/plugin-react-refresh/index.d.ts
index ef51a65f489f27..77dc36bb496444 100644
--- a/packages/plugin-react-refresh/index.d.ts
+++ b/packages/plugin-react-refresh/index.d.ts
@@ -1,5 +1,5 @@
import { Plugin } from 'vite'
-declare function reactRefresh(): Plugin
+declare function createPlugin(): Plugin
-export = reactRefresh
+export = createPlugin
diff --git a/packages/plugin-react-refresh/index.js b/packages/plugin-react-refresh/index.js
index 3c0c9cbfb4e9d5..f8b5c5c67adfcc 100644
--- a/packages/plugin-react-refresh/index.js
+++ b/packages/plugin-react-refresh/index.js
@@ -24,7 +24,7 @@ export default exports
/**
* Transform plugin for transforming and injecting per-file refresh code.
*
- * @type { () => import('vite').Plugin }
+ * @returns {import('vite').Plugin}
*/
module.exports = function reactRefreshPlugin() {
let shouldSkip = false
diff --git a/packages/plugin-vue-jsx/LICENSE b/packages/plugin-vue-jsx/LICENSE
new file mode 100644
index 00000000000000..9c1b313d7b1816
--- /dev/null
+++ b/packages/plugin-vue-jsx/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019-present, Yuxi (Evan) You and Vite contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/plugin-vue-jsx/README.md b/packages/plugin-vue-jsx/README.md
new file mode 100644
index 00000000000000..fcac94738f18bf
--- /dev/null
+++ b/packages/plugin-vue-jsx/README.md
@@ -0,0 +1,14 @@
+# @vitejs/plugin-vue-jsx
+
+Provides optimized Vue 3 JSX support via [@vue/babel-plugin-jsx](https://github.com/vuejs/jsx-next).
+
+```js
+// vite.config.js
+import vueJsx from '@vitejs/plugin-vue-jsx'
+
+export default {
+ plugins: [vueJsx({
+ // options are passed on to @vue/babel-plugin-jsx
+ })]
+}
+```
diff --git a/packages/plugin-vue-jsx/index.d.ts b/packages/plugin-vue-jsx/index.d.ts
new file mode 100644
index 00000000000000..faabb66bab0f86
--- /dev/null
+++ b/packages/plugin-vue-jsx/index.d.ts
@@ -0,0 +1,13 @@
+import { Plugin } from 'vite'
+
+// https://github.com/vuejs/jsx-next/tree/dev/packages/babel-plugin-jsx#options
+export interface Options {
+ transformOn?: boolean
+ optimize?: boolean
+ isCustomElement?: (tag: string) => boolean
+ mergeProps?: boolean
+}
+
+declare function createPlugin(options?: Options): Plugin
+
+export default createPlugin
diff --git a/packages/plugin-vue-jsx/index.js b/packages/plugin-vue-jsx/index.js
new file mode 100644
index 00000000000000..51a1ca61739c94
--- /dev/null
+++ b/packages/plugin-vue-jsx/index.js
@@ -0,0 +1,209 @@
+// @ts-check
+const babel = require('@babel/core')
+const jsx = require('@vue/babel-plugin-jsx')
+const importMeta = require('@babel/plugin-syntax-import-meta')
+const hash = require('hash-sum')
+
+/**
+ * @param {import('.').Options} options
+ * @returns {import('vite').Plugin}
+ */
+module.exports = function vueJsxPlugin(options = {}) {
+ let needHmr = false
+
+ return {
+ name: 'vue-jsx',
+
+ config(config) {
+ return {
+ esbuild: false,
+ define: {
+ __VUE_OPTIONS_API__: true,
+ __VUE_PROD_DEVTOOLS__: false,
+ ...config.define
+ }
+ }
+ },
+
+ configResolved(config) {
+ needHmr = config.command === 'serve' && !config.isProduction
+ },
+
+ transform(code, id) {
+ if (/\.[jt]sx$/.test(id)) {
+ const plugins = [importMeta, [jsx, options]]
+ if (id.endsWith('.tsx')) {
+ plugins.push([
+ require('@babel/plugin-transform-typescript'),
+ // @ts-ignore
+ { isTSX: true, allowExtensions: true }
+ ])
+ }
+
+ const result = babel.transformSync(code, {
+ ast: true,
+ plugins,
+ sourceMaps: true,
+ sourceFileName: id
+ })
+
+ if (!needHmr) {
+ return {
+ code: result.code,
+ map: result.map
+ }
+ }
+
+ // check for hmr injection
+ /**
+ * @type {{ name: string, hash: string }[]}
+ */
+ const declaredComponents = []
+ /**
+ * @type {{
+ * local: string,
+ * exported: string,
+ * id: string,
+ * hash: string
+ * }[]}
+ */
+ const hotComponents = []
+ let hasDefault = false
+
+ for (const node of result.ast.program.body) {
+ if (node.type === 'VariableDeclaration') {
+ const names = parseComponentDecls(node, code)
+ if (names.length) {
+ declaredComponents.push(...names)
+ }
+ }
+
+ if (node.type === 'ExportNamedDeclaration') {
+ if (
+ node.declaration &&
+ node.declaration.type === 'VariableDeclaration'
+ ) {
+ hotComponents.push(
+ ...parseComponentDecls(node.declaration, code).map(
+ ({ name, hash: _hash }) => ({
+ local: name,
+ exported: name,
+ id: hash(id + name),
+ hash: _hash
+ })
+ )
+ )
+ } else if (node.specifiers.length) {
+ for (const spec of node.specifiers) {
+ if (
+ spec.type === 'ExportSpecifier' &&
+ spec.exported.type === 'Identifier'
+ ) {
+ const matched = declaredComponents.find(
+ ({ name }) => name === spec.local.name
+ )
+ if (matched) {
+ hotComponents.push({
+ local: spec.local.name,
+ exported: spec.exported.name,
+ id: hash(id + spec.exported.name),
+ hash: matched.hash
+ })
+ }
+ }
+ }
+ }
+ }
+
+ if (node.type === 'ExportDefaultDeclaration') {
+ if (node.declaration.type === 'Identifier') {
+ const _name = node.declaration.name
+ const matched = declaredComponents.find(
+ ({ name }) => name === _name
+ )
+ if (matched) {
+ hotComponents.push({
+ local: node.declaration.name,
+ exported: 'default',
+ id: hash(id + 'default'),
+ hash: matched.hash
+ })
+ }
+ } else if (isDefineComponentCall(node.declaration)) {
+ hasDefault = true
+ hotComponents.push({
+ local: '__default__',
+ exported: 'default',
+ id: hash(id + 'default'),
+ hash: hash(
+ code.slice(node.declaration.start, node.declaration.end)
+ )
+ })
+ }
+ }
+ }
+
+ if (hotComponents.length) {
+ let code = result.code
+ if (hasDefault) {
+ code =
+ code.replace(
+ /export default defineComponent/g,
+ `const __default__ = defineComponent`
+ ) + `\nexport default __default__`
+ }
+
+ let callbackCode = ``
+ for (const { local, exported, id, hash } of hotComponents) {
+ code +=
+ `\n${local}.__hmrId = "${id}"` +
+ `\n${local}.__hmrHash = "${hash}"` +
+ `\n__VUE_HMR_RUNTIME__.createRecord("${id}", ${local})`
+ callbackCode +=
+ `\n if (__${exported}.__hmrHash !== ${local}.__hmrHash) ` +
+ `__VUE_HMR_RUNTIME__.reload("${id}", __${exported})`
+ }
+
+ code += `\nimport.meta.hot.accept(({${hotComponents
+ .map((c) => `${c.exported}: __${c.exported}`)
+ .join(',')}}) => {${callbackCode}\n})`
+
+ result.code = code
+ }
+
+ return {
+ code: result.code,
+ map: result.map
+ }
+ }
+ }
+ }
+}
+
+/**
+ * @param {import('@babel/core').types.VariableDeclaration} node
+ * @param {string} source
+ */
+function parseComponentDecls(node, source) {
+ const names = []
+ for (const decl of node.declarations) {
+ if (decl.id.type === 'Identifier' && isDefineComponentCall(decl.init)) {
+ names.push({
+ name: decl.id.name,
+ hash: hash(source.slice(decl.init.start, decl.init.end))
+ })
+ }
+ }
+ return names
+}
+
+/**
+ * @param {import('@babel/core').types.Node} node
+ */
+function isDefineComponentCall(node) {
+ return (
+ node.type === 'CallExpression' &&
+ node.callee.type === 'Identifier' &&
+ node.callee.name === 'defineComponent'
+ )
+}
diff --git a/packages/plugin-vue-jsx/package.json b/packages/plugin-vue-jsx/package.json
new file mode 100644
index 00000000000000..497f1eca1d7d3e
--- /dev/null
+++ b/packages/plugin-vue-jsx/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "@vitejs/plugin-vue-jsx",
+ "version": "1.0.0",
+ "license": "MIT",
+ "author": "Evan You",
+ "files": [
+ "index.js"
+ ],
+ "main": "index.js",
+ "types": "index.d.ts",
+ "scripts": {
+ "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s --commit-path . --lerna-package plugin-vue-jsx",
+ "release": "node ../../scripts/release.js --skipBuild"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/vitejs/vite.git"
+ },
+ "bugs": {
+ "url": "https://github.com/vitejs/vite/issues"
+ },
+ "homepage": "https://github.com/vitejs/vite/tree/main/packages/plugin-vue-jsx#readme",
+ "dependencies": {
+ "@babel/core": "^7.12.10",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-transform-typescript": "^7.12.1",
+ "@vue/babel-plugin-jsx": "^1.0.0",
+ "hash-sum": "^2.0.0"
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index d65430302fbb2f..3c79bf50a1dc0c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -111,7 +111,7 @@
resolved "https://registry.yarnpkg.com/@arr/every/-/every-1.0.1.tgz#22fe1f8e6355beca6c7c7bde965eb15cf994387b"
integrity sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
@@ -139,7 +139,7 @@
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/generator@^7.12.10":
+"@babel/generator@^7.12.10", "@babel/generator@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af"
integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==
@@ -148,7 +148,18 @@
jsesc "^2.5.1"
source-map "^0.5.0"
-"@babel/helper-function-name@^7.10.4":
+"@babel/helper-create-class-features-plugin@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e"
+ integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==
+ dependencies:
+ "@babel/helper-function-name" "^7.10.4"
+ "@babel/helper-member-expression-to-functions" "^7.12.1"
+ "@babel/helper-optimise-call-expression" "^7.10.4"
+ "@babel/helper-replace-supers" "^7.12.1"
+ "@babel/helper-split-export-declaration" "^7.10.4"
+
+"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42"
integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==
@@ -164,14 +175,14 @@
dependencies:
"@babel/types" "^7.12.10"
-"@babel/helper-member-expression-to-functions@^7.12.7":
+"@babel/helper-member-expression-to-functions@^7.12.1", "@babel/helper-member-expression-to-functions@^7.12.7":
version "7.12.7"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855"
integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==
dependencies:
"@babel/types" "^7.12.7"
-"@babel/helper-module-imports@^7.12.1":
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1":
version "7.12.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb"
integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==
@@ -193,7 +204,7 @@
"@babel/types" "^7.12.1"
lodash "^4.17.19"
-"@babel/helper-optimise-call-expression@^7.12.10":
+"@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10":
version "7.12.10"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d"
integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==
@@ -222,7 +233,7 @@
dependencies:
"@babel/types" "^7.12.1"
-"@babel/helper-split-export-declaration@^7.11.0":
+"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a"
integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==
@@ -252,7 +263,7 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.12.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.7", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6":
+"@babel/parser@^7.1.0", "@babel/parser@^7.12.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79"
integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==
@@ -292,6 +303,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
+"@babel/plugin-syntax-jsx@^7.0.0":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926"
+ integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
@@ -341,6 +359,22 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
+"@babel/plugin-syntax-typescript@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5"
+ integrity sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-typescript@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4"
+ integrity sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-typescript" "^7.12.1"
+
"@babel/runtime@^7.12.5":
version "7.12.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
@@ -348,7 +382,7 @@
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.3.3":
+"@babel/template@^7.0.0", "@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.3.3":
version "7.12.7"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc"
integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==
@@ -357,6 +391,21 @@
"@babel/parser" "^7.12.7"
"@babel/types" "^7.12.7"
+"@babel/traverse@^7.0.0":
+ version "7.12.12"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376"
+ integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==
+ dependencies:
+ "@babel/code-frame" "^7.12.11"
+ "@babel/generator" "^7.12.11"
+ "@babel/helper-function-name" "^7.12.11"
+ "@babel/helper-split-export-declaration" "^7.12.11"
+ "@babel/parser" "^7.12.11"
+ "@babel/types" "^7.12.12"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.19"
+
"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5":
version "7.12.10"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.10.tgz#2d1f4041e8bf42ea099e5b2dc48d6a594c00017a"
@@ -381,6 +430,15 @@
lodash "^4.17.19"
to-fast-properties "^2.0.0"
+"@babel/types@^7.12.12":
+ version "7.12.12"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299"
+ integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ lodash "^4.17.19"
+ to-fast-properties "^2.0.0"
+
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -1060,6 +1118,26 @@
"@typescript-eslint/types" "4.11.0"
eslint-visitor-keys "^2.0.0"
+"@vue/babel-helper-vue-transform-on@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.0.tgz#8cbec6bbcae53626ad70139061be5e73403c9a62"
+ integrity sha512-svFuKPoXP92TJ76ztENOglOsLjcMGUXkdeQhYDxl6KBnZCpqFjqx6RodUPWFg1bj4zsUVsfoIh1RibLO86fUUQ==
+
+"@vue/babel-plugin-jsx@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.0.tgz#1dabe1cf8588d088226fd5666ff1987f2f11982d"
+ integrity sha512-WoqRUaslY52PKJFcd7PZExAxhvm6xU5u47l2xFi+UbywzTh/vU2WwgGg3rA2N1HqYJbWFT9hDGFcFqOT6hcBHw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/plugin-syntax-jsx" "^7.0.0"
+ "@babel/template" "^7.0.0"
+ "@babel/traverse" "^7.0.0"
+ "@babel/types" "^7.0.0"
+ "@vue/babel-helper-vue-transform-on" "^1.0.0"
+ camelcase "^6.0.0"
+ html-tags "^3.1.0"
+ svg-tags "^1.0.0"
+
"@vue/compiler-core@3.0.4":
version "3.0.4"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.0.4.tgz#0122aca6eada4cb28b39ed930af917444755e330"
@@ -3501,6 +3579,11 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+html-tags@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
+ integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
+
http-proxy@^1.18.1:
version "1.18.1"
resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
@@ -7036,6 +7119,11 @@ supports-hyperlinks@^2.0.0:
has-flag "^4.0.0"
supports-color "^7.0.0"
+svg-tags@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+ integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
+
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"