zod-dbs
Version:
Opinionated Zod schema generator for databases
40 lines (39 loc) • 1.79 kB
JavaScript
import { promises } from 'node:fs';
import { logDebug } from 'zod-dbs-core';
import { ensureFolder, getOutputFolder } from '../utils/index.js';
import { renderMustacheTemplate } from '../utils/mustache.js';
async function generateSchemaFile(table, renderer, config) {
logDebug(`Generating schema for: ${table.type} ${table.name}`);
if (table.columns.length === 0) {
logDebug(`No columns found for ${table.type} ${table.name}`);
return;
}
const files = await renderer.renderSchemaFiles(table, config);
for (const file of files) {
const folderPath = `${config.outputDir}/${getOutputFolder(table.type)}/${table.name.toLowerCase()}`;
await ensureFolder(folderPath);
const fileName = `${folderPath}/${file.name}.ts`;
await promises.writeFile(fileName, file.content, 'utf8');
logDebug(`Generated "${fileName}"`);
}
}
async function generateSchemaIndexFile(table, config) {
logDebug(`Generating schema index file for: ${table.type} ${table.name}`);
if (table.columns.length === 0) {
logDebug(`No columns found for ${table.type} ${table.name}`);
return;
}
const output = await renderMustacheTemplate('schema-index', {
...table,
fileName: config.moduleResolution === 'esm' ? `schema.js` : 'schema',
});
const folderPath = `${config.outputDir}/${getOutputFolder(table.type)}/${table.name.toLowerCase()}`;
await ensureFolder(folderPath);
const fileName = `${folderPath}/index.ts`;
await promises.writeFile(fileName, output, 'utf8');
logDebug(`Generated "${fileName}"`);
}
export async function generateSchemaFiles(table, renderer, config) {
await generateSchemaFile(table, renderer, config);
await generateSchemaIndexFile(table, config);
}