Custom Safety Configuration
This recipe demonstrates how to create custom safety configurations tailored to your specific project needs.
Overview
The safety system offers granular control over different types of protections. You can mix and match settings to create a configuration that works for your project structure.
Complete Configuration Example
{
"safety": {
"level": "standard",
"allowDangerousPaths": false,
"allowProjectRoots": false,
"allowUserFiles": false,
"skipManifest": false,
"warningsOnly": false,
"maxUserFiles": 10,
"customDangerousPaths": ["modules", "widgets"],
"customProjectFiles": ["project.config.js", "build.config.js"]
}
}
Configuration Options
Safety Levels (Presets)
Choose a base level, then override specific settings:
{
"safety": {
"level": "strict", // strict | standard | permissive | disabled
"allowUserFiles": true // Override the preset
}
}
Available levels:
strict
- Maximum protection, blocks even small numbers of user filesstandard
- Balanced protection (default)permissive
- Warnings-heavy, minimal blockingdisabled
- No safety checks
Individual Controls
allowDangerousPaths
Controls whether common source directory names are allowed:
{
"safety": {
"allowDangerousPaths": true // Allow src, lib, components, etc.
}
}
Default dangerous paths: src
, lib
, components
, pages
, app
, utils
, hooks
, services
, api
allowProjectRoots
Controls whether directories containing project files are allowed:
{
"safety": {
"allowProjectRoots": true // Allow dirs with package.json, tsconfig.json, etc.
}
}
allowUserFiles
Controls whether directories with user files are allowed:
{
"safety": {
"allowUserFiles": true,
"maxUserFiles": 20 // Only relevant when allowUserFiles is false
}
}
skipManifest
Disables manifest tracking and smart cleanup:
{
"safety": {
"skipManifest": true // No manifest file, no selective cleanup
}
}
warningsOnly
Converts all safety errors to warnings:
{
"safety": {
"warningsOnly": true // Never block generation, only warn
}
}
Custom Patterns
customDangerousPaths
Add your own dangerous directory patterns:
{
"safety": {
"customDangerousPaths": ["modules", "widgets", "core"]
}
}
customProjectFiles
Add your own project file patterns:
{
"safety": {
"customProjectFiles": [
"nuxt.config.js",
"svelte.config.js",
"astro.config.mjs"
]
}
}
Common Scenarios
Scenario 1: Strict Enterprise Environment
Maximum safety for large teams:
{
"safety": {
"level": "strict",
"maxUserFiles": 0,
"customProjectFiles": [
".eslintrc.js",
"jest.config.js",
"docker-compose.yml"
]
}
}
Scenario 2: Flexible Development Environment
Balanced approach for active development:
{
"safety": {
"level": "standard",
"allowDangerousPaths": true,
"maxUserFiles": 15,
"warningsOnly": false
}
}
Scenario 3: Legacy Project Migration
Permissive settings for migrating existing projects:
{
"safety": {
"level": "permissive",
"allowUserFiles": true,
"customDangerousPaths": ["legacy", "old-modules"]
}
}
Scenario 4: CI/CD Environment
Automated environments with controlled paths:
{
"safety": {
"level": "standard",
"skipManifest": true, // No state between runs
"allowDangerousPaths": false,
"warningsOnly": true // Don't fail builds on warnings
}
}
Multiple Configuration Sources
Configurations are merged with this precedence:
- Environment variables (highest priority)
- Generator block options
- Config file settings
- Default values (lowest priority)
Environment Variables
PRISMA_ZOD_SAFETY_LEVEL=permissive
PRISMA_ZOD_SAFETY_ALLOW_DANGEROUS_PATHS=true
PRISMA_ZOD_SAFETY_MAX_USER_FILES=25
PRISMA_ZOD_SAFETY_CUSTOM_DANGEROUS_PATHS=modules,widgets
Generator Block
generator zod {
provider = "prisma-zod-generator"
output = "./src/generated"
safetyLevel = "standard"
safetyAllowDangerousPaths = false
safetyMaxUserFiles = "10"
safetyCustomDangerousPaths = "modules,widgets"
}
Config File
{
"output": "./generated",
"safety": {
"level": "strict",
"customDangerousPaths": ["legacy"]
}
}
Testing Your Configuration
Create a test directory structure to verify your safety configuration:
mkdir -p test-safety/{src,components,package.json}
echo '{"name":"test"}' > test-safety/package.json
echo 'const x = 1;' > test-safety/src/test.ts
Then test with different configurations:
generator zod {
provider = "prisma-zod-generator"
output = "./test-safety/src"
safetyLevel = "standard" // Try different levels
}
model User {
id String @id
}
Configuration Validation
The system validates your configuration and provides helpful error messages:
{
"safety": {
"level": "invalid-level", // ❌ Error: Invalid safety level
"maxUserFiles": -5 // ❌ Error: Must be non-negative
}
}
Debugging Safety Issues
Enable debug logging to understand safety decisions:
DEBUG=prisma-zod-generator* npx prisma generate
Or check the generated manifest file:
{
"version": "1.0",
"generatedAt": "2024-01-15T10:30:00.000Z",
"files": ["User.schema.ts", "Post.schema.ts"],
"directories": ["enums"]
}
Best Practices
- Start Strict: Begin with
"level": "strict"
and relax as needed - Test Configurations: Use a copy of your project to test safety settings
- Document Choices: Comment your configuration choices for team members
- Review Regularly: Periodically review if you can tighten safety settings
- Use Version Control: Always commit before changing safety configurations
Migration Path
When changing safety configurations:
- Commit Current State: Save your work
- Test New Configuration: Try on a project copy first
- Update Gradually: Make incremental changes
- Monitor Warnings: Watch for new warning patterns
- Update Team: Inform team members of configuration changes
Use environment variables for temporary safety overrides during debugging, but keep your permanent configuration in the config file or generator block for consistency.