Repo
Docs
Core Concepts
Code Generation

Code Generation

Splitting your monorepo into individual workspaces is a great way to organize your code, speed up tasks, and improve the local development experience. With Turborepo's code generation, it's easy to generate new source code for packages, modules, and even individual UI components in a structured way that integrates with the rest of your repository.

Add an Empty Workspace

Add a new, empty app or package to your monorepo.

turbo gen workspace

View all available options for gen workspace.

Extend your Turborepo by adding a new package or application

Copy an Existing Workspace

You can use an existing workspace as a template for your new app or package. This works for both workspaces within your existing monorepo, and remote workspaces from other repositories (specified via GitHub URL).

Examples

Create a new workspace in your monorepo by copying from an existing workspace in your repo.

turbo gen workspace --copy

Create a new workspace in your monorepo by copying from a remote workspace.

turbo gen workspace --copy https://github.com/vercel/turbo/tree/main/examples/with-tailwind/packages/tailwind-config

Note: When adding from a remote source, Turborepo is unable to verify that your repo has all of the required dependencies, and is using the correct package manager. In this case, some manual modifications may be required to get the new workspace working as expected within your repository.

View all available options for gen workspace --copy.

Extend your Turborepo by copying an existing package or application

Custom Generators

If a built-in generator does not fit your needs, you can create your own custom generator using Plop (opens in a new tab) configurations. Turborepo will automatically detect any generator configurations within your repo, and make them available to run from the command line.

Note: While Turborepo Generators are built on top of Plop, they do not require plop to be installed as a dependency in your repo.

While Turborepo understands all Plop configuration options and features, it provides a few additional features to improve the experience of writing generators within a repo configured with Turborepo.

  1. Generators are automatically discovered, loaded, and organized per workspace (no need to manually load them within a single configuration file)
  2. Generators are automatically run from the root of the workspace where they are defined
  3. Generators can be invoked from anywhere within your repo (or outside out it via the --root flag)
  4. Typescript generators are supported with zero configuration
  5. plop is not required to be installed as a depenendency of your repo

Note: ESM dependencies are not currently supported within custom generators

Getting Started

To build and run a custom generator, run the following command from anywhere within your monorepo using Turborepo.

turbo gen

You'll be prompted to select an existing generator or to create one if you don't have any yet. You can also create your configuration manually at turbo/generators/config.ts (or config.js) at the root of your repo - or within any workspace.

Note: If you are using Typescript, you will need to install the @turbo/gen (opens in a new tab) package as a devDependency to access the required TS types.

For example, the following illustrates a monorepo with three generator configurations:

- root
- apps/web
- packages/ui
├── package.json
├── turbo.json
├── README.md
├── apps
   └── web
       ├── package.json
       └── turbo
           └── generators
               ├── config.ts
               └── templates
├── packages
   └── ui
       ├── package.json
       └── turbo
           └── generators
               ├── config.ts
               └── templates
├── turbo
   └── generators
       ├── config.ts
       └── templates
├── pnpm-lock.yaml
└── pnpm-workspace.yaml

Generators created within workspaces are automatically run from the workspace root, not the repo root, nor the location of the generator configuration.

This makes your generators more simple to write. Creating a file at [workspace-root] only needs to be specified as <file> rather than ../../<file>.

Learn more about creating custom generators using Plop (opens in a new tab).

Writing Generators

A generator configuration file is a function that returns a Plop (opens in a new tab) configuration object. The configuration object is used to define the generator's prompts, and actions.

In its simplest form, a generator configuration file looks like:

turbo/generators/config.ts
import type { PlopTypes } from "@turbo/gen";
 
export default function generator(plop: PlopTypes.NodePlopAPI): void {
  // create a generator
  plop.setGenerator("Generator name", {
    description: "Generator description",
    // gather information from the user
    prompts: [
      ...
    ],
    // perform actions based on the prompts
    actions: [
      ...
    ],
  });
}

Prompts

Prompts are written using Plop prompts (opens in a new tab) and are used to gather information from the user.

Actions

Actions can use built-in Plop actions (opens in a new tab), or custom action functions (opens in a new tab) that you define yourself:

turbo/generators/config.ts
import type { PlopTypes } from "@turbo/gen";
 
const customAction: PlopTypes.CustomActionFunction = async (answers) => {
  // fetch data from a remote API
  const results = await fetchRemoteData();
  // add the response to the answers, making this data available to actions
  answers.results = results;
  // return a status string
  return 'Finished data fetching!';
}
 
export default function generator(plop: PlopTypes.NodePlopAPI): void {
  // create a generator
  plop.setGenerator("Generator name", {
    description: "Generator description",
    prompts: [
      ...
    ],
    actions: [
      customAction
      {/* actions now have access to `answers.results` */}
      ...
    ],
  });
}

Running Generators

Once you have created your generator configuration file, you can skip the selection prompt and directly run a specified generator with:

turbo gen [generator-name]

Arguments can also be passed directly to the generator prompts using --args

turbo gen [generator-name] --args answer1 answer2 ...

See bypassing prompts (opens in a new tab) in the Plop documentation for more information.

View all available options for gen.

Examples

The vercel/turbo (opens in a new tab) monorepo contains several custom Turborepo generators that are used for our own development.

Turborepo Examples