mirror of
https://github.com/facebook/react.git
synced 2026-02-24 20:53:03 +00:00
142 lines
3.3 KiB
JavaScript
Executable File
142 lines
3.3 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
'use strict';
|
|
|
|
const chalk = require('chalk');
|
|
const Vorpal = require('vorpal');
|
|
const GitHubAPI = require('github-api');
|
|
const untildify = require('untildify');
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const os = require('os');
|
|
|
|
const child_process = require('child_process');
|
|
const execSync = child_process.execSync;
|
|
|
|
const vorpal = new Vorpal();
|
|
|
|
// Expects to be in a checkout of react that is a sibling of the react checkout you want to operate on
|
|
// eg ~/code/react@release-manager/scripts/release-manager & ~/code/react
|
|
// TODO: Make this an argument to the script
|
|
let PATH_TO_REPO = null;
|
|
|
|
const PATH_TO_CONFIG = path.resolve(os.homedir(), '.react-release-manager.json');
|
|
|
|
const DEFAULT_CONFIG = {
|
|
githubToken: null,
|
|
reactPath: path.resolve('../../../react'),
|
|
};
|
|
|
|
// Quick dry run opt-in. This allows quick debugging of execInRepo without
|
|
// actually running the command, ensuring no accidental publishing.
|
|
const DRY_RUN = false;
|
|
|
|
// Enabled commands
|
|
const COMMANDS = [
|
|
'init',
|
|
'docs-prs',
|
|
'q',
|
|
'stable-prs',
|
|
'version',
|
|
'npm-publish',
|
|
'npm-check-access',
|
|
'npm-grant-access',
|
|
'start-release',
|
|
];
|
|
|
|
|
|
// HELPERS
|
|
|
|
// Simple helper to write out some JSON for debugging
|
|
function writeTo(file, data) {
|
|
var folder = path.join(__dirname, 'data');
|
|
if (!fs.existsSync(folder)) {
|
|
fs.mkdirSync(folder);
|
|
}
|
|
|
|
fs.writeFile(
|
|
path.join(folder, file),
|
|
JSON.stringify(data, null, 2)
|
|
);
|
|
}
|
|
|
|
// Wrapper around exec so we don't have to worry about paths
|
|
function execInRepo(command) {
|
|
vorpal.log(chalk.gray(`Executing ${chalk.underline(command)}`));
|
|
|
|
if (DRY_RUN) {
|
|
return '';
|
|
}
|
|
|
|
return execSync(command, {
|
|
cwd: PATH_TO_REPO,
|
|
encoding: 'utf8',
|
|
}).trim();
|
|
}
|
|
|
|
|
|
function getReactVersion() {
|
|
return (JSON.parse(fs.readFileSync(path.join(PATH_TO_REPO, 'package.json'), 'utf8'))).version;
|
|
}
|
|
|
|
const app = {
|
|
vorpal,
|
|
|
|
updateConfig() {
|
|
// TODO: write this. This should make it possible to start without a config
|
|
// and go through the init process to create one and then re-init the github
|
|
// setup.
|
|
this.config = this.loadConfig();
|
|
},
|
|
|
|
loadConfig() {
|
|
try {
|
|
// TODO: validate config
|
|
let config = JSON.parse(fs.readFileSync(PATH_TO_CONFIG, 'utf8'));
|
|
config.reactPath = path.normalize(untildify(config.reactPath));
|
|
PATH_TO_REPO = config.reactPath;
|
|
return config;
|
|
} catch (e) {
|
|
console.error(
|
|
'Attempt to load config file failed. Please run `init` command for initial setup or make sure ' +
|
|
'~/.react-release-manager.json is valid JSON. Using a default config which may not work ' +
|
|
'properly.'
|
|
);
|
|
return DEFAULT_CONFIG;
|
|
}
|
|
},
|
|
|
|
init() {
|
|
this.config = this.loadConfig();
|
|
|
|
this.PATH_TO_CONFIG = PATH_TO_CONFIG;
|
|
|
|
// GITHUB
|
|
this.github = new GitHubAPI({
|
|
token: this.config.githubToken,
|
|
});
|
|
this.ghrepo = this.github.getRepo('facebook', 'react');
|
|
this.ghissues = this.github.getIssues('facebook', 'react');
|
|
|
|
// HELPERS
|
|
this.writeTo = writeTo;
|
|
this.execInRepo = execInRepo;
|
|
this.getReactVersion = getReactVersion;
|
|
|
|
// Register commands
|
|
COMMANDS.forEach((command) => {
|
|
vorpal.use(require(`./commands/${command}`)(vorpal, app));
|
|
});
|
|
|
|
var v = vorpal
|
|
.history('react-release-manager')
|
|
.delimiter('rrm \u2234');
|
|
v.exec('help');
|
|
v.show();
|
|
|
|
},
|
|
};
|
|
|
|
app.init();
|