babel-upgrade
A tool that tries to automatically update most dependencies, config files, and JavaScript files that require Babel packages directly to Babel 7 (and more in the future).
Usage
Requires nodejs 8 or newer
Run at the root of your git repo:
If using npm < v5.2.0, install npx globally.
# npx lets you run babel-upgrade without installing it locally npx babel-upgrade --write # or install globally and run npm install babel-upgrade -gbabel-upgrade --write
Without the --write
(or -w
) flag, babel-upgrade
will print a diff without writing any changes.
Optionally, add --install
(or -i
) as well to run yarn
or npm
after writing the upgrade.
npx babel-upgrade --write --install
Ideas from http://new.babeljs.io/docs/en/next/v7-migration.html (or modify that file if it's missing)
Todos
- Works on Node >= 8 (anything lower isn't supported in v7) (#16)
- Run npm/yarn after updating dependencies (use
--install
) (#18) - Update
package.json
:dependencies
anddevDependencies
to the "latest supported" version.
{ "devDependencies": {+ "@babel/core": "^7.0.0",+ "@babel/plugin-proposal-object-rest-spread": "^7.0.0",+ "@babel/preset-env": "^7.0.0",+ "babel-loader": "v8.0.0-beta.0"- "babel-loader": "6.0.0",- "babel-plugin-transform-object-rest-spread": "6.0.0",- "babel-preset-env": "^1.0.0", },}
- modify scripts for mocha +
@babel/register
(e81cf7)
{ "name": "mocha-scripts-test", "scripts": {- "test": "mocha --compilers js:babel-register --require babel-polyfill test/*Test.js",+ "test": "mocha --compilers js:@babel/register --require @babel/polyfill test/*Test.js", }}
- use
"babel-core": "^7.0.0-bridge-0"
if jest or jest-cli is a dependency (#14)
"devDependencies": { "@babel/core": "^7.0.0",+ "babel-core": "7.0.0-bridge.0", "jest": "^22.0.0"},"scripts": { "test": "jest"}
- add new
@babel/node
package ifbabel-node
is used (#14)
"devDependencies": { "@babel/cli": "^7.0.0",+ "@babel/node": "^7.0.0"},"scripts": { "start": "babel-node a.js"}
- Handle all nested
.babelrc
(#14)
- src/- example/ - .babelrc // now modifies these too- test/ - .babelrc // now modifies these too- `.babelrc`
- rename config files to swap shorthand form to long form
{ "presets": [+ "@babel/preset-env"- "env" ]}
-
package.json babel key
(d123ad)
{ "babel": { "presets": [+ "@babel/preset-env"- "env" ] }}
- handle
env
(e9fc42)
{ "babel": { "presets": [ "@babel/preset-env" ] }, "env": { "development": { "plugins": [- "transform-react-jsx-source",- "babel-plugin-transform-react-jsx-self"+ "@babel/plugin-transform-react-jsx-source",+ "@babel/plugin-transform-react-jsx-self", ] } }}
- Modify
mocha.opts
(e81cf7)
---require babel-register+--require @babel/register
- Convert comma separated presets/plugins into an array (#37)
{- "presets": "env, react",+ "presets": ["@babel/preset-env", "@babel/preset-react"],
- handle react + flow preset being split. Read if
.flowconfig
and add it? (#21)
{ "@babel/preset-react": "^7.0.0",+ "@babel/preset-flow": "^7.0.0"}
- Replace Stage presets with individual proposal plugins (#69)
{- "presets": ["@babel/preset-stage-3"],+ "presets": [],+ "plugins": [+ "@babel/plugin-syntax-dynamic-import",+ "@babel/plugin-syntax-import-meta",+ "@babel/plugin-proposal-class-properties",+ "@babel/plugin-proposal-json-strings"+ ]}
{- "@babel/preset-stage-3": "^7.0.0"+ "@babel/plugin-proposal-class-properties": "^7.0.0",+ "@babel/plugin-proposal-json-strings": "^7.0.0",+ "@babel/plugin-syntax-dynamic-import": "^7.0.0",+ "@babel/plugin-syntax-import-meta": "^7.0.0"}
- Log when replacing out preset-es2015,16,17,latest as FYI
- Figure out how to change nested .babelrcs into using "overrides" instead
- Monorepo support
-
.babelrc.js
and other js files with a config like presets,webpack.config.js
- convert
only
/ignore
if necessary - remove
typeof-symbol
if using@babel/preset-env
+ loose - Update test files that use babel directly (
babel-types
->@babel/types
,babel-core
)- Update all requires/imports
- Update the use of the Babel API (plugins, integrations)
- Modify other config files as we go
- Add to the upgrade guide which parts are autofixable and the command (if we care enough to make this individually runnable too infrastructure wise)
- May need to add a warning on any 3rd party plugins since they might not be compatible
- Handle the differences in plugins in v7 for default/loose/spec
- Should certain parts be generic (replace the string
babel-register
with@babel/register
)? Could be in a Makefile or somewhere else, but it's just find replace.
Philosophy
- Move this into the monorepo when somewhat ready
- Maybe move into
@babel/cli
? - Or just another package that is intended to be used via
npx/globally
- Maybe move into
- Whenever there is a breaking change in a PR we should also update this tool when possible or at least provide a warning
- What about with a regression?
- Can be used for non-major bumps too - just for updating to the latest version.
- Include mini-changelog?
- Maybe the version should just reflect the version that it targets?
Development
npm installnpm start