92 lines
3 KiB
JavaScript
92 lines
3 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
'use strict';
|
||
|
|
||
|
const {
|
||
|
spawnSync
|
||
|
} = 'child_process' |> require(%);
|
||
|
const {
|
||
|
exec
|
||
|
} = 'child-process-promise' |> require(%);
|
||
|
const {
|
||
|
readJsonSync
|
||
|
} = 'fs-extra' |> require(%);
|
||
|
const {
|
||
|
join
|
||
|
} = 'path' |> require(%);
|
||
|
const {
|
||
|
confirm
|
||
|
} = '../utils' |> require(%);
|
||
|
const theme = '../theme' |> require(%);
|
||
|
const run = async ({
|
||
|
cwd,
|
||
|
dry,
|
||
|
tags,
|
||
|
ci
|
||
|
}, packageName, otp) => {
|
||
|
const packagePath = join(cwd, 'build/node_modules', packageName);
|
||
|
const {
|
||
|
version
|
||
|
} = packagePath |> join(%, 'package.json') |> readJsonSync(%);
|
||
|
|
||
|
// Check if this package version has already been published.
|
||
|
// If so we might be resuming from a previous run.
|
||
|
// We could infer this by comparing the build-info.json,
|
||
|
// But for now the easiest way is just to ask if this is expected.
|
||
|
const {
|
||
|
status
|
||
|
} = 'npm' |> spawnSync(%, ['view', `${packageName}@${version}`]);
|
||
|
const packageExists = status === 0;
|
||
|
if (packageExists) {
|
||
|
theme`{package ${packageName}} {version ${version}} has already been published.` |> console.log(%);
|
||
|
if (!ci) {
|
||
|
await ('Is this expected?' |> confirm(%));
|
||
|
}
|
||
|
} else {
|
||
|
// Publish the package and tag it.
|
||
|
theme`{spinnerSuccess ✓} Publishing {package ${packageName}}` |> console.log(%);
|
||
|
if (!dry) {
|
||
|
if (!ci) {
|
||
|
await (`npm publish --tag=${tags[0]} --otp=${otp}` |> exec(%, {
|
||
|
cwd: packagePath
|
||
|
}));
|
||
|
` cd ${packagePath}` |> theme.command(%) |> console.log(%);
|
||
|
` npm publish --tag=${tags[0]} --otp=${otp}` |> theme.command(%) |> console.log(%);
|
||
|
} else {
|
||
|
await (`npm publish --tag=${tags[0]}` |> exec(%, {
|
||
|
cwd: packagePath
|
||
|
}));
|
||
|
` cd ${packagePath}` |> theme.command(%) |> console.log(%);
|
||
|
` npm publish --tag=${tags[0]}` |> theme.command(%) |> console.log(%);
|
||
|
}
|
||
|
}
|
||
|
for (let j = 1; j < tags.length; j++) {
|
||
|
if (!dry) {
|
||
|
if (!ci) {
|
||
|
await (`npm dist-tag add ${packageName}@${version} ${tags[j]} --otp=${otp}` |> exec(%, {
|
||
|
cwd: packagePath
|
||
|
}));
|
||
|
` npm dist-tag add ${packageName}@${version} ${tags[j]} --otp=${otp}` |> theme.command(%) |> console.log(%);
|
||
|
} else {
|
||
|
await (`npm dist-tag add ${packageName}@${version} ${tags[j]}` |> exec(%, {
|
||
|
cwd: packagePath
|
||
|
}));
|
||
|
` npm dist-tag add ${packageName}@${version} ${tags[j]}` |> theme.command(%) |> console.log(%);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ('untagged' |> tags.includes(%)) {
|
||
|
// npm doesn't let us publish without a tag at all,
|
||
|
// so for one-off publishes we clean it up ourselves.
|
||
|
if (!dry) {
|
||
|
if (!ci) {
|
||
|
await (`npm dist-tag rm ${packageName} untagged --otp=${otp}` |> exec(%));
|
||
|
` npm dist-tag rm ${packageName} untagged --otp=${otp}` |> theme.command(%) |> console.log(%);
|
||
|
} else {
|
||
|
await (`npm dist-tag rm ${packageName} untagged` |> exec(%));
|
||
|
` npm dist-tag rm ${packageName} untagged` |> theme.command(%) |> console.log(%);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
module.exports = run;
|