Move business logic out of App Router into module packages, add boundary validation scripts, and keep all routes as thin re-exports without changing URLs or API behavior. Co-authored-by: Cursor <cursoragent@cursor.com>
62 lines
2.4 KiB
JavaScript
62 lines
2.4 KiB
JavaScript
#!/usr/bin/env node
|
|
/** Align module page export names with route re-export adapters. */
|
|
import { readFileSync, writeFileSync, readdirSync, statSync } from "node:fs";
|
|
import { join, relative, sep } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const ROOT = join(fileURLToPath(new URL(".", import.meta.url)), "..");
|
|
const APP = join(ROOT, "app", "accounting");
|
|
|
|
function walkPages(dir, acc = []) {
|
|
for (const entry of readdirSync(dir)) {
|
|
const full = join(dir, entry);
|
|
if (statSync(full).isDirectory()) walkPages(full, acc);
|
|
else if (entry === "page.tsx") acc.push(full);
|
|
}
|
|
return acc;
|
|
}
|
|
|
|
let fixed = 0;
|
|
for (const pageFile of walkPages(APP)) {
|
|
const routeContent = readFileSync(pageFile, "utf8");
|
|
const match = routeContent.match(
|
|
/export\s+\{\s*(\w+)\s+as\s+default\s+\}\s+from\s+["'](@\/src\/modules\/accounting\/pages\/[^"']+)["']/
|
|
);
|
|
if (!match) continue;
|
|
|
|
const exportName = match[1];
|
|
let importPath = match[2].replace("@/src/modules/accounting/pages/", "");
|
|
if (!importPath || importPath.endsWith("/")) importPath = "dashboard";
|
|
|
|
const moduleFile = join(ROOT, "src", "modules", "accounting", "pages", `${importPath}.tsx`);
|
|
if (!statSync(moduleFile, { throwIfNotFound: false })?.isFile()) {
|
|
console.error(`Missing module file: ${moduleFile}`);
|
|
continue;
|
|
}
|
|
|
|
let moduleContent = readFileSync(moduleFile, "utf8");
|
|
const original = moduleContent;
|
|
|
|
if (moduleContent.includes(`export function ${exportName}`)) continue;
|
|
|
|
if (/export function Page\b/.test(moduleContent)) {
|
|
moduleContent = moduleContent.replace(/export function Page\b/, `export function ${exportName}`);
|
|
} else if (/export default function Page\b/.test(moduleContent)) {
|
|
moduleContent = moduleContent.replace(/export default function Page\b/, `export function ${exportName}`);
|
|
} else if (/export default function (\w+)/.test(moduleContent)) {
|
|
moduleContent = moduleContent.replace(/export default function (\w+)/, `export function $1`);
|
|
}
|
|
|
|
if (moduleContent !== original) {
|
|
writeFileSync(moduleFile, moduleContent, "utf8");
|
|
fixed++;
|
|
}
|
|
|
|
const fixedRoute = `"use client";\n\nexport { ${exportName} as default } from "@/src/modules/accounting/pages/${importPath}";\n`;
|
|
if (routeContent !== fixedRoute) {
|
|
writeFileSync(pageFile, fixedRoute, "utf8");
|
|
}
|
|
}
|
|
|
|
console.log(`Fixed export names in ${fixed} module pages.`);
|