Pre-release version fix (#12148)
* Ran updated release script to fix deps * Release script handles prerelease deps correctly * Update noop-renderer dependencies on reconciler package
Brian Vaughn committed
Feb 4, 2018 at 08:54 UTC
dc271876a225d6efc7f13c07f82aba6cba2f39c7
9 files changed
+78
-9
packages/react-art/package.json
+1
-1
@@ -26,7 +26,7 @@
26
"prop-types": "^15.6.0"
27
},
28
"peerDependencies": {
29
- "react": "^16.0.0"
29
+ "react": "^16.0.0 || 16.3.0-alpha.0"
30
},
31
"files": [
32
"LICENSE",
packages/react-call-return/package.json
+1
-1
@@ -14,6 +14,6 @@
14
"object-assign": "^4.1.1"
15
},
16
"peerDependencies": {
17
- "react": "^16.0.0"
17
+ "react": "^16.0.0 || 16.3.0-alpha.0"
18
}
19
}
packages/react-dom/package.json
+1
-1
@@ -19,7 +19,7 @@
19
"prop-types": "^15.6.0"
20
},
21
"peerDependencies": {
22
- "react": "^16.0.0"
22
+ "react": "^16.0.0 || 16.3.0-alpha.0"
23
},
24
"files": [
25
"LICENSE",
packages/react-noop-renderer/package.json
+1
-1
@@ -11,7 +11,7 @@
11
"object-assign": "^4.1.1",
12
"prop-types": "^15.6.0",
13
"regenerator-runtime": "^0.11.0",
14
- "react-reconciler": "*"
14
+ "react-reconciler": "* || 0.8.0-alpha.0"
15
},
16
"peerDependencies": {
17
"react": "^16.0.0"
packages/react-reconciler/package.json
+1
-1
@@ -21,7 +21,7 @@
21
"node": ">=0.10.0"
22
},
23
"peerDependencies": {
24
- "react": "^16.0.0"
24
+ "react": "^16.0.0 || 16.3.0-alpha.0"
25
},
26
"dependencies": {
27
"fbjs": "^0.8.16",
packages/react-test-renderer/package.json
+1
-1
@@ -20,7 +20,7 @@
20
"prop-types": "^15.6.0"
21
},
22
"peerDependencies": {
23
- "react": "^16.0.0"
23
+ "react": "^16.0.0 || 16.3.0-alpha.0"
24
},
25
"files": [
26
"LICENSE",
scripts/release/build-commands/update-noop-renderer-dependencies.js
new
+44
@@ -0,0 +1,44 @@
1
+#!/usr/bin/env node
2
+
3
+'use strict';
4
+
5
+const {readJson, writeJson} = require('fs-extra');
6
+const {join} = require('path');
7
+const semver = require('semver');
8
+const {execUnlessDry, logPromise} = require('../utils');
9
+
10
+const getReactReconcilerVersion = async cwd => {
11
+ const path = join(cwd, 'packages', 'react-reconciler', 'package.json');
12
+ const json = await readJson(path);
13
+ return json.version;
14
+};
15
+
16
+const update = async ({cwd, dry}) => {
17
+ const path = join(cwd, 'packages', 'react-noop-renderer', 'package.json');
18
+ const json = await readJson(path);
19
+
20
+ // IMPORTANT: This script must be run after update-package-versions,
21
+ // Since it depends up the updated react-reconciler version.
22
+ const reconcilerVersion = await getReactReconcilerVersion(cwd);
23
+
24
+ // There is no wildcard for semver that includes prerelease ranges as well.
25
+ // This causes problems for our Yarn workspaces setup,
26
+ // Since the noop-renderer depends on react-reconciler.
27
+ // So we have a special case check for this that ensures semver compatibility.
28
+ if (semver.prerelease(reconcilerVersion)) {
29
+ json.dependencies['react-reconciler'] = `* || ${reconcilerVersion}`;
30
+ } else {
31
+ json.dependencies['react-reconciler'] = '*';
32
+ }
33
+
34
+ await writeJson(path, json, {spaces: 2});
35
+
36
+ await execUnlessDry(
37
+ `git commit -am "Updating dependencies for react-noop-renderer"`,
38
+ {cwd, dry}
39
+ );
40
+};
41
+
42
+module.exports = async params => {
43
+ return logPromise(update(params), 'Updating noop renderer dependencies');
44
+};
scripts/release/build-commands/update-package-versions.js
+26
-3
@@ -30,30 +30,53 @@ const update = async ({cwd, dry, packages, version}) => {
30
const updateProjectPackage = async project => {
31
const path = join(cwd, 'packages', project, 'package.json');
32
const json = await readJson(path);
33
+ const prerelease = semver.prerelease(version);
34
35
// Unstable packages (eg version < 1.0) are treated specially:
36
// Rather than use the release version (eg 16.1.0)-
37
// We just auto-increment the minor version (eg 0.1.0 -> 0.2.0).
38
// If we're doing a prerelease, we also append the suffix (eg 0.2.0-beta).
39
if (semver.lt(json.version, '1.0.0')) {
39
- const prerelease = semver.prerelease(version);
40
let suffix = '';
41
if (prerelease) {
42
suffix = `-${prerelease.join('.')}`;
43
}
44
45
- json.version = `0.${semver.minor(json.version) + 1}.0${suffix}`;
45
+ // If this is a new pre-release, increment the minor.
46
+ // Else just increment (or remove) the pre-release suffix.
47
+ // This way our minor version isn't incremented unnecessarily with each prerelease.
48
+ const minor = semver.prerelease(json.version)
49
+ ? semver.minor(json.version)
50
+ : semver.minor(json.version) + 1;
51
+
52
+ json.version = `0.${minor}.0${suffix}`;
53
} else {
54
json.version = version;
55
}
56
57
if (project !== 'react') {
51
- const peerVersion = json.peerDependencies.react.replace('^', '');
58
+ let peerVersion = json.peerDependencies.react.replace('^', '');
59
+
60
+ // If the previous release was a pre-release version,
61
+ // The peer dependency will contain multiple versions, eg "^16.0.0 || 16.3.0-alpha.0"
62
+ // In this case, assume the first one will be the major and extract it.
63
+ if (peerVersion.includes(' || ')) {
64
+ peerVersion = peerVersion.split(' || ')[0];
65
+ }
66
67
// Release engineers can manually update minor and bugfix versions,
68
// But we should ensure that major versions always match.
69
if (semver.major(version) !== semver.major(peerVersion)) {
70
json.peerDependencies.react = `^${semver.major(version)}.0.0`;
71
+ } else {
72
+ json.peerDependencies.react = `^${peerVersion}`;
73
+ }
74
+
75
+ // If this is a prerelease, update the react dependency as well.
76
+ // A dependency on a major version won't satisfy a prerelease version.
77
+ // So rather than eg "^16.0.0" we need "^16.0.0 || 16.3.0-alpha.0"
78
+ if (prerelease) {
79
+ json.peerDependencies.react += ` || ${version}`;
80
}
81
}
82
scripts/release/build.js
+2
@@ -23,6 +23,7 @@ const run = async () => {
23
const runAutomatedTests = require('./build-commands/run-automated-tests');
24
const runAutomatedBundleTests = require('./build-commands/run-automated-bundle-tests');
25
const updateGit = require('./build-commands/update-git');
26
+ const updateNoopRendererDependencies = require('./build-commands/update-noop-renderer-dependencies');
27
const updatePackageVersions = require('./build-commands/update-package-versions');
28
const updateYarnDependencies = require('./build-commands/update-yarn-dependencies');
29
const validateVersion = require('./build-commands/validate-version');
@@ -42,6 +43,7 @@ const run = async () => {
43
await updateYarnDependencies(params);
44
await runAutomatedTests(params);
45
await updatePackageVersions(params);
46
+ await updateNoopRendererDependencies(params);
47
await buildArtifacts(params);
48
await runAutomatedBundleTests(params);
49
await addGitTag(params);