diff --git a/.eslintignore b/.eslintignore index 7cd225a07..ba322b37b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,3 +4,4 @@ packages/test temp entry-wc.js dist +__testfixtures__ diff --git a/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/customConfig.input.js b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/customConfig.input.js new file mode 100644 index 000000000..b4a768fc2 --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/customConfig.input.js @@ -0,0 +1,7 @@ +module.exports = { + presets: [ + ["@vue/app", { + polyfills: [] + }] + ] +} diff --git a/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/customConfig.output.js b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/customConfig.output.js new file mode 100644 index 000000000..d30a124a5 --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/customConfig.output.js @@ -0,0 +1,7 @@ +module.exports = { + presets: [ + ["@vue/cli-plugin-babel/preset", { + polyfills: [] + }] + ] +} diff --git a/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/default.input.js b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/default.input.js new file mode 100644 index 000000000..2c6def6be --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/default.input.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ["@vue/app"] +} diff --git a/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/default.output.js b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/default.output.js new file mode 100644 index 000000000..db68ff187 --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/default.output.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ["@vue/cli-plugin-babel/preset"] +} diff --git a/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/require.input.js b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/require.input.js new file mode 100644 index 000000000..890aea29c --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/require.input.js @@ -0,0 +1,9 @@ +const config = { + presets: [ + [require("@vue/babel-preset-app"), { + polyfills: [] + }] + ] +} + +module.exports = config diff --git a/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/require.output.js b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/require.output.js new file mode 100644 index 000000000..37904275d --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/require.output.js @@ -0,0 +1,9 @@ +const config = { + presets: [ + [require("@vue/cli-plugin-babel/preset"), { + polyfills: [] + }] + ] +} + +module.exports = config diff --git a/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/templateLiteral.input.js b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/templateLiteral.input.js new file mode 100644 index 000000000..1bba2e81c --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/templateLiteral.input.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [`@vue/app`] +} diff --git a/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/templateLiteral.output.js b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/templateLiteral.output.js new file mode 100644 index 000000000..e021cd25f --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__testfixtures__/templateLiteral.output.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [`@vue/cli-plugin-babel/preset`] +} diff --git a/packages/@vue/cli-plugin-babel/codemods/__tests__/usePluginPreset.spec.js b/packages/@vue/cli-plugin-babel/codemods/__tests__/usePluginPreset.spec.js new file mode 100644 index 000000000..d07395c8c --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/__tests__/usePluginPreset.spec.js @@ -0,0 +1,9 @@ +jest.autoMockOff() + +const { defineTest } = require('jscodeshift/dist/testUtils') + +defineTest(__dirname, 'usePluginPreset', null, 'default') +defineTest(__dirname, 'usePluginPreset', null, 'customConfig') +defineTest(__dirname, 'usePluginPreset', null, 'require') +defineTest(__dirname, 'usePluginPreset', null, 'templateLiteral') + diff --git a/packages/@vue/cli-plugin-babel/codemods/usePluginPreset.js b/packages/@vue/cli-plugin-babel/codemods/usePluginPreset.js new file mode 100644 index 000000000..520958000 --- /dev/null +++ b/packages/@vue/cli-plugin-babel/codemods/usePluginPreset.js @@ -0,0 +1,41 @@ +module.exports = function (fileInfo, api) { + const j = api.jscodeshift + const root = j(fileInfo.source) + + root + .find(j.Literal, { value: '@vue/app' }) + .forEach(({ node }) => { + node.value = '@vue/cli-plugin-babel/preset' + }) + root + .find(j.Literal, { value: '@vue/babel-preset-app' }) + .forEach(({ node }) => { + node.value = '@vue/cli-plugin-babel/preset' + }) + + const templateLiterals = root + .find(j.TemplateLiteral, { + expressions: { length: 0 } + }) + + templateLiterals + .find(j.TemplateElement, { + value: { + cooked: '@vue/app' + } + }) + .forEach(({ node }) => { + node.value = { cooked: '@vue/cli-plugin-babel/preset', raw: '@vue/cli-plugin-babel/preset' } + }) + templateLiterals + .find(j.TemplateElement, { + value: { + cooked: '@vue/babel-preset-app' + } + }) + .forEach(({ node }) => { + node.value = { cooked: '@vue/cli-plugin-babel/preset', raw: '@vue/cli-plugin-babel/preset' } + }) + + return root.toSource() +} diff --git a/packages/@vue/cli-plugin-babel/migrator/index.js b/packages/@vue/cli-plugin-babel/migrator/index.js index ea7420988..13544815b 100644 --- a/packages/@vue/cli-plugin-babel/migrator/index.js +++ b/packages/@vue/cli-plugin-babel/migrator/index.js @@ -1,16 +1,6 @@ const { chalk } = require('@vue/cli-shared-utils') module.exports = (api) => { - // TODO: backport this part to v3 - // if (api.fromVersion('<=3.5.3')) { - // // add core-js@2 as dependency - // api.extendPackage({ - // dependencies: { - // 'core-js': '^2.6.5' - // } - // }) - // } - if (api.fromVersion('^3')) { api.extendPackage({ dependencies: { @@ -18,6 +8,8 @@ module.exports = (api) => { } }, true) + api.transformScript('babel.config.js', require('../codemods/usePluginPreset')) + // TODO: implement a codemod to migrate polyfills api.exitLog(`core-js has been upgraded from v2 to v3. If you have any custom polyfills defined in ${chalk.yellow('babael.config.js')}, please be aware their names may have been changed. diff --git a/packages/@vue/cli-plugin-babel/package.json b/packages/@vue/cli-plugin-babel/package.json index f6a6b1857..d8535adf3 100644 --- a/packages/@vue/cli-plugin-babel/package.json +++ b/packages/@vue/cli-plugin-babel/package.json @@ -29,6 +29,9 @@ "peerDependencies": { "@vue/cli-service": "^3.0.0 || ^4.0.0-0" }, + "devDependencies": { + "jscodeshift": "^0.6.4" + }, "publishConfig": { "access": "public" }