diff --git a/CHANGELOG.md b/CHANGELOG.md index c5bb90be7..1f0996c8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog -- **Added** `dependsOn` can now run the specified task in each direct workspace package listed in `dependencies`, `devDependencies`, or `peerDependencies`; for example, `{ "task": "build", "from": ["dependencies", "devDependencies"] }` runs `build` in each direct dependency and dev dependency ([#467](https://github.com/voidzero-dev/vite-task/pull/467), [#469](https://github.com/voidzero-dev/vite-task/pull/469)). - **Added** First-party support for caching `vite build` with zero cache config, giving Vite projects correct cache hits out of the box ([vitejs/vite#22453](https://github.com/vitejs/vite/pull/22453)). +- **Added** Object-form `dependsOn` entries can select direct workspace package dependencies by `dependencies`, `devDependencies`, and `peerDependencies`, and are materialized as task graph edges. - **Added** [`@voidzero-dev/vite-task-client`](https://npmx.dev/package/@voidzero-dev/vite-task-client), allowing tools to report cache information to Vite Task at runtime so users do not need to configure it manually ([#441](https://github.com/voidzero-dev/vite-task/pull/441), [#454](https://github.com/voidzero-dev/vite-task/pull/454), [#449](https://github.com/voidzero-dev/vite-task/pull/449), [#450](https://github.com/voidzero-dev/vite-task/pull/450), [#458](https://github.com/voidzero-dev/vite-task/pull/458), [#431](https://github.com/voidzero-dev/vite-task/pull/431), [#459](https://github.com/voidzero-dev/vite-task/pull/459), [#472](https://github.com/voidzero-dev/vite-task/pull/472)). - **Changed** Cached tasks now restore automatically tracked output files by default; use `output: []` to disable restoration ([#460](https://github.com/voidzero-dev/vite-task/pull/460), [#461](https://github.com/voidzero-dev/vite-task/pull/461)). - **Changed** Environment values in task cache fingerprints are now stored only as SHA-256 digests, and env-related cache miss details report names without values ([#455](https://github.com/voidzero-dev/vite-task/pull/455)). diff --git a/crates/vite_task/docs/boolean-flags.md b/crates/vite_task/docs/boolean-flags.md index bd8e0fa98..2c1062e10 100644 --- a/crates/vite_task/docs/boolean-flags.md +++ b/crates/vite_task/docs/boolean-flags.md @@ -9,7 +9,7 @@ This document describes how boolean flags work in `vp` commands. - `--recursive` / `-r` — Run task in all packages in the workspace - `--transitive` / `-t` — Run task in the current package and its transitive dependencies - `--workspace-root` / `-w` — Run task in the workspace root package -- `--ignore-depends-on` — Skip `dependsOn` dependencies +- `--ignore-depends-on` — Skip explicit `dependsOn` dependencies - `--verbose` / `-v` — Show full detailed summary after execution - `--cache` / `--no-cache` — Force caching on or off for all tasks and scripts @@ -39,7 +39,7 @@ vp run build -t # Run in workspace root vp run build -w -# Skip dependsOn dependencies +# Skip explicit dependsOn edges vp run build --ignore-depends-on # Verbose output diff --git a/crates/vite_task/docs/task-query.md b/crates/vite_task/docs/task-query.md index 7dce7b296..3544d5be1 100644 --- a/crates/vite_task/docs/task-query.md +++ b/crates/vite_task/docs/task-query.md @@ -7,14 +7,13 @@ How `vp run` decides which tasks to run and in what order. When `vp` starts, it builds two data structures from the workspace: 1. **Package graph** — which packages depend on which. Built from `package.json` dependency fields. -2. **Task graph** — which tasks exist and their string-form `dependsOn` relationships. Built from `vite.config.*` and `package.json` scripts. +2. **Task graph** — which tasks exist and their explicit `dependsOn` relationships. Built from `vite.config.*` and `package.json` scripts. Both are built once and reused for every query, including nested `vp run` calls inside task scripts. ### What goes into the task graph -The task graph contains a node for every task in every package. String-form -`dependsOn` declarations become edges in this graph: +The task graph contains a node for every task in every package, and edges only for explicit `dependsOn` declarations. ```jsonc // packages/app/vite.config.* @@ -38,8 +37,33 @@ Task graph: ``` Package dependency ordering (app depends on lib) is NOT stored as edges in the task graph. Why not is explained below. -Object-form `dependsOn` entries are also not stored as global task graph edges; -they are kept on the declaring task and expanded for each query. + +Object-form `dependsOn` entries are also explicit task dependencies. At startup, +they are resolved against the declaring package's direct `package.json` +dependency fields and materialized as task graph edges: + +```jsonc +// packages/app/vite.config.* +{ + "tasks": { + "test": { + "command": "vitest run", + "dependsOn": [{ "task": "build", "from": ["dependencies", "devDependencies"] }], + }, + }, +} +``` + +If `app` directly depends on `ui` and `shared`, and both packages have `build`, +the task graph contains: + +``` +app#test ──dependsOn──> ui#build +app#test ──dependsOn──> shared#build +``` + +Dependency packages without the requested task are skipped. Recursive expansion +comes from dependency tasks declaring their own `dependsOn` entries. ## What happens when you run a query @@ -77,7 +101,7 @@ Given the package subgraph and a task name, we build the execution plan: 1. Find which selected packages have the requested task. 2. For packages that don't have it, reconnect their predecessors to their successors (skip-intermediate, explained below). 3. Map the remaining package nodes to task nodes — this gives us topological ordering. -4. Expand `dependsOn` from these tasks (may pull in tasks from outside the selected packages). +4. Follow explicit `dependsOn` edges outward from these tasks (may pull in tasks from outside the selected packages). The result is the execution plan: which tasks to run and in what order. @@ -172,11 +196,9 @@ The package subgraph is already a lightweight `DiGraphMap` So we clone the `DiGraphMap` once and mutate the clone. We iterate the original (stable node order) while modifying the clone. -## `dependsOn` expansion +## Explicit dependency expansion -After mapping the package subgraph to tasks, we expand `dependsOn` entries. -String-form entries follow task graph edges and can pull in tasks from packages -outside the selected set. +After mapping the package subgraph to tasks, we follow explicit `dependsOn` edges from the task graph. This can pull in tasks from packages outside the selected set. ```jsonc // packages/app/vite.config.* @@ -193,31 +215,7 @@ If you run `vp run --filter app build`, the package subgraph contains only `app` This is intentional — `dependsOn` is an explicit declaration that a task can't run without its dependency. Ignoring it would break the build. (Users can skip this with `--ignore-depends-on`.) -Object-form entries select direct package dependencies from the declaring task: - -```jsonc -// packages/app/vite.config.* -{ - "tasks": { - "test": { - "command": "vitest run", - "dependsOn": [{ "task": "build", "from": ["dependencies", "devDependencies"] }], - }, - }, -} -``` - -For `app#test`, this runs `build` in direct workspace dependency packages selected -by the listed package.json fields. Packages without `build` are skipped. Supported -fields are `dependencies`, `devDependencies`, and `peerDependencies`. - -Recursive expansion comes from dependency tasks declaring their own `dependsOn` -entries. For example, if `ui#build` also has `{ "task": "build", "from": "dependencies" }`, -then `tokens#build` is selected while expanding `ui#build`. - -The expansion follows `dependsOn` entries, not every topological edge. -Topological ordering comes from the package subgraph — it's already baked into -the task execution graph by Stage 2. +The expansion follows explicit `dependsOn` edges, including edges materialized from object-form entries. It does not follow topological package edges. Topological ordering comes from the package subgraph — it's already baked into the task execution graph by Stage 2. ## Nested `vp run` @@ -242,7 +240,7 @@ The nested query produces its own execution subgraph, which gets embedded inside ``` Startup (once): workspace files ──> package graph ──> task graph - (dependencies) (tasks + string dependsOn edges) + (dependencies) (tasks + dependsOn edges) Per query: CLI flags ──> PackageQuery @@ -254,7 +252,7 @@ Per query: task graph ────> task execution graph (map packages to tasks, skip-intermediate reconnection, - dependsOn expansion) + explicit dep expansion) │ ▼ execution plan diff --git a/crates/vite_task_graph/run-config.ts b/crates/vite_task_graph/run-config.ts index 5dcd95024..ab7579d97 100644 --- a/crates/vite_task_graph/run-config.ts +++ b/crates/vite_task_graph/run-config.ts @@ -39,8 +39,7 @@ cwd?: string, * Dependencies of this task. * * String entries keep same-package / `package-name#task-name` behavior. - * Object entries run a task name in direct workspace dependency - * packages selected by package.json dependency fields. + * Object entries select direct workspace dependency packages from package.json fields. */ dependsOn?: Array, } & ({ /** diff --git a/crates/vite_task_graph/src/config/mod.rs b/crates/vite_task_graph/src/config/mod.rs index d5f5f8cb9..61358ec5b 100644 --- a/crates/vite_task_graph/src/config/mod.rs +++ b/crates/vite_task_graph/src/config/mod.rs @@ -26,8 +26,7 @@ use crate::config::user::UserTaskOptions; /// For example, `cwd` is resolved to absolute ones (no external factor can change it), /// but `command` is not parsed into program and args yet because environment variables in it may need to be expanded. /// -/// `depends_on` is not included here because string-form entries are represented by task graph -/// edges, and package dependency entries are stored separately on the indexed task graph. +/// `depends_on` is not included here because it's represented by the edges of the task graph. #[derive(Debug, Serialize)] pub struct ResolvedTaskConfig { /// The command or commands to run for this task. diff --git a/crates/vite_task_graph/src/config/user.rs b/crates/vite_task_graph/src/config/user.rs index 3caf95b8e..9018f55f9 100644 --- a/crates/vite_task_graph/src/config/user.rs +++ b/crates/vite_task_graph/src/config/user.rs @@ -86,9 +86,9 @@ pub enum UserDependencyType { #[cfg_attr(all(test, not(clippy)), derive(TS), ts(rename = "DependsOnFrom"))] #[serde(untagged)] pub enum UserDependsOnFrom { - /// Traverse one package.json dependency field. + /// Select one package.json dependency field. Single(UserDependencyType), - /// Traverse the union of multiple package.json dependency fields. + /// Select the union of multiple package.json dependency fields. Multiple( #[cfg_attr(all(test, not(clippy)), ts(as = "Vec"))] Vec1, @@ -105,7 +105,7 @@ impl UserDependsOnFrom { } } -/// Object form for `dependsOn` entries that select workspace package dependencies. +/// Object form for `dependsOn` entries that select direct workspace package dependencies. #[derive(Debug, Deserialize, PartialEq, Eq, Clone)] // TS derive macro generates code using std types that clippy disallows; skip derive during linting #[cfg_attr(all(test, not(clippy)), derive(TS))] @@ -236,8 +236,7 @@ pub struct UserTaskOptions { /// Dependencies of this task. /// /// String entries keep same-package / `package-name#task-name` behavior. - /// Object entries run a task name in direct workspace dependency - /// packages selected by package.json dependency fields. + /// Object entries select direct workspace dependency packages from package.json fields. pub depends_on: Option>, /// Cache-related fields @@ -637,26 +636,8 @@ mod tests { assert!(serde_json::from_value::(user_config_json).is_err()); } - #[test] - fn test_depends_on_package_dependency_missing_from_error() { - let user_config_json = json!({ - "command": "echo test", - "dependsOn": [{ "task": "build" }] - }); - assert!(serde_json::from_value::(user_config_json).is_err()); - } - #[test] fn test_depends_on_package_dependency_unknown_from_error() { - let user_config_json = json!({ - "command": "echo test", - "dependsOn": [{ "task": "build", "from": "runtimeDependencies" }] - }); - assert!(serde_json::from_value::(user_config_json).is_err()); - } - - #[test] - fn test_depends_on_package_dependency_optional_from_error() { let user_config_json = json!({ "command": "echo test", "dependsOn": [{ "task": "build", "from": "optionalDependencies" }] @@ -664,22 +645,6 @@ mod tests { assert!(serde_json::from_value::(user_config_json).is_err()); } - #[test] - fn test_depends_on_package_dependency_task_name_allows_hash() { - let user_config_json = json!({ - "command": "echo test", - "dependsOn": [{ "task": "@scope/pkg#build", "from": "dependencies" }] - }); - let user_config: UserTaskConfig = serde_json::from_value(user_config_json).unwrap(); - assert_eq!( - user_config.options.depends_on.as_ref().unwrap().as_ref(), - [UserDependsOnEntry::Package(UserPackageDependency { - task: "@scope/pkg#build".into(), - from: UserDependsOnFrom::Single(UserDependencyType::Dependencies), - })] - ); - } - #[test] fn test_task_invalid_shorthand_error() { let user_config_json = json!({ diff --git a/crates/vite_task_graph/src/lib.rs b/crates/vite_task_graph/src/lib.rs index 025b6fa69..68d04a663 100644 --- a/crates/vite_task_graph/src/lib.rs +++ b/crates/vite_task_graph/src/lib.rs @@ -10,7 +10,10 @@ use config::{ ResolvedGlobalCacheConfig, ResolvedTaskConfig, UserRunConfig, UserTaskConfig, UserTaskDefinition, }; -use petgraph::graph::{DefaultIx, DiGraph, EdgeIndex, IndexType, NodeIndex}; +use petgraph::{ + graph::{DefaultIx, DiGraph, EdgeIndex, IndexType, NodeIndex}, + visit::EdgeRef as _, +}; use rustc_hash::{FxBuildHasher, FxHashMap}; use serde::Serialize; pub use specifier::TaskSpecifier; @@ -29,9 +32,10 @@ use crate::{ /// The type of a task dependency edge in the task graph. /// -/// Currently only `Explicit` is produced (from `dependsOn` in the task config). -/// Topological ordering is handled at query time via the package subgraph rather -/// than by pre-computing edges in the task graph. +/// All edges are produced from `dependsOn` in task config, including string-form +/// task specifiers and object-form package dependency selections. Topological +/// ordering is handled at query time via the package subgraph rather than by +/// pre-computing package edges in the task graph. #[derive(Debug, Clone, Copy, Serialize)] pub struct TaskDependencyType; @@ -185,10 +189,9 @@ pub type TaskNodeIndex = NodeIndex; pub type TaskEdgeIndex = EdgeIndex; /// A `dependsOn` entry that selects direct package dependencies from a source task. -#[derive(Debug, Clone)] -pub(crate) struct PackageDependencyEntry { - pub task_name: Str, - pub dependency_types: Arc<[DependencyType]>, +struct PackageDependencyEntry { + task_name: Str, + dependency_types: Box<[DependencyType]>, } impl PackageDependencyEntry { @@ -235,15 +238,6 @@ pub struct IndexedTaskGraph { /// Reverse map: task node index → task id (for hook lookup) task_ids_by_node_index: FxHashMap, - /// Object-form `dependsOn` entries keyed by the task that declared them. - /// - /// These stay anchored to their source task and are materialized when - /// `query_tasks` builds a per-query `TaskExecutionGraph`. Keeping them out - /// of the global `task_graph` avoids leaking package dependency selection - /// into direct runs of dependency tasks. - pub(crate) package_dependency_entries_by_node_index: - FxHashMap>, - /// Global cache configuration resolved from the workspace root config. resolved_global_cache: ResolvedGlobalCacheConfig, @@ -274,8 +268,7 @@ impl IndexedTaskGraph { let package_graph = vite_workspace::load_package_graph(workspace_root)?; - // Record `dependsOn` entries for each task node to add dependencies after all - // tasks are indexed. + // Record dependency declarations for each task node to add explicit dependencies later. let mut task_ids_with_depends_on_entries: Vec<(TaskId, Option>)> = Vec::new(); @@ -431,16 +424,15 @@ impl IndexedTaskGraph { indexed_package_graph: IndexedPackageGraph::index(package_graph), node_indices_by_task_id, task_ids_by_node_index, - package_dependency_entries_by_node_index: FxHashMap::default(), resolved_global_cache, pre_post_scripts_enabled: root_pre_post_scripts_enabled.unwrap_or(true), }; - // Add string-form dependencies as explicit task graph edges, and keep - // object-form package dependency entries anchored to their source task. + // Add explicit dependencies. String-form entries resolve to fixed task + // specifier edges. Object-form entries select direct package dependency + // tasks and materialize those selections as global task graph edges. for (from_task_id, depends_on_entries) in task_ids_with_depends_on_entries { let from_node_index = me.node_indices_by_task_id[&from_task_id]; - let mut package_dependency_entries = Vec::::new(); for entry in depends_on_entries.iter().flat_map(|entries| entries.iter()) { match entry { UserDependsOnEntry::Task(specifier) => { @@ -463,15 +455,11 @@ impl IndexedTaskGraph { ); } UserDependsOnEntry::Package(entry) => { - package_dependency_entries - .push(PackageDependencyEntry::from_user_config(entry)); + let entry = PackageDependencyEntry::from_user_config(entry); + me.add_package_dependency_edges(from_node_index, &from_task_id, &entry); } } } - if !package_dependency_entries.is_empty() { - me.package_dependency_entries_by_node_index - .insert(from_node_index, Arc::from(package_dependency_entries)); - } } // Topological dependency edges are no longer pre-computed here. @@ -531,6 +519,31 @@ impl IndexedTaskGraph { Ok(*node_index) } + fn add_package_dependency_edges( + &mut self, + from_node_index: TaskNodeIndex, + from_task_id: &TaskId, + entry: &PackageDependencyEntry, + ) { + let package_graph = self.indexed_package_graph.package_graph(); + let dependency_tasks = package_graph + .edges(from_task_id.package_index) + .filter(|edge| entry.dependency_types.contains(edge.weight())) + .filter_map(|edge| { + self.node_indices_by_task_id + .get(&TaskId { + package_index: edge.target(), + task_name: entry.task_name.clone(), + }) + .copied() + }) + .collect::>(); + + for to_node_index in dependency_tasks { + self.task_graph.update_edge(from_node_index, to_node_index, TaskDependencyType); + } + } + #[must_use] pub const fn task_graph(&self) -> &TaskGraph { &self.task_graph diff --git a/crates/vite_task_graph/src/query/mod.rs b/crates/vite_task_graph/src/query/mod.rs index 797d4b0f2..9478a4b18 100644 --- a/crates/vite_task_graph/src/query/mod.rs +++ b/crates/vite_task_graph/src/query/mod.rs @@ -15,8 +15,6 @@ //! contains only task-having packages; edges map directly to task dependency edges. //! //! Explicit `dependsOn` dependencies are then added on top by `add_dependencies`. -//! String-form entries are followed as task graph edges; object-form entries -//! select direct package dependencies from the source task for the concrete query. use petgraph::{Direction, prelude::DiGraphMap, visit::EdgeRef}; use rustc_hash::{FxHashMap, FxHashSet}; @@ -24,7 +22,7 @@ use vite_str::Str; use vite_workspace::PackageNodeIndex; pub use vite_workspace::package_graph::{PackageQuery, PackageQueryResolveError}; -use crate::{IndexedTaskGraph, PackageDependencyEntry, TaskDependencyType, TaskId, TaskNodeIndex}; +use crate::{IndexedTaskGraph, TaskDependencyType, TaskId, TaskNodeIndex}; /// A task execution graph queried from a `TaskQuery`. /// @@ -150,22 +148,6 @@ impl IndexedTaskGraph { }) } - /// Resolve each package to its `task_name` task node, dropping packages that - /// don't define the task. Duplicate packages collapse to a single entry. - fn resolve_packages_to_tasks( - &self, - packages: impl Iterator, - task_name: &Str, - ) -> FxHashMap { - packages - .filter_map(|pkg| { - self.node_indices_by_task_id - .get(&TaskId { package_index: pkg, task_name: task_name.clone() }) - .map(|&task_idx| (pkg, task_idx)) - }) - .collect() - } - /// Map a package subgraph to a task execution graph. /// /// For packages **with** the task: add the corresponding `TaskNodeIndex`. @@ -186,7 +168,14 @@ impl IndexedTaskGraph { execution_graph: &mut TaskExecutionGraph, ) { // Build the task-lookup map for all packages that have the requested task. - let pkg_to_task = self.resolve_packages_to_tasks(package_subgraph.nodes(), task_name); + let pkg_to_task: FxHashMap = package_subgraph + .nodes() + .filter_map(|pkg| { + self.node_indices_by_task_id + .get(&TaskId { package_index: pkg, task_name: task_name.clone() }) + .map(|&task_idx| (pkg, task_idx)) + }) + .collect(); // Clone the subgraph so that reconnection edits are visible in subsequent iterations. let mut subgraph = package_subgraph.clone(); @@ -225,11 +214,11 @@ impl IndexedTaskGraph { } } - /// Recursively add `dependsOn` dependencies to the execution graph. + /// Recursively add dependencies to the execution graph based on filtered edges. /// - /// Starts from the current nodes in `execution_graph`, follows string-form - /// task graph edges that match `filter_edge`, and expands object-form package - /// dependency entries anchored at each visited source task. + /// Starts from the current nodes in `execution_graph` and follows outgoing edges + /// that match `filter_edge`, adding new nodes to the frontier until no new nodes + /// are discovered. fn add_dependencies( &self, execution_graph: &mut TaskExecutionGraph, @@ -246,18 +235,6 @@ impl IndexedTaskGraph { let mut next_frontier = FxHashSet::::default(); for from_node in frontier { - if let Some(entries) = self.package_dependency_entries_by_node_index.get(&from_node) - { - for entry in entries.iter() { - self.add_package_dependency_entry( - execution_graph, - from_node, - entry, - &mut next_frontier, - ); - } - } - for edge_ref in self.task_graph.edges(from_node) { let to_node = edge_ref.target(); let dep_type = *edge_ref.weight(); @@ -274,47 +251,4 @@ impl IndexedTaskGraph { frontier = next_frontier; } } - - fn add_package_dependency_entry( - &self, - execution_graph: &mut TaskExecutionGraph, - from_node: TaskNodeIndex, - entry: &PackageDependencyEntry, - next_frontier: &mut FxHashSet, - ) { - let from_task_id = &self.task_ids_by_node_index[&from_node]; - let origin_package = from_task_id.package_index; - let package_graph = self.indexed_package_graph.package_graph(); - - // Select the origin's direct dependency packages whose edge matches one of - // the requested dependency fields, mapped to their `task_name` task nodes. - let pkg_to_task = self.resolve_packages_to_tasks( - package_graph - .edges(origin_package) - .filter(|edge| entry.dependency_types.contains(edge.weight())) - .map(|edge| edge.target()), - &entry.task_name, - ); - - // Connect the source task to each selected dependency task, recording newly - // discovered nodes for the next frontier (`add_edge` inserts the node too). - for &task_idx in pkg_to_task.values() { - if !execution_graph.graph.contains_node(task_idx) { - next_frontier.insert(task_idx); - } - execution_graph.graph.add_edge(from_node, task_idx, ()); - } - - // Preserve dependency ordering between the selected packages themselves. - for (&src_package, &src_task) in &pkg_to_task { - for edge in package_graph.edges(src_package) { - if !entry.dependency_types.contains(edge.weight()) { - continue; - } - if let Some(&dst_task) = pkg_to_task.get(&edge.target()) { - execution_graph.graph.add_edge(src_task, dst_task, ()); - } - } - } - } } diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/package.json deleted file mode 100644 index 0967ef424..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/dev-b/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/dev-b/package.json deleted file mode 100644 index c98213c47..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/dev-b/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "@test/dev-b", - "version": "1.0.0", - "scripts": { - "build": "vtt build dev-b", - "build_recursive": "vtt build recursive dev-b" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-app/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-app/package.json deleted file mode 100644 index a92699265..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-app/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "@test/nearest-order-app", - "version": "1.0.0", - "dependencies": { - "@test/nearest-order-direct": "workspace:*", - "@test/nearest-order-shared": "workspace:*" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-app/vite-task.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-app/vite-task.json deleted file mode 100644 index 8db70fe8d..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-app/vite-task.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tasks": { - "build": { - "command": "vtt build nearest-order-app", - "dependsOn": [{ "task": "build", "from": "dependencies" }] - } - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-direct/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-direct/package.json deleted file mode 100644 index 14092fc25..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-direct/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@test/nearest-order-direct", - "version": "1.0.0", - "scripts": { - "build": "vtt build nearest-order-direct" - }, - "dependencies": { - "@test/nearest-order-skip": "workspace:*" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-shared/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-shared/package.json deleted file mode 100644 index 6eb9cf2e6..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-shared/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@test/nearest-order-shared", - "version": "1.0.0", - "scripts": { - "build": "vtt build nearest-order-shared" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-skip/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-skip/package.json deleted file mode 100644 index 646b75bbc..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-order-skip/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@test/nearest-order-skip", - "version": "1.0.0", - "scripts": { - "lint": "vtt lint nearest-order-skip" - }, - "dependencies": { - "@test/nearest-order-shared": "workspace:*" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-app/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-app/package.json deleted file mode 100644 index 163dcb838..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-app/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@test/nearest-stop-app", - "version": "1.0.0", - "dependencies": { - "@test/nearest-stop-foo": "workspace:*" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-app/vite-task.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-app/vite-task.json deleted file mode 100644 index 6cc6f233f..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-app/vite-task.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tasks": { - "build": { - "command": "vtt build nearest-stop-app", - "dependsOn": [{ "task": "build", "from": "dependencies" }] - } - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-bar/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-bar/package.json deleted file mode 100644 index 8f0a7a2fb..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-bar/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@test/nearest-stop-bar", - "version": "1.0.0", - "scripts": { - "build": "vtt build nearest-stop-bar" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-foo/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-foo/package.json deleted file mode 100644 index 589389b78..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-stop-foo/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@test/nearest-stop-foo", - "version": "1.0.0", - "scripts": { - "build": "vtt build nearest-stop-foo" - }, - "dependencies": { - "@test/nearest-stop-bar": "workspace:*" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-app/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-app/package.json deleted file mode 100644 index fb8bef543..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-app/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@test/nearest-through-app", - "version": "1.0.0", - "dependencies": { - "@test/nearest-through-foo": "workspace:*" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-app/vite-task.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-app/vite-task.json deleted file mode 100644 index a322eee3a..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-app/vite-task.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tasks": { - "build": { - "command": "vtt build nearest-through-app", - "dependsOn": [{ "task": "build", "from": "dependencies" }] - } - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-bar/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-bar/package.json deleted file mode 100644 index ed46cdec6..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-bar/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@test/nearest-through-bar", - "version": "1.0.0", - "scripts": { - "build": "vtt build nearest-through-bar" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-foo/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-foo/package.json deleted file mode 100644 index 28bf0e39f..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/nearest-through-foo/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@test/nearest-through-foo", - "version": "1.0.0", - "scripts": { - "lint": "vtt lint nearest-through-foo" - }, - "dependencies": { - "@test/nearest-through-bar": "workspace:*" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/peer-b/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/peer-b/package.json deleted file mode 100644 index 999be6fe2..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/peer-b/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@test/peer-b", - "version": "1.0.0", - "scripts": { - "build": "vtt build peer-b" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/prod-b/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/prod-b/package.json deleted file mode 100644 index dd7553eea..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/prod-b/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@test/prod-b", - "version": "1.0.0", - "scripts": { - "build": "vtt build prod-b" - } -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots.toml b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots.toml deleted file mode 100644 index 689ec9fd4..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots.toml +++ /dev/null @@ -1,67 +0,0 @@ -# Object-form dependsOn selects direct package.json dependency fields. - -[[plan]] -compact = true -name = "dependencies_from" -args = ["run", "test_dependencies"] -cwd = "packages/app" - -[[plan]] -compact = true -name = "dev_dependencies_from" -args = ["run", "test_dev"] -cwd = "packages/app" - -[[plan]] -compact = true -name = "peer_dependencies_from" -args = ["run", "test_peer"] -cwd = "packages/app" - -[[plan]] -compact = true -name = "multiple_from_fields" -args = ["run", "test_union"] -cwd = "packages/app" - -[[plan]] -compact = true -name = "recursive_through_dependency_task" -args = ["run", "test_recursive"] -cwd = "packages/app" - -[[plan]] -compact = true -name = "direct_dependency_without_task_is_skipped" -args = ["run", "@test/nearest-through-app#build"] - -[[plan]] -compact = true -name = "direct_dependency_with_task_is_selected" -args = ["run", "@test/nearest-stop-app#build"] - -# A selected package (`nearest-order-direct`) transitively depends on another -# selected package (`nearest-order-shared`) only through a task-less package -# (`nearest-order-skip`). No implicit recursion: the two selected `build` tasks -# stay unordered because there is no direct package edge between them. -[[plan]] -compact = true -name = "direct_dependency_tasks_are_not_transitively_ordered" -args = ["run", "@test/nearest-order-app#build"] - -[[plan]] -compact = true -name = "direct_dependency_task_does_not_expand" -args = ["run", "@test/dev-a#build"] - -[[plan]] -compact = true -name = "ignore_depends_on_omits_object" -args = ["run", "--ignore-depends-on", "test_union"] -cwd = "packages/app" - -[[plan]] -compact = true -name = "extra_args_only_reach_requested_object_task" -args = ["run", "test_union", "extra"] -cwd = "packages/app" diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_task_does_not_expand.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_task_does_not_expand.jsonc deleted file mode 100644 index 40ad1c002..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_task_does_not_expand.jsonc +++ /dev/null @@ -1,4 +0,0 @@ -// run @test/dev-a#build -{ - "packages/dev-a#build": [] -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_tasks_are_not_transitively_ordered.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_tasks_are_not_transitively_ordered.jsonc deleted file mode 100644 index 6e744951f..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_tasks_are_not_transitively_ordered.jsonc +++ /dev/null @@ -1,9 +0,0 @@ -// run @test/nearest-order-app#build -{ - "packages/nearest-order-app#build": [ - "packages/nearest-order-direct#build", - "packages/nearest-order-shared#build" - ], - "packages/nearest-order-direct#build": [], - "packages/nearest-order-shared#build": [] -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_with_task_is_selected.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_with_task_is_selected.jsonc deleted file mode 100644 index 186614a39..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_with_task_is_selected.jsonc +++ /dev/null @@ -1,7 +0,0 @@ -// run @test/nearest-stop-app#build -{ - "packages/nearest-stop-app#build": [ - "packages/nearest-stop-foo#build" - ], - "packages/nearest-stop-foo#build": [] -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_without_task_is_skipped.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_without_task_is_skipped.jsonc deleted file mode 100644 index d1c1894dd..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_direct_dependency_without_task_is_skipped.jsonc +++ /dev/null @@ -1,4 +0,0 @@ -// run @test/nearest-through-app#build -{ - "packages/nearest-through-app#build": [] -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_extra_args_only_reach_requested_object_task.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_extra_args_only_reach_requested_object_task.jsonc deleted file mode 100644 index 9ab04f3fb..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_extra_args_only_reach_requested_object_task.jsonc +++ /dev/null @@ -1,9 +0,0 @@ -// run test_union extra -{ - "packages/app#test_union": [ - "packages/dev-a#build", - "packages/prod-a#build" - ], - "packages/dev-a#build": [], - "packages/prod-a#build": [] -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_peer_dependencies_from.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_peer_dependencies_from.jsonc deleted file mode 100644 index 3879257b3..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_peer_dependencies_from.jsonc +++ /dev/null @@ -1,7 +0,0 @@ -// run test_peer -{ - "packages/app#test_peer": [ - "packages/peer-a#build" - ], - "packages/peer-a#build": [] -} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/task_graph.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/task_graph.jsonc deleted file mode 100644 index 0a2e54760..000000000 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/task_graph.jsonc +++ /dev/null @@ -1,1028 +0,0 @@ -// task graph -[ - { - "key": [ - "/packages/app", - "test_dependencies" - ], - "node": { - "task_display": { - "package_name": "@test/app", - "task_name": "test_dependencies", - "package_path": "/packages/app" - }, - "resolved_config": { - "commands": [ - "vtt test dependencies" - ], - "resolved_options": { - "cwd": "/packages/app", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/app", - "test_dev" - ], - "node": { - "task_display": { - "package_name": "@test/app", - "task_name": "test_dev", - "package_path": "/packages/app" - }, - "resolved_config": { - "commands": [ - "vtt test dev" - ], - "resolved_options": { - "cwd": "/packages/app", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/app", - "test_peer" - ], - "node": { - "task_display": { - "package_name": "@test/app", - "task_name": "test_peer", - "package_path": "/packages/app" - }, - "resolved_config": { - "commands": [ - "vtt test peer" - ], - "resolved_options": { - "cwd": "/packages/app", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/app", - "test_recursive" - ], - "node": { - "task_display": { - "package_name": "@test/app", - "task_name": "test_recursive", - "package_path": "/packages/app" - }, - "resolved_config": { - "commands": [ - "vtt test recursive" - ], - "resolved_options": { - "cwd": "/packages/app", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/app", - "test_union" - ], - "node": { - "task_display": { - "package_name": "@test/app", - "task_name": "test_union", - "package_path": "/packages/app" - }, - "resolved_config": { - "commands": [ - "vtt test union" - ], - "resolved_options": { - "cwd": "/packages/app", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/dev-a", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/dev-a", - "task_name": "build", - "package_path": "/packages/dev-a" - }, - "resolved_config": { - "commands": [ - "vtt build dev-a" - ], - "resolved_options": { - "cwd": "/packages/dev-a", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/dev-a", - "build_recursive" - ], - "node": { - "task_display": { - "package_name": "@test/dev-a", - "task_name": "build_recursive", - "package_path": "/packages/dev-a" - }, - "resolved_config": { - "commands": [ - "vtt build recursive dev-a" - ], - "resolved_options": { - "cwd": "/packages/dev-a", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/dev-b", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/dev-b", - "task_name": "build", - "package_path": "/packages/dev-b" - }, - "resolved_config": { - "commands": [ - "vtt build dev-b" - ], - "resolved_options": { - "cwd": "/packages/dev-b", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/dev-b", - "build_recursive" - ], - "node": { - "task_display": { - "package_name": "@test/dev-b", - "task_name": "build_recursive", - "package_path": "/packages/dev-b" - }, - "resolved_config": { - "commands": [ - "vtt build recursive dev-b" - ], - "resolved_options": { - "cwd": "/packages/dev-b", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-order-app", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-order-app", - "task_name": "build", - "package_path": "/packages/nearest-order-app" - }, - "resolved_config": { - "commands": [ - "vtt build nearest-order-app" - ], - "resolved_options": { - "cwd": "/packages/nearest-order-app", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-order-direct", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-order-direct", - "task_name": "build", - "package_path": "/packages/nearest-order-direct" - }, - "resolved_config": { - "commands": [ - "vtt build nearest-order-direct" - ], - "resolved_options": { - "cwd": "/packages/nearest-order-direct", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-order-shared", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-order-shared", - "task_name": "build", - "package_path": "/packages/nearest-order-shared" - }, - "resolved_config": { - "commands": [ - "vtt build nearest-order-shared" - ], - "resolved_options": { - "cwd": "/packages/nearest-order-shared", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-order-skip", - "lint" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-order-skip", - "task_name": "lint", - "package_path": "/packages/nearest-order-skip" - }, - "resolved_config": { - "commands": [ - "vtt lint nearest-order-skip" - ], - "resolved_options": { - "cwd": "/packages/nearest-order-skip", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-stop-app", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-stop-app", - "task_name": "build", - "package_path": "/packages/nearest-stop-app" - }, - "resolved_config": { - "commands": [ - "vtt build nearest-stop-app" - ], - "resolved_options": { - "cwd": "/packages/nearest-stop-app", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-stop-bar", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-stop-bar", - "task_name": "build", - "package_path": "/packages/nearest-stop-bar" - }, - "resolved_config": { - "commands": [ - "vtt build nearest-stop-bar" - ], - "resolved_options": { - "cwd": "/packages/nearest-stop-bar", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-stop-foo", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-stop-foo", - "task_name": "build", - "package_path": "/packages/nearest-stop-foo" - }, - "resolved_config": { - "commands": [ - "vtt build nearest-stop-foo" - ], - "resolved_options": { - "cwd": "/packages/nearest-stop-foo", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-through-app", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-through-app", - "task_name": "build", - "package_path": "/packages/nearest-through-app" - }, - "resolved_config": { - "commands": [ - "vtt build nearest-through-app" - ], - "resolved_options": { - "cwd": "/packages/nearest-through-app", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "TaskConfig" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-through-bar", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-through-bar", - "task_name": "build", - "package_path": "/packages/nearest-through-bar" - }, - "resolved_config": { - "commands": [ - "vtt build nearest-through-bar" - ], - "resolved_options": { - "cwd": "/packages/nearest-through-bar", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/nearest-through-foo", - "lint" - ], - "node": { - "task_display": { - "package_name": "@test/nearest-through-foo", - "task_name": "lint", - "package_path": "/packages/nearest-through-foo" - }, - "resolved_config": { - "commands": [ - "vtt lint nearest-through-foo" - ], - "resolved_options": { - "cwd": "/packages/nearest-through-foo", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/peer-a", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/peer-a", - "task_name": "build", - "package_path": "/packages/peer-a" - }, - "resolved_config": { - "commands": [ - "vtt build peer-a" - ], - "resolved_options": { - "cwd": "/packages/peer-a", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/peer-b", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/peer-b", - "task_name": "build", - "package_path": "/packages/peer-b" - }, - "resolved_config": { - "commands": [ - "vtt build peer-b" - ], - "resolved_options": { - "cwd": "/packages/peer-b", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/prod-a", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/prod-a", - "task_name": "build", - "package_path": "/packages/prod-a" - }, - "resolved_config": { - "commands": [ - "vtt build prod-a" - ], - "resolved_options": { - "cwd": "/packages/prod-a", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/prod-b", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/prod-b", - "task_name": "build", - "package_path": "/packages/prod-b" - }, - "resolved_config": { - "commands": [ - "vtt build prod-b" - ], - "resolved_options": { - "cwd": "/packages/prod-b", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/shared", - "build" - ], - "node": { - "task_display": { - "package_name": "@test/shared", - "task_name": "build", - "package_path": "/packages/shared" - }, - "resolved_config": { - "commands": [ - "vtt build shared" - ], - "resolved_options": { - "cwd": "/packages/shared", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - }, - { - "key": [ - "/packages/shared", - "build_recursive" - ], - "node": { - "task_display": { - "package_name": "@test/shared", - "task_name": "build_recursive", - "package_path": "/packages/shared" - }, - "resolved_config": { - "commands": [ - "vtt build recursive shared" - ], - "resolved_options": { - "cwd": "/packages/shared", - "cache_config": { - "env_config": { - "fingerprinted_envs": [], - "untracked_env": [ - "" - ] - }, - "input_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - }, - "output_config": { - "includes_auto": true, - "positive_globs": [], - "negative_globs": [] - } - } - } - }, - "source": "PackageJsonScript" - }, - "neighbors": [] - } -] diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/package.json new file mode 100644 index 000000000..73b7c3ebe --- /dev/null +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/package.json @@ -0,0 +1,7 @@ +{ + "name": "@test/object-depends-on-global-graph", + "version": "1.0.0", + "workspaces": [ + "packages/*" + ] +} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/app/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/app/package.json similarity index 71% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/app/package.json rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/app/package.json index f0030c94e..04137006d 100644 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/app/package.json +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/app/package.json @@ -2,7 +2,8 @@ "name": "@test/app", "version": "1.0.0", "dependencies": { - "@test/prod-a": "workspace:*" + "@test/prod-a": "workspace:*", + "@test/prod-missing-task": "workspace:*" }, "devDependencies": { "@test/dev-a": "workspace:*" diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/app/vite-task.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/app/vite-task.json similarity index 81% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/app/vite-task.json rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/app/vite-task.json index 0b5b33c8b..05008ba16 100644 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/app/vite-task.json +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/app/vite-task.json @@ -8,10 +8,6 @@ "command": "vtt test dev", "dependsOn": [{ "task": "build", "from": "devDependencies" }] }, - "test_peer": { - "command": "vtt test peer", - "dependsOn": [{ "task": "build", "from": "peerDependencies" }] - }, "test_union": { "command": "vtt test union", "dependsOn": [{ "task": "build", "from": ["dependencies", "devDependencies"] }] diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/dev-a/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/dev-a/package.json similarity index 82% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/dev-a/package.json rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/dev-a/package.json index f262872d7..0d34156a7 100644 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/dev-a/package.json +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/dev-a/package.json @@ -5,7 +5,6 @@ "build": "vtt build dev-a" }, "devDependencies": { - "@test/dev-b": "workspace:*", "@test/shared": "workspace:*" } } diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/dev-a/vite-task.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/dev-a/vite-task.json similarity index 100% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/dev-a/vite-task.json rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/dev-a/vite-task.json diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/peer-a/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/peer-a/package.json similarity index 62% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/peer-a/package.json rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/peer-a/package.json index 5d515c477..6cd065a8c 100644 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/peer-a/package.json +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/peer-a/package.json @@ -3,8 +3,5 @@ "version": "1.0.0", "scripts": { "build": "vtt build peer-a" - }, - "peerDependencies": { - "@test/peer-b": "workspace:*" } } diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/prod-a/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/prod-a/package.json similarity index 52% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/prod-a/package.json rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/prod-a/package.json index 1a250e023..40f1f23e8 100644 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/prod-a/package.json +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/prod-a/package.json @@ -3,9 +3,5 @@ "version": "1.0.0", "scripts": { "build": "vtt build prod-a" - }, - "dependencies": { - "@test/prod-b": "workspace:*", - "@test/shared": "workspace:*" } } diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/prod-missing-task/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/prod-missing-task/package.json new file mode 100644 index 000000000..9659e3961 --- /dev/null +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/prod-missing-task/package.json @@ -0,0 +1,7 @@ +{ + "name": "@test/prod-missing-task", + "version": "1.0.0", + "scripts": { + "lint": "vtt lint prod-missing-task" + } +} diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/shared/package.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/shared/package.json similarity index 78% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/shared/package.json rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/shared/package.json index b03843ded..37434e0bc 100644 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/packages/shared/package.json +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/packages/shared/package.json @@ -2,7 +2,6 @@ "name": "@test/shared", "version": "1.0.0", "scripts": { - "build": "vtt build shared", "build_recursive": "vtt build recursive shared" } } diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/pnpm-workspace.yaml b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/pnpm-workspace.yaml similarity index 100% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/pnpm-workspace.yaml rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/pnpm-workspace.yaml diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots.toml b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots.toml new file mode 100644 index 000000000..95a1d3f12 --- /dev/null +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots.toml @@ -0,0 +1,29 @@ +[[plan]] +compact = true +name = "dependencies_from" +args = ["run", "test_dependencies"] +cwd = "packages/app" + +[[plan]] +compact = true +name = "dev_dependencies_from" +args = ["run", "test_dev"] +cwd = "packages/app" + +[[plan]] +compact = true +name = "multiple_from_fields" +args = ["run", "test_union"] +cwd = "packages/app" + +[[plan]] +compact = true +name = "recursive_through_global_task_graph" +args = ["run", "test_recursive"] +cwd = "packages/app" + +[[plan]] +compact = true +name = "ignore_depends_on_omits_object_edges" +args = ["run", "--ignore-depends-on", "test_union"] +cwd = "packages/app" diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_dependencies_from.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_dependencies_from.jsonc similarity index 100% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_dependencies_from.jsonc rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_dependencies_from.jsonc diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_dev_dependencies_from.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_dev_dependencies_from.jsonc similarity index 100% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_dev_dependencies_from.jsonc rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_dev_dependencies_from.jsonc diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_ignore_depends_on_omits_object.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_ignore_depends_on_omits_object_edges.jsonc similarity index 100% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_ignore_depends_on_omits_object.jsonc rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_ignore_depends_on_omits_object_edges.jsonc diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_multiple_from_fields.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_multiple_from_fields.jsonc similarity index 100% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_multiple_from_fields.jsonc rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_multiple_from_fields.jsonc diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_recursive_through_dependency_task.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_recursive_through_global_task_graph.jsonc similarity index 74% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_recursive_through_dependency_task.jsonc rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_recursive_through_global_task_graph.jsonc index 6ac032c0e..c24751d84 100644 --- a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/snapshots/query_recursive_through_dependency_task.jsonc +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/query_recursive_through_global_task_graph.jsonc @@ -4,9 +4,7 @@ "packages/dev-a#build_recursive" ], "packages/dev-a#build_recursive": [ - "packages/dev-b#build_recursive", "packages/shared#build_recursive" ], - "packages/dev-b#build_recursive": [], "packages/shared#build_recursive": [] } diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/task_graph.jsonc b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/task_graph.jsonc new file mode 100644 index 000000000..df4be260e --- /dev/null +++ b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/snapshots/task_graph.jsonc @@ -0,0 +1,442 @@ +// task graph +[ + { + "key": [ + "/packages/app", + "test_dependencies" + ], + "node": { + "task_display": { + "package_name": "@test/app", + "task_name": "test_dependencies", + "package_path": "/packages/app" + }, + "resolved_config": { + "commands": [ + "vtt test dependencies" + ], + "resolved_options": { + "cwd": "/packages/app", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "TaskConfig" + }, + "neighbors": [ + [ + "/packages/prod-a", + "build" + ] + ] + }, + { + "key": [ + "/packages/app", + "test_dev" + ], + "node": { + "task_display": { + "package_name": "@test/app", + "task_name": "test_dev", + "package_path": "/packages/app" + }, + "resolved_config": { + "commands": [ + "vtt test dev" + ], + "resolved_options": { + "cwd": "/packages/app", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "TaskConfig" + }, + "neighbors": [ + [ + "/packages/dev-a", + "build" + ] + ] + }, + { + "key": [ + "/packages/app", + "test_recursive" + ], + "node": { + "task_display": { + "package_name": "@test/app", + "task_name": "test_recursive", + "package_path": "/packages/app" + }, + "resolved_config": { + "commands": [ + "vtt test recursive" + ], + "resolved_options": { + "cwd": "/packages/app", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "TaskConfig" + }, + "neighbors": [ + [ + "/packages/dev-a", + "build_recursive" + ] + ] + }, + { + "key": [ + "/packages/app", + "test_union" + ], + "node": { + "task_display": { + "package_name": "@test/app", + "task_name": "test_union", + "package_path": "/packages/app" + }, + "resolved_config": { + "commands": [ + "vtt test union" + ], + "resolved_options": { + "cwd": "/packages/app", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "TaskConfig" + }, + "neighbors": [ + [ + "/packages/dev-a", + "build" + ], + [ + "/packages/prod-a", + "build" + ] + ] + }, + { + "key": [ + "/packages/dev-a", + "build" + ], + "node": { + "task_display": { + "package_name": "@test/dev-a", + "task_name": "build", + "package_path": "/packages/dev-a" + }, + "resolved_config": { + "commands": [ + "vtt build dev-a" + ], + "resolved_options": { + "cwd": "/packages/dev-a", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "PackageJsonScript" + }, + "neighbors": [] + }, + { + "key": [ + "/packages/dev-a", + "build_recursive" + ], + "node": { + "task_display": { + "package_name": "@test/dev-a", + "task_name": "build_recursive", + "package_path": "/packages/dev-a" + }, + "resolved_config": { + "commands": [ + "vtt build recursive dev-a" + ], + "resolved_options": { + "cwd": "/packages/dev-a", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "TaskConfig" + }, + "neighbors": [ + [ + "/packages/shared", + "build_recursive" + ] + ] + }, + { + "key": [ + "/packages/peer-a", + "build" + ], + "node": { + "task_display": { + "package_name": "@test/peer-a", + "task_name": "build", + "package_path": "/packages/peer-a" + }, + "resolved_config": { + "commands": [ + "vtt build peer-a" + ], + "resolved_options": { + "cwd": "/packages/peer-a", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "PackageJsonScript" + }, + "neighbors": [] + }, + { + "key": [ + "/packages/prod-a", + "build" + ], + "node": { + "task_display": { + "package_name": "@test/prod-a", + "task_name": "build", + "package_path": "/packages/prod-a" + }, + "resolved_config": { + "commands": [ + "vtt build prod-a" + ], + "resolved_options": { + "cwd": "/packages/prod-a", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "PackageJsonScript" + }, + "neighbors": [] + }, + { + "key": [ + "/packages/prod-missing-task", + "lint" + ], + "node": { + "task_display": { + "package_name": "@test/prod-missing-task", + "task_name": "lint", + "package_path": "/packages/prod-missing-task" + }, + "resolved_config": { + "commands": [ + "vtt lint prod-missing-task" + ], + "resolved_options": { + "cwd": "/packages/prod-missing-task", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "PackageJsonScript" + }, + "neighbors": [] + }, + { + "key": [ + "/packages/shared", + "build_recursive" + ], + "node": { + "task_display": { + "package_name": "@test/shared", + "task_name": "build_recursive", + "package_path": "/packages/shared" + }, + "resolved_config": { + "commands": [ + "vtt build recursive shared" + ], + "resolved_options": { + "cwd": "/packages/shared", + "cache_config": { + "env_config": { + "fingerprinted_envs": [], + "untracked_env": [ + "" + ] + }, + "input_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + }, + "output_config": { + "includes_auto": true, + "positive_globs": [], + "negative_globs": [] + } + } + } + }, + "source": "PackageJsonScript" + }, + "neighbors": [] + } +] diff --git a/crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/vite-task.json b/crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/vite-task.json similarity index 100% rename from crates/vite_task_plan/tests/plan_snapshots/fixtures/depends_on_package_dependencies/vite-task.json rename to crates/vite_task_plan/tests/plan_snapshots/fixtures/object_depends_on_global_graph/vite-task.json diff --git a/docs/rfcs/depends-on-package-dependencies.md b/docs/rfcs/depends-on-package-dependencies.md deleted file mode 100644 index 1340e4ecf..000000000 --- a/docs/rfcs/depends-on-package-dependencies.md +++ /dev/null @@ -1,146 +0,0 @@ -# RFC: `dependsOn` Package Dependency Selection - -## Summary - -Add an object form for `dependsOn` that runs a task in direct workspace dependency packages without using special-character task syntax. - -```ts -type DependencyType = 'dependencies' | 'devDependencies' | 'peerDependencies'; - -type DependsOnEntry = - | string - | { - task: string; - from: DependencyType | DependencyType[]; - }; -``` - -String entries keep their current behavior: - -```jsonc -{ - "dependsOn": ["build"], -} -``` - -Object entries select direct dependency packages from `package.json` fields: - -```jsonc -{ - "dependsOn": [{ "task": "build", "from": "dependencies" }], -} -``` - -## Motivation - -This is feature parity with Turborepo and Nx. - -Both tools have a common way to say: before running this task, run a task with the same or chosen name in dependency packages. That pattern is used for builds, type generation, tests that need built libraries, and other upstream artifact pipelines. - -Without it, migrating a repo from Turbo or Nx requires replacing a common task pipeline feature with manual package-specific `dependsOn` entries. That is noisy and easy to get wrong. For many repos, this is essential migration coverage. - -The proposed form keeps the behavior explicit while avoiding special characters like `^` in task config. - -## Comparison - -| Case | Turborepo | Nx | This proposal | -| ---------------------------------------------------------- | ------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------- | -| Run `build` in direct dependency packages before this task | `"^build"` | `"^build"` or `{ "dependencies": true, "target": "build" }` | `{ "task": "build", "from": "dependencies" }` | -| Dependency field selection | Not expressed in `^build` | Not expressed in `^build` / `dependencies: true` | `from`: `dependencies`, `devDependencies`, `peerDependencies` | - -## Semantics - -An object entry runs a task in direct dependency packages of the package that declares the source task. - -For: - -```jsonc -{ - "tasks": { - "test": { - "command": "vitest run", - "dependsOn": [{ "task": "build", "from": "dependencies" }], - }, - }, -} -``` - -running `app#test` means: - -1. Start at package `app`. -2. Select its direct workspace dependencies declared in `dependencies`. -3. In each selected package, run `build` if that package has a `build` task. - -The source package itself is not selected by the object entry. - -Package dependencies: - -```mermaid -flowchart LR - appPkg["@app"] --> uiPkg["@ui"] - appPkg --> utilsPkg["@utils"] - uiPkg --> tokensPkg["@tokens"] -``` - -Task dependencies: - -```mermaid -flowchart LR - appTask["app#test
{ task: build, from: dependencies }"] --> uiTask["ui#build"] - appTask --> utilsTask["utils#build"] -``` - -In this example: - -- `app#test` depends on `ui#build`. -- `app#test` depends on `utils#build`. -- `tokens#build` is not selected by this entry because `@tokens` is not a direct dependency of `@app`. -- `app#test` does not imply `app#build`; same-package dependencies use string form. - -## Not Recursive - -An object entry is not recursive. It selects only direct dependency packages. - -In the graph above, `tokens#build` is not selected by `app#test` because `@tokens` is a dependency of `@ui`, not `@app`. - -If `ui#build` declares its own `{ "task": "build", "from": "dependencies" }`, then `tokens#build` can be selected from `ui#build`. That is a separate dependency declaration, not recursion from `app#test`. - -Package dependencies: - -```mermaid -flowchart LR - appPkg["@app"] --> uiPkg["@ui"] - uiPkg --> tokensPkg["@tokens"] -``` - -Task dependencies: - -```mermaid -flowchart LR - appTask["app#test"] --> uiTask["ui#build
{ task: build, from: dependencies }"] - uiTask --> tokensTask["tokens#build"] -``` - -## `from` - -`from` names the package.json dependency fields used to select direct dependency packages. - -```jsonc -{ "task": "build", "from": "dependencies" } -``` - -This selects direct dependencies from `dependencies`. - -```jsonc -{ "task": "build", "from": ["dependencies", "devDependencies"] } -``` - -This selects the union of direct dependencies from `dependencies` and `devDependencies`. - -Supported values are: - -- `dependencies` -- `devDependencies` -- `peerDependencies` - -If the same direct dependency package is selected through more than one allowed field, it is included once.