173 lines
4.8 KiB
JavaScript
173 lines
4.8 KiB
JavaScript
import fs from 'node:fs';
|
|
import { createRequire } from 'node:module';
|
|
import path, { dirname, join, win32 } from 'node:path';
|
|
import process from 'node:process';
|
|
import fsPromises from 'node:fs/promises';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { resolvePathSync, interopDefault } from 'mlly';
|
|
import { quansync } from 'quansync/macro';
|
|
|
|
const toPath = urlOrPath => urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;
|
|
|
|
async function findUp$1(name, {
|
|
cwd = process.cwd(),
|
|
type = 'file',
|
|
stopAt,
|
|
} = {}) {
|
|
let directory = path.resolve(toPath(cwd) ?? '');
|
|
const {root} = path.parse(directory);
|
|
stopAt = path.resolve(directory, toPath(stopAt ?? root));
|
|
const isAbsoluteName = path.isAbsolute(name);
|
|
|
|
while (directory) {
|
|
const filePath = isAbsoluteName ? name : path.join(directory, name);
|
|
try {
|
|
const stats = await fsPromises.stat(filePath); // eslint-disable-line no-await-in-loop
|
|
if ((type === 'file' && stats.isFile()) || (type === 'directory' && stats.isDirectory())) {
|
|
return filePath;
|
|
}
|
|
} catch {}
|
|
|
|
if (directory === stopAt || directory === root) {
|
|
break;
|
|
}
|
|
|
|
directory = path.dirname(directory);
|
|
}
|
|
}
|
|
|
|
function findUpSync(name, {
|
|
cwd = process.cwd(),
|
|
type = 'file',
|
|
stopAt,
|
|
} = {}) {
|
|
let directory = path.resolve(toPath(cwd) ?? '');
|
|
const {root} = path.parse(directory);
|
|
stopAt = path.resolve(directory, toPath(stopAt) ?? root);
|
|
const isAbsoluteName = path.isAbsolute(name);
|
|
|
|
while (directory) {
|
|
const filePath = isAbsoluteName ? name : path.join(directory, name);
|
|
|
|
try {
|
|
const stats = fs.statSync(filePath, {throwIfNoEntry: false});
|
|
if ((type === 'file' && stats?.isFile()) || (type === 'directory' && stats?.isDirectory())) {
|
|
return filePath;
|
|
}
|
|
} catch {}
|
|
|
|
if (directory === stopAt || directory === root) {
|
|
break;
|
|
}
|
|
|
|
directory = path.dirname(directory);
|
|
}
|
|
}
|
|
|
|
function _resolve(path, options = {}) {
|
|
if (options.platform === "auto" || !options.platform)
|
|
options.platform = process.platform === "win32" ? "win32" : "posix";
|
|
if (process.versions.pnp) {
|
|
const paths = options.paths || [];
|
|
if (paths.length === 0)
|
|
paths.push(process.cwd());
|
|
const targetRequire = createRequire(import.meta.url);
|
|
try {
|
|
return targetRequire.resolve(path, { paths });
|
|
} catch {
|
|
}
|
|
}
|
|
const modulePath = resolvePathSync(path, {
|
|
url: options.paths
|
|
});
|
|
if (options.platform === "win32")
|
|
return win32.normalize(modulePath);
|
|
return modulePath;
|
|
}
|
|
function resolveModule(name, options = {}) {
|
|
try {
|
|
return _resolve(name, options);
|
|
} catch {
|
|
return void 0;
|
|
}
|
|
}
|
|
async function importModule(path) {
|
|
const i = await import(path);
|
|
if (i)
|
|
return interopDefault(i);
|
|
return i;
|
|
}
|
|
function isPackageExists(name, options = {}) {
|
|
return !!resolvePackage(name, options);
|
|
}
|
|
function getPackageJsonPath(name, options = {}) {
|
|
const entry = resolvePackage(name, options);
|
|
if (!entry)
|
|
return;
|
|
return searchPackageJSON(entry);
|
|
}
|
|
const readFile = quansync({
|
|
async: (id) => fs.promises.readFile(id, "utf8"),
|
|
sync: (id) => fs.readFileSync(id, "utf8")
|
|
});
|
|
const getPackageInfo = quansync(function* (name, options = {}) {
|
|
const packageJsonPath = getPackageJsonPath(name, options);
|
|
if (!packageJsonPath)
|
|
return;
|
|
const packageJson = JSON.parse(yield readFile(packageJsonPath));
|
|
return {
|
|
name,
|
|
version: packageJson.version,
|
|
rootPath: dirname(packageJsonPath),
|
|
packageJsonPath,
|
|
packageJson
|
|
};
|
|
});
|
|
const getPackageInfoSync = getPackageInfo.sync;
|
|
function resolvePackage(name, options = {}) {
|
|
try {
|
|
return _resolve(`${name}/package.json`, options);
|
|
} catch {
|
|
}
|
|
try {
|
|
return _resolve(name, options);
|
|
} catch (e) {
|
|
if (e.code !== "MODULE_NOT_FOUND" && e.code !== "ERR_MODULE_NOT_FOUND")
|
|
console.error(e);
|
|
return false;
|
|
}
|
|
}
|
|
function searchPackageJSON(dir) {
|
|
let packageJsonPath;
|
|
while (true) {
|
|
if (!dir)
|
|
return;
|
|
const newDir = dirname(dir);
|
|
if (newDir === dir)
|
|
return;
|
|
dir = newDir;
|
|
packageJsonPath = join(dir, "package.json");
|
|
if (fs.existsSync(packageJsonPath))
|
|
break;
|
|
}
|
|
return packageJsonPath;
|
|
}
|
|
const findUp = quansync({
|
|
sync: findUpSync,
|
|
async: findUp$1
|
|
});
|
|
const loadPackageJSON = quansync(function* (cwd = process.cwd()) {
|
|
const path = yield findUp("package.json", { cwd });
|
|
if (!path || !fs.existsSync(path))
|
|
return null;
|
|
return JSON.parse(yield readFile(path));
|
|
});
|
|
const loadPackageJSONSync = loadPackageJSON.sync;
|
|
const isPackageListed = quansync(function* (name, cwd) {
|
|
const pkg = (yield loadPackageJSON(cwd)) || {};
|
|
return name in (pkg.dependencies || {}) || name in (pkg.devDependencies || {});
|
|
});
|
|
const isPackageListedSync = isPackageListed.sync;
|
|
|
|
export { getPackageInfo, getPackageInfoSync, importModule, isPackageExists, isPackageListed, isPackageListedSync, loadPackageJSON, loadPackageJSONSync, resolveModule };
|