portal-payment-fe/scripts/generate-db-types.js

57 lines
1.8 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const schemaPath = path.resolve(process.cwd(), "db-schema.json");
const outPath = path.resolve(process.cwd(), "src", "types", "db-client.d.ts");
if (!fs.existsSync(schemaPath)) {
console.error("db-schema.json not found");
process.exit(1);
}
const schema = JSON.parse(fs.readFileSync(schemaPath, "utf8"));
const tables = schema.tables || {};
function fieldTypeToTs(t) {
switch (t) {
case "number":
return "number";
case "string":
return "string";
case "boolean":
return "boolean";
default:
return "any";
}
}
let out = `// GENERATED FILE — edit db-schema.json and run npm run generate:db-types\n\n`;
out += `type DBAction<TRequest = any, TResponse = any> = (payload?: TRequest) => Promise<TResponse>;\n\n`;
out += `// Generated tables\n`;
out += `interface DBTables {\n`;
for (const [table, def] of Object.entries(tables)) {
out += ` ${table}: {\n`;
out += ` create: DBAction<{ data: Partial<{`;
const fields = def.fields || {};
const fPairs = Object.entries(fields).map(
([n, t]) => `${n}: ${fieldTypeToTs(t)}`
);
out += fPairs.join("; ");
out += `}> }, any>;\n`;
out += ` update: DBAction<{ where: any; data: any }, any>;\n`;
out += ` delete: DBAction<{ where: any }, any>;\n`;
out += ` findFirst: DBAction<{ where?: any; include?: any; select?: any }, any>;\n`;
out += ` findMany: DBAction<any, any[]>;\n`;
out += ` };\n`;
}
out += `}\n\n`;
out += `type DBClient = {\n [K in keyof DBTables]: DBTables[K];\n} & { [table: string]: { [action: string]: DBAction<any, any> } };\n\n`;
out += `declare module "@/lib/dbClient" {\n const db: DBClient;\n export default db;\n}\n`;
fs.mkdirSync(path.dirname(outPath), { recursive: true });
fs.writeFileSync(outPath, out, "utf8");
console.log("Wrote", outPath);