53 lines
1.6 KiB
JavaScript
Executable file
53 lines
1.6 KiB
JavaScript
Executable file
#!/usr/bin/env node
|
|
|
|
/* Usage:
|
|
* node fixup_bin.js <bin_dir> <modules_dir> [<bin_pkg_1>, <bin_pkg_2> ... ]
|
|
*/
|
|
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const derivationBinPath = process.argv[2];
|
|
const nodeModules = process.argv[3];
|
|
const packagesToPublishBin = process.argv.slice(4);
|
|
|
|
function processPackage(name) {
|
|
console.log("fixup_bin: Processing ", name);
|
|
|
|
const packagePath = `${nodeModules}/${name}`;
|
|
const packageJsonPath = `${packagePath}/package.json`;
|
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath));
|
|
|
|
if (!packageJson.bin) {
|
|
console.log("fixup_bin: No binaries provided");
|
|
return;
|
|
}
|
|
|
|
// There are two alternative syntaxes for `bin`
|
|
// a) just a plain string, in which case the name of the package is the name of the binary.
|
|
// b) an object, where key is the name of the eventual binary, and the value the path to that binary.
|
|
if (typeof packageJson.bin === "string") {
|
|
const binName = packageJson.bin;
|
|
packageJson.bin = {};
|
|
packageJson.bin[packageJson.name] = binName;
|
|
}
|
|
|
|
// eslint-disable-next-line no-restricted-syntax, guard-for-in
|
|
for (const binName in packageJson.bin) {
|
|
const binPath = packageJson.bin[binName];
|
|
const normalizedBinName = binName.replace("@", "").replace("/", "-");
|
|
|
|
const targetPath = path.normalize(`${packagePath}/${binPath}`);
|
|
const createdPath = `${derivationBinPath}/${normalizedBinName}`;
|
|
|
|
console.log(
|
|
`fixup_bin: creating link ${createdPath} that points to ${targetPath}`
|
|
);
|
|
|
|
fs.symlinkSync(targetPath, createdPath);
|
|
}
|
|
}
|
|
|
|
packagesToPublishBin.forEach(pkg => {
|
|
processPackage(pkg);
|
|
});
|