Introduce Release script (#4631)

master
Lucas Duailibe 2018-06-05 16:37:52 -03:00 committed by GitHub
parent f27f6c525b
commit 54b1f8562d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 1009 additions and 31 deletions

View File

@ -4,6 +4,7 @@
!/**/.eslintrc.js
/test.js
/scripts/build/shims
/scripts/release/node_modules
/coverage/
/dist/
**/node_modules/**

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
/node_modules
/scripts/release/node_modules
*.log
/errors
/test.js

View File

@ -1,2 +1,9 @@
parserOptions:
ecmaVersion: 2017
rules:
no-console: off
overrides:
files:
- test-dist.js
parserOptions:
ecmaVersion: 6

View File

@ -5,23 +5,22 @@ const stringWidth = require("string-width");
const bundler = require("./bundler");
const bundleConfigs = require("./config");
const util = require("./util");
const formatMarkdown = require("../../website/playground/markdown");
// Errors in promises should be fatal.
const loggedErrors = new Set();
process.on("unhandledRejection", err => {
if (loggedErrors.has(err)) {
// No need to print it twice.
process.exit(1);
// No need to print it twice.
if (!loggedErrors.has(err)) {
console.error(err);
}
throw err;
process.exit(1);
});
const OK = chalk.reset.inverse.bold.green(" DONE ");
const FAIL = chalk.reset.inverse.bold.red(" FAIL ");
function fitTerminal(input) {
const columns = process.stdout.columns || 80;
const columns = Math.min(process.stdout.columns, 80);
const WIDTH = columns - stringWidth(OK) + 1;
if (input.length < WIDTH) {
input += Array(WIDTH - input.length).join(chalk.dim("."));
@ -65,30 +64,6 @@ async function preparePackage() {
await util.copyFile("./README.md", "./dist/README.md");
}
async function updateIssueTemplate() {
const filename = ".github/ISSUE_TEMPLATE.md";
const issueTemplate = await util.readFile(filename, "utf8");
const pkg = await util.readJson("package.json");
await util.writeFile(
filename,
issueTemplate.replace(
/-->[^]*$/,
"-->\n\n" +
formatMarkdown(
"// code snippet",
"// code snippet",
"",
pkg.version,
"https://prettier.io/playground/#.....",
{ parser: "babylon" },
[["# Options (if any):", true], ["--single-quote", true]],
true
)
)
);
}
async function run() {
await util.asyncRimRaf("dist");
@ -98,7 +73,6 @@ async function run() {
}
await preparePackage();
await updateIssueTemplate();
}
run();

13
scripts/release/README.md Normal file
View File

@ -0,0 +1,13 @@
# Release script
## Usage
```
./scripts/release/release.js --version NEW_VERSION
```
The script its own `package.json` so we can reinstall the root's `node_modules/` while making the release.
## Credits
This script was inspired by [React's release script](https://github.com/facebook/react/tree/001f9ef/scripts/release).

View File

@ -0,0 +1,13 @@
{
"private": true,
"dependencies": {
"chalk": "2.4.1",
"child-process-promise": "2.2.1",
"dedent": "0.7.0",
"minimist": "1.2.0",
"node-fetch": "2.1.2",
"prs-merged-since": "1.0.1",
"semver": "5.5.0",
"string-width": "2.1.1"
}
}

View File

@ -0,0 +1,54 @@
#!/usr/bin/env node
"use strict";
async function run() {
const chalk = require("chalk");
const dedent = require("dedent");
const minimist = require("minimist");
const { readJson } = require("./utils");
const params = minimist(process.argv.slice(2), {
string: ["version"],
boolean: ["dry"],
alias: { v: "version" }
});
params.previousVersion = (await readJson("package.json")).version;
const steps = [
require("./steps/validate-new-version"),
require("./steps/check-git-status"),
require("./steps/install-dependencies"),
require("./steps/run-tests"),
require("./steps/update-version"),
require("./steps/generate-bundles"),
require("./steps/update-changelog"),
require("./steps/push-to-git"),
require("./steps/publish-to-npm"),
require("./steps/bump-prettier"),
require("./steps/post-publish-steps")
];
try {
for (const step of steps) {
await step(params);
}
} catch (error) {
const message = dedent(error.message.trim());
const stack = error.stack.replace(message, "");
console.error(`${chalk.red("error")} ${message}\n${stack}`);
process.exit(1);
}
}
// Install script's dependencies before any require
const { exec } = require("child_process");
exec("yarn install", { cwd: __dirname }, error => {
if (error) {
console.error(error);
process.exit(1);
} else {
run();
}
});

View File

@ -0,0 +1,32 @@
"use strict";
const { exec, spawn } = require("child-process-promise");
const { logPromise } = require("../utils");
async function format() {
await exec("yarn lint --fix");
await exec("yarn lint-docs --fix");
}
async function commit(version) {
await spawn("git", [
"commit",
"-am",
`Bump Prettier dependency to ${version}`
]);
await exec("git push");
}
module.exports = async function({ dry, version }) {
if (dry) {
return;
}
await logPromise(
"Installing Prettier",
spawn("yarn", ["add", "--dev", `prettier@${version}`])
);
await logPromise("Updating files", format());
await logPromise("Committing changed files", commit(version));
};

View File

@ -0,0 +1,14 @@
"use strict";
const { exec } = require("child-process-promise");
module.exports = async function() {
const status = (await exec("git status --porcelain")).stdout;
if (status) {
throw Error(
"Uncommited local changes. " +
"Please revert or commit all local changes before making a release."
);
}
};

View File

@ -0,0 +1,19 @@
"use strict";
const chalk = require("chalk");
const { runYarn, logPromise, readJson } = require("../utils");
module.exports = async function({ version }) {
await logPromise("Generating bundles", runYarn("build"));
const builtPkg = await readJson("dist/package.json");
if (builtPkg.version !== version) {
throw Error(
`Expected ${version} in dist/package.json but found ${builtPkg.version}`
);
}
await logPromise("Running tests on generated bundles", runYarn("test:dist"));
console.log(chalk.green.bold("Build successful!\n"));
};

View File

@ -0,0 +1,20 @@
"use strict";
const { exec } = require("child-process-promise");
const { logPromise } = require("../utils");
async function install() {
await exec("rm -rf node_modules");
await exec("yarn install");
const status = (await exec("git ls-files -m")).stdout.trim();
if (status) {
throw Error(
"The lockfile needs to be updated, commit it before making the release."
);
}
}
module.exports = function() {
return logPromise("Installing NPM dependencies", install());
};

View File

@ -0,0 +1,65 @@
"use strict";
const chalk = require("chalk");
const dedent = require("dedent");
const fetch = require("node-fetch");
const { exec } = require("child-process-promise");
const { logPromise, waitForEnter } = require("../utils");
const SCHEMA_REPO = "SchemaStore/schemastore";
const SCHEMA_PATH = "src/schemas/json/prettierrc.json";
const RAW_URL = `https://raw.githubusercontent.com/${SCHEMA_REPO}/master/${SCHEMA_PATH}`;
const EDIT_URL = `https://github.com/${SCHEMA_REPO}/edit/master/${SCHEMA_PATH}`;
// Any optional or manual step can be warned in this script.
async function checkSchema() {
const schema = (await exec("node scripts/generate-schema.js")).stdout.trim();
const remoteSchema = await logPromise(
"Checking current schema in SchemaStore",
fetch(RAW_URL)
.then(r => r.text())
.then(t => t.trim())
);
if (schema === remoteSchema) {
return;
}
return dedent(chalk`
{bold.underline The schema in {yellow SchemaStore} needs an update.}
- Open {cyan.underline ${EDIT_URL}}
- Run {yellow node scripts/generate-schema.js} and copy the new schema
- Paste it on GitHub interface
- Open a PR
`);
}
function twitterAnnouncement() {
return dedent(chalk`
{bold.underline Announce on Twitter}
- Open {cyan.underline https://tweetdeck.twitter.com}
- Make sure you are tweeting from the {yellow @PrettierCode} account.
- Tweet about the release, including the blog post URL.
`);
}
module.exports = async function() {
const steps = [await checkSchema(), twitterAnnouncement()].filter(Boolean);
console.log(chalk.bold.green("The script has finished!\n"));
if (steps.length === 0) {
return;
}
console.log(
dedent(chalk`
{yellow.bold The following ${
steps.length === 1 ? "step is" : "steps are"
} optional.}
${steps.join("\n\n")}
`)
);
};

View File

@ -0,0 +1,36 @@
"use strict";
const chalk = require("chalk");
const dedent = require("dedent");
const { exec } = require("child-process-promise");
const { logPromise, waitForEnter } = require("../utils");
module.exports = async function({ dry, version }) {
if (dry) {
return;
}
await logPromise("Publishing to npm", exec("npm publish", { cwd: "./dist" }));
console.log(
dedent(chalk`
{green.bold Prettier ${version} published!}
{yellow.bold Some manual steps are necessary.}
{bold.underline Create a GitHub Release}
- Go to {cyan.underline https://github.com/prettier/prettier/releases/new?tag=${version}}
- Copy release notes from {yellow CHANGELOG.md}
- Attach all files in {yellow dist/} folder.
- Press {bgGreen.black Publish release }
{bold.underline Test the new releae}
- In a new session, run {yellow npm i prettier@latest} in another directory
- Test the API and CLI
After that, we can proceed to bump this repo's Prettier dependency.
Press any key to continue.
`)
);
await waitForEnter();
};

View File

@ -0,0 +1,19 @@
"use strict";
const { exec, spawn } = require("child-process-promise");
const { logPromise } = require("../utils");
async function pushGit({ version }) {
await spawn("git", ["commit", "-am", `Release ${version}`]);
await spawn("git", ["tag", "-a", version, "-m", `Release ${version}`]);
await exec("git push");
await exec("git push --tags");
}
module.exports = function(params) {
if (params.dry) {
return;
}
return logPromise("Committing and pushing to remote", pushGit(params));
};

View File

@ -0,0 +1,9 @@
"use strict";
const { runYarn, logPromise } = require("../utils");
module.exports = async function() {
await logPromise("Running linter", runYarn("lint"));
await logPromise("Running linter on docs", runYarn("lint-docs"));
await logPromise("Running tests", runYarn("test"));
};

View File

@ -0,0 +1,100 @@
"use strict";
const chalk = require("chalk");
const dedent = require("dedent");
const fs = require("fs");
const prsMergedSince = require("prs-merged-since");
const semver = require("semver");
const { logPromise, waitForEnter } = require("../utils");
function getBlogPostInfo(version) {
const date = new Date();
const year = date.getFullYear();
const month = new String(date.getMonth() + 1).padStart(2, "0");
const day = new String(date.getDate()).padStart(2, "0");
return {
file: `website/blog/${year}-${month}-${day}-${version}.md`,
path: `blog/${year}/${month}/${day}/${version}.html`
};
}
async function getMergedPrs(previousVersion) {
const prs = await prsMergedSince({
repo: "prettier/prettier",
tag: previousVersion,
githubApiToken: process.env.GITHUB_API_TOKEN
});
return prs
.map(pr => `- ${pr.title} ([#${pr.number}](${pr.html_url}))`)
.join("\n");
}
function writeChangelog({ version, previousVersion, releaseNotes }) {
const changelog = fs.readFileSync("CHANGELOG.md", "utf-8");
const newEntry = dedent`
# ${version}
[link](https://github.com/prettier/prettier/compare/${previousVersion}...${version})
${releaseNotes}
`;
fs.writeFileSync("CHANGELOG.md", newEntry + "\n\n" + changelog);
}
module.exports = async function({ version, previousVersion }) {
const semverDiff = semver.diff(version, previousVersion);
if (semverDiff !== "patch") {
const blogPost = getBlogPostInfo(version);
writeChangelog({
version,
previousVersion,
releaseNotes: `- [Release Notes](https://prettier.io/${blogPost.path})`
});
if (fs.existsSync(blogPost.file)) {
// Everything is fine, this step is finished
return;
}
console.warn(
dedent(chalk`
{yellow warning} The file {bold ${
blogPost.file
}} doesn't exist, but it will be referenced in {bold CHANGELOG.md}. Make sure to create it later.
Press ENTER to continue.
`)
);
} else {
if (!process.env.GITHUB_API_TOKEN) {
console.log(
chalk`{yellow warning} GitHub API access token missing. You can expose a token via {bold GITHUB_API_TOKEN} environment variable.`
);
}
const releaseNotes = await logPromise(
"Fetching merged PRs",
getMergedPrs(previousVersion)
);
writeChangelog({
version,
previousVersion,
releaseNotes
});
console.log();
console.log(
dedent(chalk`
{yellow.bold A manual step is necessary.}
The script has updated the file {bold CHANGELOG.md} with all the merged PRs since the last release.
You must edit it to focus only on relevant changes and make sure they have meaningful titles.
You don't need to commit the file, the script will take care of that.
When you're finished, press ENTER to continue.
`)
);
}
await waitForEnter();
};

View File

@ -0,0 +1,27 @@
"use strict";
const { exec } = require("child-process-promise");
const { readFileSync, writeFileSync } = require("fs");
const { logPromise, readJson, writeJson } = require("../utils");
async function bump({ version }) {
const pkg = await readJson("package.json");
pkg.version = version;
await writeJson("package.json", pkg, { spaces: 2 });
// Update .github/ISSUE_TEMPLATE.MD
const issueFile = ".github/ISSUE_TEMPLATE.md";
const issueTempl = readFileSync(issueFile, "utf-8");
writeFileSync(
issueFile,
issueTempl.replace(/^\*\*Prettier .*?\*\*$/m, `**Prettier ${version}**`)
);
}
module.exports = async function(params) {
await logPromise("Bumping version", bump(params));
await logPromise(
"Updating integration snapshots",
exec("yarn test-integration -u")
);
};

View File

@ -0,0 +1,14 @@
"use strict";
const chalk = require("chalk");
const semver = require("semver");
module.exports = async function({ version, previousVersion }) {
if (!semver.valid(version)) {
throw Error(`Invalid version specified`);
}
if (!semver.gt(version, previousVersion)) {
throw Error(`Version ${chalk.yellow(version)} has already been published`);
}
};

78
scripts/release/utils.js Normal file
View File

@ -0,0 +1,78 @@
"use strict";
require("readline").emitKeypressEvents(process.stdin);
const chalk = require("chalk");
const fs = require("fs");
const { spawn } = require("child-process-promise");
const stringWidth = require("string-width");
const OK = chalk.bgGreen.black(" DONE ");
const FAIL = chalk.bgRed.black(" FAIL ");
function fitTerminal(input) {
const columns = Math.min(process.stdout.columns, 80);
const WIDTH = columns - stringWidth(OK) + 1;
if (input.length < WIDTH) {
input += Array(WIDTH - input.length).join(chalk.dim("."));
}
return input;
}
function logPromise(name, promise) {
process.stdout.write(fitTerminal(name));
return promise
.then(result => {
process.stdout.write(`${OK}\n`);
return result;
})
.catch(err => {
process.stdout.write(`${FAIL}\n`);
throw err;
});
}
function runYarn(script) {
return spawn("yarn", ["--silent", script], {
capture: ["stdout", "stderr"]
}).catch(error => {
throw Error(`\`yarn ${script}\` failed\n${error.stdout}`);
});
}
function waitForEnter() {
process.stdin.setRawMode(true);
return new Promise((resolve, reject) => {
process.stdin.on("keypress", listener);
process.stdin.resume();
function listener(ch, key) {
if (key.name === "return") {
process.stdin.setRawMode(false);
process.stdin.removeListener("keypress", listener);
process.stdin.pause();
resolve();
} else if (key.ctrl && key.name === "c") {
reject(Error("Process terminated by the user"));
}
}
});
}
function readJson(filename) {
return JSON.parse(fs.readFileSync(filename, "utf-8"));
}
function writeJson(filename, content) {
fs.writeFileSync(filename, JSON.stringify(content, null, 2) + "\n");
}
module.exports = {
runYarn,
logPromise,
readJson,
writeJson,
waitForEnter
};

482
scripts/release/yarn.lock Normal file
View File

@ -0,0 +1,482 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@octokit/rest@^15.2.6":
version "15.8.1"
resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.8.1.tgz#8bcdece90026d3af5edd73bd49a8732cb3801d29"
dependencies:
before-after-hook "^1.1.0"
btoa-lite "^1.0.0"
debug "^3.1.0"
http-proxy-agent "^2.1.0"
https-proxy-agent "^2.2.0"
lodash "^4.17.4"
node-fetch "^2.1.1"
url-template "^2.0.8"
agent-base@4, agent-base@^4.1.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce"
dependencies:
es6-promisify "^5.0.0"
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
ansi-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
dependencies:
color-convert "^1.9.0"
before-after-hook@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.1.0.tgz#83165e15a59460d13702cb8febd6a1807896db5a"
btoa-lite@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
chalk@2.4.1, chalk@^2.0.1, chalk@^2.3.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
child-process-promise@2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074"
dependencies:
cross-spawn "^4.0.2"
node-version "^1.0.0"
promise-polyfill "^6.0.1"
cli-cursor@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
dependencies:
restore-cursor "^2.0.0"
cli-spinners@^1.1.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
cliui@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
dependencies:
string-width "^2.1.1"
strip-ansi "^4.0.0"
wrap-ansi "^2.0.0"
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
color-convert@^1.9.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
dependencies:
color-name "^1.1.1"
color-name@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
cross-spawn@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
dependencies:
lru-cache "^4.0.1"
which "^1.2.9"
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
dependencies:
lru-cache "^4.0.1"
shebang-command "^1.2.0"
which "^1.2.9"
debug@3.1.0, debug@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"
decamelize@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
dedent@0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
defaults@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
dependencies:
clone "^1.0.2"
es6-promise@^4.0.3:
version "4.2.4"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29"
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
dependencies:
es6-promise "^4.0.3"
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
dependencies:
cross-spawn "^5.0.1"
get-stream "^3.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
find-up@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
dependencies:
locate-path "^2.0.0"
get-caller-file@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
http-proxy-agent@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
dependencies:
agent-base "4"
debug "3.1.0"
https-proxy-agent@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
dependencies:
agent-base "^4.1.0"
debug "^3.1.0"
invert-kv@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
dependencies:
number-is-nan "^1.0.0"
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
lcid@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
dependencies:
invert-kv "^1.0.0"
locate-path@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
dependencies:
p-locate "^2.0.0"
path-exists "^3.0.0"
lodash@^4.17.4:
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
log-symbols@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
dependencies:
chalk "^2.0.1"
lru-cache@^4.0.1:
version "4.1.3"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
dependencies:
pseudomap "^1.0.2"
yallist "^2.1.2"
mem@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
dependencies:
mimic-fn "^1.0.0"
mimic-fn@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
minimist@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
node-fetch@2.1.2, node-fetch@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
node-version@^1.0.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.1.3.tgz#1081c87cce6d2dbbd61d0e51e28c287782678496"
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
dependencies:
path-key "^2.0.0"
number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
onetime@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
dependencies:
mimic-fn "^1.0.0"
ora@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b"
dependencies:
chalk "^2.3.1"
cli-cursor "^2.1.0"
cli-spinners "^1.1.0"
log-symbols "^2.2.0"
strip-ansi "^4.0.0"
wcwidth "^1.0.1"
os-locale@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
dependencies:
execa "^0.7.0"
lcid "^1.0.0"
mem "^1.1.0"
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
p-limit@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
dependencies:
p-try "^1.0.0"
p-locate@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
dependencies:
p-limit "^1.1.0"
p-try@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
path-key@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
promise-polyfill@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.1.0.tgz#dfa96943ea9c121fca4de9b5868cb39d3472e057"
prs-merged-since@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prs-merged-since/-/prs-merged-since-1.0.1.tgz#2e9905f0843ec0189c3168a6eb31087982ac47fb"
dependencies:
"@octokit/rest" "^15.2.6"
ora "^2.0.0"
yargs "^11.0.0"
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
dependencies:
onetime "^2.0.0"
signal-exit "^3.0.2"
semver@5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
dependencies:
shebang-regex "^1.0.0"
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
string-width@2.1.1, string-width@^2.0.0, string-width@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
dependencies:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
dependencies:
ansi-regex "^2.0.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
dependencies:
ansi-regex "^3.0.0"
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
supports-color@^5.3.0:
version "5.4.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
dependencies:
has-flag "^3.0.0"
url-template@^2.0.8:
version "2.0.8"
resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21"
wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
dependencies:
defaults "^1.0.3"
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
which@^1.2.9:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
dependencies:
isexe "^2.0.0"
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
yargs-parser@^9.0.2:
version "9.0.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
dependencies:
camelcase "^4.1.0"
yargs@^11.0.0:
version "11.0.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b"
dependencies:
cliui "^4.0.0"
decamelize "^1.1.1"
find-up "^2.1.0"
get-caller-file "^1.0.1"
os-locale "^2.0.0"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^2.0.0"
which-module "^2.0.0"
y18n "^3.2.1"
yargs-parser "^9.0.2"