@remediator/core
Version:
Remix/React Router 7 Mediator
88 lines (87 loc) • 3.08 kB
JavaScript
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, "_");
}