Generate Zod schemas from Typescript types generated by the Supabase CLI.
$ pnpm add --D supazod
$ supabase gen types typescript --local > types.ts
$ pnpm supazod -i types.ts -o schemas.ts -t schemas.d.ts -s public,schema_a,schema_b
That's it! Check your schemas.ts
file - you should have Zod schemas generated for all your tables, views, enums and functions.
Supazod generates clean, consistent schema names:
// ✅ Clean naming (v2.0+)
export const publicUsersInsertSchema = z.object({...});
export const publicUsersUpdateSchema = z.object({...});
export const publicUserStatusSchema = z.union([...]);
export const publicGetStatusArgsSchema = z.object({...});
// TypeScript types without "Schema" suffix
export type PublicUsersInsert = z.infer<typeof generated.publicUsersInsertSchema>;
export type PublicUserStatus = z.infer<typeof generated.publicUserStatusSchema>;
Create a supazod.config.ts
file for type-safe configuration with IntelliSense:
import { defineConfig } from 'supazod';
export default defineConfig({
namingConfig: {
// TypeScript provides autocomplete for placeholders:
// {schema}, {table}, {operation}, {function}, {name}
tableOperationPattern: '{schema}_{table}_{operation}',
enumPattern: '{schema}_{name}_Enum',
functionArgsPattern: '{schema}_{function}_Args',
functionReturnsPattern: '{schema}_{function}_Returns',
// Capitalization and formatting
capitalizeSchema: true,
capitalizeNames: true,
separator: '_',
}
});
{
"namingConfig": {
"tableOperationPattern": "{schema}_{table}_{operation}",
"enumPattern": "{schema}_{name}_Enum",
"capitalizeSchema": true,
"capitalizeNames": true,
"separator": "_"
}
}
Supported config files:
supazod.config.ts
(recommended)supazod.config.js
supazod.config.json
.supazodrc.ts
.supazodrc.js
.supazodrc.json
supazod [options]
-i, --input <path> Input TypeScript file
-o, --output <path> Output Zod schemas file
-t, --types-output <path> Output type definitions (optional)
-s, --schema <name> Schema to process (optional, defaults to all)
--verbose Enable debug logs
# Naming Configuration (overrides config file)
--table-operation-pattern <pattern> Pattern for table operations
--enum-pattern <pattern> Pattern for enums
--function-args-pattern <pattern> Pattern for function arguments
--function-returns-pattern <pattern> Pattern for function returns
--capitalize-schema <boolean> Capitalize schema names
--capitalize-names <boolean> Capitalize type names
--separator <string> Separator between name parts
# Generate with custom naming patterns
$ pnpm supazod -i types.ts -o schemas.ts \
--table-operation-pattern '{schema}_{table}_{operation}' \
--enum-pattern '{schema}_{name}_Enum' \
--separator '_'
{schema}
- Database schema name (e.g., "public", "auth"){table}
- Table name (e.g., "users", "posts"){operation}
- Operation type ("Insert", "Update", "Row"){function}
- Function name (e.g., "get_status"){name}
- Type name (e.g., "user_status" for enums)
- 🎯 Complete Coverage: Full support for tables, views, enums, functions and composite types
- 🔧 Multi-Schema: Process multiple database schemas with a single command
- 📦 Type Declarations: Generate corresponding
.d.ts
files alongside Zod schemas - ⚙️ Type-Safe Configuration: TypeScript config with IntelliSense support
- 🏷️ Flexible Naming: Customizable naming patterns with placeholders
- ✨ Clean Output: Fixed schema naming (no more "SchemaSchema" duplication)
import { generateContent } from 'supazod';
const result = await generateContent({
input: './types.ts',
output: './schema.ts',
schema: ['public'],
namingConfig: {
tableOperationPattern: '{schema}_{table}_{operation}',
enumPattern: '{schema}_{name}_Enum',
}
});
If upgrading from v1.x, see MIGRATION.md for detailed migration instructions. The main changes:
- ✅ Fixed duplicated "Schema" suffixes (
publicUsersInsertSchemaSchema
→publicUsersInsertSchema
) - ✅ Clean TypeScript type names (removed "Schema" suffix from types)
- ✅ New type-safe configuration system
This project started as a fork of supabase-to-zod by @psteinroe. While maintaining the original concept, the codebase has been completely rewritten to provide better performance, enhanced type safety, and a more robust architecture. Thanks to psteinroe for the initial inspiration! 💚