Skip to content

Add preset-flow if .flowconfig is detected #21

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 73 additions & 27 deletions __tests__/__snapshots__/packageData.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,78 @@ Object {
}
`;

exports[`packages - earlier v7 1`] = `
exports[`scripts 1`] = `
Object {
"name": "mocha-scripts-test",
"scripts": Object {
"coverage": "NODE_ENV=test nyc --reporter=lcov --reporter=text _mocha --require @babel/register test/*.js",
"prepublish": "npm run test",
"test": "mocha --compilers js:@babel/register --require @babel/polyfill test/*Test.js",
"test2": "mocha --compilers js:@babel/register --require @babel/polyfill test/*Test.js",
},
}
`;

exports[`scripts 2`] = `
Object {
"devDependencies": Object {
"@babel/cli": "7.0.0-beta.39",
"@babel/node": "7.0.0-beta.39",
},
"name": "scripts-babel-node",
"scripts": Object {
"test": "babel-node",
},
}
`;

exports[`upgradeDeps adds flow preset if user is upgrading from previous v7 1`] = `
Object {
"@babel/core": "7.0.0-beta.39",
"@babel/preset-flow": "7.0.0-beta.39",
"@babel/preset-react": "7.0.0-beta.39",
}
`;

exports[`upgradeDeps adds flow preset if user was using v6 preset-react 1`] = `
Object {
"@babel/core": "7.0.0-beta.39",
"@babel/preset-flow": "7.0.0-beta.39",
"@babel/preset-react": "7.0.0-beta.39",
}
`;

exports[`upgradeDeps does not add flow preset if user is upgrading from previous v7 but flow not detected 1`] = `
Object {
"@babel/core": "7.0.0-beta.39",
"@babel/preset-react": "7.0.0-beta.39",
}
`;

exports[`upgradeDeps does not add flow preset if user was using v6 preset-react but flow not detected 1`] = `
Object {
"@babel/core": "7.0.0-beta.39",
"@babel/preset-react": "7.0.0-beta.39",
}
`;

exports[`upgradeDeps handles flow preset if user had entry and is upgrading from previous v7 1`] = `
Object {
"@babel/core": "7.0.0-beta.39",
"@babel/preset-flow": "7.0.0-beta.39",
"@babel/preset-react": "7.0.0-beta.39",
}
`;

exports[`upgradeDeps handles flow preset if user had entry and is upgrading from previous v7 and flow not detected 1`] = `
Object {
"@babel/core": "7.0.0-beta.39",
"@babel/preset-flow": "7.0.0-beta.39",
"@babel/preset-react": "7.0.0-beta.39",
}
`;

exports[`upgradeDeps upgrades from earlier v7 version 1`] = `
Object {
"@babel/core": "7.0.0-beta.39",
"@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.39",
Expand All @@ -38,7 +109,7 @@ Object {
}
`;

exports[`packages 1`] = `
exports[`upgradeDeps upgrades from v6 1`] = `
Object {
"@babel/cli": "7.0.0-beta.39",
"@babel/code-frame": "7.0.0-beta.39",
Expand Down Expand Up @@ -173,28 +244,3 @@ Object {
"babel-loader": "v8.0.0-beta.0",
}
`;

exports[`scripts 1`] = `
Object {
"name": "mocha-scripts-test",
"scripts": Object {
"coverage": "NODE_ENV=test nyc --reporter=lcov --reporter=text _mocha --require @babel/register test/*.js",
"prepublish": "npm run test",
"test": "mocha --compilers js:@babel/register --require @babel/polyfill test/*Test.js",
"test2": "mocha --compilers js:@babel/register --require @babel/polyfill test/*Test.js",
},
}
`;

exports[`scripts 2`] = `
Object {
"devDependencies": Object {
"@babel/cli": "7.0.0-beta.39",
"@babel/node": "7.0.0-beta.39",
},
"name": "scripts-babel-node",
"scripts": Object {
"test": "babel-node",
},
}
`;
66 changes: 54 additions & 12 deletions __tests__/packageData.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,65 @@ const depsFixtureEarlierBeta = require('../fixtures/deps-earlier-beta.json');
const scriptsMochaFixture = require('../fixtures/scripts-mocha');
const scriptsBabelNodeFixture = require('../fixtures/scripts-babel-node');

test('packages', () => {
expect(upgradeDeps(depsFixture, "7.0.0-beta.39")).toMatchSnapshot();
});
const VERSION = "7.0.0-beta.39";

describe('upgradeDeps', () => {
test('upgrades from v6', () => {
expect(upgradeDeps(depsFixture, VERSION)).toMatchSnapshot();
});

test('upgrades from earlier v7 version', () => {
expect(upgradeDeps(depsFixtureEarlierBeta, VERSION)).toMatchSnapshot();
});

test('adds flow preset if user was using v6 preset-react', () => {
expect(upgradeDeps({
"babel-preset-react": "6.0.0"
}, VERSION, { hasFlow: true })).toMatchSnapshot();
});

test('does not add flow preset if user was using v6 preset-react but flow not detected', () => {
expect(upgradeDeps({
"babel-preset-react": "6.0.0"
}, VERSION, { hasFlow: false })).toMatchSnapshot();
});

test('adds flow preset if user is upgrading from previous v7', () => {
expect(upgradeDeps({
"@babel/preset-react": "7.0.0-alpha.0",
}, VERSION, { hasFlow: true })).toMatchSnapshot();
});

test('does not add flow preset if user is upgrading from previous v7 but flow not detected', () => {
expect(upgradeDeps({
"@babel/preset-react": "7.0.0-alpha.0",
}, VERSION, { hasFlow: false })).toMatchSnapshot();
});

test('handles flow preset if user had entry and is upgrading from previous v7', () => {
expect(upgradeDeps({
"@babel/preset-flow": "7.0.0-alpha.0",
"@babel/preset-react": "7.0.0-alpha.0",
}, VERSION, { hasFlow: true })).toMatchSnapshot();
});

test('scripts', () => {
expect(updatePackageJSON(scriptsMochaFixture)).toMatchSnapshot();
expect(updatePackageJSON(scriptsBabelNodeFixture)).toMatchSnapshot();
test('handles flow preset if user had entry and is upgrading from previous v7 and flow not detected', () => {
expect(upgradeDeps({
"@babel/preset-flow": "7.0.0-alpha.0",
"@babel/preset-react": "7.0.0-alpha.0",
}, VERSION, { hasFlow: false })).toMatchSnapshot();
});
});

test('@babel/core peerDep', () => {
expect(updatePackageJSON(babelCoreFixture)).toMatchSnapshot();
test('scripts', async () => {
expect(await updatePackageJSON(scriptsMochaFixture)).toMatchSnapshot();
expect(await updatePackageJSON(scriptsBabelNodeFixture)).toMatchSnapshot();
});

test('jest babel-core bridge', () => {
expect(updatePackageJSON(jestFixture)).toMatchSnapshot();
test('@babel/core peerDep', async () => {
expect(await updatePackageJSON(babelCoreFixture)).toMatchSnapshot();
});

test('packages - earlier v7', () => {
expect(upgradeDeps(depsFixtureEarlierBeta, "7.0.0-beta.39")).toMatchSnapshot();
test('jest babel-core bridge', async () => {
expect(await updatePackageJSON(jestFixture)).toMatchSnapshot();
});
12 changes: 9 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ npx babel-upgrade
- [ ] monorepo support
- [ ] `.babelrc.js` and other js files with a config like presets, `webpack.config.js`
- [ ] convert comma separated presets/plugins into an array
- [ ] handle react + flow preset being split. Read if `.flowconfig` and add it?
- [x] handle react + flow preset being split. Read if `.flowconfig` and add it?
- [ ] convert only/ignore?
- [ ] how do we want to handle spec/loose modes, especially when changing previous loose mode to spec (just warn?)
- [ ] remove `typeof-symbol` if using `@babel/preset-env` + loose
Expand Down
15 changes: 12 additions & 3 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
const globby = require('globby');
const path = require('path');
const readPkgUp = require('read-pkg-up');
const sortKeys = require('sort-keys');
Expand Down Expand Up @@ -34,7 +35,7 @@ function upgradeScripts(scripts) {
return scripts;
}

function updatePackageJSON(pkg) {
async function updatePackageJSON(pkg) {
if (process.env.NODE_ENV !== 'test') {
console.log("Updating closest package.json dependencies");
}
Expand All @@ -54,10 +55,17 @@ function updatePackageJSON(pkg) {
}
}

const flowConfigs = await globby(['**/.flowconfig', '!./node_modules/**']);

const upgradeDepOptions = {
hasFlow: flowConfigs.length > 0,
};

if (pkg.devDependencies) {
pkg.devDependencies = upgradeDeps(
pkg.devDependencies,
getLatestVersion()
getLatestVersion(),
upgradeDepOptions,
);

const devDeps = Object.keys(pkg.devDependencies);
Expand All @@ -73,7 +81,8 @@ function updatePackageJSON(pkg) {
if (pkg.dependencies) {
pkg.dependencies = sortKeys(upgradeDeps(
pkg.dependencies,
getLatestVersion()
getLatestVersion(),
upgradeDepOptions,
));
}

Expand Down
10 changes: 9 additions & 1 deletion src/upgradeDeps.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ const otherPackages = {
'babel-loader': 'v8.0.0-beta.0',
};

module.exports = function upgradeDeps(dependencies, version) {
module.exports = function upgradeDeps(dependencies, version, options = {}) {
const { hasFlow } = options;

for (let pkg of Object.keys(dependencies)) {
const depVersion = dependencies[pkg];
if (Object.keys(oldPackages).includes(pkg)) {
Expand Down Expand Up @@ -50,5 +52,11 @@ module.exports = function upgradeDeps(dependencies, version) {
dependencies['@babel/core'] = version;
}

// Adds preset-flow if needed, especially since it was split out of
// preset-react
if (hasFlow && !dependencies['@babel/preset-flow']) {
dependencies['@babel/preset-flow'] = version;
}

return dependencies;
}