tsds-publish
Version:
Development stack for TypeScript libraries
104 lines (103 loc) • 4.15 kB
JavaScript
import spawn from 'cross-spawn-cb';
import fs from 'fs';
import { safeRm } from 'fs-remove-compat';
import getopts from 'getopts-compat';
import { bind } from 'node-version-call';
import path from 'path';
import Queue from 'queue-cb';
import url from 'url';
import hasChanged from './lib/hasChanged.js';
const major = +process.versions.node.split('.')[0];
const __dirname = path.dirname(typeof __filename === 'undefined' ? url.fileURLToPath(import.meta.url) : __filename);
const dist = path.join(__dirname, '..');
function run(args, options_, callback) {
var _options_package;
const cwd = options_.cwd || process.cwd();
const options = {
...options_
};
options.package = options.package || JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf8'));
if ((_options_package = options.package) === null || _options_package === void 0 ? void 0 : _options_package.private) {
var _options_package1;
console.log(`Skipping ${(_options_package1 = options.package) === null || _options_package1 === void 0 ? void 0 : _options_package1.name}. Private`);
return callback();
}
const opts = getopts(args, {
alias: {
otp: 'o',
'dry-run': 'd'
},
boolean: [
'yolo',
'dry-run'
]
});
hasChanged(options, (err, result)=>{
var _options_package;
if (err) return callback(err);
if (!(result === null || result === void 0 ? void 0 : result.changed)) {
var _options_package1;
console.log(`Skipping ${(_options_package1 = options.package) === null || _options_package1 === void 0 ? void 0 : _options_package1.name}. ${result === null || result === void 0 ? void 0 : result.reason}`);
callback();
return;
}
console.log(`Publishing ${(_options_package = options.package) === null || _options_package === void 0 ? void 0 : _options_package.name}. ${result === null || result === void 0 ? void 0 : result.reason}`);
const queue = new Queue(1);
// run tests
if (!opts.yolo) {
queue.defer((cb)=>safeRm(path.join(cwd, 'node_modules'), (err)=>cb(err)));
queue.defer(spawn.bind(null, 'npm', [
'ci'
], {
...options,
cwd
}));
queue.defer(spawn.bind(null, 'npm', [
'test'
], {
...options,
cwd
}));
}
// update the version
const versionArgs = [
'version',
opts._.length > 0 ? opts._[0] : 'patch'
];
queue.defer((cb)=>spawn('npm', versionArgs, options, (err)=>{
if (err) return cb(err);
options.package = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf8'));
cb();
}));
// do publish
// Safeguard: block actual publish in test environment without --dry-run
if (process.env.NODE_ENV === 'test' && !opts['dry-run']) {
return callback(new Error('Cannot publish in test environment without --dry-run'));
}
const publishArgs = [
'publish'
];
if (opts['dry-run']) publishArgs.push('--dry-run');
if (opts.otp) publishArgs.push(`--otp=${opts.otp}`);
queue.defer(spawn.bind(null, 'npm', publishArgs, options));
queue.defer((cb)=>spawn('git', [
'add',
'.'
], options, ()=>cb()));
queue.defer((cb)=>{
var _options_package;
return spawn('git', [
'commit',
'-m',
`${(_options_package = options.package) === null || _options_package === void 0 ? void 0 : _options_package.version}`
], options, ()=>cb());
});
queue.await(callback);
});
}
const worker = major >= 20 ? run : bind('>=20', path.join(dist, 'cjs', 'command.js'), {
callbacks: true
});
export default function publish(args, options, callback) {
worker(args, options, callback);
}