Generators define a sequence of steps that transform your model into code. Each generator contains templates, partials, and configuration that tells Clay exactly what to generate.
{
"partials": ["partials/header.hbs"],
"steps": [
{
"generate": "templates/model.js",
"select": "$.model.types[*]",
"target": "src/models/{{kebabCase name}}.js"
}
],
"formatters": ["clay-generator-formatter-prettier"]
}
Array of Handlebars partial files to include:
"partials": [
"partials/header.hbs",
"partials/footer.hbs"
]
Array of generation steps (run in order):
"steps": [
{ "runCommand": "mkdir -p src/models" },
{ "generate": "templates/model.js", "select": "$.model.types[*]" },
{ "copy": "foundation", "target": "src/foundation" }
]
Optional formatters to prettify generated code:
"formatters": ["clay-generator-formatter-prettier"]
Generate files from Handlebars templates:
{
"generate": "templates/model.js",
"select": "$.model.types[*]",
"target": "src/models/{{kebabCase name}}.model.js",
"touch": false
}
Parameters:
generate - Path to template fileselect - JSONPath to select data (optional)target - Output path (can use Handlebars)touch - If true, only generate if file doesn't exist
Copy files or directories:
{
"copy": "foundation",
"select": "$.model.types[*]",
"target": "src/{{kebabCase name}}/foundation"
}
Parameters:
copy - Source path or git repo (e.g., "git+user/repo")
select - JSONPath to iterate (optional)target - Destination path (can use Handlebars)Execute shell commands:
{
"runCommand": "npm install",
"npxCommand": false
}
With model data:
{
"runCommand": "echo Generating {{name}}",
"select": "$.model.types[*]"
}
Parameters:
runCommand - Shell command to executenpxCommand - If true, run with npxselect - JSONPath to iterate (optional){
"partials": [
"partials/license-header.hbs",
"partials/imports.hbs"
],
"steps": [
{
"runCommand": "mkdir -p src/models src/controllers src/routes"
},
{
"generate": "templates/model.js",
"select": "$.model.types[*]",
"target": "src/models/{{kebabCase name}}.model.js"
},
{
"generate": "templates/controller.js",
"select": "$.model.types[*]",
"target": "src/controllers/{{kebabCase name}}.controller.js"
},
{
"generate": "templates/routes.js",
"select": "$.model.types[*]",
"target": "src/routes/{{kebabCase name}}.routes.js"
},
{
"generate": "templates/index.js",
"target": "src/index.js",
"touch": true
},
{
"copy": "config",
"target": "config"
},
{
"runCommand": "npm install"
}
],
"formatters": ["clay-generator-formatter-prettier"]
}
clay init generator my-generator
This creates:
clay/generators/my-generator/
├── generator.json
└── templates/
clay/generators/api/
├── generator.json # Configuration
├── templates/ # Handlebars templates
│ ├── model.js
│ ├── controller.js
│ └── routes.js
├── partials/ # Reusable template parts
│ ├── header.hbs
│ └── imports.hbs
└── foundation/ # Files to copy
└── config.js
select to iterate over model arraystouch: true for files users might customizeclay test-path
Clay uses a local-first approach. All generators are
stored in your project's clay/generators/ directory.
Start from scratch with a template:
clay init generator my-api-generator
Copy a generator from another location on your machine:
clay generator add /path/to/my-generator
clay generator add ../other-project/generators/my-generator
Browse available generators and clone them to your project:
clay generator list-available
clay generator add clay-model-documentation
Clone any generator repository. It will be copied to your local
clay/generators/ directory:
clay generator add https://github.com/user/my-generator
Generators are referenced by their path to the generator.json file:
{
"name": "my-app",
"generators": [
"generators/my-api-generator/generator.json",
"generators/forms/generator.json"
],
"model": {...}
}
clay/generators/ and are part of your codebase. Use
clay watch to see changes immediately!
Since generators are stored locally in your project, sharing them is easy:
clay/generators/ directory is part of your project