Newer
Older
#!/usr/bin/env node
/**
* Useful for development: installs or links addons from a given directory.
*/
const fs = require('fs'),
path = require('path'),
glob = require('glob'),
mkdirp = require('mkdirp');
const DEFAULT_CONTEXT = 'jscoq+64bit';
const opts = require('commander')
//.option('-l, --link', 'create symbolic links instead of copying')
.option('-c,--build-context <switch>', 'Dune context to look in for build artifacts', DEFAULT_CONTEXT)
.parse();
const pkgDir = './node_modules',
pkgPrefix = '@jscoq/',
buildRel = `_build/${opts.buildContext}`;
function consumeFromDirectory(dir) {
dir = cd_maybe(dir, buildRel);
for (let fn of glob.sync('**/package.json', {cwd: dir})) {
try {
var manifest = JSON.parse(fs.readFileSync(path.join(dir, fn)));
}
catch (e) {
console.warn(`in ${fn}:`, e); continue;
}
if (manifest.name.startsWith(pkgPrefix)) {
var source = path.join(buildRel, pkgDir, manifest.name),
target = path.join(dir, path.dirname(fn));
console.log(`${manifest.name} --> ${target}`);
mkdirp.sync(path.dirname(source));
ln_sf(path.resolve(target), source);
}
}
}
// `ln -sf`
function ln_sf(target, source) {
var exists = false;
try { fs.lstatSync(source); exists = true; } catch {}
if (exists) fs.unlinkSync(source);
fs.symlinkSync(target, source);
}
function cd_maybe(dir, rel) {
var d = path.join(dir, rel);
try {
if (fs.statSync(d).isDirectory()) return d
}
catch {}
return dir;
}
for (let dir of opts.args) {
consumeFromDirectory(dir);
}