UNPKG

@intlayer/chokidar

Version:

Uses chokidar to scan and build Intlayer declaration files into dictionaries based on Intlayer configuration.

80 lines (78 loc) 3.26 kB
import { isAbsolute, normalize, relative, resolve } from "node:path"; import fg from "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) => resolve(dir)))); uniqueDirs.sort((a, b) => a.length - b.length); return uniqueDirs.reduce((acc, dir) => { if (!acc.some((parent) => { const rel = relative(parent, dir); return !rel.startsWith("..") && !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(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(normalize); const roots = getDistinctRootDirs(normalizeToArray(baseDir)); return Array.from(new Set(roots.flatMap((root) => fg.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 export { buildComponentFilesList, buildComponentFilesListFromConfig }; //# sourceMappingURL=buildFilesList.mjs.map