Skip to content

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.

javascript
// 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.

javascript
// 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.

javascript
// 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.

javascript
// 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.

javascript
// 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.

javascript
// 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.

javascript
// 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.ts

Testing & CI/CD

Test Data Builders

Optimized for test data generation.

javascript
// 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:

json
{
  "scripts": {
    "generate:test-builders": "fluent-gen-ts batch",
    "pretest": "npm run generate:test-builders"
  }
}

CI/CD Integration

Configuration for continuous integration.

javascript
// 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:

yaml
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 build

Pre-commit Hook

Generate on code changes.

package.json:

json
{
  "scripts": {
    "generate": "fluent-gen-ts batch"
  },
  "lint-staged": {
    "src/types/**/*.ts": ["npm run generate", "git add src/builders"]
  }
}

.husky/pre-commit:

bash
#!/bin/sh
npx lint-staged

Multi-Environment

Development vs Production

Different configs for different environments.

fluentgen.dev.js:

javascript
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:

javascript
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:

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.

javascript
// Combined config
export default {
  targets: [{ file: './src/types/api.ts' }],

  generator: {
    outputDir: process.env.OUTPUT_DIR || './src/builders',
  },
};

package.json:

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.

javascript
// 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:

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.

javascript
// 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.

javascript
// 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.

javascript
// 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.

javascript
// 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.

javascript
// 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:

json
{
  "scripts": {
    "generate:all": "node scripts/generate-all.js"
  }
}

Conditional Plugins

Load plugins based on environment or feature flags.

javascript
// 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:

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.

typescript
// 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:

json
{
  "ts-node": {
    "compilerOptions": {
      "module": "CommonJS"
    }
  }
}

Tips & Tricks

Tip 1: Use TypeScript for Config

Get autocomplete and type checking:

javascript
/** @type {import('fluent-gen-ts').Config} */
export default {
  // Autocomplete works here!
};

Tip 2: Share Config Across Projects

Create a base config and extend it:

javascript
// 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:

bash
npx fluent-gen-ts batch --dry-run

Tip 4: Validate Config

Test config without generating:

javascript
// 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);

Next Steps

📖 Config Reference

All options explained: Configuration →

🔧 CLI Commands

Learn CLI usage: CLI Reference →

🔌 Plugin Recipes

Add custom behavior: Plugin Cookbook →

💡 Workflows

Integration patterns: Workflows →

Released under the MIT License.