Skip to content

Commit 6c0b9d5

Browse files
chore(turbo_json): prefactor loading logic (#10719)
### Description This PR is a prefactor to make the process of constructing a task definition clearer: - move `TaskId`/`TaskName` out of `turborepo-lib` so they can be available if `turbo.json` ever moves to a new crate - move configuration logic to configuration crate - documenting how `turbo.json`s on disk become task definitions. Highly suggest looking at each commit on it's own. ### Testing Instructions 👀
1 parent f604188 commit 6c0b9d5

File tree

34 files changed

+469
-195
lines changed

34 files changed

+469
-195
lines changed

Cargo.lock

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ turborepo-lockfiles = { path = "crates/turborepo-lockfiles" }
6565
turborepo-microfrontends = { path = "crates/turborepo-microfrontends" }
6666
turborepo-process = { path = "crates/turborepo-process" }
6767
turborepo-repository = { path = "crates/turborepo-repository" }
68+
turborepo-task-id = { path = "crates/turborepo-task-id" }
6869
turborepo-ui = { path = "crates/turborepo-ui" }
6970
turborepo-unescape = { path = "crates/turborepo-unescape" }
7071
turborepo-scm = { path = "crates/turborepo-scm" }

crates/turborepo-lib/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ turborepo-process = { workspace = true }
141141
turborepo-repository = { path = "../turborepo-repository" }
142142
turborepo-scm = { workspace = true, features = ["git2"] }
143143
turborepo-signals = { workspace = true }
144+
turborepo-task-id = { workspace = true }
144145
turborepo-telemetry = { path = "../turborepo-telemetry" }
145146
turborepo-ui = { workspace = true }
146147
turborepo-unescape = { workspace = true }

crates/turborepo-lib/src/commands/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ use turborepo_ui::ColorConfig;
88

99
use crate::{
1010
cli,
11-
config::{ConfigurationOptions, Error as ConfigError, TurborepoConfigBuilder},
11+
config::{
12+
resolve_turbo_config_path, ConfigurationOptions, Error as ConfigError,
13+
TurborepoConfigBuilder,
14+
},
1215
opts::Opts,
13-
turbo_json::resolve_turbo_config_path,
1416
Args,
1517
};
1618

crates/turborepo-lib/src/commands/prune.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ use turborepo_telemetry::events::command::CommandEventBuilder;
1616
use turborepo_ui::BOLD;
1717

1818
use super::CommandBase;
19-
use crate::turbo_json::{RawTurboJson, CONFIG_FILE, CONFIG_FILE_JSONC};
19+
use crate::{
20+
config::{CONFIG_FILE, CONFIG_FILE_JSONC},
21+
turbo_json::RawTurboJson,
22+
};
2023

2124
pub const DEFAULT_OUTPUT_DIR: &str = "out";
2225

crates/turborepo-lib/src/config/mod.rs

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ use turborepo_cache::CacheConfig;
2323
use turborepo_errors::TURBO_SITE;
2424
use turborepo_repository::package_graph::PackageName;
2525

26+
use crate::cli::{EnvMode, LogOrder};
2627
pub use crate::turbo_json::{RawTurboJson, UIMode};
27-
use crate::{
28-
cli::{EnvMode, LogOrder},
29-
turbo_json::resolve_turbo_config_path,
30-
};
28+
29+
pub const CONFIG_FILE: &str = "turbo.json";
30+
pub const CONFIG_FILE_JSONC: &str = "turbo.jsonc";
3131

3232
#[derive(Debug, Error, Diagnostic)]
3333
#[error("Environment variables should not be prefixed with \"{env_pipeline_delimiter}\"")]
@@ -566,19 +566,42 @@ impl TurborepoConfigBuilder {
566566
}
567567
}
568568

569+
/// Given a directory path, determines which turbo.json configuration file to
570+
/// use. Returns an error if both turbo.json and turbo.jsonc exist in the same
571+
/// directory. Returns the path to the config file to use, defaulting to
572+
/// turbo.json if neither exists.
573+
pub fn resolve_turbo_config_path(
574+
dir_path: &turbopath::AbsoluteSystemPath,
575+
) -> Result<turbopath::AbsoluteSystemPathBuf, crate::config::Error> {
576+
use crate::config::Error;
577+
578+
let turbo_json_path = dir_path.join_component(CONFIG_FILE);
579+
let turbo_jsonc_path = dir_path.join_component(CONFIG_FILE_JSONC);
580+
581+
let turbo_json_exists = turbo_json_path.try_exists()?;
582+
let turbo_jsonc_exists = turbo_jsonc_path.try_exists()?;
583+
584+
match (turbo_json_exists, turbo_jsonc_exists) {
585+
(true, true) => Err(Error::MultipleTurboConfigs {
586+
directory: dir_path.to_string(),
587+
}),
588+
(true, false) => Ok(turbo_json_path),
589+
(false, true) => Ok(turbo_jsonc_path),
590+
// Default to turbo.json if neither exists
591+
(false, false) => Ok(turbo_json_path),
592+
}
593+
}
594+
569595
#[cfg(test)]
570596
mod test {
571597
use std::{collections::HashMap, ffi::OsString};
572598

573599
use tempfile::TempDir;
574600
use turbopath::{AbsoluteSystemPath, AbsoluteSystemPathBuf};
575601

576-
use crate::{
577-
config::{
578-
ConfigurationOptions, TurborepoConfigBuilder, DEFAULT_API_URL, DEFAULT_LOGIN_URL,
579-
DEFAULT_TIMEOUT,
580-
},
581-
turbo_json::{CONFIG_FILE, CONFIG_FILE_JSONC},
602+
use crate::config::{
603+
ConfigurationOptions, TurborepoConfigBuilder, CONFIG_FILE, CONFIG_FILE_JSONC,
604+
DEFAULT_API_URL, DEFAULT_LOGIN_URL, DEFAULT_TIMEOUT,
582605
};
583606

584607
#[test]

crates/turborepo-lib/src/config/turbo_json.rs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,44 @@ use camino::Utf8PathBuf;
22
use turbopath::{AbsoluteSystemPath, RelativeUnixPath};
33

44
use super::{ConfigurationOptions, Error, ResolvedConfigurationOptions};
5-
use crate::turbo_json::RawTurboJson;
5+
use crate::turbo_json::{RawRemoteCacheOptions, RawTurboJson};
66

77
pub struct TurboJsonReader<'a> {
88
repo_root: &'a AbsoluteSystemPath,
99
}
1010

11+
impl From<&RawRemoteCacheOptions> for ConfigurationOptions {
12+
fn from(remote_cache_opts: &RawRemoteCacheOptions) -> Self {
13+
Self {
14+
api_url: remote_cache_opts
15+
.api_url
16+
.as_ref()
17+
.map(|s| s.as_inner().clone()),
18+
login_url: remote_cache_opts
19+
.login_url
20+
.as_ref()
21+
.map(|s| s.as_inner().clone()),
22+
team_slug: remote_cache_opts
23+
.team_slug
24+
.as_ref()
25+
.map(|s| s.as_inner().clone()),
26+
team_id: remote_cache_opts
27+
.team_id
28+
.as_ref()
29+
.map(|s| s.as_inner().clone()),
30+
signature: remote_cache_opts.signature.as_ref().map(|s| *s.as_inner()),
31+
preflight: remote_cache_opts.preflight.as_ref().map(|s| *s.as_inner()),
32+
timeout: remote_cache_opts.timeout.as_ref().map(|s| *s.as_inner()),
33+
upload_timeout: remote_cache_opts
34+
.upload_timeout
35+
.as_ref()
36+
.map(|s| *s.as_inner()),
37+
enabled: remote_cache_opts.enabled.as_ref().map(|s| *s.as_inner()),
38+
..Self::default()
39+
}
40+
}
41+
}
42+
1143
impl<'a> TurboJsonReader<'a> {
1244
pub fn new(repo_root: &'a AbsoluteSystemPath) -> Self {
1345
Self { repo_root }
@@ -68,7 +100,7 @@ mod test {
68100
use tempfile::tempdir;
69101

70102
use super::*;
71-
use crate::turbo_json::CONFIG_FILE;
103+
use crate::config::CONFIG_FILE;
72104

73105
#[test]
74106
fn test_reads_from_default() {

crates/turborepo-lib/src/engine/builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ use turbopath::{AbsoluteSystemPath, AnchoredSystemPathBuf, RelativeUnixPathBuf};
77
use turborepo_errors::{Spanned, TURBO_SITE};
88
use turborepo_graph_utils as graph;
99
use turborepo_repository::package_graph::{PackageGraph, PackageName, PackageNode, ROOT_PKG_NAME};
10+
use turborepo_task_id::{TaskId, TaskName};
1011

1112
use super::Engine;
1213
use crate::{
1314
config,
14-
run::task_id::{TaskId, TaskName},
1515
task_graph::TaskDefinition,
1616
turbo_json::{
1717
validate_extends, validate_no_package_task_syntax, validate_with_has_no_topo,

crates/turborepo-lib/src/engine/execute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use futures::{stream::FuturesUnordered, StreamExt};
44
use tokio::sync::{mpsc, oneshot, Semaphore};
55
use tracing::log::debug;
66
use turborepo_graph_utils::Walker;
7+
use turborepo_task_id::TaskId;
78

89
use super::{Engine, TaskNode};
9-
use crate::run::task_id::TaskId;
1010

1111
pub struct Message<T, U> {
1212
pub info: T,

crates/turborepo-lib/src/engine/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ use petgraph::Graph;
1616
use thiserror::Error;
1717
use turborepo_errors::Spanned;
1818
use turborepo_repository::package_graph::{PackageGraph, PackageName};
19+
use turborepo_task_id::TaskId;
1920

20-
use crate::{run::task_id::TaskId, task_graph::TaskDefinition, turbo_json::UIMode};
21+
use crate::{task_graph::TaskDefinition, turbo_json::UIMode};
2122

2223
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
2324
pub enum TaskNode {
@@ -612,9 +613,9 @@ mod test {
612613
discovery::{DiscoveryResponse, PackageDiscovery, WorkspaceData},
613614
package_json::PackageJson,
614615
};
616+
use turborepo_task_id::TaskName;
615617

616618
use super::*;
617-
use crate::run::task_id::TaskName;
618619

619620
struct DummyDiscovery<'a>(&'a TempDir);
620621

0 commit comments

Comments
 (0)