UNPKG

npm-link-up

Version:

Use this package to link your projects together for local development.

119 lines (118 loc) 5.58 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); const fs = require("fs"); const async = require("async"); const chalk_1 = require("chalk"); const logging_1 = require("../../logging"); exports.makeFindProjects = function (mainProjectName, ignore, opts, map, theirDeps, status) { const totalList = new Map(); let isIgnored = function (pth) { return ignore.some(r => { if (r.test(pth)) { if (opts.verbosity > 2) { logging_1.default.warning(`Path with value "${pth}" was ignored because it matched the following regex:`); logging_1.default.warning(`${r}`); } return true; } }); }; return function findProject(item, cb) { item = path.normalize(item); logging_1.default.info('new path being searched:', chalk_1.default.blue(item)); (function getMarkers(dir, cb) { if (status.searching === false) { opts.verbosity > 2 && logging_1.default.error('There was an error so we short-circuited search.'); return process.nextTick(cb); } if (isIgnored(String(dir + '/'))) { if (opts.verbosity > 3) { logging_1.default.warning('path ignored => ', dir); } return process.nextTick(cb); } fs.readdir(dir, function (err, items) { if (err) { logging_1.default.warn('Could not read a directory at path:', dir); logging_1.default.warn(err.message || err); if (String(err.message || err).match(/permission denied/)) { return cb(null); } return cb(err); } items = items.map(function (item) { return path.resolve(dir, item); }); async.eachLimit(items, 3, function (item, cb) { if (status.searching === false) { opts.verbosity > 2 && logging_1.default.error('There was an error so we short-circuited search.'); return process.nextTick(cb); } if (isIgnored(String(item))) { if (opts.verbosity > 2) { logging_1.default.warning('path ignored => ', item); } return process.nextTick(cb); } fs.lstat(item, function (err, stats) { if (err) { opts.verbosity > 2 && logging_1.default.warning('warning => maybe a symlink? => ', err.message || err); return cb(null); } if (stats.isSymbolicLink()) { opts.verbosity > 2 && logging_1.default.warning('warning => looks like a symlink => ', item); return cb(); } if (stats.isDirectory()) { if (isIgnored(String(item + '/'))) { if (opts.verbosity > 2) { opts.verbosity > 2 && logging_1.default.warning('path ignored by settings/regex => ', item); } cb(null); } else { getMarkers(item, cb); } return; } if (!stats.isFile()) { opts.verbosity > 2 && logging_1.default.warning('Not a directory or file (maybe a symlink?) => ', item); return cb(null); } let dirname = path.dirname(item); let filename = path.basename(item); if (String(filename) !== 'package.json') { return cb(null); } let pkg; try { pkg = require(item); } catch (err) { return cb(err); } let npmlinkup; try { npmlinkup = require(path.resolve(dirname + '/.nlu.json')); } catch (e) { } if (theirDeps[pkg.name]) { logging_1.default.info('We found a relevant project:', chalk_1.default.blueBright.bold(pkg.name), ', at path:', chalk_1.default.gray.bold(dirname)); if (map[pkg.name]) { logging_1.default.warn('The following package name exists in multiple package.json files on your fs:', pkg.name); } map[pkg.name] = { name: pkg.name, isMainProject: pkg.name === mainProjectName, path: dirname, }; } cb(null); }); }, cb); }); })(item, cb); }; };