#!/usr/bin/env node
/** Scaffold payment app routes — thin wrappers to @/modules/payment/features */
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), "..");
const APP = path.join(ROOT, "app", "payment");
const ROUTES = [
{ dir: "hub", export: "PaymentHub" },
{ dir: "dashboard", export: "PaymentDashboard" },
{ dir: "overview", export: "PaymentOverview" },
{ dir: "kpis", export: "PaymentKpis" },
{ dir: "transactions", export: "PaymentTransactions" },
{ dir: "transactions/[id]", export: "PaymentTransactionDetail" },
{ dir: "ledger", export: "PaymentLedger" },
{ dir: "psp", export: "PaymentPsp" },
{ dir: "psp/health", export: "PaymentGatewayHealth" },
{ dir: "providers", export: "PaymentProviders" },
{ dir: "merchants", export: "PaymentMerchants" },
{ dir: "merchants/[id]", export: "PaymentMerchantDetail" },
{ dir: "merchants/approvals", export: "PaymentMerchantApprovals" },
{ dir: "requests", export: "PaymentRequests" },
{ dir: "requests/[id]", export: "PaymentRequestDetail" },
{ dir: "callbacks", export: "PaymentCallbacks" },
{ dir: "verification", export: "PaymentVerification" },
{ dir: "audit", export: "PaymentAudit" },
{ dir: "bundles", export: "PaymentBundles" },
{ dir: "feature-toggles", export: "PaymentFeatureToggles" },
{ dir: "capabilities", export: "PaymentCapabilities" },
{ dir: "settings", export: "PaymentSettings" },
{ dir: "metrics", export: "PaymentMetrics" },
{ dir: "monitoring", export: "PaymentMonitoring" },
{ dir: "api-explorer", export: "PaymentApiExplorer" },
{ dir: "openapi", export: "PaymentOpenApi" },
];
const LOADING = `import { LoadingState } from "@/components/ds";
export default function Loading() {
return ;
}
`;
const ERROR = `"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return ;
}
`;
function featureImport(exportName, dir) {
const featureMap = {
PaymentHub: "hub",
PaymentDashboard: "dashboard",
PaymentOverview: "overview",
PaymentKpis: "kpis",
PaymentTransactions: "transactions",
PaymentTransactionDetail: "transactionDetail",
PaymentLedger: "ledger",
PaymentPsp: "psp",
PaymentGatewayHealth: "gatewayHealth",
PaymentProviders: "providers",
PaymentMerchants: "merchants",
PaymentMerchantDetail: "merchantDetail",
PaymentMerchantApprovals: "merchantApprovals",
PaymentRequests: "requests",
PaymentRequestDetail: "requestDetail",
PaymentCallbacks: "callbacks",
PaymentVerification: "verification",
PaymentAudit: "audit",
PaymentBundles: "bundles",
PaymentFeatureToggles: "featureToggles",
PaymentCapabilities: "capabilities",
PaymentSettings: "settings",
PaymentMetrics: "metrics",
PaymentMonitoring: "monitoring",
PaymentApiExplorer: "apiExplorer",
PaymentOpenApi: "openapi",
};
const feature = featureMap[exportName];
return `"use client";
export { ${exportName} as default } from "@/modules/payment/features/${feature}";
`;
}
for (const { dir, export: exp } of ROUTES) {
const routeDir = path.join(APP, dir);
fs.mkdirSync(routeDir, { recursive: true });
fs.writeFileSync(path.join(routeDir, "page.tsx"), featureImport(exp, dir));
fs.writeFileSync(path.join(routeDir, "loading.tsx"), LOADING);
fs.writeFileSync(path.join(routeDir, "error.tsx"), ERROR);
}
// layout
fs.writeFileSync(
path.join(APP, "layout.tsx"),
`"use client";
import { PaymentRootLayout } from "@/modules/payment/components/createPortalLayout";
export default PaymentRootLayout;
`
);
// root page redirect
fs.writeFileSync(
path.join(APP, "page.tsx"),
`import { redirect } from "next/navigation";
export default function PaymentIndexPage() {
redirect("/payment/hub");
}
`
);
fs.writeFileSync(path.join(APP, "loading.tsx"), LOADING);
fs.writeFileSync(path.join(APP, "error.tsx"), ERROR);
console.log(`Scaffolded ${ROUTES.length} payment routes`);