100 lines
4.1 KiB
Plaintext
100 lines
4.1 KiB
Plaintext
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.clearGlobResolutionCache = exports.resolveProjectList = exports.clearGlobCache = void 0;
|
|
const debug_1 = __importDefault(require("debug"));
|
|
const globby_1 = require("globby");
|
|
const is_glob_1 = __importDefault(require("is-glob"));
|
|
const shared_1 = require("../create-program/shared");
|
|
const ExpiringCache_1 = require("./ExpiringCache");
|
|
const log = (0, debug_1.default)('typescript-eslint:typescript-estree:parser:parseSettings:resolveProjectList');
|
|
let RESOLUTION_CACHE = null;
|
|
function clearGlobCache() {
|
|
RESOLUTION_CACHE?.clear();
|
|
}
|
|
exports.clearGlobCache = clearGlobCache;
|
|
/**
|
|
* Normalizes, sanitizes, resolves and filters the provided project paths
|
|
*/
|
|
function resolveProjectList(options) {
|
|
const sanitizedProjects = [];
|
|
// Normalize and sanitize the project paths
|
|
if (options.project != null) {
|
|
for (const project of options.project) {
|
|
if (typeof project === 'string') {
|
|
sanitizedProjects.push(project);
|
|
}
|
|
}
|
|
}
|
|
if (sanitizedProjects.length === 0) {
|
|
return [];
|
|
}
|
|
const projectFolderIgnoreList = (options.projectFolderIgnoreList ?? ['**/node_modules/**'])
|
|
.reduce((acc, folder) => {
|
|
if (typeof folder === 'string') {
|
|
acc.push(folder);
|
|
}
|
|
return acc;
|
|
}, [])
|
|
// prefix with a ! for not match glob
|
|
.map(folder => (folder.startsWith('!') ? folder : `!${folder}`));
|
|
const cacheKey = getHash({
|
|
project: sanitizedProjects,
|
|
projectFolderIgnoreList,
|
|
tsconfigRootDir: options.tsconfigRootDir,
|
|
});
|
|
if (RESOLUTION_CACHE == null) {
|
|
// note - we initialize the global cache based on the first config we encounter.
|
|
// this does mean that you can't have multiple lifetimes set per folder
|
|
// I doubt that anyone will really bother reconfiguring this, let alone
|
|
// try to do complicated setups, so we'll deal with this later if ever.
|
|
RESOLUTION_CACHE = new ExpiringCache_1.ExpiringCache(options.singleRun
|
|
? 'Infinity'
|
|
: options.cacheLifetime?.glob ??
|
|
ExpiringCache_1.DEFAULT_TSCONFIG_CACHE_DURATION_SECONDS);
|
|
}
|
|
else {
|
|
const cached = RESOLUTION_CACHE.get(cacheKey);
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
}
|
|
// Transform glob patterns into paths
|
|
const nonGlobProjects = sanitizedProjects.filter(project => !(0, is_glob_1.default)(project));
|
|
const globProjects = sanitizedProjects.filter(project => (0, is_glob_1.default)(project));
|
|
const uniqueCanonicalProjectPaths = new Set(nonGlobProjects
|
|
.concat(globProjects.length === 0
|
|
? []
|
|
: (0, globby_1.sync)([...globProjects, ...projectFolderIgnoreList], {
|
|
cwd: options.tsconfigRootDir,
|
|
}))
|
|
.map(project => (0, shared_1.getCanonicalFileName)((0, shared_1.ensureAbsolutePath)(project, options.tsconfigRootDir))));
|
|
log('parserOptions.project (excluding ignored) matched projects: %s', uniqueCanonicalProjectPaths);
|
|
const returnValue = Array.from(uniqueCanonicalProjectPaths);
|
|
RESOLUTION_CACHE.set(cacheKey, returnValue);
|
|
return returnValue;
|
|
}
|
|
exports.resolveProjectList = resolveProjectList;
|
|
function getHash({ project, projectFolderIgnoreList, tsconfigRootDir, }) {
|
|
// create a stable representation of the config
|
|
const hashObject = {
|
|
tsconfigRootDir,
|
|
// the project order does matter and can impact the resolved globs
|
|
project,
|
|
// the ignore order won't doesn't ever matter
|
|
projectFolderIgnoreList: [...projectFolderIgnoreList].sort(),
|
|
};
|
|
return (0, shared_1.createHash)(JSON.stringify(hashObject));
|
|
}
|
|
/**
|
|
* Exported for testing purposes only
|
|
* @internal
|
|
*/
|
|
function clearGlobResolutionCache() {
|
|
RESOLUTION_CACHE?.clear();
|
|
RESOLUTION_CACHE = null;
|
|
}
|
|
exports.clearGlobResolutionCache = clearGlobResolutionCache;
|
|
//# sourceMappingURL=resolveProjectList.js.map |