1
0
Fork 0
management/front/dkha-web-sz-main/node_modules/eslint-module-utils/resolve.js

235 lines
6.7 KiB
JavaScript
Raw Normal View History

2023-12-28 23:41:32 +08:00
'use strict';
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
exports.__esModule = true;
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
const fs = require('fs');
const Module = require('module');
const path = require('path');
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
const hashObject = require('./hash').hashObject;
const ModuleCache = require('./ModuleCache').default;
const pkgDir = require('./pkgDir').default;
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
const CASE_SENSITIVE_FS = !fs.existsSync(path.join(__dirname.toUpperCase(), 'reSOLVE.js'));
exports.CASE_SENSITIVE_FS = CASE_SENSITIVE_FS;
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
const ERROR_NAME = 'EslintPluginImportResolveError';
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
const fileExistsCache = new ModuleCache();
// Polyfill Node's `Module.createRequireFromPath` if not present (added in Node v10.12.0)
// Use `Module.createRequire` if available (added in Node v12.2.0)
const createRequire = Module.createRequire || Module.createRequireFromPath || function (filename) {
const mod = new Module(filename, null);
mod.filename = filename;
mod.paths = Module._nodeModulePaths(path.dirname(filename));
mod._compile(`module.exports = require;`, filename);
return mod.exports;
};
function tryRequire(target, sourceFile) {
2023-12-18 13:12:25 +08:00
let resolved;
try {
// Check if the target exists
2023-12-28 23:41:32 +08:00
if (sourceFile != null) {
try {
resolved = createRequire(path.resolve(sourceFile)).resolve(target);
} catch (e) {
resolved = require.resolve(target);
}
} else {
resolved = require.resolve(target);
}
} catch (e) {
2023-12-18 13:12:25 +08:00
// If the target does not exist then just return undefined
return undefined;
}
// If the target exists then return the loaded module
return require(resolved);
}
2023-12-28 23:41:32 +08:00
// https://stackoverflow.com/a/27382838
exports.fileExistsWithCaseSync = function fileExistsWithCaseSync(filepath, cacheSettings, strict) {
2023-12-18 13:12:25 +08:00
// don't care if the FS is case-sensitive
2023-12-28 23:41:32 +08:00
if (CASE_SENSITIVE_FS) { return true; }
2023-12-18 13:12:25 +08:00
// null means it resolved to a builtin
2023-12-28 23:41:32 +08:00
if (filepath === null) { return true; }
if (filepath.toLowerCase() === process.cwd().toLowerCase() && !strict) { return true; }
const parsedPath = path.parse(filepath);
const dir = parsedPath.dir;
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
let result = fileExistsCache.get(filepath, cacheSettings);
if (result != null) { return result; }
2023-12-18 13:12:25 +08:00
// base case
if (dir === '' || parsedPath.root === filepath) {
2023-12-28 23:41:32 +08:00
result = true;
2023-12-18 13:12:25 +08:00
} else {
2023-12-28 23:41:32 +08:00
const filenames = fs.readdirSync(dir);
2023-12-18 13:12:25 +08:00
if (filenames.indexOf(parsedPath.base) === -1) {
2023-12-28 23:41:32 +08:00
result = false;
2023-12-18 13:12:25 +08:00
} else {
2023-12-28 23:41:32 +08:00
result = fileExistsWithCaseSync(dir, cacheSettings, strict);
2023-12-18 13:12:25 +08:00
}
}
2023-12-28 23:41:32 +08:00
fileExistsCache.set(filepath, result);
return result;
};
2023-12-18 13:12:25 +08:00
function relative(modulePath, sourceFile, settings) {
2023-12-28 23:41:32 +08:00
return fullResolve(modulePath, sourceFile, settings).path;
2023-12-18 13:12:25 +08:00
}
2023-12-28 23:41:32 +08:00
let prevSettings = null;
let memoizedHash = '';
2023-12-18 13:12:25 +08:00
function fullResolve(modulePath, sourceFile, settings) {
// check if this is a bonus core module
2023-12-28 23:41:32 +08:00
const coreSet = new Set(settings['import/core-modules']);
if (coreSet.has(modulePath)) { return { found: true, path: null }; }
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
const sourceDir = path.dirname(sourceFile);
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
if (prevSettings !== settings) {
memoizedHash = hashObject(settings).digest('hex');
prevSettings = settings;
}
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
const cacheKey = sourceDir + memoizedHash + modulePath;
const cacheSettings = ModuleCache.getSettings(settings);
const cachedPath = fileExistsCache.get(cacheKey, cacheSettings);
if (cachedPath !== undefined) { return { found: true, path: cachedPath }; }
2023-12-18 13:12:25 +08:00
function cache(resolvedPath) {
2023-12-28 23:41:32 +08:00
fileExistsCache.set(cacheKey, resolvedPath);
2023-12-18 13:12:25 +08:00
}
function withResolver(resolver, config) {
2023-12-28 23:41:32 +08:00
if (resolver.interfaceVersion === 2) {
return resolver.resolve(modulePath, sourceFile, config);
2023-12-18 13:12:25 +08:00
}
2023-12-28 23:41:32 +08:00
try {
const resolved = resolver.resolveImport(modulePath, sourceFile, config);
if (resolved === undefined) { return { found: false }; }
return { found: true, path: resolved };
} catch (err) {
return { found: false };
2023-12-18 13:12:25 +08:00
}
}
2023-12-28 23:41:32 +08:00
const configResolvers = settings['import/resolver']
|| { node: settings['import/resolve'] }; // backward compatibility
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
const resolvers = resolverReducer(configResolvers, new Map());
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
for (const pair of resolvers) {
const name = pair[0];
const config = pair[1];
const resolver = requireResolver(name, sourceFile);
const resolved = withResolver(resolver, config);
2023-12-18 13:12:25 +08:00
2023-12-28 23:41:32 +08:00
if (!resolved.found) { continue; }
2023-12-18 13:12:25 +08:00
// else, counts
2023-12-28 23:41:32 +08:00
cache(resolved.path);
return resolved;
2023-12-18 13:12:25 +08:00
}
// failed
// cache(undefined)
2023-12-28 23:41:32 +08:00
return { found: false };
2023-12-18 13:12:25 +08:00
}
2023-12-28 23:41:32 +08:00
exports.relative = relative;
2023-12-18 13:12:25 +08:00
function resolverReducer(resolvers, map) {
2023-12-28 23:41:32 +08:00
if (Array.isArray(resolvers)) {
resolvers.forEach((r) => resolverReducer(r, map));
return map;
2023-12-18 13:12:25 +08:00
}
if (typeof resolvers === 'string') {
2023-12-28 23:41:32 +08:00
map.set(resolvers, null);
return map;
2023-12-18 13:12:25 +08:00
}
if (typeof resolvers === 'object') {
2023-12-28 23:41:32 +08:00
for (const key in resolvers) {
map.set(key, resolvers[key]);
2023-12-18 13:12:25 +08:00
}
2023-12-28 23:41:32 +08:00
return map;
2023-12-18 13:12:25 +08:00
}
2023-12-28 23:41:32 +08:00
const err = new Error('invalid resolver config');
err.name = ERROR_NAME;
throw err;
2023-12-18 13:12:25 +08:00
}
function getBaseDir(sourceFile) {
2023-12-28 23:41:32 +08:00
return pkgDir(sourceFile) || process.cwd();
2023-12-18 13:12:25 +08:00
}
function requireResolver(name, sourceFile) {
// Try to resolve package with conventional name
2023-12-28 23:41:32 +08:00
const resolver = tryRequire(`eslint-import-resolver-${name}`, sourceFile)
|| tryRequire(name, sourceFile)
|| tryRequire(path.resolve(getBaseDir(sourceFile), name));
2023-12-18 13:12:25 +08:00
if (!resolver) {
2023-12-28 23:41:32 +08:00
const err = new Error(`unable to load resolver "${name}".`);
err.name = ERROR_NAME;
throw err;
2023-12-18 13:12:25 +08:00
}
if (!isResolverValid(resolver)) {
2023-12-28 23:41:32 +08:00
const err = new Error(`${name} with invalid interface loaded as resolver`);
err.name = ERROR_NAME;
throw err;
2023-12-18 13:12:25 +08:00
}
2023-12-28 23:41:32 +08:00
return resolver;
2023-12-18 13:12:25 +08:00
}
function isResolverValid(resolver) {
if (resolver.interfaceVersion === 2) {
2023-12-28 23:41:32 +08:00
return resolver.resolve && typeof resolver.resolve === 'function';
2023-12-18 13:12:25 +08:00
} else {
2023-12-28 23:41:32 +08:00
return resolver.resolveImport && typeof resolver.resolveImport === 'function';
2023-12-18 13:12:25 +08:00
}
}
2023-12-28 23:41:32 +08:00
const erroredContexts = new Set();
2023-12-18 13:12:25 +08:00
/**
* Given
* @param {string} p - module path
* @param {object} context - ESLint context
* @return {string} - the full module filesystem path;
* null if package is core;
* undefined if not found
*/
function resolve(p, context) {
try {
2023-12-28 23:41:32 +08:00
return relative(p, context.getPhysicalFilename ? context.getPhysicalFilename() : context.getFilename(), context.settings);
2023-12-18 13:12:25 +08:00
} catch (err) {
if (!erroredContexts.has(context)) {
2023-12-28 23:41:32 +08:00
// The `err.stack` string starts with `err.name` followed by colon and `err.message`.
// We're filtering out the default `err.name` because it adds little value to the message.
let errMessage = err.message;
if (err.name !== ERROR_NAME && err.stack) {
errMessage = err.stack.replace(/^Error: /, '');
}
2023-12-18 13:12:25 +08:00
context.report({
2023-12-28 23:41:32 +08:00
message: `Resolve error: ${errMessage}`,
2023-12-18 13:12:25 +08:00
loc: { line: 1, column: 0 },
2023-12-28 23:41:32 +08:00
});
erroredContexts.add(context);
2023-12-18 13:12:25 +08:00
}
}
}
2023-12-28 23:41:32 +08:00
resolve.relative = relative;
exports.default = resolve;