Configuration Recipes
Copy-Paste Configs
Real-world configuration examples for common scenarios. Copy, customize, and use.
Quick Index
Jump to:
Simple Projects
Minimal Setup
Perfect for small projects or getting started.
// fluentgen.config.js
export default {
targets: [{ file: './src/types.ts', types: ['User', 'Product'] }],
generator: {
outputDir: './src/builders',
},
};Use when:
- Small project (<10 types)
- All types in one file
- Quick prototyping
Standard Project
Organized structure for growing projects.
// fluentgen.config.js
export default {
targets: [
{ file: './src/types/user.ts', types: ['User', 'Profile', 'Settings'] },
{ file: './src/types/product.ts', types: ['Product', 'Category'] },
{ file: './src/types/order.ts', types: ['Order', 'OrderItem'] },
],
generator: {
outputDir: './src/__generated__/builders',
useDefaults: true,
addComments: true,
},
};Use when:
- Types organized by domain
- Medium-sized project (10-50 types)
- Want generated files isolated
All Types from Directory
Scan entire directory for types.
// fluentgen.config.js
export default {
patterns: ['./src/models/**/*.ts'],
exclude: ['**/*.test.ts', '**/*.spec.ts'],
generator: {
outputDir: './src/builders',
},
};Use when:
- Consistent naming (all files have builder-worthy types)
- Want to generate for all models
- Easy to regenerate after schema changes
Performance
Using patterns without specific types can be slow for large codebases. Consider using targets with specific types instead.
Monorepos
pnpm Workspaces
Configuration for pnpm monorepos.
// packages/api/fluentgen.config.js
export default {
patterns: ['./src/models/*.ts'],
generator: {
outputDir: './src/builders',
},
monorepo: {
enabled: true,
dependencyResolutionStrategy: 'auto', // Auto-detects pnpm
},
plugins: [
'@company/fluent-gen-validation', // Shared from workspace
],
tsConfigPath: '../../tsconfig.base.json', // Workspace shared config
};Project structure:
my-monorepo/
├── pnpm-workspace.yaml
├── tsconfig.base.json
└── packages/
├── api/
│ ├── fluentgen.config.js ← This config
│ └── src/
│ ├── models/
│ └── builders/ ← Generated here
└── shared/Yarn Workspaces
Configuration for Yarn monorepos.
// packages/core/fluentgen.config.js
export default {
patterns: ['./src/types/*.ts'],
generator: {
outputDir: './src/builders',
},
monorepo: {
enabled: true,
dependencyResolutionStrategy: 'hoisted', // Yarn hoists deps
},
tsConfigPath: './tsconfig.json',
};Nx Monorepo
Configuration for Nx monorepos.
// libs/shared/data-models/fluentgen.config.js
export default {
patterns: ['./src/lib/models/*.ts'],
generator: {
outputDir: './src/lib/builders',
},
monorepo: {
enabled: true,
dependencyResolutionStrategy: 'auto',
workspaceRoot: '../../../', // Point to nx workspace root
},
tsConfigPath: './tsconfig.lib.json', // Nx lib config
};Shared Plugin Across Packages
Share plugins across monorepo packages.
// packages/api/fluentgen.config.js
export default {
patterns: ['./src/models/*.ts'],
generator: {
outputDir: './src/builders',
},
plugins: [
'@workspace/fluent-plugins/validation', // Shared plugin package
'@workspace/fluent-plugins/timestamps',
'./local-plugin.ts', // Package-specific
],
monorepo: {
enabled: true,
dependencyResolutionStrategy: 'auto',
},
};Shared plugin package:
packages/
└── fluent-plugins/
├── package.json → { "name": "@workspace/fluent-plugins" }
├── validation.ts
└── timestamps.tsTesting & CI/CD
Test Data Builders
Optimized for test data generation.
// fluentgen.config.js
export default {
patterns: ['./src/types/**/*.ts'],
exclude: ['**/*.test.ts', '**/*.spec.ts'],
generator: {
outputDir: './src/__tests__/builders',
useDefaults: true, // Smart defaults for tests
addComments: false, // Smaller files
},
plugins: [
'./test-plugins/fake-data.ts', // Add faker integration
'./test-plugins/factories.ts', // Add factory methods
],
};package.json:
{
"scripts": {
"generate:test-builders": "fluent-gen-ts batch",
"pretest": "npm run generate:test-builders"
}
}CI/CD Integration
Configuration for continuous integration.
// fluentgen.config.js
export default {
patterns: ['./src/models/*.ts'],
generator: {
outputDir: './src/builders',
useDefaults: true,
addComments: process.env.CI !== 'true', // Skip comments in CI
},
};.github/workflows/ci.yml:
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- run: npm install
- run: npx fluent-gen-ts batch # Generate builders
- run: npm test
- run: npm run buildPre-commit Hook
Generate on code changes.
package.json:
{
"scripts": {
"generate": "fluent-gen-ts batch"
},
"lint-staged": {
"src/types/**/*.ts": ["npm run generate", "git add src/builders"]
}
}.husky/pre-commit:
#!/bin/sh
npx lint-stagedMulti-Environment
Development vs Production
Different configs for different environments.
fluentgen.dev.js:
export default {
patterns: ['./src/types/**/*.ts'], // All types
generator: {
outputDir: './src/builders',
useDefaults: true,
addComments: true, // Full comments
},
plugins: [
'./plugins/validation.ts',
'./plugins/logging.ts', // Dev logging
],
};fluentgen.prod.js:
export default {
targets: [
// Only production types
{ file: './src/types/user.ts', types: ['User', 'Profile'] },
{ file: './src/types/product.ts', types: ['Product'] },
],
generator: {
outputDir: './src/builders',
useDefaults: true,
addComments: false, // Minimize size
},
plugins: [
'./plugins/validation.ts', // Only essential plugins
],
};package.json:
{
"scripts": {
"generate:dev": "fluent-gen-ts batch --config fluentgen.dev.js",
"generate:prod": "fluent-gen-ts batch --config fluentgen.prod.js"
}
}Multiple Output Directories
Generate to different locations for different purposes.
// Combined config
export default {
targets: [{ file: './src/types/api.ts' }],
generator: {
outputDir: process.env.OUTPUT_DIR || './src/builders',
},
};package.json:
{
"scripts": {
"generate:src": "OUTPUT_DIR=./src/builders fluent-gen-ts batch",
"generate:test": "OUTPUT_DIR=./test/fixtures fluent-gen-ts batch"
}
}Framework Integration
Next.js Project
Configuration for Next.js applications.
// fluentgen.config.js
export default {
targets: [{ file: './types/api.ts' }, { file: './types/models.ts' }],
generator: {
outputDir: './lib/builders', // Next.js lib directory
useDefaults: true,
addComments: true,
},
plugins: ['./plugins/api-validation.ts'],
tsConfigPath: './tsconfig.json',
};package.json:
{
"scripts": {
"dev": "npm run generate && next dev",
"build": "npm run generate && next build",
"generate": "fluent-gen-ts batch"
}
}NestJS Project
Configuration for NestJS backend.
// fluentgen.config.js
export default {
targets: [
{ file: './src/entities/*.entity.ts' },
{ file: './src/dto/*.dto.ts' },
],
generator: {
outputDir: './src/__generated__/builders',
naming: {
convention: 'kebab-case',
suffix: 'builder',
},
},
plugins: [
'./plugins/class-validator.ts', // Integrate with class-validator
],
tsConfigPath: './tsconfig.build.json',
};React + TypeScript
Configuration for React applications.
// fluentgen.config.js
export default {
targets: [{ file: './src/types/state.ts' }, { file: './src/types/api.ts' }],
generator: {
outputDir: './src/utils/builders',
},
plugins: [
'./plugins/react-state.ts', // Add React-specific helpers
],
};Express + Prisma
Configuration for Express with Prisma.
// fluentgen.config.js
export default {
targets: [
{
file: './prisma/generated/client/index.d.ts',
types: ['User', 'Post', 'Comment'],
},
],
generator: {
outputDir: './src/test-utils/builders',
useDefaults: true,
},
plugins: ['./plugins/prisma-integration.ts'],
};Advanced Patterns
Dynamic Configuration
Load config based on environment.
// fluentgen.config.js
const isDev = process.env.NODE_ENV !== 'production';
const isCi = process.env.CI === 'true';
export default {
...(isDev
? { patterns: ['./src/types/**/*.ts'] } // All in dev
: {
targets: [{ file: './src/types/core.ts', types: ['User', 'Product'] }],
}), // Limited in prod
generator: {
outputDir: './src/builders',
useDefaults: true,
addComments: !isCi, // Skip comments in CI
},
plugins: [
'./plugins/validation.ts',
...(isDev ? ['./plugins/logging.ts', './plugins/debug.ts'] : []),
],
};Multi-Package Generation
Generate for multiple independent packages.
// scripts/generate-all.js
import { exec } from 'child_process';
import { promisify } from 'util';
const execAsync = promisify(exec);
const packages = ['packages/api', 'packages/web', 'packages/mobile'];
for (const pkg of packages) {
console.log(`Generating builders for ${pkg}...`);
await execAsync(`cd ${pkg} && npx fluent-gen-ts batch`);
}package.json:
{
"scripts": {
"generate:all": "node scripts/generate-all.js"
}
}Conditional Plugins
Load plugins based on environment or feature flags.
// fluentgen.config.js
const enableValidation = process.env.ENABLE_VALIDATION !== 'false';
const enableTesting = process.env.NODE_ENV === 'test';
export default {
patterns: ['./src/types/*.ts'],
generator: {
outputDir: './src/builders',
},
plugins: [
// Always loaded
'./plugins/core.ts',
// Conditional
...(enableValidation ? ['./plugins/validation.ts'] : []),
...(enableTesting
? ['./plugins/fake-data.ts', './plugins/factories.ts']
: []),
],
};Watch Mode Integration
Auto-regenerate on file changes.
package.json:
{
"scripts": {
"dev": "concurrently \"npm:watch:types\" \"npm:dev:server\"",
"watch:types": "chokidar 'src/types/**/*.ts' -c 'npm run generate'",
"generate": "fluent-gen-ts batch",
"dev:server": "nodemon src/index.ts"
},
"devDependencies": {
"chokidar-cli": "^3.0.0",
"concurrently": "^8.0.0"
}
}Type-Safe Config with TypeScript
Use TypeScript for config with full type checking.
// fluentgen.config.ts
import type { Config } from 'fluent-gen-ts';
const config: Config = {
targets: [
{ file: './src/types/user.ts', types: ['User', 'Profile'] },
{ file: './src/types/product.ts', types: ['Product'] },
],
generator: {
outputDir: './src/builders',
useDefaults: true,
addComments: true,
},
plugins: ['./plugins/validation.ts'],
};
export default config;tsconfig.json:
{
"ts-node": {
"compilerOptions": {
"module": "CommonJS"
}
}
}Tips & Tricks
Tip 1: Use TypeScript for Config
Get autocomplete and type checking:
/** @type {import('fluent-gen-ts').Config} */
export default {
// Autocomplete works here!
};Tip 2: Share Config Across Projects
Create a base config and extend it:
// base.config.js
export const baseConfig = {
generator: {
useDefaults: true,
addComments: true,
},
plugins: ['@company/core-plugins'],
};
// fluentgen.config.js
import { baseConfig } from './base.config.js';
export default {
...baseConfig,
targets: [{ file: './src/types.ts', types: ['User'] }],
generator: {
...baseConfig.generator,
outputDir: './src/builders',
},
};Tip 3: Debug with Dry Run
Preview what will be generated:
npx fluent-gen-ts batch --dry-runTip 4: Validate Config
Test config without generating:
// validate-config.js
import config from './fluentgen.config.js';
console.log('Config valid:', config);
console.log('Targets:', config.targets?.length || 0);
console.log('Patterns:', config.patterns?.length || 0);
console.log('Plugins:', config.plugins?.length || 0);