@intlayer/chokidar
Version:
Uses chokidar to scan and build Intlayer declaration files into dictionaries based on Intlayer configuration.
84 lines (82 loc) • 3.57 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);
//#region src/utils/buildFilesList.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;
}, []);
};
/**
* 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 `transformPattern`, and optional
* dot-file inclusion.
*
* @example
* // Single root with excludes
* const files = buildComponentFilesList({
* transformPattern: 'src/**\/*.{ts,tsx}',
* excludePattern: ['**\/node_modules\/**'],
* baseDir: '/path/to/project',
* });
*
* @example
* // Multiple roots (e.g. baseDir + codeDir), dot files included
* const files = buildComponentFilesList({
* transformPattern: config.build.traversePattern,
* baseDir: [config.system.baseDir, ...config.content.codeDir],
* dot: true,
* });
*/
const buildComponentFilesList = (config) => {
const { transformPattern, excludePattern = [], baseDir, dot = false } = config;
const patterns = normalizeToArray(transformPattern).filter((pattern) => typeof pattern === "string" && !pattern.startsWith("!")).map(node_path.normalize);
const excludePatterns = [...normalizeToArray(excludePattern), ...normalizeToArray(transformPattern).filter((pattern) => typeof pattern === "string" && pattern.startsWith("!")).map((pattern) => pattern.slice(1))].filter((pattern) => typeof pattern === "string").map(node_path.normalize);
const roots = getDistinctRootDirs(normalizeToArray(baseDir));
return Array.from(new Set(roots.flatMap((root) => fast_glob.default.sync(patterns, {
cwd: root,
ignore: excludePatterns,
absolute: true,
dot
}))));
};
/**
* Convenience wrapper that derives all file-list options directly from an
* `IntlayerConfig` object.
*
* Scans `[baseDir, ...codeDir]` using `build.traversePattern`, excludes
* content declaration file extensions and any `compiler.excludePattern`
* entries defined in the configuration, and includes dot files.
*/
const buildComponentFilesListFromConfig = (intlayerConfig) => {
const { build: { traversePattern }, system: { baseDir }, content: { codeDir, fileExtensions }, compiler: { excludePattern } } = intlayerConfig;
return buildComponentFilesList({
transformPattern: traversePattern,
excludePattern: [...fileExtensions.map((ext) => `**/*${ext}`), ...Array.isArray(excludePattern) ? excludePattern : [excludePattern]].filter((p) => typeof p === "string"),
baseDir: [baseDir, ...codeDir],
dot: true
});
};
//#endregion
exports.buildComponentFilesList = buildComponentFilesList;
exports.buildComponentFilesListFromConfig = buildComponentFilesListFromConfig;
//# sourceMappingURL=buildFilesList.cjs.map