UNPKG

zod-dbs

Version:

Opinionated Zod schema generator for databases

48 lines (47 loc) 2.08 kB
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; };