Import the supplied management frontend, including request encryption, withdrawal updates, and vendored dependencies. Use incoming versions for overlapping source files and retain existing environment configuration absent from the supplied directory.
217 lines
7.0 KiB
JavaScript
217 lines
7.0 KiB
JavaScript
var isCore = require('is-core-module');
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var $Error = require('es-errors');
|
|
var $TypeError = require('es-errors/type');
|
|
|
|
var getHomedir = require('./homedir');
|
|
var caller = require('./caller');
|
|
var nodeModulesPaths = require('./node-modules-paths');
|
|
var normalizeOptions = require('./normalize-options');
|
|
|
|
var realpathFS = process.platform !== 'win32' && fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync;
|
|
|
|
var relativePathRegex = /^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/;
|
|
var windowsDriveRegex = /^\w:[/\\]*$/;
|
|
var nodeModulesRegex = /[/\\]node_modules[/\\]*$/;
|
|
|
|
var homedir = getHomedir();
|
|
function defaultPaths() {
|
|
if (!homedir) return [];
|
|
return [
|
|
path.join(homedir, '.node_modules'),
|
|
path.join(homedir, '.node_libraries')
|
|
];
|
|
}
|
|
|
|
var defaultIsFile = function isFile(file) {
|
|
try {
|
|
var stat = fs.statSync(file, { throwIfNoEntry: false });
|
|
} catch (e) {
|
|
if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
|
|
throw e;
|
|
}
|
|
return !!stat && (stat.isFile() || stat.isFIFO());
|
|
};
|
|
|
|
var defaultIsDir = function isDirectory(dir) {
|
|
try {
|
|
var stat = fs.statSync(dir, { throwIfNoEntry: false });
|
|
} catch (e) {
|
|
if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
|
|
throw e;
|
|
}
|
|
return !!stat && stat.isDirectory();
|
|
};
|
|
|
|
var defaultRealpathSync = function realpathSync(x) {
|
|
try {
|
|
return realpathFS(x);
|
|
} catch (realpathErr) {
|
|
if (realpathErr.code !== 'ENOENT') {
|
|
throw realpathErr;
|
|
}
|
|
}
|
|
return x;
|
|
};
|
|
|
|
function maybeRealpathSync(realpathSync, x, opts) {
|
|
if (opts && opts.preserveSymlinks === false) {
|
|
return realpathSync(x);
|
|
}
|
|
return x;
|
|
}
|
|
|
|
function defaultReadPackageSync(readFileSync, pkgfile) {
|
|
var body = readFileSync(pkgfile);
|
|
try {
|
|
var pkg = JSON.parse(body);
|
|
return pkg;
|
|
} catch (jsonErr) {}
|
|
}
|
|
|
|
function getPackageCandidates(x, start, opts) {
|
|
var dirs = nodeModulesPaths(start, opts, x);
|
|
for (var i = 0; i < dirs.length; i++) {
|
|
dirs[i] = path.join(dirs[i], x);
|
|
}
|
|
return dirs;
|
|
}
|
|
|
|
module.exports = function resolveSync(x, options) {
|
|
if (typeof x !== 'string') {
|
|
throw new $TypeError('Path must be a string.');
|
|
}
|
|
var opts = normalizeOptions(x, options);
|
|
|
|
var isFile = opts.isFile || defaultIsFile;
|
|
var readFileSync = opts.readFileSync || fs.readFileSync;
|
|
var isDirectory = opts.isDirectory || defaultIsDir;
|
|
var realpathSync = opts.realpathSync || defaultRealpathSync;
|
|
var readPackageSync = opts.readPackageSync || defaultReadPackageSync;
|
|
if (opts.readFileSync && opts.readPackageSync) {
|
|
throw new $TypeError('`readFileSync` and `readPackageSync` are mutually exclusive.');
|
|
}
|
|
var packageIterator = opts.packageIterator;
|
|
|
|
var extensions = opts.extensions || ['.js'];
|
|
var includeCoreModules = opts.includeCoreModules !== false;
|
|
var basedir = opts.basedir || path.dirname(caller());
|
|
var parent = opts.filename || basedir;
|
|
|
|
opts.paths = opts.paths || defaultPaths();
|
|
|
|
// ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
|
|
var absoluteStart = maybeRealpathSync(realpathSync, path.resolve(basedir), opts);
|
|
|
|
if (relativePathRegex.test(x)) {
|
|
var res = path.resolve(absoluteStart, x);
|
|
if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/';
|
|
var m = loadAsFileSync(res) || loadAsDirectorySync(res);
|
|
if (m) return maybeRealpathSync(realpathSync, m, opts);
|
|
} else if (includeCoreModules && isCore(x)) {
|
|
return x;
|
|
} else {
|
|
var n = loadNodeModulesSync(x, absoluteStart);
|
|
if (n) return maybeRealpathSync(realpathSync, n, opts);
|
|
}
|
|
|
|
var err = new $Error("Cannot find module '" + x + "' from '" + parent + "'");
|
|
err.code = 'MODULE_NOT_FOUND';
|
|
throw err;
|
|
|
|
function loadAsFileSync(x) {
|
|
var pkg = loadpkg(path.dirname(x));
|
|
|
|
if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) {
|
|
var rfile = path.relative(pkg.dir, x);
|
|
var r = opts.pathFilter(pkg.pkg, x, rfile);
|
|
if (r) {
|
|
x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign
|
|
}
|
|
}
|
|
|
|
if (isFile(x)) {
|
|
return x;
|
|
}
|
|
|
|
for (var i = 0; i < extensions.length; i++) {
|
|
var file = x + extensions[i];
|
|
if (isFile(file)) {
|
|
return file;
|
|
}
|
|
}
|
|
}
|
|
|
|
function loadpkg(dir) {
|
|
if (dir === '' || dir === '/') return;
|
|
if (process.platform === 'win32' && windowsDriveRegex.test(dir)) {
|
|
return;
|
|
}
|
|
if (nodeModulesRegex.test(dir)) return;
|
|
|
|
var pkgfile = path.join(maybeRealpathSync(realpathSync, dir, opts), 'package.json');
|
|
|
|
if (!isFile(pkgfile)) {
|
|
return loadpkg(path.dirname(dir));
|
|
}
|
|
|
|
var pkg = readPackageSync(readFileSync, pkgfile);
|
|
|
|
if (pkg && opts.packageFilter) {
|
|
// v2 will pass pkgfile
|
|
pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment
|
|
}
|
|
|
|
return { pkg: pkg, dir: dir };
|
|
}
|
|
|
|
function loadAsDirectorySync(x) {
|
|
var pkgfile = path.join(maybeRealpathSync(realpathSync, x, opts), '/package.json');
|
|
if (isFile(pkgfile)) {
|
|
try {
|
|
var pkg = readPackageSync(readFileSync, pkgfile);
|
|
} catch (e) {}
|
|
|
|
if (pkg && opts.packageFilter) {
|
|
// v2 will pass pkgfile
|
|
pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment
|
|
}
|
|
|
|
if (pkg && pkg.main) {
|
|
if (typeof pkg.main !== 'string') {
|
|
var mainError = new $TypeError('package “' + pkg.name + '” `main` must be a string');
|
|
mainError.code = 'INVALID_PACKAGE_MAIN';
|
|
throw mainError;
|
|
}
|
|
if (pkg.main === '.' || pkg.main === './') {
|
|
pkg.main = 'index';
|
|
}
|
|
try {
|
|
var m = loadAsFileSync(path.resolve(x, pkg.main));
|
|
if (m) return m;
|
|
var n = loadAsDirectorySync(path.resolve(x, pkg.main));
|
|
if (n) return n;
|
|
} catch (e) {}
|
|
}
|
|
}
|
|
|
|
return loadAsFileSync(path.join(x, '/index'));
|
|
}
|
|
|
|
function loadNodeModulesSync(x, start) {
|
|
var thunk = function () { return getPackageCandidates(x, start, opts); };
|
|
var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk();
|
|
|
|
for (var i = 0; i < dirs.length; i++) {
|
|
var dir = dirs[i];
|
|
if (isDirectory(path.dirname(dir))) {
|
|
var m = loadAsFileSync(dir);
|
|
if (m) return m;
|
|
var n = loadAsDirectorySync(dir);
|
|
if (n) return n;
|
|
}
|
|
}
|
|
}
|
|
};
|