@samitouri / QOS-React-2 / commits / b5fbf5464b

Automated DevTools release process (#22161)

Brian Vaughn committed Aug 24, 2021 at 14:05 UTC b5fbf5464b7af9c0ba5d7eb32a03f0a17e54a413
11 files changed +1143 -114
package.json
-1
@@ -116,7 +116,6 @@
116 "extract-errors": "yarn build --type=dev --extract-errors",
117 "postinstall": "node node_modules/fbjs-scripts/node/check-dev-engines.js package.json && node ./scripts/flow/createFlowConfigs.js && node ./scripts/yarn/downloadReactIsForPrettyFormat.js",
118 "debug-test": "yarn test --deprecated 'yarn test --debug'",
119 - "generate-devtools-changelog": "node packages/react-devtools/get-commit-list.js",
119 "test": "node ./scripts/jest/jest-cli.js",
120 "test-stable": "node ./scripts/jest/jest-cli.js --release-channel=stable",
121 "test-www": "node ./scripts/jest/jest-cli.js --release-channel=www-modern",
packages/react-devtools-extensions/chrome/manifest.json
+14 -13
@@ -4,16 +4,13 @@
4 "description": "Adds React debugging tools to the Chrome Developer Tools.",
5 "version": "4.16.0",
6 "version_name": "4.16.0",
7 -
7 "minimum_chrome_version": "60",
9 -
8 "icons": {
9 "16": "icons/16-production.png",
10 "32": "icons/32-production.png",
11 "48": "icons/48-production.png",
12 "128": "icons/128-production.png"
13 },
16 -
14 "browser_action": {
15 "default_icon": {
16 "16": "icons/16-disabled.png",
@@ -21,12 +18,9 @@
18 "48": "icons/48-disabled.png",
19 "128": "icons/128-disabled.png"
20 },
24 -
21 "default_popup": "popups/disabled.html"
22 },
27 -
23 "devtools_page": "main.html",
29 -
24 "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
25 "web_accessible_resources": [
26 "main.html",
@@ -34,18 +28,25 @@
28 "build/react_devtools_backend.js",
29 "build/renderer.js"
30 ],
37 -
31 "background": {
39 - "scripts": ["build/background.js"],
32 + "scripts": [
33 + "build/background.js"
34 + ],
35 "persistent": false
36 },
42 -
43 - "permissions": ["file:///*", "http://*/*", "https://*/*"],
44 -
37 + "permissions": [
38 + "file:///*",
39 + "http://*/*",
40 + "https://*/*"
41 + ],
42 "content_scripts": [
43 {
47 - "matches": ["<all_urls>"],
48 - "js": ["build/injectGlobalHook.js"],
44 + "matches": [
45 + "<all_urls>"
46 + ],
47 + "js": [
48 + "build/injectGlobalHook.js"
49 + ],
50 "run_at": "document_start"
51 }
52 ]
packages/react-devtools-extensions/edge/manifest.json
+14 -13
@@ -4,16 +4,13 @@
4 "description": "Adds React debugging tools to the Microsoft Edge Developer Tools.",
5 "version": "4.16.0",
6 "version_name": "4.16.0",
7 -
7 "minimum_chrome_version": "60",
9 -
8 "icons": {
9 "16": "icons/16-production.png",
10 "32": "icons/32-production.png",
11 "48": "icons/48-production.png",
12 "128": "icons/128-production.png"
13 },
16 -
14 "browser_action": {
15 "default_icon": {
16 "16": "icons/16-disabled.png",
@@ -21,12 +18,9 @@
18 "48": "icons/48-disabled.png",
19 "128": "icons/128-disabled.png"
20 },
24 -
21 "default_popup": "popups/disabled.html"
22 },
27 -
23 "devtools_page": "main.html",
29 -
24 "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
25 "web_accessible_resources": [
26 "main.html",
@@ -34,18 +28,25 @@
28 "build/react_devtools_backend.js",
29 "build/renderer.js"
30 ],
37 -
31 "background": {
39 - "scripts": ["build/background.js"],
32 + "scripts": [
33 + "build/background.js"
34 + ],
35 "persistent": false
36 },
42 -
43 - "permissions": ["file:///*", "http://*/*", "https://*/*"],
44 -
37 + "permissions": [
38 + "file:///*",
39 + "http://*/*",
40 + "https://*/*"
41 + ],
42 "content_scripts": [
43 {
47 - "matches": ["<all_urls>"],
48 - "js": ["build/injectGlobalHook.js"],
44 + "matches": [
45 + "<all_urls>"
46 + ],
47 + "js": [
48 + "build/injectGlobalHook.js"
49 + ],
50 "run_at": "document_start"
51 }
52 ]
packages/react-devtools-extensions/firefox/manifest.json
+15 -13
@@ -3,21 +3,18 @@
3 "name": "React Developer Tools",
4 "description": "Adds React debugging tools to the Firefox Developer Tools.",
5 "version": "4.16.0",
6 -
6 "applications": {
7 "gecko": {
8 "id": "@react-devtools",
9 "strict_min_version": "55.0"
10 }
11 },
13 -
12 "icons": {
13 "16": "icons/16-production.png",
14 "32": "icons/32-production.png",
15 "48": "icons/48-production.png",
16 "128": "icons/128-production.png"
17 },
20 -
18 "browser_action": {
19 "default_icon": {
20 "16": "icons/16-disabled.png",
@@ -25,13 +22,10 @@
22 "48": "icons/48-disabled.png",
23 "128": "icons/128-disabled.png"
24 },
28 -
25 "default_popup": "popups/disabled.html",
26 "browser_style": true
27 },
32 -
28 "devtools_page": "main.html",
34 -
29 "content_security_policy": "script-src 'self' 'unsafe-eval' blob:; object-src 'self'",
30 "web_accessible_resources": [
31 "main.html",
@@ -39,17 +33,25 @@
33 "build/react_devtools_backend.js",
34 "build/renderer.js"
35 ],
42 -
36 "background": {
44 - "scripts": ["build/background.js"]
37 + "scripts": [
38 + "build/background.js"
39 + ]
40 },
46 -
47 - "permissions": ["file:///*", "http://*/*", "https://*/*", "clipboardWrite"],
48 -
41 + "permissions": [
42 + "file:///*",
43 + "http://*/*",
44 + "https://*/*",
45 + "clipboardWrite"
46 + ],
47 "content_scripts": [
48 {
51 - "matches": ["<all_urls>"],
52 - "js": ["build/injectGlobalHook.js"],
49 + "matches": [
50 + "<all_urls>"
51 + ],
52 + "js": [
53 + "build/injectGlobalHook.js"
54 + ],
55 "run_at": "document_start"
56 }
57 ]
packages/react-devtools/CHANGELOG.md
+1 -8
@@ -1,13 +1,6 @@
1 # React DevTools changelog
2
3 -<details>
4 - <summary>
5 - Changes that have landed in main but are not yet released.
6 - Click to see more.
7 - </summary>
8 -
9 - <!-- Upcoming changes go here -->
10 -</details>
3 +<!-- RELEASE_SCRIPT_TOKEN -->
4
5 ## 4.16.0 (August 16, 2021)
6 #### Features
packages/react-devtools/get-commit-list.js deleted
-66
@@ -1,66 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -const {execSync} = require('child_process');
9 -const readline = require('readline');
10 -
11 -const PULL_REQUEST_BASE_URL = 'https://github.com/facebook/react/pull/';
12 -
13 -const hashes = [];
14 -const lines = execSync(`
15 - git log --max-count=5 --topo-order --pretty=format:'%H:::%s:::%as' HEAD -- packages/react-devtools-core/package.json
16 -`)
17 - .toString()
18 - .trim()
19 - .split('\n');
20 -lines.forEach((line, index) => {
21 - const [hash, message, date] = line.split(':::');
22 - hashes.push(hash);
23 - console.log(
24 - `\x1b[1m(${index + 1})\x1b[0m ${message} \x1b[2m(${date})\x1b[0m`,
25 - );
26 -});
27 -
28 -const prompt = readline.createInterface({
29 - input: process.stdin,
30 - output: process.stdout,
31 -});
32 -prompt.question(
33 - '\n' +
34 - '\x1b[1m' +
35 - 'Which of the commits above marks the last DevTools release?' +
36 - '\x1b[0m ',
37 - numberString => {
38 - const hashIndex = parseInt(numberString, 10) - 1;
39 - const hash = hashes[hashIndex];
40 -
41 - let formattedLog = '';
42 -
43 - const rawLog = execSync(`
44 - git log --topo-order --pretty=format:'%s' ${hash}...HEAD -- packages/react-devtools*
45 - `)
46 - .toString()
47 - .trim();
48 - rawLog.split('\n').forEach(line => {
49 - line = line.replace('[DevTools] ', '');
50 -
51 - const match = line.match(/(.+) \(#([0-9]+)\)/);
52 - if (match !== null) {
53 - const title = match[1];
54 - const pr = match[2];
55 -
56 - formattedLog += `\n* ${title} \x1b[31m([USERNAME](https://github.com/USERNAME)\x1b[0m in [#${pr}](\x1b[4m\x1b[34m${PULL_REQUEST_BASE_URL}${pr}\x1b[0m))`;
57 - } else {
58 - formattedLog += `\n* ${line}`;
59 - }
60 - });
61 -
62 - console.log(formattedLog);
63 -
64 - prompt.close();
65 - },
66 -);
scripts/devtools/.gitignore new
+1
@@ -0,0 +1 @@
1 +.progress-estimator
\ No newline at end of file
scripts/devtools/README.md
scripts/devtools/package.json new
+16
@@ -0,0 +1,16 @@
1 +{
2 + "name": "react-devtools-release-script",
3 + "version": "0.0.0",
4 + "private": true,
5 + "scripts": {},
6 + "license": "MIT",
7 + "dependencies": {
8 + "chalk": "^2.1.0",
9 + "child-process-promise": "^2.2.1",
10 + "fs-extra": "^4.0.2",
11 + "inquirer": "^8.1.2",
12 + "progress-estimator": "^0.2.1",
13 + "prompt-promise": "^1.0.3",
14 + "semver": "^5.4.1"
15 + }
16 +}
scripts/devtools/release.js new
+553
@@ -0,0 +1,553 @@
1 +#!/usr/bin/env node
2 +
3 +'use strict';
4 +
5 +const chalk = require('chalk');
6 +const {exec} = require('child-process-promise');
7 +const {readFileSync, writeFileSync} = require('fs');
8 +const {readJsonSync, writeJsonSync} = require('fs-extra');
9 +const inquirer = require('inquirer');
10 +const {homedir} = require('os');
11 +const createLogger = require('progress-estimator');
12 +const {join} = require('path');
13 +const semver = require('semver');
14 +
15 +const PACKAGE_PATHS = [
16 + 'packages/react-devtools/package.json',
17 + 'packages/react-devtools-core/package.json',
18 + 'packages/react-devtools-inline/package.json',
19 + 'packages/react-devtools-scheduling-profiler/package.json',
20 +];
21 +
22 +const MANIFEST_PATHS = [
23 + 'packages/react-devtools-extensions/chrome/manifest.json',
24 + 'packages/react-devtools-extensions/edge/manifest.json',
25 + 'packages/react-devtools-extensions/firefox/manifest.json',
26 +];
27 +
28 +const NPM_PACKAGES = [
29 + 'react-devtools',
30 + 'react-devtools-core',
31 + 'react-devtools-inline',
32 +];
33 +
34 +const CHANGELOG_PATH = 'packages/react-devtools/CHANGELOG.md';
35 +
36 +const PULL_REQUEST_BASE_URL = 'https://github.com/facebook/react/pull/';
37 +
38 +const RELEASE_SCRIPT_TOKEN = '<!-- RELEASE_SCRIPT_TOKEN -->';
39 +
40 +const ROOT_PATH = join(__dirname, '..', '..');
41 +
42 +const DRY_RUN = process.argv.includes('--dry');
43 +
44 +const logger = createLogger({
45 + storagePath: join(__dirname, '.progress-estimator'),
46 +});
47 +
48 +// This is the primary control function for this script.
49 +async function main() {
50 + await checkNPMPermissions();
51 +
52 + const releaseType = await getReleaseType();
53 +
54 + const path = join(ROOT_PATH, PACKAGE_PATHS[0]);
55 + const previousVersion = readJsonSync(path).version;
56 + const {major, minor, patch} = semver(previousVersion);
57 + const nextVersion =
58 + releaseType === 'minor'
59 + ? `${major}.${minor + 1}.${patch}`
60 + : `${major}.${minor}.${patch + 1}`;
61 +
62 + updatePackageVersions(previousVersion, nextVersion);
63 + updateManifestVersions(previousVersion, nextVersion);
64 +
65 + console.log('');
66 + console.log(
67 + `Packages and manifests have been updated from version ${chalk.bold(
68 + previousVersion
69 + )} to ${chalk.bold(nextVersion)}`
70 + );
71 + console.log('');
72 +
73 + const sha = await getPreviousCommitSha();
74 + const commitLog = await getCommitLog(sha);
75 +
76 + updateChangelog(nextVersion, commitLog);
77 +
78 + await reviewChangelogPrompt();
79 +
80 + await commitPendingChanges(previousVersion, nextVersion);
81 +
82 + const archivePath = await archiveGitRevision();
83 + const buildID = await downloadLatestReactBuild();
84 +
85 + await buildAndTestInlinePackage();
86 + await buildAndTestStandalonePackage();
87 + await buildAndTestExtensions();
88 +
89 + await publishToNPM();
90 +
91 + await printFinalInstructions(buildID, archivePath);
92 +}
93 +
94 +async function archiveGitRevision() {
95 + const desktopPath = join(homedir(), 'Desktop');
96 + const archivePath = join(desktopPath, 'DevTools.tgz');
97 +
98 + console.log(`Creating git archive at ${chalk.dim(archivePath)}`);
99 + console.log('');
100 +
101 + if (!DRY_RUN) {
102 + await exec(`git archive main | gzip > ${archivePath}`, {cwd: ROOT_PATH});
103 + }
104 +
105 + return archivePath;
106 +}
107 +
108 +async function buildAndTestExtensions() {
109 + const extensionsPackagePath = join(
110 + ROOT_PATH,
111 + 'packages',
112 + 'react-devtools-extensions'
113 + );
114 + const buildExtensionsPromise = exec('yarn build', {
115 + cwd: extensionsPackagePath,
116 + });
117 +
118 + await logger(
119 + buildExtensionsPromise,
120 + `Building browser extensions ${chalk.dim('(this may take a minute)')}`,
121 + {
122 + estimate: 60000,
123 + }
124 + );
125 +
126 + console.log('');
127 + console.log(`Extensions have been build for Chrome, Edge, and Firefox.`);
128 + console.log('');
129 + console.log('Smoke test each extension before continuing:');
130 + console.log(` ${chalk.bold.green('cd ' + extensionsPackagePath)}`);
131 + console.log('');
132 + console.log(` ${chalk.dim('# Test Chrome extension')}`);
133 + console.log(` ${chalk.bold.green('yarn test:chrome')}`);
134 + console.log('');
135 + console.log(` ${chalk.dim('# Test Edge extension')}`);
136 + console.log(` ${chalk.bold.green('yarn test:edge')}`);
137 + console.log('');
138 + console.log(` ${chalk.dim('# Firefox Chrome extension')}`);
139 + console.log(` ${chalk.bold.green('yarn test:firefox')}`);
140 +
141 + await confirmContinue();
142 +}
143 +
144 +async function buildAndTestStandalonePackage() {
145 + const corePackagePath = join(ROOT_PATH, 'packages', 'react-devtools-core');
146 + const buildCorePromise = exec('yarn build', {cwd: corePackagePath});
147 +
148 + await logger(
149 + buildCorePromise,
150 + `Building ${chalk.bold('react-devtools-core')} package.`,
151 + {
152 + estimate: 25000,
153 + }
154 + );
155 +
156 + const standalonePackagePath = join(ROOT_PATH, 'packages', 'react-devtools');
157 + const safariFixturePath = join(
158 + ROOT_PATH,
159 + 'fixtures',
160 + 'devtools',
161 + 'standalone',
162 + 'index.html'
163 + );
164 +
165 + console.log('');
166 + console.log(
167 + `Test the ${chalk.bold('react-devtools-core')} target before continuing:`
168 + );
169 + console.log(` ${chalk.bold.green('cd ' + standalonePackagePath)}`);
170 + console.log(` ${chalk.bold.green('yarn start')}`);
171 + console.log('');
172 + console.log(
173 + 'The following fixture can be useful for testing Safari integration:'
174 + );
175 + console.log(` ${chalk.dim(safariFixturePath)}`);
176 +
177 + await confirmContinue();
178 +}
179 +
180 +async function buildAndTestInlinePackage() {
181 + const inlinePackagePath = join(
182 + ROOT_PATH,
183 + 'packages',
184 + 'react-devtools-inline'
185 + );
186 + const buildPromise = exec('yarn build', {cwd: inlinePackagePath});
187 +
188 + await logger(
189 + buildPromise,
190 + `Building ${chalk.bold('react-devtools-inline')} package.`,
191 + {
192 + estimate: 10000,
193 + }
194 + );
195 +
196 + const shellPackagePath = join(ROOT_PATH, 'packages', 'react-devtools-shell');
197 +
198 + console.log('');
199 + console.log(`Built ${chalk.bold('react-devtools-inline')} target.`);
200 + console.log('');
201 + console.log('Test this build before continuing:');
202 + console.log(` ${chalk.bold.green('cd ' + shellPackagePath)}`);
203 + console.log(` ${chalk.bold.green('yarn start')}`);
204 +
205 + await confirmContinue();
206 +}
207 +
208 +async function checkNPMPermissions() {
209 + const currentUser = await execRead('npm whoami');
210 + const failedProjects = [];
211 +
212 + const checkProject = async project => {
213 + const owners = (await execRead(`npm owner ls ${project}`))
214 + .split('\n')
215 + .filter(owner => owner)
216 + .map(owner => owner.split(' ')[0]);
217 +
218 + if (!owners.includes(currentUser)) {
219 + failedProjects.push(project);
220 + }
221 + };
222 +
223 + await logger(
224 + Promise.all(NPM_PACKAGES.map(checkProject)),
225 + `Checking NPM permissions for ${chalk.bold(currentUser)}.`,
226 + {estimate: 2500}
227 + );
228 +
229 + console.log('');
230 +
231 + if (failedProjects.length) {
232 + console.error(chalk.bold('Insufficient NPM permissions'));
233 + console.error('');
234 + console.error(
235 + `NPM user {underline ${currentUser}} is not an owner for: ${chalk.bold(
236 + failedProjects.join(', ')
237 + )}`
238 + );
239 + console.error(
240 + 'Please contact a React team member to be added to the above project(s).'
241 + );
242 + process.exit(1);
243 + }
244 +}
245 +
246 +async function commitPendingChanges(previousVersion, nextVersion) {
247 + console.log('');
248 + console.log('Committing revision and changelog.');
249 + console.log(chalk.dim(' git add .'));
250 + console.log(
251 + chalk.dim(
252 + ` git commit -m "React DevTools ${previousVersion} -> ${nextVersion}"`
253 + )
254 + );
255 +
256 + if (!DRY_RUN) {
257 + await exec(`
258 + git add .
259 + git commit -m "React DevTools ${previousVersion} -> ${nextVersion}"
260 + `);
261 + }
262 +
263 + console.log('');
264 + console.log(`Please push this commit before continuing:`);
265 + console.log(` ${chalk.bold.green('git push')}`);
266 +
267 + await confirmContinue();
268 +}
269 +
270 +async function confirmContinue() {
271 + console.log('');
272 +
273 + const {confirm} = await inquirer.prompt({
274 + name: 'confirm',
275 + type: 'confirm',
276 + message: 'Continue the release?',
277 + });
278 + if (!confirm) {
279 + process.exit(0);
280 + }
281 +
282 + console.log('');
283 +}
284 +
285 +async function downloadLatestReactBuild() {
286 + const releaseScriptPath = join(ROOT_PATH, 'scripts', 'release');
287 + const installPromise = exec('yarn install', {cwd: releaseScriptPath});
288 +
289 + await logger(installPromise, 'Installing release script dependencies.', {
290 + estimate: 5000,
291 + });
292 +
293 + console.log('');
294 +
295 + const {commit} = await inquirer.prompt([
296 + {
297 + type: 'input',
298 + name: 'commit',
299 + message: 'Which React version (commit) should be used?',
300 + default: 'main',
301 + },
302 + ]);
303 + console.log('');
304 +
305 + const downloadScriptPath = join(
306 + releaseScriptPath,
307 + 'download-experimental-build.js'
308 + );
309 + const downloadPromise = execRead(
310 + `"${downloadScriptPath}" --commit=${commit}`
311 + );
312 +
313 + const output = await logger(
314 + downloadPromise,
315 + 'Downloading React artifacts from CI.',
316 + {estimate: 15000}
317 + );
318 +
319 + const match = output.match('--build=([0-9]+)');
320 + if (match.length === 0) {
321 + console.error(`No build ID found in "${output}"`);
322 + process.exit(1);
323 + }
324 +
325 + const buildID = match[1];
326 +
327 + console.log('');
328 + console.log(`Downloaded artiacts for CI build ${chalk.bold(buildID)}.`);
329 +
330 + await confirmContinue();
331 +
332 + return buildID;
333 +}
334 +
335 +async function execRead(command, options) {
336 + const {stdout} = await exec(command, options);
337 +
338 + return stdout.trim();
339 +}
340 +
341 +async function getCommitLog(sha) {
342 + let formattedLog = '';
343 +
344 + const rawLog = await execRead(`
345 + git log --topo-order --pretty=format:'%s' ${sha}...HEAD -- packages/react-devtools*
346 + `);
347 + rawLog.split('\n').forEach(line => {
348 + line = line.replace('[DevTools] ', '');
349 +
350 + const match = line.match(/(.+) \(#([0-9]+)\)/);
351 + if (match !== null) {
352 + const title = match[1];
353 + const pr = match[2];
354 +
355 + formattedLog += `\n* ${title} ([USERNAME](https://github.com/USERNAME) in [#${pr}](${PULL_REQUEST_BASE_URL}${pr}))`;
356 + } else {
357 + formattedLog += `\n* ${line}`;
358 + }
359 + });
360 +
361 + return formattedLog;
362 +}
363 +
364 +async function getPreviousCommitSha() {
365 + const choices = [];
366 +
367 + const lines = await execRead(`
368 + git log --max-count=5 --topo-order --pretty=format:'%H:::%s:::%as' HEAD -- ${PACKAGE_PATHS[0]}
369 + `);
370 + lines.split('\n').forEach((line, index) => {
371 + const [hash, message, date] = line.split(':::');
372 + choices.push({
373 + name: `${chalk.bold(hash)} ${chalk.dim(date)} ${message}`,
374 + value: hash,
375 + short: date,
376 + });
377 + });
378 +
379 + const {sha} = await inquirer.prompt([
380 + {
381 + type: 'list',
382 + name: 'sha',
383 + message: 'Which of the commits above marks the last DevTools release?',
384 + choices,
385 + default: choices[0].value,
386 + },
387 + ]);
388 +
389 + return sha;
390 +}
391 +
392 +async function getReleaseType() {
393 + const {releaseType} = await inquirer.prompt([
394 + {
395 + type: 'list',
396 + name: 'releaseType',
397 + message: 'Which type of release is this?',
398 + choices: [
399 + {
400 + name: 'Minor (new user facing functionality)',
401 + value: 'minor',
402 + short: 'Minor',
403 + },
404 + {name: 'Patch (bug fixes only)', value: 'patch', short: 'Patch'},
405 + ],
406 + default: 'patch',
407 + },
408 + ]);
409 +
410 + return releaseType;
411 +}
412 +
413 +async function printFinalInstructions(buildID, archivePath) {
414 + console.log('');
415 + console.log(
416 + 'You are now ready to publish the extension to Chrome, Edge, and Firefox:'
417 + );
418 + console.log(
419 + ` ${chalk.blue.underline(
420 + 'https://fburl.com/publish-react-devtools-extensions'
421 + )}`
422 + );
423 + console.log('');
424 + console.log('When publishing to Firefox, remember the following:');
425 + console.log(` Build id: ${chalk.bold(buildID)}`);
426 + console.log(` Git archive: ${chalk.bold(archivePath)}`);
427 + console.log('');
428 + console.log('Also consider syncing this release to Facebook:');
429 + console.log(` ${chalk.bold.green('js1 upgrade react-devtools')}`);
430 +}
431 +
432 +async function publishToNPM() {
433 + const {otp} = await inquirer.prompt([
434 + {
435 + type: 'input',
436 + name: 'otp',
437 + message: 'Please provide an NPM two-factor auth token:',
438 + },
439 + ]);
440 +
441 + console.log('');
442 +
443 + if (!otp) {
444 + console.error(`Invalid OTP provided: "${chalk.bold(otp)}"`);
445 + process.exit(0);
446 + }
447 +
448 + for (let index = 0; index < NPM_PACKAGES.length; index++) {
449 + const npmPackage = NPM_PACKAGES[index];
450 + const packagePath = join(ROOT_PATH, 'packages', npmPackage);
451 +
452 + if (DRY_RUN) {
453 + console.log(`Publishing package ${chalk.bold(npmPackage)}`);
454 + console.log(chalk.dim(` npm publish --otp=${otp}`));
455 + } else {
456 + const publishPromise = exec(`npm publish --otp=${otp}`, {
457 + cwd: packagePath,
458 + });
459 +
460 + await logger(
461 + publishPromise,
462 + `Publishing package ${chalk.bold(npmPackage)}`,
463 + {
464 + estimate: 2500,
465 + }
466 + );
467 + }
468 + }
469 +}
470 +
471 +async function reviewChangelogPrompt() {
472 + console.log('');
473 + console.log(
474 + 'The changelog has been updated with commits since the previous release:'
475 + );
476 + console.log(` ${chalk.bold(CHANGELOG_PATH)}`);
477 + console.log('');
478 + console.log('Please review the new changelog text for the following:');
479 + console.log(' 1. Organize the list into Features vs Bugfixes');
480 + console.log(' 1. Filter out any non-user-visible changes (e.g. typo fixes)');
481 + console.log(' 1. Combine related PRs into a single bullet list.');
482 + console.log(
483 + ' 1. Replacing the "USERNAME" placeholder text with the GitHub username(s)'
484 + );
485 + console.log('');
486 + console.log(` ${chalk.bold.green(`open ${CHANGELOG_PATH}`)}`);
487 +
488 + await confirmContinue();
489 +}
490 +
491 +function updateChangelog(nextVersion, commitLog) {
492 + const path = join(ROOT_PATH, CHANGELOG_PATH);
493 + const oldChangelog = readFileSync(path, 'utf8');
494 +
495 + const [beginning, end] = oldChangelog.split(RELEASE_SCRIPT_TOKEN);
496 +
497 + const dateString = new Date().toLocaleDateString('en-us', {
498 + year: 'numeric',
499 + month: 'long',
500 + day: 'numeric',
501 + });
502 + const header = `## ${nextVersion} (${dateString})`;
503 +
504 + const newChangelog = `${beginning}${RELEASE_SCRIPT_TOKEN}\n\n${header}\n${commitLog}${end}`;
505 +
506 + console.log(chalk.dim(' Updating changelog: ' + CHANGELOG_PATH));
507 +
508 + if (!DRY_RUN) {
509 + writeFileSync(path, newChangelog);
510 + }
511 +}
512 +
513 +function updateManifestVersions(previousVersion, nextVersion) {
514 + MANIFEST_PATHS.forEach(partialPath => {
515 + const path = join(ROOT_PATH, partialPath);
516 + const json = readJsonSync(path);
517 + json.version = nextVersion;
518 +
519 + if (json.hasOwnProperty('version_name')) {
520 + json.version_name = nextVersion;
521 + }
522 +
523 + console.log(chalk.dim(' Updating manifest JSON: ' + partialPath));
524 +
525 + if (!DRY_RUN) {
526 + writeJsonSync(path, json, {spaces: 2});
527 + }
528 + });
529 +}
530 +
531 +function updatePackageVersions(previousVersion, nextVersion) {
532 + PACKAGE_PATHS.forEach(partialPath => {
533 + const path = join(ROOT_PATH, partialPath);
534 + const json = readJsonSync(path);
535 + json.version = nextVersion;
536 +
537 + for (let key in json.dependencies) {
538 + if (key.startsWith('react-devtools')) {
539 + const version = json.dependencies[key];
540 +
541 + json.dependencies[key] = version.replace(previousVersion, nextVersion);
542 + }
543 + }
544 +
545 + console.log(chalk.dim(' Updating package JSON: ' + partialPath));
546 +
547 + if (!DRY_RUN) {
548 + writeJsonSync(path, json, {spaces: 2});
549 + }
550 + });
551 +}
552 +
553 +main();
scripts/devtools/yarn.lock new
+529
@@ -0,0 +1,529 @@
1 +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 +# yarn lockfile v1
3 +
4 +
5 +ansi-escapes@^3.0.0:
6 + version "3.2.0"
7 + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
8 + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
9 +
10 +ansi-escapes@^4.2.1:
11 + version "4.3.2"
12 + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
13 + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
14 + dependencies:
15 + type-fest "^0.21.3"
16 +
17 +ansi-regex@^3.0.0:
18 + version "3.0.0"
19 + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
20 + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
21 +
22 +ansi-regex@^5.0.0:
23 + version "5.0.0"
24 + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
25 + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
26 +
27 +ansi-styles@^3.2.1:
28 + version "3.2.1"
29 + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
30 + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
31 + dependencies:
32 + color-convert "^1.9.0"
33 +
34 +ansi-styles@^4.1.0:
35 + version "4.3.0"
36 + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
37 + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
38 + dependencies:
39 + color-convert "^2.0.1"
40 +
41 +base64-js@^1.3.1:
42 + version "1.5.1"
43 + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
44 + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
45 +
46 +bl@^4.1.0:
47 + version "4.1.0"
48 + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
49 + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
50 + dependencies:
51 + buffer "^5.5.0"
52 + inherits "^2.0.4"
53 + readable-stream "^3.4.0"
54 +
55 +buffer@^5.5.0:
56 + version "5.7.1"
57 + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
58 + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
59 + dependencies:
60 + base64-js "^1.3.1"
61 + ieee754 "^1.1.13"
62 +
63 +chalk@^2.1.0, chalk@^2.4.1:
64 + version "2.4.2"
65 + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
66 + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
67 + dependencies:
68 + ansi-styles "^3.2.1"
69 + escape-string-regexp "^1.0.5"
70 + supports-color "^5.3.0"
71 +
72 +chalk@^4.1.0, chalk@^4.1.1:
73 + version "4.1.2"
74 + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
75 + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
76 + dependencies:
77 + ansi-styles "^4.1.0"
78 + supports-color "^7.1.0"
79 +
80 +chardet@^0.7.0:
81 + version "0.7.0"
82 + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
83 + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
84 +
85 +cli-cursor@^2.0.0:
86 + version "2.1.0"
87 + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
88 + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
89 + dependencies:
90 + restore-cursor "^2.0.0"
91 +
92 +cli-cursor@^3.1.0:
93 + version "3.1.0"
94 + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
95 + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
96 + dependencies:
97 + restore-cursor "^3.1.0"
98 +
99 +cli-spinners@^1.3.1:
100 + version "1.3.1"
101 + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
102 + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==
103 +
104 +cli-spinners@^2.5.0:
105 + version "2.6.0"
106 + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939"
107 + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==
108 +
109 +cli-width@^3.0.0:
110 + version "3.0.0"
111 + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
112 + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
113 +
114 +clone@^1.0.2:
115 + version "1.0.4"
116 + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
117 + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
118 +
119 +color-convert@^1.9.0:
120 + version "1.9.3"
121 + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
122 + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
123 + dependencies:
124 + color-name "1.1.3"
125 +
126 +color-convert@^2.0.1:
127 + version "2.0.1"
128 + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
129 + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
130 + dependencies:
131 + color-name "~1.1.4"
132 +
133 +color-name@1.1.3:
134 + version "1.1.3"
135 + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
136 + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
137 +
138 +color-name@~1.1.4:
139 + version "1.1.4"
140 + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
141 + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
142 +
143 +defaults@^1.0.3:
144 + version "1.0.3"
145 + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
146 + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
147 + dependencies:
148 + clone "^1.0.2"
149 +
150 +emoji-regex@^8.0.0:
151 + version "8.0.0"
152 + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
153 + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
154 +
155 +escape-string-regexp@^1.0.5:
156 + version "1.0.5"
157 + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
158 + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
159 +
160 +external-editor@^3.0.3:
161 + version "3.1.0"
162 + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
163 + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
164 + dependencies:
165 + chardet "^0.7.0"
166 + iconv-lite "^0.4.24"
167 + tmp "^0.0.33"
168 +
169 +figures@^3.0.0:
170 + version "3.2.0"
171 + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
172 + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
173 + dependencies:
174 + escape-string-regexp "^1.0.5"
175 +
176 +fs-extra@^4.0.2:
177 + version "4.0.3"
178 + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
179 + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
180 + dependencies:
181 + graceful-fs "^4.1.2"
182 + jsonfile "^4.0.0"
183 + universalify "^0.1.0"
184 +
185 +graceful-fs@^4.1.2, graceful-fs@^4.1.6:
186 + version "4.2.8"
187 + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
188 + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
189 +
190 +has-flag@^3.0.0:
191 + version "3.0.0"
192 + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
193 + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
194 +
195 +has-flag@^4.0.0:
196 + version "4.0.0"
197 + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
198 + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
199 +
200 +humanize-duration@^3.15.3:
201 + version "3.27.0"
202 + resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.27.0.tgz#3f781b7cf8022ad587f76b9839b60bc2b29636b2"
203 + integrity sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ==
204 +
205 +iconv-lite@^0.4.24:
206 + version "0.4.24"
207 + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
208 + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
209 + dependencies:
210 + safer-buffer ">= 2.1.2 < 3"
211 +
212 +ieee754@^1.1.13:
213 + version "1.2.1"
214 + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
215 + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
216 +
217 +inherits@^2.0.3, inherits@^2.0.4:
218 + version "2.0.4"
219 + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
220 + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
221 +
222 +inquirer@^8.1.2:
223 + version "8.1.2"
224 + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.2.tgz#65b204d2cd7fb63400edd925dfe428bafd422e3d"
225 + integrity sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==
226 + dependencies:
227 + ansi-escapes "^4.2.1"
228 + chalk "^4.1.1"
229 + cli-cursor "^3.1.0"
230 + cli-width "^3.0.0"
231 + external-editor "^3.0.3"
232 + figures "^3.0.0"
233 + lodash "^4.17.21"
234 + mute-stream "0.0.8"
235 + ora "^5.3.0"
236 + run-async "^2.4.0"
237 + rxjs "^7.2.0"
238 + string-width "^4.1.0"
239 + strip-ansi "^6.0.0"
240 + through "^2.3.6"
241 +
242 +is-fullwidth-code-point@^2.0.0:
243 + version "2.0.0"
244 + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
245 + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
246 +
247 +is-fullwidth-code-point@^3.0.0:
248 + version "3.0.0"
249 + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
250 + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
251 +
252 +is-interactive@^1.0.0:
253 + version "1.0.0"
254 + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
255 + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
256 +
257 +is-unicode-supported@^0.1.0:
258 + version "0.1.0"
259 + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
260 + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
261 +
262 +jsonfile@^4.0.0:
263 + version "4.0.0"
264 + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
265 + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
266 + optionalDependencies:
267 + graceful-fs "^4.1.6"
268 +
269 +keypress@~0.2.1:
270 + version "0.2.1"
271 + resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.2.1.tgz#1e80454250018dbad4c3fe94497d6e67b6269c77"
272 + integrity sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=
273 +
274 +lodash@^4.17.21:
275 + version "4.17.21"
276 + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
277 + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
278 +
279 +log-symbols@^4.1.0:
280 + version "4.1.0"
281 + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
282 + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
283 + dependencies:
284 + chalk "^4.1.0"
285 + is-unicode-supported "^0.1.0"
286 +
287 +log-update@^2.3.0:
288 + version "2.3.0"
289 + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708"
290 + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg=
291 + dependencies:
292 + ansi-escapes "^3.0.0"
293 + cli-cursor "^2.0.0"
294 + wrap-ansi "^3.0.1"
295 +
296 +mimic-fn@^1.0.0:
297 + version "1.2.0"
298 + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
299 + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
300 +
301 +mimic-fn@^2.1.0:
302 + version "2.1.0"
303 + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
304 + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
305 +
306 +mute-stream@0.0.8:
307 + version "0.0.8"
308 + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
309 + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
310 +
311 +native-or-another@~2.0.0:
312 + version "2.0.0"
313 + resolved "https://registry.yarnpkg.com/native-or-another/-/native-or-another-2.0.0.tgz#17a567f92beea9cd71acff96a7681a735eca3bff"
314 + integrity sha1-F6Vn+Svuqc1xrP+Wp2gac17KO/8=
315 + dependencies:
316 + native-or-bluebird "^1.1.2"
317 +
318 +native-or-bluebird@^1.1.2:
319 + version "1.2.0"
320 + resolved "https://registry.yarnpkg.com/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz#39c47bfd7825d1fb9ffad32210ae25daadf101c9"
321 + integrity sha1-OcR7/Xgl0fuf+tMiEK4l2q3xAck=
322 +
323 +onetime@^2.0.0:
324 + version "2.0.1"
325 + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
326 + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
327 + dependencies:
328 + mimic-fn "^1.0.0"
329 +
330 +onetime@^5.1.0:
331 + version "5.1.2"
332 + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
333 + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
334 + dependencies:
335 + mimic-fn "^2.1.0"
336 +
337 +ora@^5.3.0:
338 + version "5.4.1"
339 + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
340 + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
341 + dependencies:
342 + bl "^4.1.0"
343 + chalk "^4.1.0"
344 + cli-cursor "^3.1.0"
345 + cli-spinners "^2.5.0"
346 + is-interactive "^1.0.0"
347 + is-unicode-supported "^0.1.0"
348 + log-symbols "^4.1.0"
349 + strip-ansi "^6.0.0"
350 + wcwidth "^1.0.1"
351 +
352 +os-tmpdir@~1.0.2:
353 + version "1.0.2"
354 + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
355 + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
356 +
357 +progress-estimator@^0.2.1:
358 + version "0.2.2"
359 + resolved "https://registry.yarnpkg.com/progress-estimator/-/progress-estimator-0.2.2.tgz#1c3947a5782ea56e40c8fccc290ac7ceeb1b91cb"
360 + integrity sha512-GF76Ac02MTJD6o2nMNtmtOFjwWCnHcvXyn5HOWPQnEMO8OTLw7LAvNmrwe8LmdsB+eZhwUu9fX/c9iQnBxWaFA==
361 + dependencies:
362 + chalk "^2.4.1"
363 + cli-spinners "^1.3.1"
364 + humanize-duration "^3.15.3"
365 + log-update "^2.3.0"
366 +
367 +prompt-promise@^1.0.3:
368 + version "1.0.3"
369 + resolved "https://registry.yarnpkg.com/prompt-promise/-/prompt-promise-1.0.3.tgz#78ce4fcb9a14a108c49174f2d808c440d1bde265"
370 + integrity sha1-eM5Py5oUoQjEkXTy2AjEQNG94mU=
371 + dependencies:
372 + keypress "~0.2.1"
373 + native-or-another "~2.0.0"
374 +
375 +readable-stream@^3.4.0:
376 + version "3.6.0"
377 + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
378 + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
379 + dependencies:
380 + inherits "^2.0.3"
381 + string_decoder "^1.1.1"
382 + util-deprecate "^1.0.1"
383 +
384 +restore-cursor@^2.0.0:
385 + version "2.0.0"
386 + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
387 + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
388 + dependencies:
389 + onetime "^2.0.0"
390 + signal-exit "^3.0.2"
391 +
392 +restore-cursor@^3.1.0:
393 + version "3.1.0"
394 + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
395 + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
396 + dependencies:
397 + onetime "^5.1.0"
398 + signal-exit "^3.0.2"
399 +
400 +run-async@^2.4.0:
401 + version "2.4.1"
402 + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
403 + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
404 +
405 +rxjs@^7.2.0:
406 + version "7.3.0"
407 + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6"
408 + integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==
409 + dependencies:
410 + tslib "~2.1.0"
411 +
412 +safe-buffer@~5.2.0:
413 + version "5.2.1"
414 + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
415 + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
416 +
417 +"safer-buffer@>= 2.1.2 < 3":
418 + version "2.1.2"
419 + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
420 + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
421 +
422 +semver@^5.4.1:
423 + version "5.7.1"
424 + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
425 + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
426 +
427 +signal-exit@^3.0.2:
428 + version "3.0.3"
429 + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
430 + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
431 +
432 +string-width@^2.1.1:
433 + version "2.1.1"
434 + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
435 + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
436 + dependencies:
437 + is-fullwidth-code-point "^2.0.0"
438 + strip-ansi "^4.0.0"
439 +
440 +string-width@^4.1.0:
441 + version "4.2.2"
442 + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
443 + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
444 + dependencies:
445 + emoji-regex "^8.0.0"
446 + is-fullwidth-code-point "^3.0.0"
447 + strip-ansi "^6.0.0"
448 +
449 +string_decoder@^1.1.1:
450 + version "1.3.0"
451 + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
452 + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
453 + dependencies:
454 + safe-buffer "~5.2.0"
455 +
456 +strip-ansi@^4.0.0:
457 + version "4.0.0"
458 + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
459 + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
460 + dependencies:
461 + ansi-regex "^3.0.0"
462 +
463 +strip-ansi@^6.0.0:
464 + version "6.0.0"
465 + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
466 + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
467 + dependencies:
468 + ansi-regex "^5.0.0"
469 +
470 +supports-color@^5.3.0:
471 + version "5.5.0"
472 + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
473 + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
474 + dependencies:
475 + has-flag "^3.0.0"
476 +
477 +supports-color@^7.1.0:
478 + version "7.2.0"
479 + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
480 + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
481 + dependencies:
482 + has-flag "^4.0.0"
483 +
484 +through@^2.3.6:
485 + version "2.3.8"
486 + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
487 + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
488 +
489 +tmp@^0.0.33:
490 + version "0.0.33"
491 + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
492 + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
493 + dependencies:
494 + os-tmpdir "~1.0.2"
495 +
496 +tslib@~2.1.0:
497 + version "2.1.0"
498 + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
499 + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
500 +
501 +type-fest@^0.21.3:
502 + version "0.21.3"
503 + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
504 + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
505 +
506 +universalify@^0.1.0:
507 + version "0.1.2"
508 + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
509 + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
510 +
511 +util-deprecate@^1.0.1:
512 + version "1.0.2"
513 + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
514 + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
515 +
516 +wcwidth@^1.0.1:
517 + version "1.0.1"
518 + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
519 + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
520 + dependencies:
521 + defaults "^1.0.3"
522 +
523 +wrap-ansi@^3.0.1:
524 + version "3.0.1"
525 + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba"
526 + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=
527 + dependencies:
528 + string-width "^2.1.1"
529 + strip-ansi "^4.0.0"