UNPKG

@remediator/core

Version:
88 lines (87 loc) 3.08 kB
import fs from "fs"; import path from "path"; const defaultOptions = { path: "src", includeFileNames: [ "*.mediator.ts", "*.command.mediator.ts", "*.query.mediator.ts", "*.middleware.mediator.ts", ], }; export async function generateRegistrationManifest(options) { const opts = { ...defaultOptions, ...options }; const searchPath = opts.path || "src"; const filePatterns = opts.includeFileNames || []; const fullSearchPath = path.resolve(process.cwd(), searchPath); if (!fs.existsSync(fullSearchPath)) { console.warn(`Search path '${searchPath}' does not exist`); return { imports: [], registrations: [], files: [], }; } const files = []; for (const pattern of filePatterns) { const patternFiles = await findFilesRecursively(fullSearchPath, pattern); files.push(...patternFiles); } const uniqueFiles = [...new Set(files)]; // Generate import statements for each file const imports = uniqueFiles.map((filePath) => { const relativePath = path.relative(process.cwd(), filePath); const modulePath = relativePath.replace(/\\/g, "/").replace(/\.ts$/, ""); return `import * as ${getModuleName(modulePath)} from './${modulePath}';`; }); // Generate registration code const registrations = uniqueFiles.map((filePath) => { const relativePath = path.relative(process.cwd(), filePath); const modulePath = relativePath.replace(/\\/g, "/").replace(/\.ts$/, ""); const moduleName = getModuleName(modulePath); return `// Register handlers from ${modulePath}`; }); return { imports, registrations, files: uniqueFiles, }; } async function findFilesRecursively(dirPath, pattern) { const files = []; try { const items = fs.readdirSync(dirPath); for (const item of items) { const fullPath = path.join(dirPath, item); const stat = fs.statSync(fullPath); if (stat.isDirectory()) { if (item === "node_modules" || item === "dist" || item === "build" || item === ".git") { continue; } const subFiles = await findFilesRecursively(fullPath, pattern); files.push(...subFiles); } else if (stat.isFile()) { const fileName = item; if (matchesPattern(fileName, pattern)) { files.push(fullPath); } } } } catch (error) { console.log(`Error reading directory ${dirPath}:`, error.message); } return files; } function matchesPattern(fileName, pattern) { const regexPattern = pattern.replace(/\./g, "\\.").replace(/\*/g, ".*"); const regex = new RegExp(`^${regexPattern}$`); return regex.test(fileName); } function getModuleName(modulePath) { return modulePath.replace(/[^a-zA-Z0-9]/g, "_"); }