@turbo/types
Version:
Turborepo types
461 lines (421 loc) • 14.5 kB
text/typescript
export type OutputLogs =
| "full"
| "hash-only"
| "new-only"
| "errors-only"
| "none";
export type EnvMode = "strict" | "loose";
export type UI = "tui" | "stream";
/**
* This is a relative Unix-style path (e.g. `./src/index.ts` or `src/index.ts`). Absolute paths (e.g. `/tmp/foo`) are not valid.
*/
export type RelativeUnixPath = string;
export type EnvWildcard = string;
export interface BaseSchema {
/** @defaultValue `https://turborepo.com/schema.v2.json` */
$schema?: string;
/**
* An object representing the task dependency graph of your project. turbo interprets
* these conventions to schedule, execute, and cache the outputs of tasks in
* your project.
*
* Documentation: https://turborepo.com/docs/reference/configuration#tasks
*
* @defaultValue `{}`
*/
// eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style -- it's more readable to specify a name for the key
tasks: {
/**
* The name of a task that can be executed by turbo. If turbo finds a workspace
* package with a package.json scripts object with a matching key, it will apply the
* pipeline task configuration to that npm script during execution.
*/
[script: string]: Pipeline;
};
}
/** A `turbo.json` file in a package in the monorepo (not the root) */
export interface WorkspaceSchema extends BaseSchema {
/**
* This key is only available in Workspace Configs
* and cannot be used in your root turbo.json.
*
* Tells turbo to extend your root `turbo.json`
* and overrides with the keys provided
* in your Workspace Configs.
*
* Currently, only the "//" value is allowed.
*
* @defaultValue `["//"]`
*/
extends: Array<string>;
/**
* Used to tag a package for boundaries rules. Boundaries rules can restrict
* which packages a tag group can import or be imported by.
*/
tags?: Array<string>;
/**
* Configuration for `turbo boundaries` that is specific to this package
*/
boundaries?: BoundariesConfig;
}
export interface RootSchema extends BaseSchema {
/**
* A list of globs to include in the set of implicit global hash dependencies.
*
* The contents of these files will be included in the global hashing
* algorithm and affect the hashes of all tasks.
*
* This is useful for busting the cache based on:
*
* - .env files (not in Git)
*
* - any root level file that impacts package tasks
* that are not represented in the traditional dependency graph
* (e.g. a root tsconfig.json, jest.config.ts, .eslintrc, etc.)
*
* Documentation: https://turborepo.com/docs/reference/configuration#globaldependencies
*
* @defaultValue `[]`
*/
globalDependencies?: Array<string>;
/**
* A list of environment variables for implicit global hash dependencies.
*
* The variables included in this list will affect all task hashes.
*
* Documentation: https://turborepo.com/docs/reference/configuration#globalenv
*
* @defaultValue `[]`
*/
globalEnv?: Array<EnvWildcard>;
/**
* An allowlist of environment variables that should be made to all tasks, but
* should not contribute to the task's cache key, e.g. `AWS_SECRET_KEY`.
*
* Documentation: https://turborepo.com/docs/reference/configuration#globalpassthroughenv
*
* @defaultValue `null`
*/
globalPassThroughEnv?: null | Array<EnvWildcard>;
/**
* Configuration options that control how turbo interfaces with the remote cache.
*
* Documentation: https://turborepo.com/docs/core-concepts/remote-caching
*
* @defaultValue `{}`
*/
remoteCache?: RemoteCache;
/**
* Enable use of the UI for `turbo`.
*
* Documentation: https://turborepo.com/docs/reference/configuration#ui
*
* @defaultValue `"stream"`
*/
ui?: UI;
/**
* Set/limit the maximum concurrency for task execution. Must be an integer greater than or equal to `1` or a percentage value like `50%`.
*
* - Use `1` to force serial execution (one task at a time).
* - Use `100%` to use all available logical processors.
*
* Documentation: https://turborepo.com/docs/reference/configuration#concurrency
*
* @defaultValue `"10"`
*/
concurrency?: string;
/**
* Disable check for `packageManager` in root `package.json`
*
* This is highly discouraged as it leaves `turbo` dependent on system
* configuration to infer the correct package manager.
*
* Some turbo features are disabled if this is set to true.
*
* @defaultValue `false`
*/
dangerouslyDisablePackageManagerCheck?: boolean;
/**
* Specify the filesystem cache directory.
*
* Documentation: https://turborepo.com/docs/reference/configuration#cachedir
*
* @defaultValue `".turbo/cache"`
*/
cacheDir?: RelativeUnixPath;
/**
* Turborepo runs a background process to pre-calculate some expensive operations. This standalone process (daemon) is a performance optimization, and not required for proper functioning of `turbo`.
*
* Documentation: https://turborepo.com/docs/reference/configuration#daemon
*
* @defaultValue `false`
*/
daemon?: boolean;
/**
* Turborepo's Environment Modes allow you to control which environment variables are available to a task at runtime:
*
* - `"strict"`: Filter environment variables to only those that are specified in the `env` and `globalEnv` keys in `turbo.json`.
* - `"loose"`: Allow all environment variables for the process to be available.
*
* Documentation: https://turborepo.com/docs/reference/configuration#envmode
*
* @defaultValue `"strict"`
*/
envMode?: EnvMode;
/**
* Configuration for `turbo boundaries`. Allows users to restrict a package's dependencies and dependents
*/
boundaries?: RootBoundariesConfig;
}
export interface Pipeline {
/**
* The list of tasks that this task depends on.
*
* Prefixing an item in dependsOn with a ^ prefix tells turbo that this task depends
* on the package's topological dependencies completing the task first.
* (e.g. "A package's build tasks should only run once all of its workspace dependencies
* have completed their own build commands.")
*
* Items in dependsOn without a ^ prefix express the relationships between tasks within the
* same package (e.g. "A package's test and lint commands depend on its own build being
* completed first.")
*
* Documentation: https://turborepo.com/docs/reference/configuration#dependson
*
* @defaultValue `[]`
*/
dependsOn?: Array<string>;
/**
* A list of environment variables that this task depends on.
*
* Note: If you are migrating from a turbo version 1.5 or below,
* you may be used to prefixing your variables with a $.
* You no longer need to use the $ prefix.
* (e.g. $GITHUB_TOKEN → GITHUB_TOKEN)
*
* Documentation: https://turborepo.com/docs/reference/configuration#env
*
* @defaultValue `[]`
*/
env?: Array<EnvWildcard>;
/**
* An allowlist of environment variables that should be made available in this
* task's environment, but should not contribute to the task's cache key,
* e.g. `AWS_SECRET_KEY`.
*
* Documentation: https://turborepo.com/docs/reference/configuration#passthroughenv
*
* @defaultValue `null`
*/
passThroughEnv?: null | Array<EnvWildcard>;
/**
* The set of glob patterns indicating a task's cacheable filesystem outputs.
*
* Turborepo captures task logs for all tasks. This enables us to cache tasks whose runs
* produce no artifacts other than logs (such as linters). Logs are always treated as a
* cacheable artifact and never need to be specified.
*
* Documentation: https://turborepo.com/docs/reference/configuration#outputs
*
* @defaultValue `[]`
*/
outputs?: Array<string>;
/**
* Whether or not to cache the outputs of the task.
*
* Setting cache to false is useful for long-running "watch" or development mode tasks.
*
* Documentation: https://turborepo.com/docs/reference/configuration#cache
*
* @defaultValue `true`
*/
cache?: boolean;
/**
* The set of glob patterns to consider as inputs to this task.
*
* Changes to files covered by these globs will cause a cache miss and
* the task will be rerun.
*
* If a file has been changed that is **not** included in the set of globs,
* it will not cause a cache miss.
*
* If omitted or empty, all files in the package are considered as inputs.
*
* Documentation: https://turborepo.com/docs/reference/configuration#inputs
*
* @defaultValue `[]`
*/
inputs?: Array<string>;
/**
* Output mode for the task.
*
* "full": Displays all output
*
* "hash-only": Show only the hashes of the tasks
*
* "new-only": Only show output from cache misses
*
* "errors-only": Only show output from task failures
*
* "none": Hides all task output
*
* Documentation: https://turborepo.com/docs/reference/run#--output-logs-option
*
* @defaultValue `"full"`
*/
outputLogs?: OutputLogs;
/**
* Indicates whether the task exits or not. Setting `persistent` to `true` tells
* turbo that this is a long-running task and will ensure that other tasks
* cannot depend on it.
*
* Documentation: https://turborepo.com/docs/reference/configuration#persistent
*
* @defaultValue `false`
*/
persistent?: boolean;
/**
* Mark a task as interactive allowing it to receive input from stdin.
* Interactive tasks must be marked with "cache": false as the input
* they receive from stdin can change the outcome of the task.
*
* Documentation: https://turborepo.com/docs/reference/configuration#interactive
*
* @defaultValue `false`
*/
interactive?: boolean;
/**
* Label a persistent task as interruptible to allow it to be restarted by `turbo watch`.
* `turbo watch` watches for changes to your packages and automatically
* restarts tasks that are affected. However, if a task is persistent, it will
* not be restarted by default. To enable restarting persistent tasks, set
* `interruptible` to true.
*
* Documentation: https://turborepo.com/docs/reference/configuration#interruptible
*
* @defaultValue `false`
*/
interruptible?: boolean;
/**
* A list of tasks that will run alongside this task.
*
* Tasks in this list will not be run until completion before this task starts execution.
*
* Documentation: https://turborepo.com/docs/reference/configuration#with
*
* @defaultValue `[]`
*/
with?: Array<string>;
}
export interface RemoteCache {
/**
* Indicates if signature verification is enabled for requests to the remote cache. When
* `true`, Turborepo will sign every uploaded artifact using the value of the environment
* variable `TURBO_REMOTE_CACHE_SIGNATURE_KEY`. Turborepo will reject any downloaded artifacts
* that have an invalid signature or are missing a signature.
*
* @defaultValue `false`
*/
signature?: boolean;
/**
* Indicates if the remote cache is enabled. When `false`, Turborepo will disable
* all remote cache operations, even if the repo has a valid token. If true, remote caching
* is enabled, but still requires the user to login and link their repo to a remote cache.
* Documentation: https://turborepo.com/docs/core-concepts/remote-caching
*
* @defaultValue `true`
*/
enabled?: boolean;
/**
* When enabled, any HTTP request will be preceded by an OPTIONS request to
* determine if the request is supported by the endpoint.
*
* Documentation: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#preflighted_requests
*
* @defaultValue `false`
*/
preflight?: boolean;
/**
* Set endpoint for API calls to the remote cache.
* Documentation: https://turborepo.com/docs/core-concepts/remote-caching#self-hosting
*
* @defaultValue `"https://vercel.com/api"`
*/
apiUrl?: string;
/**
* Set endpoint for requesting tokens during `turbo login`.
* Documentation: https://turborepo.com/docs/core-concepts/remote-caching#self-hosting
*
* @defaultValue `"https://vercel.com"`
*/
loginUrl?: string;
/**
* Sets a timeout for remote cache operations. Value is given in seconds and
* only whole values are accepted. If `0` is passed, then there is no timeout
* for any cache operations.
*
* @defaultValue `30`
*/
timeout?: number;
/**
* Sets a timeout for remote cache uploads. Value is given in seconds and
* only whole values are accepted. If `0` is passed, then there is no timeout
* for any remote cache uploads.
*
* @defaultValue `60`
*/
uploadTimeout?: number;
/**
* The ID of the Remote Cache team. Value will be passed as `teamId` in the
* querystring for all Remote Cache HTTP calls. Must start with `team_` or it will
* not be used.
*/
teamId?: string;
/**
* The slug of the Remote Cache team. Value will be passed as `slug` in the
* querystring for all Remote Cache HTTP calls.
*/
teamSlug?: string;
}
export interface Permissions {
/**
* Lists which tags are allowed. Any tag not included will be banned
* If omitted, all tags are permitted
*/
allow?: Array<string>;
/**
* Lists which tags are banned.
*/
deny?: Array<string>;
}
interface TagRules {
/**
* Rules for a tag's dependencies. Restricts which packages a tag can import
*/
dependencies?: Permissions;
/**
* Rules for a tag's dependents. Restricts which packages can import this tag.
*/
dependents?: Permissions;
}
export type BoundariesRulesMap = Record<string, TagRules>;
export interface BoundariesConfig {
/**
* Declares any implicit dependencies, i.e. any dependency not declared in a package.json.
* These can include dependencies automatically injected by a framework or a testing library.
*/
implicitDependencies?: Array<string>;
}
export interface RootBoundariesConfig extends BoundariesConfig {
/**
* The boundaries rules for tags. Restricts which packages
* can import a tag and which packages a tag can import
*/
tags?: BoundariesRulesMap;
}
export const isRootSchemaV2 = (schema: Schema): schema is RootSchema =>
!("extends" in schema);
export const isWorkspaceSchemaV2 = (
schema: Schema
): schema is WorkspaceSchema => !isRootSchemaV2(schema);
export type Schema = RootSchema | WorkspaceSchema;