const { execFileSync } = require('child_process');
const path = require('path');
const packageRoot = path.resolve(__dirname, '..');
const packageJson = require(path.join(packageRoot, 'package.json'));
const optionalDependencies = packageJson.optionalDependencies || {};
if (process.env.OPENCC_NPM_PUBLISH_DRY_RUN === 'true') {
console.log(
'Skipping published optional dependency checks during npm publish dry-run.'
);
process.exit(0);
}
function npmViewVersion(packageName, version) {
const spec = `${packageName}@${version}`;
try {
return execFileSync('npm', ['view', spec, 'version'], {
encoding: 'utf8',
stdio: ['ignore', 'pipe', 'pipe'],
}).trim();
} catch (error) {
return null;
}
}
let hasError = false;
for (const [packageName, version] of Object.entries(optionalDependencies)) {
if (!packageName.startsWith('@opencc/opencc-')) {
continue;
}
const publishedVersion = npmViewVersion(packageName, version);
if (publishedVersion !== version) {
console.error(
`Missing published optional dependency: ${packageName}@${version}`
);
hasError = true;
}
}
if (hasError) {
console.error('Publish the scoped binary packages before publishing opencc.');
process.exit(1);
}
console.log(
`All optional binary packages for opencc@${packageJson.version} ` +
'are published.'
);