@intlayer/chokidar
Version:
Scans and builds Intlayer declaration files into dictionaries based on Intlayer configuration.
94 lines (92 loc) • 4.46 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
let node_path = require("node:path");
let fast_glob = require("fast-glob");
fast_glob = require_runtime.__toESM(fast_glob);
let _intlayer_config_utils = require("@intlayer/config/utils");
let _intlayer_config_defaultValues = require("@intlayer/config/defaultValues");
//#region src/utils/buildComponentFilesList.ts
/**
* Normalizes a pattern value to an array
*/
const normalizeToArray = (value) => Array.isArray(value) ? value : [value];
/**
* Remove directories that are subdirectories of others in the list so files
* are never scanned twice.
* Example: ['/root', '/root/src'] → ['/root']
*/
const getDistinctRootDirs = (dirs) => {
const uniqueDirs = Array.from(new Set(dirs.map((dir) => (0, node_path.resolve)(dir))));
uniqueDirs.sort((a, b) => a.length - b.length);
return uniqueDirs.reduce((acc, dir) => {
if (!acc.some((parent) => {
const rel = (0, node_path.relative)(parent, dir);
return !rel.startsWith("..") && !(0, node_path.isAbsolute)(rel) && rel !== "";
})) acc.push(dir);
return acc;
}, []);
};
/**
* Returns true when the resolved path passes through a `node_modules` segment.
* Works on both POSIX and Windows paths.
*/
const isInsideNodeModules = (dir) => (0, node_path.resolve)(dir).split(node_path.sep).includes("node_modules");
/**
* Default exclude patterns derived from TRAVERSE_PATTERN.
* Extracted once so the function body can reference them without re-computing.
*/
const DEFAULT_EXCLUDE_PATTERNS = _intlayer_config_defaultValues.TRAVERSE_PATTERN.filter((p) => typeof p === "string" && p.startsWith("!")).map((p) => p.slice(1));
/**
* Builds a deduplicated list of absolute file paths matching the given patterns.
*
* Handles multiple root directories (deduplicates overlapping roots), exclude
* patterns, negation patterns embedded in `traversePattern`, and optional
* dot-file inclusion.
*
* Special case: `codeDir` entries that live inside `node_modules` (e.g. a
* design-system package installed as a workspace dependency) are scanned as
* their own explicit roots. They are NOT collapsed into the project root so
* the `*\/node_modules\/**` exclusion does not silently drop them.
*
* @example
* // Single root with excludes
* const files = buildComponentFilesList(config);
*
* @example
* // Design-system package inside node_modules is still scanned
* // intlayer.config.ts: { content: { codeDir: ['node_modules/my-ds/src'] } }
* const files = buildComponentFilesList(config);
*/
const buildComponentFilesList = (config, excludePattern) => {
const traversePattern = config.build.traversePattern;
const compilerTransformPattern = config.compiler.transformPattern;
const contentDeclarationPattern = config.content.fileExtensions.map((ext) => `/**/*${ext}`);
const patterns = [...traversePattern, ...normalizeToArray(compilerTransformPattern)].filter((pattern) => typeof pattern === "string").filter((pattern) => !pattern.startsWith("!")).map(_intlayer_config_utils.normalizePath);
const userExcludes = traversePattern.filter((pattern) => typeof pattern === "string" && pattern.startsWith("!")).map((pattern) => pattern.slice(1));
const baseExcludePatterns = Array.from(new Set([
...DEFAULT_EXCLUDE_PATTERNS,
...userExcludes,
...excludePattern ?? [],
...contentDeclarationPattern
])).filter((pattern) => typeof pattern === "string").map(_intlayer_config_utils.normalizePath);
const resolvedCodeDirs = (config.content.codeDir ?? []).map((dir) => (0, node_path.resolve)(dir));
const inNodeModulesCodeDirs = resolvedCodeDirs.filter(isInsideNodeModules);
const normalCodeDirs = resolvedCodeDirs.filter((dir) => !isInsideNodeModules(dir));
const normalFiles = getDistinctRootDirs([config.system.baseDir, ...normalCodeDirs]).flatMap((root) => fast_glob.default.sync(patterns, {
cwd: root,
ignore: baseExcludePatterns,
absolute: true,
dot: true
}));
const nodeModulesExcludePatterns = baseExcludePatterns.filter((pattern) => !pattern.includes("node_modules"));
const nodeModulesFiles = inNodeModulesCodeDirs.flatMap((dir) => fast_glob.default.sync(patterns, {
cwd: dir,
ignore: nodeModulesExcludePatterns,
absolute: true,
dot: false
}));
return Array.from(new Set([...normalFiles, ...nodeModulesFiles]));
};
//#endregion
exports.buildComponentFilesList = buildComponentFilesList;
//# sourceMappingURL=buildComponentFilesList.cjs.map