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"