zod-dbs
Version:
Opinionated Zod schema generator for databases
48 lines (47 loc) • 2.08 kB
JavaScript
import { logDebug } from 'zod-dbs-core';
import { DEFAULT_CONFIGURATION, DEFAULT_OUTPUT_DIR } from './constants.js';
import { generateConstantsFile } from './generate/generateConstantsFile.js';
import { generateIndexFiles } from './generate/generateIndexFiles.js';
import { generateSchemaFiles } from './generate/generateSchemaFile.js';
import { generateTypesFile } from './generate/generateTypesFile.js';
import { Zod3Renderer } from './renderers/Zod3Renderer.js';
import { Zod4MiniRenderer } from './renderers/Zod4MiniRenderer.js';
import { Zod4Renderer } from './renderers/Zod4Renderer.js';
import { clearTablesDirectory } from './utils/index.js';
const createRenderer = (zodVersion) => {
if (zodVersion === '4') {
return new Zod4Renderer();
}
if (zodVersion === '4-mini') {
return new Zod4MiniRenderer();
}
return new Zod3Renderer();
};
/**
* Generates Zod schemas for all tables in the specified database schema.
*/
export const generateZodSchemas = async ({ provider, renderer, config, }) => {
const generateConfig = {
...DEFAULT_CONFIGURATION,
...config,
};
logDebug('Using generation configuration:', generateConfig);
const { outputDir = DEFAULT_OUTPUT_DIR, cleanOutput, onProgress, zodVersion, } = generateConfig;
if (cleanOutput) {
clearTablesDirectory(outputDir);
}
logDebug(`Connecting to database`);
const schema = await provider.getSchemaInformation(config);
onProgress?.('generating', { total: schema.tables.length });
logDebug(`Generating zod schemas for ${schema.tables.length} tables'`);
const schemaRenderer = renderer ?? createRenderer(zodVersion);
logDebug(`Using renderer: ${schemaRenderer.name ?? '<unknown>'}`);
for (const table of schema.tables) {
await generateSchemaFiles(table, schemaRenderer, generateConfig);
}
await generateIndexFiles(schema, generateConfig);
await generateConstantsFile(schema, generateConfig);
await generateTypesFile(schema, generateConfig);
onProgress?.('done');
return schema;
};