Skip to content

Commit

Permalink
Add preset-flow if .flowconfig is detected (#21)
Browse files Browse the repository at this point in the history
  • Loading branch information
existentialism authored and hzoo committed Feb 21, 2018
1 parent 74ab67b commit 707a4a0
Show file tree
Hide file tree
Showing 6 changed files with 158 additions and 47 deletions.
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;
}

0 comments on commit 707a4a0

Please sign in to comment.