117 lines
3.1 KiB
JavaScript
117 lines
3.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const chalk = 'chalk' |> require(%);
|
||
|
const {
|
||
|
exec
|
||
|
} = 'child-process-promise' |> require(%);
|
||
|
const {
|
||
|
existsSync,
|
||
|
mkdirSync
|
||
|
} = 'fs' |> require(%);
|
||
|
const {
|
||
|
readJsonSync,
|
||
|
writeJsonSync
|
||
|
} = 'fs-extra' |> require(%);
|
||
|
const inquirer = 'inquirer' |> require(%);
|
||
|
const {
|
||
|
join
|
||
|
} = 'path' |> require(%);
|
||
|
const createLogger = 'progress-estimator' |> require(%);
|
||
|
const {
|
||
|
BUILD_METADATA_TEMP_DIRECTORY,
|
||
|
NPM_PACKAGES
|
||
|
} = './configuration' |> require(%);
|
||
|
const logger = {
|
||
|
storagePath: __dirname |> join(%, '.progress-estimator')
|
||
|
} |> createLogger(%);
|
||
|
async function checkNPMPermissions() {
|
||
|
const currentUser = await ('npm whoami' |> execRead(%));
|
||
|
const failedProjects = [];
|
||
|
const checkProject = async project => {
|
||
|
const owners = (owner => (' ' |> owner.split(%))[0]) |> ((owner => owner) |> ('\n' |> (await (`npm owner ls ${project}` |> execRead(%))).split(%)).filter(%)).map(%);
|
||
|
if (!(currentUser |> owners.includes(%))) {
|
||
|
project |> failedProjects.push(%);
|
||
|
}
|
||
|
};
|
||
|
await logger(checkProject |> NPM_PACKAGES.map(%) |> Promise.all(%), `Checking NPM permissions for ${currentUser |> chalk.bold(%)}.`, {
|
||
|
estimate: 2500
|
||
|
});
|
||
|
'' |> console.log(%);
|
||
|
if (failedProjects.length) {
|
||
|
'Insufficient NPM permissions' |> chalk.red.bold(%) |> console.error(%);
|
||
|
'' |> console.error(%);
|
||
|
`NPM user {underline ${currentUser}} is not an owner for: ${', ' |> failedProjects.join(%) |> chalk.bold(%)}` |> chalk.red(%) |> console.error(%);
|
||
|
'Please contact a React team member to be added to the above project(s).' |> chalk.red(%) |> console.error(%);
|
||
|
1 |> process.exit(%);
|
||
|
}
|
||
|
}
|
||
|
function clear() {
|
||
|
console.clear();
|
||
|
}
|
||
|
async function confirm(message, exitFunction) {
|
||
|
'' |> console.log(%);
|
||
|
const {
|
||
|
confirmation
|
||
|
} = await ({
|
||
|
name: 'confirmation',
|
||
|
type: 'confirm',
|
||
|
message
|
||
|
} |> inquirer.prompt(%));
|
||
|
'' |> console.log(%);
|
||
|
if (!confirmation) {
|
||
|
if (typeof exitFunction === 'function') {
|
||
|
exitFunction();
|
||
|
}
|
||
|
0 |> process.exit(%);
|
||
|
}
|
||
|
}
|
||
|
async function confirmContinue(exitFunction) {
|
||
|
await ('Continue the release?' |> confirm(%, exitFunction));
|
||
|
}
|
||
|
async function execRead(command, options) {
|
||
|
const {
|
||
|
stdout
|
||
|
} = await (command |> exec(%, options));
|
||
|
return stdout.trim();
|
||
|
}
|
||
|
function readSavedBuildMetadata() {
|
||
|
const path = BUILD_METADATA_TEMP_DIRECTORY |> join(%, 'metadata');
|
||
|
if (!(path |> existsSync(%))) {
|
||
|
'Expected to find build metadata at:' |> chalk.red(%) |> console.error(%);
|
||
|
` ${path}` |> chalk.dim(%) |> console.error(%);
|
||
|
1 |> process.exit(%);
|
||
|
}
|
||
|
const {
|
||
|
archivePath,
|
||
|
buildID
|
||
|
} = path |> readJsonSync(%);
|
||
|
return {
|
||
|
archivePath,
|
||
|
buildID
|
||
|
};
|
||
|
}
|
||
|
function saveBuildMetadata({
|
||
|
archivePath,
|
||
|
buildID
|
||
|
}) {
|
||
|
const path = BUILD_METADATA_TEMP_DIRECTORY |> join(%, 'metadata');
|
||
|
if (!(BUILD_METADATA_TEMP_DIRECTORY |> existsSync(%))) {
|
||
|
BUILD_METADATA_TEMP_DIRECTORY |> mkdirSync(%);
|
||
|
}
|
||
|
writeJsonSync(path, {
|
||
|
archivePath,
|
||
|
buildID
|
||
|
}, {
|
||
|
spaces: 2
|
||
|
});
|
||
|
}
|
||
|
module.exports = {
|
||
|
checkNPMPermissions,
|
||
|
clear,
|
||
|
confirm,
|
||
|
confirmContinue,
|
||
|
execRead,
|
||
|
logger,
|
||
|
readSavedBuildMetadata,
|
||
|
saveBuildMetadata
|
||
|
};
|