From 9de60540a52bffee377b6635ac975604166dbd9d Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sun, 7 Sep 2025 15:38:19 -0700 Subject: [PATCH 01/12] build: Prepare v1.41 release. --- .yarn/versions/f9e7200f.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .yarn/versions/f9e7200f.yml diff --git a/.yarn/versions/f9e7200f.yml b/.yarn/versions/f9e7200f.yml new file mode 100644 index 00000000000..28fac241db0 --- /dev/null +++ b/.yarn/versions/f9e7200f.yml @@ -0,0 +1,9 @@ +releases: + "@moonrepo/cli": minor + "@moonrepo/core-linux-arm64-gnu": minor + "@moonrepo/core-linux-arm64-musl": minor + "@moonrepo/core-linux-x64-gnu": minor + "@moonrepo/core-linux-x64-musl": minor + "@moonrepo/core-macos-arm64": minor + "@moonrepo/core-macos-x64": minor + "@moonrepo/core-windows-x64-msvc": minor From 2dd8c280ef5e11b31947fbe5416e2e8049aab62a Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Thu, 18 Sep 2025 21:55:16 -0700 Subject: [PATCH 02/12] deps(proto): Update to v0.53. (#2119) * Update proto. * Update version. * Fix plugins. --- .github/workflows/rust.yml | 2 +- CHANGELOG.md | 6 + Cargo.lock | 179 ++++++++++++------ Cargo.toml | 12 +- .../tests/action_graph_builder_test.rs | 2 +- crates/config/src/toolchain/proto_config.rs | 2 +- crates/pdk-test-utils/src/sandbox.rs | 8 +- crates/plugin/src/plugin_registry.rs | 3 +- .../src/toolchain_registry.rs | 8 +- legacy/core/tool/src/lib.rs | 5 +- wasm/Cargo.lock | 47 +++-- wasm/tc-tier2/src/lib.rs | 8 +- 12 files changed, 194 insertions(+), 88 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 697b714127e..d51a727f608 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -111,7 +111,7 @@ jobs: with: auto-install: true cache: true - proto-version: '0.52.3' # Keep in sync + proto-version: '0.53.0' # Keep in sync - uses: mozilla-actions/sccache-action@v0.0.7 if: ${{ vars.ENABLE_SCCACHE == 'true' }} # Fixes issues where proto can't find a version because nothing is pinned globally diff --git a/CHANGELOG.md b/CHANGELOG.md index f80efc93bad..a7c67cc5313 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +#### ⚙️ Internal + +- Updated proto to [v0.53.0](https://github.com/moonrepo/proto/releases/tag/v0.53.0) (from 0.52.3). + ## 1.40.5 #### 🧰 Toolchains diff --git a/Cargo.lock b/Cargo.lock index 5c727c724a2..8af0d9796a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1388,6 +1388,21 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.5.0" @@ -3038,9 +3053,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.43.1" +version = "1.43.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "154934ea70c58054b556dd430b99a98c2a7ff5309ac9891597e339b5c28f4371" +checksum = "46fdb647ebde000f43b5b53f773c30cf9b0cb4300453208713fa38b2c70935a0" dependencies = [ "console", "once_cell", @@ -3488,6 +3503,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "lzma-rust2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c60a23ffb90d527e23192f1246b14746e2f7f071cb84476dd879071696c18a4a" +dependencies = [ + "crc", + "sha2", +] + [[package]] name = "mac-notification-sys" version = "0.6.6" @@ -3740,7 +3765,7 @@ dependencies = [ "moon_common", "moon_target", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", "serde", "tokio", ] @@ -3844,7 +3869,7 @@ dependencies = [ "moon_workspace_graph", "proto_core", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", "serde", "serial_test", "starbase_sandbox", @@ -4068,7 +4093,7 @@ dependencies = [ "moon_utils", "proto_core", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", "starbase_utils", "tracing", ] @@ -4334,7 +4359,7 @@ version = "0.0.1" dependencies = [ "regex", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", ] [[package]] @@ -4518,7 +4543,7 @@ dependencies = [ "moon_utils", "proto_core", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", "starbase_styles", "starbase_utils", "tracing", @@ -4624,7 +4649,7 @@ dependencies = [ "moon_workspace_graph", "proto_core", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", "serde", "serde_json", "starbase_sandbox", @@ -4732,7 +4757,7 @@ dependencies = [ "moon_workspace", "petgraph 0.8.2", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", "starbase_events", "starbase_sandbox", "starbase_utils", @@ -4842,7 +4867,7 @@ dependencies = [ "moon_task", "reqwest", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", "serde", "sha2", "starbase_utils", @@ -5251,7 +5276,7 @@ dependencies = [ "moon_process", "regex", "rustc-hash 2.1.1", - "scc", + "scc 2.4.0", "semver", "serde", "starbase_sandbox", @@ -5320,7 +5345,7 @@ dependencies = [ "moon_project_graph", "moon_query", "moon_task_graph", - "scc", + "scc 2.4.0", "tracing", ] @@ -6253,9 +6278,9 @@ dependencies = [ [[package]] name = "proto_core" -version = "0.52.3" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3f94dff02246a984848c5d671d4f43db785b381134df620ebf69def0576762" +checksum = "d82bbb6f0c34f5c50bf4aadf4e56dfc80eef677dada995a4629af305dd075fcc" dependencies = [ "convert_case", "docker_credential", @@ -6271,7 +6296,7 @@ dependencies = [ "regex", "reqwest", "rustc-hash 2.1.1", - "scc", + "scc 3.0.7", "schematic", "semver", "serde", @@ -6285,7 +6310,7 @@ dependencies = [ "system_env", "thiserror 2.0.16", "tokio", - "toml_edit 0.23.4", + "toml_edit 0.23.6", "tracing", "url", "uuid", @@ -6295,9 +6320,9 @@ dependencies = [ [[package]] name = "proto_pdk_api" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97564499279742db5d7155b907c00aabd33a39918537b2c269dcb382b632cb1f" +checksum = "eb0a9ea7d5b542ab4681dd3371aff619b247d96a417e27f7a432330200cbd60e" dependencies = [ "derive_setters", "rustc-hash 2.1.1", @@ -6313,9 +6338,9 @@ dependencies = [ [[package]] name = "proto_pdk_test_utils" -version = "0.40.1" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb32a7427ddf3775e1862fd783ebeb2287cce9477bf3878414ade1068f8ed56" +checksum = "a2fcaff220b9147fd8aba4487440b0034f2b2c85ff0c5a1119e27c4f9693e6d0" dependencies = [ "extism", "proto_core", @@ -6328,12 +6353,12 @@ dependencies = [ [[package]] name = "proto_shim" -version = "0.7.7" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7b4b89b83df5cbf538397fef793798e8d4836213fde7e84df5b6a1309a9afa0" +checksum = "59efd69e462e500cd7cb78c896ee37d2f8193f50f4e6bd9c425e6bfe31a00a57" dependencies = [ "dirs 6.0.0", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -6977,6 +7002,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "saa" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "293e425dca7c7889a87de14ff29a4112f18a155119295671cd7fb8c70015a1c5" + [[package]] name = "same-file" version = "1.0.6" @@ -6992,10 +7023,20 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" dependencies = [ - "sdd", + "sdd 3.0.10", "serde", ] +[[package]] +name = "scc" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0c0b27fa9a31fc2bad3b9ce122188c9df8158bdcbc3c73e3c0bc38aa69c61e" +dependencies = [ + "saa", + "sdd 4.0.1", +] + [[package]] name = "schannel" version = "0.1.27" @@ -7085,6 +7126,12 @@ version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" +[[package]] +name = "sdd" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d51b068a416b603c6b3aaeeba43feb2924ee80739c543482f931328dfc71cdb" + [[package]] name = "security-framework" version = "2.11.1" @@ -7270,7 +7317,7 @@ dependencies = [ "log", "once_cell", "parking_lot", - "scc", + "scc 2.4.0", "serial_test_derive", ] @@ -7524,9 +7571,9 @@ dependencies = [ [[package]] name = "starbase_archive" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b48445ac90aeb555ba22c72bc263447d5f4ef038adf1a0e17864fc2e170e72" +checksum = "515ff796b6fadd3ac2cae2fb41cfbd5af57156bd66507a11ebe7645313b250df" dependencies = [ "binstall-tar", "bzip2", @@ -7570,6 +7617,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "starbase_id" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9f27cc7833ad979e799c1954ec0b473c37f98103e0b84a7047649acf9c246b" +dependencies = [ + "compact_str 0.9.0", + "schematic", + "serde", +] + [[package]] name = "starbase_macros" version = "0.8.6" @@ -7584,13 +7642,12 @@ dependencies = [ [[package]] name = "starbase_sandbox" -version = "0.9.7" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3095bd96bf12199d06ad15ca2cb495134a63adc7c0057b5a4be9a43256434b76" +checksum = "54d385bce0fc50872188a339fc71b6b993ddfacbe13c597b55e3a508924997a0" dependencies = [ "assert_cmd", "assert_fs", - "clean-path", "insta", "predicates", "pretty_assertions", @@ -7626,9 +7683,9 @@ dependencies = [ [[package]] name = "starbase_utils" -version = "0.11.16" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b1617ed04ea233b631026d45d9daefe2d19b42f5a0029b46528abe0a8285ca" +checksum = "4c3138017c8bc9a262b792f1c264106305a580e6d9252d702ca41c4898973e87" dependencies = [ "async-trait", "dirs 6.0.0", @@ -7638,7 +7695,7 @@ dependencies = [ "miette 7.6.0", "regex", "reqwest", - "scc", + "scc 3.0.7", "serde", "serde_json", "serde_yml", @@ -8182,7 +8239,7 @@ dependencies = [ "indexmap", "serde", "serde_spanned 1.0.0", - "toml_datetime 0.7.0", + "toml_datetime 0.7.2", "toml_parser", "toml_writer", "winnow", @@ -8199,11 +8256,11 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -8222,12 +8279,12 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.4" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7211ff1b8f0d3adae1663b7da9ffe396eabe1ca25f0b0bee42b0da29a9ddce93" +checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" dependencies = [ "indexmap", - "toml_datetime 0.7.0", + "toml_datetime 0.7.2", "toml_parser", "toml_writer", "winnow", @@ -8235,9 +8292,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" dependencies = [ "winnow", ] @@ -8250,9 +8307,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" +checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" [[package]] name = "tonic" @@ -8584,9 +8641,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.1.0" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00432f493971db5d8e47a65aeb3b02f8226b9b11f1450ff86bb772776ebadd70" +checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" dependencies = [ "base64 0.22.1", "flate2", @@ -8744,9 +8801,9 @@ dependencies = [ [[package]] name = "warpgate" -version = "0.27.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3bc484f7f12edba700e6d54a85946790404a414b047a78bb29d39a5c4e539c" +checksum = "94b3946e485723b46b340115d01dc3984a780b48cce8aa72db3c0144b4c1b070" dependencies = [ "async-trait", "compact_str 0.9.0", @@ -8760,7 +8817,7 @@ dependencies = [ "reqwest", "reqwest-middleware", "reqwest-netrc", - "scc", + "scc 3.0.7", "schematic", "serde", "serde_json", @@ -8779,9 +8836,9 @@ dependencies = [ [[package]] name = "warpgate_api" -version = "0.16.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7dc7cb7b0f0b6c0cc33d681926479985d50d107f9e86301b6e23e346d32960" +checksum = "b79eaaa2ec9a58222d38d1e25d7e26f5fda5a8eb77b2a90af2634ebcd1850ffa" dependencies = [ "anyhow", "derive_setters", @@ -8789,15 +8846,16 @@ dependencies = [ "schematic", "serde", "serde_json", + "starbase_id", "system_env", "thiserror 2.0.16", ] [[package]] name = "warpgate_pdk" -version = "0.15.4" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa835d089e798a505e6ec748aca5671d0180f7246fb8fa1b27f74c9d2aa5c58" +checksum = "54cffe7a80f60e8346573b034455c669586a3d26053ee9bdbee1a36a89e2c1f0" dependencies = [ "extism-pdk", "serde", @@ -9656,6 +9714,15 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -10129,16 +10196,16 @@ dependencies = [ [[package]] name = "zip" -version = "4.6.1" +version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" +checksum = "2f852905151ac8d4d06fdca66520a661c09730a74c6d4e2b0f27b436b382e532" dependencies = [ "arbitrary", "bzip2", "crc32fast", "flate2", "indexmap", - "liblzma", + "lzma-rust2", "memchr", "zopfli", "zstd", diff --git a/Cargo.toml b/Cargo.toml index f72ee44704b..09c7deb7a44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,14 +99,14 @@ uuid = { version = "1.18.1", features = ["v4"] } # proto/plugin related extism = "=1.12.0" extism-pdk = "1.4.1" -proto_core = "0.52.3" -proto_pdk_api = "0.30.0" -proto_pdk_test_utils = "0.40.1" +proto_core = "0.53.0" +proto_pdk_api = "0.31.0" +proto_pdk_test_utils = "0.41.0" system_env = "0.8.3" version_spec = "0.9.5" -warpgate = "0.27.2" -warpgate_api = "0.16.2" -warpgate_pdk = "0.15.4" +warpgate = "0.28.0" +warpgate_api = "0.17.0" +warpgate_pdk = "0.16.0" # proto_core = { path = "../proto/crates/core" } # system_env = { path = "../proto/crates/system-env" } diff --git a/crates/action-graph/tests/action_graph_builder_test.rs b/crates/action-graph/tests/action_graph_builder_test.rs index 68330bcd59f..ea42dbf80bd 100644 --- a/crates/action-graph/tests/action_graph_builder_test.rs +++ b/crates/action-graph/tests/action_graph_builder_test.rs @@ -25,7 +25,7 @@ fn create_task(project: &str, id: &str) -> Task { } fn create_proto_version() -> VersionSpec { - VersionSpec::parse("0.52.3").unwrap() + VersionSpec::parse("0.53.0").unwrap() } fn create_unresolved_version(version: Version) -> UnresolvedVersionSpec { diff --git a/crates/config/src/toolchain/proto_config.rs b/crates/config/src/toolchain/proto_config.rs index 2058b473fd7..4f9543654f8 100644 --- a/crates/config/src/toolchain/proto_config.rs +++ b/crates/config/src/toolchain/proto_config.rs @@ -3,7 +3,7 @@ use schematic::{Config, DefaultValueResult}; use version_spec::VersionSpec; fn default_version(_: &()) -> DefaultValueResult { - Ok(VersionSpec::parse("0.52.3").ok()) + Ok(VersionSpec::parse("0.53.0").ok()) } config_struct!( diff --git a/crates/pdk-test-utils/src/sandbox.rs b/crates/pdk-test-utils/src/sandbox.rs index 66a0b68790c..80db65da4b7 100644 --- a/crates/pdk-test-utils/src/sandbox.rs +++ b/crates/pdk-test-utils/src/sandbox.rs @@ -73,7 +73,7 @@ impl MoonWasmSandbox { id: &str, mut op: impl FnMut(&mut ConfigBuilder), ) -> ExtensionTestWrapper { - let id = Id::new(id).unwrap(); + let id = Id::raw(id); // Create manifest let mut manifest = PluginManifest::new([Wasm::file(self.wasm_file.clone())]); @@ -114,7 +114,7 @@ impl MoonWasmSandbox { id: &str, mut op: impl FnMut(&mut ConfigBuilder), ) -> ToolchainTestWrapper { - let id = Id::new(id).unwrap(); + let id = Id::raw(id); // Create manifest let mut manifest = PluginManifest::new([Wasm::file(self.wasm_file.clone())]); @@ -188,7 +188,9 @@ impl MoonWasmSandbox { inject_default_manifest_config(&id, &self.home_dir, &mut manifest).unwrap(); if with_proto { - inject_proto_manifest_config(&id, &self.proto, &mut manifest).unwrap(); + let context = ToolContext::new(id.clone()); + + inject_proto_manifest_config(&context, &self.proto, &mut manifest).unwrap(); } PluginContainer::new(id, manifest, self.create_host_funcs(virtual_paths)).unwrap() diff --git a/crates/plugin/src/plugin_registry.rs b/crates/plugin/src/plugin_registry.rs index 78be608bf6b..0edd9c9268b 100644 --- a/crates/plugin/src/plugin_registry.rs +++ b/crates/plugin/src/plugin_registry.rs @@ -179,8 +179,7 @@ impl PluginRegistry { // expect a specific ID, for example "rust", and if we provide // "unstable_rust", it breaks in weird ways. let orig_id = entry.key().as_str(); - let stable_id = - PluginId::new(orig_id.strip_prefix("unstable_").unwrap_or(orig_id))?; + let stable_id = PluginId::raw(orig_id.strip_prefix("unstable_").unwrap_or(orig_id)); // Combine everything into the container and register let plugin = T::new(PluginRegistration { diff --git a/crates/toolchain-plugin/src/toolchain_registry.rs b/crates/toolchain-plugin/src/toolchain_registry.rs index c49846d9cb6..c84e3a2cc80 100644 --- a/crates/toolchain-plugin/src/toolchain_registry.rs +++ b/crates/toolchain-plugin/src/toolchain_registry.rs @@ -7,7 +7,7 @@ use moon_pdk_api::Operation; use moon_plugin::{ MoonHostData, PluginError, PluginId, PluginRegistry, PluginType, serialize_config, }; -use proto_core::inject_proto_manifest_config; +use proto_core::{ToolContext, inject_proto_manifest_config}; use rustc_hash::FxHashMap; use starbase_utils::json::{self, JsonValue}; use std::future::Future; @@ -156,7 +156,11 @@ impl ToolchainRegistry { .config .insert("moon_toolchain_config".to_owned(), value); - inject_proto_manifest_config(&id, ®istry.host_data.proto_env, manifest)?; + inject_proto_manifest_config( + &ToolContext::new(id.clone()), + ®istry.host_data.proto_env, + manifest, + )?; Ok(()) }) diff --git a/legacy/core/tool/src/lib.rs b/legacy/core/tool/src/lib.rs index d34b43a62f9..5b3a4101eae 100644 --- a/legacy/core/tool/src/lib.rs +++ b/legacy/core/tool/src/lib.rs @@ -101,15 +101,16 @@ pub async fn load_tool_plugin( proto: &ProtoEnvironment, locator: &PluginLocator, ) -> miette::Result { + let context = ToolContext::new(id.to_owned()); let mut manifest = ProtoTool::create_plugin_manifest( proto, Wasm::file(proto.get_plugin_loader()?.load_plugin(id, locator).await?), )?; inject_default_manifest_config(id, &proto.home_dir, &mut manifest)?; - inject_proto_manifest_config(id, proto, &mut manifest)?; + inject_proto_manifest_config(&context, proto, &mut manifest)?; - Ok(ProtoTool::load_from_manifest(ToolContext::new(id.to_owned()), proto, manifest).await?) + Ok(ProtoTool::load_from_manifest(context, proto, manifest).await?) } static LOCKS: OnceLock>>>> = OnceLock::new(); diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 816c1719a3f..bbfa2d40d79 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -1016,9 +1016,9 @@ dependencies = [ [[package]] name = "proto_pdk_api" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97564499279742db5d7155b907c00aabd33a39918537b2c269dcb382b632cb1f" +checksum = "eb0a9ea7d5b542ab4681dd3371aff619b247d96a417e27f7a432330200cbd60e" dependencies = [ "derive_setters", "rustc-hash", @@ -1249,27 +1249,38 @@ checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.219" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.225" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" dependencies = [ "proc-macro2", "quote", @@ -1332,6 +1343,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "starbase_id" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9f27cc7833ad979e799c1954ec0b473c37f98103e0b84a7047649acf9c246b" +dependencies = [ + "compact_str 0.9.0", + "schematic", + "serde", +] + [[package]] name = "starbase_styles" version = "0.6.3" @@ -1676,9 +1698,9 @@ dependencies = [ [[package]] name = "warpgate_api" -version = "0.16.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7dc7cb7b0f0b6c0cc33d681926479985d50d107f9e86301b6e23e346d32960" +checksum = "b79eaaa2ec9a58222d38d1e25d7e26f5fda5a8eb77b2a90af2634ebcd1850ffa" dependencies = [ "anyhow", "derive_setters", @@ -1686,15 +1708,16 @@ dependencies = [ "schematic", "serde", "serde_json", + "starbase_id", "system_env", "thiserror 2.0.16", ] [[package]] name = "warpgate_pdk" -version = "0.15.4" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa835d089e798a505e6ec748aca5671d0180f7246fb8fa1b27f74c9d2aa5c58" +checksum = "54cffe7a80f60e8346573b034455c669586a3d26053ee9bdbee1a36a89e2c1f0" dependencies = [ "extism-pdk", "serde", diff --git a/wasm/tc-tier2/src/lib.rs b/wasm/tc-tier2/src/lib.rs index 6ced0c47a16..a0ed90d40a5 100644 --- a/wasm/tc-tier2/src/lib.rs +++ b/wasm/tc-tier2/src/lib.rs @@ -83,7 +83,9 @@ pub fn extend_task_command( output.args = Some(Extend::Replace(vec!["new".into(), "arg".into()])); } "env" => { - output.env.insert("EXTENDED_VAR".into(), get_plugin_id()?); + output + .env + .insert("EXTENDED_VAR".into(), get_plugin_id()?.to_string()); } "env-remove" => { output.env_remove.push("REMOVE_VAR".into()); @@ -105,7 +107,9 @@ pub fn extend_task_script( match input.task.target.task_id.as_str() { "env" => { - output.env.insert("EXTENDED_VAR".into(), get_plugin_id()?); + output + .env + .insert("EXTENDED_VAR".into(), get_plugin_id()?.to_string()); } "env-remove" => { output.env_remove.push("REMOVE_VAR".into()); From aaf3e430c98fa2036ca78d827c9961938ea63c8c Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sun, 21 Sep 2025 15:06:16 -0700 Subject: [PATCH 03/12] internal: Standardize ID on proto/starbase implementation. (#2125) * Pull in starbase. * Update errors. * Remove plugin id. * Fix tests. * Update pdk. * Update types. * Bump. --- .yarn/versions/f9e7200f.yml | 22 +- Cargo.lock | 49 +++-- Cargo.toml | 13 +- crates/app/src/app_error.rs | 4 +- crates/app/src/commands/ext.rs | 9 +- crates/codegen/src/codegen.rs | 6 +- crates/codegen/src/codegen_error.rs | 8 +- crates/codegen/tests/codegen_test.rs | 8 +- crates/common/Cargo.toml | 2 +- crates/common/src/id.rs | 199 ++---------------- crates/config-schema/src/typescript_types.rs | 26 ++- crates/config/src/project/overrides_config.rs | 2 +- crates/config/src/toolchain_config.rs | 2 +- crates/config/tests/input_shape_test.rs | 6 +- crates/config/tests/project_config_test.rs | 2 +- crates/config/tests/workspace_config_test.rs | 2 +- .../extension-plugin/src/extension_plugin.rs | 7 +- .../src/extension_registry.rs | 15 +- crates/file-group/src/file_group.rs | 4 +- crates/file-group/src/file_group_error.rs | 6 +- crates/pdk-api/src/common.rs | 9 +- crates/pdk-api/src/context.rs | 23 +- crates/pdk-api/src/extension.rs | 3 +- crates/pdk-api/src/toolchain/tier1.rs | 3 +- crates/pdk-test-utils/src/sandbox.rs | 10 +- crates/plugin/src/lib.rs | 4 +- crates/plugin/src/plugin_registry.rs | 25 +-- crates/plugin/tests/plugin_registry_test.rs | 4 +- crates/project-builder/src/project_builder.rs | 3 +- crates/project-constraints/src/lib.rs | 20 +- crates/project-graph/src/project_graph.rs | 2 +- .../project-graph/src/project_graph_error.rs | 4 +- crates/target/src/target.rs | 4 +- crates/task-builder/src/tasks_builder.rs | 4 +- .../task-builder/src/tasks_builder_error.rs | 7 +- crates/task-graph/src/task_graph_error.rs | 4 +- crates/test-utils/src/workspace_mocker.rs | 2 +- .../toolchain-plugin/src/toolchain_plugin.rs | 7 +- .../src/toolchain_registry.rs | 29 ++- crates/toolchain/src/lib.rs | 2 +- crates/workspace-graph/src/query_projects.rs | 4 +- crates/workspace/src/projects_locator.rs | 20 +- crates/workspace/src/workspace_builder.rs | 22 +- .../workspace/src/workspace_builder_error.rs | 8 +- packages/types/src/common.ts | 4 +- packages/types/src/pipeline.ts | 16 +- packages/types/src/project-config.ts | 57 ++--- packages/types/src/project.ts | 15 +- packages/types/src/tasks-config.ts | 22 +- packages/types/src/template-config.ts | 10 +- packages/types/src/toolchain-config.ts | 6 +- packages/types/src/workspace-config.ts | 22 +- wasm/Cargo.lock | 43 ++-- wasm/tc-tier1/src/lib.rs | 6 +- website/static/schemas/project.json | 51 +++-- website/static/schemas/tasks.json | 17 +- website/static/schemas/template.json | 9 +- website/static/schemas/toolchain.json | 5 +- website/static/schemas/workspace.json | 15 +- 59 files changed, 400 insertions(+), 513 deletions(-) diff --git a/.yarn/versions/f9e7200f.yml b/.yarn/versions/f9e7200f.yml index 28fac241db0..774e738fa78 100644 --- a/.yarn/versions/f9e7200f.yml +++ b/.yarn/versions/f9e7200f.yml @@ -1,9 +1,15 @@ releases: - "@moonrepo/cli": minor - "@moonrepo/core-linux-arm64-gnu": minor - "@moonrepo/core-linux-arm64-musl": minor - "@moonrepo/core-linux-x64-gnu": minor - "@moonrepo/core-linux-x64-musl": minor - "@moonrepo/core-macos-arm64": minor - "@moonrepo/core-macos-x64": minor - "@moonrepo/core-windows-x64-msvc": minor + '@moonrepo/cli': minor + '@moonrepo/core-linux-arm64-gnu': minor + '@moonrepo/core-linux-arm64-musl': minor + '@moonrepo/core-linux-x64-gnu': minor + '@moonrepo/core-linux-x64-musl': minor + '@moonrepo/core-macos-arm64': minor + '@moonrepo/core-macos-x64': minor + '@moonrepo/core-windows-x64-msvc': minor + '@moonrepo/types': minor + +declined: + - '@moonrepo/report' + - '@moonrepo/runtime' + - website diff --git a/Cargo.lock b/Cargo.lock index 8af0d9796a7..aad38bd0f86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1799,7 +1799,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -4206,7 +4206,6 @@ dependencies = [ name = "moon_common" version = "0.1.4" dependencies = [ - "compact_str 0.9.0", "dirs 6.0.0", "miette 7.6.0", "regex", @@ -4214,6 +4213,7 @@ dependencies = [ "rustc-hash 2.1.1", "schematic", "serde", + "starbase_id", "starbase_styles", "thiserror 2.0.16", ] @@ -6278,9 +6278,9 @@ dependencies = [ [[package]] name = "proto_core" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82bbb6f0c34f5c50bf4aadf4e56dfc80eef677dada995a4629af305dd075fcc" +checksum = "18693091ef2e40cf4f3322dc175d2a5b779705ac30ae42b1f8e8559dbb5cd310" dependencies = [ "convert_case", "docker_credential", @@ -6320,9 +6320,9 @@ dependencies = [ [[package]] name = "proto_pdk_api" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb0a9ea7d5b542ab4681dd3371aff619b247d96a417e27f7a432330200cbd60e" +checksum = "af545a208b69b44dbd66e927836461e3dc2e0ee103bf1805b4723e279e7604ad" dependencies = [ "derive_setters", "rustc-hash 2.1.1", @@ -6338,9 +6338,9 @@ dependencies = [ [[package]] name = "proto_pdk_test_utils" -version = "0.41.0" +version = "0.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fcaff220b9147fd8aba4487440b0034f2b2c85ff0c5a1119e27c4f9693e6d0" +checksum = "e0176ac903180338d93cbf36918f018f0af7c1e6a87efd80abc2cbfd6c9ded2a" dependencies = [ "extism", "proto_core", @@ -7180,9 +7180,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.225" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" dependencies = [ "serde_core", "serde_derive", @@ -7199,18 +7199,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.225" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.225" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", @@ -7619,13 +7619,16 @@ dependencies = [ [[package]] name = "starbase_id" -version = "0.1.2" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9f27cc7833ad979e799c1954ec0b473c37f98103e0b84a7047649acf9c246b" +checksum = "5f6253f638f8eef738ee1edd63570444ebec71cd50286b0271ca8c8593bd7f29" dependencies = [ "compact_str 0.9.0", + "miette 7.6.0", + "regex", "schematic", "serde", + "thiserror 2.0.16", ] [[package]] @@ -8801,9 +8804,9 @@ dependencies = [ [[package]] name = "warpgate" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b3946e485723b46b340115d01dc3984a780b48cce8aa72db3c0144b4c1b070" +checksum = "d37269a01855b558b2dfe3da7bc73f4003467eba2fcf4a798a2ec933af1d39a3" dependencies = [ "async-trait", "compact_str 0.9.0", @@ -8836,9 +8839,9 @@ dependencies = [ [[package]] name = "warpgate_api" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79eaaa2ec9a58222d38d1e25d7e26f5fda5a8eb77b2a90af2634ebcd1850ffa" +checksum = "570fd77685c82ecfdae8b59f78b9ef8f3a7f9a6d5dec28408ed052b7b503a8e1" dependencies = [ "anyhow", "derive_setters", @@ -8853,9 +8856,9 @@ dependencies = [ [[package]] name = "warpgate_pdk" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cffe7a80f60e8346573b034455c669586a3d26053ee9bdbee1a36a89e2c1f0" +checksum = "f35b3d4384247534f678f24f28c5921206f18423a787eb6de5cca250bf7c013d" dependencies = [ "extism-pdk", "serde", @@ -9458,7 +9461,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 09c7deb7a44..bce3b2cfbcd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,6 +71,7 @@ starbase_archive = { version = "0.11.6", default-features = false, features = [ ] } starbase_console = { version = "0.6.13", features = ["miette"] } starbase_events = "0.7.3" +starbase_id = { version = "0.2.2", features = ["miette", "schematic"] } starbase_sandbox = "0.9.7" starbase_shell = "0.10.2" starbase_styles = { version = "0.6.1", features = ["relative-path"] } @@ -99,14 +100,14 @@ uuid = { version = "1.18.1", features = ["v4"] } # proto/plugin related extism = "=1.12.0" extism-pdk = "1.4.1" -proto_core = "0.53.0" -proto_pdk_api = "0.31.0" -proto_pdk_test_utils = "0.41.0" +proto_core = "0.53.1" +proto_pdk_api = "0.31.1" +proto_pdk_test_utils = "0.41.1" system_env = "0.8.3" version_spec = "0.9.5" -warpgate = "0.28.0" -warpgate_api = "0.17.0" -warpgate_pdk = "0.16.0" +warpgate = "0.28.1" +warpgate_api = "0.17.1" +warpgate_pdk = "0.16.1" # proto_core = { path = "../proto/crates/core" } # system_env = { path = "../proto/crates/system-env" } diff --git a/crates/app/src/app_error.rs b/crates/app/src/app_error.rs index 0e75187c1d2..4befd59af87 100644 --- a/crates/app/src/app_error.rs +++ b/crates/app/src/app_error.rs @@ -1,7 +1,7 @@ #![allow(dead_code)] use miette::Diagnostic; -use moon_common::{Id, Style, Stylize, consts}; +use moon_common::{Style, Stylize, consts}; use thiserror::Error; #[derive(Error, Debug, Diagnostic)] @@ -55,7 +55,7 @@ pub enum AppError { "extensions".style(Style::Property), ".moon/workspace.yml".style(Style::File), )] - UnknownExtension { id: Id }, + UnknownExtension { id: String }, #[diagnostic(code(app::upgrade::requires_internet))] #[error("Upgrading moon requires an internet connection!")] diff --git a/crates/app/src/commands/ext.rs b/crates/app/src/commands/ext.rs index 8ab22623349..db3fecd042d 100644 --- a/crates/app/src/commands/ext.rs +++ b/crates/app/src/commands/ext.rs @@ -2,7 +2,6 @@ use crate::app_error::AppError; use crate::session::MoonSession; use clap::Args; use moon_common::Id; -use moon_plugin::PluginId; use starbase::AppResult; use tracing::instrument; @@ -19,14 +18,16 @@ pub struct ExtArgs { #[instrument(skip_all)] pub async fn ext(session: MoonSession, args: ExtArgs) -> AppResult { if !session.workspace_config.extensions.contains_key(&args.id) { - return Err(AppError::UnknownExtension { id: args.id }.into()); + return Err(AppError::UnknownExtension { + id: args.id.to_string(), + } + .into()); } - let id = PluginId::raw(&args.id); let extension_registry = session.get_extension_registry().await?; // Load the plugin - let extension = extension_registry.load(&id).await?; + let extension = extension_registry.load(&args.id).await?; // Execute the plugin extension diff --git a/crates/codegen/src/codegen.rs b/crates/codegen/src/codegen.rs index 412e27bdb80..7c03e2e24b6 100644 --- a/crates/codegen/src/codegen.rs +++ b/crates/codegen/src/codegen.rs @@ -72,7 +72,7 @@ impl<'app> CodeGenerator<'app> { if let Some(existing_template) = self.templates.get(&template.id) { return Err(CodegenError::DuplicateTemplate { - id: template.id, + id: template.id.to_string(), original: existing_template.root.clone(), current: template.root, } @@ -104,7 +104,7 @@ impl<'app> CodeGenerator<'app> { .join(id.as_str()); if template_root.exists() { - return Err(CodegenError::ExistingTemplate(id, template_root).into()); + return Err(CodegenError::ExistingTemplate(id.to_string(), template_root).into()); } debug!( @@ -140,7 +140,7 @@ impl<'app> CodeGenerator<'app> { debug!(template = id.as_str(), "Retrieving a template"); let Some(template) = self.templates.get(&id) else { - return Err(CodegenError::MissingTemplate(id).into()); + return Err(CodegenError::MissingTemplate(id.to_string()).into()); }; // Clone base template diff --git a/crates/codegen/src/codegen_error.rs b/crates/codegen/src/codegen_error.rs index bfb1fe398a6..59f10aedf06 100644 --- a/crates/codegen/src/codegen_error.rs +++ b/crates/codegen/src/codegen_error.rs @@ -1,5 +1,5 @@ use miette::Diagnostic; -use moon_common::{Id, Style, Stylize}; +use moon_common::{Style, Stylize}; use std::path::PathBuf; use thiserror::Error; @@ -18,7 +18,7 @@ pub enum CodegenError { .0.style(Style::Id), .1.style(Style::Path), )] - ExistingTemplate(Id, PathBuf), + ExistingTemplate(String, PathBuf), #[diagnostic(code(codegen::args::parse_failed))] #[error("Failed to parse variables from arguments.")] @@ -32,7 +32,7 @@ pub enum CodegenError { "No template with the name {} could be found at any of the configured template locations.", .0.style(Style::Id), )] - MissingTemplate(Id), + MissingTemplate(String), #[diagnostic(code(codegen::template::duplicate))] #[error( @@ -42,7 +42,7 @@ pub enum CodegenError { .current.style(Style::Path), )] DuplicateTemplate { - id: Id, + id: String, original: PathBuf, current: PathBuf, }, diff --git a/crates/codegen/tests/codegen_test.rs b/crates/codegen/tests/codegen_test.rs index fdab9db4450..c963665b29f 100644 --- a/crates/codegen/tests/codegen_test.rs +++ b/crates/codegen/tests/codegen_test.rs @@ -98,22 +98,22 @@ mod codegen { assert!( sandbox .path() - .join("templates/so-me-temPlatE--with-Ran-dom-Valu-es-123_") + .join("templates/so-me-temPlatE--with-Ran-dom-Valu-es-123") .exists() ); assert!( sandbox .path() - .join("templates/so-me-temPlatE--with-Ran-dom-Valu-es-123_/template.yml") + .join("templates/so-me-temPlatE--with-Ran-dom-Valu-es-123/template.yml") .exists() ); - assert_eq!(template.id, "so-me-temPlatE--with-Ran-dom-Valu-es-123_"); + assert_eq!(template.id, "so-me-temPlatE--with-Ran-dom-Valu-es-123"); assert_eq!( template.root, sandbox .path() - .join("templates/so-me-temPlatE--with-Ran-dom-Valu-es-123_") + .join("templates/so-me-temPlatE--with-Ran-dom-Valu-es-123") ); } } diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 80be4d1f3e5..3116de28afc 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -9,7 +9,6 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -compact_str = { workspace = true } dirs = { workspace = true } miette = { workspace = true } relative-path = { workspace = true, features = ["serde"] } @@ -17,6 +16,7 @@ regex = { workspace = true, features = ["unicode"] } rustc-hash = { workspace = true } schematic = { workspace = true } serde = { workspace = true } +starbase_id = { workspace = true } starbase_styles = { workspace = true } thiserror = { workspace = true } diff --git a/crates/common/src/id.rs b/crates/common/src/id.rs index 48af6ed4040..0499c105e57 100644 --- a/crates/common/src/id.rs +++ b/crates/common/src/id.rs @@ -1,60 +1,13 @@ -use compact_str::CompactString; -use miette::Diagnostic; -use regex::Regex; -use schematic::{Schema, SchemaBuilder, Schematic}; -use serde::{Deserialize, Deserializer, Serialize, de}; -use starbase_styles::{Style, Stylize}; -use std::sync::OnceLock; -use std::{borrow::Borrow, fmt, ops::Deref, str::FromStr}; -use thiserror::Error; +pub use starbase_id::{ALNUM as ID_CHARS, Id, IdError, SYMBOLS as ID_SYMBOLS}; -// https://docs.rs/regex/latest/regex/#perl-character-classes-unicode-friendly -// `\w` is too broad, as it includes punctuation and other characters, -// so we need to be explicit with our Unicode character classes. -pub static ID_CHARS: &str = r"[\p{Alphabetic}\p{M}\p{Join_Control}\d/\._-]*"; - -pub static ID_PATTERN: OnceLock = OnceLock::new(); -pub static ID_CLEAN: OnceLock = OnceLock::new(); - -#[derive(Error, Debug, Diagnostic)] -#[diagnostic(code(id::invalid_format))] -#[error("Invalid format for {}, may only contain alpha-numeric characters, dashes (-), slashes (/), underscores (_), and periods (.).", .0.style(Style::Id))] -pub struct IdError(String); - -#[derive(Clone, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] -pub struct Id(CompactString); - -impl Id { - pub fn new>(id: S) -> Result { - let id = id.as_ref(); - - // The @ is to support npm package scopes! - let pattern = - ID_PATTERN.get_or_init(|| Regex::new(format!("^(@?{ID_CHARS})$").as_str()).unwrap()); - - if !pattern.is_match(id) { - return Err(IdError(id.to_owned())); - } - - Ok(Self::raw(id)) - } - - pub fn clean>(id: S) -> Result { - // Remove @ so node based IDs don't become prefixed - // with a leading -, causing pattern failures - let id = id.as_ref().replace('@', ""); - - // This is to clean an ID and remove unwanted characters - let pattern = ID_CLEAN.get_or_init(|| Regex::new(r"[^0-9A-Za-z/\._-]+").unwrap()); - - Id::new(pattern.replace_all(&id, "-")) - } - - pub fn raw>(id: S) -> Id { - Id(CompactString::new(id)) - } +pub trait IdExt { + fn stable>(id: S) -> Id; + fn stable_and_unstable>(id: S) -> (Id, Id); + fn unstable>(id: S) -> Id; +} - pub fn stable>(id: S) -> Id { +impl IdExt for Id { + fn stable>(id: S) -> Id { let id = id.as_ref(); if let Some(suffix) = id.strip_prefix("unstable_") { @@ -64,7 +17,13 @@ impl Id { } } - pub fn unstable>(id: S) -> Id { + fn stable_and_unstable>(id: S) -> (Id, Id) { + let id = id.as_ref(); + + (Id::stable(id), Id::unstable(id)) + } + + fn unstable>(id: S) -> Id { let id = id.as_ref(); if id.starts_with("unstable_") { @@ -73,132 +32,4 @@ impl Id { Id::raw(format!("unstable_{id}")) } } - - pub fn stable_and_unstable>(id: S) -> (Id, Id) { - let id = id.as_ref(); - - (Id::stable(id), Id::unstable(id)) - } - - pub fn as_str(&self) -> &str { - &self.0 - } -} - -impl fmt::Debug for Id { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.0) - } -} - -impl fmt::Display for Id { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.0) - } -} - -impl Stylize for Id { - fn style(&self, style: Style) -> String { - self.to_string().style(style) - } -} - -impl AsRef for Id { - fn as_ref(&self) -> &str { - &self.0 - } -} - -// impl AsRef for Id { -// fn as_ref(&self) -> &String { -// &self.0 -// } -// } - -impl AsRef for Id { - fn as_ref(&self) -> &Id { - self - } -} - -impl Deref for Id { - type Target = str; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl PartialEq for Id { - fn eq(&self, other: &str) -> bool { - self.0 == other - } -} - -impl PartialEq<&str> for Id { - fn eq(&self, other: &&str) -> bool { - self.0 == other - } -} - -impl PartialEq for Id { - fn eq(&self, other: &String) -> bool { - self.0 == other - } -} - -// Allows strings to be used for collection keys - -// impl Borrow for Id { -// fn borrow(&self) -> &String { -// &self.0 -// } -// } - -impl Borrow for Id { - fn borrow(&self) -> &str { - &self.0 - } -} - -// Parsing values - -impl FromStr for Id { - type Err = IdError; - - fn from_str(s: &str) -> Result { - Id::new(s) - } -} - -impl TryFrom<&str> for Id { - type Error = IdError; - - fn try_from(value: &str) -> Result { - Self::from_str(value) - } -} - -impl TryFrom for Id { - type Error = IdError; - - fn try_from(value: String) -> Result { - Self::from_str(&value) - } -} - -impl<'de> Deserialize<'de> for Id { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - Id::new(String::deserialize(deserializer)?) - .map_err(|error| de::Error::custom(error.to_string())) - } -} - -impl Schematic for Id { - fn build_schema(mut schema: SchemaBuilder) -> Schema { - schema.string_default() - } } diff --git a/crates/config-schema/src/typescript_types.rs b/crates/config-schema/src/typescript_types.rs index 24e36341e1e..5c238f60d47 100644 --- a/crates/config-schema/src/typescript_types.rs +++ b/crates/config-schema/src/typescript_types.rs @@ -16,6 +16,7 @@ fn generate_project(out_dir: &Path) -> miette::Result<()> { out_dir.join("project-config.ts"), TypeScriptRenderer::new(TypeScriptOptions { exclude_references: vec![ + "Id".into(), "Input".into(), "FileInput".into(), "GlobInput".into(), @@ -64,6 +65,7 @@ fn generate_project(out_dir: &Path) -> miette::Result<()> { "UnresolvedVersionSpec".into(), ], ), + ("./common".into(), vec!["Id".into()]), ]), ..Default::default() }), @@ -77,8 +79,11 @@ fn generate_tasks(out_dir: &Path) -> miette::Result<()> { generator.generate( out_dir.join("tasks-config.ts"), TypeScriptRenderer::new(TypeScriptOptions { - exclude_references: vec!["ExtendsFrom".into()], - external_types: HashMap::from_iter([("./common".into(), vec!["ExtendsFrom".into()])]), + exclude_references: vec!["Id".into(), "ExtendsFrom".into()], + external_types: HashMap::from_iter([( + "./common".into(), + vec!["Id".into(), "ExtendsFrom".into()], + )]), ..Default::default() }), ) @@ -92,7 +97,11 @@ fn generate_template(out_dir: &Path) -> miette::Result<()> { generator.add::(); generator.generate( out_dir.join("template-config.ts"), - TypeScriptRenderer::default(), + TypeScriptRenderer::new(TypeScriptOptions { + exclude_references: vec!["Id".into()], + external_types: HashMap::from_iter([("./common".into(), vec!["Id".into()])]), + ..Default::default() + }), ) } @@ -103,8 +112,11 @@ fn generate_toolchain(out_dir: &Path) -> miette::Result<()> { generator.generate( out_dir.join("toolchain-config.ts"), TypeScriptRenderer::new(TypeScriptOptions { - exclude_references: vec!["ExtendsFrom".into()], - external_types: HashMap::from_iter([("./common".into(), vec!["ExtendsFrom".into()])]), + exclude_references: vec!["Id".into(), "ExtendsFrom".into()], + external_types: HashMap::from_iter([( + "./common".into(), + vec!["Id".into(), "ExtendsFrom".into()], + )]), ..Default::default() }), ) @@ -117,9 +129,9 @@ fn generate_workspace(out_dir: &Path) -> miette::Result<()> { generator.generate( out_dir.join("workspace-config.ts"), TypeScriptRenderer::new(TypeScriptOptions { - exclude_references: vec!["ExtendsFrom".into(), "PluginLocator".into()], + exclude_references: vec!["Id".into(), "ExtendsFrom".into(), "PluginLocator".into()], external_types: HashMap::from_iter([ - ("./common".into(), vec!["ExtendsFrom".into()]), + ("./common".into(), vec!["Id".into(), "ExtendsFrom".into()]), ("./toolchain-config".into(), vec!["PluginLocator".into()]), ]), ..Default::default() diff --git a/crates/config/src/project/overrides_config.rs b/crates/config/src/project/overrides_config.rs index 0e2f17c3fde..e3996776c6e 100644 --- a/crates/config/src/project/overrides_config.rs +++ b/crates/config/src/project/overrides_config.rs @@ -1,7 +1,7 @@ use crate::shapes::OneOrMany; use crate::toolchain::ToolchainPluginConfig; use crate::{config_enum, config_struct}; -use moon_common::Id; +use moon_common::{Id, IdExt}; use rustc_hash::FxHashMap; use schematic::Config; use version_spec::UnresolvedVersionSpec; diff --git a/crates/config/src/toolchain_config.rs b/crates/config/src/toolchain_config.rs index 694c1d2efa1..0b8694c74f8 100644 --- a/crates/config/src/toolchain_config.rs +++ b/crates/config/src/toolchain_config.rs @@ -1,7 +1,7 @@ use crate::config_struct; use crate::language_platform::*; use crate::toolchain::*; -use moon_common::Id; +use moon_common::{Id, IdExt}; use rustc_hash::FxHashMap; use schematic::{Config, validate}; use version_spec::UnresolvedVersionSpec; diff --git a/crates/config/tests/input_shape_test.rs b/crates/config/tests/input_shape_test.rs index 070937742b7..4a1bc5dcbf5 100644 --- a/crates/config/tests/input_shape_test.rs +++ b/crates/config/tests/input_shape_test.rs @@ -502,7 +502,7 @@ mod input_shape { } #[test] - #[should_panic(expected = "Invalid format")] + #[should_panic(expected = "Invalid identifier format")] fn errors_invalid_id() { FileGroupInput::from_uri(Uri::parse("group://@&n3k(").unwrap()).unwrap(); } @@ -678,7 +678,7 @@ mod input_shape { } #[test] - #[should_panic(expected = "Invalid format")] + #[should_panic(expected = "Invalid identifier format")] fn errors_invalid_id() { ManifestDepsInput::from_uri(Uri::parse("manifest://@&n3k(").unwrap()).unwrap(); } @@ -742,7 +742,7 @@ mod input_shape { } #[test] - #[should_panic(expected = "Invalid format")] + #[should_panic(expected = "Invalid identifier format")] fn errors_invalid_id() { ProjectSourcesInput::from_uri(Uri::parse("project://@&n3k(").unwrap()).unwrap(); } diff --git a/crates/config/tests/project_config_test.rs b/crates/config/tests/project_config_test.rs index ca12c1ed6d5..5b1df16f5f2 100644 --- a/crates/config/tests/project_config_test.rs +++ b/crates/config/tests/project_config_test.rs @@ -514,7 +514,7 @@ tags: } #[test] - #[should_panic(expected = "Invalid format for foo bar")] + #[should_panic(expected = "Invalid identifier format for foo bar")] fn errors_on_invalid_format() { test_load_config("moon.yml", "tags: ['foo bar']", |path| { load_config_from_root(path, ".") diff --git a/crates/config/tests/workspace_config_test.rs b/crates/config/tests/workspace_config_test.rs index 9ace5eaa351..4d688ca3b56 100644 --- a/crates/config/tests/workspace_config_test.rs +++ b/crates/config/tests/workspace_config_test.rs @@ -352,7 +352,7 @@ constraints: } #[test] - #[should_panic(expected = "Invalid format for bad id")] + #[should_panic(expected = "Invalid identifier format for bad id")] fn errors_on_invalid_tag_format() { test_load_config( FILENAME, diff --git a/crates/extension-plugin/src/extension_plugin.rs b/crates/extension-plugin/src/extension_plugin.rs index 406566b2c2b..b63704030e9 100644 --- a/crates/extension-plugin/src/extension_plugin.rs +++ b/crates/extension-plugin/src/extension_plugin.rs @@ -1,6 +1,7 @@ use async_trait::async_trait; +use moon_common::Id; use moon_pdk_api::*; -use moon_plugin::{Plugin, PluginContainer, PluginId, PluginRegistration, PluginType}; +use moon_plugin::{Plugin, PluginContainer, PluginRegistration, PluginType}; use std::fmt; use std::sync::Arc; use tracing::instrument; @@ -8,7 +9,7 @@ use tracing::instrument; pub type ExtensionMetadata = RegisterExtensionOutput; pub struct ExtensionPlugin { - pub id: PluginId, + pub id: Id, pub metadata: ExtensionMetadata, plugin: Arc, @@ -34,7 +35,7 @@ impl Plugin for ExtensionPlugin { .cache_func_with( "register_extension", RegisterExtensionInput { - id: registration.id.to_string(), + id: registration.id.clone(), }, ) .await?; diff --git a/crates/extension-plugin/src/extension_registry.rs b/crates/extension-plugin/src/extension_registry.rs index 8d8b85089ef..c896c7f8020 100644 --- a/crates/extension-plugin/src/extension_registry.rs +++ b/crates/extension-plugin/src/extension_registry.rs @@ -1,9 +1,7 @@ use crate::extension_plugin::ExtensionPlugin; use moon_common::Id; use moon_config::ExtensionConfig; -use moon_plugin::{ - MoonHostData, PluginError, PluginId, PluginRegistry, PluginType, serialize_config, -}; +use moon_plugin::{MoonHostData, PluginError, PluginRegistry, PluginType, serialize_config}; use rustc_hash::FxHashMap; use std::ops::Deref; use std::sync::Arc; @@ -11,7 +9,7 @@ use tracing::trace; #[derive(Debug)] pub struct ExtensionRegistry { - pub configs: FxHashMap, + pub configs: FxHashMap, registry: Arc>, } @@ -37,16 +35,15 @@ impl ExtensionRegistry { pub fn inherit_configs(&mut self, configs: &FxHashMap) { for (id, config) in configs { - // Convert moon IDs to plugin IDs - self.configs.insert(PluginId::raw(id), config.to_owned()); + self.configs.insert(id.to_owned(), config.to_owned()); } } - pub async fn load(&self, id: Id) -> miette::Result> + pub async fn load(&self, id: T) -> miette::Result> where - Id: AsRef, + T: AsRef, { - let id = PluginId::raw(id.as_ref()); + let id = Id::raw(id.as_ref()); if self.is_registered(&id) { return self.get_instance(&id).await; diff --git a/crates/file-group/src/file_group.rs b/crates/file-group/src/file_group.rs index 5a041ca39db..5357f518bc6 100644 --- a/crates/file-group/src/file_group.rs +++ b/crates/file-group/src/file_group.rs @@ -59,7 +59,7 @@ impl FileGroup { self.env.push(var.to_owned()); } Input::TokenFunc(_) | Input::TokenVar(_) => { - return Err(FileGroupError::NoTokens(self.id.clone()).into()); + return Err(FileGroupError::NoTokens(self.id.to_string()).into()); } Input::ProjectFile(file) | Input::WorkspaceFile(file) => { self.files.push(file.to_workspace_relative(project_source)); @@ -110,7 +110,7 @@ impl FileGroup { /// relative to the project root. pub fn globs(&self) -> miette::Result<&Vec> { if self.globs.is_empty() { - return Err(FileGroupError::MissingGlobs(self.id.clone()).into()); + return Err(FileGroupError::MissingGlobs(self.id.to_string()).into()); } Ok(&self.globs) diff --git a/crates/file-group/src/file_group_error.rs b/crates/file-group/src/file_group_error.rs index 6d0c23b58ac..a819d2618ff 100644 --- a/crates/file-group/src/file_group_error.rs +++ b/crates/file-group/src/file_group_error.rs @@ -1,14 +1,14 @@ use miette::Diagnostic; -use moon_common::{Id, Style, Stylize}; +use moon_common::{Style, Stylize}; use thiserror::Error; #[derive(Error, Debug, Diagnostic)] pub enum FileGroupError { #[diagnostic(code(file_group::missing_globs))] #[error("No globs defined in file group {}.", .0.style(Style::Id))] - MissingGlobs(Id), + MissingGlobs(String), #[diagnostic(code(file_group::no_tokens))] #[error("Token functions and variables are not supported in file groups. Received for group {}.", .0.style(Style::Id))] - NoTokens(Id), + NoTokens(String), } diff --git a/crates/pdk-api/src/common.rs b/crates/pdk-api/src/common.rs index cc8c775d456..a2a4d9d4253 100644 --- a/crates/pdk-api/src/common.rs +++ b/crates/pdk-api/src/common.rs @@ -1,4 +1,5 @@ use crate::context::MoonContext; +use moon_common::Id; use moon_config::{DependencyScope, PartialTaskConfig}; use moon_project::ProjectFragment; use moon_task::TaskFragment; @@ -17,7 +18,7 @@ api_struct!( /// Map of project IDs to their source location, /// relative from the workspace root. - pub project_sources: BTreeMap, + pub project_sources: BTreeMap, /// Workspace toolchain configuration. pub toolchain_config: serde_json::Value, @@ -31,7 +32,7 @@ api_struct!( /// Map of project IDs to extracted information in which to /// extend projects in the project graph. #[serde(skip_serializing_if = "BTreeMap::is_empty")] - pub extended_projects: BTreeMap, + pub extended_projects: BTreeMap, /// List of virtual files in which information was extracted from and /// should invalidate the project graph cache. @@ -44,7 +45,7 @@ api_struct!( /// A project-to-project relationship. pub struct ProjectDependency { /// ID or alias of the depended on project. - pub id: String, + pub id: Id, /// Scope of the dependency relationship. pub scope: DependencyScope, @@ -69,7 +70,7 @@ api_struct!( /// Map of inherited tasks keyed by a unique ID, typically extracted from a manifest. #[serde(skip_serializing_if = "BTreeMap::is_empty")] - pub tasks: BTreeMap, + pub tasks: BTreeMap, } ); diff --git a/crates/pdk-api/src/context.rs b/crates/pdk-api/src/context.rs index b28404a958d..a4f8f4cc3de 100644 --- a/crates/pdk-api/src/context.rs +++ b/crates/pdk-api/src/context.rs @@ -1,3 +1,4 @@ +use moon_common::Id; use moon_project::ProjectFragment; use std::time::{Duration, Instant, SystemTime}; use warpgate_api::{AnyResult, VirtualPath, api_enum, api_struct}; @@ -67,7 +68,7 @@ api_struct!( #[serde(skip_serializing_if = "Option::is_none")] pub finished_at: Option, - pub id: String, + pub id: Id, #[serde(skip_serializing_if = "Option::is_none")] pub started_at: Option, @@ -82,16 +83,16 @@ api_struct!( impl Operation { /// Create a new operation with a unique ID. The ID /// will be converted to kebab-case when serialized. - pub fn new(id: impl AsRef) -> Self { - Operation { + pub fn new(id: impl AsRef) -> AnyResult { + Ok(Operation { duration: None, error: None, finished_at: None, - id: id.as_ref().to_owned(), + id: Id::new(id.as_ref())?, started_at: Some(SystemTime::now()), start_time: Some(Instant::now()), status: OperationStatus::Pending, - } + }) } /// Mark the operation as finished with the provided status. @@ -124,7 +125,7 @@ impl Operation { I: AsRef, F: FnOnce() -> AnyResult, { - let mut op = Self::new(id); + let mut op = Self::new(id)?; match func() { Ok(res) => { @@ -138,14 +139,14 @@ impl Operation { /// Create a new operation and track its state when executing /// the provided callback, but do not bubble up a result error. - pub fn track_with_error(id: I, func: F) -> (Self, Option) + pub fn track_with_error(id: I, func: F) -> AnyResult<(Self, Option)> where I: AsRef, F: FnOnce() -> AnyResult, { - let mut op = Self::new(id); + let mut op = Self::new(id)?; - match func() { + let res = match func() { Ok(res) => { op.finish(OperationStatus::Passed); @@ -157,6 +158,8 @@ impl Operation { (op, None) } - } + }; + + Ok(res) } } diff --git a/crates/pdk-api/src/extension.rs b/crates/pdk-api/src/extension.rs index de82996cf36..f019a716ed0 100644 --- a/crates/pdk-api/src/extension.rs +++ b/crates/pdk-api/src/extension.rs @@ -1,4 +1,5 @@ use crate::context::MoonContext; +use moon_common::Id; use schematic::Schema; use warpgate_api::*; @@ -8,7 +9,7 @@ api_struct!( /// Input passed to the `register_extension` function. pub struct RegisterExtensionInput { /// ID of the toolchain, as it was configured. - pub id: String, + pub id: Id, } ); diff --git a/crates/pdk-api/src/toolchain/tier1.rs b/crates/pdk-api/src/toolchain/tier1.rs index b97033500ed..3f0e3531fe7 100644 --- a/crates/pdk-api/src/toolchain/tier1.rs +++ b/crates/pdk-api/src/toolchain/tier1.rs @@ -1,6 +1,7 @@ use crate::context::*; use crate::is_false; use crate::prompts::*; +use moon_common::Id; use moon_config::{DockerPruneConfig, DockerScaffoldConfig}; use moon_project::ProjectFragment; use rustc_hash::FxHashMap; @@ -19,7 +20,7 @@ api_struct!( /// Input passed to the `register_toolchain` function. pub struct RegisterToolchainInput { /// ID of the toolchain, as it was configured. - pub id: String, + pub id: Id, } ); diff --git a/crates/pdk-test-utils/src/sandbox.rs b/crates/pdk-test-utils/src/sandbox.rs index 80db65da4b7..0d3378ea612 100644 --- a/crates/pdk-test-utils/src/sandbox.rs +++ b/crates/pdk-test-utils/src/sandbox.rs @@ -3,7 +3,7 @@ use crate::host_func_mocker::*; use crate::toolchain_wrapper::*; use extism::{Function, UserData, ValType}; use moon_pdk_api::{ - RegisterExtensionInput, RegisterExtensionOutput, RegisterToolchainInput, + Id, RegisterExtensionInput, RegisterExtensionOutput, RegisterToolchainInput, RegisterToolchainOutput, }; use proto_core::{ProtoEnvironment, Tool, ToolContext, inject_proto_manifest_config}; @@ -16,8 +16,8 @@ use std::ops::Deref; use std::path::PathBuf; use std::sync::Arc; use warpgate::{ - Id, PluginContainer, PluginLoader, PluginManifest, Wasm, host::*, - inject_default_manifest_config, test_utils::*, + PluginContainer, PluginLoader, PluginManifest, Wasm, host::*, inject_default_manifest_config, + test_utils::*, }; pub struct MoonWasmSandbox { @@ -92,7 +92,7 @@ impl MoonWasmSandbox { .cache_func_with( "register_extension", RegisterExtensionInput { - id: plugin.id.to_string(), + id: plugin.id.clone(), }, ) .await @@ -133,7 +133,7 @@ impl MoonWasmSandbox { .cache_func_with( "register_toolchain", RegisterToolchainInput { - id: plugin.id.to_string(), + id: plugin.id.clone(), }, ) .await diff --git a/crates/plugin/src/lib.rs b/crates/plugin/src/lib.rs index 105626e5876..4062198e886 100644 --- a/crates/plugin/src/lib.rs +++ b/crates/plugin/src/lib.rs @@ -9,9 +9,7 @@ pub use plugin::*; pub use plugin_error::*; pub use plugin_registry::*; pub use proto_core::ProtoEnvironment; -pub use warpgate::{ - Id as PluginId, PluginContainer, PluginLoader, PluginLocator, PluginManifest, Wasm, -}; +pub use warpgate::{PluginContainer, PluginLoader, PluginLocator, PluginManifest, Wasm}; use convert_case::{Case, Casing}; use miette::IntoDiagnostic; diff --git a/crates/plugin/src/plugin_registry.rs b/crates/plugin/src/plugin_registry.rs index 0edd9c9268b..dd8ca6975fc 100644 --- a/crates/plugin/src/plugin_registry.rs +++ b/crates/plugin/src/plugin_registry.rs @@ -1,6 +1,7 @@ use crate::host::*; use crate::plugin::*; use crate::plugin_error::PluginError; +use moon_common::{Id, IdExt}; use moon_pdk_api::MoonContext; use proto_core::is_offline; use scc::hash_map::Entry; @@ -11,15 +12,15 @@ use std::path::{Path, PathBuf}; use std::sync::Arc; use tracing::{debug, instrument}; use warpgate::{ - Id as PluginId, PluginContainer, PluginLoader, PluginLocator, PluginManifest, VirtualPath, - Wasm, from_virtual_path, host::HostData, inject_default_manifest_config, to_virtual_path, + PluginContainer, PluginLoader, PluginLocator, PluginManifest, VirtualPath, Wasm, + from_virtual_path, host::HostData, inject_default_manifest_config, to_virtual_path, }; pub struct PluginRegistry { pub host_data: MoonHostData, loader: PluginLoader, - plugins: Arc>>, + plugins: Arc>>, type_of: PluginType, virtual_paths: BTreeMap, } @@ -57,11 +58,7 @@ impl PluginRegistry { } } - pub fn create_manifest( - &self, - id: &PluginId, - wasm_file: PathBuf, - ) -> miette::Result { + pub fn create_manifest(&self, id: &Id, wasm_file: PathBuf) -> miette::Result { debug!( plugin = self.type_of.get_label(), id = id.as_str(), @@ -99,7 +96,7 @@ impl PluginRegistry { Ok(manifest) } - pub fn get_cache(&self) -> Arc>> { + pub fn get_cache(&self) -> Arc>> { Arc::clone(&self.plugins) } @@ -107,7 +104,7 @@ impl PluginRegistry { &self.virtual_paths } - pub async fn get_instance(&self, id: &PluginId) -> miette::Result> { + pub async fn get_instance(&self, id: &Id) -> miette::Result> { Ok(self .plugins .get_async(id) @@ -119,7 +116,7 @@ impl PluginRegistry { })?) } - pub fn is_registered(&self, id: &PluginId) -> bool { + pub fn is_registered(&self, id: &Id) -> bool { self.plugins.contains(id) } @@ -135,7 +132,7 @@ impl PluginRegistry { L: AsRef + fmt::Debug, F: FnMut(&mut PluginManifest) -> miette::Result<()>, { - let id = PluginId::raw(id.as_ref()); + let id = Id::raw(id.as_ref()); let locator = locator.as_ref(); // Use an entry so that it creates a lock, @@ -179,7 +176,7 @@ impl PluginRegistry { // expect a specific ID, for example "rust", and if we provide // "unstable_rust", it breaks in weird ways. let orig_id = entry.key().as_str(); - let stable_id = PluginId::raw(orig_id.strip_prefix("unstable_").unwrap_or(orig_id)); + let stable_id = Id::stable(orig_id); // Combine everything into the container and register let plugin = T::new(PluginRegistration { @@ -218,7 +215,7 @@ impl PluginRegistry { self.load_with_config(id, locator, |_| Ok(())).await } - pub fn register(&self, id: PluginId, plugin: T) -> miette::Result<()> { + pub fn register(&self, id: Id, plugin: T) -> miette::Result<()> { if self.is_registered(&id) { return Err(PluginError::ExistingId { id: id.to_string(), diff --git a/crates/plugin/tests/plugin_registry_test.rs b/crates/plugin/tests/plugin_registry_test.rs index 407e905c5f0..868db8aeb1e 100644 --- a/crates/plugin/tests/plugin_registry_test.rs +++ b/crates/plugin/tests/plugin_registry_test.rs @@ -1,9 +1,9 @@ use async_trait::async_trait; +use moon_common::Id; use moon_config::{ToolchainConfig, WorkspaceConfig}; use moon_env::MoonEnvironment; use moon_plugin::{ - MoonHostData, Plugin, PluginId as Id, PluginLocator, PluginRegistration, PluginRegistry, - PluginType, + MoonHostData, Plugin, PluginLocator, PluginRegistration, PluginRegistry, PluginType, }; use proto_core::{ProtoEnvironment, warpgate::FileLocator}; use starbase_sandbox::{create_empty_sandbox, create_sandbox}; diff --git a/crates/project-builder/src/project_builder.rs b/crates/project-builder/src/project_builder.rs index 79fc125b8a0..49ccae0dfcf 100644 --- a/crates/project-builder/src/project_builder.rs +++ b/crates/project-builder/src/project_builder.rs @@ -1,5 +1,4 @@ -use moon_common::path::WorkspaceRelativePath; -use moon_common::{Id, color}; +use moon_common::{Id, IdExt, color, path::WorkspaceRelativePath}; use moon_config::{ ConfigLoader, DependencyConfig, DependencySource, InheritedTasksManager, InheritedTasksResult, LanguageType, ProjectConfig, ProjectDependsOn, TaskConfig, ToolchainConfig, diff --git a/crates/project-constraints/src/lib.rs b/crates/project-constraints/src/lib.rs index 74bce308553..ba22ecf23c8 100644 --- a/crates/project-constraints/src/lib.rs +++ b/crates/project-constraints/src/lib.rs @@ -15,9 +15,9 @@ pub enum ProjectConstraintsError { "layer".style(Style::Property), )] InvalidLayerRelationship { - source_id: Id, + source_id: String, source_layer: LayerType, - dep_id: Id, + dep_id: String, dep_layer: LayerType, allowed: String, }, @@ -29,9 +29,9 @@ pub enum ProjectConstraintsError { .dep_id.style(Style::Id), )] InvalidTagRelationship { - source_id: Id, - source_tag: Id, - dep_id: Id, + source_id: String, + source_tag: String, + dep_id: String, allowed: String, }, } @@ -146,9 +146,9 @@ pub fn enforce_layer_relationships( if !valid { return Err(ProjectConstraintsError::InvalidLayerRelationship { - source_id: source.id.clone(), + source_id: source.id.to_string(), source_layer: source.layer, - dep_id: dependency.id.clone(), + dep_id: dependency.id.to_string(), dep_layer: dependency.layer, allowed: allowed .into_iter() @@ -196,9 +196,9 @@ pub fn enforce_tag_relationships( allowed.push(source_tag.to_owned()); Err(ProjectConstraintsError::InvalidTagRelationship { - source_id: source.id.clone(), - source_tag: source_tag.clone(), - dep_id: dependency.id.clone(), + source_id: source.id.to_string(), + source_tag: source_tag.to_string(), + dep_id: dependency.id.to_string(), allowed: allowed .iter() .map(|t| format!("#{t}")) diff --git a/crates/project-graph/src/project_graph.rs b/crates/project-graph/src/project_graph.rs index 3e8942ae00d..ed4fc7e723b 100644 --- a/crates/project-graph/src/project_graph.rs +++ b/crates/project-graph/src/project_graph.rs @@ -89,7 +89,7 @@ impl ProjectGraph { let metadata = self .metadata .get(&id) - .ok_or(ProjectGraphError::UnconfiguredID(id))?; + .ok_or_else(|| ProjectGraphError::UnconfiguredID(id.to_string()))?; Ok(self.graph.node_weight(metadata.index).unwrap()) } diff --git a/crates/project-graph/src/project_graph_error.rs b/crates/project-graph/src/project_graph_error.rs index 0af71fea63e..adb96dbfd5a 100644 --- a/crates/project-graph/src/project_graph_error.rs +++ b/crates/project-graph/src/project_graph_error.rs @@ -1,5 +1,5 @@ use miette::Diagnostic; -use moon_common::{Id, Style, Stylize}; +use moon_common::{Style, Stylize}; use std::path::PathBuf; use thiserror::Error; @@ -11,5 +11,5 @@ pub enum ProjectGraphError { #[diagnostic(code(project_graph::unknown_id))] #[error("No project has been configured with the identifier or alias {}.", .0.style(Style::Id))] - UnconfiguredID(Id), + UnconfiguredID(String), } diff --git a/crates/target/src/target.rs b/crates/target/src/target.rs index c9a70b3bd44..ee11bc2afb4 100644 --- a/crates/target/src/target.rs +++ b/crates/target/src/target.rs @@ -1,7 +1,7 @@ use crate::target_error::TargetError; use crate::target_scope::TargetScope; use compact_str::CompactString; -use moon_common::{ID_CHARS, Id, Style, Stylize, color}; +use moon_common::{ID_CHARS, ID_SYMBOLS, Id, Style, Stylize, color}; use regex::Regex; use schematic::{Schema, SchemaBuilder, Schematic}; use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; @@ -12,7 +12,7 @@ use tracing::instrument; // The @ is to support npm package scopes! pub static TARGET_PATTERN: LazyLock = LazyLock::new(|| { Regex::new(&format!( - r"^(?P(?:[A-Za-z@#_]{{1}}{ID_CHARS}|\^|~))?:(?P{ID_CHARS})$" + r"^(?P(?:[A-Za-z@#_]{{1}}[{ID_CHARS}{ID_SYMBOLS}]*|\^|~))?:(?P[{ID_CHARS}{ID_SYMBOLS}]+)$" )) .unwrap() }); diff --git a/crates/task-builder/src/tasks_builder.rs b/crates/task-builder/src/tasks_builder.rs index f1501f7f0f2..f96a16b576b 100644 --- a/crates/task-builder/src/tasks_builder.rs +++ b/crates/task-builder/src/tasks_builder.rs @@ -48,8 +48,8 @@ fn extract_config<'builder, 'proj>( if extended_stack.is_empty() { return Err(TasksBuilderError::UnknownExtendsSource { - source_id: task_id.to_owned(), - target_id: extend_task_id.to_owned(), + source_id: task_id.to_string(), + target_id: extend_task_id.to_string(), } .into()); } else { diff --git a/crates/task-builder/src/tasks_builder_error.rs b/crates/task-builder/src/tasks_builder_error.rs index f60ce28eaad..eed1910d216 100644 --- a/crates/task-builder/src/tasks_builder_error.rs +++ b/crates/task-builder/src/tasks_builder_error.rs @@ -1,5 +1,5 @@ use miette::Diagnostic; -use moon_common::{Id, Style, Stylize}; +use moon_common::{Style, Stylize}; use moon_task::Target; use thiserror::Error; @@ -42,7 +42,10 @@ pub enum TasksBuilderError { .source_id.style(Style::Id), .target_id.style(Style::Id), )] - UnknownExtendsSource { source_id: Id, target_id: Id }, + UnknownExtendsSource { + source_id: String, + target_id: String, + }, #[diagnostic(code(task_builder::unknown_target))] #[error( diff --git a/crates/task-graph/src/task_graph_error.rs b/crates/task-graph/src/task_graph_error.rs index 776bbceba3a..37d0a6dcaca 100644 --- a/crates/task-graph/src/task_graph_error.rs +++ b/crates/task-graph/src/task_graph_error.rs @@ -11,8 +11,8 @@ pub enum TaskGraphError { )] #[error( "Unknown task {} for project {}.", - .0.task_id.style(Style::Id), - .0.get_project_id().unwrap().style(Style::Id), + .0.task_id.to_string().style(Style::Id), + .0.get_project_id().unwrap().to_string().style(Style::Id), )] UnconfiguredTarget(Target), } diff --git a/crates/test-utils/src/workspace_mocker.rs b/crates/test-utils/src/workspace_mocker.rs index 9fac30707ed..c7296ec7983 100644 --- a/crates/test-utils/src/workspace_mocker.rs +++ b/crates/test-utils/src/workspace_mocker.rs @@ -3,7 +3,7 @@ use moon_action_graph::ActionGraphBuilder; use moon_action_pipeline::ActionPipeline; use moon_app_context::AppContext; use moon_cache::CacheEngine; -use moon_common::{Id, path::WorkspaceRelativePathBuf}; +use moon_common::{Id, IdExt, path::WorkspaceRelativePathBuf}; use moon_config::*; use moon_console::{Console, MoonReporter}; use moon_env::MoonEnvironment; diff --git a/crates/toolchain-plugin/src/toolchain_plugin.rs b/crates/toolchain-plugin/src/toolchain_plugin.rs index c389ad5b3d3..2ca0e640230 100644 --- a/crates/toolchain-plugin/src/toolchain_plugin.rs +++ b/crates/toolchain-plugin/src/toolchain_plugin.rs @@ -1,8 +1,9 @@ use async_trait::async_trait; +use moon_common::Id; use moon_config::schematic::schema::indexmap::IndexSet; use moon_feature_flags::glob_walk; use moon_pdk_api::*; -use moon_plugin::{Plugin, PluginContainer, PluginId, PluginRegistration, PluginType}; +use moon_plugin::{Plugin, PluginContainer, PluginRegistration, PluginType}; use proto_core::flow::install::InstallOptions; use proto_core::{ PluginLocator, PluginType as ProtoPluginType, Tool, ToolContext, ToolSpec, @@ -19,7 +20,7 @@ use tracing::instrument; pub type ToolchainMetadata = RegisterToolchainOutput; pub struct ToolchainPlugin { - pub id: PluginId, + pub id: Id, pub locator: PluginLocator, pub metadata: ToolchainMetadata, @@ -38,7 +39,7 @@ impl Plugin for ToolchainPlugin { .cache_func_with( "register_toolchain", RegisterToolchainInput { - id: registration.id.to_string(), + id: registration.id.clone(), }, ) .await?; diff --git a/crates/toolchain-plugin/src/toolchain_registry.rs b/crates/toolchain-plugin/src/toolchain_registry.rs index c84e3a2cc80..6fd6b74d4e4 100644 --- a/crates/toolchain-plugin/src/toolchain_registry.rs +++ b/crates/toolchain-plugin/src/toolchain_registry.rs @@ -4,9 +4,7 @@ use miette::IntoDiagnostic; use moon_common::Id; use moon_config::{ProjectConfig, ProjectToolchainEntry, ToolchainConfig, ToolchainPluginConfig}; use moon_pdk_api::Operation; -use moon_plugin::{ - MoonHostData, PluginError, PluginId, PluginRegistry, PluginType, serialize_config, -}; +use moon_plugin::{MoonHostData, PluginError, PluginRegistry, PluginType, serialize_config}; use proto_core::{ToolContext, inject_proto_manifest_config}; use rustc_hash::FxHashMap; use starbase_utils::json::{self, JsonValue}; @@ -19,7 +17,7 @@ use tracing::{debug, trace}; #[derive(Debug)] pub struct ToolchainRegistry { pub config: Arc, - pub plugins: FxHashMap, + pub plugins: FxHashMap, registry: Arc>, } @@ -47,8 +45,7 @@ impl ToolchainRegistry { pub fn inherit_configs(&mut self, configs: &FxHashMap) { for (id, config) in configs { - // Convert moon IDs to plugin IDs - self.plugins.insert(PluginId::raw(id), config.to_owned()); + self.plugins.insert(id.to_owned(), config.to_owned()); } } @@ -79,7 +76,7 @@ impl ToolchainRegistry { data } - pub fn get_plugin_ids(&self) -> Vec<&PluginId> { + pub fn get_plugin_ids(&self) -> Vec<&Id> { self.plugins.keys().collect() } @@ -87,11 +84,11 @@ impl ToolchainRegistry { !self.plugins.is_empty() } - pub async fn load(&self, id: Id) -> miette::Result> + pub async fn load(&self, id: T) -> miette::Result> where - Id: AsRef, + T: AsRef, { - let id = PluginId::raw(id.as_ref()); + let id = Id::raw(id.as_ref()); if !self.is_registered(&id) { if !self.plugins.contains_key(&id) { @@ -118,16 +115,16 @@ impl ToolchainRegistry { self.load_many(self.get_plugin_ids()).await } - pub async fn load_many(&self, ids: I) -> miette::Result>> + pub async fn load_many(&self, ids: I) -> miette::Result>> where - I: IntoIterator, - Id: AsRef, + I: IntoIterator, + T: AsRef, { let mut set = JoinSet::>>::new(); let mut list = vec![]; for id in ids { - let id = PluginId::raw(id.as_ref()); + let id = Id::raw(id.as_ref()); if self.registry.is_registered(&id) { list.push(self.get_instance(&id).await?); @@ -244,7 +241,7 @@ impl ToolchainRegistry { if let Ok(toolchain) = self.load(toolchain_id).await && (skip_func_check || toolchain.has_func(func_name).await) { - let mut operation = Operation::new(func_name); + let mut operation = Operation::new(func_name).unwrap(); let id = toolchain.id.clone(); let input = input_factory(self, &toolchain); let future = output_factory(toolchain.clone(), input); @@ -280,7 +277,7 @@ impl Deref for ToolchainRegistry { } pub struct CallResult { - pub id: PluginId, + pub id: Id, pub operation: Operation, pub output: T, pub toolchain: Arc, diff --git a/crates/toolchain/src/lib.rs b/crates/toolchain/src/lib.rs index db99260289f..ccbf6a88e17 100644 --- a/crates/toolchain/src/lib.rs +++ b/crates/toolchain/src/lib.rs @@ -5,7 +5,7 @@ mod spec; pub use runtime::*; pub use spec::*; -use moon_common::Id; +use moon_common::{Id, IdExt}; use moon_env_var::{GlobalEnvBag, as_bool}; use rustc_hash::FxHashSet; diff --git a/crates/workspace-graph/src/query_projects.rs b/crates/workspace-graph/src/query_projects.rs index 73b4001fc56..09092d61b55 100644 --- a/crates/workspace-graph/src/query_projects.rs +++ b/crates/workspace-graph/src/query_projects.rs @@ -1,5 +1,5 @@ use crate::WorkspaceGraph; -use moon_common::{Id, color}; +use moon_common::{Id, IdExt, color}; use moon_project_graph::Project; use moon_query::*; use std::{fmt::Debug, sync::Arc}; @@ -130,7 +130,7 @@ impl WorkspaceGraph { } let toolchains = - toolchains.iter().map(|t| t.as_str()).collect::>(); + toolchains.iter().map(|tc| tc.as_str()).collect::>(); condition.matches_list(ids, &toolchains).unwrap_or_default() })), diff --git a/crates/workspace/src/projects_locator.rs b/crates/workspace/src/projects_locator.rs index 455a35c4d36..323517ae194 100644 --- a/crates/workspace/src/projects_locator.rs +++ b/crates/workspace/src/projects_locator.rs @@ -7,6 +7,15 @@ use starbase_utils::fs; use starbase_utils::glob::GlobWalkOptions; use tracing::{debug, instrument, warn}; +fn is_hidden(path: &str) -> bool { + let last = match path.rfind('/') { + Some(index) => &path[index + 1..], + None => path, + }; + + last.starts_with('.') +} + /// Infer a project name from a source path, by using the name of /// the project folder. fn infer_project_id_and_source(path: &str) -> miette::Result { @@ -79,7 +88,7 @@ where if project_root .file_name() .and_then(|name| name.to_str()) - .map(|name| !name.starts_with('.')) + .map(|name| !is_hidden(name)) .unwrap_or_default() { warn!( @@ -114,16 +123,13 @@ where continue; } - let (id, source) = infer_project_id_and_source(&project_source)?; - - if id.starts_with(".") { + if is_hidden(&project_source) { debug!( - project_id = id.as_str(), - source = source.as_str(), + source = project_source, "Received a project for a hidden folder. These are not supported through globs, but can be mapped explicitly with project sources!" ); } else { - sources.push((id, source)); + sources.push(infer_project_id_and_source(&project_source)?); } } } diff --git a/crates/workspace/src/workspace_builder.rs b/crates/workspace/src/workspace_builder.rs index 9bd1d9cb55c..41213955be4 100644 --- a/crates/workspace/src/workspace_builder.rs +++ b/crates/workspace/src/workspace_builder.rs @@ -309,7 +309,7 @@ impl<'app> WorkspaceBuilder<'app> { { let Some(build_data) = self.project_data.get(&id) else { - return Err(ProjectGraphError::UnconfiguredID(id).into()); + return Err(ProjectGraphError::UnconfiguredID(id.to_string()).into()); }; // Already loaded, exit early with existing index @@ -445,7 +445,7 @@ impl<'app> WorkspaceBuilder<'app> { } for (task_id, task_config) in &extended_data.tasks { - builder.extend_with_task(Id::new(task_id)?, finalize_config(task_config.clone())?); + builder.extend_with_task(task_id.to_owned(), finalize_config(task_config.clone())?); } } @@ -795,7 +795,7 @@ impl<'app> WorkspaceBuilder<'app> { && existing_data.source != build_data.source { return Err(WorkspaceBuilderError::DuplicateProjectId { - id: id.clone(), + id: id.to_string(), old_source: existing_data.source.to_string(), new_source: build_data.source.to_string(), } @@ -857,24 +857,22 @@ impl<'app> WorkspaceBuilder<'app> { project_sources: self .project_data .iter() - .map(|(id, build_data)| (id.to_string(), build_data.source.to_string())) + .map(|(id, build_data)| (id.clone(), build_data.source.to_string())) .collect(), toolchain_config: registry.create_config(&toolchain.id, context.toolchain_config), }) .await? { for (project_id, mut project_extend) in output.extended_projects { - let id = Id::new(project_id)?; - - if !self.project_data.contains_key(&id) { - return Err(ProjectGraphError::UnconfiguredID(id).into()); + if !self.project_data.contains_key(&project_id) { + return Err(ProjectGraphError::UnconfiguredID(project_id.to_string()).into()); } if let Some(alias) = project_extend.alias.take() { - self.track_alias(id.clone(), alias)?; + self.track_alias(project_id.clone(), alias)?; } - if let Some(build_data) = self.project_data.get_mut(&id) { + if let Some(build_data) = self.project_data.get_mut(&project_id) { build_data.extensions.push(project_extend); } } @@ -935,8 +933,8 @@ impl<'app> WorkspaceBuilder<'app> { return Err(WorkspaceBuilderError::DuplicateProjectAlias { alias: alias.clone(), - old_id: existing_id.to_owned(), - new_id: id.clone(), + old_id: existing_id.to_string(), + new_id: id.to_string(), } .into()); } diff --git a/crates/workspace/src/workspace_builder_error.rs b/crates/workspace/src/workspace_builder_error.rs index bab5aa163a6..d2e73ec367a 100644 --- a/crates/workspace/src/workspace_builder_error.rs +++ b/crates/workspace/src/workspace_builder_error.rs @@ -1,5 +1,5 @@ use miette::Diagnostic; -use moon_common::{Id, Style, Stylize}; +use moon_common::{Style, Stylize}; use thiserror::Error; #[derive(Error, Debug, Diagnostic)] @@ -13,8 +13,8 @@ pub enum WorkspaceBuilderError { )] DuplicateProjectAlias { alias: String, - old_id: Id, - new_id: Id, + old_id: String, + new_id: String, }, #[diagnostic(code(project_graph::duplicate_id))] @@ -27,7 +27,7 @@ pub enum WorkspaceBuilderError { "moon.yml".style(Style::File) )] DuplicateProjectId { - id: Id, + id: String, old_source: String, new_source: String, }, diff --git a/packages/types/src/common.ts b/packages/types/src/common.ts index 711f27c44ee..16149878a08 100644 --- a/packages/types/src/common.ts +++ b/packages/types/src/common.ts @@ -1,5 +1,7 @@ import type { PlatformType } from './tasks-config'; +export type Id = string; + export type Nullable = { [K in keyof T]: T[K] | null }; export interface Duration { @@ -14,7 +16,7 @@ export interface Runtime { } export interface ToolchainSpec { - id: string; + id: Id; overridden: boolean; req?: string | null; } diff --git a/packages/types/src/pipeline.ts b/packages/types/src/pipeline.ts index 69809df9d0a..3137e24ce4e 100644 --- a/packages/types/src/pipeline.ts +++ b/packages/types/src/pipeline.ts @@ -1,4 +1,4 @@ -import type { Duration, Runtime, ToolchainSpec } from './common'; +import type { Duration, Id, Runtime, ToolchainSpec } from './common'; export type ActionPipelineStatus = | 'aborted' @@ -157,9 +157,9 @@ export type ActionNode = export interface ActionNodeInstallDependencies { action: 'install-dependencies'; params: { - projectId: string | null; + projectId: Id | null; root: string; - toolchainId: string; + toolchainId: Id; }; } @@ -175,7 +175,7 @@ export interface ActionNodeInstallProjectDeps { action: 'install-project-deps'; params: { runtime: Runtime; - projectId: string; + projectId: Id; }; } @@ -195,9 +195,9 @@ export interface ActionNodeRunTask { export interface ActionNodeSetupEnvironment { action: 'install-environment'; params: { - projectId: string | null; + projectId: Id | null; root: string; - toolchainId: string; + toolchainId: Id; }; } @@ -216,7 +216,7 @@ export interface ActionNodeSetupProto { export interface ActionNodeSetupToolchain { action: 'setup-toolchain'; params: { - projectId: string | null; + projectId: Id | null; spec: ToolchainSpec; }; } @@ -224,7 +224,7 @@ export interface ActionNodeSetupToolchain { export interface ActionNodeSyncProject { action: 'sync-project'; params: { - projectId: string; + projectId: Id; }; } diff --git a/packages/types/src/project-config.ts b/packages/types/src/project-config.ts index 0e56e3bbd35..5930b942585 100644 --- a/packages/types/src/project-config.ts +++ b/packages/types/src/project-config.ts @@ -2,6 +2,7 @@ /* eslint-disable */ +import type { Id } from './common'; import type { Input, PartialTaskConfig, PlatformType, TaskConfig } from './tasks-config'; import type { PartialToolchainPluginConfig, @@ -24,7 +25,7 @@ export type DependencySource = 'explicit' | 'implicit'; /** Expanded information about a project dependency. */ export interface DependencyConfig { /** ID of the depended on project. */ - id: string; + id: Id; /** * Scope of the dependency relationship. * @@ -43,16 +44,16 @@ export interface DependencyConfig { via: string | null; } -export type ProjectDependsOn = string | DependencyConfig; +export type ProjectDependsOn = Id | DependencyConfig; /** Configures `Dockerfile` generation. */ export interface ProjectDockerFileConfig { /** A task within the current project for building the project. */ - buildTask: string | null; + buildTask: Id | null; /** The base Docker image. */ image: string | null; /** A task within the current project for starting the project. */ - startTask: string | null; + startTask: Id | null; } /** Configures aspects of the Docker scaffolding process. */ @@ -167,18 +168,18 @@ export interface ProjectToolchainConfig { * The default toolchain(s) for all tasks within the project, * if their toolchain is unknown. */ - defaults?: string | string[] | null; + defaults?: Id | Id[] | null; /** * The default toolchain(s) for all tasks within the project, * if their toolchain is unknown. */ - default: string | string[] | null; + default: Id | Id[] | null; /** Overrides `deno` settings. */ deno: ProjectToolchainCommonToolConfig | null; /** Overrides `node` settings. */ node: ProjectToolchainCommonToolConfig | null; /** Overrides toolchains by their ID. */ - plugins: Record; + plugins: Record; /** Overrides `python` settings. */ python: ProjectToolchainCommonToolConfig | null; /** Overrides `rust` settings. */ @@ -188,15 +189,15 @@ export interface ProjectToolchainConfig { /** Controls how tasks are inherited. */ export interface ProjectWorkspaceInheritedTasksConfig { /** Excludes inheriting tasks by ID. */ - exclude: string[]; + exclude: Id[]; /** * Only inherits tasks by ID, and ignores the rest. * When not defined, inherits all matching tasks. * When an empty list, inherits no tasks. */ - include: string[] | null; + include: Id[] | null; /** Renames inherited tasks to a new ID. */ - rename: Record; + rename: Record; } /** Overrides top-level workspace settings, scoped to this project. */ @@ -225,12 +226,12 @@ export interface ProjectConfig { * A mapping of group IDs to a list of file paths, globs, and * environment variables, that can be referenced from tasks. */ - fileGroups: Record; + fileGroups: Record; /** * Overrides the ID within the project graph, as defined in * the workspace `projects` setting. */ - id: string | null; + id: Id | null; /** * The primary programming language of the project. * @@ -278,9 +279,9 @@ export interface ProjectConfig { * A list of tags that this project belongs to, for categorizing, * boundary enforcement, and task inheritance. */ - tags: string[]; + tags: Id[]; /** A mapping of tasks by ID to parameters required for running the task. */ - tasks: Record; + tasks: Record; /** Overrides top-level toolchain settings, scoped to this project. */ toolchain: ProjectToolchainConfig; /** Overrides top-level workspace settings, scoped to this project. */ @@ -290,7 +291,7 @@ export interface ProjectConfig { /** Expanded information about a project dependency. */ export interface PartialDependencyConfig { /** ID of the depended on project. */ - id?: string | null; + id?: Id | null; /** * Scope of the dependency relationship. * @@ -307,16 +308,16 @@ export interface PartialDependencyConfig { via?: string | null; } -export type PartialProjectDependsOn = string | PartialDependencyConfig; +export type PartialProjectDependsOn = Id | PartialDependencyConfig; /** Configures `Dockerfile` generation. */ export interface PartialProjectDockerFileConfig { /** A task within the current project for building the project. */ - buildTask?: string | null; + buildTask?: Id | null; /** The base Docker image. */ image?: string | null; /** A task within the current project for starting the project. */ - startTask?: string | null; + startTask?: Id | null; } /** Configures aspects of the Docker scaffolding process. */ @@ -404,18 +405,18 @@ export interface PartialProjectToolchainConfig { * The default toolchain(s) for all tasks within the project, * if their toolchain is unknown. */ - defaults?: string | string[] | null; + defaults?: Id | Id[] | null; /** * The default toolchain(s) for all tasks within the project, * if their toolchain is unknown. */ - default?: string | string[] | null; + default?: Id | Id[] | null; /** Overrides `deno` settings. */ deno?: PartialProjectToolchainCommonToolConfig | null; /** Overrides `node` settings. */ node?: PartialProjectToolchainCommonToolConfig | null; /** Overrides toolchains by their ID. */ - plugins?: Record | null; + plugins?: Record | null; /** Overrides `python` settings. */ python?: PartialProjectToolchainCommonToolConfig | null; /** Overrides `rust` settings. */ @@ -425,15 +426,15 @@ export interface PartialProjectToolchainConfig { /** Controls how tasks are inherited. */ export interface PartialProjectWorkspaceInheritedTasksConfig { /** Excludes inheriting tasks by ID. */ - exclude?: string[] | null; + exclude?: Id[] | null; /** * Only inherits tasks by ID, and ignores the rest. * When not defined, inherits all matching tasks. * When an empty list, inherits no tasks. */ - include?: string[] | null; + include?: Id[] | null; /** Renames inherited tasks to a new ID. */ - rename?: Record | null; + rename?: Record | null; } /** Overrides top-level workspace settings, scoped to this project. */ @@ -462,12 +463,12 @@ export interface PartialProjectConfig { * A mapping of group IDs to a list of file paths, globs, and * environment variables, that can be referenced from tasks. */ - fileGroups?: Record | null; + fileGroups?: Record | null; /** * Overrides the ID within the project graph, as defined in * the workspace `projects` setting. */ - id?: string | null; + id?: Id | null; /** * The primary programming language of the project. * @@ -511,9 +512,9 @@ export interface PartialProjectConfig { * A list of tags that this project belongs to, for categorizing, * boundary enforcement, and task inheritance. */ - tags?: string[] | null; + tags?: Id[] | null; /** A mapping of tasks by ID to parameters required for running the task. */ - tasks?: Record | null; + tasks?: Record | null; /** Overrides top-level toolchain settings, scoped to this project. */ toolchain?: PartialProjectToolchainConfig | null; /** Overrides top-level workspace settings, scoped to this project. */ diff --git a/packages/types/src/project.ts b/packages/types/src/project.ts index 07fd16c7061..6b48d7a9f28 100644 --- a/packages/types/src/project.ts +++ b/packages/types/src/project.ts @@ -1,3 +1,4 @@ +import type { Id } from './common'; import type { DependencyConfig, DependencyScope, @@ -27,7 +28,7 @@ export interface FileGroup { env: string[]; files: string[]; globs: string[]; - id: string; + id: Id; } export interface TaskOptions { @@ -84,7 +85,7 @@ export interface Task { deps: TaskDependencyConfig[]; description: string | null; env: Record; - id: string; + id: Id; inputs: Input[]; inputEnv: string[]; inputFiles: Record; @@ -112,7 +113,7 @@ export interface Project { config: ProjectConfig; dependencies: DependencyConfig[]; fileGroups: Record; - id: string; + id: Id; inherited: { order: string[]; config: InheritedTasksConfig; @@ -125,15 +126,15 @@ export interface Project { root: string; source: string; stack: StackType; - tasks: Record; + tasks: Record; taskTargets: string[]; - toolchains: string[]; + toolchains: Id[]; } export interface ProjectFragment { alias: string | null; dependencyScope: DependencyScope; - id: string; + id: Id; source: string; toolchains: string[]; } @@ -166,7 +167,7 @@ export interface WorkspaceGraph { project_graph: ProjectGraphInner; renamed_project_ids: Record; repo_type: 'monorepo-with-root' | 'monorepo' | 'polyrepo'; - root_project_id: string | null; + root_project_id: Id | null; task_data: Record; task_graph: TaskGraphInner; } diff --git a/packages/types/src/tasks-config.ts b/packages/types/src/tasks-config.ts index 12e21251caa..a1be2e7ee1e 100644 --- a/packages/types/src/tasks-config.ts +++ b/packages/types/src/tasks-config.ts @@ -2,7 +2,7 @@ /* eslint-disable */ -import type { ExtendsFrom } from './common'; +import type { ExtendsFrom, Id } from './common'; /** A file path input. */ export interface FileInput { @@ -247,7 +247,7 @@ export interface TaskConfig { */ env: Record | null; /** Extends settings from a sibling task by ID. */ - extends: string | null; + extends: Id | null; /** * Inputs and sources that will mark the task as affected when comparing * against touched files. When not provided, all files within the project @@ -291,13 +291,13 @@ export interface TaskConfig { * The toolchain determines available binaries, lookup paths, and more. * This list will be merged with detected toolchains. */ - toolchains?: string | string[]; + toolchains?: Id | Id[]; /** * List of additional toolchain(s) in which the task will be ran in. * The toolchain determines available binaries, lookup paths, and more. * This list will be merged with detected toolchains. */ - toolchain: string | string[]; + toolchain: Id | Id[]; /** * The type of task, primarily used for categorical reasons. When not provided, * will be automatically determined. @@ -324,7 +324,7 @@ export interface InheritedTasksConfig { * A mapping of group IDs to a list of file paths, globs, and * environment variables, that can be referenced from tasks. */ - fileGroups: Record; + fileGroups: Record; /** * Task dependencies that'll automatically be injected into every * task that inherits this configuration. @@ -338,7 +338,7 @@ export interface InheritedTasksConfig { /** Default task options for all inherited tasks. */ taskOptions: TaskOptionsConfig | null; /** A mapping of tasks by ID to parameters required for running the task. */ - tasks: Record; + tasks: Record; } export type PartialTaskArgs = null | string | string[]; @@ -530,7 +530,7 @@ export interface PartialTaskConfig { */ env?: Record | null; /** Extends settings from a sibling task by ID. */ - extends?: string | null; + extends?: Id | null; /** * Inputs and sources that will mark the task as affected when comparing * against touched files. When not provided, all files within the project @@ -573,13 +573,13 @@ export interface PartialTaskConfig { * The toolchain determines available binaries, lookup paths, and more. * This list will be merged with detected toolchains. */ - toolchains?: string | string[] | null; + toolchains?: Id | Id[] | null; /** * List of additional toolchain(s) in which the task will be ran in. * The toolchain determines available binaries, lookup paths, and more. * This list will be merged with detected toolchains. */ - toolchain?: string | string[] | null; + toolchain?: Id | Id[] | null; /** * The type of task, primarily used for categorical reasons. When not provided, * will be automatically determined. @@ -606,7 +606,7 @@ export interface PartialInheritedTasksConfig { * A mapping of group IDs to a list of file paths, globs, and * environment variables, that can be referenced from tasks. */ - fileGroups?: Record | null; + fileGroups?: Record | null; /** * Task dependencies that'll automatically be injected into every * task that inherits this configuration. @@ -620,5 +620,5 @@ export interface PartialInheritedTasksConfig { /** Default task options for all inherited tasks. */ taskOptions?: PartialTaskOptionsConfig | null; /** A mapping of tasks by ID to parameters required for running the task. */ - tasks?: Record | null; + tasks?: Record | null; } diff --git a/packages/types/src/template-config.ts b/packages/types/src/template-config.ts index 49d5d416710..2ae9cd8bfef 100644 --- a/packages/types/src/template-config.ts +++ b/packages/types/src/template-config.ts @@ -2,6 +2,8 @@ /* eslint-disable */ +import type { Id } from './common'; + /** Docs: https://moonrepo.dev/docs/config/template#frontmatter */ export interface TemplateFrontmatterConfig { /** @default 'https://moonrepo.dev/schemas/template-frontmatter.json' */ @@ -155,9 +157,9 @@ export interface TemplateConfig { */ destination: string | null; /** Extends one or many other templates. */ - extends: string | string[]; + extends: Id | Id[]; /** Overrides the ID of the template, instead of using the folder name. */ - id: string | null; + id: Id | null; /** A human-readable title for the template. */ title: string; /** @@ -302,9 +304,9 @@ export interface PartialTemplateConfig { */ destination?: string | null; /** Extends one or many other templates. */ - extends?: string | string[] | null; + extends?: Id | Id[] | null; /** Overrides the ID of the template, instead of using the folder name. */ - id?: string | null; + id?: Id | null; /** A human-readable title for the template. */ title?: string | null; /** diff --git a/packages/types/src/toolchain-config.ts b/packages/types/src/toolchain-config.ts index 5cc818aa4c6..461aceaa02d 100644 --- a/packages/types/src/toolchain-config.ts +++ b/packages/types/src/toolchain-config.ts @@ -2,7 +2,7 @@ /* eslint-disable */ -import type { ExtendsFrom } from './common'; +import type { ExtendsFrom, Id } from './common'; /** Formats that a `package.json` version dependency can be. */ export type NodeVersionFormat = @@ -400,7 +400,7 @@ export interface ToolchainConfig { /** Configures and enables the Node.js platform. */ node: NodeConfig | null; /** All configured toolchains by unique ID. */ - plugins: Record; + plugins: Record; /** Configures how moon integrates with proto. */ proto: ProtoConfig; /** Configures and enables the Python platform. */ @@ -772,7 +772,7 @@ export interface PartialToolchainConfig { /** Configures and enables the Node.js platform. */ node?: PartialNodeConfig | null; /** All configured toolchains by unique ID. */ - plugins?: Record | null; + plugins?: Record | null; /** Configures how moon integrates with proto. */ proto?: PartialProtoConfig | null; /** Configures and enables the Python platform. */ diff --git a/packages/types/src/workspace-config.ts b/packages/types/src/workspace-config.ts index ca7e6e9bcc3..829ec503938 100644 --- a/packages/types/src/workspace-config.ts +++ b/packages/types/src/workspace-config.ts @@ -2,7 +2,7 @@ /* eslint-disable */ -import type { ExtendsFrom } from './common'; +import type { ExtendsFrom, Id } from './common'; import type { PluginLocator } from './toolchain-config'; /** How to order ownership rules within the generated file. */ @@ -54,7 +54,7 @@ export interface ConstraintsConfig { * Enforces relationships between projects based on each project's * `tags` setting. Requires a mapping of tags, to acceptable tags. */ - tagRelationships: Record; + tagRelationships: Record; } /** Configures aspects of the Docker pruning process. */ @@ -233,7 +233,7 @@ export interface NotifierConfig { webhookUrl: string | null; } -export type PipelineActionSwitch = null | boolean | string[]; +export type PipelineActionSwitch = null | boolean | Id[]; /** Configures aspects of the task runner (also known as the action pipeline). */ export interface PipelineConfig { @@ -305,10 +305,10 @@ export interface WorkspaceProjectsConfig { */ globs: string[]; /** A mapping of project IDs to relative file paths to each project directory. */ - sources: Record; + sources: Record; } -export type WorkspaceProjects = WorkspaceProjectsConfig | string[] | Record; +export type WorkspaceProjects = WorkspaceProjectsConfig | string[] | Record; /** The API format of the remote service. */ export type RemoteApi = 'grpc' | 'http'; @@ -525,7 +525,7 @@ export interface WorkspaceConfig { */ extends: ExtendsFrom | null; /** Configures extensions that can be executed with `moon ext`. */ - extensions: Record; + extensions: Record; /** Configures the generator for scaffolding from templates. */ generator: GeneratorConfig; /** Configures aspects of the content hashing engine. */ @@ -601,7 +601,7 @@ export interface PartialConstraintsConfig { * Enforces relationships between projects based on each project's * `tags` setting. Requires a mapping of tags, to acceptable tags. */ - tagRelationships?: Record | null; + tagRelationships?: Record | null; } /** Configures aspects of the Docker pruning process. */ @@ -769,7 +769,7 @@ export interface PartialNotifierConfig { webhookUrl?: string | null; } -export type PartialPipelineActionSwitch = null | boolean | string[]; +export type PartialPipelineActionSwitch = null | boolean | Id[]; /** Configures aspects of the task runner (also known as the action pipeline). */ export interface PartialPipelineConfig { @@ -841,13 +841,13 @@ export interface PartialWorkspaceProjectsConfig { */ globs?: string[] | null; /** A mapping of project IDs to relative file paths to each project directory. */ - sources?: Record | null; + sources?: Record | null; } export type PartialWorkspaceProjects = | PartialWorkspaceProjectsConfig | string[] - | Record; + | Record; /** Configures basic HTTP authentication. */ export interface PartialRemoteAuthConfig { @@ -1041,7 +1041,7 @@ export interface PartialWorkspaceConfig { */ extends?: ExtendsFrom | null; /** Configures extensions that can be executed with `moon ext`. */ - extensions?: Record | null; + extensions?: Record | null; /** Configures the generator for scaffolding from templates. */ generator?: PartialGeneratorConfig | null; /** Configures aspects of the content hashing engine. */ diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index bbfa2d40d79..64772edb1a2 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -621,13 +621,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", "hashbrown", "serde", + "serde_core", ] [[package]] @@ -763,7 +764,6 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" name = "moon_common" version = "0.1.4" dependencies = [ - "compact_str 0.9.0", "dirs", "miette", "regex", @@ -771,6 +771,7 @@ dependencies = [ "rustc-hash", "schematic", "serde", + "starbase_id", "starbase_styles", "thiserror 2.0.16", ] @@ -1016,9 +1017,9 @@ dependencies = [ [[package]] name = "proto_pdk_api" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb0a9ea7d5b542ab4681dd3371aff619b247d96a417e27f7a432330200cbd60e" +checksum = "af545a208b69b44dbd66e927836461e3dc2e0ee103bf1805b4723e279e7604ad" dependencies = [ "derive_setters", "rustc-hash", @@ -1259,9 +1260,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.225" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" dependencies = [ "serde_core", "serde_derive", @@ -1269,18 +1270,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.225" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.225" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", @@ -1289,15 +1290,16 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "indexmap", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -1345,13 +1347,16 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "starbase_id" -version = "0.1.2" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9f27cc7833ad979e799c1954ec0b473c37f98103e0b84a7047649acf9c246b" +checksum = "5f6253f638f8eef738ee1edd63570444ebec71cd50286b0271ca8c8593bd7f29" dependencies = [ "compact_str 0.9.0", + "miette", + "regex", "schematic", "serde", + "thiserror 2.0.16", ] [[package]] @@ -1698,9 +1703,9 @@ dependencies = [ [[package]] name = "warpgate_api" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79eaaa2ec9a58222d38d1e25d7e26f5fda5a8eb77b2a90af2634ebcd1850ffa" +checksum = "570fd77685c82ecfdae8b59f78b9ef8f3a7f9a6d5dec28408ed052b7b503a8e1" dependencies = [ "anyhow", "derive_setters", @@ -1715,9 +1720,9 @@ dependencies = [ [[package]] name = "warpgate_pdk" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cffe7a80f60e8346573b034455c669586a3d26053ee9bdbee1a36a89e2c1f0" +checksum = "f35b3d4384247534f678f24f28c5921206f18423a787eb6de5cca250bf7c013d" dependencies = [ "extism-pdk", "serde", diff --git a/wasm/tc-tier1/src/lib.rs b/wasm/tc-tier1/src/lib.rs index 5b7d2f598e1..71f00f4868d 100644 --- a/wasm/tc-tier1/src/lib.rs +++ b/wasm/tc-tier1/src/lib.rs @@ -6,7 +6,7 @@ pub fn register_toolchain( Json(input): Json, ) -> FnResult> { Ok(Json(RegisterToolchainOutput { - name: input.id.into(), + name: input.id.to_string(), ..Default::default() })) } @@ -14,7 +14,7 @@ pub fn register_toolchain( #[plugin_fn] pub fn sync_project(Json(input): Json) -> FnResult> { let mut output = SyncOutput::default(); - let mut op = Operation::new("sync-project-test"); + let mut op = Operation::new("sync-project-test")?; if input.project.id == "b" { if let Some(file) = input.context.workspace_root.join("file.txt").virtual_path() { @@ -32,7 +32,7 @@ pub fn sync_project(Json(input): Json) -> FnResult) -> FnResult> { let mut output = SyncOutput::default(); - let mut op = Operation::new("sync-workspace-test"); + let mut op = Operation::new("sync-workspace-test")?; if let Some(file) = input.context.workspace_root.join("file.txt").virtual_path() { output.changed_files.push(file); diff --git a/website/static/schemas/project.json b/website/static/schemas/project.json index 77e9c3c0118..cc3862658c0 100644 --- a/website/static/schemas/project.json +++ b/website/static/schemas/project.json @@ -47,7 +47,7 @@ } }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } }, "id": { @@ -55,7 +55,7 @@ "description": "Overrides the ID within the project graph, as defined in the workspace projects setting.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "null" @@ -133,7 +133,7 @@ "description": "A list of tags that this project belongs to, for categorizing, boundary enforcement, and task inheritance.", "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } }, "tasks": { @@ -144,7 +144,7 @@ "$ref": "#/definitions/TaskConfig" }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } }, "toolchain": { @@ -187,7 +187,11 @@ "id": { "title": "id", "description": "ID of the depended on project.", - "type": "string" + "allOf": [ + { + "$ref": "#/definitions/Id" + } + ] }, "scope": { "title": "scope", @@ -293,6 +297,9 @@ }, "additionalProperties": false }, + "Id": { + "type": "string" + }, "Input": { "anyOf": [ { @@ -477,7 +484,7 @@ "description": "Expanded information about a project dependency.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "$ref": "#/definitions/DependencyConfig" @@ -519,7 +526,7 @@ "description": "A task within the current project for building the project.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "null" @@ -543,7 +550,7 @@ "description": "A task within the current project for starting the project.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "null" @@ -689,12 +696,12 @@ { "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } } ] @@ -711,12 +718,12 @@ { "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } } ] @@ -760,7 +767,7 @@ "$ref": "#/definitions/ProjectToolchainEntry" }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } }, "python": { @@ -832,7 +839,7 @@ "description": "Excludes inheriting tasks by ID.", "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } }, "include": { @@ -842,7 +849,7 @@ { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } }, { @@ -855,10 +862,10 @@ "description": "Renames inherited tasks to a new ID.", "type": "object", "additionalProperties": { - "type": "string" + "$ref": "#/definitions/Id" }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } } }, @@ -964,7 +971,7 @@ "description": "Extends settings from a sibling task by ID.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "null" @@ -1064,12 +1071,12 @@ "description": "List of additional toolchain(s) in which the task will be ran in. The toolchain determines available binaries, lookup paths, and more. This list will be merged with detected toolchains.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } } ] @@ -1079,12 +1086,12 @@ "description": "List of additional toolchain(s) in which the task will be ran in. The toolchain determines available binaries, lookup paths, and more. This list will be merged with detected toolchains.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } } ] diff --git a/website/static/schemas/tasks.json b/website/static/schemas/tasks.json index 579a6e88359..6cb2b885236 100644 --- a/website/static/schemas/tasks.json +++ b/website/static/schemas/tasks.json @@ -31,7 +31,7 @@ } }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } }, "implicitDeps": { @@ -70,7 +70,7 @@ "$ref": "#/definitions/TaskConfig" }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } } }, @@ -139,6 +139,9 @@ }, "additionalProperties": false }, + "Id": { + "type": "string" + }, "Input": { "anyOf": [ { @@ -254,7 +257,7 @@ "description": "Extends settings from a sibling task by ID.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "null" @@ -354,12 +357,12 @@ "description": "List of additional toolchain(s) in which the task will be ran in. The toolchain determines available binaries, lookup paths, and more. This list will be merged with detected toolchains.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } } ] @@ -369,12 +372,12 @@ "description": "List of additional toolchain(s) in which the task will be ran in. The toolchain determines available binaries, lookup paths, and more. This list will be merged with detected toolchains.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } } ] diff --git a/website/static/schemas/template.json b/website/static/schemas/template.json index 9d035ff9bd1..04c4b3a13b1 100644 --- a/website/static/schemas/template.json +++ b/website/static/schemas/template.json @@ -31,12 +31,12 @@ "description": "Extends one or many other templates.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } } ] @@ -46,7 +46,7 @@ "description": "Overrides the ID of the template, instead of using the folder name.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/Id" }, { "type": "null" @@ -73,6 +73,9 @@ }, "additionalProperties": false, "definitions": { + "Id": { + "type": "string" + }, "TemplateVariable": { "description": "Each type of template variable.", "anyOf": [ diff --git a/website/static/schemas/toolchain.json b/website/static/schemas/toolchain.json index 30cea41578d..ac63d631ed7 100644 --- a/website/static/schemas/toolchain.json +++ b/website/static/schemas/toolchain.json @@ -73,7 +73,7 @@ "$ref": "#/definitions/ToolchainPluginConfig" }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } }, "proto": { @@ -346,6 +346,9 @@ } ] }, + "Id": { + "type": "string" + }, "MoonConfig": { "description": "Configures how and where updates will be received.", "type": "object", diff --git a/website/static/schemas/workspace.json b/website/static/schemas/workspace.json index b5f4ee7127d..e65f548566e 100644 --- a/website/static/schemas/workspace.json +++ b/website/static/schemas/workspace.json @@ -65,7 +65,7 @@ "$ref": "#/definitions/ExtensionConfig" }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" }, "markdownDescription": "Configures extensions that can be executed with `moon ext`." }, @@ -246,11 +246,11 @@ "additionalProperties": { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" }, "markdownDescription": "Enforces relationships between projects based on each project's `tags` setting. Requires a mapping of tags, to acceptable tags." } @@ -516,6 +516,9 @@ "vcs" ] }, + "Id": { + "type": "string" + }, "NotifierConfig": { "description": "Configures how and where notifications are sent.", "type": "object", @@ -577,7 +580,7 @@ { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Id" } } ] @@ -1002,7 +1005,7 @@ "type": "string" }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } } ] @@ -1028,7 +1031,7 @@ "type": "string" }, "propertyNames": { - "type": "string" + "$ref": "#/definitions/Id" } } }, From 3866bd1f27497fe4f4114c051a05ab089fca0e1a Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sun, 21 Sep 2025 15:39:02 -0700 Subject: [PATCH 04/12] build: Upgrade Rust to v1.90. (#2126) Update rust. --- CHANGELOG.md | 1 + rust-toolchain.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7c67cc5313..e3712639b47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ #### ⚙️ Internal - Updated proto to [v0.53.0](https://github.com/moonrepo/proto/releases/tag/v0.53.0) (from 0.52.3). +- Updated Rust to v1.90.0. ## 1.40.5 diff --git a/rust-toolchain.toml b/rust-toolchain.toml index f637288db8a..1bbdfbd8e9d 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] profile = "default" -channel = "1.89.0" +channel = "1.90.0" From 753375edfa7bf440985d304f38b10d7f5b52cd98 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Tue, 23 Sep 2025 22:32:15 -0700 Subject: [PATCH 05/12] new: Add more task input types. (#2128) * Add new input type. * Implement affected. * Fix tests. * Add affected tests. * Update docs. * Added ^ support. * Rename enum. * Start on group input. * Rename file variant. * Rename file variant. * Fixes. * Polish. * Add expander tests. --- CHANGELOG.md | 13 + Cargo.lock | 6 +- Cargo.toml | 2 +- .../action-graph/src/action_graph_builder.rs | 10 +- crates/affected/Cargo.toml | 1 + crates/affected/src/affected.rs | 6 + crates/affected/src/affected_tracker.rs | 133 +++++++- .../__fixtures__/tasks/dep-test/moon.yml | 3 + .../tests/__fixtures__/tasks/dep/moon.yml | 5 + .../tasks/project-sources/moon.yml | 19 ++ .../affected/tests/affected_tracker_test.rs | 130 ++++++++ .../run_test__errors_for_internal_task.snap | 2 +- ...t__errors_for_unknown_task_in_project.snap | 2 +- .../snapshots/task_test__unknown_task.snap | 2 +- crates/config-schema/src/typescript_types.rs | 3 + crates/config/src/shapes/input.rs | 89 +++--- .../tests/inherited_tasks_config_test.rs | 72 ++--- crates/config/tests/input_shape_test.rs | 294 ++++++++++++++---- crates/config/tests/project_config_test.rs | 26 +- crates/config/tests/task_config_test.rs | 139 +++++++-- crates/config/tests/workspace_config_test.rs | 2 +- crates/file-group/src/file_group.rs | 7 +- crates/project/src/lib.rs | 2 + crates/project/src/project.rs | 21 ++ crates/project/src/project_error.rs | 28 ++ .../task-builder/tests/tasks_builder_test.rs | 204 ++++++------ crates/task-expander/src/task_expander.rs | 2 +- crates/task-expander/src/token_expander.rs | 167 ++++++---- .../task-expander/src/token_expander_error.rs | 8 - .../tests/token_expander_test.rs | 226 +++++++++++++- crates/task-graph/Cargo.toml | 1 + crates/task-graph/src/lib.rs | 2 - crates/task-graph/src/task_graph.rs | 7 +- crates/task-graph/src/task_graph_error.rs | 18 -- crates/workspace-graph/src/lib.rs | 14 + crates/workspace/src/workspace_builder.rs | 10 +- packages/types/src/tasks-config.ts | 28 +- website/docs/config/project.mdx | 39 ++- website/static/schemas/project.json | 91 ++++++ website/static/schemas/tasks.json | 91 ++++++ 40 files changed, 1491 insertions(+), 434 deletions(-) create mode 100644 crates/affected/tests/__fixtures__/tasks/dep-test/moon.yml create mode 100644 crates/affected/tests/__fixtures__/tasks/dep/moon.yml create mode 100644 crates/affected/tests/__fixtures__/tasks/project-sources/moon.yml create mode 100644 crates/project/src/project_error.rs delete mode 100644 crates/task-graph/src/task_graph_error.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index e3712639b47..6a453e0d4e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ ## Unreleased +#### 🚀 Updates + +- Added a new task input type that allows you to depend on changes to a project's files directly, + instead of depending on a project's task. + - Added URI support: `project://` + - Added object support: `project: ''` + - Can filter with globs or by file group. + - Can reference all project dependencies with `^`. +- Added a new task input type for referencing file groups within the owning project. + - Added URI support: `group://` + - Added object support: `group: ''` + - This is similar to the `@files`, `@globs`, etc, token functions. + #### ⚙️ Internal - Updated proto to [v0.53.0](https://github.com/moonrepo/proto/releases/tag/v0.53.0) (from 0.52.3). diff --git a/Cargo.lock b/Cargo.lock index aad38bd0f86..b773fb19f39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3885,6 +3885,7 @@ dependencies = [ "clap", "miette 7.6.0", "moon_common", + "moon_config", "moon_env_var", "moon_project", "moon_target", @@ -5060,6 +5061,7 @@ dependencies = [ "moon_common", "moon_config", "moon_graph_utils", + "moon_project", "moon_project_graph", "moon_target", "moon_task", @@ -7619,9 +7621,9 @@ dependencies = [ [[package]] name = "starbase_id" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6253f638f8eef738ee1edd63570444ebec71cd50286b0271ca8c8593bd7f29" +checksum = "b524c77e06ce0407cf6bd2c89b7c9d101e21404db405deb40af71bd3e34a018a" dependencies = [ "compact_str 0.9.0", "miette 7.6.0", diff --git a/Cargo.toml b/Cargo.toml index bce3b2cfbcd..0f5c9958c9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,7 +71,7 @@ starbase_archive = { version = "0.11.6", default-features = false, features = [ ] } starbase_console = { version = "0.6.13", features = ["miette"] } starbase_events = "0.7.3" -starbase_id = { version = "0.2.2", features = ["miette", "schematic"] } +starbase_id = { version = "0.2.3", features = ["miette", "schematic"] } starbase_sandbox = "0.9.7" starbase_shell = "0.10.2" starbase_styles = { version = "0.6.1", features = ["relative-path"] } diff --git a/crates/action-graph/src/action_graph_builder.rs b/crates/action-graph/src/action_graph_builder.rs index 2327b921393..fb0825381c8 100644 --- a/crates/action-graph/src/action_graph_builder.rs +++ b/crates/action-graph/src/action_graph_builder.rs @@ -14,11 +14,11 @@ use moon_common::{Id, color}; use moon_config::{PipelineActionSwitch, TaskDependencyConfig}; use moon_pdk_api::{DefineRequirementsInput, LocateDependenciesRootInput}; use moon_platform::{PlatformManager, Runtime, ToolchainSpec}; -use moon_project::Project; +use moon_project::{Project, ProjectError}; use moon_query::{Criteria, build_query}; use moon_task::{Target, TargetError, TargetLocator, TargetScope, Task}; use moon_task_args::parse_task_args; -use moon_workspace_graph::{GraphConnections, WorkspaceGraph, tasks::TaskGraphError}; +use moon_workspace_graph::{GraphConnections, WorkspaceGraph}; use petgraph::prelude::*; use rustc_hash::{FxHashMap, FxHashSet}; use std::mem; @@ -627,7 +627,11 @@ impl<'query> ActionGraphBuilder<'query> { // Don't allow internal tasks to be ran if !allow_internal && task.is_internal() { - return Err(TaskGraphError::UnconfiguredTarget(task.target.clone()).into()); + return Err(ProjectError::UnknownTask { + task_id: task.id.to_string(), + project_id: project_id.to_string(), + } + .into()); } tasks.push(task); diff --git a/crates/affected/Cargo.toml b/crates/affected/Cargo.toml index 8aa77f41ef8..4954b90d9df 100644 --- a/crates/affected/Cargo.toml +++ b/crates/affected/Cargo.toml @@ -10,6 +10,7 @@ publish = false [dependencies] moon_common = { path = "../common" } +moon_config = { path = "../config" } moon_env_var = { path = "../env-var" } moon_project = { path = "../project" } moon_target = { path = "../target" } diff --git a/crates/affected/src/affected.rs b/crates/affected/src/affected.rs index 35f6c032bbb..8996e9e36ae 100644 --- a/crates/affected/src/affected.rs +++ b/crates/affected/src/affected.rs @@ -120,6 +120,9 @@ pub struct AffectedTaskState { #[serde(skip_serializing_if = "FxHashSet::is_empty")] pub files: FxHashSet, + #[serde(skip_serializing_if = "FxHashSet::is_empty")] + pub projects: FxHashSet, + #[serde(skip_serializing_if = "FxHashSet::is_empty")] pub upstream: FxHashSet, @@ -147,6 +150,9 @@ impl AffectedTaskState { AffectedBy::UpstreamTask(target) => { state.upstream.insert(target); } + AffectedBy::UpstreamProject(id) => { + state.projects.insert(id); + } _ => { state.other = true; } diff --git a/crates/affected/src/affected_tracker.rs b/crates/affected/src/affected_tracker.rs index 470dda42293..fe4d3c296ca 100644 --- a/crates/affected/src/affected_tracker.rs +++ b/crates/affected/src/affected_tracker.rs @@ -1,12 +1,14 @@ use crate::affected::*; use moon_common::path::WorkspaceRelativePathBuf; use moon_common::{Id, color}; +use moon_config::Input; use moon_env_var::GlobalEnvBag; use moon_project::Project; use moon_task::{Target, Task, TaskOptionRunInCI}; use moon_workspace_graph::{GraphConnections, WorkspaceGraph}; use rustc_hash::{FxHashMap, FxHashSet}; use starbase_utils::fs; +use starbase_utils::glob::GlobSet; use std::fmt; use std::sync::Arc; use tracing::{debug, trace}; @@ -74,10 +76,11 @@ impl AffectedTracker { debug!( env = ?state.env.iter().collect::>(), files = ?state.files.iter().collect::>(), + projects = ?state.projects.iter().map(|id| id.as_str()).collect::>(), upstream = ?state.upstream.iter().map(|target| target.as_str()).collect::>(), downstream = ?state.downstream.iter().map(|target| target.as_str()).collect::>(), other = state.other, - "Task {} is affected by", color::label(&target), + "Task {} is affected by", color::id(&target), ); affected.tasks.insert(target, state); @@ -161,6 +164,59 @@ impl AffectedTracker { } } + pub fn is_project_affected_using_file_group( + &self, + project: &Project, + file_group_id: &Id, + ) -> miette::Result> { + let group = project.get_file_group(file_group_id)?; + + if !group.files.is_empty() { + for file in &group.files { + if self.touched_files.contains(file) { + return Ok(Some(AffectedBy::TouchedFile(file.to_owned()))); + } + } + } + + if !group.globs.is_empty() { + return self.is_project_affected_using_globs(project, &group.globs); + } + + Ok(None) + } + + pub fn is_project_affected_using_globs>( + &self, + project: &Project, + base_globs: &[G], + ) -> miette::Result> { + let mut globs = vec![]; + + // Ensure they are relative from the project root + for glob in base_globs { + let glob = glob.as_ref(); + + if glob.starts_with(project.source.as_str()) { + globs.push(glob.to_owned()); + } else { + globs.push(format!("{}/{glob}", project.source)); + } + } + + if !globs.is_empty() { + let globset = GlobSet::new(&globs)?; + + for file in &self.touched_files { + if globset.matches(file.as_str()) { + return Ok(Some(AffectedBy::TouchedFile(file.to_owned()))); + } + } + } + + Ok(None) + } + pub fn is_project_marked(&self, project: &Project) -> bool { self.projects.contains_key(&project.id) } @@ -332,6 +388,7 @@ impl AffectedTracker { return Ok(Some(AffectedBy::AlreadyMarked)); } + // Special CI handling if self.ci { match &task.options.run_in_ci { TaskOptionRunInCI::Always => { @@ -342,11 +399,12 @@ impl AffectedTracker { }; } - // inputs: [] + // Never affected if task.state.empty_inputs { return Ok(None); } + // By env vars if !task.input_env.is_empty() { let bag = GlobalEnvBag::instance(); @@ -359,32 +417,77 @@ impl AffectedTracker { } } + // By files let globset = task.create_globset()?; for file in self.touched_files.iter() { - let mut affected = false; - - if let Some(params) = task.input_files.get(file) { - affected = match ¶ms.content { + let affected = if let Some(params) = task.input_files.get(file) { + match ¶ms.content { Some(matcher) => { - let content = - fs::read_file(file.to_logical_path(&self.workspace_graph.root))?; + let abs_file = file.to_logical_path(&self.workspace_graph.root); - matcher.is_match(&content) + if abs_file.exists() { + matcher.is_match(&fs::read_file(abs_file)?) + } else { + false + } } None => true, - }; - } - - if !affected { - affected = globset.matches(file.as_str()); - } + } + } else { + globset.matches(file.as_str()) + }; if affected { return Ok(Some(AffectedBy::TouchedFile(file.to_owned()))); } } + // By other inputs + let mut has_all_project_sources = false; + + for input in &task.inputs { + match input { + Input::Project(inner) => { + if has_all_project_sources { + continue; + } + + let projects = if inner.project == "^" { + has_all_project_sources = true; + + let parent = self + .workspace_graph + .get_project(task.target.get_project_id()?)?; + + self.workspace_graph + .get_projects_by_id(parent.dependencies.iter().map(|dep| &dep.id))? + } else { + vec![self.workspace_graph.get_project(&inner.project)?] + }; + + for project in projects { + let affected = if let Some(group_id) = &inner.group { + self.is_project_affected_using_file_group(&project, group_id)? + .is_some() + } else if !inner.filter.is_empty() { + self.is_project_affected_using_globs(&project, &inner.filter)? + .is_some() + } else { + self.is_project_affected(&project).is_some() + }; + + if affected { + return Ok(Some(AffectedBy::UpstreamProject(project.id.clone()))); + } + } + } + _ => { + // Skip + } + }; + } + Ok(None) } diff --git a/crates/affected/tests/__fixtures__/tasks/dep-test/moon.yml b/crates/affected/tests/__fixtures__/tasks/dep-test/moon.yml new file mode 100644 index 00000000000..0e3fe865165 --- /dev/null +++ b/crates/affected/tests/__fixtures__/tasks/dep-test/moon.yml @@ -0,0 +1,3 @@ +fileGroups: + tests: + - 'tests/**/*' diff --git a/crates/affected/tests/__fixtures__/tasks/dep/moon.yml b/crates/affected/tests/__fixtures__/tasks/dep/moon.yml new file mode 100644 index 00000000000..33197d427c5 --- /dev/null +++ b/crates/affected/tests/__fixtures__/tasks/dep/moon.yml @@ -0,0 +1,5 @@ +fileGroups: + sources: + - 'src/**/*' + tests: + - 'tests/**/*' diff --git a/crates/affected/tests/__fixtures__/tasks/project-sources/moon.yml b/crates/affected/tests/__fixtures__/tasks/project-sources/moon.yml new file mode 100644 index 00000000000..8de7507160b --- /dev/null +++ b/crates/affected/tests/__fixtures__/tasks/project-sources/moon.yml @@ -0,0 +1,19 @@ +dependsOn: + - 'dep' + - 'dep-test' + +tasks: + by-any: + inputs: + - 'project://dep' + by-deps: + inputs: + - project: '^' + group: 'tests' + by-group: + inputs: + - project: 'dep' + group: 'sources' + by-filter: + inputs: + - 'project://dep?filter=tests/**/*' diff --git a/crates/affected/tests/affected_tracker_test.rs b/crates/affected/tests/affected_tracker_test.rs index a5ef89aeea2..f9e8c5d04b8 100644 --- a/crates/affected/tests/affected_tracker_test.rs +++ b/crates/affected/tests/affected_tracker_test.rs @@ -1015,6 +1015,136 @@ mod affected_tasks { } } + mod project_sources { + use super::*; + + fn create_project_dep_state() -> AffectedTaskState { + let mut state = AffectedTaskState::default(); + state.projects.insert(Id::raw("dep")); + state + } + + #[tokio::test] + async fn any_file() { + let workspace_graph = build_graph("tasks").await; + let touched_files = FxHashSet::from_iter(["dep/file.txt".into()]); + + let mut tracker = AffectedTracker::new(workspace_graph.into(), touched_files); + tracker.with_task_scopes(UpstreamScope::None, DownstreamScope::Deep); + tracker.track_tasks().unwrap(); + let affected = tracker.build(); + + assert_eq!( + affected.tasks, + FxHashMap::from_iter([ + ( + Target::parse("project-sources:by-any").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("dep:global").unwrap(), + create_state_from_file("dep/file.txt") + ), + ]) + ); + } + + #[tokio::test] + async fn using_file_group() { + let workspace_graph = build_graph("tasks").await; + let touched_files = FxHashSet::from_iter(["dep/src/file.txt".into()]); + + let mut tracker = AffectedTracker::new(workspace_graph.into(), touched_files); + tracker.with_task_scopes(UpstreamScope::None, DownstreamScope::Deep); + tracker.track_tasks().unwrap(); + let affected = tracker.build(); + + assert_eq!( + affected.tasks, + FxHashMap::from_iter([ + ( + Target::parse("project-sources:by-group").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("project-sources:by-any").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("dep:global").unwrap(), + create_state_from_file("dep/src/file.txt") + ), + ]) + ); + } + + #[tokio::test] + async fn using_filter_glob() { + let workspace_graph = build_graph("tasks").await; + let touched_files = FxHashSet::from_iter(["dep/tests/file.txt".into()]); + + let mut tracker = AffectedTracker::new(workspace_graph.into(), touched_files); + tracker.with_task_scopes(UpstreamScope::None, DownstreamScope::Deep); + tracker.track_tasks().unwrap(); + let affected = tracker.build(); + + assert_eq!( + affected.tasks, + FxHashMap::from_iter([ + ( + Target::parse("project-sources:by-filter").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("project-sources:by-any").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("project-sources:by-deps").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("dep:global").unwrap(), + create_state_from_file("dep/tests/file.txt") + ), + ]) + ); + } + + #[tokio::test] + async fn using_project_deps() { + let workspace_graph = build_graph("tasks").await; + let touched_files = FxHashSet::from_iter(["dep/tests/file.txt".into()]); + + let mut tracker = AffectedTracker::new(workspace_graph.into(), touched_files); + tracker.with_task_scopes(UpstreamScope::None, DownstreamScope::Deep); + tracker.track_tasks().unwrap(); + let affected = tracker.build(); + + assert_eq!( + affected.tasks, + FxHashMap::from_iter([ + ( + Target::parse("project-sources:by-filter").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("project-sources:by-any").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("project-sources:by-deps").unwrap(), + create_project_dep_state() + ), + ( + Target::parse("dep:global").unwrap(), + create_state_from_file("dep/tests/file.txt") + ), + ]) + ); + } + } + mod ci { use super::*; diff --git a/crates/cli/tests/snapshots/run_test__errors_for_internal_task.snap b/crates/cli/tests/snapshots/run_test__errors_for_internal_task.snap index 93b80183698..d71eb33052d 100644 --- a/crates/cli/tests/snapshots/run_test__errors_for_internal_task.snap +++ b/crates/cli/tests/snapshots/run_test__errors_for_internal_task.snap @@ -2,7 +2,7 @@ source: crates/cli/tests/run_test.rs expression: assert.output() --- -Error: task_graph::unknown_target +Error: project::unknown_task × Unknown task internalOnly for project base. help: Has this task been configured? diff --git a/crates/cli/tests/snapshots/run_test__errors_for_unknown_task_in_project.snap b/crates/cli/tests/snapshots/run_test__errors_for_unknown_task_in_project.snap index cd0adcb28d5..981c2dcfb40 100644 --- a/crates/cli/tests/snapshots/run_test__errors_for_unknown_task_in_project.snap +++ b/crates/cli/tests/snapshots/run_test__errors_for_unknown_task_in_project.snap @@ -2,7 +2,7 @@ source: crates/cli/tests/run_test.rs expression: assert.output() --- -Error: task_graph::unknown_target +Error: project::unknown_task × Unknown task unknown for project base. help: Has this task been configured? diff --git a/crates/cli/tests/snapshots/task_test__unknown_task.snap b/crates/cli/tests/snapshots/task_test__unknown_task.snap index d30f0b7e950..8aa37c96a64 100644 --- a/crates/cli/tests/snapshots/task_test__unknown_task.snap +++ b/crates/cli/tests/snapshots/task_test__unknown_task.snap @@ -2,7 +2,7 @@ source: crates/cli/tests/task_test.rs expression: get_assert_stderr_output(&assert.inner) --- -Error: task_graph::unknown_target +Error: project::unknown_task × Unknown task unknown for project tasks. help: Has this task been configured? diff --git a/crates/config-schema/src/typescript_types.rs b/crates/config-schema/src/typescript_types.rs index 5c238f60d47..963e36a72fa 100644 --- a/crates/config-schema/src/typescript_types.rs +++ b/crates/config-schema/src/typescript_types.rs @@ -19,7 +19,10 @@ fn generate_project(out_dir: &Path) -> miette::Result<()> { "Id".into(), "Input".into(), "FileInput".into(), + "FileGroupInput".into(), + "FileGroupInputFormat".into(), "GlobInput".into(), + "ProjectInput".into(), "PartialTaskArgs".into(), "PartialTaskConfig".into(), "PartialTaskDependency".into(), diff --git a/crates/config/src/shapes/input.rs b/crates/config/src/shapes/input.rs index d552c5b6f86..335205c60c4 100644 --- a/crates/config/src/shapes/input.rs +++ b/crates/config/src/shapes/input.rs @@ -276,10 +276,11 @@ impl ManifestDepsInput { } config_struct!( - /// An external project's sources input. + /// An external project input. #[derive(Config)] - pub struct ProjectSourcesInput { - pub project: Id, + pub struct ProjectInput { + // This is not an `Id` as we need to support "^". + pub project: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub filter: Vec, @@ -289,13 +290,15 @@ config_struct!( } ); -impl ProjectSourcesInput { +impl ProjectInput { pub fn from_uri(uri: Uri) -> Result { let mut input = Self { project: if uri.path.is_empty() { return Err(ParseError::new("a project identifier is required")); + } else if uri.path == "^" { + uri.path } else { - Id::new(&uri.path).map_err(map_parse_error)? + Id::new(&uri.path).map_err(map_parse_error)?.to_string() }, ..Default::default() }; @@ -322,23 +325,21 @@ impl ProjectSourcesInput { } } -/// The different patterns a task input can be defined. +/// The different patterns a task input can be defined as. #[derive(Clone, Debug, Eq, PartialEq, Deserialize)] #[serde(try_from = "InputBase")] pub enum Input { EnvVar(String), EnvVarGlob(String), - ProjectFile(FileInput), - ProjectGlob(GlobInput), - WorkspaceFile(FileInput), - WorkspaceGlob(GlobInput), + File(FileInput), + FileGroup(FileGroupInput), + Glob(GlobInput), + Project(ProjectInput), // Old TokenFunc(String), TokenVar(String), // New - // FileGroup(FileGroupInput), // ManifestDeps(ManifestDepsInput), - // ProjectSources(ProjectSourcesInput), } impl Input { @@ -368,16 +369,15 @@ impl Input { | Self::EnvVarGlob(value) | Self::TokenFunc(value) | Self::TokenVar(value) => value, - Self::ProjectFile(value) | Self::WorkspaceFile(value) => value.file.as_str(), - Self::ProjectGlob(value) | Self::WorkspaceGlob(value) => value.glob.as_str(), + Self::File(value) => value.file.as_str(), + Self::FileGroup(value) => value.group.as_str(), + Self::Glob(value) => value.glob.as_str(), + Self::Project(value) => value.project.as_str(), } } pub fn is_glob(&self) -> bool { - matches!( - self, - Self::EnvVarGlob(_) | Self::ProjectGlob(_) | Self::WorkspaceGlob(_) - ) + matches!(self, Self::EnvVarGlob(_) | Self::Glob(_)) } } @@ -405,24 +405,12 @@ impl FromStr for Input { let uri = Self::create_uri(value)?; match uri.scheme.as_str() { - "file" => { - let file = FileInput::from_uri(uri)?; - - Ok(if file.is_workspace_relative() { - Self::WorkspaceFile(file) - } else { - Self::ProjectFile(file) - }) - } - "glob" => { - let glob = GlobInput::from_uri(uri)?; - - Ok(if glob.is_workspace_relative() { - Self::WorkspaceGlob(glob) - } else { - Self::ProjectGlob(glob) - }) + "file" => Ok(Self::File(FileInput::from_uri(uri)?)), + "glob" => Ok(Self::Glob(GlobInput::from_uri(uri)?)), + "group" | "filegroup" | "fileGroup" => { + Ok(Self::FileGroup(FileGroupInput::from_uri(uri)?)) } + "project" => Ok(Self::Project(ProjectInput::from_uri(uri)?)), other => Err(ParseError::new(format!( "input protocol `{other}://` is not supported" ))), @@ -436,16 +424,10 @@ impl TryFrom for Input { fn try_from(base: InputBase) -> Result { match base { InputBase::Raw(input) => Self::parse(input), - InputBase::File(input) => Ok(if input.is_workspace_relative() { - Self::WorkspaceFile(input) - } else { - Self::ProjectFile(input) - }), - InputBase::Glob(input) => Ok(if input.is_workspace_relative() { - Self::WorkspaceGlob(input) - } else { - Self::ProjectGlob(input) - }), + InputBase::File(input) => Ok(Self::File(input)), + InputBase::FileGroup(input) => Ok(Self::FileGroup(input)), + InputBase::Glob(input) => Ok(Self::Glob(input)), + InputBase::Project(input) => Ok(Self::Project(input)), } } } @@ -459,7 +441,9 @@ impl Schematic for Input { schema.union(UnionType::new_any([ schema.infer::(), schema.infer::(), + schema.infer::(), schema.infer::(), + schema.infer::(), ])) } } @@ -474,13 +458,11 @@ impl Serialize for Input { serializer.serialize_str(format!("${var}").as_str()) } Input::TokenFunc(token) | Input::TokenVar(token) => serializer.serialize_str(token), - // Input::FileGroup(input) => FileGroupInput::serialize(input, serializer), + Input::File(input) => FileInput::serialize(input, serializer), + Input::FileGroup(input) => FileGroupInput::serialize(input, serializer), // Input::ManifestDeps(input) => ManifestDepsInput::serialize(input, serializer), - Input::ProjectFile(input) => FileInput::serialize(input, serializer), - Input::ProjectGlob(input) => GlobInput::serialize(input, serializer), - // Input::ProjectSources(input) => ProjectSourcesInput::serialize(input, serializer), - Input::WorkspaceFile(input) => FileInput::serialize(input, serializer), - Input::WorkspaceGlob(input) => GlobInput::serialize(input, serializer), + Input::Glob(input) => GlobInput::serialize(input, serializer), + Input::Project(input) => ProjectInput::serialize(input, serializer), } } } @@ -488,10 +470,13 @@ impl Serialize for Input { #[derive(Deserialize)] #[serde( untagged, - expecting = "expected a file path, glob pattern, URI, or object" + expecting = "expected a file path, glob pattern, URI string, or object" )] enum InputBase { Raw(String), + // From most complex to least + Project(ProjectInput), + FileGroup(FileGroupInput), File(FileInput), Glob(GlobInput), } diff --git a/crates/config/tests/inherited_tasks_config_test.rs b/crates/config/tests/inherited_tasks_config_test.rs index e5841be97ab..65716812a2d 100644 --- a/crates/config/tests/inherited_tasks_config_test.rs +++ b/crates/config/tests/inherited_tasks_config_test.rs @@ -84,7 +84,7 @@ tasks: Id::raw("inputs"), TaskConfig { command: TaskArgs::String("d".to_owned()), - inputs: Some(vec![Input::ProjectGlob(create_glob_input("src/**/*"))]), + inputs: Some(vec![Input::Glob(create_glob_input("src/**/*"))]), ..TaskConfig::default() }, ), @@ -114,11 +114,11 @@ tasks: FxHashMap::from_iter([ ( Id::raw("tests"), - vec![Input::ProjectGlob(create_glob_input("tests/**/*"))] + vec![Input::Glob(create_glob_input("tests/**/*"))] ), ( Id::raw("sources"), - vec![Input::ProjectGlob(create_glob_input("sources/**/*"))] + vec![Input::Glob(create_glob_input("sources/**/*"))] ), ]) ); @@ -177,15 +177,15 @@ fileGroups: FxHashMap::from_iter([ ( Id::raw("tests"), - vec![Input::ProjectGlob(create_glob_input("tests/**/*"))] + vec![Input::Glob(create_glob_input("tests/**/*"))] ), ( Id::raw("sources"), - vec![Input::ProjectGlob(create_glob_input("sources/**/*"))] + vec![Input::Glob(create_glob_input("sources/**/*"))] ), ( Id::raw("configs"), - vec![Input::WorkspaceGlob(create_glob_input("/*.js"))] + vec![Input::Glob(create_glob_input("/*.js"))] ), ]) ); @@ -229,15 +229,15 @@ fileGroups: FxHashMap::from_iter([ ( Id::raw("tests"), - vec![Input::ProjectGlob(create_glob_input("tests/**/*"))] + vec![Input::Glob(create_glob_input("tests/**/*"))] ), ( Id::raw("sources"), - vec![Input::ProjectGlob(create_glob_input("sources/**/*"))] + vec![Input::Glob(create_glob_input("sources/**/*"))] ), ( Id::raw("configs"), - vec![Input::WorkspaceGlob(create_glob_input("/*.js"))] + vec![Input::Glob(create_glob_input("/*.js"))] ), ]) ); @@ -302,17 +302,17 @@ fileGroups: ( Id::raw("files"), vec![ - Input::WorkspaceFile(create_file_input("/ws/relative")), - Input::ProjectFile(create_file_input("proj/relative")) + Input::File(create_file_input("/ws/relative")), + Input::File(create_file_input("proj/relative")) ] ), ( Id::raw("globs"), vec![ - Input::WorkspaceGlob(create_glob_input("/ws/**/*")), - Input::WorkspaceGlob(create_glob_input("!/ws/**/*")), - Input::ProjectGlob(create_glob_input("proj/**/*")), - Input::ProjectGlob(create_glob_input("!proj/**/*")), + Input::Glob(create_glob_input("/ws/**/*")), + Input::Glob(create_glob_input("!/ws/**/*")), + Input::Glob(create_glob_input("proj/**/*")), + Input::Glob(create_glob_input("!proj/**/*")), ] ), ]) @@ -449,12 +449,12 @@ implicitInputs: assert_eq!( config.implicit_inputs, vec![ - Input::WorkspaceFile(create_file_input("/ws/path")), - Input::WorkspaceGlob(create_glob_input("/ws/glob/**/*")), - Input::WorkspaceGlob(create_glob_input("!/ws/glob/**/*")), - Input::ProjectFile(create_file_input("proj/path")), - Input::ProjectGlob(create_glob_input("proj/glob/{a,b,c}")), - Input::ProjectGlob(create_glob_input("!proj/glob/{a,b,c}")), + Input::File(create_file_input("/ws/path")), + Input::Glob(create_glob_input("/ws/glob/**/*")), + Input::Glob(create_glob_input("!/ws/glob/**/*")), + Input::File(create_file_input("proj/path")), + Input::Glob(create_glob_input("proj/glob/{a,b,c}")), + Input::Glob(create_glob_input("!proj/glob/{a,b,c}")), ] ); } @@ -475,7 +475,7 @@ implicitInputs: config.implicit_inputs, vec![ Input::EnvVar("FOO_BAR".into()), - Input::ProjectFile(create_file_input("file/path")), + Input::File(create_file_input("file/path")), ] ); } @@ -490,7 +490,7 @@ mod task_manager { if command != "global" { // No .moon prefix since the fixture is contrived - global_inputs.push(Input::WorkspaceFile(create_file_input(format!( + global_inputs.push(Input::File(create_file_input(format!( "/tasks/{command}.yml" )))); } @@ -1032,7 +1032,7 @@ mod task_manager { let manager = load_manager_from_root(sandbox.path(), sandbox.path()).unwrap(); let mut task = stub_task("node-library", vec![Id::raw("node"), Id::raw("javascript")]); - task.inputs = Some(vec![Input::ProjectFile(create_file_input("c"))]); + task.inputs = Some(vec![Input::File(create_file_input("c"))]); let config = manager .get_inherited_config( @@ -1058,7 +1058,7 @@ mod task_manager { "dotnet-application", vec![Id::raw("dotnet"), Id::raw("system")], ); - task.inputs = Some(vec![Input::ProjectFile(create_file_input("c"))]); + task.inputs = Some(vec![Input::File(create_file_input("c"))]); let config = manager .get_inherited_config( @@ -1139,13 +1139,13 @@ mod task_manager { file_groups: FxHashMap::from_iter([ ( Id::raw("sources"), - vec![Input::ProjectGlob(create_glob_input("src/**/*"))] + vec![Input::Glob(create_glob_input("src/**/*"))] ), ( Id::raw("tests"), vec![ - Input::ProjectGlob(create_glob_input("*.test.ts")), - Input::ProjectGlob(create_glob_input("*.test.tsx")) + Input::Glob(create_glob_input("*.test.ts")), + Input::Glob(create_glob_input("*.test.tsx")) ] ), ]), @@ -1167,10 +1167,10 @@ mod task_manager { implicit_inputs: vec![ Input::EnvVar("ENV".into()), Input::EnvVarGlob("ENV_*".into()), - Input::ProjectFile(create_file_input("file.txt")), - Input::ProjectGlob(create_glob_input("file.*")), - Input::WorkspaceFile(create_file_input("/file.txt")), - Input::WorkspaceGlob(create_glob_input("/file.*")), + Input::File(create_file_input("file.txt")), + Input::Glob(create_glob_input("file.*")), + Input::File(create_file_input("/file.txt")), + Input::Glob(create_glob_input("/file.*")), ], task_options: Some(TaskOptionsConfig { affected_files: Some(TaskOptionAffectedFiles::Args), @@ -1270,8 +1270,8 @@ mod task_manager { Id::raw("lint"), TaskConfig { inputs: Some(vec![ - Input::ProjectGlob(create_glob_input("**/*.graphql")), - Input::ProjectGlob(create_glob_input("src/**/*")), + Input::Glob(create_glob_input("**/*.graphql")), + Input::Glob(create_glob_input("src/**/*")), ]), ..Default::default() } @@ -1280,8 +1280,8 @@ mod task_manager { Id::raw("test"), TaskConfig { inputs: Some(vec![ - Input::ProjectGlob(create_glob_input("src/**/*")), - Input::ProjectGlob(create_glob_input("tests/**/*")), + Input::Glob(create_glob_input("src/**/*")), + Input::Glob(create_glob_input("tests/**/*")), ]), ..Default::default() } diff --git a/crates/config/tests/input_shape_test.rs b/crates/config/tests/input_shape_test.rs index 4a1bc5dcbf5..2c5574a5904 100644 --- a/crates/config/tests/input_shape_test.rs +++ b/crates/config/tests/input_shape_test.rs @@ -1,6 +1,7 @@ +use moon_common::Id; use moon_config::{ FileGroupInput, FileGroupInputFormat, GlobInput, GlobPath, Input, ManifestDepsInput, - ProjectSourcesInput, Uri, test_utils::*, + ProjectInput, Uri, test_utils::*, }; use schematic::RegexSetting; @@ -14,7 +15,7 @@ mod input_shape { fn converts_backward_slashes() { assert_eq!( Input::parse("some\\file.txt").unwrap(), - Input::ProjectFile(create_file_input("some/file.txt")) + Input::File(create_file_input("some/file.txt")) ); } @@ -78,7 +79,7 @@ mod input_shape { assert_eq!( Input::parse("file://file.txt?optional").unwrap(), - Input::ProjectFile(input) + Input::File(input) ); let mut input = create_file_input("/file.txt"); @@ -86,7 +87,7 @@ mod input_shape { assert_eq!( Input::parse("file:///file.txt?optional=false").unwrap(), - Input::WorkspaceFile(input) + Input::File(input) ); } @@ -94,19 +95,19 @@ mod input_shape { fn file_project_relative() { assert_eq!( Input::parse("file.rs").unwrap(), - Input::ProjectFile(create_file_input("file.rs")) + Input::File(create_file_input("file.rs")) ); assert_eq!( Input::parse("dir/file.rs").unwrap(), - Input::ProjectFile(create_file_input("dir/file.rs")) + Input::File(create_file_input("dir/file.rs")) ); assert_eq!( Input::parse("./file.rs").unwrap(), - Input::ProjectFile(create_file_input("file.rs")) + Input::File(create_file_input("file.rs")) ); assert_eq!( Input::parse("././dir/file.rs").unwrap(), - Input::ProjectFile(create_file_input("dir/file.rs")) + Input::File(create_file_input("dir/file.rs")) ); } @@ -114,19 +115,19 @@ mod input_shape { fn file_project_relative_protocol() { assert_eq!( Input::parse("file://file.rs").unwrap(), - Input::ProjectFile(create_file_input("file.rs")) + Input::File(create_file_input("file.rs")) ); assert_eq!( Input::parse("file://dir/file.rs").unwrap(), - Input::ProjectFile(create_file_input("dir/file.rs")) + Input::File(create_file_input("dir/file.rs")) ); assert_eq!( Input::parse("file://./file.rs").unwrap(), - Input::ProjectFile(create_file_input("file.rs")) + Input::File(create_file_input("file.rs")) ); assert_eq!( Input::parse("file://././dir/file.rs").unwrap(), - Input::ProjectFile(create_file_input("dir/file.rs")) + Input::File(create_file_input("dir/file.rs")) ); } @@ -134,17 +135,17 @@ mod input_shape { fn file_workspace_relative() { assert_eq!( Input::parse("/file.rs").unwrap(), - Input::WorkspaceFile(create_file_input("/file.rs")) + Input::File(create_file_input("/file.rs")) ); assert_eq!( Input::parse("/dir/file.rs").unwrap(), - Input::WorkspaceFile(create_file_input("/dir/file.rs")) + Input::File(create_file_input("/dir/file.rs")) ); // With tokens assert_eq!( Input::parse("/.cache/$projectSource").unwrap(), - Input::WorkspaceFile(create_file_input("/.cache/$projectSource")) + Input::File(create_file_input("/.cache/$projectSource")) ); } @@ -152,17 +153,17 @@ mod input_shape { fn file_workspace_relative_protocol() { assert_eq!( Input::parse("file:///file.rs").unwrap(), - Input::WorkspaceFile(create_file_input("/file.rs")) + Input::File(create_file_input("/file.rs")) ); assert_eq!( Input::parse("file:///dir/file.rs").unwrap(), - Input::WorkspaceFile(create_file_input("/dir/file.rs")) + Input::File(create_file_input("/dir/file.rs")) ); // With tokens assert_eq!( Input::parse("file:///.cache/$projectSource").unwrap(), - Input::WorkspaceFile(create_file_input("/.cache/$projectSource")) + Input::File(create_file_input("/.cache/$projectSource")) ); } @@ -173,7 +174,7 @@ mod input_shape { assert_eq!( Input::parse("glob://file.*?cache").unwrap(), - Input::ProjectGlob(input) + Input::Glob(input) ); let mut input = create_glob_input("/file.*"); @@ -181,7 +182,7 @@ mod input_shape { assert_eq!( Input::parse("glob:///file.*?cache=false").unwrap(), - Input::WorkspaceGlob(input) + Input::Glob(input) ); } @@ -203,22 +204,22 @@ mod input_shape { input.cache = true; assert_eq!( - Input::ProjectGlob(GlobInput { + Input::Glob(GlobInput { glob: GlobPath(pat.into()), cache: true }), - Input::ProjectGlob(input) + Input::Glob(input) ); let mut input = create_glob_input(pat); input.cache = false; assert_eq!( - Input::ProjectGlob(GlobInput { + Input::Glob(GlobInput { glob: GlobPath(pat.into()), cache: false }), - Input::ProjectGlob(input) + Input::Glob(input) ); } } @@ -227,21 +228,21 @@ mod input_shape { fn glob_project_relative() { assert_eq!( Input::parse("!file.*").unwrap(), - Input::ProjectGlob(create_glob_input("!file.*")) + Input::Glob(create_glob_input("!file.*")) ); assert_eq!( Input::parse("dir/**/*").unwrap(), - Input::ProjectGlob(create_glob_input("dir/**/*")) + Input::Glob(create_glob_input("dir/**/*")) ); assert_eq!( Input::parse("./dir/**/*").unwrap(), - Input::ProjectGlob(create_glob_input("dir/**/*")) + Input::Glob(create_glob_input("dir/**/*")) ); // With tokens assert_eq!( Input::parse("$projectSource/**/*").unwrap(), - Input::ProjectGlob(create_glob_input("$projectSource/**/*")) + Input::Glob(create_glob_input("$projectSource/**/*")) ); } @@ -249,21 +250,21 @@ mod input_shape { fn glob_project_relative_protocol() { assert_eq!( Input::parse("glob://!file.*").unwrap(), - Input::ProjectGlob(create_glob_input("!file.*")) + Input::Glob(create_glob_input("!file.*")) ); assert_eq!( Input::parse("glob://dir/**/*").unwrap(), - Input::ProjectGlob(create_glob_input("dir/**/*")) + Input::Glob(create_glob_input("dir/**/*")) ); assert_eq!( Input::parse("glob://./dir/**/*").unwrap(), - Input::ProjectGlob(create_glob_input("dir/**/*")) + Input::Glob(create_glob_input("dir/**/*")) ); // With tokens assert_eq!( Input::parse("glob://$projectSource/**/*").unwrap(), - Input::ProjectGlob(create_glob_input("$projectSource/**/*")) + Input::Glob(create_glob_input("$projectSource/**/*")) ); } @@ -271,15 +272,15 @@ mod input_shape { fn glob_workspace_relative() { assert_eq!( Input::parse("/!file.*").unwrap(), - Input::WorkspaceGlob(create_glob_input("!/file.*")) + Input::Glob(create_glob_input("!/file.*")) ); assert_eq!( Input::parse("!/file.*").unwrap(), - Input::WorkspaceGlob(create_glob_input("!/file.*")) + Input::Glob(create_glob_input("!/file.*")) ); assert_eq!( Input::parse("/dir/**/*").unwrap(), - Input::WorkspaceGlob(create_glob_input("/dir/**/*")) + Input::Glob(create_glob_input("/dir/**/*")) ); } @@ -287,15 +288,94 @@ mod input_shape { fn glob_workspace_relative_protocol() { assert_eq!( Input::parse("glob:///!file.*").unwrap(), - Input::WorkspaceGlob(create_glob_input("!/file.*")) + Input::Glob(create_glob_input("!/file.*")) ); assert_eq!( Input::parse("glob://!/file.*").unwrap(), - Input::WorkspaceGlob(create_glob_input("!/file.*")) + Input::Glob(create_glob_input("!/file.*")) ); assert_eq!( Input::parse("glob:///dir/**/*").unwrap(), - Input::WorkspaceGlob(create_glob_input("/dir/**/*")) + Input::Glob(create_glob_input("/dir/**/*")) + ); + } + + #[test] + fn file_group_protocol() { + assert_eq!( + Input::parse("group://sources").unwrap(), + Input::FileGroup(FileGroupInput { + group: Id::raw("sources"), + ..Default::default() + }) + ); + assert_eq!( + Input::parse("group://sources?format=dirs").unwrap(), + Input::FileGroup(FileGroupInput { + group: Id::raw("sources"), + format: FileGroupInputFormat::Dirs, + }) + ); + assert_eq!( + Input::parse("group://sources?as=root").unwrap(), + Input::FileGroup(FileGroupInput { + group: Id::raw("sources"), + format: FileGroupInputFormat::Root, + }) + ); + } + + #[test] + fn project_protocol() { + assert_eq!( + Input::parse("project://app").unwrap(), + Input::Project(ProjectInput { + project: "app".into(), + ..Default::default() + }) + ); + assert_eq!( + Input::parse("project://app?filter=src/**&filter=!tests/**/*").unwrap(), + Input::Project(ProjectInput { + project: "app".into(), + filter: vec!["src/**".into(), "!tests/**/*".into()], + ..Default::default() + }) + ); + assert_eq!( + Input::parse("project://app?group=sources").unwrap(), + Input::Project(ProjectInput { + project: "app".into(), + group: Some(Id::raw("sources")), + ..Default::default() + }) + ); + } + + #[test] + fn project_protocol_all() { + assert_eq!( + Input::parse("project://^").unwrap(), + Input::Project(ProjectInput { + project: "^".into(), + ..Default::default() + }) + ); + assert_eq!( + Input::parse("project://^?filter=src/**&filter=!tests/**/*").unwrap(), + Input::Project(ProjectInput { + project: "^".into(), + filter: vec!["src/**".into(), "!tests/**/*".into()], + ..Default::default() + }) + ); + assert_eq!( + Input::parse("project://^?group=sources").unwrap(), + Input::Project(ProjectInput { + project: "^".into(), + group: Some(Id::raw("sources")), + ..Default::default() + }) ); } @@ -325,18 +405,18 @@ mod input_shape { fn files() { let input: Input = serde_json::from_str(r#""file.txt""#).unwrap(); - assert_eq!(input, Input::ProjectFile(create_file_input("file.txt"))); + assert_eq!(input, Input::File(create_file_input("file.txt"))); let input: Input = serde_json::from_str(r#"{ "file": "file.txt" }"#).unwrap(); - assert_eq!(input, Input::ProjectFile(create_file_input("file.txt"))); + assert_eq!(input, Input::File(create_file_input("file.txt"))); let input: Input = serde_json::from_str(r#"{ "file": "dir/file.txt", "optional": true }"#).unwrap(); assert_eq!( input, - Input::ProjectFile({ + Input::File({ let mut inner = create_file_input("dir/file.txt"); inner.optional = Some(true); inner @@ -350,7 +430,7 @@ mod input_shape { assert_eq!( input, - Input::WorkspaceFile({ + Input::File({ let mut inner = create_file_input("/root/file.txt"); inner.optional = Some(true); inner.content = Some(RegexSetting::new("a|b|c").unwrap()); @@ -363,18 +443,18 @@ mod input_shape { fn globs() { let input: Input = serde_json::from_str(r#""file.*""#).unwrap(); - assert_eq!(input, Input::ProjectGlob(create_glob_input("file.*"))); + assert_eq!(input, Input::Glob(create_glob_input("file.*"))); let input: Input = serde_json::from_str(r#"{ "glob": "file.*" }"#).unwrap(); - assert_eq!(input, Input::ProjectGlob(create_glob_input("file.*"))); + assert_eq!(input, Input::Glob(create_glob_input("file.*"))); let input: Input = serde_json::from_str(r#"{ "glob": "/dir/file.*", "cache": false }"#).unwrap(); assert_eq!( input, - Input::WorkspaceGlob({ + Input::Glob({ let mut inner = create_glob_input("/dir/file.*"); inner.cache = false; inner @@ -393,6 +473,108 @@ mod input_shape { fn errors_for_parent_traversal_inner() { let _: Input = serde_json::from_str(r#"{ "glob": "dir/../../file.*" }"#).unwrap(); } + + #[test] + fn file_group() { + let input: Input = serde_json::from_str(r#"{ "group": "sources" }"#).unwrap(); + + assert_eq!( + input, + Input::FileGroup(FileGroupInput { + group: Id::raw("sources"), + ..Default::default() + }) + ); + + let input: Input = + serde_json::from_str(r#"{ "group": "sources", "format": "files" }"#).unwrap(); + + assert_eq!( + input, + Input::FileGroup(FileGroupInput { + group: Id::raw("sources"), + format: FileGroupInputFormat::Files, + }) + ); + } + + #[test] + fn project_sources() { + let input: Input = serde_json::from_str(r#"{ "project": "app" }"#).unwrap(); + + assert_eq!( + input, + Input::Project(ProjectInput { + project: "app".into(), + ..Default::default() + }) + ); + + let input: Input = + serde_json::from_str(r#"{ "project": "app", "group": "sources" }"#).unwrap(); + + assert_eq!( + input, + Input::Project(ProjectInput { + project: "app".into(), + group: Some(Id::raw("sources")), + ..Default::default() + }) + ); + + let input: Input = serde_json::from_str( + r#"{ "project": "app", "group": "sources", "filter": ["src/**/*"] }"#, + ) + .unwrap(); + + assert_eq!( + input, + Input::Project(ProjectInput { + project: "app".into(), + group: Some(Id::raw("sources")), + filter: vec!["src/**/*".into()], + }) + ); + } + + #[test] + fn project_sources_all() { + let input: Input = serde_json::from_str(r#"{ "project": "^" }"#).unwrap(); + + assert_eq!( + input, + Input::Project(ProjectInput { + project: "^".into(), + ..Default::default() + }) + ); + + let input: Input = + serde_json::from_str(r#"{ "project": "^", "group": "sources" }"#).unwrap(); + + assert_eq!( + input, + Input::Project(ProjectInput { + project: "^".into(), + group: Some(Id::raw("sources")), + ..Default::default() + }) + ); + + let input: Input = serde_json::from_str( + r#"{ "project": "^", "group": "sources", "filter": ["src/**/*"] }"#, + ) + .unwrap(); + + assert_eq!( + input, + Input::Project(ProjectInput { + project: "^".into(), + group: Some(Id::raw("sources")), + filter: vec!["src/**/*".into()], + }) + ); + } } mod file { @@ -695,8 +877,7 @@ mod input_shape { #[test] fn id() { - let input = - ProjectSourcesInput::from_uri(Uri::parse("project://app").unwrap()).unwrap(); + let input = ProjectInput::from_uri(Uri::parse("project://app").unwrap()).unwrap(); assert_eq!(input.project, "app"); } @@ -704,14 +885,14 @@ mod input_shape { #[test] fn supports_file_group_field() { for key in ["fileGroup", "group"] { - let input = ProjectSourcesInput::from_uri( + let input = ProjectInput::from_uri( Uri::parse(format!("project://app?{key}").as_str()).unwrap(), ) .unwrap(); assert!(input.group.is_none()); - let input = ProjectSourcesInput::from_uri( + let input = ProjectInput::from_uri( Uri::parse(format!("project://app?{key}=a").as_str()).unwrap(), ) .unwrap(); @@ -723,14 +904,13 @@ mod input_shape { #[test] fn supports_filter_field() { let input = - ProjectSourcesInput::from_uri(Uri::parse("project://app?filter").unwrap()).unwrap(); + ProjectInput::from_uri(Uri::parse("project://app?filter").unwrap()).unwrap(); assert!(input.filter.is_empty()); - let input = ProjectSourcesInput::from_uri( - Uri::parse("project://app?filter=a&filter=b").unwrap(), - ) - .unwrap(); + let input = + ProjectInput::from_uri(Uri::parse("project://app?filter=a&filter=b").unwrap()) + .unwrap(); assert_eq!(input.filter, ["a", "b"]); } @@ -738,19 +918,19 @@ mod input_shape { #[test] #[should_panic(expected = "a project identifier is required")] fn errors_no_id() { - ProjectSourcesInput::from_uri(Uri::parse("project://").unwrap()).unwrap(); + ProjectInput::from_uri(Uri::parse("project://").unwrap()).unwrap(); } #[test] #[should_panic(expected = "Invalid identifier format")] fn errors_invalid_id() { - ProjectSourcesInput::from_uri(Uri::parse("project://@&n3k(").unwrap()).unwrap(); + ProjectInput::from_uri(Uri::parse("project://@&n3k(").unwrap()).unwrap(); } #[test] #[should_panic(expected = "unknown field `unknown`")] fn errors_unknown_field() { - ProjectSourcesInput::from_uri(Uri::parse("project://id?unknown").unwrap()).unwrap(); + ProjectInput::from_uri(Uri::parse("project://id?unknown").unwrap()).unwrap(); } } } diff --git a/crates/config/tests/project_config_test.rs b/crates/config/tests/project_config_test.rs index 5b1df16f5f2..9e892c38033 100644 --- a/crates/config/tests/project_config_test.rs +++ b/crates/config/tests/project_config_test.rs @@ -62,7 +62,7 @@ tasks: assert_eq!(build.args, TaskArgs::None); assert_eq!( build.inputs, - Some(vec![Input::ProjectGlob(create_glob_input("src/**/*"))]) + Some(vec![Input::Glob(create_glob_input("src/**/*"))]) ); let start = config.tasks.get("start").unwrap(); @@ -71,7 +71,7 @@ tasks: assert_eq!(start.args, TaskArgs::String("serve".to_owned())); assert_eq!( start.inputs, - Some(vec![Input::ProjectGlob(create_glob_input("src/**/*"))]) + Some(vec![Input::Glob(create_glob_input("src/**/*"))]) ); } @@ -102,7 +102,7 @@ tasks: assert_eq!(build.args, TaskArgs::None); assert_eq!( build.inputs, - Some(vec![Input::ProjectGlob(create_glob_input("src/**/*"))]) + Some(vec![Input::Glob(create_glob_input("src/**/*"))]) ); let start = config.tasks.get("start").unwrap(); @@ -111,7 +111,7 @@ tasks: assert_eq!(start.args, TaskArgs::String("serve".to_owned())); assert_eq!( start.inputs, - Some(vec![Input::ProjectGlob(create_glob_input("src/**/*"))]) + Some(vec![Input::Glob(create_glob_input("src/**/*"))]) ); } @@ -231,17 +231,17 @@ fileGroups: ( Id::raw("files"), vec![ - Input::WorkspaceFile(create_file_input("/ws/relative")), - Input::ProjectFile(create_file_input("proj/relative")) + Input::File(create_file_input("/ws/relative")), + Input::File(create_file_input("proj/relative")) ] ), ( Id::raw("globs"), vec![ - Input::WorkspaceGlob(create_glob_input("/ws/**/*")), - Input::WorkspaceGlob(create_glob_input("!/ws/**/*")), - Input::ProjectGlob(create_glob_input("proj/**/*")), - Input::ProjectGlob(create_glob_input("!proj/**/*")), + Input::Glob(create_glob_input("/ws/**/*")), + Input::Glob(create_glob_input("!/ws/**/*")), + Input::Glob(create_glob_input("proj/**/*")), + Input::Glob(create_glob_input("!proj/**/*")), ] ), ]) @@ -514,7 +514,7 @@ tags: } #[test] - #[should_panic(expected = "Invalid identifier format for foo bar")] + #[should_panic(expected = "Invalid identifier format for `foo bar`")] fn errors_on_invalid_format() { test_load_config("moon.yml", "tags: ['foo bar']", |path| { load_config_from_root(path, ".") @@ -755,11 +755,11 @@ workspace: file_groups: FxHashMap::from_iter([ ( Id::raw("sources"), - vec![Input::ProjectGlob(create_glob_input("src/**/*"))] + vec![Input::Glob(create_glob_input("src/**/*"))] ), ( Id::raw("tests"), - vec![Input::WorkspaceGlob(create_glob_input("/**/*.test.*"))] + vec![Input::Glob(create_glob_input("/**/*.test.*"))] ) ]), id: Some(Id::raw("custom-id")), diff --git a/crates/config/tests/task_config_test.rs b/crates/config/tests/task_config_test.rs index 7dd242485b5..ddad3b8e525 100644 --- a/crates/config/tests/task_config_test.rs +++ b/crates/config/tests/task_config_test.rs @@ -4,8 +4,9 @@ mod utils; use moon_common::Id; use moon_config::{ - FilePath, Input, OneOrMany, OutputPath, PlatformType, TaskArgs, TaskConfig, TaskDependency, - TaskDependencyConfig, TaskMergeStrategy, TaskOptionCache, TaskOutputStyle, TaskType, + FileGroupInput, FileGroupInputFormat, FilePath, Input, OneOrMany, OutputPath, PlatformType, + ProjectInput, TaskArgs, TaskConfig, TaskDependency, TaskDependencyConfig, TaskMergeStrategy, + TaskOptionCache, TaskOutputStyle, TaskType, }; use moon_target::Target; use rustc_hash::FxHashMap; @@ -260,12 +261,12 @@ inputs: assert_eq!( config.inputs.unwrap(), vec![ - Input::WorkspaceFile(create_file_input("/ws/path")), - Input::WorkspaceGlob(create_glob_input("/ws/glob/**/*")), - Input::WorkspaceGlob(create_glob_input("!/ws/glob/**/*")), - Input::ProjectFile(create_file_input("proj/path")), - Input::ProjectGlob(create_glob_input("proj/glob/{a,b,c}")), - Input::ProjectGlob(create_glob_input("!proj/glob/{a,b,c}")), + Input::File(create_file_input("/ws/path")), + Input::Glob(create_glob_input("/ws/glob/**/*")), + Input::Glob(create_glob_input("!/ws/glob/**/*")), + Input::File(create_file_input("proj/path")), + Input::Glob(create_glob_input("proj/glob/{a,b,c}")), + Input::Glob(create_glob_input("!proj/glob/{a,b,c}")), ] ); } @@ -288,20 +289,20 @@ inputs: assert_eq!( config.inputs.unwrap(), vec![ - Input::WorkspaceFile({ + Input::File({ let mut inner = create_file_input("/ws/path"); inner.content = Some(RegexSetting::new("a|b|c").unwrap()); inner }), - Input::WorkspaceGlob(create_glob_input("/ws/glob/**/*")), - Input::WorkspaceGlob(create_glob_input("!/ws/glob/**/*")), - Input::ProjectFile({ + Input::Glob(create_glob_input("/ws/glob/**/*")), + Input::Glob(create_glob_input("!/ws/glob/**/*")), + Input::File({ let mut inner = create_file_input("proj/path"); inner.optional = Some(true); inner }), - Input::ProjectGlob(create_glob_input("proj/glob/{a,b,c}")), - Input::ProjectGlob({ + Input::Glob(create_glob_input("proj/glob/{a,b,c}")), + Input::Glob({ let mut inner = create_glob_input("!proj/glob/{a,b,c}"); inner.cache = false; inner @@ -331,20 +332,20 @@ inputs: assert_eq!( config.inputs.unwrap(), vec![ - Input::WorkspaceFile({ + Input::File({ let mut inner = create_file_input("/ws/path"); inner.content = Some(RegexSetting::new("a|b|c").unwrap()); inner }), - Input::WorkspaceGlob(create_glob_input("/ws/glob/**/*")), - Input::WorkspaceGlob(create_glob_input("!/ws/glob/**/*")), - Input::ProjectFile({ + Input::Glob(create_glob_input("/ws/glob/**/*")), + Input::Glob(create_glob_input("!/ws/glob/**/*")), + Input::File({ let mut inner = create_file_input("proj/path"); inner.optional = Some(true); inner }), - Input::ProjectGlob(create_glob_input("proj/glob/{a,b,c}")), - Input::ProjectGlob({ + Input::Glob(create_glob_input("proj/glob/{a,b,c}")), + Input::Glob({ let mut inner = create_glob_input("!proj/glob/{a,b,c}"); inner.cache = false; inner @@ -373,20 +374,20 @@ inputs: assert_eq!( config.inputs.unwrap(), vec![ - Input::WorkspaceFile({ + Input::File({ let mut inner = create_file_input("/ws/path"); inner.content = Some(RegexSetting::new("a|b|c").unwrap()); inner }), - Input::WorkspaceGlob(create_glob_input("/ws/glob/**/*")), - Input::WorkspaceGlob(create_glob_input("!/ws/glob/**/*")), - Input::ProjectFile({ + Input::Glob(create_glob_input("/ws/glob/**/*")), + Input::Glob(create_glob_input("!/ws/glob/**/*")), + Input::File({ let mut inner = create_file_input("proj/path"); inner.optional = Some(true); inner }), - Input::ProjectGlob(create_glob_input("proj/glob/{a,b,c}")), - Input::ProjectGlob({ + Input::Glob(create_glob_input("proj/glob/{a,b,c}")), + Input::Glob({ let mut inner = create_glob_input("!proj/glob/{a,b,c}"); inner.cache = false; inner @@ -412,7 +413,83 @@ inputs: vec![ Input::EnvVar("FOO_BAR".into()), Input::EnvVarGlob("FOO_*".into()), - Input::ProjectFile(create_file_input("file/path")), + Input::File(create_file_input("file/path")), + ] + ); + } + + #[test] + fn supports_file_group_formats() { + let config = test_parse_config( + r" +inputs: + - group://sources + - group://sources?as=dirs + - group: 'tests' + - group: 'tests' + as: 'files' +", + load_config_from_code, + ); + + assert_eq!( + config.inputs.unwrap(), + vec![ + Input::FileGroup(FileGroupInput { + group: Id::raw("sources"), + ..Default::default() + }), + Input::FileGroup(FileGroupInput { + group: Id::raw("sources"), + format: FileGroupInputFormat::Dirs, + }), + Input::FileGroup(FileGroupInput { + group: Id::raw("tests"), + ..Default::default() + }), + Input::FileGroup(FileGroupInput { + group: Id::raw("tests"), + format: FileGroupInputFormat::Files, + }) + ] + ); + } + + #[test] + fn supports_project_sources_formats() { + let config = test_parse_config( + r" +inputs: + - project://a + - project://b?filter=src/** + - project: c + fileGroup: sources + - project: ^ +", + load_config_from_code, + ); + + assert_eq!( + config.inputs.unwrap(), + vec![ + Input::Project(ProjectInput { + project: "a".into(), + ..Default::default() + }), + Input::Project(ProjectInput { + project: "b".into(), + filter: vec!["src/**".into()], + ..Default::default() + }), + Input::Project(ProjectInput { + project: "c".into(), + group: Some(Id::raw("sources")), + ..Default::default() + }), + Input::Project(ProjectInput { + project: "^".into(), + ..Default::default() + }), ] ); } @@ -864,10 +941,10 @@ options: inputs: Some(vec![ Input::EnvVar("ENV".into()), Input::EnvVarGlob("ENV_*".into()), - Input::ProjectFile(create_file_input("file.txt")), - Input::ProjectGlob(create_glob_input("file.*")), - Input::WorkspaceFile(create_file_input("/file.txt")), - Input::WorkspaceGlob(create_glob_input("/file.*")), + Input::File(create_file_input("file.txt")), + Input::Glob(create_glob_input("file.*")), + Input::File(create_file_input("/file.txt")), + Input::Glob(create_glob_input("/file.*")), Input::TokenFunc("@dirs(name)".into()) ]), local: Some(true), diff --git a/crates/config/tests/workspace_config_test.rs b/crates/config/tests/workspace_config_test.rs index 4d688ca3b56..84dd695cfdf 100644 --- a/crates/config/tests/workspace_config_test.rs +++ b/crates/config/tests/workspace_config_test.rs @@ -352,7 +352,7 @@ constraints: } #[test] - #[should_panic(expected = "Invalid identifier format for bad id")] + #[should_panic(expected = "Invalid identifier format for `bad id`")] fn errors_on_invalid_tag_format() { test_load_config( FILENAME, diff --git a/crates/file-group/src/file_group.rs b/crates/file-group/src/file_group.rs index 5357f518bc6..0b0ace3c1f8 100644 --- a/crates/file-group/src/file_group.rs +++ b/crates/file-group/src/file_group.rs @@ -61,12 +61,15 @@ impl FileGroup { Input::TokenFunc(_) | Input::TokenVar(_) => { return Err(FileGroupError::NoTokens(self.id.to_string()).into()); } - Input::ProjectFile(file) | Input::WorkspaceFile(file) => { + Input::File(file) => { self.files.push(file.to_workspace_relative(project_source)); } - Input::ProjectGlob(glob) | Input::WorkspaceGlob(glob) => { + Input::Glob(glob) => { self.globs.push(glob.to_workspace_relative(project_source)); } + Input::FileGroup(_) | Input::Project(_) => { + // Skip + } }; Ok(()) diff --git a/crates/project/src/lib.rs b/crates/project/src/lib.rs index 29f85a54089..6e11af7723d 100644 --- a/crates/project/src/lib.rs +++ b/crates/project/src/lib.rs @@ -1,5 +1,7 @@ mod project; +mod project_error; pub use moon_config::{LayerType, ProjectConfig, StackType}; pub use moon_file_group::FileGroup; pub use project::*; +pub use project_error::*; diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index f784cf477ed..1ac5249d150 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1,3 +1,4 @@ +use crate::project_error::ProjectError; use moon_common::{ Id, cacheable, path::{WorkspaceRelativePathBuf, is_root_level_source}, @@ -104,6 +105,26 @@ impl Project { .collect() } + /// Return the file group by ID or fail with an error. + pub fn get_file_group(&self, group_id: impl AsRef) -> Result<&FileGroup, ProjectError> { + self.file_groups + .get(group_id.as_ref()) + .ok_or_else(|| ProjectError::UnknownFileGroup { + group_id: group_id.as_ref().to_string(), + project_id: self.id.to_string(), + }) + } + + /// Return the task by ID or fail with an error. + pub fn get_task(&self, task_id: impl AsRef) -> Result<&Task, ProjectError> { + self.tasks + .get(task_id.as_ref()) + .ok_or_else(|| ProjectError::UnknownTask { + task_id: task_id.as_ref().to_string(), + project_id: self.id.to_string(), + }) + } + /// Return true if the root-level project. pub fn is_root_level(&self) -> bool { is_root_level_source(&self.source) diff --git a/crates/project/src/project_error.rs b/crates/project/src/project_error.rs new file mode 100644 index 00000000000..d3bc6a86722 --- /dev/null +++ b/crates/project/src/project_error.rs @@ -0,0 +1,28 @@ +use miette::Diagnostic; +use moon_common::{Style, Stylize}; +use thiserror::Error; + +#[derive(Error, Debug, Diagnostic)] +pub enum ProjectError { + #[diagnostic( + code(project::unknown_file_group), + help = "Has this group been configured?" + )] + #[error( + "Unknown file group {} for project {}.", + .group_id.style(Style::Id), + .project_id.style(Style::Id), + )] + UnknownFileGroup { + group_id: String, + project_id: String, + }, + + #[diagnostic(code(project::unknown_task), help = "Has this task been configured?")] + #[error( + "Unknown task {} for project {}.", + .task_id.style(Style::Id), + .project_id.style(Style::Id), + )] + UnknownTask { task_id: String, project_id: String }, +} diff --git a/crates/task-builder/tests/tasks_builder_test.rs b/crates/task-builder/tests/tasks_builder_test.rs index 4740c2cd942..4cf58477dea 100644 --- a/crates/task-builder/tests/tasks_builder_test.rs +++ b/crates/task-builder/tests/tasks_builder_test.rs @@ -23,8 +23,8 @@ mod tasks_builder { assert_eq!( build.inputs, vec![ - Input::ProjectFile(create_file_input("abc")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("abc")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert_eq!(build.outputs, vec![OutputPath::ProjectFile("out".into())]); @@ -36,8 +36,8 @@ mod tasks_builder { assert_eq!( run.inputs, vec![ - Input::ProjectFile(create_file_input("xyz")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("xyz")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert_eq!(run.outputs, vec![]); @@ -49,8 +49,8 @@ mod tasks_builder { assert_eq!( test.inputs, vec![ - Input::ProjectGlob(create_glob_input("**/*")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(create_glob_input("**/*")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!test.state.local_only); @@ -71,8 +71,8 @@ mod tasks_builder { assert_eq!( build.inputs, vec![ - Input::ProjectFile(create_file_input("abc")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("abc")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert_eq!(build.outputs, vec![OutputPath::ProjectFile("out".into())]); @@ -84,8 +84,8 @@ mod tasks_builder { assert_eq!( run.inputs, vec![ - Input::ProjectFile(create_file_input("xyz")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("xyz")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert_eq!(run.outputs, vec![]); @@ -662,7 +662,7 @@ mod tasks_builder { assert_eq!( task.options.env_files, - Some(vec![Input::ProjectFile(create_file_input(".env"))]) + Some(vec![Input::File(create_file_input(".env"))]) ); let task = tasks.get("no-env-file").unwrap(); @@ -673,16 +673,14 @@ mod tasks_builder { assert_eq!( task.options.env_files, - Some(vec![Input::ProjectFile(create_file_input(".env.test"))]) + Some(vec![Input::File(create_file_input(".env.test"))]) ); let task = tasks.get("env-file-workspace").unwrap(); assert_eq!( task.options.env_files, - Some(vec![Input::WorkspaceFile(create_file_input( - "/.env.shared" - ))]) + Some(vec![Input::File(create_file_input("/.env.shared"))]) ); let task = tasks.get("env-file-list").unwrap(); @@ -690,8 +688,8 @@ mod tasks_builder { assert_eq!( task.options.env_files, Some(vec![ - Input::ProjectFile(create_file_input(".env.test")), - Input::WorkspaceFile(create_file_input("/.env.shared")) + Input::File(create_file_input(".env.test")), + Input::File(create_file_input("/.env.shared")) ]) ); } @@ -707,7 +705,7 @@ mod tasks_builder { assert!( task.inputs - .contains(&Input::ProjectFile(create_file_input(".env"))) + .contains(&Input::File(create_file_input(".env"))) ); let task = tasks.get("no-env-file").unwrap(); @@ -715,21 +713,21 @@ mod tasks_builder { assert!( !task .inputs - .contains(&Input::ProjectFile(create_file_input(".env"))) + .contains(&Input::File(create_file_input(".env"))) ); let task = tasks.get("env-file-project").unwrap(); assert!( task.inputs - .contains(&Input::ProjectFile(create_file_input(".env.test"))) + .contains(&Input::File(create_file_input(".env.test"))) ); let task = tasks.get("env-file-workspace").unwrap(); assert!( task.inputs - .contains(&Input::WorkspaceFile(create_file_input("/.env.shared"))) + .contains(&Input::File(create_file_input("/.env.shared"))) ); } @@ -985,8 +983,8 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("**/*")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(create_glob_input("**/*")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -995,9 +993,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![Input::WorkspaceGlob(create_glob_input( - "/.moon/*.{pkl,yml}" - ))] + vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); @@ -1006,8 +1002,8 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("local/*")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(create_glob_input("local/*")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1024,9 +1020,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![Input::WorkspaceGlob(create_glob_input( - "/.moon/*.{pkl,yml}" - ))] + vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -1035,9 +1029,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![Input::WorkspaceGlob(create_glob_input( - "/.moon/*.{pkl,yml}" - ))] + vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -1047,8 +1039,8 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("local/*")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")) + Input::Glob(create_glob_input("local/*")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")) ] ); assert!(!task.state.empty_inputs); @@ -1067,8 +1059,8 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("**/*")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")) + Input::Glob(create_glob_input("**/*")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")) ] ); assert!(!task.state.empty_inputs); @@ -1078,9 +1070,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![Input::WorkspaceGlob(create_glob_input( - "/.moon/*.{pkl,yml}" - ))] + vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -1090,8 +1080,8 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("local/*")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")) + Input::Glob(create_glob_input("local/*")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")) ] ); assert!(!task.state.empty_inputs); @@ -1110,9 +1100,9 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("src/**/*")), - Input::WorkspaceFile(create_file_input("/workspace-local")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(create_glob_input("src/**/*")), + Input::File(create_file_input("/workspace-local")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1122,8 +1112,8 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("local.json")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("local.json")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1132,9 +1122,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![Input::WorkspaceGlob(create_glob_input( - "/.moon/*.{pkl,yml}" - ))] + vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); } @@ -1180,10 +1168,10 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("global")), - Input::ProjectFile(create_file_input("local")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("global")), + Input::File(create_file_input("local")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1235,10 +1223,10 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("global")), - Input::ProjectFile(create_file_input("local")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("global")), + Input::File(create_file_input("local")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1290,10 +1278,10 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("local")), - Input::ProjectFile(create_file_input("global")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("local")), + Input::File(create_file_input("global")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1345,10 +1333,10 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("local")), - Input::ProjectFile(create_file_input("global")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("local")), + Input::File(create_file_input("global")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1398,9 +1386,9 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("local")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("local")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1444,9 +1432,9 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("local")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("local")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1551,9 +1539,9 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("global")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("global")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); assert!(!task.state.empty_inputs); @@ -1599,9 +1587,9 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("global")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("global")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); assert!(!task.state.empty_inputs); @@ -1646,9 +1634,9 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("global")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("global")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1692,9 +1680,9 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("global")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(create_file_input("global")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1865,10 +1853,10 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("**/*")), - Input::ProjectGlob(create_glob_input("project/**/*")), - Input::WorkspaceFile(create_file_input("/workspace.json")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(create_glob_input("**/*")), + Input::Glob(create_glob_input("project/**/*")), + Input::File(create_file_input("/workspace.json")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1885,9 +1873,9 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("project/**/*")), - Input::WorkspaceFile(create_file_input("/workspace.json")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(create_glob_input("project/**/*")), + Input::File(create_file_input("/workspace.json")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(task.state.empty_inputs); @@ -1904,10 +1892,10 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("local/*")), - Input::ProjectGlob(create_glob_input("project/**/*")), - Input::WorkspaceFile(create_file_input("/workspace.json")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(create_glob_input("local/*")), + Input::Glob(create_glob_input("project/**/*")), + Input::File(create_file_input("/workspace.json")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -2041,8 +2029,8 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectGlob(create_glob_input("src/**/*")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(create_glob_input("src/**/*")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), ] ); } @@ -2087,12 +2075,12 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("global-base")), - Input::ProjectFile(create_file_input("global-extender")), - Input::ProjectFile(create_file_input("local-base")), - Input::ProjectFile(create_file_input("local-extender")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-extends.yml")), + Input::File(create_file_input("global-base")), + Input::File(create_file_input("global-extender")), + Input::File(create_file_input("local-base")), + Input::File(create_file_input("local-extender")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-extends.yml")), ] ); @@ -2114,10 +2102,10 @@ mod tasks_builder { assert_eq!( task.inputs, vec![ - Input::ProjectFile(create_file_input("global-base")), - Input::ProjectFile(create_file_input("local-extender")), - Input::WorkspaceGlob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::WorkspaceFile(create_file_input("/global/tasks/tag-extends.yml")), + Input::File(create_file_input("global-base")), + Input::File(create_file_input("local-extender")), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(create_file_input("/global/tasks/tag-extends.yml")), ] ); } diff --git a/crates/task-expander/src/task_expander.rs b/crates/task-expander/src/task_expander.rs index 66f23832bbd..0fac806830d 100644 --- a/crates/task-expander/src/task_expander.rs +++ b/crates/task-expander/src/task_expander.rs @@ -153,7 +153,7 @@ impl<'graph> TaskExpander<'graph> { let env_paths = env_files .iter() .filter_map(|input| match input { - Input::ProjectFile(file) | Input::WorkspaceFile(file) => Some( + Input::File(file) => Some( file.to_workspace_relative(self.project.source.as_str()) .to_path(&self.context.workspace_root), ), diff --git a/crates/task-expander/src/token_expander.rs b/crates/task-expander/src/token_expander.rs index 87145395c59..9630ee2ec98 100644 --- a/crates/task-expander/src/token_expander.rs +++ b/crates/task-expander/src/token_expander.rs @@ -4,7 +4,7 @@ use moon_common::{ color, path::{self, WorkspaceRelativePathBuf}, }; -use moon_config::{Input, OutputPath, ProjectMetadataConfig, patterns}; +use moon_config::{Input, OutputPath, ProjectInput, ProjectMetadataConfig, patterns}; use moon_env_var::{EnvScanner, EnvSubstitutor, GlobalEnvBag}; use moon_graph_utils::GraphExpanderContext; use moon_project::{FileGroup, Project}; @@ -237,14 +237,15 @@ impl<'graph> TokenExpander<'graph> { } #[instrument(skip_all)] - pub fn expand_inputs(&mut self, task: &Task) -> miette::Result { + pub fn expand_inputs(&mut self, task: &mut Task) -> miette::Result { self.scope = TokenScope::Inputs; + let mut inputs = vec![]; let mut result = ExpandedResult::default(); let bag = GlobalEnvBag::instance(); - for input in &task.inputs { - match input { + for input in mem::take(&mut task.inputs) { + match &input { Input::EnvVar(var) => { result.env.push(var.to_owned()); } @@ -276,7 +277,7 @@ impl<'graph> TokenExpander<'graph> { .join(self.replace_variable(task, Cow::Borrowed(var))?.as_ref()), ); } - Input::ProjectFile(inner) | Input::WorkspaceFile(inner) => { + Input::File(inner) => { let file = self.create_path_for_task( task, inner.to_workspace_relative(&self.project.source), @@ -290,7 +291,14 @@ impl<'graph> TokenExpander<'graph> { }, ); } - Input::ProjectGlob(inner) | Input::WorkspaceGlob(inner) => { + Input::FileGroup(inner) => { + self.update_result_for_file_group( + self.project.get_file_group(&inner.group)?, + inner.format.to_string().as_str(), + &mut result, + )?; + } + Input::Glob(inner) => { let glob = self.create_path_for_task( task, inner.to_workspace_relative(&self.project.source), @@ -300,9 +308,27 @@ impl<'graph> TokenExpander<'graph> { .globs_for_input .insert(glob, TaskGlobInput { cache: inner.cache }); } + Input::Project(inner) => { + // Expand to all owning project dependencies + if inner.project == "^" { + for dep_config in &self.project.dependencies { + inputs.push(Input::Project(ProjectInput { + project: dep_config.id.to_string(), + filter: inner.filter.clone(), + group: inner.group.clone(), + })); + } + + continue; + } + } }; + + inputs.push(input); } + task.inputs = inputs; + Ok(result) } @@ -358,58 +384,26 @@ impl<'graph> TokenExpander<'graph> { ..ExpandedResult::default() }; - let loose_check = matches!(self.scope, TokenScope::Outputs); - let file_group = || -> miette::Result<&FileGroup> { - self.check_scope( - task, - token, - &[ - TokenScope::Script, - TokenScope::Args, - TokenScope::Env, - TokenScope::Inputs, - TokenScope::Outputs, - ], - )?; - - Ok(self.project.file_groups.get(arg).ok_or_else(|| { - TokenExpanderError::UnknownFileGroup { - group: arg.to_owned(), - token: token.to_owned(), - } - })?) - }; - match func { // File groups - "root" => { - result - .files - .push(file_group()?.root(&self.context.workspace_root, &self.project.source)?); - } - "dirs" => { - result - .files - .extend(file_group()?.dirs(&self.context.workspace_root, loose_check)?); - } - "files" => { - result - .files - .extend(file_group()?.files(&self.context.workspace_root, loose_check)?); - } - "globs" => { - result.globs.extend(file_group()?.globs()?.to_owned()); - } - "group" => { - let group = file_group()?; - result.files.extend(group.files.clone()); - result.globs.extend(group.globs.clone()); + "root" | "dirs" | "files" | "globs" | "group" => { + self.check_scope( + task, + token, + &[ + TokenScope::Script, + TokenScope::Args, + TokenScope::Env, + TokenScope::Inputs, + TokenScope::Outputs, + ], + )?; - // Only inputs can use env vars, but instead of failing for other - // scopes, just ignore them - if self.scope == TokenScope::Inputs { - result.env.extend(group.env.clone()); - } + self.update_result_for_file_group( + self.project.get_file_group(arg)?, + func, + &mut result, + )?; } // Inputs, outputs "in" => { @@ -426,13 +420,20 @@ impl<'graph> TokenExpander<'graph> { })?; match input { - Input::ProjectFile(inner) | Input::WorkspaceFile(inner) => { + Input::File(inner) => { result.files.push(self.create_path_for_task( task, inner.to_workspace_relative(&self.project.source), )?); } - Input::ProjectGlob(inner) | Input::WorkspaceGlob(inner) => { + Input::FileGroup(inner) => { + self.update_result_for_file_group( + self.project.get_file_group(&inner.group)?, + inner.format.to_string().as_str(), + &mut result, + )?; + } + Input::Glob(inner) => { result.globs.push(self.create_path_for_task( task, inner.to_workspace_relative(&self.project.source), @@ -496,7 +497,11 @@ impl<'graph> TokenExpander<'graph> { "envs" => { self.check_scope(task, token, &[TokenScope::Inputs])?; - result.env.extend(file_group()?.env()?.to_owned()); + self.update_result_for_file_group( + self.project.get_file_group(arg)?, + func, + &mut result, + )?; } "meta" => { self.check_scope( @@ -659,6 +664,52 @@ impl<'graph> TokenExpander<'graph> { })?) } + fn update_result_for_file_group( + &self, + group: &FileGroup, + format: &str, + result: &mut ExpandedResult, + ) -> miette::Result<()> { + let loose_check = matches!(self.scope, TokenScope::Outputs); + + match format { + "root" => { + result + .files + .push(group.root(&self.context.workspace_root, &self.project.source)?); + } + "dirs" => { + result + .files + .extend(group.dirs(&self.context.workspace_root, loose_check)?); + } + "envs" => { + if self.scope == TokenScope::Inputs { + result.env.extend(group.env.clone()); + } + } + "files" => { + result + .files + .extend(group.files(&self.context.workspace_root, loose_check)?); + } + "globs" => { + result.globs.extend(group.globs()?.to_owned()); + } + "group" | "static" => { + result.files.extend(group.files.clone()); + result.globs.extend(group.globs.clone()); + + if self.scope == TokenScope::Inputs { + result.env.extend(group.env.clone()); + } + } + _ => {} + }; + + Ok(()) + } + fn create_path_for_task( &self, task: &Task, diff --git a/crates/task-expander/src/token_expander_error.rs b/crates/task-expander/src/token_expander_error.rs index ce09f0ae73c..6305cc9dc16 100644 --- a/crates/task-expander/src/token_expander_error.rs +++ b/crates/task-expander/src/token_expander_error.rs @@ -60,14 +60,6 @@ pub enum TokenExpanderError { token: String, }, - #[diagnostic(code(token_expander::unknown_file_group))] - #[error( - "Unknown file group {} used in token {}.", - .group.style(Style::Id), - .token.style(Style::Symbol), - )] - UnknownFileGroup { group: String, token: String }, - #[diagnostic( code(token_expander::unknown), url("https://moonrepo.dev/docs/concepts/token") diff --git a/crates/task-expander/tests/token_expander_test.rs b/crates/task-expander/tests/token_expander_test.rs index f9c87f07fea..1ed8b7a86ad 100644 --- a/crates/task-expander/tests/token_expander_test.rs +++ b/crates/task-expander/tests/token_expander_test.rs @@ -1,7 +1,11 @@ mod utils; +use moon_common::Id; use moon_common::path::{self, WorkspaceRelativePathBuf}; -use moon_config::{Input, LanguageType, LayerType, OutputPath}; +use moon_config::{ + DependencyConfig, FileGroupInput, FileGroupInputFormat, Input, LanguageType, LayerType, + OutputPath, ProjectInput, +}; use moon_env_var::GlobalEnvBag; use moon_task::{TaskFileInput, TaskGlobInput}; use moon_task_expander::{ExpandedResult, TokenExpander}; @@ -27,7 +31,7 @@ mod token_expander { } #[test] - #[should_panic(expected = "Unknown file group unknown used in token @files(unknown).")] + #[should_panic(expected = "Unknown file group unknown for project project.")] fn errors_for_unknown_file_group() { let sandbox = create_empty_sandbox(); let project = create_project(sandbox.path()); @@ -1044,7 +1048,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { env: vec!["FOO_BAR".into()], ..ExpandedResult::default() @@ -1069,7 +1073,7 @@ mod token_expander { let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); - let mut result = expander.expand_inputs(&task).unwrap(); + let mut result = expander.expand_inputs(&mut task).unwrap(); result.env.sort(); assert_eq!( @@ -1098,7 +1102,37 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), + ExpandedResult { + files: vec![ + WorkspaceRelativePathBuf::from("project/source/config.yml"), + WorkspaceRelativePathBuf::from("project/source/dir/subdir") + ], + globs: vec![ + WorkspaceRelativePathBuf::from("project/source/*.md"), + WorkspaceRelativePathBuf::from("project/source/**/*.json"), + ], + ..ExpandedResult::default() + } + ); + } + + #[test] + fn supports_group_via_input() { + let sandbox = create_sandbox("file-group"); + let project = create_project(sandbox.path()); + let mut task = create_task(); + + task.inputs = vec![Input::FileGroup(FileGroupInput { + group: Id::raw("all"), + format: FileGroupInputFormat::Static, + })]; + + let context = create_context(sandbox.path()); + let mut expander = TokenExpander::new(&project, &context); + + assert_eq!( + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/config.yml"), @@ -1125,7 +1159,34 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), + ExpandedResult { + files: vec![ + WorkspaceRelativePathBuf::from("project/source/dir/subdir"), + WorkspaceRelativePathBuf::from("project/source/other"), + ], + globs: vec![], + ..ExpandedResult::default() + } + ); + } + + #[test] + fn supports_dirs_via_input() { + let sandbox = create_sandbox("file-group"); + let project = create_project(sandbox.path()); + let mut task = create_task(); + + task.inputs = vec![Input::FileGroup(FileGroupInput { + group: Id::raw("dirs"), + format: FileGroupInputFormat::Dirs, + })]; + + let context = create_context(sandbox.path()); + let mut expander = TokenExpander::new(&project, &context); + + assert_eq!( + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/dir/subdir"), @@ -1149,7 +1210,36 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), + ExpandedResult { + files: vec![ + WorkspaceRelativePathBuf::from("project/source/config.yml"), + WorkspaceRelativePathBuf::from("project/source/dir/subdir/nested.json"), + WorkspaceRelativePathBuf::from("project/source/docs.md"), + WorkspaceRelativePathBuf::from("project/source/other/file.json"), + ], + globs: vec![], + ..ExpandedResult::default() + } + ); + } + + #[test] + fn supports_files_via_input() { + let sandbox = create_sandbox("file-group"); + let project = create_project(sandbox.path()); + let mut task = create_task(); + + task.inputs = vec![Input::FileGroup(FileGroupInput { + group: Id::raw("all"), + format: FileGroupInputFormat::Files, + })]; + + let context = create_context(sandbox.path()); + let mut expander = TokenExpander::new(&project, &context); + + assert_eq!( + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/config.yml"), @@ -1175,7 +1265,34 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), + ExpandedResult { + files: vec![], + globs: vec![ + WorkspaceRelativePathBuf::from("project/source/*.md"), + WorkspaceRelativePathBuf::from("project/source/**/*.json"), + ], + ..ExpandedResult::default() + } + ); + } + + #[test] + fn supports_globs_via_input() { + let sandbox = create_sandbox("file-group"); + let project = create_project(sandbox.path()); + let mut task = create_task(); + + task.inputs = vec![Input::FileGroup(FileGroupInput { + group: Id::raw("all"), + format: FileGroupInputFormat::Globs, + })]; + + let context = create_context(sandbox.path()); + let mut expander = TokenExpander::new(&project, &context); + + assert_eq!( + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { files: vec![], globs: vec![ @@ -1199,7 +1316,31 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), + ExpandedResult { + files: vec![WorkspaceRelativePathBuf::from("project/source/dir/subdir")], + globs: vec![], + ..ExpandedResult::default() + } + ); + } + + #[test] + fn supports_root_via_input() { + let sandbox = create_sandbox("file-group"); + let project = create_project(sandbox.path()); + let mut task = create_task(); + + task.inputs = vec![Input::FileGroup(FileGroupInput { + group: Id::raw("all"), + format: FileGroupInputFormat::Root, + })]; + + let context = create_context(sandbox.path()); + let mut expander = TokenExpander::new(&project, &context); + + assert_eq!( + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { files: vec![WorkspaceRelativePathBuf::from("project/source/dir/subdir")], globs: vec![], @@ -1220,7 +1361,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { env: vec!["FOO_BAR".into()], ..ExpandedResult::default() @@ -1242,7 +1383,7 @@ mod token_expander { let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); - expander.expand_inputs(&task).unwrap(); + expander.expand_inputs(&mut task).unwrap(); } #[test] @@ -1259,7 +1400,7 @@ mod token_expander { let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); - expander.expand_inputs(&task).unwrap(); + expander.expand_inputs(&mut task).unwrap(); } #[test] @@ -1276,7 +1417,7 @@ mod token_expander { let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); - expander.expand_inputs(&task).unwrap(); + expander.expand_inputs(&mut task).unwrap(); } #[test] @@ -1294,7 +1435,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/project:task"), @@ -1323,7 +1464,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&task).unwrap(), + expander.expand_inputs(&mut task).unwrap(), ExpandedResult { files_for_input: create_file_input_map(vec![ "project/source/task/file.txt", @@ -1337,6 +1478,61 @@ mod token_expander { } ); } + + #[test] + fn expands_project_input_into_dependencies() { + let sandbox = create_empty_sandbox(); + let mut project = create_project(sandbox.path()); + + project.dependencies.extend([ + DependencyConfig { + id: Id::raw("a"), + ..Default::default() + }, + DependencyConfig { + id: Id::raw("b"), + ..Default::default() + }, + DependencyConfig { + id: Id::raw("c"), + ..Default::default() + }, + ]); + + let mut task = create_task(); + + task.inputs = vec![Input::Project(ProjectInput { + project: "^".into(), + filter: vec!["src/**/*".into()], + group: Some(Id::raw("sources")), + })]; + + let context = create_context(sandbox.path()); + let mut expander = TokenExpander::new(&project, &context); + + expander.expand_inputs(&mut task).unwrap(); + + assert_eq!( + task.inputs, + [ + Input::Project(ProjectInput { + project: "a".into(), + filter: vec!["src/**/*".into()], + group: Some(Id::raw("sources")), + }), + Input::Project(ProjectInput { + project: "b".into(), + filter: vec!["src/**/*".into()], + group: Some(Id::raw("sources")), + }), + Input::Project(ProjectInput { + project: "c".into(), + filter: vec!["src/**/*".into()], + group: Some(Id::raw("sources")), + }), + ] + ); + } } mod outputs { diff --git a/crates/task-graph/Cargo.toml b/crates/task-graph/Cargo.toml index e833fbbfb0e..e38548d254a 100644 --- a/crates/task-graph/Cargo.toml +++ b/crates/task-graph/Cargo.toml @@ -12,6 +12,7 @@ publish = false moon_common = { path = "../common" } moon_config = { path = "../config" } moon_graph_utils = { path = "../graph-utils" } +moon_project = { path = "../project" } moon_project_graph = { path = "../project-graph" } moon_target = { path = "../target" } moon_task = { path = "../task" } diff --git a/crates/task-graph/src/lib.rs b/crates/task-graph/src/lib.rs index ec2c400efb3..4f93b75b447 100644 --- a/crates/task-graph/src/lib.rs +++ b/crates/task-graph/src/lib.rs @@ -1,7 +1,5 @@ mod task_graph; -mod task_graph_error; pub use moon_graph_utils::*; pub use moon_task::*; pub use task_graph::*; -pub use task_graph_error::*; diff --git a/crates/task-graph/src/task_graph.rs b/crates/task-graph/src/task_graph.rs index c1d4d0cc9be..103e59d37a2 100644 --- a/crates/task-graph/src/task_graph.rs +++ b/crates/task-graph/src/task_graph.rs @@ -1,7 +1,7 @@ -use crate::task_graph_error::TaskGraphError; use moon_common::Id; use moon_config::DependencyType; use moon_graph_utils::*; +use moon_project::ProjectError; use moon_project_graph::ProjectGraph; use moon_target::Target; use moon_task::Task; @@ -66,7 +66,10 @@ impl TaskGraph { let metadata = self .metadata .get(target) - .ok_or(TaskGraphError::UnconfiguredTarget(target.to_owned()))?; + .ok_or_else(|| ProjectError::UnknownTask { + task_id: target.task_id.to_string(), + project_id: target.get_project_id().unwrap().to_string(), + })?; Ok(self.graph.node_weight(metadata.index).unwrap()) } diff --git a/crates/task-graph/src/task_graph_error.rs b/crates/task-graph/src/task_graph_error.rs deleted file mode 100644 index 37d0a6dcaca..00000000000 --- a/crates/task-graph/src/task_graph_error.rs +++ /dev/null @@ -1,18 +0,0 @@ -use miette::Diagnostic; -use moon_common::{Style, Stylize}; -use moon_task::Target; -use thiserror::Error; - -#[derive(Error, Debug, Diagnostic)] -pub enum TaskGraphError { - #[diagnostic( - code(task_graph::unknown_target), - help = "Has this task been configured?" - )] - #[error( - "Unknown task {} for project {}.", - .0.task_id.to_string().style(Style::Id), - .0.get_project_id().unwrap().to_string().style(Style::Id), - )] - UnconfiguredTarget(Target), -} diff --git a/crates/workspace-graph/src/lib.rs b/crates/workspace-graph/src/lib.rs index 0b40b301ec2..62809d2bfc0 100644 --- a/crates/workspace-graph/src/lib.rs +++ b/crates/workspace-graph/src/lib.rs @@ -64,6 +64,20 @@ impl WorkspaceGraph { self.projects.get_all() } + pub fn get_projects_by_id(&self, ids: I) -> miette::Result>> + where + I: IntoIterator, + T: AsRef, + { + let mut projects = vec![]; + + for id in ids { + projects.push(self.get_project(id.as_ref())?); + } + + Ok(projects) + } + pub fn get_task(&self, target: &Target) -> miette::Result> { self.tasks.get(target) } diff --git a/crates/workspace/src/workspace_builder.rs b/crates/workspace/src/workspace_builder.rs index 41213955be4..9b06e8c6665 100644 --- a/crates/workspace/src/workspace_builder.rs +++ b/crates/workspace/src/workspace_builder.rs @@ -16,13 +16,13 @@ use moon_config::{ }; use moon_feature_flags::glob_walk_with_options; use moon_pdk_api::ExtendProjectGraphInput; -use moon_project::Project; +use moon_project::{Project, ProjectError}; use moon_project_builder::{ProjectBuilder, ProjectBuilderContext}; use moon_project_constraints::{enforce_layer_relationships, enforce_tag_relationships}; use moon_project_graph::{ProjectGraph, ProjectGraphError, ProjectMetadata}; use moon_task::{Target, Task}; use moon_task_builder::TaskDepsBuilder; -use moon_task_graph::{GraphExpanderContext, NodeState, TaskGraph, TaskGraphError, TaskMetadata}; +use moon_task_graph::{GraphExpanderContext, NodeState, TaskGraph, TaskMetadata}; use moon_toolchain_plugin::ToolchainRegistry; use moon_vcs::BoxedVcs; use moon_workspace_graph::WorkspaceGraph; @@ -497,7 +497,11 @@ impl<'app> WorkspaceBuilder<'app> { { let Some(build_data) = self.task_data.get(&target) else { - return Err(TaskGraphError::UnconfiguredTarget(target).into()); + return Err(ProjectError::UnknownTask { + task_id: target.task_id.to_string(), + project_id: target.get_project_id().unwrap().to_string(), + } + .into()); }; // Already loaded, exit early with existing index diff --git a/packages/types/src/tasks-config.ts b/packages/types/src/tasks-config.ts index a1be2e7ee1e..1f770e5135c 100644 --- a/packages/types/src/tasks-config.ts +++ b/packages/types/src/tasks-config.ts @@ -11,6 +11,24 @@ export interface FileInput { optional?: boolean | null; } +/** Format to resolve the file group into. */ +export type FileGroupInputFormat = 'static' | 'dirs' | 'envs' | 'files' | 'globs' | 'root'; + +/** A file group input. */ +export interface FileGroupInput { + /** + * @default 'static' + * @type {'static' | 'dirs' | 'envs' | 'files' | 'globs' | 'root'} + */ + as?: FileGroupInputFormat; + /** + * @default 'static' + * @type {'static' | 'dirs' | 'envs' | 'files' | 'globs' | 'root'} + */ + format?: FileGroupInputFormat; + group: Id; +} + /** A glob path input. */ export interface GlobInput { /** @default true */ @@ -18,7 +36,15 @@ export interface GlobInput { glob: string; } -export type Input = string | FileInput | GlobInput; +/** An external project input. */ +export interface ProjectInput { + filter?: string[]; + fileGroup?: Id | null; + group?: Id | null; + project: string; +} + +export type Input = string | FileInput | FileGroupInput | GlobInput | ProjectInput; export type TaskArgs = null | string | string[]; diff --git a/website/docs/config/project.mdx b/website/docs/config/project.mdx index b310a48a1d8..893db9536b6 100644 --- a/website/docs/config/project.mdx +++ b/website/docs/config/project.mdx @@ -791,8 +791,8 @@ They can be defined as a literal path, or a `file://` URI . Additionally, the following parameters are supported as a URI query or as object fields: -- `content` (`string`) - When determining affected state, will match against the file's content - using the defined regex pattern, instead of relying on file existence. +- `content`, `match`, `matches` (`string`) - When determining affected state, will match against the + file's content using the defined regex pattern, instead of relying on file existence. - `optional` (`boolean`) - When hashing and set to `true` and the file is missing, will not log a warning. When set to `false` and the file is missing, will fail with an error. Defaults to logging a warning. @@ -867,6 +867,41 @@ be considered an input. To work around this, use explicit file inputs. ::: +#### External projects + +Tasks can also depend on files and globs from other projects within the same workspace. This is +useful for handling cross-project relationships without needing to define explicit task +dependencies. + +External projects can be defined as a `project://` URI, or as an object with a `project` property, +both of which require a project identifier, or `^` for all dependent projects. Additionally, the +following parameters are supported as a URI query or as object fields: + +- `group`, `fileGroup` (`id`) - The name of a file group within the external project in which file + and glob patterns will be used for matching. Takes precedence over `filter`. +- `filter` (`string[]`) - A list of + [project relative glob patterns](../concepts/file-pattern#project-relative) that will be used for + matching. + +If neither `group` nor `filter` are defined, all files within the external project are considered a +match (`**/*`). + +```yaml title="moon.yml" +tasks: + example: + inputs: + # Using project protocol + - 'project://foo' + - 'project://bar?group=sources' + - 'project://baz?filter=src/**/*' + # Using an object + - project: 'foo' + - project: 'bar' + group: 'sources' + - project: 'baz' + filter: ['src/**/*'] +``` + ### `local` diff --git a/website/static/schemas/project.json b/website/static/schemas/project.json index cc3862658c0..b90f5422396 100644 --- a/website/static/schemas/project.json +++ b/website/static/schemas/project.json @@ -247,6 +247,51 @@ "implicit" ] }, + "FileGroupInput": { + "description": "A file group input.", + "type": "object", + "properties": { + "as": { + "title": "as", + "default": "static", + "allOf": [ + { + "$ref": "#/definitions/FileGroupInputFormat" + } + ] + }, + "format": { + "title": "format", + "default": "static", + "allOf": [ + { + "$ref": "#/definitions/FileGroupInputFormat" + } + ] + }, + "group": { + "title": "group", + "allOf": [ + { + "$ref": "#/definitions/Id" + } + ] + } + }, + "additionalProperties": false + }, + "FileGroupInputFormat": { + "description": "Format to resolve the file group into.", + "type": "string", + "enum": [ + "static", + "dirs", + "envs", + "files", + "globs", + "root" + ] + }, "FileInput": { "description": "A file path input.", "type": "object", @@ -308,8 +353,14 @@ { "$ref": "#/definitions/FileInput" }, + { + "$ref": "#/definitions/FileGroupInput" + }, { "$ref": "#/definitions/GlobInput" + }, + { + "$ref": "#/definitions/ProjectInput" } ] }, @@ -576,6 +627,46 @@ }, "additionalProperties": false }, + "ProjectInput": { + "description": "An external project input.", + "type": "object", + "properties": { + "fileGroup": { + "title": "fileGroup", + "anyOf": [ + { + "$ref": "#/definitions/Id" + }, + { + "type": "null" + } + ] + }, + "filter": { + "title": "filter", + "type": "array", + "items": { + "type": "string" + } + }, + "group": { + "title": "group", + "anyOf": [ + { + "$ref": "#/definitions/Id" + }, + { + "type": "null" + } + ] + }, + "project": { + "title": "project", + "type": "string" + } + }, + "additionalProperties": false + }, "ProjectMetadataConfig": { "description": "Expanded information about the project.", "type": "object", diff --git a/website/static/schemas/tasks.json b/website/static/schemas/tasks.json index 6cb2b885236..cb95b1a5c54 100644 --- a/website/static/schemas/tasks.json +++ b/website/static/schemas/tasks.json @@ -89,6 +89,51 @@ } ] }, + "FileGroupInput": { + "description": "A file group input.", + "type": "object", + "properties": { + "as": { + "title": "as", + "default": "static", + "allOf": [ + { + "$ref": "#/definitions/FileGroupInputFormat" + } + ] + }, + "format": { + "title": "format", + "default": "static", + "allOf": [ + { + "$ref": "#/definitions/FileGroupInputFormat" + } + ] + }, + "group": { + "title": "group", + "allOf": [ + { + "$ref": "#/definitions/Id" + } + ] + } + }, + "additionalProperties": false + }, + "FileGroupInputFormat": { + "description": "Format to resolve the file group into.", + "type": "string", + "enum": [ + "static", + "dirs", + "envs", + "files", + "globs", + "root" + ] + }, "FileInput": { "description": "A file path input.", "type": "object", @@ -150,8 +195,14 @@ { "$ref": "#/definitions/FileInput" }, + { + "$ref": "#/definitions/FileGroupInput" + }, { "$ref": "#/definitions/GlobInput" + }, + { + "$ref": "#/definitions/ProjectInput" } ] }, @@ -168,6 +219,46 @@ "unknown" ] }, + "ProjectInput": { + "description": "An external project input.", + "type": "object", + "properties": { + "fileGroup": { + "title": "fileGroup", + "anyOf": [ + { + "$ref": "#/definitions/Id" + }, + { + "type": "null" + } + ] + }, + "filter": { + "title": "filter", + "type": "array", + "items": { + "type": "string" + } + }, + "group": { + "title": "group", + "anyOf": [ + { + "$ref": "#/definitions/Id" + }, + { + "type": "null" + } + ] + }, + "project": { + "title": "project", + "type": "string" + } + }, + "additionalProperties": false + }, "TaskArgs": { "description": "Configures a command to execute, and its arguments.", "anyOf": [ From 9eb184ad44c95b424f4f6807412a80cb7453b166 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Wed, 24 Sep 2025 21:34:51 -0700 Subject: [PATCH 06/12] deps(scc): Update to v3. (#2120) * deps(proto): Update to v0.53. (#2119) * Update proto. * Update version. * Fix plugins. * Update scc. * Bump * Debug. * Update scc. * Fixes. * Update again. * Update deps. --- Cargo.lock | 46 +++++++++---------- Cargo.toml | 10 ++-- crates/action-context/src/lib.rs | 11 +++-- crates/actions/src/actions/setup_toolchain.rs | 2 +- crates/env-var/src/global_bag.rs | 36 +++++++++------ .../src/extension_registry.rs | 2 +- crates/plugin/src/plugin_registry.rs | 10 ++-- crates/project-graph/src/project_graph.rs | 4 +- crates/task-runner/src/task_hashing.rs | 2 +- crates/task-runner/src/task_runner.rs | 2 +- crates/task-runner/tests/task_runner_test.rs | 16 +++---- .../src/toolchain_registry.rs | 4 +- crates/workspace-graph/src/query_projects.rs | 9 +++- crates/workspace-graph/src/query_tasks.rs | 7 ++- 14 files changed, 90 insertions(+), 71 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b773fb19f39..cb79b458785 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3765,7 +3765,7 @@ dependencies = [ "moon_common", "moon_target", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", "serde", "tokio", ] @@ -3869,7 +3869,7 @@ dependencies = [ "moon_workspace_graph", "proto_core", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", "serde", "serial_test", "starbase_sandbox", @@ -4094,7 +4094,7 @@ dependencies = [ "moon_utils", "proto_core", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", "starbase_utils", "tracing", ] @@ -4360,7 +4360,7 @@ version = "0.0.1" dependencies = [ "regex", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", ] [[package]] @@ -4544,7 +4544,7 @@ dependencies = [ "moon_utils", "proto_core", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", "starbase_styles", "starbase_utils", "tracing", @@ -4650,7 +4650,7 @@ dependencies = [ "moon_workspace_graph", "proto_core", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", "serde", "serde_json", "starbase_sandbox", @@ -4758,7 +4758,7 @@ dependencies = [ "moon_workspace", "petgraph 0.8.2", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", "starbase_events", "starbase_sandbox", "starbase_utils", @@ -4868,7 +4868,7 @@ dependencies = [ "moon_task", "reqwest", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", "serde", "sha2", "starbase_utils", @@ -5278,7 +5278,7 @@ dependencies = [ "moon_process", "regex", "rustc-hash 2.1.1", - "scc 2.4.0", + "scc 3.1.2", "semver", "serde", "starbase_sandbox", @@ -5347,7 +5347,7 @@ dependencies = [ "moon_project_graph", "moon_query", "moon_task_graph", - "scc 2.4.0", + "scc 3.1.2", "tracing", ] @@ -6298,7 +6298,7 @@ dependencies = [ "regex", "reqwest", "rustc-hash 2.1.1", - "scc 3.0.7", + "scc 3.1.2", "schematic", "semver", "serde", @@ -7006,9 +7006,9 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "saa" -version = "3.2.1" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293e425dca7c7889a87de14ff29a4112f18a155119295671cd7fb8c70015a1c5" +checksum = "054a3921793fff8c8a48b2dc0cd799f229dc460795b034365f0a15b2fddf25fb" [[package]] name = "same-file" @@ -7026,17 +7026,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" dependencies = [ "sdd 3.0.10", - "serde", ] [[package]] name = "scc" -version = "3.0.7" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0c0b27fa9a31fc2bad3b9ce122188c9df8158bdcbc3c73e3c0bc38aa69c61e" +checksum = "b502f85d09e86afa08920ba0e320d9919e0edfb57aa6d7f7947d9961f789cdd7" dependencies = [ "saa", - "sdd 4.0.1", + "sdd 4.1.1", + "serde", ] [[package]] @@ -7130,9 +7130,9 @@ checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" [[package]] name = "sdd" -version = "4.0.1" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d51b068a416b603c6b3aaeeba43feb2924ee80739c543482f931328dfc71cdb" +checksum = "289309f6b5c6a090488f188a75e98d96007e763b892018de92b5889eb09a03f4" [[package]] name = "security-framework" @@ -7556,9 +7556,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "starbase" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d753b4e1a05de4557a715e4886b439afa7e0c5d857a11bd8459d2de58998e01" +checksum = "ebfcf58b02a45e1dccbbd6e10f5ebf2bef22ee6de0a50e18c7336a19be189ef3" dependencies = [ "async-trait", "chrono", @@ -7700,7 +7700,7 @@ dependencies = [ "miette 7.6.0", "regex", "reqwest", - "scc 3.0.7", + "scc 3.1.2", "serde", "serde_json", "serde_yml", @@ -8822,7 +8822,7 @@ dependencies = [ "reqwest", "reqwest-middleware", "reqwest-netrc", - "scc 3.0.7", + "scc 3.1.2", "schematic", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 0f5c9958c9e..4c750d71119 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ reqwest = { version = "0.12.23", default-features = false, features = [ "native-tls-vendored", ] } rustc-hash = "2.1.1" -scc = "2.4.0" +scc = "3.1.2" schematic = { version = "0.18.12", default-features = false, features = [ "schema", ] } @@ -63,8 +63,8 @@ serde = { version = "1.0.225", features = ["derive"] } serde_json = "1.0.145" serde_yml = "0.0.12" sha2 = "0.10.9" -starbase = { version = "0.10.5" } -starbase_archive = { version = "0.11.6", default-features = false, features = [ +starbase = { version = "0.10.6" } +starbase_archive = { version = "0.11.8", default-features = false, features = [ "miette", "tar-all", "zip-all", @@ -72,10 +72,10 @@ starbase_archive = { version = "0.11.6", default-features = false, features = [ starbase_console = { version = "0.6.13", features = ["miette"] } starbase_events = "0.7.3" starbase_id = { version = "0.2.3", features = ["miette", "schematic"] } -starbase_sandbox = "0.9.7" +starbase_sandbox = "0.9.9" starbase_shell = "0.10.2" starbase_styles = { version = "0.6.1", features = ["relative-path"] } -starbase_utils = { version = "0.11.16", default-features = false, features = [ +starbase_utils = { version = "0.11.19", default-features = false, features = [ "editor-config", "glob-cache", "miette", diff --git a/crates/action-context/src/lib.rs b/crates/action-context/src/lib.rs index d303ac64d5c..db11df4a1f3 100644 --- a/crates/action-context/src/lib.rs +++ b/crates/action-context/src/lib.rs @@ -69,7 +69,7 @@ pub struct ActionContext { impl ActionContext { pub fn get_or_create_mutex(&self, name: &str) -> Arc> { - if let Some(value) = self.named_mutexes.read(name, |_, v| v.clone()) { + if let Some(value) = self.named_mutexes.read_sync(name, |_, v| v.clone()) { return value; } @@ -77,7 +77,7 @@ impl ActionContext { let _ = self .named_mutexes - .insert(name.to_owned(), Arc::clone(&mutex)); + .insert_sync(name.to_owned(), Arc::clone(&mutex)); mutex } @@ -93,8 +93,9 @@ impl ActionContext { pub fn get_target_states(&self) -> FxHashMap { let mut map = FxHashMap::default(); - self.target_states.scan(|k, v| { + self.target_states.iter_sync(|k, v| { map.insert(k.to_owned(), v.to_owned()); + true }); map } @@ -104,7 +105,9 @@ impl ActionContext { } pub fn set_target_state>(&self, target: T, state: TargetState) { - let _ = self.target_states.insert(target.as_ref().to_owned(), state); + let _ = self + .target_states + .insert_sync(target.as_ref().to_owned(), state); } pub fn should_inherit_args>(&self, target: T) -> bool { diff --git a/crates/actions/src/actions/setup_toolchain.rs b/crates/actions/src/actions/setup_toolchain.rs index 045559703ca..63807ec199e 100644 --- a/crates/actions/src/actions/setup_toolchain.rs +++ b/crates/actions/src/actions/setup_toolchain.rs @@ -60,7 +60,7 @@ pub async fn setup_toolchain( // Acquire a lock for the toolchain ID let locks = LOCKS.get_or_init(scc::HashMap::default); - let entry = locks.entry(node.runtime.id()).or_default(); + let entry = locks.entry_async(node.runtime.id()).await.or_default(); let _lock = entry.lock().await; // Install and setup the specific tool + version in the toolchain! diff --git a/crates/env-var/src/global_bag.rs b/crates/env-var/src/global_bag.rs index b75bdbfeb24..018f9920117 100644 --- a/crates/env-var/src/global_bag.rs +++ b/crates/env-var/src/global_bag.rs @@ -26,7 +26,7 @@ impl GlobalEnvBag { { let key = key.as_ref(); - self.inherited.contains(key) || self.added.contains(key) + self.inherited.contains_sync(key) || self.added.contains_sync(key) } pub fn get(&self, key: K) -> Option @@ -44,8 +44,8 @@ impl GlobalEnvBag { if let Some(value) = self .added - .read(key, |_, value| op(value)) - .or_else(|| self.inherited.read(key, |_, value| op(value))) + .read_sync(key, |_, value| op(value)) + .or_else(|| self.inherited.read_sync(key, |_, value| op(value))) { return Some(value); } @@ -55,7 +55,7 @@ impl GlobalEnvBag { if let Some(value) = env::var_os(key) { let as_value = op(&value); - let _ = self.inherited.insert(key.into(), value); + let _ = self.inherited.insert_sync(key.into(), value); return Some(as_value); } @@ -71,7 +71,7 @@ impl GlobalEnvBag { let key = key.as_ref(); let value = value.as_ref(); - self.added.upsert(key.into(), value.into()); + self.added.upsert_sync(key.into(), value.into()); // These need to always be propagated to the parent process if key.to_str().is_some_and(|k| { @@ -94,27 +94,35 @@ impl GlobalEnvBag { { let key = key.as_ref(); - self.inherited.remove(key); - self.added.remove(key); + self.inherited.remove_sync(key); + self.added.remove_sync(key); - let _ = self.removed.insert(key.into()); + let _ = self.removed.insert_sync(key.into()); } pub fn list(&self, mut op: impl FnMut(&OsString, &OsString)) { - self.inherited.scan(|k, v| { + self.inherited.iter_sync(|k, v| { op(k, v); + true }); - self.added.scan(|k, v| { + self.added.iter_sync(|k, v| { op(k, v); + true }); } - pub fn list_added(&self, op: impl FnMut(&OsString, &OsString)) { - self.added.scan(op); + pub fn list_added(&self, mut op: impl FnMut(&OsString, &OsString)) { + self.added.iter_sync(|k, v| { + op(k, v); + true + }); } - pub fn list_removed(&self, op: impl FnMut(&OsString)) { - self.removed.scan(op); + pub fn list_removed(&self, mut op: impl FnMut(&OsString)) { + self.removed.iter_sync(|v| { + op(v); + true + }); } pub fn should_debug_mcp(&self) -> bool { diff --git a/crates/extension-plugin/src/extension_registry.rs b/crates/extension-plugin/src/extension_registry.rs index c896c7f8020..0a78df0c849 100644 --- a/crates/extension-plugin/src/extension_registry.rs +++ b/crates/extension-plugin/src/extension_registry.rs @@ -45,7 +45,7 @@ impl ExtensionRegistry { { let id = Id::raw(id.as_ref()); - if self.is_registered(&id) { + if self.is_registered(&id).await { return self.get_instance(&id).await; } diff --git a/crates/plugin/src/plugin_registry.rs b/crates/plugin/src/plugin_registry.rs index dd8ca6975fc..8b8baf9c026 100644 --- a/crates/plugin/src/plugin_registry.rs +++ b/crates/plugin/src/plugin_registry.rs @@ -116,8 +116,8 @@ impl PluginRegistry { })?) } - pub fn is_registered(&self, id: &Id) -> bool { - self.plugins.contains(id) + pub async fn is_registered(&self, id: &Id) -> bool { + self.plugins.contains_async(id).await } #[instrument(skip(self, op))] @@ -215,8 +215,8 @@ impl PluginRegistry { self.load_with_config(id, locator, |_| Ok(())).await } - pub fn register(&self, id: Id, plugin: T) -> miette::Result<()> { - if self.is_registered(&id) { + pub async fn register(&self, id: Id, plugin: T) -> miette::Result<()> { + if self.is_registered(&id).await { return Err(PluginError::ExistingId { id: id.to_string(), ty: self.type_of, @@ -230,7 +230,7 @@ impl PluginRegistry { "Registered plugin", ); - let _ = self.plugins.insert(id, Arc::new(plugin)); + let _ = self.plugins.insert_async(id, Arc::new(plugin)).await; Ok(()) } diff --git a/crates/project-graph/src/project_graph.rs b/crates/project-graph/src/project_graph.rs index ed4fc7e723b..b18385e5e4c 100644 --- a/crates/project-graph/src/project_graph.rs +++ b/crates/project-graph/src/project_graph.rs @@ -194,7 +194,7 @@ impl ProjectGraph { fn internal_search(&self, search: &Path) -> miette::Result> { let cache_key = search.to_path_buf(); - if let Some(cache) = self.fs_cache.read(&cache_key, |_, v| v.clone()) { + if let Some(cache) = self.fs_cache.read_sync(&cache_key, |_, v| v.clone()) { return Ok(cache); } @@ -228,7 +228,7 @@ impl ProjectGraph { } let id = Arc::new(possible_id); - let _ = self.fs_cache.insert(cache_key, Arc::clone(&id)); + let _ = self.fs_cache.insert_sync(cache_key, Arc::clone(&id)); Ok(id) } diff --git a/crates/task-runner/src/task_hashing.rs b/crates/task-runner/src/task_hashing.rs index 620836c8877..7181281d952 100644 --- a/crates/task-runner/src/task_hashing.rs +++ b/crates/task-runner/src/task_hashing.rs @@ -43,7 +43,7 @@ pub async fn hash_common_task_contents( let mut deps = BTreeMap::default(); for dep in &task.deps { - if let Some(entry) = action_context.target_states.get(&dep.target) { + if let Some(entry) = action_context.target_states.get_sync(&dep.target) { match entry.get() { TargetState::Passed(hash) => { deps.insert(&dep.target, hash.clone()); diff --git a/crates/task-runner/src/task_runner.rs b/crates/task-runner/src/task_runner.rs index ca829ab88c0..13b56f36735 100644 --- a/crates/task-runner/src/task_runner.rs +++ b/crates/task-runner/src/task_runner.rs @@ -349,7 +349,7 @@ impl<'task> TaskRunner<'task> { } for dep in &self.task.deps { - if let Some(dep_state) = context.target_states.get(&dep.target) { + if let Some(dep_state) = context.target_states.get_sync(&dep.target) { if dep_state.get().is_complete() { continue; } diff --git a/crates/task-runner/tests/task_runner_test.rs b/crates/task-runner/tests/task_runner_test.rs index c8cc31c16e5..2d8404df20b 100644 --- a/crates/task-runner/tests/task_runner_test.rs +++ b/crates/task-runner/tests/task_runner_test.rs @@ -28,7 +28,7 @@ mod task_runner { assert_eq!( context .target_states - .get(&runner.task.target) + .get_sync(&runner.task.target) .unwrap() .get(), &TargetState::Passthrough @@ -58,7 +58,7 @@ mod task_runner { let context = ActionContext::default(); context .target_states - .insert(Target::new("project", "dep").unwrap(), TargetState::Skipped) + .insert_sync(Target::new("project", "dep").unwrap(), TargetState::Skipped) .unwrap(); runner.run_with_panic(&context, &node).await.unwrap(); @@ -66,7 +66,7 @@ mod task_runner { assert_eq!( context .target_states - .get(&runner.task.target) + .get_sync(&runner.task.target) .unwrap() .get(), &TargetState::Skipped @@ -82,7 +82,7 @@ mod task_runner { let context = ActionContext::default(); context .target_states - .insert(Target::new("project", "dep").unwrap(), TargetState::Failed) + .insert_sync(Target::new("project", "dep").unwrap(), TargetState::Failed) .unwrap(); runner.run_with_panic(&context, &node).await.unwrap(); @@ -90,7 +90,7 @@ mod task_runner { assert_eq!( context .target_states - .get(&runner.task.target) + .get_sync(&runner.task.target) .unwrap() .get(), &TargetState::Skipped @@ -578,7 +578,7 @@ mod task_runner { context .target_states - .insert(Target::new("project", "dep").unwrap(), TargetState::Failed) + .insert_sync(Target::new("project", "dep").unwrap(), TargetState::Failed) .unwrap(); assert!(!runner.is_dependencies_complete(&context).unwrap()); @@ -592,7 +592,7 @@ mod task_runner { context .target_states - .insert(Target::new("project", "dep").unwrap(), TargetState::Skipped) + .insert_sync(Target::new("project", "dep").unwrap(), TargetState::Skipped) .unwrap(); assert!(!runner.is_dependencies_complete(&context).unwrap()); @@ -606,7 +606,7 @@ mod task_runner { context .target_states - .insert( + .insert_sync( Target::new("project", "dep").unwrap(), TargetState::Passed("hash123".into()), ) diff --git a/crates/toolchain-plugin/src/toolchain_registry.rs b/crates/toolchain-plugin/src/toolchain_registry.rs index 6fd6b74d4e4..a6433f19163 100644 --- a/crates/toolchain-plugin/src/toolchain_registry.rs +++ b/crates/toolchain-plugin/src/toolchain_registry.rs @@ -90,7 +90,7 @@ impl ToolchainRegistry { { let id = Id::raw(id.as_ref()); - if !self.is_registered(&id) { + if !self.is_registered(&id).await { if !self.plugins.contains_key(&id) { return Err(PluginError::UnknownId { id: id.to_string(), @@ -126,7 +126,7 @@ impl ToolchainRegistry { for id in ids { let id = Id::raw(id.as_ref()); - if self.registry.is_registered(&id) { + if self.registry.is_registered(&id).await { list.push(self.get_instance(&id).await?); continue; } diff --git a/crates/workspace-graph/src/query_projects.rs b/crates/workspace-graph/src/query_projects.rs index 09092d61b55..ab26fa22c2f 100644 --- a/crates/workspace-graph/src/query_projects.rs +++ b/crates/workspace-graph/src/query_projects.rs @@ -32,7 +32,10 @@ impl WorkspaceGraph { .expect("Querying the project graph requires a query input string."); let cache_key = query_input.to_string(); - if let Some(cache) = self.project_query_cache.read(&cache_key, |_, v| v.clone()) { + if let Some(cache) = self + .project_query_cache + .read_sync(&cache_key, |_, v| v.clone()) + { return Ok(cache); } @@ -61,7 +64,9 @@ impl WorkspaceGraph { ); let ids = Arc::new(project_ids); - let _ = self.project_query_cache.insert(cache_key, Arc::clone(&ids)); + let _ = self + .project_query_cache + .insert_sync(cache_key, Arc::clone(&ids)); Ok(ids) } diff --git a/crates/workspace-graph/src/query_tasks.rs b/crates/workspace-graph/src/query_tasks.rs index e2615e4e318..a691f099672 100644 --- a/crates/workspace-graph/src/query_tasks.rs +++ b/crates/workspace-graph/src/query_tasks.rs @@ -32,7 +32,10 @@ impl WorkspaceGraph { .expect("Querying the task graph requires a query input string."); let cache_key = query_input.to_string(); - if let Some(cache) = self.task_query_cache.read(&cache_key, |_, v| v.clone()) { + if let Some(cache) = self + .task_query_cache + .read_sync(&cache_key, |_, v| v.clone()) + { return Ok(cache); } @@ -63,7 +66,7 @@ impl WorkspaceGraph { let targets = Arc::new(targets); let _ = self .task_query_cache - .insert(cache_key, Arc::clone(&targets)); + .insert_sync(cache_key, Arc::clone(&targets)); Ok(targets) } From 8d55ad0c8347861051a8b8f992c14adc0a527c7e Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Thu, 25 Sep 2025 11:15:56 -0700 Subject: [PATCH 07/12] Revert "deps(scc): Update to v3. (#2120)" This reverts commit 9eb184ad44c95b424f4f6807412a80cb7453b166. --- Cargo.lock | 46 +++++++++---------- Cargo.toml | 10 ++-- crates/action-context/src/lib.rs | 11 ++--- crates/actions/src/actions/setup_toolchain.rs | 2 +- crates/env-var/src/global_bag.rs | 36 ++++++--------- .../src/extension_registry.rs | 2 +- crates/plugin/src/plugin_registry.rs | 10 ++-- crates/project-graph/src/project_graph.rs | 4 +- crates/task-runner/src/task_hashing.rs | 2 +- crates/task-runner/src/task_runner.rs | 2 +- crates/task-runner/tests/task_runner_test.rs | 16 +++---- .../src/toolchain_registry.rs | 4 +- crates/workspace-graph/src/query_projects.rs | 9 +--- crates/workspace-graph/src/query_tasks.rs | 7 +-- 14 files changed, 71 insertions(+), 90 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb79b458785..b773fb19f39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3765,7 +3765,7 @@ dependencies = [ "moon_common", "moon_target", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", "serde", "tokio", ] @@ -3869,7 +3869,7 @@ dependencies = [ "moon_workspace_graph", "proto_core", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", "serde", "serial_test", "starbase_sandbox", @@ -4094,7 +4094,7 @@ dependencies = [ "moon_utils", "proto_core", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", "starbase_utils", "tracing", ] @@ -4360,7 +4360,7 @@ version = "0.0.1" dependencies = [ "regex", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", ] [[package]] @@ -4544,7 +4544,7 @@ dependencies = [ "moon_utils", "proto_core", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", "starbase_styles", "starbase_utils", "tracing", @@ -4650,7 +4650,7 @@ dependencies = [ "moon_workspace_graph", "proto_core", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", "serde", "serde_json", "starbase_sandbox", @@ -4758,7 +4758,7 @@ dependencies = [ "moon_workspace", "petgraph 0.8.2", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", "starbase_events", "starbase_sandbox", "starbase_utils", @@ -4868,7 +4868,7 @@ dependencies = [ "moon_task", "reqwest", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", "serde", "sha2", "starbase_utils", @@ -5278,7 +5278,7 @@ dependencies = [ "moon_process", "regex", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 2.4.0", "semver", "serde", "starbase_sandbox", @@ -5347,7 +5347,7 @@ dependencies = [ "moon_project_graph", "moon_query", "moon_task_graph", - "scc 3.1.2", + "scc 2.4.0", "tracing", ] @@ -6298,7 +6298,7 @@ dependencies = [ "regex", "reqwest", "rustc-hash 2.1.1", - "scc 3.1.2", + "scc 3.0.7", "schematic", "semver", "serde", @@ -7006,9 +7006,9 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "saa" -version = "4.3.1" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054a3921793fff8c8a48b2dc0cd799f229dc460795b034365f0a15b2fddf25fb" +checksum = "293e425dca7c7889a87de14ff29a4112f18a155119295671cd7fb8c70015a1c5" [[package]] name = "same-file" @@ -7026,17 +7026,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" dependencies = [ "sdd 3.0.10", + "serde", ] [[package]] name = "scc" -version = "3.1.2" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b502f85d09e86afa08920ba0e320d9919e0edfb57aa6d7f7947d9961f789cdd7" +checksum = "2f0c0b27fa9a31fc2bad3b9ce122188c9df8158bdcbc3c73e3c0bc38aa69c61e" dependencies = [ "saa", - "sdd 4.1.1", - "serde", + "sdd 4.0.1", ] [[package]] @@ -7130,9 +7130,9 @@ checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" [[package]] name = "sdd" -version = "4.1.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "289309f6b5c6a090488f188a75e98d96007e763b892018de92b5889eb09a03f4" +checksum = "7d51b068a416b603c6b3aaeeba43feb2924ee80739c543482f931328dfc71cdb" [[package]] name = "security-framework" @@ -7556,9 +7556,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "starbase" -version = "0.10.6" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfcf58b02a45e1dccbbd6e10f5ebf2bef22ee6de0a50e18c7336a19be189ef3" +checksum = "2d753b4e1a05de4557a715e4886b439afa7e0c5d857a11bd8459d2de58998e01" dependencies = [ "async-trait", "chrono", @@ -7700,7 +7700,7 @@ dependencies = [ "miette 7.6.0", "regex", "reqwest", - "scc 3.1.2", + "scc 3.0.7", "serde", "serde_json", "serde_yml", @@ -8822,7 +8822,7 @@ dependencies = [ "reqwest", "reqwest-middleware", "reqwest-netrc", - "scc 3.1.2", + "scc 3.0.7", "schematic", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 4c750d71119..0f5c9958c9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ reqwest = { version = "0.12.23", default-features = false, features = [ "native-tls-vendored", ] } rustc-hash = "2.1.1" -scc = "3.1.2" +scc = "2.4.0" schematic = { version = "0.18.12", default-features = false, features = [ "schema", ] } @@ -63,8 +63,8 @@ serde = { version = "1.0.225", features = ["derive"] } serde_json = "1.0.145" serde_yml = "0.0.12" sha2 = "0.10.9" -starbase = { version = "0.10.6" } -starbase_archive = { version = "0.11.8", default-features = false, features = [ +starbase = { version = "0.10.5" } +starbase_archive = { version = "0.11.6", default-features = false, features = [ "miette", "tar-all", "zip-all", @@ -72,10 +72,10 @@ starbase_archive = { version = "0.11.8", default-features = false, features = [ starbase_console = { version = "0.6.13", features = ["miette"] } starbase_events = "0.7.3" starbase_id = { version = "0.2.3", features = ["miette", "schematic"] } -starbase_sandbox = "0.9.9" +starbase_sandbox = "0.9.7" starbase_shell = "0.10.2" starbase_styles = { version = "0.6.1", features = ["relative-path"] } -starbase_utils = { version = "0.11.19", default-features = false, features = [ +starbase_utils = { version = "0.11.16", default-features = false, features = [ "editor-config", "glob-cache", "miette", diff --git a/crates/action-context/src/lib.rs b/crates/action-context/src/lib.rs index db11df4a1f3..d303ac64d5c 100644 --- a/crates/action-context/src/lib.rs +++ b/crates/action-context/src/lib.rs @@ -69,7 +69,7 @@ pub struct ActionContext { impl ActionContext { pub fn get_or_create_mutex(&self, name: &str) -> Arc> { - if let Some(value) = self.named_mutexes.read_sync(name, |_, v| v.clone()) { + if let Some(value) = self.named_mutexes.read(name, |_, v| v.clone()) { return value; } @@ -77,7 +77,7 @@ impl ActionContext { let _ = self .named_mutexes - .insert_sync(name.to_owned(), Arc::clone(&mutex)); + .insert(name.to_owned(), Arc::clone(&mutex)); mutex } @@ -93,9 +93,8 @@ impl ActionContext { pub fn get_target_states(&self) -> FxHashMap { let mut map = FxHashMap::default(); - self.target_states.iter_sync(|k, v| { + self.target_states.scan(|k, v| { map.insert(k.to_owned(), v.to_owned()); - true }); map } @@ -105,9 +104,7 @@ impl ActionContext { } pub fn set_target_state>(&self, target: T, state: TargetState) { - let _ = self - .target_states - .insert_sync(target.as_ref().to_owned(), state); + let _ = self.target_states.insert(target.as_ref().to_owned(), state); } pub fn should_inherit_args>(&self, target: T) -> bool { diff --git a/crates/actions/src/actions/setup_toolchain.rs b/crates/actions/src/actions/setup_toolchain.rs index 63807ec199e..045559703ca 100644 --- a/crates/actions/src/actions/setup_toolchain.rs +++ b/crates/actions/src/actions/setup_toolchain.rs @@ -60,7 +60,7 @@ pub async fn setup_toolchain( // Acquire a lock for the toolchain ID let locks = LOCKS.get_or_init(scc::HashMap::default); - let entry = locks.entry_async(node.runtime.id()).await.or_default(); + let entry = locks.entry(node.runtime.id()).or_default(); let _lock = entry.lock().await; // Install and setup the specific tool + version in the toolchain! diff --git a/crates/env-var/src/global_bag.rs b/crates/env-var/src/global_bag.rs index 018f9920117..b75bdbfeb24 100644 --- a/crates/env-var/src/global_bag.rs +++ b/crates/env-var/src/global_bag.rs @@ -26,7 +26,7 @@ impl GlobalEnvBag { { let key = key.as_ref(); - self.inherited.contains_sync(key) || self.added.contains_sync(key) + self.inherited.contains(key) || self.added.contains(key) } pub fn get(&self, key: K) -> Option @@ -44,8 +44,8 @@ impl GlobalEnvBag { if let Some(value) = self .added - .read_sync(key, |_, value| op(value)) - .or_else(|| self.inherited.read_sync(key, |_, value| op(value))) + .read(key, |_, value| op(value)) + .or_else(|| self.inherited.read(key, |_, value| op(value))) { return Some(value); } @@ -55,7 +55,7 @@ impl GlobalEnvBag { if let Some(value) = env::var_os(key) { let as_value = op(&value); - let _ = self.inherited.insert_sync(key.into(), value); + let _ = self.inherited.insert(key.into(), value); return Some(as_value); } @@ -71,7 +71,7 @@ impl GlobalEnvBag { let key = key.as_ref(); let value = value.as_ref(); - self.added.upsert_sync(key.into(), value.into()); + self.added.upsert(key.into(), value.into()); // These need to always be propagated to the parent process if key.to_str().is_some_and(|k| { @@ -94,35 +94,27 @@ impl GlobalEnvBag { { let key = key.as_ref(); - self.inherited.remove_sync(key); - self.added.remove_sync(key); + self.inherited.remove(key); + self.added.remove(key); - let _ = self.removed.insert_sync(key.into()); + let _ = self.removed.insert(key.into()); } pub fn list(&self, mut op: impl FnMut(&OsString, &OsString)) { - self.inherited.iter_sync(|k, v| { + self.inherited.scan(|k, v| { op(k, v); - true }); - self.added.iter_sync(|k, v| { + self.added.scan(|k, v| { op(k, v); - true }); } - pub fn list_added(&self, mut op: impl FnMut(&OsString, &OsString)) { - self.added.iter_sync(|k, v| { - op(k, v); - true - }); + pub fn list_added(&self, op: impl FnMut(&OsString, &OsString)) { + self.added.scan(op); } - pub fn list_removed(&self, mut op: impl FnMut(&OsString)) { - self.removed.iter_sync(|v| { - op(v); - true - }); + pub fn list_removed(&self, op: impl FnMut(&OsString)) { + self.removed.scan(op); } pub fn should_debug_mcp(&self) -> bool { diff --git a/crates/extension-plugin/src/extension_registry.rs b/crates/extension-plugin/src/extension_registry.rs index 0a78df0c849..c896c7f8020 100644 --- a/crates/extension-plugin/src/extension_registry.rs +++ b/crates/extension-plugin/src/extension_registry.rs @@ -45,7 +45,7 @@ impl ExtensionRegistry { { let id = Id::raw(id.as_ref()); - if self.is_registered(&id).await { + if self.is_registered(&id) { return self.get_instance(&id).await; } diff --git a/crates/plugin/src/plugin_registry.rs b/crates/plugin/src/plugin_registry.rs index 8b8baf9c026..dd8ca6975fc 100644 --- a/crates/plugin/src/plugin_registry.rs +++ b/crates/plugin/src/plugin_registry.rs @@ -116,8 +116,8 @@ impl PluginRegistry { })?) } - pub async fn is_registered(&self, id: &Id) -> bool { - self.plugins.contains_async(id).await + pub fn is_registered(&self, id: &Id) -> bool { + self.plugins.contains(id) } #[instrument(skip(self, op))] @@ -215,8 +215,8 @@ impl PluginRegistry { self.load_with_config(id, locator, |_| Ok(())).await } - pub async fn register(&self, id: Id, plugin: T) -> miette::Result<()> { - if self.is_registered(&id).await { + pub fn register(&self, id: Id, plugin: T) -> miette::Result<()> { + if self.is_registered(&id) { return Err(PluginError::ExistingId { id: id.to_string(), ty: self.type_of, @@ -230,7 +230,7 @@ impl PluginRegistry { "Registered plugin", ); - let _ = self.plugins.insert_async(id, Arc::new(plugin)).await; + let _ = self.plugins.insert(id, Arc::new(plugin)); Ok(()) } diff --git a/crates/project-graph/src/project_graph.rs b/crates/project-graph/src/project_graph.rs index b18385e5e4c..ed4fc7e723b 100644 --- a/crates/project-graph/src/project_graph.rs +++ b/crates/project-graph/src/project_graph.rs @@ -194,7 +194,7 @@ impl ProjectGraph { fn internal_search(&self, search: &Path) -> miette::Result> { let cache_key = search.to_path_buf(); - if let Some(cache) = self.fs_cache.read_sync(&cache_key, |_, v| v.clone()) { + if let Some(cache) = self.fs_cache.read(&cache_key, |_, v| v.clone()) { return Ok(cache); } @@ -228,7 +228,7 @@ impl ProjectGraph { } let id = Arc::new(possible_id); - let _ = self.fs_cache.insert_sync(cache_key, Arc::clone(&id)); + let _ = self.fs_cache.insert(cache_key, Arc::clone(&id)); Ok(id) } diff --git a/crates/task-runner/src/task_hashing.rs b/crates/task-runner/src/task_hashing.rs index 7181281d952..620836c8877 100644 --- a/crates/task-runner/src/task_hashing.rs +++ b/crates/task-runner/src/task_hashing.rs @@ -43,7 +43,7 @@ pub async fn hash_common_task_contents( let mut deps = BTreeMap::default(); for dep in &task.deps { - if let Some(entry) = action_context.target_states.get_sync(&dep.target) { + if let Some(entry) = action_context.target_states.get(&dep.target) { match entry.get() { TargetState::Passed(hash) => { deps.insert(&dep.target, hash.clone()); diff --git a/crates/task-runner/src/task_runner.rs b/crates/task-runner/src/task_runner.rs index 13b56f36735..ca829ab88c0 100644 --- a/crates/task-runner/src/task_runner.rs +++ b/crates/task-runner/src/task_runner.rs @@ -349,7 +349,7 @@ impl<'task> TaskRunner<'task> { } for dep in &self.task.deps { - if let Some(dep_state) = context.target_states.get_sync(&dep.target) { + if let Some(dep_state) = context.target_states.get(&dep.target) { if dep_state.get().is_complete() { continue; } diff --git a/crates/task-runner/tests/task_runner_test.rs b/crates/task-runner/tests/task_runner_test.rs index 2d8404df20b..c8cc31c16e5 100644 --- a/crates/task-runner/tests/task_runner_test.rs +++ b/crates/task-runner/tests/task_runner_test.rs @@ -28,7 +28,7 @@ mod task_runner { assert_eq!( context .target_states - .get_sync(&runner.task.target) + .get(&runner.task.target) .unwrap() .get(), &TargetState::Passthrough @@ -58,7 +58,7 @@ mod task_runner { let context = ActionContext::default(); context .target_states - .insert_sync(Target::new("project", "dep").unwrap(), TargetState::Skipped) + .insert(Target::new("project", "dep").unwrap(), TargetState::Skipped) .unwrap(); runner.run_with_panic(&context, &node).await.unwrap(); @@ -66,7 +66,7 @@ mod task_runner { assert_eq!( context .target_states - .get_sync(&runner.task.target) + .get(&runner.task.target) .unwrap() .get(), &TargetState::Skipped @@ -82,7 +82,7 @@ mod task_runner { let context = ActionContext::default(); context .target_states - .insert_sync(Target::new("project", "dep").unwrap(), TargetState::Failed) + .insert(Target::new("project", "dep").unwrap(), TargetState::Failed) .unwrap(); runner.run_with_panic(&context, &node).await.unwrap(); @@ -90,7 +90,7 @@ mod task_runner { assert_eq!( context .target_states - .get_sync(&runner.task.target) + .get(&runner.task.target) .unwrap() .get(), &TargetState::Skipped @@ -578,7 +578,7 @@ mod task_runner { context .target_states - .insert_sync(Target::new("project", "dep").unwrap(), TargetState::Failed) + .insert(Target::new("project", "dep").unwrap(), TargetState::Failed) .unwrap(); assert!(!runner.is_dependencies_complete(&context).unwrap()); @@ -592,7 +592,7 @@ mod task_runner { context .target_states - .insert_sync(Target::new("project", "dep").unwrap(), TargetState::Skipped) + .insert(Target::new("project", "dep").unwrap(), TargetState::Skipped) .unwrap(); assert!(!runner.is_dependencies_complete(&context).unwrap()); @@ -606,7 +606,7 @@ mod task_runner { context .target_states - .insert_sync( + .insert( Target::new("project", "dep").unwrap(), TargetState::Passed("hash123".into()), ) diff --git a/crates/toolchain-plugin/src/toolchain_registry.rs b/crates/toolchain-plugin/src/toolchain_registry.rs index a6433f19163..6fd6b74d4e4 100644 --- a/crates/toolchain-plugin/src/toolchain_registry.rs +++ b/crates/toolchain-plugin/src/toolchain_registry.rs @@ -90,7 +90,7 @@ impl ToolchainRegistry { { let id = Id::raw(id.as_ref()); - if !self.is_registered(&id).await { + if !self.is_registered(&id) { if !self.plugins.contains_key(&id) { return Err(PluginError::UnknownId { id: id.to_string(), @@ -126,7 +126,7 @@ impl ToolchainRegistry { for id in ids { let id = Id::raw(id.as_ref()); - if self.registry.is_registered(&id).await { + if self.registry.is_registered(&id) { list.push(self.get_instance(&id).await?); continue; } diff --git a/crates/workspace-graph/src/query_projects.rs b/crates/workspace-graph/src/query_projects.rs index ab26fa22c2f..09092d61b55 100644 --- a/crates/workspace-graph/src/query_projects.rs +++ b/crates/workspace-graph/src/query_projects.rs @@ -32,10 +32,7 @@ impl WorkspaceGraph { .expect("Querying the project graph requires a query input string."); let cache_key = query_input.to_string(); - if let Some(cache) = self - .project_query_cache - .read_sync(&cache_key, |_, v| v.clone()) - { + if let Some(cache) = self.project_query_cache.read(&cache_key, |_, v| v.clone()) { return Ok(cache); } @@ -64,9 +61,7 @@ impl WorkspaceGraph { ); let ids = Arc::new(project_ids); - let _ = self - .project_query_cache - .insert_sync(cache_key, Arc::clone(&ids)); + let _ = self.project_query_cache.insert(cache_key, Arc::clone(&ids)); Ok(ids) } diff --git a/crates/workspace-graph/src/query_tasks.rs b/crates/workspace-graph/src/query_tasks.rs index a691f099672..e2615e4e318 100644 --- a/crates/workspace-graph/src/query_tasks.rs +++ b/crates/workspace-graph/src/query_tasks.rs @@ -32,10 +32,7 @@ impl WorkspaceGraph { .expect("Querying the task graph requires a query input string."); let cache_key = query_input.to_string(); - if let Some(cache) = self - .task_query_cache - .read_sync(&cache_key, |_, v| v.clone()) - { + if let Some(cache) = self.task_query_cache.read(&cache_key, |_, v| v.clone()) { return Ok(cache); } @@ -66,7 +63,7 @@ impl WorkspaceGraph { let targets = Arc::new(targets); let _ = self .task_query_cache - .insert_sync(cache_key, Arc::clone(&targets)); + .insert(cache_key, Arc::clone(&targets)); Ok(targets) } From 80b05436a18a154ecfaac6299125e553f591cd66 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Thu, 25 Sep 2025 21:30:37 -0700 Subject: [PATCH 08/12] new: Add more `runInCI` options. (#2135) * Bump * Add only variant. * Start on skip. * Fix schemas. * Add more tests. --- CHANGELOG.md | 3 + .../action-graph/src/action_graph_builder.rs | 2 +- .../tests/action_graph_builder_test.rs | 36 +++ crates/affected/src/affected_tracker.rs | 20 +- .../tests/__fixtures__/tasks/ci/moon.yml | 6 + .../affected/tests/affected_tracker_test.rs | 72 ++++++ .../config/src/project/task_options_config.rs | 6 +- crates/task-builder/src/task_deps_builder.rs | 8 +- .../tests/task_deps_builder_test.rs | 232 ++++++++++++------ crates/task/src/task.rs | 7 +- packages/types/src/tasks-config.ts | 4 +- website/docs/config/project.mdx | 11 +- website/static/schemas/project.json | 4 +- website/static/schemas/tasks.json | 4 +- 14 files changed, 312 insertions(+), 103 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a453e0d4e0..68d283b2fc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ - Added URI support: `group://` - Added object support: `group: ''` - This is similar to the `@files`, `@globs`, etc, token functions. +- Added new values to the `runInCI` task option: + - `only` - Only run the task in CI, and not locally, when affected. + - `skip` - Skip running in CI but run locally and allow task relationships to be valid. #### ⚙️ Internal diff --git a/crates/action-graph/src/action_graph_builder.rs b/crates/action-graph/src/action_graph_builder.rs index fb0825381c8..cca2fe88979 100644 --- a/crates/action-graph/src/action_graph_builder.rs +++ b/crates/action-graph/src/action_graph_builder.rs @@ -809,7 +809,7 @@ impl<'query> ActionGraphBuilder<'query> { debug!( task_target = task.target.as_str(), - "Not running task {} because {} is false", + "Not running task {} in CI because {} has been configured not to", color::id(&task.target.id), color::property("runInCI"), ); diff --git a/crates/action-graph/tests/action_graph_builder_test.rs b/crates/action-graph/tests/action_graph_builder_test.rs index ea42dbf80bd..260a608c9ff 100644 --- a/crates/action-graph/tests/action_graph_builder_test.rs +++ b/crates/action-graph/tests/action_graph_builder_test.rs @@ -1578,6 +1578,42 @@ mod action_graph_builder { mod dont_run_in_ci { use super::*; + #[tokio::test(flavor = "multi_thread")] + async fn doesnt_graph_if_task_ci_skip() { + let sandbox = create_sandbox("projects"); + let mut container = ActionGraphContainer::new(sandbox.path()); + let mut builder = container + .create_builder(container.create_workspace_graph().await) + .await; + + let mut task = create_task("bar", "build"); + task.options.run_in_ci = TaskOptionRunInCI::Skip; + + builder + .run_task( + &task, + &RunRequirements { + ci: true, + ci_check: true, + ..Default::default() + }, + ) + .await + .unwrap(); + + let (context, graph) = builder.build(); + + assert_eq!( + context.get_target_states(), + FxHashMap::from_iter([( + Target::parse("bar:build").unwrap(), + TargetState::Passthrough + )]) + ); + + assert!(topo(graph).is_empty()); + } + #[tokio::test(flavor = "multi_thread")] async fn doesnt_graph_if_ci_check_true() { let sandbox = create_sandbox("projects"); diff --git a/crates/affected/src/affected_tracker.rs b/crates/affected/src/affected_tracker.rs index fe4d3c296ca..a0730ae3907 100644 --- a/crates/affected/src/affected_tracker.rs +++ b/crates/affected/src/affected_tracker.rs @@ -389,15 +389,17 @@ impl AffectedTracker { } // Special CI handling - if self.ci { - match &task.options.run_in_ci { - TaskOptionRunInCI::Always => { - return Ok(Some(AffectedBy::AlwaysAffected)); - } - TaskOptionRunInCI::Enabled(false) => return Ok(None), - _ => {} - }; - } + match (self.ci, &task.options.run_in_ci) { + (true, TaskOptionRunInCI::Always) => { + return Ok(Some(AffectedBy::AlwaysAffected)); + } + (true, TaskOptionRunInCI::Enabled(false)) + | (true, TaskOptionRunInCI::Skip) + | (false, TaskOptionRunInCI::Only) => { + return Ok(None); + } + _ => {} + }; // Never affected if task.state.empty_inputs { diff --git a/crates/affected/tests/__fixtures__/tasks/ci/moon.yml b/crates/affected/tests/__fixtures__/tasks/ci/moon.yml index 8b72603701e..daf6d525613 100644 --- a/crates/affected/tests/__fixtures__/tasks/ci/moon.yml +++ b/crates/affected/tests/__fixtures__/tasks/ci/moon.yml @@ -11,3 +11,9 @@ tasks: always: options: runInCI: always + only: + options: + runInCI: only + skip: + options: + runInCI: skip diff --git a/crates/affected/tests/affected_tracker_test.rs b/crates/affected/tests/affected_tracker_test.rs index f9e8c5d04b8..cd00367ec48 100644 --- a/crates/affected/tests/affected_tracker_test.rs +++ b/crates/affected/tests/affected_tracker_test.rs @@ -1249,5 +1249,77 @@ mod affected_tasks { )]) ); } + + #[tokio::test] + async fn when_ci_only_tracks_when_ci() { + let workspace_graph = build_graph("tasks").await; + let touched_files = FxHashSet::from_iter(["ci/file.txt".into()]); + + let mut tracker = AffectedTracker::new(workspace_graph.into(), touched_files); + tracker.set_ci_check(true); + tracker + .track_tasks_by_target(&[Target::parse("ci:only").unwrap()]) + .unwrap(); + let affected = tracker.build(); + + assert_eq!( + affected.tasks, + FxHashMap::from_iter([( + Target::parse("ci:only").unwrap(), + create_state_from_file("ci/file.txt") + )]) + ); + } + + #[tokio::test] + async fn when_ci_only_doesnt_track_when_not_in_ci() { + let workspace_graph = build_graph("tasks").await; + let touched_files = FxHashSet::from_iter(["ci/file.txt".into()]); + + let mut tracker = AffectedTracker::new(workspace_graph.into(), touched_files); + tracker.set_ci_check(false); + tracker + .track_tasks_by_target(&[Target::parse("ci:only").unwrap()]) + .unwrap(); + let affected = tracker.build(); + + assert!(affected.tasks.is_empty()); + } + + #[tokio::test] + async fn when_ci_doesnt_track_for_skip() { + let workspace_graph = build_graph("tasks").await; + let touched_files = FxHashSet::from_iter(["ci/file.txt".into()]); + + let mut tracker = AffectedTracker::new(workspace_graph.into(), touched_files); + tracker.set_ci_check(true); + tracker + .track_tasks_by_target(&[Target::parse("ci:skip").unwrap()]) + .unwrap(); + let affected = tracker.build(); + + assert!(affected.tasks.is_empty()); + } + + #[tokio::test] + async fn when_not_ci_tracks_for_skip() { + let workspace_graph = build_graph("tasks").await; + let touched_files = FxHashSet::from_iter(["ci/file.txt".into()]); + + let mut tracker = AffectedTracker::new(workspace_graph.into(), touched_files); + tracker.set_ci_check(false); + tracker + .track_tasks_by_target(&[Target::parse("ci:skip").unwrap()]) + .unwrap(); + let affected = tracker.build(); + + assert_eq!( + affected.tasks, + FxHashMap::from_iter([( + Target::parse("ci:skip").unwrap(), + create_state_from_file("ci/file.txt") + )]) + ); + } } } diff --git a/crates/config/src/project/task_options_config.rs b/crates/config/src/project/task_options_config.rs index 68d2da707a6..103791078da 100644 --- a/crates/config/src/project/task_options_config.rs +++ b/crates/config/src/project/task_options_config.rs @@ -115,13 +115,17 @@ config_enum!( Always, /// Only run if affected by touched files. Affected, + /// Only run in CI and not locally if affected by touched files. + Only, + /// Skip running in CI but run locally and allow task relationships to be valid. + Skip, /// Either affected, or don't run at all. #[serde(untagged)] Enabled(bool), } ); -generate_switch!(TaskOptionRunInCI, ["always", "affected"]); +generate_switch!(TaskOptionRunInCI, ["always", "affected", "only", "skip"]); config_unit_enum!( /// The strategy in which to merge a specific task option. diff --git a/crates/task-builder/src/task_deps_builder.rs b/crates/task-builder/src/task_deps_builder.rs index 1f27131bd46..4ba3a72f35c 100644 --- a/crates/task-builder/src/task_deps_builder.rs +++ b/crates/task-builder/src/task_deps_builder.rs @@ -2,7 +2,7 @@ use crate::tasks_builder_error::TasksBuilderError; use moon_common::Id; use moon_config::{DependencyConfig, DependencyScope, DependencySource, TaskDependencyConfig}; use moon_project::Project; -use moon_task::{Target, TargetScope, Task, TaskOptions}; +use moon_task::{Target, TargetScope, Task, TaskOptionRunInCI, TaskOptions}; use std::mem; use tracing::trace; @@ -154,7 +154,11 @@ impl TaskDepsBuilder<'_> { } // Do not depend on tasks that can't run in CI - if !dep_task_options.run_in_ci.is_enabled() && self.task.options.run_in_ci.is_enabled() { + if !dep_task_options.run_in_ci.is_enabled() + && self.task.options.run_in_ci.is_enabled() + && dep_task_options.run_in_ci != TaskOptionRunInCI::Skip + && self.task.options.run_in_ci != TaskOptionRunInCI::Skip + { return Err(TasksBuilderError::RunInCiDepRequirement { dep: dep_task_target.to_owned(), task: self.task.target.to_owned(), diff --git a/crates/task-builder/tests/task_deps_builder_test.rs b/crates/task-builder/tests/task_deps_builder_test.rs index aafd0fd66a3..3feb9665b31 100644 --- a/crates/task-builder/tests/task_deps_builder_test.rs +++ b/crates/task-builder/tests/task_deps_builder_test.rs @@ -108,96 +108,172 @@ mod task_deps_builder { ); } - #[test] - #[should_panic(expected = "Task project:task cannot depend on task project:no-ci")] - fn errors_if_dep_not_run_in_ci() { - let mut project = create_project(); + mod run_in_ci { + use super::*; - let mut task = create_task(); - task.options.run_in_ci = TaskOptionRunInCI::Enabled(true); - task.deps - .push(TaskDependencyConfig::new(Target::parse("no-ci").unwrap())); + #[test] + #[should_panic(expected = "Task project:task cannot depend on task project:no-ci")] + fn errors_if_dep_not_enabled() { + let mut project = create_project(); - build_task_deps_with_data( - &mut project, - &mut task, - FxHashMap::from_iter([( - Target::parse("project:no-ci").unwrap(), - TaskOptions { - run_in_ci: TaskOptionRunInCI::Enabled(false), - ..Default::default() - }, - )]), - ); - } + let mut task = create_task(); + task.options.run_in_ci = TaskOptionRunInCI::Enabled(true); + task.deps + .push(TaskDependencyConfig::new(Target::parse("no-ci").unwrap())); - #[test] - fn doesnt_errors_if_dep_run_in_ci() { - let mut project = create_project(); + build_task_deps_with_data( + &mut project, + &mut task, + FxHashMap::from_iter([( + Target::parse("project:no-ci").unwrap(), + TaskOptions { + run_in_ci: TaskOptionRunInCI::Enabled(false), + ..Default::default() + }, + )]), + ); + } - let mut task = create_task(); - task.options.run_in_ci = TaskOptionRunInCI::Enabled(false); - task.deps - .push(TaskDependencyConfig::new(Target::parse("ci").unwrap())); + #[test] + fn doesnt_errors_if_dep_enabled() { + let mut project = create_project(); - build_task_deps_with_data( - &mut project, - &mut task, - FxHashMap::from_iter([( - Target::parse("project:ci").unwrap(), - TaskOptions { - run_in_ci: TaskOptionRunInCI::Enabled(true), - ..Default::default() - }, - )]), - ); - } + let mut task = create_task(); + task.options.run_in_ci = TaskOptionRunInCI::Enabled(false); + task.deps + .push(TaskDependencyConfig::new(Target::parse("ci").unwrap())); - #[test] - #[should_panic(expected = "Non-persistent task project:task cannot depend on persistent task")] - fn errors_for_invalid_persistent_chain() { - let mut project = create_project(); + build_task_deps_with_data( + &mut project, + &mut task, + FxHashMap::from_iter([( + Target::parse("project:ci").unwrap(), + TaskOptions { + run_in_ci: TaskOptionRunInCI::Enabled(true), + ..Default::default() + }, + )]), + ); + } - let mut task = create_task(); - task.options.persistent = false; - task.deps.push(TaskDependencyConfig::new( - Target::parse("persistent").unwrap(), - )); + #[test] + fn doesnt_errors_if_dep_is_skipped() { + let mut project = create_project(); - build_task_deps_with_data( - &mut project, - &mut task, - FxHashMap::from_iter([( - Target::parse("project:persistent").unwrap(), - TaskOptions { - persistent: true, - ..Default::default() - }, - )]), - ); + let mut task = create_task(); + task.options.run_in_ci = TaskOptionRunInCI::Enabled(true); + task.deps + .push(TaskDependencyConfig::new(Target::parse("ci").unwrap())); + + build_task_deps_with_data( + &mut project, + &mut task, + FxHashMap::from_iter([( + Target::parse("project:ci").unwrap(), + TaskOptions { + run_in_ci: TaskOptionRunInCI::Skip, + ..Default::default() + }, + )]), + ); + } + + #[test] + fn doesnt_errors_if_task_is_skipped() { + let mut project = create_project(); + + let mut task = create_task(); + task.options.run_in_ci = TaskOptionRunInCI::Skip; + task.deps + .push(TaskDependencyConfig::new(Target::parse("ci").unwrap())); + + build_task_deps_with_data( + &mut project, + &mut task, + FxHashMap::from_iter([( + Target::parse("project:ci").unwrap(), + TaskOptions { + run_in_ci: TaskOptionRunInCI::Enabled(true), + ..Default::default() + }, + )]), + ); + } + + #[test] + fn doesnt_errors_if_both_are_skipped() { + let mut project = create_project(); + + let mut task = create_task(); + task.options.run_in_ci = TaskOptionRunInCI::Skip; + task.deps + .push(TaskDependencyConfig::new(Target::parse("ci").unwrap())); + + build_task_deps_with_data( + &mut project, + &mut task, + FxHashMap::from_iter([( + Target::parse("project:ci").unwrap(), + TaskOptions { + run_in_ci: TaskOptionRunInCI::Skip, + ..Default::default() + }, + )]), + ); + } } - #[test] - fn doesnt_errors_for_valid_persistent_chain() { - let mut project = create_project(); + mod persistent { + use super::*; - let mut task = create_task(); - task.options.persistent = true; - task.deps.push(TaskDependencyConfig::new( - Target::parse("not-persistent").unwrap(), - )); + #[test] + #[should_panic( + expected = "Non-persistent task project:task cannot depend on persistent task" + )] + fn errors_for_invalid_persistent_chain() { + let mut project = create_project(); - build_task_deps_with_data( - &mut project, - &mut task, - FxHashMap::from_iter([( - Target::parse("project:not-persistent").unwrap(), - TaskOptions { - persistent: false, - ..Default::default() - }, - )]), - ); + let mut task = create_task(); + task.options.persistent = false; + task.deps.push(TaskDependencyConfig::new( + Target::parse("persistent").unwrap(), + )); + + build_task_deps_with_data( + &mut project, + &mut task, + FxHashMap::from_iter([( + Target::parse("project:persistent").unwrap(), + TaskOptions { + persistent: true, + ..Default::default() + }, + )]), + ); + } + + #[test] + fn doesnt_errors_for_valid_persistent_chain() { + let mut project = create_project(); + + let mut task = create_task(); + task.options.persistent = true; + task.deps.push(TaskDependencyConfig::new( + Target::parse("not-persistent").unwrap(), + )); + + build_task_deps_with_data( + &mut project, + &mut task, + FxHashMap::from_iter([( + Target::parse("project:not-persistent").unwrap(), + TaskOptions { + persistent: false, + ..Default::default() + }, + )]), + ); + } } mod all_scope { diff --git a/crates/task/src/task.rs b/crates/task/src/task.rs index f1d066999b6..b453d4e6919 100644 --- a/crates/task/src/task.rs +++ b/crates/task/src/task.rs @@ -1,8 +1,8 @@ use crate::task_options::TaskOptions; use moon_common::{Id, cacheable, path::WorkspaceRelativePathBuf}; use moon_config::{ - Input, OutputPath, PlatformType, TaskDependencyConfig, TaskPreset, TaskType, is_false, - schematic::RegexSetting, + Input, OutputPath, PlatformType, TaskDependencyConfig, TaskOptionRunInCI, TaskPreset, TaskType, + is_false, schematic::RegexSetting, }; use moon_feature_flags::glob_walk_with_options; use moon_target::Target; @@ -312,7 +312,8 @@ impl Task { /// Return true if the task should run in a CI environment. pub fn should_run_in_ci(&self) -> bool { - if !self.options.run_in_ci.is_enabled() { + if !self.options.run_in_ci.is_enabled() || self.options.run_in_ci == TaskOptionRunInCI::Skip + { return false; } diff --git a/packages/types/src/tasks-config.ts b/packages/types/src/tasks-config.ts index 1f770e5135c..d7c2276c096 100644 --- a/packages/types/src/tasks-config.ts +++ b/packages/types/src/tasks-config.ts @@ -215,7 +215,7 @@ export interface TaskOptionsConfig { /** Runs the task from the workspace root, instead of the project root. */ runFromWorkspaceRoot: boolean | null; /** Whether to run the task in CI or not, when executing `moon ci` or `moon run`. */ - runInCI: boolean | 'always' | 'affected' | null; + runInCI: boolean | 'always' | 'affected' | 'only' | 'skip' | null; /** * Runs the task within a shell. When not defined, runs the task * directly while relying on `PATH` resolution. @@ -507,7 +507,7 @@ export interface PartialTaskOptionsConfig { /** Runs the task from the workspace root, instead of the project root. */ runFromWorkspaceRoot?: boolean | null; /** Whether to run the task in CI or not, when executing `moon ci` or `moon run`. */ - runInCI?: boolean | 'always' | 'affected' | null; + runInCI?: boolean | 'always' | 'affected' | 'only' | 'skip' | null; /** * Runs the task within a shell. When not defined, runs the task * directly while relying on `PATH` resolution. diff --git a/website/docs/config/project.mdx b/website/docs/config/project.mdx index 893db9536b6..f48df012a31 100644 --- a/website/docs/config/project.mdx +++ b/website/docs/config/project.mdx @@ -1524,14 +1524,15 @@ tasks: Whether to run the task automatically in a CI (continuous integration) environment when affected by -touched files, typically through the [`moon ci`](../commands/ci) command. Supports the following -values: +touched files using the [`moon ci`](../commands/ci) command. Supports the following values: - `always` - Always run in CI, regardless if affected or not. -- `true`, `affected` - Only run if affected by touched files. +- `affected`, `true` (default) - Only run in CI if affected by touched files. - `false` - Never run in CI. - -Defaults to `true` unless the [`local`](#local) setting is enabled. +- `only` - Only run in CI, and not locally, if affected by touched files. + +- `skip` - Skip running in CI but run locally and allow task relationships to be valid. + ```yaml title="moon.yml" {5} tasks: diff --git a/website/static/schemas/project.json b/website/static/schemas/project.json index b90f5422396..0d93cce893d 100644 --- a/website/static/schemas/project.json +++ b/website/static/schemas/project.json @@ -1651,7 +1651,9 @@ "type": "string", "enum": [ "always", - "affected" + "affected", + "only", + "skip" ] } ] diff --git a/website/static/schemas/tasks.json b/website/static/schemas/tasks.json index cb95b1a5c54..56d3d3e1e67 100644 --- a/website/static/schemas/tasks.json +++ b/website/static/schemas/tasks.json @@ -937,7 +937,9 @@ "type": "string", "enum": [ "always", - "affected" + "affected", + "only", + "skip" ] } ] From 79389ec713b778f3f8bcd4fc02a050e21141e9ef Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Fri, 26 Sep 2025 18:41:53 -0700 Subject: [PATCH 09/12] internal: Rework project/task building. (#2137) * Rename type. * Rename type. * Regen schemas. * Add helper. * Remove expander. * Update project builder. * Update tsk builder. * Revert "Update tsk builder." This reverts commit d2c431f97ba54322db9cdf2de405e8cff4b611bd. * Try another approach. * Add tests. * Fix tests. --- crates/affected/src/affected_tracker.rs | 2 +- .../src/commands/migrate/from_package_json.rs | 6 +- crates/config-schema/src/typescript_types.rs | 4 +- crates/config/src/project/dep_config.rs | 15 +-- crates/config/src/project/task_config.rs | 11 +++ crates/config/src/project_config.rs | 2 +- crates/config/src/shapes/input.rs | 6 +- crates/config/tests/project_config_test.rs | 18 ++-- crates/project-builder/src/project_builder.rs | 88 ++++++++++------- .../tests/project_builder_test.rs | 14 +-- .../project-expander/src/project_expander.rs | 4 +- .../project-graph/tests/project_graph_test.rs | 14 +-- ...project_graph__aliases__loads_aliases.snap | 10 +- crates/project/src/project.rs | 6 +- crates/task-builder/src/task_deps_builder.rs | 8 +- crates/task-builder/src/tasks_builder.rs | 48 ++++++++- .../task-builder/src/tasks_builder_error.rs | 16 ++- .../tests/__fixtures__/builder/dep-a/moon.yml | 3 + .../tests/__fixtures__/builder/dep-b/moon.yml | 3 + .../tests/__fixtures__/builder/dep-c/moon.yml | 3 + .../builder/inputs-project/moon.yml | 14 +++ .../tests/task_deps_builder_test.rs | 38 +++---- .../task-builder/tests/tasks_builder_test.rs | 90 +++++++++++++++++ crates/task-expander/src/token_expander.rs | 26 +---- .../tests/token_expander_test.rs | 94 ++++-------------- crates/task-graph/src/task_graph.rs | 16 +-- crates/test-utils/src/workspace_mocker.rs | 5 +- crates/workspace/src/build_data.rs | 4 +- crates/workspace/src/workspace_builder.rs | 13 +-- legacy/bun/platform/src/bun_platform.rs | 8 +- legacy/core/platform/src/platform.rs | 4 +- legacy/deno/platform/src/deno_platform.rs | 6 +- legacy/node/platform/src/node_platform.rs | 10 +- legacy/python/platform/src/python_platform.rs | 8 +- legacy/rust/platform/src/rust_platform.rs | 9 +- packages/types/src/project-config.ts | 11 +-- packages/types/src/project.ts | 8 +- packages/types/src/tasks-config.ts | 3 + website/static/schemas/project.json | 98 +++++++++---------- 39 files changed, 431 insertions(+), 315 deletions(-) create mode 100644 crates/task-builder/tests/__fixtures__/builder/dep-a/moon.yml create mode 100644 crates/task-builder/tests/__fixtures__/builder/dep-b/moon.yml create mode 100644 crates/task-builder/tests/__fixtures__/builder/dep-c/moon.yml create mode 100644 crates/task-builder/tests/__fixtures__/builder/inputs-project/moon.yml diff --git a/crates/affected/src/affected_tracker.rs b/crates/affected/src/affected_tracker.rs index a0730ae3907..2c35ea03494 100644 --- a/crates/affected/src/affected_tracker.rs +++ b/crates/affected/src/affected_tracker.rs @@ -455,7 +455,7 @@ impl AffectedTracker { continue; } - let projects = if inner.project == "^" { + let projects = if inner.is_all_deps() { has_all_project_sources = true; let parent = self diff --git a/crates/app/src/commands/migrate/from_package_json.rs b/crates/app/src/commands/migrate/from_package_json.rs index b9129a4c449..9ba674cb22f 100644 --- a/crates/app/src/commands/migrate/from_package_json.rs +++ b/crates/app/src/commands/migrate/from_package_json.rs @@ -3,7 +3,7 @@ use crate::session::MoonSession; use clap::Args; use moon_common::Id; use moon_config::{ - DependencyScope, NodePackageManager, PartialDependencyConfig, PartialProjectDependsOn, + DependencyScope, NodePackageManager, PartialProjectDependencyConfig, PartialProjectDependsOn, }; use moon_node_lang::PackageJsonCache; use moon_node_lang::package_json::DependenciesMap; @@ -59,10 +59,10 @@ pub async fn from_package_json(session: MoonSession, args: FromPackageJsonArgs) if matches!(scope, DependencyScope::Production) { PartialProjectDependsOn::String(dep_id.to_owned()) } else { - PartialProjectDependsOn::Object(PartialDependencyConfig { + PartialProjectDependsOn::Object(PartialProjectDependencyConfig { id: Some(dep_id.to_owned()), scope: Some(scope), - ..PartialDependencyConfig::default() + ..PartialProjectDependencyConfig::default() }) }, ); diff --git a/crates/config-schema/src/typescript_types.rs b/crates/config-schema/src/typescript_types.rs index 963e36a72fa..12e9aef630c 100644 --- a/crates/config-schema/src/typescript_types.rs +++ b/crates/config-schema/src/typescript_types.rs @@ -8,8 +8,7 @@ use std::path::Path; fn generate_project(out_dir: &Path) -> miette::Result<()> { let mut generator = SchemaGenerator::default(); - generator.add::(); - generator.add::(); + generator.add::(); generator.add::(); generator.add::(); generator.generate( @@ -77,6 +76,7 @@ fn generate_project(out_dir: &Path) -> miette::Result<()> { fn generate_tasks(out_dir: &Path) -> miette::Result<()> { let mut generator = SchemaGenerator::default(); + generator.add::(); generator.add::(); generator.add::(); generator.generate( diff --git a/crates/config/src/project/dep_config.rs b/crates/config/src/project/dep_config.rs index ea8cf862da4..93a086f3308 100644 --- a/crates/config/src/project/dep_config.rs +++ b/crates/config/src/project/dep_config.rs @@ -2,17 +2,6 @@ use crate::{config_struct, config_unit_enum}; use moon_common::Id; use schematic::{Config, ConfigEnum}; -config_unit_enum!( - /// The task-to-task relationship of the dependency. - #[derive(ConfigEnum)] - pub enum DependencyType { - Cleanup, - #[default] - Required, - Optional, - } -); - config_unit_enum!( /// The scope and or relationship of the dependency. #[derive(ConfigEnum, PartialOrd, Ord)] @@ -42,7 +31,7 @@ config_unit_enum!( config_struct!( /// Expanded information about a project dependency. #[derive(Config)] - pub struct DependencyConfig { + pub struct ProjectDependencyConfig { /// ID of the depended on project. pub id: Id, @@ -57,7 +46,7 @@ config_struct!( } ); -impl DependencyConfig { +impl ProjectDependencyConfig { pub fn new(id: Id) -> Self { Self { id, diff --git a/crates/config/src/project/task_config.rs b/crates/config/src/project/task_config.rs index f572906fd29..c776b4f8159 100644 --- a/crates/config/src/project/task_config.rs +++ b/crates/config/src/project/task_config.rs @@ -103,6 +103,17 @@ config_enum!( } ); +config_unit_enum!( + /// The task-to-task relationship of the dependency. + #[derive(ConfigEnum)] + pub enum TaskDependencyType { + Cleanup, + #[default] + Required, + Optional, + } +); + config_struct!( /// Expanded information about a task dependency. #[derive(Config)] diff --git a/crates/config/src/project_config.rs b/crates/config/src/project_config.rs index 01417a7724d..6ca32b6751f 100644 --- a/crates/config/src/project_config.rs +++ b/crates/config/src/project_config.rs @@ -89,7 +89,7 @@ config_enum!( /// A project referenced by ID, with additional parameters to pass through. #[setting(nested)] - Object(DependencyConfig), + Object(ProjectDependencyConfig), } ); diff --git a/crates/config/src/shapes/input.rs b/crates/config/src/shapes/input.rs index 335205c60c4..cb685a34246 100644 --- a/crates/config/src/shapes/input.rs +++ b/crates/config/src/shapes/input.rs @@ -279,7 +279,7 @@ config_struct!( /// An external project input. #[derive(Config)] pub struct ProjectInput { - // This is not an `Id` as we need to support "^". + // This is not an `Id` as we need to support `^`! pub project: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] @@ -323,6 +323,10 @@ impl ProjectInput { Ok(input) } + + pub fn is_all_deps(&self) -> bool { + self.project == "^" + } } /// The different patterns a task input can be defined as. diff --git a/crates/config/tests/project_config_test.rs b/crates/config/tests/project_config_test.rs index 9e892c38033..6ae48caa6b9 100644 --- a/crates/config/tests/project_config_test.rs +++ b/crates/config/tests/project_config_test.rs @@ -2,8 +2,8 @@ mod utils; use moon_common::Id; use moon_config::{ - ConfigLoader, DependencyConfig, DependencyScope, Input, LanguageType, LayerType, OwnersPaths, - PlatformType, ProjectConfig, ProjectDependsOn, ProjectToolchainEntry, TaskArgs, + ConfigLoader, DependencyScope, Input, LanguageType, LayerType, OwnersPaths, PlatformType, + ProjectConfig, ProjectDependencyConfig, ProjectDependsOn, ProjectToolchainEntry, TaskArgs, ToolchainPluginConfig, }; use proto_core::UnresolvedVersionSpec; @@ -150,15 +150,15 @@ dependsOn: assert_eq!( config.depends_on, vec![ - ProjectDependsOn::Object(DependencyConfig { + ProjectDependsOn::Object(ProjectDependencyConfig { id: Id::raw("a"), scope: DependencyScope::Development, - ..DependencyConfig::default() + ..ProjectDependencyConfig::default() }), - ProjectDependsOn::Object(DependencyConfig { + ProjectDependsOn::Object(ProjectDependencyConfig { id: Id::raw("b"), scope: DependencyScope::Production, - ..DependencyConfig::default() + ..ProjectDependencyConfig::default() }) ] ); @@ -180,10 +180,10 @@ dependsOn: config.depends_on, vec![ ProjectDependsOn::String(Id::raw("a")), - ProjectDependsOn::Object(DependencyConfig { + ProjectDependsOn::Object(ProjectDependencyConfig { id: Id::raw("b"), scope: DependencyScope::Production, - ..DependencyConfig::default() + ..ProjectDependencyConfig::default() }) ] ); @@ -734,7 +734,7 @@ workspace: ProjectConfig { depends_on: vec![ ProjectDependsOn::String(Id::raw("a")), - ProjectDependsOn::Object(DependencyConfig { + ProjectDependsOn::Object(ProjectDependencyConfig { id: Id::raw("b"), scope: DependencyScope::Build, source: DependencySource::Implicit, diff --git a/crates/project-builder/src/project_builder.rs b/crates/project-builder/src/project_builder.rs index 49ccae0dfcf..7b27a236ff8 100644 --- a/crates/project-builder/src/project_builder.rs +++ b/crates/project-builder/src/project_builder.rs @@ -1,7 +1,7 @@ use moon_common::{Id, IdExt, color, path::WorkspaceRelativePath}; use moon_config::{ - ConfigLoader, DependencyConfig, DependencySource, InheritedTasksManager, InheritedTasksResult, - LanguageType, ProjectConfig, ProjectDependsOn, TaskConfig, ToolchainConfig, + ConfigLoader, DependencySource, InheritedTasksManager, InheritedTasksResult, LanguageType, + ProjectConfig, ProjectDependencyConfig, ProjectDependsOn, TaskConfig, ToolchainConfig, }; use moon_file_group::FileGroup; use moon_project::Project; @@ -221,7 +221,7 @@ impl<'app> ProjectBuilder<'app> { /// Extend the builder with a project dependency implicitly derived from the project graph. /// Implicit dependencies *must not* override explicitly configured dependencies. - pub fn extend_with_dependency(&mut self, mut config: DependencyConfig) -> &mut Self { + pub fn extend_with_dependency(&mut self, mut config: ProjectDependencyConfig) -> &mut Self { let local_config = self .local_config .as_mut() @@ -256,22 +256,27 @@ impl<'app> ProjectBuilder<'app> { #[instrument(name = "build_project", skip_all)] pub async fn build(mut self) -> miette::Result { - let tasks = self.build_tasks().await?; + // Build dependencies first since they're required for tasks + let dependencies = self.build_dependencies()?; + + // Then build the tasks + let tasks = self.build_tasks(&dependencies).await?; let task_targets = tasks .values() .map(|task| task.target.clone()) .collect::>(); + // And finally build the project let mut project = Project { - dependencies: self.build_dependencies(&tasks)?, + dependencies, file_groups: self.build_file_groups()?, - task_targets, - tasks, alias: self.alias, id: self.id.to_owned(), language: self.language, root: self.root, source: self.source.to_owned(), + tasks, + task_targets, toolchains: self.toolchains, ..Project::default() }; @@ -285,14 +290,13 @@ impl<'app> ProjectBuilder<'app> { project.config = config; project.toolchains.sort(); + resolve_project_dependencies(&mut project, self.context.root_project_id); + Ok(project) } #[instrument(skip_all)] - fn build_dependencies( - &self, - tasks: &BTreeMap, - ) -> miette::Result> { + fn build_dependencies(&self) -> miette::Result> { let mut deps = FxHashMap::default(); trace!( @@ -303,9 +307,9 @@ impl<'app> ProjectBuilder<'app> { if let Some(local) = &self.local_config { for dep_on in &local.depends_on { let dep_config = match dep_on { - ProjectDependsOn::String(id) => DependencyConfig { + ProjectDependsOn::String(id) => ProjectDependencyConfig { id: id.to_owned(), - ..DependencyConfig::default() + ..Default::default() }, ProjectDependsOn::Object(config) => config.to_owned(), }; @@ -314,26 +318,6 @@ impl<'app> ProjectBuilder<'app> { } } - // Tasks can depend on arbitrary projects, so include them also - for task_config in tasks.values() { - for task_dep in &task_config.deps { - if let Some(dep_config) = create_project_dep_from_task_dep( - task_dep, - self.id, - self.context.root_project_id, - |dep_project_id| { - deps.contains_key(dep_project_id) - || self - .alias - .as_ref() - .is_some_and(|alias| alias.as_str() == dep_project_id.as_str()) - }, - ) { - deps.insert(dep_config.id.clone(), dep_config); - } - } - } - if !deps.is_empty() { trace!( project_id = self.id.as_str(), @@ -393,11 +377,15 @@ impl<'app> ProjectBuilder<'app> { } #[instrument(skip_all)] - async fn build_tasks(&mut self) -> miette::Result> { - trace!(project_id = self.id.as_str(), "Building tasks"); + async fn build_tasks( + &mut self, + dependencies: &[ProjectDependencyConfig], + ) -> miette::Result> { + trace!(project_id = self.id.as_str(), "Building project tasks"); let mut tasks_builder = TasksBuilder::new( self.id, + dependencies, self.source, &self.toolchains, TasksBuilderContext { @@ -425,3 +413,33 @@ impl<'app> ProjectBuilder<'app> { tasks_builder.build().await } } + +fn resolve_project_dependencies(project: &mut Project, root_project_id: Option<&Id>) { + let mut deps: Vec = vec![]; + + // Tasks can depend on arbitrary projects, so include them also + for task_config in project.tasks.values() { + for task_dep in &task_config.deps { + if let Some(dep_config) = create_project_dep_from_task_dep( + task_dep, + &project.id, + root_project_id, + |dep_project_id| { + deps.iter().any(|dep| &dep.id == dep_project_id) + || project + .dependencies + .iter() + .any(|dep| &dep.id == dep_project_id) + || project + .alias + .as_ref() + .is_some_and(|alias| alias.as_str() == dep_project_id.as_str()) + }, + ) { + deps.push(dep_config); + } + } + } + + project.dependencies.extend(deps); +} diff --git a/crates/project-builder/tests/project_builder_test.rs b/crates/project-builder/tests/project_builder_test.rs index 10e34560046..48f9b1181ec 100644 --- a/crates/project-builder/tests/project_builder_test.rs +++ b/crates/project-builder/tests/project_builder_test.rs @@ -1,7 +1,7 @@ use moon_common::Id; use moon_common::path::WorkspaceRelativePathBuf; use moon_config::{ - DependencyConfig, DependencyScope, DependencySource, LanguageType, TaskArgs, TaskConfig, + DependencyScope, DependencySource, LanguageType, ProjectDependencyConfig, TaskArgs, TaskConfig, }; use moon_file_group::FileGroup; use moon_project::Project; @@ -78,13 +78,13 @@ mod project_builder { assert_eq!( project.dependencies, vec![ - DependencyConfig { + ProjectDependencyConfig { id: "foo".try_into().unwrap(), source: DependencySource::Explicit, scope: DependencyScope::Development, ..Default::default() }, - DependencyConfig { + ProjectDependencyConfig { id: "bar".try_into().unwrap(), source: DependencySource::Explicit, ..Default::default() @@ -468,21 +468,21 @@ mod project_builder { let project = container .build_project_with("bar", |builder| { - builder.extend_with_dependency(DependencyConfig { + builder.extend_with_dependency(ProjectDependencyConfig { id: "foo".try_into().unwrap(), scope: DependencyScope::Development, - ..DependencyConfig::default() + ..ProjectDependencyConfig::default() }); }) .await; assert_eq!( project.dependencies, - vec![DependencyConfig { + vec![ProjectDependencyConfig { id: "foo".try_into().unwrap(), scope: DependencyScope::Development, source: DependencySource::Implicit, - ..DependencyConfig::default() + ..ProjectDependencyConfig::default() }] ); } diff --git a/crates/project-expander/src/project_expander.rs b/crates/project-expander/src/project_expander.rs index 3184bf60369..0f35eb73b49 100644 --- a/crates/project-expander/src/project_expander.rs +++ b/crates/project-expander/src/project_expander.rs @@ -1,6 +1,6 @@ use crate::expander_context::ProjectExpanderContext; use moon_common::color; -use moon_config::DependencyConfig; +use moon_config::ProjectDependencyConfig; use moon_project::Project; use rustc_hash::FxHashMap; use std::mem; @@ -45,7 +45,7 @@ impl<'graph> ProjectExpander<'graph> { // Use a map so that aliases and IDs get flattened depends_on.insert( new_dep_id.clone(), - DependencyConfig { + ProjectDependencyConfig { id: new_dep_id, ..dep_config }, diff --git a/crates/project-graph/tests/project_graph_test.rs b/crates/project-graph/tests/project_graph_test.rs index a67f11492e8..3413bda58b7 100644 --- a/crates/project-graph/tests/project_graph_test.rs +++ b/crates/project-graph/tests/project_graph_test.rs @@ -1,7 +1,7 @@ use moon_common::{Id, path::WorkspaceRelativePathBuf}; use moon_config::{ - DependencyConfig, DependencyScope, DependencySource, TaskDependencyConfig, WorkspaceProjects, - WorkspaceProjectsConfig, + DependencyScope, DependencySource, ProjectDependencyConfig, TaskDependencyConfig, + WorkspaceProjects, WorkspaceProjectsConfig, }; use moon_project::{FileGroup, Project}; use moon_project_graph::*; @@ -739,7 +739,7 @@ mod project_graph { assert_eq!( project.dependencies, - vec![DependencyConfig { + vec![ProjectDependencyConfig { id: Id::raw("base"), scope: DependencyScope::Development, source: DependencySource::Explicit, @@ -1032,7 +1032,7 @@ mod project_graph { let mut data = data.write().await; if event.project_id == "explicit-and-implicit" || event.project_id == "implicit" { - data.dependencies.push(DependencyConfig { + data.dependencies.push(ProjectDependencyConfig { id: Id::raw("@three"), scope: DependencyScope::Build, ..Default::default() @@ -1040,7 +1040,7 @@ mod project_graph { } if event.project_id == "implicit" { - data.dependencies.push(DependencyConfig { + data.dependencies.push(ProjectDependencyConfig { id: Id::raw("@one"), scope: DependencyScope::Peer, ..Default::default() @@ -1150,11 +1150,11 @@ mod project_graph { assert_eq!( graph.get_project("dupes-depends-on").unwrap().dependencies, - vec![DependencyConfig { + vec![ProjectDependencyConfig { id: Id::raw("alias-two"), scope: DependencyScope::Build, source: DependencySource::Explicit, - ..DependencyConfig::default() + ..ProjectDependencyConfig::default() }] ); diff --git a/crates/project-graph/tests/snapshots/project_graph_test__project_graph__aliases__loads_aliases.snap b/crates/project-graph/tests/snapshots/project_graph_test__project_graph__aliases__loads_aliases.snap index b778ecae3f8..1365d0c9e9b 100644 --- a/crates/project-graph/tests/snapshots/project_graph_test__project_graph__aliases__loads_aliases.snap +++ b/crates/project-graph/tests/snapshots/project_graph_test__project_graph__aliases__loads_aliases.snap @@ -7,8 +7,8 @@ digraph { 1 [ label="dupes-depends-on" style=filled, shape=oval, fillcolor=gray, fontcolor=black] 2 [ label="tasks" style=filled, shape=oval, fillcolor=gray, fontcolor=black] 3 [ label="alias-one" style=filled, shape=oval, fillcolor=gray, fontcolor=black] - 4 [ label="implicit" style=filled, shape=oval, fillcolor=gray, fontcolor=black] - 5 [ label="alias-three" style=filled, shape=oval, fillcolor=gray, fontcolor=black] + 4 [ label="alias-three" style=filled, shape=oval, fillcolor=gray, fontcolor=black] + 5 [ label="implicit" style=filled, shape=oval, fillcolor=gray, fontcolor=black] 6 [ label="dupes-task-deps" style=filled, shape=oval, fillcolor=gray, fontcolor=black] 7 [ label="alias-same-id" style=filled, shape=oval, fillcolor=gray, fontcolor=black] 8 [ label="explicit-and-implicit" style=filled, shape=oval, fillcolor=gray, fontcolor=black] @@ -16,14 +16,14 @@ digraph { 1 -> 0 [ label="development" arrowhead=box, arrowtail=box] 1 -> 0 [ label="build" arrowhead=box, arrowtail=box] 2 -> 3 [ label="build" arrowhead=box, arrowtail=box] - 4 -> 3 [ label="peer" arrowhead=box, arrowtail=box] - 4 -> 5 [ label="build" arrowhead=box, arrowtail=box] 2 -> 4 [ label="build" arrowhead=box, arrowtail=box] + 5 -> 3 [ label="peer" arrowhead=box, arrowtail=box] + 5 -> 4 [ label="build" arrowhead=box, arrowtail=box] 2 -> 5 [ label="build" arrowhead=box, arrowtail=box] 6 -> 3 [ label="build" arrowhead=box, arrowtail=box] 6 -> 3 [ label="build" arrowhead=box, arrowtail=box] 8 -> 0 [ label="development" arrowhead=box, arrowtail=box] - 8 -> 5 [ label="build" arrowhead=box, arrowtail=box] + 8 -> 4 [ label="build" arrowhead=box, arrowtail=box] 9 -> 0 [ label="production" arrowhead=box, arrowtail=box] 9 -> 3 [ label="development" arrowhead=box, arrowtail=box] } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 1ac5249d150..e1726f6dc3d 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -4,8 +4,8 @@ use moon_common::{ path::{WorkspaceRelativePathBuf, is_root_level_source}, }; use moon_config::{ - DependencyConfig, DependencyScope, InheritedTasksResult, LanguageType, LayerType, PlatformType, - ProjectConfig, StackType, + DependencyScope, InheritedTasksResult, LanguageType, LayerType, PlatformType, ProjectConfig, + ProjectDependencyConfig, StackType, }; use moon_file_group::FileGroup; use moon_task::{Target, Task}; @@ -26,7 +26,7 @@ cacheable!( pub config: ProjectConfig, /// List of other projects this project depends on. - pub dependencies: Vec, + pub dependencies: Vec, /// File groups specific to the project. Inherits all file groups from the global config. pub file_groups: BTreeMap, diff --git a/crates/task-builder/src/task_deps_builder.rs b/crates/task-builder/src/task_deps_builder.rs index 4ba3a72f35c..e8de98b3d0b 100644 --- a/crates/task-builder/src/task_deps_builder.rs +++ b/crates/task-builder/src/task_deps_builder.rs @@ -1,6 +1,8 @@ use crate::tasks_builder_error::TasksBuilderError; use moon_common::Id; -use moon_config::{DependencyConfig, DependencyScope, DependencySource, TaskDependencyConfig}; +use moon_config::{ + DependencyScope, DependencySource, ProjectDependencyConfig, TaskDependencyConfig, +}; use moon_project::Project; use moon_task::{Target, TargetScope, Task, TaskOptionRunInCI, TaskOptions}; use std::mem; @@ -191,7 +193,7 @@ pub fn create_project_dep_from_task_dep( project_id: &Id, root_project_id: Option<&Id>, already_exists: impl FnOnce(&Id) -> bool, -) -> Option { +) -> Option { let TargetScope::Project(dep_project_id) = &task_dep.target.scope else { return None; }; @@ -208,7 +210,7 @@ pub fn create_project_dep_from_task_dep( "Marking arbitrary project as an implicit dependency because of a task dependency" ); - Some(DependencyConfig { + Some(ProjectDependencyConfig { id: dep_project_id.to_owned(), scope: if root_project_id.is_some_and(|id| id == dep_project_id) { DependencyScope::Root diff --git a/crates/task-builder/src/tasks_builder.rs b/crates/task-builder/src/tasks_builder.rs index f96a16b576b..a5fffbcddec 100644 --- a/crates/task-builder/src/tasks_builder.rs +++ b/crates/task-builder/src/tasks_builder.rs @@ -6,10 +6,10 @@ use moon_common::{ path::{WorkspaceRelativePath, is_root_level_source}, }; use moon_config::{ - InheritedTasksConfig, Input, ProjectConfig, ProjectWorkspaceInheritedTasksConfig, TaskArgs, - TaskConfig, TaskDependency, TaskDependencyConfig, TaskMergeStrategy, TaskOptionCache, - TaskOptionRunInCI, TaskOptionsConfig, TaskOutputStyle, TaskPreset, TaskType, ToolchainConfig, - is_glob_like, + InheritedTasksConfig, Input, ProjectConfig, ProjectDependencyConfig, ProjectInput, + ProjectWorkspaceInheritedTasksConfig, TaskArgs, TaskConfig, TaskDependency, + TaskDependencyConfig, TaskMergeStrategy, TaskOptionCache, TaskOptionRunInCI, TaskOptionsConfig, + TaskOutputStyle, TaskPreset, TaskType, ToolchainConfig, is_glob_like, }; use moon_env_var::contains_env_var; use moon_target::Target; @@ -81,6 +81,7 @@ pub struct TasksBuilder<'proj> { context: TasksBuilderContext<'proj>, project_id: &'proj Id, + project_dependencies: &'proj [ProjectDependencyConfig], project_env: FxHashMap<&'proj str, &'proj str>, project_source: &'proj WorkspaceRelativePath, project_toolchains: &'proj [Id], @@ -100,6 +101,7 @@ pub struct TasksBuilder<'proj> { impl<'proj> TasksBuilder<'proj> { pub fn new( project_id: &'proj Id, + project_dependencies: &'proj [ProjectDependencyConfig], project_source: &'proj WorkspaceRelativePath, project_toolchains: &'proj [Id], context: TasksBuilderContext<'proj>, @@ -107,6 +109,7 @@ impl<'proj> TasksBuilder<'proj> { Self { context, project_id, + project_dependencies, project_env: FxHashMap::default(), project_source, project_toolchains, @@ -547,6 +550,7 @@ impl<'proj> TasksBuilder<'proj> { task.id = id.to_owned(); task.target = target; + self.resolve_task_inputs(&mut task)?; self.resolve_task_toolchains(&mut task).await?; Ok(task) @@ -703,6 +707,42 @@ impl<'proj> TasksBuilder<'proj> { Ok(options) } + fn resolve_task_inputs(&self, task: &mut Task) -> miette::Result<()> { + let mut inputs = vec![]; + + for input in std::mem::take(&mut task.inputs) { + if let Input::Project(inner) = input { + if inner.is_all_deps() { + for dep_config in self.project_dependencies { + inputs.push(Input::Project(ProjectInput { + project: dep_config.id.to_string(), + filter: inner.filter.clone(), + group: inner.group.clone(), + })); + } + } else if self + .project_dependencies + .iter() + .any(|dep| dep.id == inner.project) + { + inputs.push(Input::Project(inner)); + } else { + return Err(TasksBuilderError::UnknownProjectInput { + dep: inner.project, + task: task.target.clone(), + } + .into()); + } + } else { + inputs.push(input); + } + } + + task.inputs = inputs; + + Ok(()) + } + async fn resolve_task_toolchains(&self, task: &mut Task) -> miette::Result<()> { let mut toolchains = FxHashSet::default(); diff --git a/crates/task-builder/src/tasks_builder_error.rs b/crates/task-builder/src/tasks_builder_error.rs index eed1910d216..dd380d01cf9 100644 --- a/crates/task-builder/src/tasks_builder_error.rs +++ b/crates/task-builder/src/tasks_builder_error.rs @@ -49,7 +49,7 @@ pub enum TasksBuilderError { #[diagnostic(code(task_builder::unknown_target))] #[error( - "Invalid dependency {} for {}, target does not exist.", + "Invalid dependency {} for task {}, target does not exist.", .dep.style(Style::Label), .task.style(Style::Label), )] @@ -57,7 +57,7 @@ pub enum TasksBuilderError { #[diagnostic(code(task_builder::unknown_target_in_project_deps))] #[error( - "Invalid dependency {} for {}, no matching targets in project dependencies. Mark the dependency as {} to allow no results.", + "Invalid dependency {} for task {}, no matching targets in project dependencies. Mark the dependency as {} to allow no results.", .dep.style(Style::Label), .task.style(Style::Label), "optional".style(Style::Property), @@ -66,7 +66,7 @@ pub enum TasksBuilderError { #[diagnostic(code(task_builder::unknown_target_in_tag))] #[error( - "Invalid dependency {} for {}, no matching targets within this tag. Mark the dependency as {} to allow no results.", + "Invalid dependency {} for task {}, no matching targets within this tag. Mark the dependency as {} to allow no results.", .dep.style(Style::Label), .task.style(Style::Label), "optional".style(Style::Property), @@ -75,9 +75,17 @@ pub enum TasksBuilderError { #[diagnostic(code(task_builder::unsupported_target_scope))] #[error( - "Invalid dependency {} for {}. All (:) scope is not supported.", + "Invalid dependency {} for task {}. All (:) scope is not supported.", .dep.style(Style::Label), .task.style(Style::Label), )] UnsupportedTargetScopeInDeps { dep: Target, task: Target }, + + #[diagnostic(code(task_builder::unknown_project_input))] + #[error( + "Invalid project input {} for task {}. Only project dependencies of the parent project can be referenced as an input.", + .dep.style(Style::Id), + .task.style(Style::Label), + )] + UnknownProjectInput { dep: String, task: Target }, } diff --git a/crates/task-builder/tests/__fixtures__/builder/dep-a/moon.yml b/crates/task-builder/tests/__fixtures__/builder/dep-a/moon.yml new file mode 100644 index 00000000000..5145493874a --- /dev/null +++ b/crates/task-builder/tests/__fixtures__/builder/dep-a/moon.yml @@ -0,0 +1,3 @@ +fileGroups: + sources: + - 'src/**/*' diff --git a/crates/task-builder/tests/__fixtures__/builder/dep-b/moon.yml b/crates/task-builder/tests/__fixtures__/builder/dep-b/moon.yml new file mode 100644 index 00000000000..5145493874a --- /dev/null +++ b/crates/task-builder/tests/__fixtures__/builder/dep-b/moon.yml @@ -0,0 +1,3 @@ +fileGroups: + sources: + - 'src/**/*' diff --git a/crates/task-builder/tests/__fixtures__/builder/dep-c/moon.yml b/crates/task-builder/tests/__fixtures__/builder/dep-c/moon.yml new file mode 100644 index 00000000000..5145493874a --- /dev/null +++ b/crates/task-builder/tests/__fixtures__/builder/dep-c/moon.yml @@ -0,0 +1,3 @@ +fileGroups: + sources: + - 'src/**/*' diff --git a/crates/task-builder/tests/__fixtures__/builder/inputs-project/moon.yml b/crates/task-builder/tests/__fixtures__/builder/inputs-project/moon.yml new file mode 100644 index 00000000000..ab7e11698f9 --- /dev/null +++ b/crates/task-builder/tests/__fixtures__/builder/inputs-project/moon.yml @@ -0,0 +1,14 @@ +dependsOn: + - 'dep-a' + - 'dep-b' + - 'dep-c' + +tasks: + all-deps: + inputs: + - project: '^' + group: 'sources' + only-a: + inputs: + - project: 'dep-a' + filter: ['src/**/*'] diff --git a/crates/task-builder/tests/task_deps_builder_test.rs b/crates/task-builder/tests/task_deps_builder_test.rs index 3feb9665b31..b805ea7b572 100644 --- a/crates/task-builder/tests/task_deps_builder_test.rs +++ b/crates/task-builder/tests/task_deps_builder_test.rs @@ -281,7 +281,7 @@ mod task_deps_builder { #[test] #[should_panic( - expected = "Invalid dependency :build for project:task. All (:) scope is not" + expected = "Invalid dependency :build for task project:task. All (:) scope is not" )] fn errors_for_all_scope() { let mut project = create_project(); @@ -314,10 +314,10 @@ mod task_deps_builder { fn returns_each_parent_task() { let mut project = create_project(); project.dependencies = vec![ - DependencyConfig::new(Id::raw("foo")), - DependencyConfig::new(Id::raw("bar")), - DependencyConfig::new(Id::raw("baz")), - DependencyConfig::new(Id::raw("qux")), + ProjectDependencyConfig::new(Id::raw("foo")), + ProjectDependencyConfig::new(Id::raw("bar")), + ProjectDependencyConfig::new(Id::raw("baz")), + ProjectDependencyConfig::new(Id::raw("qux")), ]; let mut task = create_task(); @@ -348,9 +348,9 @@ mod task_deps_builder { fn returns_each_parent_task_only_if_id_matches() { let mut project = create_project(); project.dependencies = vec![ - DependencyConfig::new(Id::raw("foo")), - DependencyConfig::new(Id::raw("bar")), - DependencyConfig::new(Id::raw("baz")), + ProjectDependencyConfig::new(Id::raw("foo")), + ProjectDependencyConfig::new(Id::raw("bar")), + ProjectDependencyConfig::new(Id::raw("baz")), ]; let mut task = create_task(); @@ -385,14 +385,14 @@ mod task_deps_builder { #[test] #[should_panic( - expected = "Invalid dependency ^:build for project:task, no matching targets" + expected = "Invalid dependency ^:build for task project:task, no matching targets" )] fn can_error_if_non_optional_and_no_results() { let mut project = create_project(); project.dependencies = vec![ - DependencyConfig::new(Id::raw("foo")), - DependencyConfig::new(Id::raw("bar")), - DependencyConfig::new(Id::raw("baz")), + ProjectDependencyConfig::new(Id::raw("foo")), + ProjectDependencyConfig::new(Id::raw("bar")), + ProjectDependencyConfig::new(Id::raw("baz")), ]; let mut task = create_task(); @@ -485,7 +485,7 @@ mod task_deps_builder { #[test] #[should_panic( - expected = "Invalid dependency ~:unknown for project:task, target does not exist" + expected = "Invalid dependency ~:unknown for task project:task, target does not exist" )] fn errors_if_unknown() { let mut project = create_project(); @@ -583,7 +583,7 @@ mod task_deps_builder { #[test] #[should_panic( - expected = "Invalid dependency d:unknown for project:task, target does not exist" + expected = "Invalid dependency d:unknown for task project:task, target does not exist" )] fn errors_if_unknown() { let mut project = create_project(); @@ -624,13 +624,13 @@ mod task_deps_builder { assert_eq!( project.dependencies, vec![ - DependencyConfig { + ProjectDependencyConfig { id: Id::raw("a"), scope: DependencyScope::Build, source: DependencySource::Implicit, via: Some("task a:build".into()) }, - DependencyConfig { + ProjectDependencyConfig { id: Id::raw("c"), scope: DependencyScope::Build, source: DependencySource::Implicit, @@ -721,7 +721,7 @@ mod task_deps_builder { #[test] #[should_panic( - expected = "Invalid dependency #pkg:build for project:task, no matching targets" + expected = "Invalid dependency #pkg:build for task project:task, no matching targets" )] fn can_error_if_non_optional_and_no_results() { let mut project = create_project(); @@ -789,13 +789,13 @@ mod task_deps_builder { assert_eq!( project.dependencies, vec![ - DependencyConfig { + ProjectDependencyConfig { id: Id::raw("baz"), scope: DependencyScope::Build, source: DependencySource::Implicit, via: Some("task baz:build".into()) }, - DependencyConfig { + ProjectDependencyConfig { id: Id::raw("foo"), scope: DependencyScope::Build, source: DependencySource::Implicit, diff --git a/crates/task-builder/tests/tasks_builder_test.rs b/crates/task-builder/tests/tasks_builder_test.rs index 4cf58477dea..3f9bdee9eca 100644 --- a/crates/task-builder/tests/tasks_builder_test.rs +++ b/crates/task-builder/tests/tasks_builder_test.rs @@ -379,6 +379,96 @@ mod tasks_builder { } } + mod inputs { + use super::*; + + #[tokio::test(flavor = "multi_thread")] + async fn expands_project_all() { + let sandbox = create_sandbox("builder"); + let container = TasksBuilderContainer::new(sandbox.path()).with_all_toolchains(); + + let tasks = container.build_tasks("inputs-project").await; + let task = tasks.get("all-deps").unwrap(); + + assert_eq!( + task.inputs, + [ + Input::Project(ProjectInput { + project: "dep-b".into(), + filter: vec![], + group: Some(Id::raw("sources")), + }), + Input::Project(ProjectInput { + project: "dep-a".into(), + filter: vec![], + group: Some(Id::raw("sources")), + }), + Input::Project(ProjectInput { + project: "dep-c".into(), + filter: vec![], + group: Some(Id::raw("sources")), + }), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + ] + ); + } + + #[tokio::test(flavor = "multi_thread")] + async fn uses_single_project() { + let sandbox = create_sandbox("builder"); + let container = TasksBuilderContainer::new(sandbox.path()).with_all_toolchains(); + + let tasks = container.build_tasks("inputs-project").await; + let task = tasks.get("only-a").unwrap(); + + assert_eq!( + task.inputs, + [ + Input::Project(ProjectInput { + project: "dep-a".into(), + filter: vec!["src/**/*".into()], + group: None, + }), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + ] + ); + } + + #[tokio::test(flavor = "multi_thread")] + #[should_panic(expected = "Invalid project input")] + async fn errors_if_referencing_a_non_dep_project() { + let sandbox = create_sandbox("builder"); + sandbox.create_file( + "inputs-project-error/moon.yml", + r#" +dependsOn: ['dep-a'] + +tasks: + will-error: + inputs: + - project: 'dep-b' +"#, + ); + + let container = TasksBuilderContainer::new(sandbox.path()).with_all_toolchains(); + + let tasks = container.build_tasks("inputs-project-error").await; + let task = tasks.get("only-a").unwrap(); + + assert_eq!( + task.inputs, + [ + Input::Project(ProjectInput { + project: "dep-a".into(), + filter: vec!["src/**/*".into()], + group: None, + }), + Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + ] + ); + } + } + mod detect_platform_legacy { use super::*; diff --git a/crates/task-expander/src/token_expander.rs b/crates/task-expander/src/token_expander.rs index 9630ee2ec98..88695fe240f 100644 --- a/crates/task-expander/src/token_expander.rs +++ b/crates/task-expander/src/token_expander.rs @@ -4,7 +4,7 @@ use moon_common::{ color, path::{self, WorkspaceRelativePathBuf}, }; -use moon_config::{Input, OutputPath, ProjectInput, ProjectMetadataConfig, patterns}; +use moon_config::{Input, OutputPath, ProjectMetadataConfig, patterns}; use moon_env_var::{EnvScanner, EnvSubstitutor, GlobalEnvBag}; use moon_graph_utils::GraphExpanderContext; use moon_project::{FileGroup, Project}; @@ -237,14 +237,13 @@ impl<'graph> TokenExpander<'graph> { } #[instrument(skip_all)] - pub fn expand_inputs(&mut self, task: &mut Task) -> miette::Result { + pub fn expand_inputs(&mut self, task: &Task) -> miette::Result { self.scope = TokenScope::Inputs; - let mut inputs = vec![]; let mut result = ExpandedResult::default(); let bag = GlobalEnvBag::instance(); - for input in mem::take(&mut task.inputs) { + for input in &task.inputs { match &input { Input::EnvVar(var) => { result.env.push(var.to_owned()); @@ -308,27 +307,12 @@ impl<'graph> TokenExpander<'graph> { .globs_for_input .insert(glob, TaskGlobInput { cache: inner.cache }); } - Input::Project(inner) => { - // Expand to all owning project dependencies - if inner.project == "^" { - for dep_config in &self.project.dependencies { - inputs.push(Input::Project(ProjectInput { - project: dep_config.id.to_string(), - filter: inner.filter.clone(), - group: inner.group.clone(), - })); - } - - continue; - } + Input::Project(_) => { + // Skip } }; - - inputs.push(input); } - task.inputs = inputs; - Ok(result) } diff --git a/crates/task-expander/tests/token_expander_test.rs b/crates/task-expander/tests/token_expander_test.rs index 1ed8b7a86ad..d7698cf91d8 100644 --- a/crates/task-expander/tests/token_expander_test.rs +++ b/crates/task-expander/tests/token_expander_test.rs @@ -3,8 +3,7 @@ mod utils; use moon_common::Id; use moon_common::path::{self, WorkspaceRelativePathBuf}; use moon_config::{ - DependencyConfig, FileGroupInput, FileGroupInputFormat, Input, LanguageType, LayerType, - OutputPath, ProjectInput, + FileGroupInput, FileGroupInputFormat, Input, LanguageType, LayerType, OutputPath, }; use moon_env_var::GlobalEnvBag; use moon_task::{TaskFileInput, TaskGlobInput}; @@ -1048,7 +1047,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { env: vec!["FOO_BAR".into()], ..ExpandedResult::default() @@ -1073,7 +1072,7 @@ mod token_expander { let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); - let mut result = expander.expand_inputs(&mut task).unwrap(); + let mut result = expander.expand_inputs(&task).unwrap(); result.env.sort(); assert_eq!( @@ -1102,7 +1101,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/config.yml"), @@ -1132,7 +1131,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/config.yml"), @@ -1159,7 +1158,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/dir/subdir"), @@ -1186,7 +1185,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/dir/subdir"), @@ -1210,7 +1209,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/config.yml"), @@ -1239,7 +1238,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/config.yml"), @@ -1265,7 +1264,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![], globs: vec![ @@ -1292,7 +1291,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![], globs: vec![ @@ -1316,7 +1315,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![WorkspaceRelativePathBuf::from("project/source/dir/subdir")], globs: vec![], @@ -1340,7 +1339,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![WorkspaceRelativePathBuf::from("project/source/dir/subdir")], globs: vec![], @@ -1361,7 +1360,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { env: vec!["FOO_BAR".into()], ..ExpandedResult::default() @@ -1383,7 +1382,7 @@ mod token_expander { let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); - expander.expand_inputs(&mut task).unwrap(); + expander.expand_inputs(&task).unwrap(); } #[test] @@ -1400,7 +1399,7 @@ mod token_expander { let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); - expander.expand_inputs(&mut task).unwrap(); + expander.expand_inputs(&task).unwrap(); } #[test] @@ -1417,7 +1416,7 @@ mod token_expander { let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); - expander.expand_inputs(&mut task).unwrap(); + expander.expand_inputs(&task).unwrap(); } #[test] @@ -1435,7 +1434,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files: vec![ WorkspaceRelativePathBuf::from("project/source/project:task"), @@ -1464,7 +1463,7 @@ mod token_expander { let mut expander = TokenExpander::new(&project, &context); assert_eq!( - expander.expand_inputs(&mut task).unwrap(), + expander.expand_inputs(&task).unwrap(), ExpandedResult { files_for_input: create_file_input_map(vec![ "project/source/task/file.txt", @@ -1478,61 +1477,6 @@ mod token_expander { } ); } - - #[test] - fn expands_project_input_into_dependencies() { - let sandbox = create_empty_sandbox(); - let mut project = create_project(sandbox.path()); - - project.dependencies.extend([ - DependencyConfig { - id: Id::raw("a"), - ..Default::default() - }, - DependencyConfig { - id: Id::raw("b"), - ..Default::default() - }, - DependencyConfig { - id: Id::raw("c"), - ..Default::default() - }, - ]); - - let mut task = create_task(); - - task.inputs = vec![Input::Project(ProjectInput { - project: "^".into(), - filter: vec!["src/**/*".into()], - group: Some(Id::raw("sources")), - })]; - - let context = create_context(sandbox.path()); - let mut expander = TokenExpander::new(&project, &context); - - expander.expand_inputs(&mut task).unwrap(); - - assert_eq!( - task.inputs, - [ - Input::Project(ProjectInput { - project: "a".into(), - filter: vec!["src/**/*".into()], - group: Some(Id::raw("sources")), - }), - Input::Project(ProjectInput { - project: "b".into(), - filter: vec!["src/**/*".into()], - group: Some(Id::raw("sources")), - }), - Input::Project(ProjectInput { - project: "c".into(), - filter: vec!["src/**/*".into()], - group: Some(Id::raw("sources")), - }), - ] - ); - } } mod outputs { diff --git a/crates/task-graph/src/task_graph.rs b/crates/task-graph/src/task_graph.rs index 103e59d37a2..0ee84c16fce 100644 --- a/crates/task-graph/src/task_graph.rs +++ b/crates/task-graph/src/task_graph.rs @@ -1,5 +1,5 @@ use moon_common::Id; -use moon_config::DependencyType; +use moon_config::TaskDependencyType; use moon_graph_utils::*; use moon_project::ProjectError; use moon_project_graph::ProjectGraph; @@ -11,7 +11,7 @@ use rustc_hash::FxHashMap; use std::sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}; use tracing::{debug, instrument}; -pub type TaskGraphType = DiGraph; +pub type TaskGraphType = DiGraph; pub type TasksCache = FxHashMap>; #[derive(Clone, Debug, Default)] @@ -180,8 +180,8 @@ impl TaskGraph { } } -impl GraphData for TaskGraph { - fn get_graph(&self) -> &DiGraph { +impl GraphData for TaskGraph { + fn get_graph(&self) -> &DiGraph { &self.graph } @@ -194,10 +194,10 @@ impl GraphData for TaskGraph { } } -impl GraphConnections for TaskGraph {} +impl GraphConnections for TaskGraph {} -impl GraphConversions for TaskGraph {} +impl GraphConversions for TaskGraph {} -impl GraphToDot for TaskGraph {} +impl GraphToDot for TaskGraph {} -impl GraphToJson for TaskGraph {} +impl GraphToJson for TaskGraph {} diff --git a/crates/test-utils/src/workspace_mocker.rs b/crates/test-utils/src/workspace_mocker.rs index c7296ec7983..269a5c5e3d4 100644 --- a/crates/test-utils/src/workspace_mocker.rs +++ b/crates/test-utils/src/workspace_mocker.rs @@ -285,6 +285,7 @@ impl WorkspaceMocker { let mut builder = TasksBuilder::new( &project.id, + &project.dependencies, &project.source, &project.toolchains, TasksBuilderContext { @@ -296,8 +297,6 @@ impl WorkspaceMocker { }, ); - builder.load_local_tasks(&project.config); - // Note: this list isn't accurate for a real world scenario! let stable_toolchains = project .toolchains @@ -320,6 +319,8 @@ impl WorkspaceMocker { Some(&project.config.workspace.inherited_tasks), ); + builder.load_local_tasks(&project.config); + op(&mut builder); builder.build().await.unwrap() diff --git a/crates/workspace/src/build_data.rs b/crates/workspace/src/build_data.rs index bdd63fedfa0..95d6eff2098 100644 --- a/crates/workspace/src/build_data.rs +++ b/crates/workspace/src/build_data.rs @@ -1,7 +1,7 @@ use moon_common::Id; use moon_common::path::WorkspaceRelativePathBuf; use moon_config::{ - DependencyConfig, ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, TaskConfig, + ProjectConfig, ProjectDependencyConfig, ProjectsAliasesList, ProjectsSourcesList, TaskConfig, }; use moon_pdk_api::ExtendProjectOutput; use moon_task::{Target, TaskOptions}; @@ -106,7 +106,7 @@ pub struct ExtendProjectEvent { #[derive(Debug, Default)] pub struct ExtendProjectData { - pub dependencies: Vec, + pub dependencies: Vec, pub tasks: FxHashMap, } diff --git a/crates/workspace/src/workspace_builder.rs b/crates/workspace/src/workspace_builder.rs index 9b06e8c6665..f8c2102bb1e 100644 --- a/crates/workspace/src/workspace_builder.rs +++ b/crates/workspace/src/workspace_builder.rs @@ -11,8 +11,9 @@ use moon_common::{ path::{PathExt, WorkspaceRelativePathBuf, is_root_level_source}, }; use moon_config::{ - ConfigLoader, DependencyConfig, DependencyScope, DependencyType, InheritedTasksManager, - ProjectsSourcesList, ToolchainConfig, WorkspaceConfig, WorkspaceProjects, finalize_config, + ConfigLoader, DependencyScope, InheritedTasksManager, ProjectDependencyConfig, + ProjectsSourcesList, TaskDependencyType, ToolchainConfig, WorkspaceConfig, WorkspaceProjects, + finalize_config, }; use moon_feature_flags::glob_walk_with_options; use moon_pdk_api::ExtendProjectGraphInput; @@ -92,7 +93,7 @@ pub struct WorkspaceBuilder<'app> { task_data: FxHashMap, /// The task DAG. - task_graph: DiGraph, DependencyType>, + task_graph: DiGraph, TaskDependencyType>, } impl<'app> WorkspaceBuilder<'app> { @@ -437,7 +438,7 @@ impl<'app> WorkspaceBuilder<'app> { // Inherit from build data (toolchains, etc) for extended_data in &build_data.extensions { for dep_config in &extended_data.dependencies { - builder.extend_with_dependency(DependencyConfig { + builder.extend_with_dependency(ProjectDependencyConfig { id: ProjectBuildData::resolve_id(&dep_config.id, &self.project_data), scope: dep_config.scope, ..Default::default() @@ -561,9 +562,9 @@ impl<'app> WorkspaceBuilder<'app> { index, dep_index, if dep_config.optional.is_some_and(|v| v) { - DependencyType::Optional + TaskDependencyType::Optional } else { - DependencyType::Required + TaskDependencyType::Required }, ); } diff --git a/legacy/bun/platform/src/bun_platform.rs b/legacy/bun/platform/src/bun_platform.rs index 667e387d7c1..b9cc2871113 100644 --- a/legacy/bun/platform/src/bun_platform.rs +++ b/legacy/bun/platform/src/bun_platform.rs @@ -9,8 +9,8 @@ use moon_common::path::WorkspaceRelativePath; use moon_common::path::WorkspaceRelativePathBuf; use moon_common::path::is_root_level_source; use moon_config::{ - BunConfig, DependencyConfig, DependencyScope, DependencySource, HasherConfig, PlatformType, - ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, TaskConfig, TasksConfigsMap, + BunConfig, DependencyScope, DependencySource, HasherConfig, PlatformType, ProjectConfig, + ProjectDependencyConfig, ProjectsAliasesList, ProjectsSourcesList, TaskConfig, TasksConfigsMap, UnresolvedVersionSpec, }; use moon_console::Console; @@ -189,7 +189,7 @@ impl Platform for BunPlatform { &self, project_id: &str, project_source: &str, - ) -> miette::Result> { + ) -> miette::Result> { let mut implicit_deps = vec![]; debug!( @@ -205,7 +205,7 @@ impl Platform for BunPlatform { |package_deps: &BTreeMap, scope: &DependencyScope| { for dep_name in package_deps.keys() { if let Some(dep_project_id) = self.package_names.get(dep_name) { - implicit_deps.push(DependencyConfig { + implicit_deps.push(ProjectDependencyConfig { id: dep_project_id.to_owned(), scope: *scope, source: DependencySource::Implicit, diff --git a/legacy/core/platform/src/platform.rs b/legacy/core/platform/src/platform.rs index 2af75ccb5da..f93e13f5e1c 100644 --- a/legacy/core/platform/src/platform.rs +++ b/legacy/core/platform/src/platform.rs @@ -4,7 +4,7 @@ use moon_action_context::ActionContext; use moon_common::Id; use moon_common::path::{WorkspaceRelativePath, WorkspaceRelativePathBuf}; use moon_config::{ - DependencyConfig, HasherConfig, PlatformType, ProjectConfig, ProjectsAliasesList, + HasherConfig, PlatformType, ProjectConfig, ProjectDependencyConfig, ProjectsAliasesList, ProjectsSourcesList, TasksConfigsMap, UnresolvedVersionSpec, }; use moon_hash::ContentHasher; @@ -64,7 +64,7 @@ pub trait Platform: Send + Sync { &self, project_id: &str, project_source: &str, - ) -> miette::Result> { + ) -> miette::Result> { Ok(vec![]) } diff --git a/legacy/deno/platform/src/deno_platform.rs b/legacy/deno/platform/src/deno_platform.rs index 9bb927e1f00..1b9f48f89ac 100644 --- a/legacy/deno/platform/src/deno_platform.rs +++ b/legacy/deno/platform/src/deno_platform.rs @@ -7,8 +7,8 @@ use moon_action_context::ActionContext; use moon_common::path::{WorkspaceRelativePath, WorkspaceRelativePathBuf, is_root_level_source}; use moon_common::{Id, color, is_ci, is_test_env}; use moon_config::{ - BinEntry, DenoConfig, DependencyConfig, HasherConfig, HasherOptimization, PlatformType, - ProjectConfig, + BinEntry, DenoConfig, HasherConfig, HasherOptimization, PlatformType, ProjectConfig, + ProjectDependencyConfig, }; use moon_console::{Checkpoint, Console}; use moon_deno_lang::{DenoJson, find_package_manager_workspaces_root, load_lockfile_dependencies}; @@ -148,7 +148,7 @@ impl Platform for DenoPlatform { &self, _project_id: &str, _project_source: &str, - ) -> miette::Result> { + ) -> miette::Result> { Ok(vec![]) } diff --git a/legacy/node/platform/src/node_platform.rs b/legacy/node/platform/src/node_platform.rs index 2b2e515af4a..def3e72a28d 100644 --- a/legacy/node/platform/src/node_platform.rs +++ b/legacy/node/platform/src/node_platform.rs @@ -8,9 +8,9 @@ use moon_common::path::WorkspaceRelativePath; use moon_common::path::WorkspaceRelativePathBuf; use moon_common::path::is_root_level_source; use moon_config::{ - DependencyConfig, DependencyScope, DependencySource, HasherConfig, NodeConfig, - NodePackageManager, PlatformType, ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, - TaskConfig, TasksConfigsMap, UnresolvedVersionSpec, + DependencyScope, DependencySource, HasherConfig, NodeConfig, NodePackageManager, PlatformType, + ProjectConfig, ProjectDependencyConfig, ProjectsAliasesList, ProjectsSourcesList, TaskConfig, + TasksConfigsMap, UnresolvedVersionSpec, }; use moon_console::Console; use moon_hash::{ContentHasher, DepsHash}; @@ -192,7 +192,7 @@ impl Platform for NodePlatform { &self, project_id: &str, project_source: &str, - ) -> miette::Result> { + ) -> miette::Result> { let mut implicit_deps = vec![]; debug!( @@ -208,7 +208,7 @@ impl Platform for NodePlatform { |package_deps: &BTreeMap, scope: &DependencyScope| { for dep_name in package_deps.keys() { if let Some(dep_project_id) = self.package_names.get(dep_name) { - implicit_deps.push(DependencyConfig { + implicit_deps.push(ProjectDependencyConfig { id: dep_project_id.to_owned(), scope: *scope, source: DependencySource::Implicit, diff --git a/legacy/python/platform/src/python_platform.rs b/legacy/python/platform/src/python_platform.rs index 31706ddd137..6d0d1e7bc02 100644 --- a/legacy/python/platform/src/python_platform.rs +++ b/legacy/python/platform/src/python_platform.rs @@ -6,8 +6,8 @@ use moon_common::{ path::{WorkspaceRelativePath, is_root_level_source}, }; use moon_config::{ - DependencyConfig, DependencyScope, DependencySource, HasherConfig, HasherOptimization, - PlatformType, ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, PythonConfig, + DependencyScope, DependencySource, HasherConfig, HasherOptimization, PlatformType, + ProjectConfig, ProjectDependencyConfig, ProjectsAliasesList, ProjectsSourcesList, PythonConfig, PythonPackageManager, UnresolvedVersionSpec, }; use moon_console::Console; @@ -161,7 +161,7 @@ impl Platform for PythonPlatform { &self, project_id: &str, project_source: &str, - ) -> miette::Result> { + ) -> miette::Result> { let mut implicit_deps = vec![]; if self.config.package_manager == PythonPackageManager::Uv { @@ -184,7 +184,7 @@ impl Platform for PythonPlatform { && dep.origin.is_none() && let Some(dep_project_id) = self.package_names.get(&dep_name) { - implicit_deps.push(DependencyConfig { + implicit_deps.push(ProjectDependencyConfig { id: dep_project_id.to_owned(), scope: DependencyScope::Production, source: DependencySource::Implicit, diff --git a/legacy/rust/platform/src/rust_platform.rs b/legacy/rust/platform/src/rust_platform.rs index 2edee804e22..a5ed44c1440 100644 --- a/legacy/rust/platform/src/rust_platform.rs +++ b/legacy/rust/platform/src/rust_platform.rs @@ -9,8 +9,9 @@ use moon_common::{ path::{WorkspaceRelativePath, WorkspaceRelativePathBuf, exe_name, is_root_level_source}, }; use moon_config::{ - BinEntry, DependencyConfig, DependencyScope, DependencySource, HasherConfig, PlatformType, - ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, RustConfig, UnresolvedVersionSpec, + BinEntry, DependencyScope, DependencySource, HasherConfig, PlatformType, ProjectConfig, + ProjectDependencyConfig, ProjectsAliasesList, ProjectsSourcesList, RustConfig, + UnresolvedVersionSpec, }; use moon_console::{Checkpoint, Console}; use moon_hash::ContentHasher; @@ -213,7 +214,7 @@ impl Platform for RustPlatform { &self, project_id: &str, project_source: &str, - ) -> miette::Result> { + ) -> miette::Result> { let mut implicit_deps = vec![]; debug!( @@ -229,7 +230,7 @@ impl Platform for RustPlatform { if dep.detail().is_some_and(|d| d.path.is_some()) && let Some(dep_project_id) = self.package_names.get(dep_name) { - implicit_deps.push(DependencyConfig { + implicit_deps.push(ProjectDependencyConfig { id: dep_project_id.to_owned(), scope: *scope, source: DependencySource::Implicit, diff --git a/packages/types/src/project-config.ts b/packages/types/src/project-config.ts index 5930b942585..dc72fb3f4b4 100644 --- a/packages/types/src/project-config.ts +++ b/packages/types/src/project-config.ts @@ -10,9 +10,6 @@ import type { UnresolvedVersionSpec, } from './toolchain-config'; -/** The task-to-task relationship of the dependency. */ -export type DependencyType = 'cleanup' | 'required' | 'optional'; - /** The scope and or relationship of the dependency. */ export type DependencyScope = 'build' | 'development' | 'peer' | 'production' | 'root'; @@ -23,7 +20,7 @@ export type DependencyScope = 'build' | 'development' | 'peer' | 'production' | export type DependencySource = 'explicit' | 'implicit'; /** Expanded information about a project dependency. */ -export interface DependencyConfig { +export interface ProjectDependencyConfig { /** ID of the depended on project. */ id: Id; /** @@ -44,7 +41,7 @@ export interface DependencyConfig { via: string | null; } -export type ProjectDependsOn = Id | DependencyConfig; +export type ProjectDependsOn = Id | ProjectDependencyConfig; /** Configures `Dockerfile` generation. */ export interface ProjectDockerFileConfig { @@ -289,7 +286,7 @@ export interface ProjectConfig { } /** Expanded information about a project dependency. */ -export interface PartialDependencyConfig { +export interface PartialProjectDependencyConfig { /** ID of the depended on project. */ id?: Id | null; /** @@ -308,7 +305,7 @@ export interface PartialDependencyConfig { via?: string | null; } -export type PartialProjectDependsOn = Id | PartialDependencyConfig; +export type PartialProjectDependsOn = Id | PartialProjectDependencyConfig; /** Configures `Dockerfile` generation. */ export interface PartialProjectDockerFileConfig { diff --git a/packages/types/src/project.ts b/packages/types/src/project.ts index 6b48d7a9f28..abe64a15727 100644 --- a/packages/types/src/project.ts +++ b/packages/types/src/project.ts @@ -1,11 +1,10 @@ import type { Id } from './common'; import type { - DependencyConfig, DependencyScope, - DependencyType, LanguageType, LayerType, ProjectConfig, + ProjectDependencyConfig, StackType, } from './project-config'; import type { @@ -14,6 +13,7 @@ import type { PartialInheritedTasksConfig, PlatformType, TaskDependencyConfig, + TaskDependencyType, TaskMergeStrategy, TaskOperatingSystem, TaskOutputStyle, @@ -111,7 +111,7 @@ export interface TaskFragment { export interface Project { alias: string | null; config: ProjectConfig; - dependencies: DependencyConfig[]; + dependencies: ProjectDependencyConfig[]; fileGroups: Record; id: Id; inherited: { @@ -154,7 +154,7 @@ export interface TaskGraphInner { nodes: Task[]; node_holes: string[]; edge_property: 'directed'; - edges: [number, number, DependencyType][]; + edges: [number, number, TaskDependencyType][]; } export interface TaskGraph { diff --git a/packages/types/src/tasks-config.ts b/packages/types/src/tasks-config.ts index d7c2276c096..52482b39ac0 100644 --- a/packages/types/src/tasks-config.ts +++ b/packages/types/src/tasks-config.ts @@ -4,6 +4,9 @@ import type { ExtendsFrom, Id } from './common'; +/** The task-to-task relationship of the dependency. */ +export type TaskDependencyType = 'cleanup' | 'required' | 'optional'; + /** A file path input. */ export interface FileInput { content: string | null; diff --git a/website/static/schemas/project.json b/website/static/schemas/project.json index 0d93cce893d..01f11fa95f7 100644 --- a/website/static/schemas/project.json +++ b/website/static/schemas/project.json @@ -180,54 +180,6 @@ }, "additionalProperties": false, "definitions": { - "DependencyConfig": { - "description": "Expanded information about a project dependency.", - "type": "object", - "properties": { - "id": { - "title": "id", - "description": "ID of the depended on project.", - "allOf": [ - { - "$ref": "#/definitions/Id" - } - ] - }, - "scope": { - "title": "scope", - "description": "Scope of the dependency relationship.", - "default": "production", - "allOf": [ - { - "$ref": "#/definitions/DependencyScope" - } - ] - }, - "source": { - "title": "source", - "description": "Source of where the dependency came from.", - "default": "explicit", - "allOf": [ - { - "$ref": "#/definitions/DependencySource" - } - ] - }, - "via": { - "title": "via", - "description": "Metadata about the source.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "additionalProperties": false - }, "DependencyScope": { "description": "The scope and or relationship of the dependency.", "type": "string", @@ -531,6 +483,54 @@ "description": "Strategies and protocols for locating plugins.", "type": "string" }, + "ProjectDependencyConfig": { + "description": "Expanded information about a project dependency.", + "type": "object", + "properties": { + "id": { + "title": "id", + "description": "ID of the depended on project.", + "allOf": [ + { + "$ref": "#/definitions/Id" + } + ] + }, + "scope": { + "title": "scope", + "description": "Scope of the dependency relationship.", + "default": "production", + "allOf": [ + { + "$ref": "#/definitions/DependencyScope" + } + ] + }, + "source": { + "title": "source", + "description": "Source of where the dependency came from.", + "default": "explicit", + "allOf": [ + { + "$ref": "#/definitions/DependencySource" + } + ] + }, + "via": { + "title": "via", + "description": "Metadata about the source.", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + }, "ProjectDependsOn": { "description": "Expanded information about a project dependency.", "anyOf": [ @@ -538,7 +538,7 @@ "$ref": "#/definitions/Id" }, { - "$ref": "#/definitions/DependencyConfig" + "$ref": "#/definitions/ProjectDependencyConfig" } ] }, From b8ac6a6fb20c846cd13fe18e89ab467dd183147c Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sun, 28 Sep 2025 10:31:10 -0700 Subject: [PATCH 10/12] new: Add Deno support and improve toolchain APIs. (#2127) * deps(proto): Update to v0.53. (#2119) * Update proto. * Update version. * Fix plugins. * Add new fields. * Update deps. * Remove field. * chore: Release * Fix tests. * Mark as deprecated. * Insert projects/tasks. * chore: Release * Add deno. * Update docs. * Fix tests. * Fix tests. --- CHANGELOG.md | 30 + Cargo.lock | 1387 +++++++---------- Cargo.toml | 8 +- crates/actions/src/actions/sync_project.rs | 2 + .../src/commands/migrate/from_package_json.rs | 1 + crates/app/src/systems/analyze.rs | 1 + crates/cli/Cargo.toml | 2 +- crates/cli/tests/run_bun_test.rs | 1 + crates/cli/tests/run_deno_test.rs | 1 + crates/cli/tests/run_node_test.rs | 1 + crates/cli/tests/run_rust_test.rs | 2 + crates/cli/tests/run_webhooks_test.rs | 10 +- crates/common/Cargo.toml | 2 +- crates/config/Cargo.toml | 8 +- crates/config/src/toolchain_config.rs | 41 +- crates/config/tests/toolchain_config_test.rs | 2 + crates/feature-flags/Cargo.toml | 2 +- crates/file-group/Cargo.toml | 8 +- crates/mcp/Cargo.toml | 6 +- crates/pdk-api/Cargo.toml | 10 +- crates/pdk-api/src/toolchain/tier1.rs | 3 + crates/pdk-api/src/toolchain/tier2.rs | 8 +- crates/pdk-test-utils/Cargo.toml | 5 +- crates/pdk-test-utils/src/lib.rs | 1 + .../pdk-test-utils/src/toolchain_wrapper.rs | 67 + crates/pdk/Cargo.toml | 10 +- .../tests/project_builder_test.rs | 8 +- crates/project/Cargo.toml | 10 +- crates/target/Cargo.toml | 4 +- .../task-builder/tests/tasks_builder_test.rs | 10 +- crates/task/Cargo.toml | 10 +- crates/test-utils/src/platform_manager.rs | 1 + crates/test-utils/src/workspace_mocker.rs | 6 +- justfile | 3 + legacy/core/test-utils/src/configs.rs | 2 + packages/types/src/toolchain-config.ts | 48 +- website/docs/config/toolchain.mdx | 95 +- website/static/schemas/toolchain.json | 4 + 38 files changed, 910 insertions(+), 910 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68d283b2fc6..9bc94459644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,23 @@ ## Unreleased +#### 💥 Breaking + +- **WASM API** + - Removed `ParseLockOutput.packages` field. + #### 🚀 Updates +- Added a new + [Deno toolchain implementation](https://github.com/moonrepo/plugins/tree/master/toolchains/deno), + powered entirely by our new WASM plugin system. It can be enabled with the `unstable_deno` + identifier. + - Supports tiers 1, 2, and 3! + - Parses `deno.json` and `deno.jsonc` manifest files. + - Parses `deno.lock` lock files. + - Will install dependencies with `deno install`. + - Pairs with the `unstable_javascript` toolchain. + - And much more! - Added a new task input type that allows you to depend on changes to a project's files directly, instead of depending on a project's task. - Added URI support: `project://` @@ -18,10 +33,25 @@ - `only` - Only run the task in CI, and not locally, when affected. - `skip` - Skip running in CI but run locally and allow task relationships to be valid. +#### 🧰 Toolchains + +- **JavaScript** + - Added Deno support. Can customize `packageManager` with `deno`. + - Added workspace member caching to reduce fs operations. + - Updated `install_dependencies` and `setup_environment` to take project toolchain configuration + into account. + +#### 🧩 Plugins + +- **WASM API** + - Added `ManifestDependencyConfig.reference` field. + - Added `SyncProjectInput.toolchain_workspace_config` field. + #### ⚙️ Internal - Updated proto to [v0.53.0](https://github.com/moonrepo/proto/releases/tag/v0.53.0) (from 0.52.3). - Updated Rust to v1.90.0. +- Updated dependencies. ## 1.40.5 diff --git a/Cargo.lock b/Cargo.lock index b773fb19f39..cba5420ff0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,16 @@ version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli", + "gimli 0.31.1", +] + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli 0.32.3", ] [[package]] @@ -122,9 +131,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" @@ -147,15 +156,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - [[package]] name = "assert-json-diff" version = "2.0.2" @@ -197,39 +197,18 @@ dependencies = [ "tempfile", ] -[[package]] -name = "async-attributes" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "async-broadcast" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.1", + "event-listener", "event-listener-strategy", "futures-core", "pin-project-lite", ] -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - [[package]] name = "async-channel" version = "2.5.0" @@ -256,37 +235,22 @@ dependencies = [ "slab", ] -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - [[package]] name = "async-io" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 1.0.8", + "rustix 1.1.2", "slab", - "windows-sys 0.60.2", + "windows-sys 0.61.1", ] [[package]] @@ -295,36 +259,37 @@ version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "event-listener 5.4.1", + "event-listener", "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-object-pool" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "333c456b97c3f2d50604e8b2624253b7f787208cb72eb75e64b0ad11b221652c" +checksum = "e1ac0219111eb7bb7cb76d4cf2cb50c598e7ae549091d3616f9e95442c18486f" dependencies = [ - "async-std", + "async-lock", + "event-listener", ] [[package]] name = "async-process" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ - "async-channel 2.5.0", + "async-channel", "async-io", "async-lock", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.1", + "event-listener", "futures-lite", - "rustix 1.0.8", + "rustix 1.1.2", ] [[package]] @@ -335,14 +300,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "async-signal" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", @@ -350,38 +315,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.0.8", + "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.60.2", -] - -[[package]] -name = "async-std" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" -dependencies = [ - "async-attributes", - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", + "windows-sys 0.61.1", ] [[package]] @@ -403,7 +340,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -420,7 +357,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -437,9 +374,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.13.3" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" dependencies = [ "aws-lc-sys", "zeroize", @@ -447,15 +384,16 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.30.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +checksum = "1ba2e2516bdf37af57fc6ff047855f54abad0066e5c4fdaaeb76dabb2e05bcf5" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", + "libloading", ] [[package]] @@ -467,8 +405,8 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "itoa", "matchit", @@ -492,8 +430,8 @@ checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" dependencies = [ "bytes", "futures-core", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "mime", "pin-project-lite", @@ -505,17 +443,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ - "addr2line", + "addr2line 0.25.1", "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.37.3", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.0", ] [[package]] @@ -545,17 +483,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "basic-cookies" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67bd8fd42c16bdb08688243dc5f0cc117a3ca9efeeaba3a345a18a6159ad96f7" -dependencies = [ - "lalrpop", - "lalrpop-util", - "regex", -] - [[package]] name = "bazel-remote-apis" version = "0.18.0" @@ -580,25 +507,22 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.5" +version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ "bitflags", "cexpr", "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", "quote", "regex", - "rustc-hash 1.1.0", + "rustc-hash", "shlex", - "syn 2.0.106", - "which", + "syn", ] [[package]] @@ -612,21 +536,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - [[package]] name = "bitflags" version = "2.9.4" @@ -657,7 +566,7 @@ version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.5.0", + "async-channel", "async-task", "futures-io", "futures-lite", @@ -707,6 +616,9 @@ name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] [[package]] name = "bzip2" @@ -753,7 +665,7 @@ dependencies = [ "ahash", "cached_proc_macro", "cached_proc_macro_types", - "hashbrown", + "hashbrown 0.15.5", "once_cell", "thiserror 2.0.16", "web-time", @@ -768,7 +680,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -801,7 +713,7 @@ dependencies = [ "io-lifetimes", "ipnet", "maybe-owned", - "rustix 1.0.8", + "rustix 1.1.2", "rustix-linux-procfs", "windows-sys 0.59.0", "winx", @@ -826,7 +738,7 @@ dependencies = [ "cap-primitives", "io-extras", "io-lifetimes", - "rustix 1.0.8", + "rustix 1.1.2", ] [[package]] @@ -839,7 +751,7 @@ dependencies = [ "cap-primitives", "iana-time-zone", "once_cell", - "rustix 1.0.8", + "rustix 1.1.2", "winx", ] @@ -862,7 +774,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b4a6cae9efc04cc6cbb8faf338d2c497c165c83e74509cf4dbedea948bbf6e5" dependencies = [ "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -884,7 +796,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml 0.9.5", + "toml 0.9.7", ] [[package]] @@ -909,16 +821,16 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.106", + "syn", "tempfile", "toml 0.8.23", ] [[package]] name = "cc" -version = "1.2.36" +version = "1.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" dependencies = [ "find-msvc-tools", "jobserver", @@ -1026,9 +938,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.47" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", "clap_derive", @@ -1036,9 +948,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.47" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" dependencies = [ "anstream", "anstyle", @@ -1049,9 +961,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.57" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d9501bd3f5f09f7bbee01da9a511073ed30a80cd7a509f1214bb74eadea71ad" +checksum = "75bf0b32ad2e152de789bb635ea4d3078f6b838ad7974143e99b99f45a04af4a" dependencies = [ "clap", ] @@ -1075,7 +987,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1246,9 +1158,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpp_demangle" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" dependencies = [ "cfg-if", ] @@ -1311,12 +1223,12 @@ dependencies = [ "cranelift-control", "cranelift-entity", "cranelift-isle", - "gimli", - "hashbrown", + "gimli 0.31.1", + "hashbrown 0.15.5", "log", "pulley-interpreter", "regalloc2", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "smallvec", "target-lexicon", @@ -1494,12 +1406,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - [[package]] name = "crypto-common" version = "0.1.6" @@ -1541,7 +1447,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn", ] [[package]] @@ -1555,7 +1461,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn", ] [[package]] @@ -1566,7 +1472,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1577,7 +1483,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1616,7 +1522,7 @@ checksum = "a1ad5ae3ef15db33e917d6ed54b53d0a98d068c4d1217eb35a4997423203c3ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1651,9 +1557,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", ] @@ -1666,7 +1572,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1687,7 +1593,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1697,7 +1603,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn", ] [[package]] @@ -1709,7 +1615,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1769,16 +1675,6 @@ dependencies = [ "dirs-sys 0.5.0", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.3.7" @@ -1799,7 +1695,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -1831,7 +1727,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1902,15 +1798,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" -[[package]] -name = "ena" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" -dependencies = [ - "log", -] - [[package]] name = "encode_unicode" version = "1.0.0" @@ -1950,7 +1837,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1961,20 +1848,14 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.1", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - [[package]] name = "event-listener" version = "5.4.1" @@ -1992,7 +1873,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.1", + "event-listener", "pin-project-lite", ] @@ -2011,7 +1892,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "toml 0.9.5", + "toml 0.9.7", "tracing", "tracing-subscriber", "ureq", @@ -2048,7 +1929,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2085,7 +1966,7 @@ checksum = "d086daea5fd844e3c5ac69ddfe36df4a9a43e7218cf7d1f888182b089b09806c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2107,7 +1988,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix 1.0.8", + "rustix 1.1.2", "windows-sys 0.59.0", ] @@ -2125,15 +2006,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" - -[[package]] -name = "fixedbitset" -version = "0.4.2" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "fixedbitset" @@ -2204,7 +2079,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" dependencies = [ "io-lifetimes", - "rustix 1.0.8", + "rustix 1.1.2", "windows-sys 0.59.0", ] @@ -2283,7 +2158,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2298,6 +2173,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.31" @@ -2361,7 +2242,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn", ] [[package]] @@ -2406,7 +2287,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.4+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -2419,7 +2300,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2433,14 +2314,20 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "git-url-parse" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68d7ff03a34ea818a59cf30c0d7aa55354925484fa30bcc4cb96d784ff07578f" +checksum = "1e7b317d596ee92449fde128f598e56e2d75aaa9436a3db7620dd3c0bb3e1543" dependencies = [ - "strum 0.26.3", - "thiserror 1.0.69", + "strum", + "thiserror 2.0.16", "url", ] @@ -2474,18 +2361,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "graph-cycles" version = "0.3.0" @@ -2513,7 +2388,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.3.1", + "http", "indexmap", "slab", "tokio", @@ -2533,6 +2408,36 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64 0.22.1", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http", +] + [[package]] name = "heck" version = "0.5.0" @@ -2571,26 +2476,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.3.1" @@ -2611,17 +2496,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -2629,7 +2503,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http", ] [[package]] @@ -2640,8 +2514,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -2654,7 +2528,7 @@ dependencies = [ "async-trait", "bincode", "cacache", - "http 1.3.1", + "http", "http-cache-semantics", "httpdate", "serde", @@ -2669,7 +2543,7 @@ checksum = "8ccca775a066b2a65da33611921e078ebdcfc27065c8bee96794703541101886" dependencies = [ "anyhow", "async-trait", - "http 1.3.1", + "http", "http-cache", "http-cache-semantics", "reqwest", @@ -2684,7 +2558,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92baf25cf0b8c9246baecf3a444546360a97b569168fdf92563ee6a47829920c" dependencies = [ - "http 1.3.1", + "http", "http-serde", "serde", "time", @@ -2696,7 +2570,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" dependencies = [ - "http 1.3.1", + "http", "serde", ] @@ -2714,29 +2588,35 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "httpmock" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08ec9586ee0910472dec1a1f0f8acf52f0fdde93aea74d70d4a3107b4be0fd5b" +checksum = "1cccf7d3f1b6ee94515933ed2d24615bc8aa2a68c3858e318422f10f538888f2" dependencies = [ "assert-json-diff", "async-object-pool", - "async-std", "async-trait", - "base64 0.21.7", - "basic-cookies", + "base64 0.22.1", + "bytes", "crossbeam-utils", "form_urlencoded", + "futures-timer", "futures-util", - "hyper 0.14.32", - "lazy_static", - "levenshtein", - "log", + "headers", + "http", + "http-body-util", + "hyper", + "hyper-util", + "path-tree", "regex", "serde", "serde_json", "serde_regex", "similar", + "stringmetrics", + "tabwriter", + "thiserror 2.0.16", "tokio", + "tracing", "url", ] @@ -2757,32 +2637,9 @@ dependencies = [ [[package]] name = "humantime" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" @@ -2795,8 +2652,8 @@ dependencies = [ "futures-channel", "futures-core", "h2", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -2813,8 +2670,8 @@ version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http 1.3.1", - "hyper 1.7.0", + "http", + "hyper", "hyper-util", "rustls", "rustls-native-certs", @@ -2831,7 +2688,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.7.0", + "hyper", "hyper-util", "pin-project-lite", "tokio", @@ -2846,7 +2703,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.7.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2856,18 +2713,18 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.7.0", + "http", + "http-body", + "hyper", "ipnet", "libc", "percent-encoding", @@ -2882,9 +2739,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2892,7 +2749,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core 0.62.1", ] [[package]] @@ -3046,7 +2903,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.0", "serde", "serde_core", ] @@ -3091,9 +2948,9 @@ dependencies = [ [[package]] name = "iocraft" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2276ed525f48c3ebc83563eec6bdf726aa26d6a5f8ede6089e823f5649e6a7" +checksum = "de67d28a265c69edcdf7bb3d7de3682e6254c7a8292664a4505c98fd58e36fc6" dependencies = [ "any_key", "bitflags", @@ -3113,7 +2970,7 @@ checksum = "d2a8b12929295d5fea225570fd69a41084e2949d56ce0c20ff22494ef13e0d56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "uuid", ] @@ -3260,9 +3117,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.78" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -3302,58 +3159,12 @@ dependencies = [ "sha2", ] -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "lalrpop" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" -dependencies = [ - "ascii-canvas", - "bit-set", - "ena", - "itertools 0.11.0", - "lalrpop-util", - "petgraph 0.6.5", - "pico-args", - "regex", - "regex-syntax", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", - "walkdir", -] - -[[package]] -name = "lalrpop-util" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" -dependencies = [ - "regex-automata", -] - [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "leb128" version = "0.2.5" @@ -3366,12 +3177,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" -[[package]] -name = "levenshtein" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" - [[package]] name = "libbz2-rs-sys" version = "0.2.2" @@ -3380,9 +3185,9 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libloading" @@ -3391,7 +3196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-targets 0.53.4", ] [[package]] @@ -3432,9 +3237,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags", "libc", @@ -3468,9 +3273,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -3493,9 +3298,6 @@ name = "log" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" -dependencies = [ - "value-bag", -] [[package]] name = "lru-slab" @@ -3543,7 +3345,7 @@ dependencies = [ "manyhow-macros", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -3595,9 +3397,9 @@ checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0" [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memfd" @@ -3605,7 +3407,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ - "rustix 1.0.8", + "rustix 1.1.2", ] [[package]] @@ -3665,7 +3467,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -3676,7 +3478,7 @@ checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -3752,7 +3554,7 @@ dependencies = [ "moon_target", "moon_time", "moon_toolchain", - "rustc-hash 2.1.1", + "rustc-hash", "serde", ] @@ -3764,7 +3566,7 @@ dependencies = [ "moon_affected", "moon_common", "moon_target", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", "serde", "tokio", @@ -3791,7 +3593,7 @@ dependencies = [ "moon_test_utils2", "moon_workspace_graph", "petgraph 0.8.2", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_sandbox", "starbase_utils", "thiserror 2.0.16", @@ -3827,7 +3629,7 @@ dependencies = [ "moon_workspace_graph", "num_cpus", "petgraph 0.8.2", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_sandbox", "tokio", @@ -3868,7 +3670,7 @@ dependencies = [ "moon_vcs_hooks", "moon_workspace_graph", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", "serde", "serial_test", @@ -3892,7 +3694,7 @@ dependencies = [ "moon_task", "moon_test_utils2", "moon_workspace_graph", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_sandbox", "starbase_utils", @@ -3993,7 +3795,7 @@ dependencies = [ "proto_core", "regex", "reqwest", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "semver", "serde", @@ -4040,7 +3842,7 @@ dependencies = [ "cached", "miette 7.6.0", "moon_lang", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_sandbox", "starbase_utils", @@ -4071,7 +3873,7 @@ dependencies = [ "moon_tool", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "serde", "starbase_styles", @@ -4093,7 +3895,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", "starbase_utils", "tracing", @@ -4150,7 +3952,7 @@ dependencies = [ "moon_test_utils2", "moon_vcs", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "serial_test", "sigpipe", "starbase", @@ -4178,7 +3980,7 @@ dependencies = [ "moon_process", "moon_time", "regex", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_archive", "starbase_sandbox", @@ -4205,13 +4007,13 @@ dependencies = [ [[package]] name = "moon_common" -version = "0.1.4" +version = "0.2.0" dependencies = [ "dirs 6.0.0", "miette 7.6.0", "regex", "relative-path", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "serde", "starbase_id", @@ -4221,7 +4023,7 @@ dependencies = [ [[package]] name = "moon_config" -version = "0.1.9" +version = "0.2.0" dependencies = [ "httpmock", "indexmap", @@ -4232,7 +4034,7 @@ dependencies = [ "proto_core", "regex", "rpkl", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "semver", "serde", @@ -4251,7 +4053,7 @@ version = "0.0.1" dependencies = [ "miette 7.6.0", "moon_config", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", ] @@ -4279,7 +4081,7 @@ dependencies = [ "miette 7.6.0", "moon_lang", "moon_logger", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_styles", "starbase_utils", @@ -4307,7 +4109,7 @@ dependencies = [ "moon_tool", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_utils", "typescript_tsconfig_json", @@ -4327,7 +4129,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_utils", "tracing", ] @@ -4359,7 +4161,7 @@ name = "moon_env_var" version = "0.0.1" dependencies = [ "regex", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", ] @@ -4373,20 +4175,20 @@ dependencies = [ "moon_config", "moon_pdk_api", "moon_plugin", - "rustc-hash 2.1.1", + "rustc-hash", "tracing", ] [[package]] name = "moon_feature_flags" -version = "0.0.4" +version = "0.1.0" dependencies = [ "starbase_utils", ] [[package]] name = "moon_file_group" -version = "0.1.3" +version = "0.2.0" dependencies = [ "common-path", "miette 7.6.0", @@ -4405,7 +4207,7 @@ version = "0.0.1" dependencies = [ "miette 7.6.0", "petgraph 0.8.2", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_utils", ] @@ -4434,7 +4236,7 @@ dependencies = [ "moon_target", "moon_toolchain", "moon_utils", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_styles", "tracing", ] @@ -4444,7 +4246,7 @@ name = "moon_lang" version = "0.0.1" dependencies = [ "miette 7.6.0", - "rustc-hash 2.1.1", + "rustc-hash", ] [[package]] @@ -4488,7 +4290,7 @@ dependencies = [ "nodejs_package_json", "package-lock-json-parser", "reqwest", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "serde_json", "serde_yml", @@ -4521,7 +4323,7 @@ dependencies = [ "moon_tool", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "serde", "starbase_styles", @@ -4543,7 +4345,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", "starbase_styles", "starbase_utils", @@ -4570,7 +4372,7 @@ dependencies = [ [[package]] name = "moon_pdk" -version = "0.3.2" +version = "0.4.0" dependencies = [ "clap", "extism-pdk", @@ -4578,7 +4380,7 @@ dependencies = [ "moon_pdk_api", "moon_project", "moon_task", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "serde", "warpgate_pdk", @@ -4586,7 +4388,7 @@ dependencies = [ [[package]] name = "moon_pdk_api" -version = "0.3.3" +version = "0.4.0" dependencies = [ "derive_setters", "moon_common", @@ -4594,7 +4396,7 @@ dependencies = [ "moon_project", "moon_task", "proto_pdk_api", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "serde", "serde_json", @@ -4603,10 +4405,11 @@ dependencies = [ [[package]] name = "moon_pdk_test_utils" -version = "0.3.3" +version = "0.4.1" dependencies = [ "extism", "moon_pdk_api", + "moon_target", "proto_core", "proto_pdk_test_utils", "serde", @@ -4631,7 +4434,7 @@ dependencies = [ "moon_task", "moon_tool", "moon_toolchain", - "rustc-hash 2.1.1", + "rustc-hash", ] [[package]] @@ -4649,7 +4452,7 @@ dependencies = [ "moon_target", "moon_workspace_graph", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", "serde", "serde_json", @@ -4673,7 +4476,7 @@ dependencies = [ "moon_common", "moon_console", "moon_env_var", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_shell", "system_env", "thiserror 2.0.16", @@ -4684,7 +4487,7 @@ dependencies = [ [[package]] name = "moon_project" -version = "0.1.4" +version = "0.2.0" dependencies = [ "miette 7.6.0", "moon_common", @@ -4709,7 +4512,7 @@ dependencies = [ "moon_test_utils2", "moon_toolchain", "moon_toolchain_plugin", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_sandbox", "tokio", "tracing", @@ -4734,7 +4537,7 @@ dependencies = [ "moon_common", "moon_config", "moon_project", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_sandbox", "starbase_utils", "thiserror 2.0.16", @@ -4757,7 +4560,7 @@ dependencies = [ "moon_test_utils2", "moon_workspace", "petgraph 0.8.2", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", "starbase_events", "starbase_sandbox", @@ -4778,7 +4581,7 @@ dependencies = [ "moon_test_utils", "pep508_rs", "pyproject-toml", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_styles", "starbase_utils", @@ -4806,7 +4609,7 @@ dependencies = [ "moon_tool", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_styles", "starbase_utils", @@ -4829,7 +4632,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_styles", "starbase_utils", "tracing", @@ -4857,7 +4660,7 @@ dependencies = [ "async-trait", "bazel-remote-apis", "chrono", - "http 1.3.1", + "http", "miette 7.6.0", "moon_action", "moon_common", @@ -4867,7 +4670,7 @@ dependencies = [ "moon_process", "moon_task", "reqwest", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", "serde", "sha2", @@ -4893,7 +4696,7 @@ dependencies = [ "moon_lang", "moon_logger", "moon_test_utils", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_styles", "starbase_utils", @@ -4921,7 +4724,7 @@ dependencies = [ "moon_tool", "moon_utils", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_styles", "starbase_utils", @@ -4942,7 +4745,7 @@ dependencies = [ "moon_tool", "moon_toolchain", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_utils", "tracing", ] @@ -4969,7 +4772,7 @@ dependencies = [ [[package]] name = "moon_target" -version = "0.1.3" +version = "0.2.0" dependencies = [ "compact_str 0.9.0", "miette 7.6.0", @@ -4983,14 +4786,14 @@ dependencies = [ [[package]] name = "moon_task" -version = "0.1.3" +version = "0.2.0" dependencies = [ "miette 7.6.0", "moon_common", "moon_config", "moon_feature_flags", "moon_target", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_sandbox", "starbase_utils", @@ -5020,7 +4823,7 @@ dependencies = [ "moon_test_utils2", "moon_toolchain", "moon_toolchain_plugin", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_sandbox", "thiserror 2.0.16", "tokio", @@ -5046,7 +4849,7 @@ dependencies = [ "moon_time", "pathdiff", "regex", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_sandbox", "starbase_utils", "thiserror 2.0.16", @@ -5067,7 +4870,7 @@ dependencies = [ "moon_task", "moon_task_expander", "petgraph 0.8.2", - "rustc-hash 2.1.1", + "rustc-hash", "thiserror 2.0.16", "tracing", ] @@ -5086,7 +4889,7 @@ dependencies = [ "moon_task", "moon_test_utils2", "moon_vcs", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_sandbox", "starbase_utils", @@ -5123,7 +4926,7 @@ dependencies = [ "moon_time", "moon_toolchain", "moon_toolchain_plugin", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_archive", "starbase_sandbox", @@ -5145,7 +4948,7 @@ dependencies = [ "moon_config", "predicates", "pretty_assertions", - "rustc-hash 2.1.1", + "rustc-hash", "serde_json", "serde_yml", "starbase_utils", @@ -5204,7 +5007,7 @@ dependencies = [ "moon_process", "moon_toolchain", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_styles", "thiserror 2.0.16", "tokio", @@ -5219,7 +5022,7 @@ dependencies = [ "moon_config", "moon_env_var", "regex", - "rustc-hash 2.1.1", + "rustc-hash", "serde", ] @@ -5239,7 +5042,7 @@ dependencies = [ "moon_process", "moon_toolchain", "proto_core", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_utils", "tokio", "tracing", @@ -5277,7 +5080,7 @@ dependencies = [ "moon_env_var", "moon_process", "regex", - "rustc-hash 2.1.1", + "rustc-hash", "scc 2.4.0", "semver", "serde", @@ -5297,7 +5100,7 @@ dependencies = [ "moon_config", "moon_hash", "moon_vcs", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_sandbox", "starbase_utils", @@ -5329,7 +5132,7 @@ dependencies = [ "moon_vcs", "moon_workspace_graph", "petgraph 0.8.2", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "starbase_events", "starbase_utils", @@ -5380,12 +5183,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - [[package]] name = "nix" version = "0.30.1" @@ -5406,7 +5203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6922a0f0a653370d0811386199a5d4eef2f463479d6a91c96d6e782fd7924cc9" dependencies = [ "indexmap", - "rustc-hash 2.1.1", + "rustc-hash", "semver", "serde", "serde_json", @@ -5560,11 +5357,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "crc32fast", - "hashbrown", + "hashbrown 0.15.5", "indexmap", "memchr", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "oci-client" version = "0.15.0" @@ -5574,7 +5380,7 @@ dependencies = [ "bytes", "chrono", "futures-util", - "http 1.3.1", + "http", "http-auth", "jwt", "lazy_static", @@ -5603,8 +5409,8 @@ dependencies = [ "regex", "serde", "serde_json", - "strum 0.27.2", - "strum_macros 0.27.2", + "strum", + "strum_macros", "thiserror 2.0.16", ] @@ -5665,7 +5471,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -5783,6 +5589,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "path-tree" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a97453bc21a968f722df730bfe11bd08745cb50d1300b0df2bda131dece136" +dependencies = [ + "smallvec", +] + [[package]] name = "pathdiff" version = "0.2.3" @@ -5851,7 +5666,7 @@ dependencies = [ "once_cell", "pep440_rs", "regex", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "smallvec", "thiserror 1.0.69", @@ -5869,9 +5684,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +checksum = "21e0a3a33733faeaf8651dfee72dd0f388f0c8e5ad496a3478fa5a922f49cfa8" dependencies = [ "memchr", "thiserror 2.0.16", @@ -5880,9 +5695,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc" +checksum = "bc58706f770acb1dbd0973e6530a3cff4746fb721207feb3a8a6064cd0b6c663" dependencies = [ "pest", "pest_generator", @@ -5890,44 +5705,34 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966" +checksum = "6d4f36811dfe07f7b8573462465d5cb8965fffc2e71ae377a33aecf14c2c9a2f" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "pest_meta" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" +checksum = "42919b05089acbd0a5dcd5405fb304d17d1053847b81163d09c4ad18ce8e8420" dependencies = [ "pest", "sha2", ] -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset 0.4.2", - "indexmap", -] - [[package]] name = "petgraph" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ - "fixedbitset 0.5.7", + "fixedbitset", "indexmap", ] @@ -5937,8 +5742,8 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54acf3a685220b533e437e264e4d932cfbdc4cc7ec0cd232ed73c08d03b8a7ca" dependencies = [ - "fixedbitset 0.5.7", - "hashbrown", + "fixedbitset", + "hashbrown 0.15.5", "indexmap", "serde", "serde_derive", @@ -5982,12 +5787,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pico-args" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" - [[package]] name = "pin-project" version = "1.1.10" @@ -6005,7 +5804,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6039,16 +5838,16 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polling" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix 1.1.2", + "windows-sys 0.61.1", ] [[package]] @@ -6096,12 +5895,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - [[package]] name = "predicates" version = "3.1.3" @@ -6149,16 +5942,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn", ] [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.22.27", + "toml_edit 0.23.6", ] [[package]] @@ -6180,7 +5973,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6239,7 +6032,7 @@ dependencies = [ "prost 0.13.5", "prost-types", "regex", - "syn 2.0.106", + "syn", "tempfile", ] @@ -6253,7 +6046,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6266,7 +6059,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6297,8 +6090,8 @@ dependencies = [ "proto_shim", "regex", "reqwest", - "rustc-hash 2.1.1", - "scc 3.0.7", + "rustc-hash", + "scc 3.1.2", "schematic", "semver", "serde", @@ -6327,7 +6120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af545a208b69b44dbd66e927836461e3dc2e0ee103bf1805b4723e279e7604ad" dependencies = [ "derive_setters", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "semver", "serde", @@ -6360,7 +6153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59efd69e462e500cd7cb78c896ee37d2f8193f50f4e6bd9c425e6bfe31a00a57" dependencies = [ "dirs 6.0.0", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -6385,16 +6178,16 @@ dependencies = [ [[package]] name = "pyproject-toml" -version = "0.13.5" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0f6160dc48298b9260d9b958ad1d7f96f6cd0b9df200b22329204e09334663" +checksum = "ec768e063102b426e8962989758115e8659485124de9207bc365fab524125d65" dependencies = [ "indexmap", "pep440_rs", "pep508_rs", "serde", "thiserror 2.0.16", - "toml 0.8.23", + "toml 0.9.7", ] [[package]] @@ -6417,7 +6210,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.1", + "rustc-hash", "rustls", "socket2 0.6.0", "thiserror 2.0.16", @@ -6437,7 +6230,7 @@ dependencies = [ "lru-slab", "rand 0.9.2", "ring", - "rustc-hash 2.1.1", + "rustc-hash", "rustls", "rustls-pki-types", "slab", @@ -6594,8 +6387,8 @@ checksum = "23bbed272e39c47a095a5242218a67412a220006842558b03fe2935e8f3d7b92" dependencies = [ "cfg-if", "libc", - "rustix 1.0.8", - "windows 0.62.0", + "rustix 1.1.2", + "windows 0.62.1", ] [[package]] @@ -6606,17 +6399,17 @@ checksum = "dc06e6b318142614e4a48bc725abbf08ff166694835c43c9dae5a9009704639a" dependencies = [ "allocator-api2", "bumpalo", - "hashbrown", + "hashbrown 0.15.5", "log", - "rustc-hash 2.1.1", + "rustc-hash", "smallvec", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -6626,9 +6419,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -6663,10 +6456,10 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.7.0", + "hyper", "hyper-rustls", "hyper-tls", "hyper-util", @@ -6708,7 +6501,7 @@ checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" dependencies = [ "anyhow", "async-trait", - "http 1.3.1", + "http", "reqwest", "serde", "thiserror 1.0.69", @@ -6785,22 +6578,22 @@ dependencies = [ [[package]] name = "rust-mcp-macros" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2079014c2b3dfa82a2dafd203121d5a28929102c5e003bf8d8019a60fc17e0d" +checksum = "b647a85c9da2eaf14e67d39cb067a8157a66bd2c0dc53ef1051a84f45edfae24" dependencies = [ "proc-macro2", "quote", "serde", "serde_json", - "syn 2.0.106", + "syn", ] [[package]] name = "rust-mcp-schema" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "098436b06bfa4b88b110d12a5567cf37fd454735ee67cab7eb48bdbea0dd0e57" +checksum = "0bb65fd293dbbfabaacba1512b3948cdd9bf31ad1f2c0fed4962052b590c5c44" dependencies = [ "serde", "serde_json", @@ -6858,12 +6651,6 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -6885,15 +6672,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.1", ] [[package]] @@ -6903,14 +6690,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" dependencies = [ "once_cell", - "rustix 1.0.8", + "rustix 1.1.2", ] [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "aws-lc-rs", "log", @@ -6931,7 +6718,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.4.0", + "security-framework 3.5.0", ] [[package]] @@ -6968,7 +6755,7 @@ dependencies = [ "rustls-native-certs", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework 3.4.0", + "security-framework 3.5.0", "security-framework-sys", "webpki-root-certs", "windows-sys 0.59.0", @@ -6982,9 +6769,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "aws-lc-rs", "ring", @@ -7006,9 +6793,9 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "saa" -version = "3.2.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293e425dca7c7889a87de14ff29a4112f18a155119295671cd7fb8c70015a1c5" +checksum = "d568b02a433a98d20e7dc1a8b3077163629fe1e86c89fb95e31798324137a925" [[package]] name = "same-file" @@ -7031,21 +6818,21 @@ dependencies = [ [[package]] name = "scc" -version = "3.0.7" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0c0b27fa9a31fc2bad3b9ce122188c9df8158bdcbc3c73e3c0bc38aa69c61e" +checksum = "b502f85d09e86afa08920ba0e320d9919e0edfb57aa6d7f7947d9961f789cdd7" dependencies = [ "saa", - "sdd 4.0.1", + "sdd 4.1.1", ] [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.1", ] [[package]] @@ -7082,7 +6869,7 @@ dependencies = [ "serde_yml", "starbase_styles", "thiserror 2.0.16", - "toml 0.9.5", + "toml 0.9.7", "tracing", ] @@ -7096,7 +6883,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -7112,7 +6899,7 @@ dependencies = [ "serde", "serde_json", "serde_yml", - "toml 0.9.5", + "toml 0.9.7", "url", ] @@ -7130,9 +6917,9 @@ checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" [[package]] name = "sdd" -version = "4.0.1" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d51b068a416b603c6b3aaeeba43feb2924ee80739c543482f931328dfc71cdb" +checksum = "289309f6b5c6a090488f188a75e98d96007e763b892018de92b5889eb09a03f4" [[package]] name = "security-framework" @@ -7149,9 +6936,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" +checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" dependencies = [ "bitflags", "core-foundation 0.10.1", @@ -7182,9 +6969,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245" dependencies = [ "serde_core", "serde_derive", @@ -7192,31 +6979,32 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.17" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde_core" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -7235,12 +7023,13 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -7261,7 +7050,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -7275,11 +7064,11 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -7331,7 +7120,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -7556,9 +7345,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "starbase" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d753b4e1a05de4557a715e4886b439afa7e0c5d857a11bd8459d2de58998e01" +checksum = "ebfcf58b02a45e1dccbbd6e10f5ebf2bef22ee6de0a50e18c7336a19be189ef3" dependencies = [ "async-trait", "chrono", @@ -7582,7 +7371,7 @@ dependencies = [ "flate2", "liblzma", "miette 7.6.0", - "rustc-hash 2.1.1", + "rustc-hash", "starbase_styles", "starbase_utils", "thiserror 2.0.16", @@ -7642,7 +7431,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -7688,9 +7477,9 @@ dependencies = [ [[package]] name = "starbase_utils" -version = "0.11.19" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3138017c8bc9a262b792f1c264106305a580e6d9252d702ca41c4898973e87" +checksum = "1e6a13a15f9fb697b959ddb010af5599b0d8389d61ea1ebe72d46a46decfcd6b" dependencies = [ "async-trait", "dirs 6.0.0", @@ -7700,13 +7489,13 @@ dependencies = [ "miette 7.6.0", "regex", "reqwest", - "scc 3.0.7", + "scc 2.4.0", "serde", "serde_json", "serde_yml", "starbase_styles", "thiserror 2.0.16", - "toml 0.9.5", + "toml 0.9.7", "tracing", "url", "wax", @@ -7719,16 +7508,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "string_cache" -version = "0.8.9" +name = "stringmetrics" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", -] +checksum = "7b3c8667cd96245cbb600b8dec5680a7319edd719c5aa2b5d23c6bff94f39765" [[package]] name = "strsim" @@ -7736,32 +7519,13 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - [[package]] name = "strum" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.106", + "strum_macros", ] [[package]] @@ -7773,7 +7537,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -7803,17 +7567,6 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.106" @@ -7842,14 +7595,14 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "sysinfo" -version = "0.37.0" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cec4dc2d2e357ca1e610cfb07de2fa7a10fc3e9fe89f72545f3d244ea87753" +checksum = "3bddd368fda2f82ead69c03d46d351987cfa0c2a57abfa37a017f3aa3e9bf69a" dependencies = [ "libc", "memchr", @@ -7910,6 +7663,15 @@ dependencies = [ "thiserror 2.0.16", ] +[[package]] +name = "tabwriter" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce91f2f0ec87dff7e6bcbbeb267439aa1188703003c6055193c821487400432" +dependencies = [ + "unicode-width 0.2.1", +] + [[package]] name = "taffy" version = "0.5.2" @@ -7925,9 +7687,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "tauri-winrt-notification" @@ -7943,15 +7705,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.21.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix 1.1.2", + "windows-sys 0.61.1", ] [[package]] @@ -7976,17 +7738,6 @@ dependencies = [ "unic-segment", ] -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - [[package]] name = "termcolor" version = "1.4.1" @@ -8002,7 +7753,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.0.8", + "rustix 1.1.2", "windows-sys 0.60.2", ] @@ -8048,7 +7799,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -8059,7 +7810,7 @@ checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -8073,11 +7824,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", + "itoa", "num-conv", "powerfmt", "serde", @@ -8101,15 +7853,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tiny_http" version = "0.12.0" @@ -8176,7 +7919,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -8191,9 +7934,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -8237,13 +7980,13 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" +checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" dependencies = [ "indexmap", - "serde", - "serde_spanned 1.0.0", + "serde_core", + "serde_spanned 1.0.2", "toml_datetime 0.7.2", "toml_parser", "toml_writer", @@ -8328,10 +8071,10 @@ dependencies = [ "bytes", "flate2", "h2", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.7.0", + "hyper", "hyper-timeout", "hyper-util", "percent-encoding", @@ -8376,8 +8119,8 @@ dependencies = [ "bitflags", "bytes", "futures-util", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "iri-string", "pin-project-lite", "tower", @@ -8417,7 +8160,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -8478,7 +8221,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -8502,7 +8245,7 @@ dependencies = [ "clean-path", "indexmap", "relative-path", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "serde_json", "starbase_utils", @@ -8583,15 +8326,15 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-id" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10103c57044730945224467c09f71a4db0071c123a0648cc3e818913bde6b561" +checksum = "70ba288e709927c043cbe476718d37be306be53fb1fafecd0dbe36d072be2580" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-linebreak" @@ -8670,7 +8413,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" dependencies = [ "base64 0.22.1", - "http 1.3.1", + "http", "httparse", "log", ] @@ -8728,12 +8471,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[package]] -name = "value-bag" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" - [[package]] name = "vcpkg" version = "0.2.15" @@ -8822,7 +8559,7 @@ dependencies = [ "reqwest", "reqwest-middleware", "reqwest-netrc", - "scc 3.0.7", + "scc 3.1.2", "schematic", "serde", "serde_json", @@ -8847,7 +8584,7 @@ checksum = "570fd77685c82ecfdae8b59f78b9ef8f3a7f9a6d5dec28408ed052b7b503a8e1" dependencies = [ "anyhow", "derive_setters", - "rustc-hash 2.1.1", + "rustc-hash", "schematic", "serde", "serde_json", @@ -8875,11 +8612,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.4+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a5f4a424faf49c3c2c344f166f0662341d470ea185e939657aaff130f0ec4a" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ - "wit-bindgen", + "wasip2", ] [[package]] @@ -8907,11 +8644,20 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -8922,23 +8668,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.51" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -8949,9 +8695,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8959,22 +8705,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -8991,12 +8737,12 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.238.1" +version = "0.239.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50d48c31c615f77679b61c607b8151378a5d03159616bf3d17e8e2005afdaf5" +checksum = "5be00faa2b4950c76fe618c409d2c3ea5a3c9422013e079482d78544bb2d184c" dependencies = [ "leb128fmt", - "wasmparser 0.238.1", + "wasmparser 0.239.0", ] [[package]] @@ -9019,7 +8765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04f17a5917c2ddd3819e84c661fae0d6ba29d7b9c1f0e96c708c65a9c4188e11" dependencies = [ "bitflags", - "hashbrown", + "hashbrown 0.15.5", "indexmap", "semver", "serde", @@ -9027,9 +8773,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.238.1" +version = "0.239.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa99c8328024423875ae4a55345cfde8f0371327fb2d0f33b0f52a06fc44408" +checksum = "8c9d90bb93e764f6beabf1d02028c70a2156a6583e63ac4218dd07ef733368b0" dependencies = [ "bitflags", "indexmap", @@ -9053,7 +8799,7 @@ version = "30.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "809cc8780708f1deed0a7c3fcab46954f0e8c08a6fe0252772481fbc88fcf946" dependencies = [ - "addr2line", + "addr2line 0.24.2", "anyhow", "async-trait", "bitflags", @@ -9062,15 +8808,15 @@ dependencies = [ "cfg-if", "encoding_rs", "fxprof-processed-profile", - "gimli", - "hashbrown", + "gimli 0.31.1", + "hashbrown 0.15.5", "indexmap", "ittapi", "libc", "log", "mach2", "memfd", - "object", + "object 0.36.7", "once_cell", "paste", "postcard", @@ -9143,7 +8889,7 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.106", + "syn", "wasmtime-component-util", "wasmtime-wit-bindgen", "wit-parser", @@ -9168,10 +8914,10 @@ dependencies = [ "cranelift-entity", "cranelift-frontend", "cranelift-native", - "gimli", + "gimli 0.31.1", "itertools 0.12.1", "log", - "object", + "object 0.36.7", "pulley-interpreter", "smallvec", "target-lexicon", @@ -9191,10 +8937,10 @@ dependencies = [ "cpp_demangle", "cranelift-bitset", "cranelift-entity", - "gimli", + "gimli 0.31.1", "indexmap", "log", - "object", + "object 0.36.7", "postcard", "rustc-demangle", "semver", @@ -9230,7 +8976,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74812989369947f4f5a33f4ae8ff551eb6c8a97ff55e0269a9f5f0fac93cd755" dependencies = [ "cc", - "object", + "object 0.36.7", "rustix 0.38.44", "wasmtime-versioned-export-macros", ] @@ -9270,7 +9016,7 @@ checksum = "dd2fe69d04986a12fc759d2e79494100d600adcb3bb79e63dedfc8e6bb2ab03e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -9281,8 +9027,8 @@ checksum = "5a9c8eae8395d530bb00a388030de9f543528674c382326f601de47524376975" dependencies = [ "anyhow", "cranelift-codegen", - "gimli", - "object", + "gimli 0.31.1", + "object 0.36.7", "target-lexicon", "wasmparser 0.224.1", "wasmtime-cranelift", @@ -9313,24 +9059,24 @@ dependencies = [ [[package]] name = "wast" -version = "238.0.1" +version = "239.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a564e7eab2abb8920c1302b90eb2c98a15efbbe30fc060d4e2d88483aa23fe" +checksum = "9139176fe8a2590e0fb174cdcaf373b224cb93c3dde08e4297c1361d2ba1ea5d" dependencies = [ "bumpalo", "leb128fmt", "memchr", "unicode-width 0.2.1", - "wasm-encoder 0.238.1", + "wasm-encoder 0.239.0", ] [[package]] name = "wat" -version = "1.238.1" +version = "1.239.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eb84e6ac2997025f80482266fdc9f60fa28ba791b674bfd33855e77fe867631" +checksum = "3e1c941927d34709f255558166f8901a2005f8ab4a9650432e9281b7cc6f3b75" dependencies = [ - "wast 238.0.1", + "wast 239.0.0", ] [[package]] @@ -9350,9 +9096,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.78" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -9386,18 +9132,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - [[package]] name = "wiggle" version = "30.0.2" @@ -9425,7 +9159,7 @@ dependencies = [ "proc-macro2", "quote", "shellexpand 2.1.2", - "syn 2.0.106", + "syn", "witx", ] @@ -9437,7 +9171,7 @@ checksum = "ceac9f94f22ccc0485aeab08187b9f211d1993aaf0ed6eeb8aed43314f6e717c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "wiggle-generate", ] @@ -9463,7 +9197,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -9480,7 +9214,7 @@ checksum = "7dbd4e07bd92c7ddace2f3267bdd31d4197b5ec58c315751325d45c19bfb56df" dependencies = [ "anyhow", "cranelift-codegen", - "gimli", + "gimli 0.31.1", "regalloc2", "smallvec", "target-lexicon", @@ -9505,14 +9239,13 @@ dependencies = [ [[package]] name = "windows" -version = "0.62.0" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9579d0e6970fd5250aa29aba5994052385ff55cf7b28a059e484bb79ea842e42" +checksum = "49e6c4a1f363c8210c6f77ba24f645c61c6fb941eccf013da691f7e09515b8ac" dependencies = [ - "windows-collections 0.3.0", - "windows-core 0.62.0", - "windows-future 0.3.0", - "windows-link 0.2.0", + "windows-collections 0.3.1", + "windows-core 0.62.1", + "windows-future 0.3.1", "windows-numerics 0.3.0", ] @@ -9527,11 +9260,11 @@ dependencies = [ [[package]] name = "windows-collections" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90dd7a7b86859ec4cdf864658b311545ef19dbcf17a672b52ab7cefe80c336f" +checksum = "123e712f464a8a60ce1a13f4c446d2d43ab06464cb5842ff68f5c71b6fb7852e" dependencies = [ - "windows-core 0.62.0", + "windows-core 0.62.1", ] [[package]] @@ -9549,9 +9282,9 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.62.0" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" dependencies = [ "windows-implement", "windows-interface", @@ -9573,35 +9306,35 @@ dependencies = [ [[package]] name = "windows-future" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2194dee901458cb79e1148a4e9aac2b164cc95fa431891e7b296ff0b2f1d8a6" +checksum = "68f3db6b24b120200d649cd4811b4947188ed3a8d2626f7075146c5d178a9a4a" dependencies = [ - "windows-core 0.62.0", + "windows-core 0.62.1", "windows-link 0.2.0", "windows-threading 0.2.0", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -9632,7 +9365,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ce3498fe0aba81e62e477408383196b4b0363db5e0c27646f932676283b43d8" dependencies = [ - "windows-core 0.62.0", + "windows-core 0.62.1", "windows-link 0.2.0", ] @@ -9716,14 +9449,14 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.4", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" dependencies = [ "windows-link 0.2.0", ] @@ -9761,11 +9494,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ - "windows-link 0.1.3", + "windows-link 0.2.0", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -9796,9 +9529,9 @@ dependencies = [ [[package]] name = "windows-version" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e061eb0a22b4a1d778ad70f7575ec7845490abb35b08fa320df7895882cacb" +checksum = "700dad7c058606087f6fdc1f88da5841e06da40334413c6cd4367b25ef26d24e" dependencies = [ "windows-link 0.2.0", ] @@ -9962,9 +9695,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.45.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "wit-parser" @@ -10004,12 +9737,12 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xattr" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix 1.0.8", + "rustix 1.1.2", ] [[package]] @@ -10055,15 +9788,15 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "synstructure", ] [[package]] name = "zbus" -version = "5.10.0" +version = "5.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a073be99ace1adc48af593701c8015cd9817df372e14a1a6b0ee8f8bf043be" +checksum = "2d07e46d035fb8e375b2ce63ba4e4ff90a7f73cf2ffb0138b29e1158d2eaadf7" dependencies = [ "async-broadcast", "async-executor", @@ -10075,7 +9808,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.4.1", + "event-listener", "futures-core", "futures-lite", "hex", @@ -10094,14 +9827,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.10.0" +version = "5.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e80cd713a45a49859dcb648053f63265f4f2851b6420d47a958e5697c68b131" +checksum = "57e797a9c847ed3ccc5b6254e8bcce056494b375b511b3d6edcec0aeb4defaca" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn", "zbus_names", "zvariant", "zvariant_utils", @@ -10136,7 +9869,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -10156,7 +9889,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "synstructure", ] @@ -10196,7 +9929,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -10285,7 +10018,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn", "zvariant_utils", ] @@ -10298,6 +10031,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.106", + "syn", "winnow", ] diff --git a/Cargo.toml b/Cargo.toml index 0f5c9958c9e..f11313dde46 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,11 +59,11 @@ schematic = { version = "0.18.12", default-features = false, features = [ ] } serial_test = "3.2.0" semver = "1.0.27" -serde = { version = "1.0.225", features = ["derive"] } +serde = { version = "1.0.227", features = ["derive"] } serde_json = "1.0.145" serde_yml = "0.0.12" sha2 = "0.10.9" -starbase = { version = "0.10.5" } +starbase = { version = "0.10.6" } starbase_archive = { version = "0.11.6", default-features = false, features = [ "miette", "tar-all", @@ -72,10 +72,10 @@ starbase_archive = { version = "0.11.6", default-features = false, features = [ starbase_console = { version = "0.6.13", features = ["miette"] } starbase_events = "0.7.3" starbase_id = { version = "0.2.3", features = ["miette", "schematic"] } -starbase_sandbox = "0.9.7" +starbase_sandbox = "0.9.9" starbase_shell = "0.10.2" starbase_styles = { version = "0.6.1", features = ["relative-path"] } -starbase_utils = { version = "0.11.16", default-features = false, features = [ +starbase_utils = { version = "0.11.20", default-features = false, features = [ "editor-config", "glob-cache", "miette", diff --git a/crates/actions/src/actions/sync_project.rs b/crates/actions/src/actions/sync_project.rs index 2d70d7b9878..506ca090f05 100644 --- a/crates/actions/src/actions/sync_project.rs +++ b/crates/actions/src/actions/sync_project.rs @@ -94,6 +94,8 @@ pub async fn sync_project( &app_context.toolchain_config, &project.config, ), + toolchain_workspace_config: registry + .create_config(&toolchain.id, &app_context.toolchain_config), } }) .await? diff --git a/crates/app/src/commands/migrate/from_package_json.rs b/crates/app/src/commands/migrate/from_package_json.rs index 9ba674cb22f..1395bf5e86b 100644 --- a/crates/app/src/commands/migrate/from_package_json.rs +++ b/crates/app/src/commands/migrate/from_package_json.rs @@ -70,6 +70,7 @@ pub async fn from_package_json(session: MoonSession, args: FromPackageJsonArgs) } }; + #[allow(deprecated)] PackageJsonCache::sync(&project.root, |package_json| { // Create tasks from `package.json` scripts for (task_id, task_config) in create_tasks_from_scripts( diff --git a/crates/app/src/systems/analyze.rs b/crates/app/src/systems/analyze.rs index 2208c4a7370..8e0052664b0 100644 --- a/crates/app/src/systems/analyze.rs +++ b/crates/app/src/systems/analyze.rs @@ -44,6 +44,7 @@ pub fn validate_version_constraint(constraint: &VersionReq, version: &Version) - Ok(None) } +#[allow(deprecated)] #[instrument(skip_all)] pub async fn register_platforms( console: &Console, diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index eba505f7883..869e69ceca9 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -42,7 +42,7 @@ moon_task_runner = { path = "../task-runner" } moon_test_utils = { path = "../../legacy/core/test-utils" } moon_test_utils2 = { path = "../test-utils" } moon_vcs = { path = "../vcs" } -httpmock = "0.7.0" +httpmock = "0.8.0" proto_core = { workspace = true } rustc-hash = { workspace = true } serial_test = { workspace = true } diff --git a/crates/cli/tests/run_bun_test.rs b/crates/cli/tests/run_bun_test.rs index ea5ec1f908d..c672269758b 100644 --- a/crates/cli/tests/run_bun_test.rs +++ b/crates/cli/tests/run_bun_test.rs @@ -9,6 +9,7 @@ fn bun_sandbox() -> Sandbox { bun_sandbox_with_config(|_| {}) } +#[allow(deprecated)] fn bun_sandbox_with_config(callback: C) -> Sandbox where C: FnOnce(&mut PartialBunConfig), diff --git a/crates/cli/tests/run_deno_test.rs b/crates/cli/tests/run_deno_test.rs index 7e8886a3194..efeb338f8e5 100644 --- a/crates/cli/tests/run_deno_test.rs +++ b/crates/cli/tests/run_deno_test.rs @@ -9,6 +9,7 @@ fn deno_sandbox() -> Sandbox { deno_sandbox_with_config(|_| {}) } +#[allow(deprecated)] fn deno_sandbox_with_config(callback: C) -> Sandbox where C: FnOnce(&mut PartialDenoConfig), diff --git a/crates/cli/tests/run_node_test.rs b/crates/cli/tests/run_node_test.rs index 8538becd008..e3319af41e9 100644 --- a/crates/cli/tests/run_node_test.rs +++ b/crates/cli/tests/run_node_test.rs @@ -16,6 +16,7 @@ fn node_sandbox() -> Sandbox { node_sandbox_with_config(|_| {}) } +#[allow(deprecated)] fn node_sandbox_with_config(callback: C) -> Sandbox where C: FnOnce(&mut PartialNodeConfig), diff --git a/crates/cli/tests/run_rust_test.rs b/crates/cli/tests/run_rust_test.rs index 252690e657a..c1f2a41f2f2 100644 --- a/crates/cli/tests/run_rust_test.rs +++ b/crates/cli/tests/run_rust_test.rs @@ -7,6 +7,7 @@ use moon_test_utils::{ }; use rustc_hash::FxHashMap; +#[allow(deprecated)] fn rust_sandbox() -> Sandbox { let workspace_config = PartialWorkspaceConfig { projects: Some(PartialWorkspaceProjects::Sources(FxHashMap::from_iter([( @@ -169,6 +170,7 @@ fn runs_script_task() { mod rustup_toolchain { use super::*; + #[allow(deprecated)] fn rust_toolchain_sandbox() -> Sandbox { let workspace_config = PartialWorkspaceConfig { projects: Some(PartialWorkspaceProjects::Sources(FxHashMap::from_iter([( diff --git a/crates/cli/tests/run_webhooks_test.rs b/crates/cli/tests/run_webhooks_test.rs index 7738695fe00..08b113b0652 100644 --- a/crates/cli/tests/run_webhooks_test.rs +++ b/crates/cli/tests/run_webhooks_test.rs @@ -37,7 +37,7 @@ async fn sends_webhooks() { cmd.arg("run").arg("node:cjs"); }); - mock.assert_hits(24); + mock.assert_calls(24); assert.success(); } @@ -62,7 +62,7 @@ async fn sends_webhooks_for_cache_events() { cmd.arg("run").arg("node:cjs"); }); - mock.assert_hits(48); + mock.assert_calls(48); assert.success(); } @@ -82,7 +82,7 @@ async fn doesnt_send_webhooks_if_first_fails() { cmd.arg("run").arg("node:cjs"); }); - mock.assert_hits(1); + mock.assert_calls(1); } #[tokio::test] @@ -92,7 +92,7 @@ async fn all_webhooks_have_same_uuid() { let mock = server.mock(|when, then| { when.method(POST) .path("/webhook") - .json_body_partial(r#"{"uuid":"XXXX-XXXX-XXXX-XXXX"}"#); + .json_body_includes(r#"{"uuid":"XXXX-XXXX-XXXX-XXXX"}"#); then.status(200); }); @@ -103,5 +103,5 @@ async fn all_webhooks_have_same_uuid() { cmd.arg("run").arg("node:cjs"); }); - mock.assert_hits(24); + mock.assert_calls(24); } diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 3116de28afc..41532dd347f 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_common" -version = "0.1.4" +version = "0.2.0" edition = "2024" license = "MIT" description = "Common utilities." diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index d941b92fbaf..5195b9b4d23 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_config" -version = "0.1.9" +version = "0.2.0" edition = "2024" license = "MIT" description = "Core workspace, project, and moon configuration." @@ -12,8 +12,8 @@ publish = true features = ["loader"] [dependencies] -moon_common = { version = "0.1.4", path = "../common" } -moon_target = { version = "0.1.3", path = "../target" } +moon_common = { version = "0.2.0", path = "../common" } +moon_target = { version = "0.2.0", path = "../target" } indexmap = { workspace = true } miette = { workspace = true } regex = { workspace = true } @@ -46,7 +46,7 @@ tracing = { workspace = true, optional = true } [dev-dependencies] moon_config = { path = ".", features = ["proto", "template", "tracing"] } -httpmock = "0.7.0" +httpmock = "0.8.0" serial_test = { workspace = true } starbase_sandbox = { workspace = true } diff --git a/crates/config/src/toolchain_config.rs b/crates/config/src/toolchain_config.rs index 0b8694c74f8..fabf5aba005 100644 --- a/crates/config/src/toolchain_config.rs +++ b/crates/config/src/toolchain_config.rs @@ -1,3 +1,5 @@ +#![allow(deprecated)] + use crate::config_struct; use crate::language_platform::*; use crate::toolchain::*; @@ -27,10 +29,12 @@ config_struct!( pub extends: Option, /// Configures and enables the Bun platform. + #[deprecated = "Use `unstable_bun` instead."] #[setting(nested)] pub bun: Option, /// Configures and enables the Deno platform. + #[deprecated = "Use `unstable_deno` instead."] #[setting(nested)] pub deno: Option, @@ -39,6 +43,7 @@ config_struct!( pub moon: MoonConfig, /// Configures and enables the Node.js platform. + #[deprecated = "Use `unstable_node` instead."] #[setting(nested)] pub node: Option, @@ -51,6 +56,7 @@ config_struct!( pub python: Option, /// Configures and enables the Rust platform. + #[deprecated = "Use `unstable_rust` instead."] #[setting(nested)] pub rust: Option, @@ -136,39 +142,43 @@ impl ToolchainConfig { match id.as_str() { "typescript" => Some(find_debug_locator_with_url_fallback( "typescript_toolchain", - "0.2.3", + "0.3.0", )), "unstable_bun" => Some(find_debug_locator_with_url_fallback( "bun_toolchain", - "0.1.1", + "0.2.0", + )), + "unstable_deno" => Some(find_debug_locator_with_url_fallback( + "deno_toolchain", + "0.1.0", )), "unstable_javascript" => Some(find_debug_locator_with_url_fallback( "javascript_toolchain", - "0.1.3", + "0.2.0", )), "unstable_go" => Some(find_debug_locator_with_url_fallback( "go_toolchain", - "0.1.6", + "0.2.0", )), "unstable_node" => Some(find_debug_locator_with_url_fallback( "node_toolchain", - "0.1.1", + "0.2.0", )), "unstable_npm" => Some(find_debug_locator_with_url_fallback( "node_depman_toolchain", - "0.1.1", + "0.2.0", )), "unstable_pnpm" => Some(find_debug_locator_with_url_fallback( "node_depman_toolchain", - "0.1.1", + "0.2.0", )), "unstable_rust" => Some(find_debug_locator_with_url_fallback( "rust_toolchain", - "0.2.4", + "0.3.0", )), "unstable_yarn" => Some(find_debug_locator_with_url_fallback( "node_depman_toolchain", - "0.1.1", + "0.2.0", )), _ => None, } @@ -375,6 +385,17 @@ impl ToolchainConfig { ); } + if self.deno.is_some() + && (self.plugins.contains_key("deno") + || self.plugins.contains_key("unstable_deno") + || self.plugins.contains_key("javascript") + || self.plugins.contains_key("unstable_javascript")) + { + warn!( + "The legacy Deno platform and WASM based JavaScript/Deno toolchains must not be used together!" + ); + } + if self.node.is_some() && (self.plugins.contains_key("node") || self.plugins.contains_key("unstable_node") @@ -401,6 +422,7 @@ impl ToolchainConfig { for id in [ "typescript", "unstable_bun", + "unstable_deno", "unstable_go", "unstable_javascript", "unstable_node", @@ -430,6 +452,7 @@ impl ToolchainConfig { match id.as_str() { "typescript" | "unstable_bun" + | "unstable_deno" | "unstable_go" | "unstable_javascript" | "unstable_node" diff --git a/crates/config/tests/toolchain_config_test.rs b/crates/config/tests/toolchain_config_test.rs index 3987a5e84ab..c28479e19f6 100644 --- a/crates/config/tests/toolchain_config_test.rs +++ b/crates/config/tests/toolchain_config_test.rs @@ -1,3 +1,5 @@ +#![allow(deprecated)] + mod utils; use httpmock::prelude::*; diff --git a/crates/feature-flags/Cargo.toml b/crates/feature-flags/Cargo.toml index 3ac0b118a9b..0205fc24772 100644 --- a/crates/feature-flags/Cargo.toml +++ b/crates/feature-flags/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_feature_flags" -version = "0.0.4" +version = "0.1.0" edition = "2024" license = "MIT" description = "Manages feature flags." diff --git a/crates/file-group/Cargo.toml b/crates/file-group/Cargo.toml index e98da97c536..42f9d4fb0b5 100644 --- a/crates/file-group/Cargo.toml +++ b/crates/file-group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_file_group" -version = "0.1.3" +version = "0.2.0" edition = "2024" license = "MIT" description = "File groups and collections." @@ -9,9 +9,9 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.1.4", path = "../common" } -moon_config = { version = "0.1.9", path = "../config" } -moon_feature_flags = { version = "0.0.4", path = "../feature-flags" } +moon_common = { version = "0.2.0", path = "../common" } +moon_config = { version = "0.2.0", path = "../config" } +moon_feature_flags = { version = "0.1.0", path = "../feature-flags" } common-path = "1.0.0" miette = { workspace = true } serde = { workspace = true } diff --git a/crates/mcp/Cargo.toml b/crates/mcp/Cargo.toml index aac3988e9f5..7c584c49655 100644 --- a/crates/mcp/Cargo.toml +++ b/crates/mcp/Cargo.toml @@ -13,9 +13,9 @@ moon_action = { path = "../action" } moon_action_graph = { path = "../action-graph" } moon_action_pipeline = { path = "../action-pipeline" } moon_app_context = { path = "../app-context" } -moon_common = { version = "0.1.4", path = "../common" } -moon_project = { version = "0.1.4", path = "../project" } -moon_task = { version = "0.1.3", path = "../task" } +moon_common = { version = "0.2.0", path = "../common" } +moon_project = { version = "0.2.0", path = "../project" } +moon_task = { version = "0.2.0", path = "../task" } moon_workspace_graph = { path = "../workspace-graph" } async-trait = { workspace = true } miette = { workspace = true } diff --git a/crates/pdk-api/Cargo.toml b/crates/pdk-api/Cargo.toml index 9332fa1fbe2..cc8c274a191 100644 --- a/crates/pdk-api/Cargo.toml +++ b/crates/pdk-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_pdk_api" -version = "0.3.3" +version = "0.4.0" edition = "2024" license = "MIT" description = "Core APIs for creating moon WASM plugins." @@ -9,10 +9,10 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.1.4", path = "../common" } -moon_config = { version = "0.1.9", path = "../config" } -moon_project = { version = "0.1.4", path = "../project" } -moon_task = { version = "0.1.3", path = "../task" } +moon_common = { version = "0.2.0", path = "../common" } +moon_config = { version = "0.2.0", path = "../config" } +moon_project = { version = "0.2.0", path = "../project" } +moon_task = { version = "0.2.0", path = "../task" } derive_setters = "0.1.7" proto_pdk_api = { workspace = true } rustc-hash = { workspace = true } diff --git a/crates/pdk-api/src/toolchain/tier1.rs b/crates/pdk-api/src/toolchain/tier1.rs index 3f0e3531fe7..af5008edd7c 100644 --- a/crates/pdk-api/src/toolchain/tier1.rs +++ b/crates/pdk-api/src/toolchain/tier1.rs @@ -138,6 +138,9 @@ api_struct!( /// Workspace and project merged toolchain configuration, /// with the latter taking precedence. pub toolchain_config: serde_json::Value, + + /// Workspace only toolchain configuration. + pub toolchain_workspace_config: serde_json::Value, } ); diff --git a/crates/pdk-api/src/toolchain/tier2.rs b/crates/pdk-api/src/toolchain/tier2.rs index 31d133e9b5c..c601af85165 100644 --- a/crates/pdk-api/src/toolchain/tier2.rs +++ b/crates/pdk-api/src/toolchain/tier2.rs @@ -212,6 +212,10 @@ api_struct!( #[serde(skip_serializing_if = "Option::is_none")] pub path: Option, + /// Unique reference, identifier, or specifier. + #[serde(skip_serializing_if = "Option::is_none")] + pub reference: Option, + /// URL of the remote dependency. #[serde(skip_serializing_if = "Option::is_none")] pub url: Option, @@ -301,10 +305,6 @@ api_struct!( /// Map of all dependencies and their locked versions. #[serde(skip_serializing_if = "BTreeMap::is_empty")] pub dependencies: BTreeMap>, - - /// Map of all packages within the current workspace. - #[serde(skip_serializing_if = "BTreeMap::is_empty")] - pub packages: BTreeMap>, } ); diff --git a/crates/pdk-test-utils/Cargo.toml b/crates/pdk-test-utils/Cargo.toml index e420cf84d93..d21e746292d 100644 --- a/crates/pdk-test-utils/Cargo.toml +++ b/crates/pdk-test-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_pdk_test_utils" -version = "0.3.3" +version = "0.4.1" edition = "2024" license = "MIT" description = "Utilities for testing moon WASM plugins." @@ -9,7 +9,8 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_pdk_api = { version = "0.3.3", path = "../pdk-api" } +moon_pdk_api = { version = "0.4.0", path = "../pdk-api" } +moon_target = { version = "0.2.0", path = "../target" } extism = { workspace = true } proto_core = { workspace = true } proto_pdk_test_utils = { workspace = true } diff --git a/crates/pdk-test-utils/src/lib.rs b/crates/pdk-test-utils/src/lib.rs index 4f15260aae6..583d965c37a 100644 --- a/crates/pdk-test-utils/src/lib.rs +++ b/crates/pdk-test-utils/src/lib.rs @@ -7,5 +7,6 @@ mod toolchain_wrapper; pub use extension_wrapper::*; pub use moon_pdk_api::*; +pub use moon_target::*; pub use sandbox::*; pub use toolchain_wrapper::*; diff --git a/crates/pdk-test-utils/src/toolchain_wrapper.rs b/crates/pdk-test-utils/src/toolchain_wrapper.rs index 21c91858b2d..12888d6f7e2 100644 --- a/crates/pdk-test-utils/src/toolchain_wrapper.rs +++ b/crates/pdk-test-utils/src/toolchain_wrapper.rs @@ -1,4 +1,5 @@ use moon_pdk_api::*; +use moon_target::Target; use proto_pdk_test_utils::WasmTestWrapper as ToolTestWrapper; use std::ops::Deref; use std::path::PathBuf; @@ -20,6 +21,21 @@ impl ToolchainTestWrapper { } } + pub fn create_project_fragment(&self) -> ProjectFragment { + ProjectFragment { + id: Id::raw("project"), + source: "project".into(), + ..Default::default() + } + } + + pub fn create_task_fragment(&self) -> TaskFragment { + TaskFragment { + target: Target::parse("project:task").unwrap(), + ..Default::default() + } + } + pub async fn define_docker_metadata( &self, mut input: DefineDockerMetadataInput, @@ -49,10 +65,19 @@ impl ToolchainTestWrapper { mut input: ExtendTaskCommandInput, ) -> ExtendTaskCommandOutput { input.context = self.create_context(); + input.globals_dir = input .globals_dir .map(|path| self.plugin.to_virtual_path(path)); + if input.project.id.is_empty() { + input.project = self.create_project_fragment(); + } + + if input.task.target.id.is_empty() { + input.task = self.create_task_fragment(); + } + self.plugin .call_func_with("extend_task_command", input) .await @@ -64,10 +89,19 @@ impl ToolchainTestWrapper { mut input: ExtendTaskScriptInput, ) -> ExtendTaskScriptOutput { input.context = self.create_context(); + input.globals_dir = input .globals_dir .map(|path| self.plugin.to_virtual_path(path)); + if input.project.id.is_empty() { + input.project = self.create_project_fragment(); + } + + if input.task.target.id.is_empty() { + input.task = self.create_task_fragment(); + } + self.plugin .call_func_with("extend_task_script", input) .await @@ -80,6 +114,14 @@ impl ToolchainTestWrapper { ) -> HashTaskContentsOutput { input.context = self.create_context(); + if input.project.id.is_empty() { + input.project = self.create_project_fragment(); + } + + if input.task.target.id.is_empty() { + input.task = self.create_task_fragment(); + } + self.plugin .call_func_with("hash_task_contents", input) .await @@ -105,6 +147,14 @@ impl ToolchainTestWrapper { input.context = self.create_context(); input.root = self.plugin.to_virtual_path(input.root); + if input + .project + .as_ref() + .is_some_and(|project| project.id.is_empty()) + { + input.project = Some(self.create_project_fragment()); + } + self.plugin .call_func_with("install_dependencies", input) .await @@ -169,6 +219,10 @@ impl ToolchainTestWrapper { input.input_dir = self.plugin.to_virtual_path(input.input_dir); input.output_dir = self.plugin.to_virtual_path(input.output_dir); + if input.project.id.is_empty() { + input.project = self.create_project_fragment(); + } + self.plugin .call_func_with("scaffold_docker", input) .await @@ -181,10 +235,19 @@ impl ToolchainTestWrapper { ) -> SetupEnvironmentOutput { input.context = self.create_context(); input.root = self.plugin.to_virtual_path(input.root); + input.globals_dir = input .globals_dir .map(|path| self.plugin.to_virtual_path(path)); + if input + .project + .as_ref() + .is_some_and(|project| project.id.is_empty()) + { + input.project = Some(self.create_project_fragment()); + } + self.plugin .call_func_with("setup_environment", input) .await @@ -203,6 +266,10 @@ impl ToolchainTestWrapper { pub async fn sync_project(&self, mut input: SyncProjectInput) -> SyncOutput { input.context = self.create_context(); + if input.project.id.is_empty() { + input.project = self.create_project_fragment(); + } + self.plugin .call_func_with("sync_project", input) .await diff --git a/crates/pdk/Cargo.toml b/crates/pdk/Cargo.toml index 7ed32121530..3a5629bf728 100644 --- a/crates/pdk/Cargo.toml +++ b/crates/pdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_pdk" -version = "0.3.2" +version = "0.4.0" edition = "2024" license = "MIT" description = "A plugin development kit for creating moon WASM plugins." @@ -9,10 +9,10 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.1.4", path = "../common" } -moon_pdk_api = { version = "0.3.3", path = "../pdk-api" } -moon_project = { version = "0.1.4", path = "../project" } -moon_task = { version = "0.1.3", path = "../task" } +moon_common = { version = "0.2.0", path = "../common" } +moon_pdk_api = { version = "0.4.0", path = "../pdk-api" } +moon_project = { version = "0.2.0", path = "../project" } +moon_task = { version = "0.2.0", path = "../task" } clap = { workspace = true } extism-pdk = { workspace = true } schematic = { workspace = true, optional = true, features = [ diff --git a/crates/project-builder/tests/project_builder_test.rs b/crates/project-builder/tests/project_builder_test.rs index 48f9b1181ec..77550c59d2a 100644 --- a/crates/project-builder/tests/project_builder_test.rs +++ b/crates/project-builder/tests/project_builder_test.rs @@ -245,7 +245,7 @@ mod project_builder { assert_eq!(project.language, LanguageType::JavaScript); assert_eq!( project.toolchains, - vec![Id::raw("deno"), Id::raw("unstable_javascript")] + vec![Id::raw("unstable_deno"), Id::raw("unstable_javascript")] ); let project = build_lang_project("deno-config").await; @@ -253,7 +253,11 @@ mod project_builder { assert_eq!(project.language, LanguageType::TypeScript); assert_eq!( project.toolchains, - vec![Id::raw("deno"), Id::raw("typescript")] + vec![ + Id::raw("typescript"), + Id::raw("unstable_deno"), + Id::raw("unstable_javascript") + ] ); } diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index 861fcae5816..43d09a99010 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_project" -version = "0.1.4" +version = "0.2.0" edition = "2024" license = "MIT" description = "A project in moon." @@ -9,10 +9,10 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.1.4", path = "../common" } -moon_config = { version = "0.1.9", path = "../config" } -moon_file_group = { version = "0.1.3", path = "../file-group" } -moon_task = { version = "0.1.3", path = "../task" } +moon_common = { version = "0.2.0", path = "../common" } +moon_config = { version = "0.2.0", path = "../config" } +moon_file_group = { version = "0.2.0", path = "../file-group" } +moon_task = { version = "0.2.0", path = "../task" } miette = { workspace = true } serde = { workspace = true } thiserror = { workspace = true } diff --git a/crates/target/Cargo.toml b/crates/target/Cargo.toml index 5ac602ff92c..f9d4f416c6f 100644 --- a/crates/target/Cargo.toml +++ b/crates/target/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_target" -version = "0.1.3" +version = "0.2.0" edition = "2024" license = "MIT" description = "Project + task target identifier." @@ -9,7 +9,7 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.1.4", path = "../common" } +moon_common = { version = "0.2.0", path = "../common" } compact_str = { workspace = true } miette = { workspace = true } regex = { workspace = true } diff --git a/crates/task-builder/tests/tasks_builder_test.rs b/crates/task-builder/tests/tasks_builder_test.rs index 3f9bdee9eca..f0c4c36d410 100644 --- a/crates/task-builder/tests/tasks_builder_test.rs +++ b/crates/task-builder/tests/tasks_builder_test.rs @@ -508,7 +508,10 @@ tasks: let task = tasks.get("deno-via-cmd").unwrap(); - assert_eq!(task.toolchains, vec![Id::raw("deno")]); + assert_eq!( + task.toolchains, + vec![Id::raw("unstable_deno"), Id::raw("unstable_javascript")] + ); let task = tasks.get("node-via-cmd").unwrap(); @@ -622,7 +625,10 @@ tasks: let task = tasks.get("deno-via-cmd").unwrap(); - assert_eq!(task.toolchains, vec![Id::raw("deno")]); + assert_eq!( + task.toolchains, + vec![Id::raw("unstable_deno"), Id::raw("unstable_javascript")] + ); let task = tasks.get("node-via-cmd").unwrap(); diff --git a/crates/task/Cargo.toml b/crates/task/Cargo.toml index 1ca54afe0ba..9695a6d92c0 100644 --- a/crates/task/Cargo.toml +++ b/crates/task/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_task" -version = "0.1.3" +version = "0.2.0" edition = "2024" license = "MIT" description = "A task within a project." @@ -9,10 +9,10 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.1.4", path = "../common" } -moon_config = { version = "0.1.9", path = "../config" } -moon_feature_flags = { version = "0.0.4", path = "../feature-flags" } -moon_target = { version = "0.1.3", path = "../target" } +moon_common = { version = "0.2.0", path = "../common" } +moon_config = { version = "0.2.0", path = "../config" } +moon_feature_flags = { version = "0.1.0", path = "../feature-flags" } +moon_target = { version = "0.2.0", path = "../target" } miette = { workspace = true } rustc-hash = { workspace = true } serde = { workspace = true } diff --git a/crates/test-utils/src/platform_manager.rs b/crates/test-utils/src/platform_manager.rs index 1fcaaf74499..78e8d4fc2c0 100644 --- a/crates/test-utils/src/platform_manager.rs +++ b/crates/test-utils/src/platform_manager.rs @@ -27,6 +27,7 @@ pub async fn generate_platform_manager_from_sandbox(root: &Path) -> PlatformMana generate_platform_manager(root, &config, proto, console).await } +#[allow(deprecated)] pub async fn generate_platform_manager( root: &Path, config: &ToolchainConfig, diff --git a/crates/test-utils/src/workspace_mocker.rs b/crates/test-utils/src/workspace_mocker.rs index 269a5c5e3d4..fc5606a3d0a 100644 --- a/crates/test-utils/src/workspace_mocker.rs +++ b/crates/test-utils/src/workspace_mocker.rs @@ -137,14 +137,11 @@ impl WorkspaceMocker { pub fn with_all_toolchains(self) -> Self { self.update_toolchain_config(|config| { - // config.bun = Some(BunConfig::default()); - config.deno = Some(DenoConfig::default()); - // config.node = Some(NodeConfig::default()); - // config.rust = Some(RustConfig::default()); config.inherit_default_plugins().unwrap(); }) } + #[allow(deprecated)] pub fn with_legacy_toolchains(self) -> Self { self.update_toolchain_config(|config| { config.bun = Some(BunConfig::default()); @@ -186,6 +183,7 @@ impl WorkspaceMocker { }) } + #[allow(deprecated)] pub fn with_default_toolchains(self) -> Self { self.update_toolchain_config(|config| { if config.node.is_none() { diff --git a/justfile b/justfile index c9dc36d972a..b86d5b4aa2e 100644 --- a/justfile +++ b/justfile @@ -65,6 +65,9 @@ bump-interactive: release: node ./scripts/version/applyAndTagVersions.mjs +release-crates type="patch": + cargo release {{type}} --execute -p moon_common -p moon_config -p moon_feature_flags -p moon_file_group -p moon_pdk -p moon_pdk_api -p moon_pdk_test_utils -p moon_project -p moon_target -p moon_task + # OTHER docs: diff --git a/legacy/core/test-utils/src/configs.rs b/legacy/core/test-utils/src/configs.rs index be6755ed434..b755b238159 100644 --- a/legacy/core/test-utils/src/configs.rs +++ b/legacy/core/test-utils/src/configs.rs @@ -1,3 +1,5 @@ +#![allow(deprecated)] + use crate::create_inputs; use moon_common::Id; use moon_config::*; diff --git a/packages/types/src/toolchain-config.ts b/packages/types/src/toolchain-config.ts index 461aceaa02d..ca6635b5006 100644 --- a/packages/types/src/toolchain-config.ts +++ b/packages/types/src/toolchain-config.ts @@ -386,9 +386,17 @@ export interface RustConfig { export interface ToolchainConfig { /** @default 'https://moonrepo.dev/schemas/toolchain.json' */ $schema?: string; - /** Configures and enables the Bun platform. */ + /** + * Configures and enables the Bun platform. + * + * @deprecated Use `unstable_bun` instead. + */ bun: BunConfig | null; - /** Configures and enables the Deno platform. */ + /** + * Configures and enables the Deno platform. + * + * @deprecated Use `unstable_deno` instead. + */ deno: DenoConfig | null; /** * Extends one or many toolchain configuration files. @@ -397,7 +405,11 @@ export interface ToolchainConfig { extends: ExtendsFrom | null; /** Configures moon itself. */ moon: MoonConfig; - /** Configures and enables the Node.js platform. */ + /** + * Configures and enables the Node.js platform. + * + * @deprecated Use `unstable_node` instead. + */ node: NodeConfig | null; /** All configured toolchains by unique ID. */ plugins: Record; @@ -405,7 +417,11 @@ export interface ToolchainConfig { proto: ProtoConfig; /** Configures and enables the Python platform. */ python: PythonConfig | null; - /** Configures and enables the Rust platform. */ + /** + * Configures and enables the Rust platform. + * + * @deprecated Use `unstable_rust` instead. + */ rust: RustConfig | null; } @@ -758,9 +774,17 @@ export interface PartialRustConfig { export interface PartialToolchainConfig { /** @default 'https://moonrepo.dev/schemas/toolchain.json' */ $schema?: string | null; - /** Configures and enables the Bun platform. */ + /** + * Configures and enables the Bun platform. + * + * @deprecated Use `unstable_bun` instead. + */ bun?: PartialBunConfig | null; - /** Configures and enables the Deno platform. */ + /** + * Configures and enables the Deno platform. + * + * @deprecated Use `unstable_deno` instead. + */ deno?: PartialDenoConfig | null; /** * Extends one or many toolchain configuration files. @@ -769,7 +793,11 @@ export interface PartialToolchainConfig { extends?: ExtendsFrom | null; /** Configures moon itself. */ moon?: PartialMoonConfig | null; - /** Configures and enables the Node.js platform. */ + /** + * Configures and enables the Node.js platform. + * + * @deprecated Use `unstable_node` instead. + */ node?: PartialNodeConfig | null; /** All configured toolchains by unique ID. */ plugins?: Record | null; @@ -777,6 +805,10 @@ export interface PartialToolchainConfig { proto?: PartialProtoConfig | null; /** Configures and enables the Python platform. */ python?: PartialPythonConfig | null; - /** Configures and enables the Rust platform. */ + /** + * Configures and enables the Rust platform. + * + * @deprecated Use `unstable_rust` instead. + */ rust?: PartialRustConfig | null; } diff --git a/website/docs/config/toolchain.mdx b/website/docs/config/toolchain.mdx index b71caad1c58..e3b3a3e72b8 100644 --- a/website/docs/config/toolchain.mdx +++ b/website/docs/config/toolchain.mdx @@ -180,9 +180,11 @@ unstable_go: Enables and configures JavaScript using the new WASM plugin. This core JavaScript toolchain depends on these other JavaScript ecosystem toolchains: -- Runtimes: [`unstable_bun`](#unstable_bun), [`unstable_node`](#unstable_node) -- Package managers: [`unstable_bun`](#unstable_bun), [`unstable_npm`](#unstable_npm), - [`unstable_pnpm`](#unstable_pnpm), [`unstable_yarn`](#unstable_yarn) +- Runtimes: [`unstable_bun`](#unstable_bun), [`unstable_deno`](#unstable_deno), + [`unstable_node`](#unstable_node) +- Package managers: [`unstable_bun`](#unstable_bun), [`unstable_deno`](#unstable_deno), + [`unstable_npm`](#unstable_npm), [`unstable_pnpm`](#unstable_pnpm), + [`unstable_yarn`](#unstable_yarn) ### `dedupeOnLockfileChange` @@ -254,7 +256,7 @@ unstable_javascript: Defines which package manager to utilize when installing dependencies. Supports `npm`, `pnpm`, -`yarn`, or `bun`. Defaults to no package manager. +`yarn`, `deno`, or `bun`. Defaults to no package manager. ```yaml title=".moon/toolchain.yml" {2} unstable_javascript: @@ -264,9 +266,9 @@ unstable_javascript: :::info When this setting is configured, it will require the target toolchain -([`unstable_bun`](#unstable_bun), ([`unstable_node`](#unstable_node), -[`unstable_npm`](#unstable_npm), [`unstable_pnpm`](#unstable_pnpm), or -[`unstable_yarn`](#unstable_yarn)) to also be configured. +([`unstable_bun`](#unstable_bun), [`unstable_deno`](#unstable_deno), +[`unstable_node`](#unstable_node), [`unstable_npm`](#unstable_npm), +[`unstable_pnpm`](#unstable_pnpm), or [`unstable_yarn`](#unstable_yarn)) to also be configured. ::: @@ -439,6 +441,12 @@ unstable_bun: Enables and configures [Deno](../guides/javascript/deno-handbook). +:::warning + +This toolchain has been deprecated. We suggest using [`unstable_deno`](#unstable_deno) instead! + +::: + ### `version` @@ -510,6 +518,79 @@ deno: lockfile: true ``` +## `unstable_deno` + + + +Enables and configures [Deno](../guides/javascript/deno-handbook) using the new WASM plugin. + +:::info + +This toolchain requires the [`unstable_javascript`](#unstable_javascript) toolchain to also be +enabled. + +::: + +### `version` + + + +Defines the explicit Deno toolchain +[version specification](../concepts/toolchain#version-specification) to use. If this field is _not +defined_, the global `deno` binary will be used. + +```yaml title=".moon/toolchain.yml" {2} +unstable_deno: + version: '2.0.0' +``` + +> Version can also be defined with [`.prototools`](../proto/config). + +### `bins` + + + +A list of binaries to install globally into Deno (`~/.deno/bin`). This setting requires a list of +URLs or binary configuration objects with the following fields: + +- `bin` (required) - URL of the binary. +- `name` - Provide a custom name for the binary. +- `local` - Only install the binary locally, and not in CI. +- `force` - Force install the binary. This _should_ be toggled for one-offs. + +```yaml title=".moon/toolchain.yml" {2-5} +unstable_deno: + bins: + - 'https://deno.land/std@0.192.0/http/file_server.ts' + - bin: 'https://deno.land/std@0.192.0/http/file_server.ts' + name: 'fs' +``` + +### `executeArgs` + + + +Customize the arguments that will be appended to all `deno`-based task commands. Arguments will be +appended after the `deno` executable, but before task specific arguments. + +```yaml title=".moon/toolchain.yml" {2} +unstable_deno: + executeArgs: ['--allow-read'] +``` + +### `installArgs` + + + +Customize the arguments that will be passed to the `deno install` command, when the +`InstallDependencies` action is triggered in the pipeline. These arguments are used both locally and +in CI. + +```yaml title=".moon/toolchain.yml" {2} +unstable_deno: + installArgs: ['--frozen'] +``` + ## `node` diff --git a/website/static/schemas/toolchain.json b/website/static/schemas/toolchain.json index ac63d631ed7..20946adfad7 100644 --- a/website/static/schemas/toolchain.json +++ b/website/static/schemas/toolchain.json @@ -11,6 +11,7 @@ "bun": { "title": "bun", "description": "Configures and enables the Bun platform.", + "deprecated": true, "anyOf": [ { "$ref": "#/definitions/BunConfig" @@ -23,6 +24,7 @@ "deno": { "title": "deno", "description": "Configures and enables the Deno platform.", + "deprecated": true, "anyOf": [ { "$ref": "#/definitions/DenoConfig" @@ -56,6 +58,7 @@ "node": { "title": "node", "description": "Configures and enables the Node.js platform.", + "deprecated": true, "anyOf": [ { "$ref": "#/definitions/NodeConfig" @@ -100,6 +103,7 @@ "rust": { "title": "rust", "description": "Configures and enables the Rust platform.", + "deprecated": true, "anyOf": [ { "$ref": "#/definitions/RustConfig" From 64c48fb630722220b23b09887866a9b9a24d871f Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sun, 28 Sep 2025 16:00:37 -0700 Subject: [PATCH 11/12] new: Support URI/object formats for task outputs. (#2138) * Add output type. * Update usages. * Fix tests. * Polish. * Polish. * Fix tests. * Polish. * Hook up optional. --- CHANGELOG.md | 4 + crates/app/src/commands/task.rs | 4 +- ...from_package_json__links_depends_on-2.snap | 2 +- ...ges_primary_hash_if_deps_hash_changes.snap | 8 +- ...nerates_unique_hashes_for_each_target.snap | 4 +- crates/config-schema/src/typescript_types.rs | 3 + crates/config/src/macros.rs | 120 ++++- crates/config/src/project/task_config.rs | 4 +- .../config/src/project/task_options_config.rs | 2 +- crates/config/src/shapes/input.rs | 164 ++---- crates/config/src/shapes/mod.rs | 23 +- crates/config/src/shapes/output.rs | 205 ++++++++ crates/config/src/shapes/output_path.rs | 275 ---------- crates/config/src/shapes/portable_path.rs | 13 +- crates/config/src/test_utils.rs | 49 +- crates/config/src/validate.rs | 10 +- .../tests/inherited_tasks_config_test.rs | 72 +-- crates/config/tests/input_shape_test.rs | 150 +++--- crates/config/tests/output_shape_test.rs | 479 ++++++++++++++++++ crates/config/tests/project_config_test.rs | 24 +- crates/config/tests/task_config_test.rs | 82 +-- .../project-graph/tests/project_graph_test.rs | 9 +- crates/project/src/project.rs | 6 + .../task-builder/tests/tasks_builder_test.rs | 237 +++++---- crates/task-expander/src/task_expander.rs | 25 +- crates/task-expander/src/token_expander.rs | 45 +- .../task-expander/tests/task_expander_test.rs | 46 +- .../tests/token_expander_test.rs | 75 ++- crates/task-expander/tests/utils.rs | 22 +- crates/task-hasher/src/task_hash.rs | 4 +- crates/task-hasher/src/task_hasher.rs | 3 +- crates/task-runner/src/output_archiver.rs | 10 +- crates/task-runner/src/output_hydrater.rs | 4 +- .../__fixtures__/archive/project/moon.yml | 6 + .../task-runner/tests/output_archiver_test.rs | 8 + crates/task/src/task.rs | 42 +- legacy/javascript/platform/src/infer_tasks.rs | 6 +- .../platform/tests/infer_tasks_test.rs | 6 +- packages/types/src/project.ts | 20 +- packages/types/src/tasks-config.ts | 61 ++- website/docs/config/project.mdx | 54 +- website/static/schemas/project.json | 67 ++- website/static/schemas/tasks.json | 67 ++- 43 files changed, 1636 insertions(+), 884 deletions(-) create mode 100644 crates/config/src/shapes/output.rs delete mode 100644 crates/config/src/shapes/output_path.rs create mode 100644 crates/config/tests/output_shape_test.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bc94459644..1f1a1974241 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,10 @@ - Added URI support: `group://` - Added object support: `group: ''` - This is similar to the `@files`, `@globs`, etc, token functions. +- Added URI and object support for task output types, similar to inputs. + - `file://` and `file: ''` + - `glob://` and `glob: ''` + - Added `optional` support to file outputs. - Added new values to the `runInCI` task option: - `only` - Only run the task in CI, and not locally, when affected. - `skip` - Skip running in CI but run locally and allow task relationships to be valid. diff --git a/crates/app/src/commands/task.rs b/crates/app/src/commands/task.rs index 3adebdb25de..d0e58608192 100644 --- a/crates/app/src/commands/task.rs +++ b/crates/app/src/commands/task.rs @@ -66,8 +66,8 @@ pub async fn task(session: MoonSession, args: TaskArgs) -> AppResult { inputs.sort(); let mut outputs = vec![]; - outputs.extend(&task.output_globs); - outputs.extend(&task.output_files); + outputs.extend(task.output_globs.keys().map(|i| i.to_string())); + outputs.extend(task.output_files.keys().map(|i| i.to_string())); outputs.sort(); let command = build_command(&session, &project, &task).await?; diff --git a/crates/cli/tests/snapshots/migrate_test__from_package_json__links_depends_on-2.snap b/crates/cli/tests/snapshots/migrate_test__from_package_json__links_depends_on-2.snap index ef3e911c6eb..087d7ed65c1 100644 --- a/crates/cli/tests/snapshots/migrate_test__from_package_json__links_depends_on-2.snap +++ b/crates/cli/tests/snapshots/migrate_test__from_package_json__links_depends_on-2.snap @@ -12,7 +12,7 @@ tasks: - '--out' - './lib' outputs: - - lib + - file: lib toolchain: node test: command: jest diff --git a/crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap b/crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap index 64ff9950869..36929ac9cb4 100644 --- a/crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap +++ b/crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap @@ -3,8 +3,8 @@ source: crates/cli/tests/run_test.rs expression: "[h1, h2, extract_hash_from_run(sandbox.path(), \"outputs:asDep\"),\nextract_hash_from_run(sandbox.path(), \"outputs:withDeps\")]" --- [ - "cf4262da1b9552e3c53eca0ff930a34c62550c8838346f29e8d48965d6bf044a", - "6fed013e5e2c6fc1cedf972fd41943dc7ef5248e6ca2c02a343e7688a54d08fd", - "9df65ffdf54d2abee8029148adece15ee56a26ff6dd50d03f2b55ca23ee1c382", - "76f4c64feaf413d7384add8ff9fc4d3651eaabb642c085e3df225e2d68489375", + "daed2150e7face42f11f3b3c26c31d534ce8ffc45aeb24a0b0d727bd61fca5ef", + "a6013f06309076c92ac0c42cff3e5c7e8b15f1a9d583edd17c4ae0416acc6cc9", + "719009affc99d6ce86f49125c04c6fff9bd889620dcff00f6b4b5f923134b4ec", + "26932c648f242466fc2fc5f3391e323d64c4a5e52e9a6b5626823ca3e9290d21", ] diff --git a/crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap b/crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap index 26237fe052d..9eaad0c1f5f 100644 --- a/crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap +++ b/crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap @@ -3,6 +3,6 @@ source: crates/cli/tests/run_test.rs expression: "[extract_hash_from_run(sandbox.path(), \"outputs:asDep\"),\nextract_hash_from_run(sandbox.path(), \"outputs:withDeps\")]" --- [ - "cf4262da1b9552e3c53eca0ff930a34c62550c8838346f29e8d48965d6bf044a", - "6fed013e5e2c6fc1cedf972fd41943dc7ef5248e6ca2c02a343e7688a54d08fd", + "daed2150e7face42f11f3b3c26c31d534ce8ffc45aeb24a0b0d727bd61fca5ef", + "a6013f06309076c92ac0c42cff3e5c7e8b15f1a9d583edd17c4ae0416acc6cc9", ] diff --git a/crates/config-schema/src/typescript_types.rs b/crates/config-schema/src/typescript_types.rs index 12e9aef630c..519da093727 100644 --- a/crates/config-schema/src/typescript_types.rs +++ b/crates/config-schema/src/typescript_types.rs @@ -20,7 +20,10 @@ fn generate_project(out_dir: &Path) -> miette::Result<()> { "FileInput".into(), "FileGroupInput".into(), "FileGroupInputFormat".into(), + "FileOutput".into(), + "Output".into(), "GlobInput".into(), + "GlobOutput".into(), "ProjectInput".into(), "PartialTaskArgs".into(), "PartialTaskConfig".into(), diff --git a/crates/config/src/macros.rs b/crates/config/src/macros.rs index 7112cc16f7f..3e04e11aba2 100644 --- a/crates/config/src/macros.rs +++ b/crates/config/src/macros.rs @@ -1,3 +1,31 @@ +#[macro_export] +macro_rules! config_struct { + ($impl:item) => { + #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] + #[serde(rename_all = "camelCase")] + $impl + }; +} + +#[macro_export] +macro_rules! config_enum { + ($impl:item) => { + #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] + #[serde(rename_all = "kebab-case")] + $impl + }; +} + +#[macro_export] +macro_rules! config_unit_enum { + ($impl:item) => { + $crate::config_enum!( + #[derive(Copy, Default)] + $impl + ); + }; +} + #[macro_export] macro_rules! generate_switch { ($name:ident, [ $($value:literal),* ]) => { @@ -31,30 +59,84 @@ macro_rules! generate_switch { }; } +#[doc(hidden)] #[macro_export] -macro_rules! config_struct { - ($impl:item) => { - #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] - #[serde(rename_all = "camelCase")] - $impl - }; -} +macro_rules! generate_io_file_methods { + ($name:ident) => { + impl $name { + pub fn get_path(&self) -> String { + let path = self.file.as_str(); -#[macro_export] -macro_rules! config_enum { - ($impl:item) => { - #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] - #[serde(rename_all = "kebab-case")] - $impl + if self.is_workspace_relative() { + path[1..].into() + } else { + path.into() + } + } + + pub fn is_workspace_relative(&self) -> bool { + self.file.as_str().starts_with('/') + } + + pub fn to_workspace_relative( + &self, + project_source: impl AsRef, + ) -> WorkspaceRelativePathBuf { + expand_to_workspace_relative( + if self.is_workspace_relative() { + RelativeFrom::Workspace + } else { + RelativeFrom::Project(project_source.as_ref()) + }, + self.get_path(), + ) + } + } }; } +#[doc(hidden)] #[macro_export] -macro_rules! config_unit_enum { - ($impl:item) => { - $crate::config_enum!( - #[derive(Copy, Default)] - $impl - ); +macro_rules! generate_io_glob_methods { + ($name:ident) => { + impl $name { + pub fn get_path(&self) -> String { + let path = self.glob.as_str(); + + if self.is_workspace_relative() { + if self.is_negated() { + format!("!{}", &path[2..]) + } else { + path[1..].into() + } + } else { + path.into() + } + } + + pub fn is_negated(&self) -> bool { + self.glob.as_str().starts_with('!') + } + + pub fn is_workspace_relative(&self) -> bool { + let path = self.glob.as_str(); + + path.starts_with('/') || path.starts_with("!/") + } + + pub fn to_workspace_relative( + &self, + project_source: impl AsRef, + ) -> WorkspaceRelativePathBuf { + expand_to_workspace_relative( + if self.is_workspace_relative() { + RelativeFrom::Workspace + } else { + RelativeFrom::Project(project_source.as_ref()) + }, + self.get_path(), + ) + } + } }; } diff --git a/crates/config/src/project/task_config.rs b/crates/config/src/project/task_config.rs index c776b4f8159..9838b65fe70 100644 --- a/crates/config/src/project/task_config.rs +++ b/crates/config/src/project/task_config.rs @@ -1,6 +1,6 @@ use crate::language_platform::PlatformType; use crate::project::{PartialTaskOptionsConfig, TaskOptionsConfig}; -use crate::shapes::{Input, OneOrMany, OutputPath}; +use crate::shapes::{Input, OneOrMany, Output}; use crate::{config_enum, config_struct, config_unit_enum}; use moon_common::Id; use moon_target::{Target, TargetScope}; @@ -225,7 +225,7 @@ config_struct!( /// Outputs that will be created when the task has successfully ran. /// When `cache` is enabled, the outputs will be persisted for subsequent runs. - pub outputs: Option>, + pub outputs: Option>, /// Options to control task inheritance and execution. #[setting(nested)] diff --git a/crates/config/src/project/task_options_config.rs b/crates/config/src/project/task_options_config.rs index 103791078da..92443c6247a 100644 --- a/crates/config/src/project/task_options_config.rs +++ b/crates/config/src/project/task_options_config.rs @@ -86,7 +86,7 @@ impl TaskOptionEnvFile { TaskOptionEnvFile::Files(paths) => Some( paths .iter() - .flat_map(|p| Input::parse(p.as_str()).ok()) + .flat_map(|path| Input::parse(path.as_str()).ok()) .collect(), ), } diff --git a/crates/config/src/shapes/input.rs b/crates/config/src/shapes/input.rs index cb685a34246..ef353e4038e 100644 --- a/crates/config/src/shapes/input.rs +++ b/crates/config/src/shapes/input.rs @@ -1,6 +1,8 @@ use super::portable_path::{FilePath, GlobPath, PortablePath, is_glob_like}; -use super::{Uri, is_false}; -use crate::{config_struct, config_unit_enum, patterns}; +use super::*; +use crate::{ + config_struct, config_unit_enum, generate_io_file_methods, generate_io_glob_methods, patterns, +}; use moon_common::Id; use moon_common::path::{ RelativeFrom, WorkspaceRelativePathBuf, expand_to_workspace_relative, standardize_separators, @@ -10,33 +12,17 @@ use schematic::{ schema::UnionType, }; use serde::{Deserialize, Serialize, Serializer}; -use std::fmt; use std::str::FromStr; -fn map_parse_error(error: T) -> ParseError { - ParseError::new(error.to_string()) -} - -fn default_true() -> bool { - true -} - -fn parse_bool_field(key: &str, value: &str) -> Result { - if value.is_empty() || value == "true" { - Ok(true) - } else if value == "false" { - Ok(false) - } else { - Err(ParseError::new(format!("unsupported value for `{key}`"))) - } -} - config_struct!( /// A file path input. #[derive(Config)] pub struct FileInput { + /// The literal file path. pub file: FilePath, + /// Regex pattern to match the file's contents against + /// when determining affected status. #[serde( default, alias = "match", @@ -45,11 +31,15 @@ config_struct!( )] pub content: Option, + /// Mark the file as optional instead of logging a warning + /// when hashing a task. #[serde(default, skip_serializing_if = "Option::is_none")] pub optional: Option, } ); +generate_io_file_methods!(FileInput); + impl FileInput { pub fn from_uri(uri: Uri) -> Result { let mut input = Self { @@ -68,53 +58,31 @@ impl FileInput { input.optional = Some(parse_bool_field(&key, &value)?); } _ => { - return Err(ParseError::new(format!("unknown field `{key}`"))); + return Err(ParseError::new(format!("unknown file field `{key}`"))); } }; } Ok(input) } - - pub fn get_path(&self) -> String { - let path = self.file.as_str(); - - if self.is_workspace_relative() { - path[1..].into() - } else { - path.into() - } - } - - pub fn is_workspace_relative(&self) -> bool { - self.file.as_str().starts_with('/') - } - - pub fn to_workspace_relative( - &self, - project_source: impl AsRef, - ) -> WorkspaceRelativePathBuf { - expand_to_workspace_relative( - if self.is_workspace_relative() { - RelativeFrom::Workspace - } else { - RelativeFrom::Project(project_source.as_ref()) - }, - self.get_path(), - ) - } } config_unit_enum!( - /// Format to resolve the file group into. + /// Available formats to resolve the file group into. #[derive(ConfigEnum)] pub enum FileGroupInputFormat { + /// Return the group as-is. #[default] Static, + /// Return only directories. Dirs, + /// Return only environment variables. Envs, + /// Return only files. Files, + /// Return only globs. Globs, + /// Return the lowest common root of all paths. Root, } ); @@ -123,8 +91,10 @@ config_struct!( /// A file group input. #[derive(Config)] pub struct FileGroupInput { + /// The file group identifier. pub group: Id, + /// Format to resolve the file group into. #[serde(default, alias = "as")] pub format: FileGroupInputFormat, } @@ -148,7 +118,7 @@ impl FileGroupInput { FileGroupInputFormat::from_str(&value).map_err(map_parse_error)? } _ => { - return Err(ParseError::new(format!("unknown field `{key}`"))); + return Err(ParseError::new(format!("unknown file group field `{key}`"))); } }; } @@ -158,17 +128,21 @@ impl FileGroupInput { } config_struct!( - /// A glob path input. + /// A glob pattern input. #[derive(Config)] pub struct GlobInput { + /// The glob pattern. pub glob: GlobPath, + /// Cache the glob walking result for increased performance. #[serde(default = "default_true", skip_serializing_if = "is_false")] #[setting(default = true)] pub cache: bool, } ); +generate_io_glob_methods!(GlobInput); + impl GlobInput { pub fn from_uri(uri: Uri) -> Result { let mut input = Self { @@ -182,59 +156,24 @@ impl GlobInput { input.cache = parse_bool_field(&key, &value)?; } _ => { - return Err(ParseError::new(format!("unknown field `{key}`"))); + return Err(ParseError::new(format!("unknown glob field `{key}`"))); } }; } Ok(input) } - - pub fn get_path(&self) -> String { - let path = self.glob.as_str(); - - if self.is_workspace_relative() { - if self.is_negated() { - format!("!{}", &path[2..]) - } else { - path[1..].into() - } - } else { - path.into() - } - } - - pub fn is_negated(&self) -> bool { - self.glob.as_str().starts_with('!') - } - - pub fn is_workspace_relative(&self) -> bool { - let path = self.glob.as_str(); - - path.starts_with('/') || path.starts_with("!/") - } - - pub fn to_workspace_relative( - &self, - project_source: impl AsRef, - ) -> WorkspaceRelativePathBuf { - expand_to_workspace_relative( - if self.is_workspace_relative() { - RelativeFrom::Workspace - } else { - RelativeFrom::Project(project_source.as_ref()) - }, - self.get_path(), - ) - } } config_struct!( /// A manifest file's dependencies input. #[derive(Config)] pub struct ManifestDepsInput { - pub manifest: Id, // toolchain + /// The toolchain identifier. + pub manifest: Id, + /// List of dependencies to compare against when + /// determining affected status. #[serde( default, alias = "dep", @@ -266,7 +205,7 @@ impl ManifestDepsInput { } } _ => { - return Err(ParseError::new(format!("unknown field `{key}`"))); + return Err(ParseError::new(format!("unknown manifest field `{key}`"))); } }; } @@ -280,11 +219,16 @@ config_struct!( #[derive(Config)] pub struct ProjectInput { // This is not an `Id` as we need to support `^`! + /// The external project identifier. pub project: String, + /// A list of globs, relative from the project's root, + /// in which to determine affected status. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub filter: Vec, + /// A file group identifier within the project in which + /// to determine affected status. #[serde(default, alias = "fileGroup", skip_serializing_if = "Option::is_none")] pub group: Option, } @@ -310,13 +254,13 @@ impl ProjectInput { input.filter.push(value); } } - "fileGroup" | "group" => { + "fileGroup" | "filegroup" | "group" => { if !value.is_empty() { input.group = Some(Id::new(&value).map_err(map_parse_error)?); } } _ => { - return Err(ParseError::new(format!("unknown field `{key}`"))); + return Err(ParseError::new(format!("unknown project field `{key}`"))); } }; } @@ -422,20 +366,6 @@ impl FromStr for Input { } } -impl TryFrom for Input { - type Error = ParseError; - - fn try_from(base: InputBase) -> Result { - match base { - InputBase::Raw(input) => Self::parse(input), - InputBase::File(input) => Ok(Self::File(input)), - InputBase::FileGroup(input) => Ok(Self::FileGroup(input)), - InputBase::Glob(input) => Ok(Self::Glob(input)), - InputBase::Project(input) => Ok(Self::Project(input)), - } - } -} - impl Schematic for Input { fn schema_name() -> Option { Some("Input".into()) @@ -484,3 +414,17 @@ enum InputBase { File(FileInput), Glob(GlobInput), } + +impl TryFrom for Input { + type Error = ParseError; + + fn try_from(base: InputBase) -> Result { + match base { + InputBase::Raw(input) => Self::parse(input), + InputBase::File(input) => Ok(Self::File(input)), + InputBase::FileGroup(input) => Ok(Self::FileGroup(input)), + InputBase::Glob(input) => Ok(Self::Glob(input)), + InputBase::Project(input) => Ok(Self::Project(input)), + } + } +} diff --git a/crates/config/src/shapes/mod.rs b/crates/config/src/shapes/mod.rs index b56c9a4496e..2d4c504c519 100644 --- a/crates/config/src/shapes/mod.rs +++ b/crates/config/src/shapes/mod.rs @@ -1,10 +1,10 @@ mod input; -mod output_path; +mod output; mod poly; mod portable_path; pub use input::*; -pub use output_path::*; +pub use output::*; pub use poly::*; pub use portable_path::*; @@ -29,6 +29,7 @@ impl Uri { if let Some(index) = suffix.rfind('?') && index != suffix.len() - 1 + && index != 0 { uri.path = suffix[0..index].into(); @@ -53,3 +54,21 @@ impl Uri { pub fn is_false(value: &bool) -> bool { !(*value) } + +pub(super) fn default_true() -> bool { + true +} + +pub(super) fn map_parse_error(error: T) -> ParseError { + ParseError::new(error.to_string()) +} + +pub(super) fn parse_bool_field(key: &str, value: &str) -> Result { + if value.is_empty() || value == "true" { + Ok(true) + } else if value == "false" { + Ok(false) + } else { + Err(ParseError::new(format!("unsupported value for `{key}`"))) + } +} diff --git a/crates/config/src/shapes/output.rs b/crates/config/src/shapes/output.rs new file mode 100644 index 00000000000..10fc8c6a79c --- /dev/null +++ b/crates/config/src/shapes/output.rs @@ -0,0 +1,205 @@ +use super::portable_path::{FilePath, GlobPath, PortablePath, is_glob_like}; +use super::*; +use crate::{config_struct, generate_io_file_methods, generate_io_glob_methods, patterns}; +use moon_common::path::{ + RelativeFrom, WorkspaceRelativePathBuf, expand_to_workspace_relative, standardize_separators, +}; +use schematic::{Config, ParseError, Schema, SchemaBuilder, Schematic, schema::UnionType}; +use serde::{Deserialize, Serialize, Serializer}; +use std::str::FromStr; + +config_struct!( + /// A file path output. + #[derive(Config)] + pub struct FileOutput { + /// The literal file path. + pub file: FilePath, + + /// Mark the file as optional instead of failing with + /// an error after running a task and the output doesn't exist. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub optional: Option, + } +); + +generate_io_file_methods!(FileOutput); + +impl FileOutput { + pub fn from_uri(uri: Uri) -> Result { + let mut output = Self { + file: FilePath::parse(&uri.path)?, + ..Default::default() + }; + + for (key, value) in uri.query { + match key.as_str() { + "optional" => { + output.optional = Some(parse_bool_field(&key, &value)?); + } + _ => { + return Err(ParseError::new(format!("unknown file field `{key}`"))); + } + }; + } + + Ok(output) + } +} + +config_struct!( + /// A glob pattern output. + #[derive(Config)] + pub struct GlobOutput { + /// The glob pattern. + pub glob: GlobPath, + } +); + +generate_io_glob_methods!(GlobOutput); + +impl GlobOutput { + pub fn from_uri(uri: Uri) -> Result { + let output = Self { + glob: GlobPath::parse(uri.path.replace("__QM__", "?"))?, + }; + + if let Some((key, _)) = uri.query.into_iter().next() { + return Err(ParseError::new(format!("unknown glob field `{key}`"))); + } + + Ok(output) + } +} + +/// The different patterns a task output can be defined as. +#[derive(Clone, Debug, Eq, PartialEq, Deserialize)] +#[serde(try_from = "OutputBase")] +pub enum Output { + File(FileOutput), + Glob(GlobOutput), + // Old + TokenFunc(String), + TokenVar(String), +} + +impl Output { + pub fn create_uri(value: &str) -> Result { + // Always use forward slashes + let mut value = standardize_separators(value); + + // Convert literal paths to a URI + if !value.contains("://") { + if is_glob_like(&value) { + value = format!("glob://{}", value.replace("?", "__QM__")); + } else { + value = format!("file://{value}"); + } + } + + Uri::parse(&value) + } + + pub fn parse(value: impl AsRef) -> Result { + Self::from_str(value.as_ref()) + } + + pub fn as_str(&self) -> &str { + match self { + Self::TokenFunc(value) | Self::TokenVar(value) => value, + Self::File(value) => value.file.as_str(), + Self::Glob(value) => value.glob.as_str(), + } + } + + pub fn is_glob(&self) -> bool { + matches!(self, Self::Glob(_)) + } +} + +impl FromStr for Output { + type Err = ParseError; + + fn from_str(value: &str) -> Result { + // Token function + if value.starts_with('@') && patterns::TOKEN_FUNC_DISTINCT.is_match(value) { + return Ok(Self::TokenFunc(value.to_owned())); + } + + // Token/environment variable + if value.starts_with('$') { + if patterns::ENV_VAR_DISTINCT.is_match(value) { + return Err(ParseError::new( + "environment variable is not supported by itself", + )); + } else if patterns::ENV_VAR_GLOB_DISTINCT.is_match(value) { + return Err(ParseError::new( + "environment variable globs are not supported", + )); + } else if patterns::TOKEN_VAR_DISTINCT.is_match(value) { + return Ok(Self::TokenVar(value.to_owned())); + } + } + + // URI formats + let uri = Self::create_uri(value)?; + + match uri.scheme.as_str() { + "file" => Ok(Self::File(FileOutput::from_uri(uri)?)), + "glob" => Ok(Self::Glob(GlobOutput::from_uri(uri)?)), + other => Err(ParseError::new(format!( + "output protocol `{other}://` is not supported" + ))), + } + } +} + +impl Schematic for Output { + fn schema_name() -> Option { + Some("Output".into()) + } + + fn build_schema(mut schema: SchemaBuilder) -> Schema { + schema.union(UnionType::new_any([ + schema.infer::(), + schema.infer::(), + schema.infer::(), + ])) + } +} + +impl Serialize for Output { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + Output::TokenFunc(token) | Output::TokenVar(token) => serializer.serialize_str(token), + Output::File(output) => FileOutput::serialize(output, serializer), + Output::Glob(output) => GlobOutput::serialize(output, serializer), + } + } +} + +#[derive(Deserialize)] +#[serde( + untagged, + expecting = "expected a file path, glob pattern, URI string, or object" +)] +enum OutputBase { + Raw(String), + // From most complex to least + File(FileOutput), + Glob(GlobOutput), +} + +impl TryFrom for Output { + type Error = ParseError; + + fn try_from(base: OutputBase) -> Result { + match base { + OutputBase::Raw(output) => Self::parse(output), + OutputBase::File(output) => Ok(Self::File(output)), + OutputBase::Glob(output) => Ok(Self::Glob(output)), + } + } +} diff --git a/crates/config/src/shapes/output_path.rs b/crates/config/src/shapes/output_path.rs deleted file mode 100644 index 2a3b86e59c9..00000000000 --- a/crates/config/src/shapes/output_path.rs +++ /dev/null @@ -1,275 +0,0 @@ -#![allow(clippy::from_over_into)] - -use super::portable_path::is_glob_like; -use crate::validate::validate_child_relative_path; -use crate::{config_enum, patterns}; -use moon_common::path::{ - RelativeFrom, WorkspaceRelativePathBuf, expand_to_workspace_relative, standardize_separators, -}; -use schematic::{ParseError, Schema, SchemaBuilder, Schematic}; -use std::cmp::Ordering; -use std::str::FromStr; - -config_enum!( - /// The different patterns a task output can be defined. - #[serde(untagged, into = "String", try_from = "String")] - pub enum OutputPath { - ProjectFile(String), - ProjectGlob(String), - TokenFunc(String), - TokenVar(String), - WorkspaceFile(String), - WorkspaceGlob(String), - } -); - -impl OutputPath { - pub fn as_str(&self) -> &str { - match self { - Self::ProjectFile(value) - | Self::ProjectGlob(value) - | Self::TokenFunc(value) - | Self::TokenVar(value) - | Self::WorkspaceFile(value) - | Self::WorkspaceGlob(value) => value, - } - } - - pub fn is_glob(&self) -> bool { - matches!(self, Self::ProjectGlob(_) | Self::WorkspaceGlob(_)) - } - - pub fn to_workspace_relative( - &self, - project_source: impl AsRef, - ) -> Option { - match self { - Self::ProjectFile(path) | Self::ProjectGlob(path) => Some( - expand_to_workspace_relative(RelativeFrom::Project(project_source.as_ref()), path), - ), - Self::WorkspaceFile(path) | Self::WorkspaceGlob(path) => { - Some(expand_to_workspace_relative(RelativeFrom::Workspace, path)) - } - _ => None, - } - } -} - -impl AsRef for OutputPath { - fn as_ref(&self) -> &str { - self.as_str() - } -} - -impl AsRef for OutputPath { - fn as_ref(&self) -> &OutputPath { - self - } -} - -impl PartialOrd for OutputPath { - fn partial_cmp(&self, other: &OutputPath) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for OutputPath { - fn cmp(&self, other: &Self) -> Ordering { - self.as_str().cmp(other.as_str()) - } -} - -impl FromStr for OutputPath { - type Err = ParseError; - - fn from_str(value: &str) -> Result { - // Token function - if value.starts_with('@') && patterns::TOKEN_FUNC_DISTINCT.is_match(value) { - return Ok(Self::TokenFunc(value.to_owned())); - } - - // Token/env var - if value.starts_with('$') { - if patterns::ENV_VAR_DISTINCT.is_match(value) { - return Err(ParseError::new( - "environment variable is not supported by itself", - )); - } else if patterns::ENV_VAR_GLOB_DISTINCT.is_match(value) { - return Err(ParseError::new( - "environment variable globs are not supported", - )); - } else if patterns::TOKEN_VAR_DISTINCT.is_match(value) { - return Ok(Self::TokenVar(value.to_owned())); - } - } - - let value = standardize_separators(value); - - // Workspace negated glob - if value.starts_with("/!") || value.starts_with("!/") { - return Ok(Self::WorkspaceGlob(format!("!{}", &value[2..]))); - } - - // Workspace-relative - if let Some(workspace_path) = value.strip_prefix('/') { - validate_child_relative_path(workspace_path) - .map_err(|error| ParseError::new(error.to_string()))?; - - return Ok(if is_glob_like(workspace_path) { - Self::WorkspaceGlob(workspace_path.to_owned()) - } else { - Self::WorkspaceFile(workspace_path.to_owned()) - }); - } - - // Project-relative - validate_child_relative_path(&value).map_err(|error| ParseError::new(error.to_string()))?; - - let project_path = value.trim_start_matches("./"); - - Ok(if is_glob_like(project_path) { - Self::ProjectGlob(project_path.to_owned()) - } else { - Self::ProjectFile(project_path.to_owned()) - }) - } -} - -impl TryFrom for OutputPath { - type Error = ParseError; - - fn try_from(value: String) -> Result { - Self::from_str(&value) - } -} - -impl Into for OutputPath { - fn into(self) -> String { - match self { - Self::ProjectFile(value) - | Self::ProjectGlob(value) - | Self::TokenFunc(value) - | Self::TokenVar(value) => value, - Self::WorkspaceFile(path) | Self::WorkspaceGlob(path) => format!("/{path}"), - } - } -} - -impl Schematic for OutputPath { - fn build_schema(mut schema: SchemaBuilder) -> Schema { - schema.string_default() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn parses_correctly() { - // Project relative - assert_eq!( - OutputPath::from_str("file.rs").unwrap(), - OutputPath::ProjectFile("file.rs".into()) - ); - assert_eq!( - OutputPath::from_str("dir/file.rs").unwrap(), - OutputPath::ProjectFile("dir/file.rs".into()) - ); - assert_eq!( - OutputPath::from_str("dir/**/*").unwrap(), - OutputPath::ProjectGlob("dir/**/*".into()) - ); - assert_eq!( - OutputPath::from_str("!dir/**/*").unwrap(), - OutputPath::ProjectGlob("!dir/**/*".into()) - ); - assert_eq!( - OutputPath::from_str("./file.rs").unwrap(), - OutputPath::ProjectFile("file.rs".into()) - ); - assert_eq!( - OutputPath::from_str("./dir/file.rs").unwrap(), - OutputPath::ProjectFile("dir/file.rs".into()) - ); - assert_eq!( - OutputPath::from_str("././dir/**/*").unwrap(), - OutputPath::ProjectGlob("dir/**/*".into()) - ); - - // Workspace relative - assert_eq!( - OutputPath::from_str("/file.rs").unwrap(), - OutputPath::WorkspaceFile("file.rs".into()) - ); - assert_eq!( - OutputPath::from_str("/dir/file.rs").unwrap(), - OutputPath::WorkspaceFile("dir/file.rs".into()) - ); - assert_eq!( - OutputPath::from_str("/dir/**/*").unwrap(), - OutputPath::WorkspaceGlob("dir/**/*".into()) - ); - assert_eq!( - OutputPath::from_str("!/dir/**/*").unwrap(), - OutputPath::WorkspaceGlob("!dir/**/*".into()) - ); - assert_eq!( - OutputPath::from_str("/!dir/**/*").unwrap(), - OutputPath::WorkspaceGlob("!dir/**/*".into()) - ); - } - - #[test] - fn parses_tokens() { - // Functions - assert_eq!( - OutputPath::from_str("@group(name)").unwrap(), - OutputPath::TokenFunc("@group(name)".into()) - ); - assert_eq!( - OutputPath::from_str("@dirs(name)").unwrap(), - OutputPath::TokenFunc("@dirs(name)".into()) - ); - assert_eq!( - OutputPath::from_str("@files(name)").unwrap(), - OutputPath::TokenFunc("@files(name)".into()) - ); - assert_eq!( - OutputPath::from_str("@globs(name)").unwrap(), - OutputPath::TokenFunc("@globs(name)".into()) - ); - assert_eq!( - OutputPath::from_str("@root(name)").unwrap(), - OutputPath::TokenFunc("@root(name)".into()) - ); - - // Vars - assert_eq!( - OutputPath::from_str("$workspaceRoot").unwrap(), - OutputPath::TokenVar("$workspaceRoot".into()) - ); - assert_eq!( - OutputPath::from_str("$projectType").unwrap(), - OutputPath::TokenVar("$projectType".into()) - ); - } - - #[test] - #[should_panic(expected = "environment variable globs are not supported")] - fn errors_for_env_globs() { - OutputPath::from_str("$VAR_*").unwrap(); - } - - #[test] - #[should_panic(expected = "parent directory traversal (..) is not supported")] - fn errors_for_parent_relative_from_project() { - OutputPath::from_str("../test").unwrap(); - } - - #[test] - #[should_panic(expected = "parent directory traversal (..) is not supported")] - fn errors_for_parent_relative_from_workspace() { - OutputPath::from_str("/../test").unwrap(); - } -} diff --git a/crates/config/src/shapes/portable_path.rs b/crates/config/src/shapes/portable_path.rs index 3274b01049e..c5643ee20e0 100644 --- a/crates/config/src/shapes/portable_path.rs +++ b/crates/config/src/shapes/portable_path.rs @@ -34,8 +34,7 @@ pub trait PortablePath: Sized { fn parse(path: impl AsRef) -> Result; fn parse_relative(path: impl AsRef) -> Result { - validate_relative_path(path.as_ref()) - .map_err(|error| ParseError::new(error.to_string()))?; + validate_relative_path(path.as_ref())?; Self::parse(path) } @@ -131,15 +130,13 @@ macro_rules! path_type { }; } -// Represents any file glob pattern. +// Represents any glob pattern. path_type!(GlobPath); impl PortablePath for GlobPath { fn parse(value: impl AsRef) -> Result { let mut value = value.as_ref().to_owned(); - validate_child_relative_path(&value).map_err(|error| ParseError::new(error.to_string()))?; - // Fix invalid negated workspace paths if value.starts_with("/!") { value = format!("!/{}", &value[2..]); @@ -152,18 +149,20 @@ impl PortablePath for GlobPath { value.trim_start_matches("./").to_owned() }; + validate_child_relative_path(&value)?; + Ok(GlobPath(value.into())) } } -// Represents any file system path. +// Represents any file path. path_type!(FilePath); impl PortablePath for FilePath { fn parse(value: impl AsRef) -> Result { let value = value.as_ref(); - validate_child_relative_path(value).map_err(|error| ParseError::new(error.to_string()))?; + validate_child_relative_path(value)?; if is_glob_like(value) { return Err(ParseError::new( diff --git a/crates/config/src/test_utils.rs b/crates/config/src/test_utils.rs index 6aadcc36b64..693fae9dcd8 100644 --- a/crates/config/src/test_utils.rs +++ b/crates/config/src/test_utils.rs @@ -1,29 +1,36 @@ -use crate::shapes::{FileInput, GlobInput, Uri}; +use crate::shapes::{FileInput, FileOutput, GlobInput, GlobOutput, Uri}; -pub fn create_file_input(path: impl AsRef) -> FileInput { +fn create_uri(prefix: &str, path: impl AsRef) -> Uri { + let protocol = format!("{prefix}://"); let path = path.as_ref(); - FileInput::from_uri( - Uri::parse(if path.starts_with("file://") { - path.to_owned() - } else { - format!("file://{path}") - }) - .unwrap(), - ) + Uri::parse(if path.starts_with(&protocol) { + path.to_owned() + } else { + format!( + "{protocol}{}", + if prefix == "glob" { + path.replace("?", "__QM__") + } else { + path.to_owned() + } + ) + }) .unwrap() } -pub fn create_glob_input(path: impl AsRef) -> GlobInput { - let path = path.as_ref(); +pub fn stub_file_input(path: impl AsRef) -> FileInput { + FileInput::from_uri(create_uri("file", path)).unwrap() +} - GlobInput::from_uri( - Uri::parse(if path.starts_with("glob://") { - path.to_owned() - } else { - format!("glob://{}", path.replace("?", "__QM__")) - }) - .unwrap(), - ) - .unwrap() +pub fn stub_file_output(path: impl AsRef) -> FileOutput { + FileOutput::from_uri(create_uri("file", path)).unwrap() +} + +pub fn stub_glob_input(path: impl AsRef) -> GlobInput { + GlobInput::from_uri(create_uri("glob", path)).unwrap() +} + +pub fn stub_glob_output(path: impl AsRef) -> GlobOutput { + GlobOutput::from_uri(create_uri("glob", path)).unwrap() } diff --git a/crates/config/src/validate.rs b/crates/config/src/validate.rs index 30ef9f73246..d05b1337ce6 100644 --- a/crates/config/src/validate.rs +++ b/crates/config/src/validate.rs @@ -1,4 +1,4 @@ -use schematic::ValidateError; +use schematic::ParseError; use std::path::Path; #[cfg(feature = "loader")] @@ -25,19 +25,19 @@ pub fn check_yml_extension(path: &Path) -> std::path::PathBuf { path.to_path_buf() } -pub fn validate_relative_path(value: &str) -> Result<(), ValidateError> { +pub fn validate_relative_path(value: &str) -> Result<(), ParseError> { let path = Path::new(value); if path.has_root() || path.is_absolute() { - return Err(ValidateError::new("absolute paths are not supported")); + return Err(ParseError::new("absolute paths are not supported")); } Ok(()) } -pub fn validate_child_relative_path(value: &str) -> Result<(), ValidateError> { +pub fn validate_child_relative_path(value: &str) -> Result<(), ParseError> { if value.contains("..") { - return Err(ValidateError::new( + return Err(ParseError::new( "parent directory traversal (..) is not supported", )); } diff --git a/crates/config/tests/inherited_tasks_config_test.rs b/crates/config/tests/inherited_tasks_config_test.rs index 65716812a2d..9411c355c84 100644 --- a/crates/config/tests/inherited_tasks_config_test.rs +++ b/crates/config/tests/inherited_tasks_config_test.rs @@ -84,7 +84,7 @@ tasks: Id::raw("inputs"), TaskConfig { command: TaskArgs::String("d".to_owned()), - inputs: Some(vec![Input::Glob(create_glob_input("src/**/*"))]), + inputs: Some(vec![Input::Glob(stub_glob_input("src/**/*"))]), ..TaskConfig::default() }, ), @@ -114,11 +114,11 @@ tasks: FxHashMap::from_iter([ ( Id::raw("tests"), - vec![Input::Glob(create_glob_input("tests/**/*"))] + vec![Input::Glob(stub_glob_input("tests/**/*"))] ), ( Id::raw("sources"), - vec![Input::Glob(create_glob_input("sources/**/*"))] + vec![Input::Glob(stub_glob_input("sources/**/*"))] ), ]) ); @@ -177,15 +177,15 @@ fileGroups: FxHashMap::from_iter([ ( Id::raw("tests"), - vec![Input::Glob(create_glob_input("tests/**/*"))] + vec![Input::Glob(stub_glob_input("tests/**/*"))] ), ( Id::raw("sources"), - vec![Input::Glob(create_glob_input("sources/**/*"))] + vec![Input::Glob(stub_glob_input("sources/**/*"))] ), ( Id::raw("configs"), - vec![Input::Glob(create_glob_input("/*.js"))] + vec![Input::Glob(stub_glob_input("/*.js"))] ), ]) ); @@ -229,15 +229,15 @@ fileGroups: FxHashMap::from_iter([ ( Id::raw("tests"), - vec![Input::Glob(create_glob_input("tests/**/*"))] + vec![Input::Glob(stub_glob_input("tests/**/*"))] ), ( Id::raw("sources"), - vec![Input::Glob(create_glob_input("sources/**/*"))] + vec![Input::Glob(stub_glob_input("sources/**/*"))] ), ( Id::raw("configs"), - vec![Input::Glob(create_glob_input("/*.js"))] + vec![Input::Glob(stub_glob_input("/*.js"))] ), ]) ); @@ -302,17 +302,17 @@ fileGroups: ( Id::raw("files"), vec![ - Input::File(create_file_input("/ws/relative")), - Input::File(create_file_input("proj/relative")) + Input::File(stub_file_input("/ws/relative")), + Input::File(stub_file_input("proj/relative")) ] ), ( Id::raw("globs"), vec![ - Input::Glob(create_glob_input("/ws/**/*")), - Input::Glob(create_glob_input("!/ws/**/*")), - Input::Glob(create_glob_input("proj/**/*")), - Input::Glob(create_glob_input("!proj/**/*")), + Input::Glob(stub_glob_input("/ws/**/*")), + Input::Glob(stub_glob_input("!/ws/**/*")), + Input::Glob(stub_glob_input("proj/**/*")), + Input::Glob(stub_glob_input("!proj/**/*")), ] ), ]) @@ -449,12 +449,12 @@ implicitInputs: assert_eq!( config.implicit_inputs, vec![ - Input::File(create_file_input("/ws/path")), - Input::Glob(create_glob_input("/ws/glob/**/*")), - Input::Glob(create_glob_input("!/ws/glob/**/*")), - Input::File(create_file_input("proj/path")), - Input::Glob(create_glob_input("proj/glob/{a,b,c}")), - Input::Glob(create_glob_input("!proj/glob/{a,b,c}")), + Input::File(stub_file_input("/ws/path")), + Input::Glob(stub_glob_input("/ws/glob/**/*")), + Input::Glob(stub_glob_input("!/ws/glob/**/*")), + Input::File(stub_file_input("proj/path")), + Input::Glob(stub_glob_input("proj/glob/{a,b,c}")), + Input::Glob(stub_glob_input("!proj/glob/{a,b,c}")), ] ); } @@ -475,7 +475,7 @@ implicitInputs: config.implicit_inputs, vec![ Input::EnvVar("FOO_BAR".into()), - Input::File(create_file_input("file/path")), + Input::File(stub_file_input("file/path")), ] ); } @@ -490,7 +490,7 @@ mod task_manager { if command != "global" { // No .moon prefix since the fixture is contrived - global_inputs.push(Input::File(create_file_input(format!( + global_inputs.push(Input::File(stub_file_input(format!( "/tasks/{command}.yml" )))); } @@ -1032,7 +1032,7 @@ mod task_manager { let manager = load_manager_from_root(sandbox.path(), sandbox.path()).unwrap(); let mut task = stub_task("node-library", vec![Id::raw("node"), Id::raw("javascript")]); - task.inputs = Some(vec![Input::File(create_file_input("c"))]); + task.inputs = Some(vec![Input::File(stub_file_input("c"))]); let config = manager .get_inherited_config( @@ -1058,7 +1058,7 @@ mod task_manager { "dotnet-application", vec![Id::raw("dotnet"), Id::raw("system")], ); - task.inputs = Some(vec![Input::File(create_file_input("c"))]); + task.inputs = Some(vec![Input::File(stub_file_input("c"))]); let config = manager .get_inherited_config( @@ -1139,13 +1139,13 @@ mod task_manager { file_groups: FxHashMap::from_iter([ ( Id::raw("sources"), - vec![Input::Glob(create_glob_input("src/**/*"))] + vec![Input::Glob(stub_glob_input("src/**/*"))] ), ( Id::raw("tests"), vec![ - Input::Glob(create_glob_input("*.test.ts")), - Input::Glob(create_glob_input("*.test.tsx")) + Input::Glob(stub_glob_input("*.test.ts")), + Input::Glob(stub_glob_input("*.test.tsx")) ] ), ]), @@ -1167,10 +1167,10 @@ mod task_manager { implicit_inputs: vec![ Input::EnvVar("ENV".into()), Input::EnvVarGlob("ENV_*".into()), - Input::File(create_file_input("file.txt")), - Input::Glob(create_glob_input("file.*")), - Input::File(create_file_input("/file.txt")), - Input::Glob(create_glob_input("/file.*")), + Input::File(stub_file_input("file.txt")), + Input::Glob(stub_glob_input("file.*")), + Input::File(stub_file_input("/file.txt")), + Input::Glob(stub_glob_input("/file.*")), ], task_options: Some(TaskOptionsConfig { affected_files: Some(TaskOptionAffectedFiles::Args), @@ -1270,8 +1270,8 @@ mod task_manager { Id::raw("lint"), TaskConfig { inputs: Some(vec![ - Input::Glob(create_glob_input("**/*.graphql")), - Input::Glob(create_glob_input("src/**/*")), + Input::Glob(stub_glob_input("**/*.graphql")), + Input::Glob(stub_glob_input("src/**/*")), ]), ..Default::default() } @@ -1280,8 +1280,8 @@ mod task_manager { Id::raw("test"), TaskConfig { inputs: Some(vec![ - Input::Glob(create_glob_input("src/**/*")), - Input::Glob(create_glob_input("tests/**/*")), + Input::Glob(stub_glob_input("src/**/*")), + Input::Glob(stub_glob_input("tests/**/*")), ]), ..Default::default() } diff --git a/crates/config/tests/input_shape_test.rs b/crates/config/tests/input_shape_test.rs index 2c5574a5904..789c7b5ad91 100644 --- a/crates/config/tests/input_shape_test.rs +++ b/crates/config/tests/input_shape_test.rs @@ -15,7 +15,7 @@ mod input_shape { fn converts_backward_slashes() { assert_eq!( Input::parse("some\\file.txt").unwrap(), - Input::File(create_file_input("some/file.txt")) + Input::File(stub_file_input("some/file.txt")) ); } @@ -74,7 +74,7 @@ mod input_shape { #[test] fn file_protocol() { - let mut input = create_file_input("file.txt"); + let mut input = stub_file_input("file.txt"); input.optional = Some(true); assert_eq!( @@ -82,7 +82,7 @@ mod input_shape { Input::File(input) ); - let mut input = create_file_input("/file.txt"); + let mut input = stub_file_input("/file.txt"); input.optional = Some(false); assert_eq!( @@ -95,19 +95,19 @@ mod input_shape { fn file_project_relative() { assert_eq!( Input::parse("file.rs").unwrap(), - Input::File(create_file_input("file.rs")) + Input::File(stub_file_input("file.rs")) ); assert_eq!( Input::parse("dir/file.rs").unwrap(), - Input::File(create_file_input("dir/file.rs")) + Input::File(stub_file_input("dir/file.rs")) ); assert_eq!( Input::parse("./file.rs").unwrap(), - Input::File(create_file_input("file.rs")) + Input::File(stub_file_input("file.rs")) ); assert_eq!( Input::parse("././dir/file.rs").unwrap(), - Input::File(create_file_input("dir/file.rs")) + Input::File(stub_file_input("dir/file.rs")) ); } @@ -115,19 +115,19 @@ mod input_shape { fn file_project_relative_protocol() { assert_eq!( Input::parse("file://file.rs").unwrap(), - Input::File(create_file_input("file.rs")) + Input::File(stub_file_input("file.rs")) ); assert_eq!( Input::parse("file://dir/file.rs").unwrap(), - Input::File(create_file_input("dir/file.rs")) + Input::File(stub_file_input("dir/file.rs")) ); assert_eq!( Input::parse("file://./file.rs").unwrap(), - Input::File(create_file_input("file.rs")) + Input::File(stub_file_input("file.rs")) ); assert_eq!( Input::parse("file://././dir/file.rs").unwrap(), - Input::File(create_file_input("dir/file.rs")) + Input::File(stub_file_input("dir/file.rs")) ); } @@ -135,17 +135,17 @@ mod input_shape { fn file_workspace_relative() { assert_eq!( Input::parse("/file.rs").unwrap(), - Input::File(create_file_input("/file.rs")) + Input::File(stub_file_input("/file.rs")) ); assert_eq!( Input::parse("/dir/file.rs").unwrap(), - Input::File(create_file_input("/dir/file.rs")) + Input::File(stub_file_input("/dir/file.rs")) ); // With tokens assert_eq!( Input::parse("/.cache/$projectSource").unwrap(), - Input::File(create_file_input("/.cache/$projectSource")) + Input::File(stub_file_input("/.cache/$projectSource")) ); } @@ -153,23 +153,23 @@ mod input_shape { fn file_workspace_relative_protocol() { assert_eq!( Input::parse("file:///file.rs").unwrap(), - Input::File(create_file_input("/file.rs")) + Input::File(stub_file_input("/file.rs")) ); assert_eq!( Input::parse("file:///dir/file.rs").unwrap(), - Input::File(create_file_input("/dir/file.rs")) + Input::File(stub_file_input("/dir/file.rs")) ); // With tokens assert_eq!( Input::parse("file:///.cache/$projectSource").unwrap(), - Input::File(create_file_input("/.cache/$projectSource")) + Input::File(stub_file_input("/.cache/$projectSource")) ); } #[test] fn glob_protocol() { - let mut input = create_glob_input("file.*"); + let mut input = stub_glob_input("file.*"); input.cache = true; assert_eq!( @@ -177,7 +177,7 @@ mod input_shape { Input::Glob(input) ); - let mut input = create_glob_input("/file.*"); + let mut input = stub_glob_input("/file.*"); input.cache = false; assert_eq!( @@ -200,7 +200,7 @@ mod input_shape { "a/", "file.tsx?", ] { - let mut input = create_glob_input(pat); + let mut input = stub_glob_input(pat); input.cache = true; assert_eq!( @@ -211,7 +211,7 @@ mod input_shape { Input::Glob(input) ); - let mut input = create_glob_input(pat); + let mut input = stub_glob_input(pat); input.cache = false; assert_eq!( @@ -228,21 +228,21 @@ mod input_shape { fn glob_project_relative() { assert_eq!( Input::parse("!file.*").unwrap(), - Input::Glob(create_glob_input("!file.*")) + Input::Glob(stub_glob_input("!file.*")) ); assert_eq!( Input::parse("dir/**/*").unwrap(), - Input::Glob(create_glob_input("dir/**/*")) + Input::Glob(stub_glob_input("dir/**/*")) ); assert_eq!( Input::parse("./dir/**/*").unwrap(), - Input::Glob(create_glob_input("dir/**/*")) + Input::Glob(stub_glob_input("dir/**/*")) ); // With tokens assert_eq!( Input::parse("$projectSource/**/*").unwrap(), - Input::Glob(create_glob_input("$projectSource/**/*")) + Input::Glob(stub_glob_input("$projectSource/**/*")) ); } @@ -250,21 +250,21 @@ mod input_shape { fn glob_project_relative_protocol() { assert_eq!( Input::parse("glob://!file.*").unwrap(), - Input::Glob(create_glob_input("!file.*")) + Input::Glob(stub_glob_input("!file.*")) ); assert_eq!( Input::parse("glob://dir/**/*").unwrap(), - Input::Glob(create_glob_input("dir/**/*")) + Input::Glob(stub_glob_input("dir/**/*")) ); assert_eq!( Input::parse("glob://./dir/**/*").unwrap(), - Input::Glob(create_glob_input("dir/**/*")) + Input::Glob(stub_glob_input("dir/**/*")) ); // With tokens assert_eq!( Input::parse("glob://$projectSource/**/*").unwrap(), - Input::Glob(create_glob_input("$projectSource/**/*")) + Input::Glob(stub_glob_input("$projectSource/**/*")) ); } @@ -272,15 +272,15 @@ mod input_shape { fn glob_workspace_relative() { assert_eq!( Input::parse("/!file.*").unwrap(), - Input::Glob(create_glob_input("!/file.*")) + Input::Glob(stub_glob_input("!/file.*")) ); assert_eq!( Input::parse("!/file.*").unwrap(), - Input::Glob(create_glob_input("!/file.*")) + Input::Glob(stub_glob_input("!/file.*")) ); assert_eq!( Input::parse("/dir/**/*").unwrap(), - Input::Glob(create_glob_input("/dir/**/*")) + Input::Glob(stub_glob_input("/dir/**/*")) ); } @@ -288,15 +288,15 @@ mod input_shape { fn glob_workspace_relative_protocol() { assert_eq!( Input::parse("glob:///!file.*").unwrap(), - Input::Glob(create_glob_input("!/file.*")) + Input::Glob(stub_glob_input("!/file.*")) ); assert_eq!( Input::parse("glob://!/file.*").unwrap(), - Input::Glob(create_glob_input("!/file.*")) + Input::Glob(stub_glob_input("!/file.*")) ); assert_eq!( Input::parse("glob:///dir/**/*").unwrap(), - Input::Glob(create_glob_input("/dir/**/*")) + Input::Glob(stub_glob_input("/dir/**/*")) ); } @@ -405,11 +405,11 @@ mod input_shape { fn files() { let input: Input = serde_json::from_str(r#""file.txt""#).unwrap(); - assert_eq!(input, Input::File(create_file_input("file.txt"))); + assert_eq!(input, Input::File(stub_file_input("file.txt"))); let input: Input = serde_json::from_str(r#"{ "file": "file.txt" }"#).unwrap(); - assert_eq!(input, Input::File(create_file_input("file.txt"))); + assert_eq!(input, Input::File(stub_file_input("file.txt"))); let input: Input = serde_json::from_str(r#"{ "file": "dir/file.txt", "optional": true }"#).unwrap(); @@ -417,7 +417,7 @@ mod input_shape { assert_eq!( input, Input::File({ - let mut inner = create_file_input("dir/file.txt"); + let mut inner = stub_file_input("dir/file.txt"); inner.optional = Some(true); inner }) @@ -431,7 +431,7 @@ mod input_shape { assert_eq!( input, Input::File({ - let mut inner = create_file_input("/root/file.txt"); + let mut inner = stub_file_input("/root/file.txt"); inner.optional = Some(true); inner.content = Some(RegexSetting::new("a|b|c").unwrap()); inner @@ -443,11 +443,11 @@ mod input_shape { fn globs() { let input: Input = serde_json::from_str(r#""file.*""#).unwrap(); - assert_eq!(input, Input::Glob(create_glob_input("file.*"))); + assert_eq!(input, Input::Glob(stub_glob_input("file.*"))); let input: Input = serde_json::from_str(r#"{ "glob": "file.*" }"#).unwrap(); - assert_eq!(input, Input::Glob(create_glob_input("file.*"))); + assert_eq!(input, Input::Glob(stub_glob_input("file.*"))); let input: Input = serde_json::from_str(r#"{ "glob": "/dir/file.*", "cache": false }"#).unwrap(); @@ -455,7 +455,7 @@ mod input_shape { assert_eq!( input, Input::Glob({ - let mut inner = create_glob_input("/dir/file.*"); + let mut inner = stub_glob_input("/dir/file.*"); inner.cache = false; inner }) @@ -582,13 +582,13 @@ mod input_shape { #[test] fn project_relative() { - let input = create_file_input("project/file.txt"); + let input = stub_file_input("project/file.txt"); assert_eq!(input.file, "project/file.txt"); assert_eq!(input.get_path(), "project/file.txt"); assert!(!input.is_workspace_relative()); - let input = create_file_input("./project/file.txt"); + let input = stub_file_input("./project/file.txt"); assert_eq!(input.file, "project/file.txt"); assert_eq!(input.get_path(), "project/file.txt"); @@ -597,7 +597,7 @@ mod input_shape { #[test] fn workspace_relative() { - let input = create_file_input("/root/file.txt"); + let input = stub_file_input("/root/file.txt"); assert_eq!(input.file, "/root/file.txt"); assert_eq!(input.get_path(), "root/file.txt"); @@ -606,30 +606,30 @@ mod input_shape { #[test] fn supports_matches_field() { - let input = create_file_input("file.txt?matches=abc"); + let input = stub_file_input("file.txt?matches=abc"); assert_eq!(input.content.unwrap().as_str(), "abc"); - let input = create_file_input("file.txt?match=abc"); + let input = stub_file_input("file.txt?match=abc"); assert_eq!(input.content.unwrap().as_str(), "abc"); - let input = create_file_input("file.txt?matches"); + let input = stub_file_input("file.txt?matches"); assert!(input.content.is_none()); } #[test] fn supports_optional_field() { - let input = create_file_input("file.txt?optional"); + let input = stub_file_input("file.txt?optional"); assert!(input.optional.unwrap()); - let input = create_file_input("file.txt?optional=true"); + let input = stub_file_input("file.txt?optional=true"); assert!(input.optional.unwrap()); - let input = create_file_input("file.txt?optional=false"); + let input = stub_file_input("file.txt?optional=false"); assert!(!input.optional.unwrap()); } @@ -637,19 +637,19 @@ mod input_shape { #[test] #[should_panic(expected = "globs are not supported")] fn errors_for_glob() { - create_file_input("file.*"); + stub_file_input("file.*"); } #[test] #[should_panic(expected = "unsupported value for `optional`")] fn errors_invalid_optional_field() { - create_file_input("file.txt?optional=invalid"); + stub_file_input("file.txt?optional=invalid"); } #[test] - #[should_panic(expected = "unknown field `unknown`")] + #[should_panic(expected = "unknown file field `unknown`")] fn errors_unknown_field() { - create_file_input("file.txt?unknown"); + stub_file_input("file.txt?unknown"); } } @@ -696,7 +696,7 @@ mod input_shape { } #[test] - #[should_panic(expected = "unknown field `unknown`")] + #[should_panic(expected = "unknown file group field `unknown`")] fn errors_unknown_field() { FileGroupInput::from_uri(Uri::parse("group://id?unknown").unwrap()).unwrap(); } @@ -707,21 +707,21 @@ mod input_shape { #[test] fn default_cache_enabled() { - let input = create_glob_input("file.*"); + let input = stub_glob_input("file.*"); assert!(input.cache); } #[test] fn project_relative() { - let input = create_glob_input("project/file.*"); + let input = stub_glob_input("project/file.*"); assert_eq!(input.glob, "project/file.*"); assert_eq!(input.get_path(), "project/file.*"); assert!(!input.is_workspace_relative()); assert!(!input.is_negated()); - let input = create_glob_input("./project/file.*"); + let input = stub_glob_input("./project/file.*"); assert_eq!(input.glob, "project/file.*"); assert_eq!(input.get_path(), "project/file.*"); @@ -731,21 +731,21 @@ mod input_shape { #[test] fn project_relative_negated() { - let input = create_glob_input("!project/file.*"); + let input = stub_glob_input("!project/file.*"); assert_eq!(input.glob, "!project/file.*"); assert_eq!(input.get_path(), "!project/file.*"); assert!(!input.is_workspace_relative()); assert!(input.is_negated()); - let input = create_glob_input("!./project/file.*"); + let input = stub_glob_input("!./project/file.*"); assert_eq!(input.glob, "!project/file.*"); assert_eq!(input.get_path(), "!project/file.*"); assert!(!input.is_workspace_relative()); assert!(input.is_negated()); - let input = create_glob_input("./!project/file.*"); + let input = stub_glob_input("./!project/file.*"); assert_eq!(input.glob, "!project/file.*"); assert_eq!(input.get_path(), "!project/file.*"); @@ -755,7 +755,7 @@ mod input_shape { #[test] fn workspace_relative() { - let input = create_glob_input("/root/file.*"); + let input = stub_glob_input("/root/file.*"); assert_eq!(input.glob, "/root/file.*"); assert_eq!(input.get_path(), "root/file.*"); @@ -765,14 +765,14 @@ mod input_shape { #[test] fn workspace_relative_negated() { - let input = create_glob_input("!/root/file.*"); + let input = stub_glob_input("!/root/file.*"); assert_eq!(input.glob, "!/root/file.*"); assert_eq!(input.get_path(), "!root/file.*"); assert!(input.is_workspace_relative()); assert!(input.is_negated()); - let input = create_glob_input("/!root/file.*"); + let input = stub_glob_input("/!root/file.*"); assert_eq!(input.glob, "!/root/file.*"); assert_eq!(input.get_path(), "!root/file.*"); @@ -781,16 +781,16 @@ mod input_shape { } #[test] - fn supports_optional_field() { - let input = create_glob_input("glob://file.*?cache"); + fn supports_cache_field() { + let input = stub_glob_input("glob://file.*?cache"); assert!(input.cache); - let input = create_glob_input("glob://file.*?cache=true"); + let input = stub_glob_input("glob://file.*?cache=true"); assert!(input.cache); - let input = create_glob_input("glob://file.*?cache=false"); + let input = stub_glob_input("glob://file.*?cache=false"); assert!(!input.cache); } @@ -798,13 +798,13 @@ mod input_shape { #[test] #[should_panic(expected = "unsupported value for `cache`")] fn errors_invalid_cache_field() { - create_glob_input("glob://file.*?cache=invalid"); + stub_glob_input("glob://file.*?cache=invalid"); } #[test] - #[should_panic(expected = "unknown field `unknown`")] + #[should_panic(expected = "unknown glob field `unknown`")] fn errors_unknown_field() { - create_glob_input("glob://file.*?unknown"); + stub_glob_input("glob://file.*?unknown"); } } @@ -866,13 +866,13 @@ mod input_shape { } #[test] - #[should_panic(expected = "unknown field `unknown`")] + #[should_panic(expected = "unknown manifest field `unknown`")] fn errors_unknown_field() { ManifestDepsInput::from_uri(Uri::parse("manifest://id?unknown").unwrap()).unwrap(); } } - mod project_srcs { + mod external_project { use super::*; #[test] @@ -928,7 +928,7 @@ mod input_shape { } #[test] - #[should_panic(expected = "unknown field `unknown`")] + #[should_panic(expected = "unknown project field `unknown`")] fn errors_unknown_field() { ProjectInput::from_uri(Uri::parse("project://id?unknown").unwrap()).unwrap(); } diff --git a/crates/config/tests/output_shape_test.rs b/crates/config/tests/output_shape_test.rs new file mode 100644 index 00000000000..56ff0e49ada --- /dev/null +++ b/crates/config/tests/output_shape_test.rs @@ -0,0 +1,479 @@ +use moon_config::{GlobOutput, GlobPath, Output, test_utils::*}; + +mod output_shape { + use super::*; + + mod parse_string { + use super::*; + + #[test] + fn converts_backward_slashes() { + assert_eq!( + Output::parse("some\\file.txt").unwrap(), + Output::File(stub_file_output("some/file.txt")) + ); + } + + #[test] + fn token_funcs() { + assert_eq!( + Output::parse("@group(name)").unwrap(), + Output::TokenFunc("@group(name)".into()) + ); + assert_eq!( + Output::parse("@dirs(name)").unwrap(), + Output::TokenFunc("@dirs(name)".into()) + ); + assert_eq!( + Output::parse("@files(name)").unwrap(), + Output::TokenFunc("@files(name)".into()) + ); + assert_eq!( + Output::parse("@globs(name)").unwrap(), + Output::TokenFunc("@globs(name)".into()) + ); + assert_eq!( + Output::parse("@root(name)").unwrap(), + Output::TokenFunc("@root(name)".into()) + ); + } + + #[test] + fn token_vars() { + assert_eq!( + Output::parse("$workspaceRoot").unwrap(), + Output::TokenVar("$workspaceRoot".into()) + ); + assert_eq!( + Output::parse("$projectType").unwrap(), + Output::TokenVar("$projectType".into()) + ); + } + + #[test] + fn file_protocol() { + let mut output = stub_file_output("file.txt"); + output.optional = Some(true); + + assert_eq!( + Output::parse("file://file.txt?optional").unwrap(), + Output::File(output) + ); + + let mut output = stub_file_output("/file.txt"); + output.optional = Some(false); + + assert_eq!( + Output::parse("file:///file.txt?optional=false").unwrap(), + Output::File(output) + ); + } + + #[test] + fn file_project_relative() { + assert_eq!( + Output::parse("file.rs").unwrap(), + Output::File(stub_file_output("file.rs")) + ); + assert_eq!( + Output::parse("dir/file.rs").unwrap(), + Output::File(stub_file_output("dir/file.rs")) + ); + assert_eq!( + Output::parse("./file.rs").unwrap(), + Output::File(stub_file_output("file.rs")) + ); + assert_eq!( + Output::parse("././dir/file.rs").unwrap(), + Output::File(stub_file_output("dir/file.rs")) + ); + } + + #[test] + fn file_project_relative_protocol() { + assert_eq!( + Output::parse("file://file.rs").unwrap(), + Output::File(stub_file_output("file.rs")) + ); + assert_eq!( + Output::parse("file://dir/file.rs").unwrap(), + Output::File(stub_file_output("dir/file.rs")) + ); + assert_eq!( + Output::parse("file://./file.rs").unwrap(), + Output::File(stub_file_output("file.rs")) + ); + assert_eq!( + Output::parse("file://././dir/file.rs").unwrap(), + Output::File(stub_file_output("dir/file.rs")) + ); + } + + #[test] + fn file_workspace_relative() { + assert_eq!( + Output::parse("/file.rs").unwrap(), + Output::File(stub_file_output("/file.rs")) + ); + assert_eq!( + Output::parse("/dir/file.rs").unwrap(), + Output::File(stub_file_output("/dir/file.rs")) + ); + + // With tokens + assert_eq!( + Output::parse("/.cache/$projectSource").unwrap(), + Output::File(stub_file_output("/.cache/$projectSource")) + ); + } + + #[test] + fn file_workspace_relative_protocol() { + assert_eq!( + Output::parse("file:///file.rs").unwrap(), + Output::File(stub_file_output("/file.rs")) + ); + assert_eq!( + Output::parse("file:///dir/file.rs").unwrap(), + Output::File(stub_file_output("/dir/file.rs")) + ); + + // With tokens + assert_eq!( + Output::parse("file:///.cache/$projectSource").unwrap(), + Output::File(stub_file_output("/.cache/$projectSource")) + ); + } + + #[test] + fn glob_protocol() { + assert_eq!( + Output::parse("glob://file.*").unwrap(), + Output::Glob(stub_glob_output("file.*")) + ); + + assert_eq!( + Output::parse("glob:///file.*").unwrap(), + Output::Glob(stub_glob_output("/file.*")) + ); + } + + #[test] + fn glob_protocol_supports_all_syntax() { + for pat in [ + "*.png", + "ba(r|z).txt", + "**/{*.{go,rs}}", + "**/*.{md,txt}", + "pkg/**/PKGBUILD", + "dir/{a?c,x?z,foo}", + "lib/[qa-cX-Z]/*", + "(?-i)photos/**/*.(?i){jpg,jpeg}", + "a/", + "file.tsx?", + ] { + assert_eq!( + Output::Glob(GlobOutput { + glob: GlobPath(pat.into()), + }), + Output::Glob(stub_glob_output(pat)) + ); + } + } + + #[test] + fn glob_project_relative() { + assert_eq!( + Output::parse("!file.*").unwrap(), + Output::Glob(stub_glob_output("!file.*")) + ); + assert_eq!( + Output::parse("dir/**/*").unwrap(), + Output::Glob(stub_glob_output("dir/**/*")) + ); + assert_eq!( + Output::parse("./dir/**/*").unwrap(), + Output::Glob(stub_glob_output("dir/**/*")) + ); + + // With tokens + assert_eq!( + Output::parse("$projectSource/**/*").unwrap(), + Output::Glob(stub_glob_output("$projectSource/**/*")) + ); + } + + #[test] + fn glob_project_relative_protocol() { + assert_eq!( + Output::parse("glob://!file.*").unwrap(), + Output::Glob(stub_glob_output("!file.*")) + ); + assert_eq!( + Output::parse("glob://dir/**/*").unwrap(), + Output::Glob(stub_glob_output("dir/**/*")) + ); + assert_eq!( + Output::parse("glob://./dir/**/*").unwrap(), + Output::Glob(stub_glob_output("dir/**/*")) + ); + + // With tokens + assert_eq!( + Output::parse("glob://$projectSource/**/*").unwrap(), + Output::Glob(stub_glob_output("$projectSource/**/*")) + ); + } + + #[test] + fn glob_workspace_relative() { + assert_eq!( + Output::parse("/!file.*").unwrap(), + Output::Glob(stub_glob_output("!/file.*")) + ); + assert_eq!( + Output::parse("!/file.*").unwrap(), + Output::Glob(stub_glob_output("!/file.*")) + ); + assert_eq!( + Output::parse("/dir/**/*").unwrap(), + Output::Glob(stub_glob_output("/dir/**/*")) + ); + } + + #[test] + fn glob_workspace_relative_protocol() { + assert_eq!( + Output::parse("glob:///!file.*").unwrap(), + Output::Glob(stub_glob_output("!/file.*")) + ); + assert_eq!( + Output::parse("glob://!/file.*").unwrap(), + Output::Glob(stub_glob_output("!/file.*")) + ); + assert_eq!( + Output::parse("glob:///dir/**/*").unwrap(), + Output::Glob(stub_glob_output("/dir/**/*")) + ); + } + + #[test] + #[should_panic(expected = "environment variable globs are not supported")] + fn errors_for_env_globs() { + Output::parse("$VAR_*").unwrap(); + } + + #[test] + #[should_panic(expected = "output protocol `unknown://` is not supported")] + fn errors_for_unknown_protocol() { + Output::parse("unknown://test").unwrap(); + } + + #[test] + #[should_panic(expected = "parent directory traversal (..) is not supported")] + fn errors_for_parent_traversal() { + Output::parse("../../file.txt").unwrap(); + } + + #[test] + #[should_panic(expected = "parent directory traversal (..) is not supported")] + fn errors_for_parent_traversal_inner() { + Output::parse("dir/../../file.txt").unwrap(); + } + } + + mod parse_object { + use super::*; + + #[test] + fn files() { + let output: Output = serde_json::from_str(r#""file.txt""#).unwrap(); + + assert_eq!(output, Output::File(stub_file_output("file.txt"))); + + let output: Output = serde_json::from_str(r#"{ "file": "file.txt" }"#).unwrap(); + + assert_eq!(output, Output::File(stub_file_output("file.txt"))); + + let output: Output = + serde_json::from_str(r#"{ "file": "dir/file.txt", "optional": true }"#).unwrap(); + + assert_eq!( + output, + Output::File({ + let mut inner = stub_file_output("dir/file.txt"); + inner.optional = Some(true); + inner + }) + ); + } + + #[test] + fn globs() { + let output: Output = serde_json::from_str(r#""file.*""#).unwrap(); + + assert_eq!(output, Output::Glob(stub_glob_output("file.*"))); + + let output: Output = serde_json::from_str(r#"{ "glob": "file.*" }"#).unwrap(); + + assert_eq!(output, Output::Glob(stub_glob_output("file.*"))); + } + + #[test] + #[should_panic] // Swallowed by enum expecting message + fn errors_for_parent_traversal() { + let _: Output = serde_json::from_str(r#"{ "glob": "../../file.*" }"#).unwrap(); + } + + #[test] + #[should_panic] // Swallowed by enum expecting message + fn errors_for_parent_traversal_inner() { + let _: Output = serde_json::from_str(r#"{ "glob": "dir/../../file.*" }"#).unwrap(); + } + } + + mod file { + use super::*; + + #[test] + fn project_relative() { + let output = stub_file_output("project/file.txt"); + + assert_eq!(output.file, "project/file.txt"); + assert_eq!(output.get_path(), "project/file.txt"); + assert!(!output.is_workspace_relative()); + + let output = stub_file_output("./project/file.txt"); + + assert_eq!(output.file, "project/file.txt"); + assert_eq!(output.get_path(), "project/file.txt"); + assert!(!output.is_workspace_relative()); + } + + #[test] + fn workspace_relative() { + let output = stub_file_output("/root/file.txt"); + + assert_eq!(output.file, "/root/file.txt"); + assert_eq!(output.get_path(), "root/file.txt"); + assert!(output.is_workspace_relative()); + } + + #[test] + fn supports_optional_field() { + let output = stub_file_output("file.txt?optional"); + + assert!(output.optional.unwrap()); + + let output = stub_file_output("file.txt?optional=true"); + + assert!(output.optional.unwrap()); + + let output = stub_file_output("file.txt?optional=false"); + + assert!(!output.optional.unwrap()); + } + + #[test] + #[should_panic(expected = "globs are not supported")] + fn errors_for_glob() { + stub_file_output("file.*"); + } + + #[test] + #[should_panic(expected = "unsupported value for `optional`")] + fn errors_invalid_optional_field() { + stub_file_output("file.txt?optional=invalid"); + } + + #[test] + #[should_panic(expected = "unknown file field `unknown`")] + fn errors_unknown_field() { + stub_file_output("file.txt?unknown"); + } + } + + mod glob { + use super::*; + + #[test] + fn project_relative() { + let output = stub_glob_output("project/file.*"); + + assert_eq!(output.glob, "project/file.*"); + assert_eq!(output.get_path(), "project/file.*"); + assert!(!output.is_workspace_relative()); + assert!(!output.is_negated()); + + let output = stub_glob_output("./project/file.*"); + + assert_eq!(output.glob, "project/file.*"); + assert_eq!(output.get_path(), "project/file.*"); + assert!(!output.is_workspace_relative()); + assert!(!output.is_negated()); + } + + #[test] + fn project_relative_negated() { + let output = stub_glob_output("!project/file.*"); + + assert_eq!(output.glob, "!project/file.*"); + assert_eq!(output.get_path(), "!project/file.*"); + assert!(!output.is_workspace_relative()); + assert!(output.is_negated()); + + let output = stub_glob_output("!./project/file.*"); + + assert_eq!(output.glob, "!project/file.*"); + assert_eq!(output.get_path(), "!project/file.*"); + assert!(!output.is_workspace_relative()); + assert!(output.is_negated()); + + let output = stub_glob_output("./!project/file.*"); + + assert_eq!(output.glob, "!project/file.*"); + assert_eq!(output.get_path(), "!project/file.*"); + assert!(!output.is_workspace_relative()); + assert!(output.is_negated()); + } + + #[test] + fn workspace_relative() { + let output = stub_glob_output("/root/file.*"); + + assert_eq!(output.glob, "/root/file.*"); + assert_eq!(output.get_path(), "root/file.*"); + assert!(output.is_workspace_relative()); + assert!(!output.is_negated()); + } + + #[test] + fn workspace_relative_negated() { + let output = stub_glob_output("!/root/file.*"); + + assert_eq!(output.glob, "!/root/file.*"); + assert_eq!(output.get_path(), "!root/file.*"); + assert!(output.is_workspace_relative()); + assert!(output.is_negated()); + + let output = stub_glob_output("/!root/file.*"); + + assert_eq!(output.glob, "!/root/file.*"); + assert_eq!(output.get_path(), "!root/file.*"); + assert!(output.is_workspace_relative()); + assert!(output.is_negated()); + } + + #[test] + #[should_panic(expected = "unknown glob field `cache`")] + fn errors_invalid_cache_field() { + stub_glob_output("glob://file.*?cache=invalid"); + } + + #[test] + #[should_panic(expected = "unknown glob field `unknown`")] + fn errors_unknown_field() { + stub_glob_output("glob://file.*?unknown"); + } + } +} diff --git a/crates/config/tests/project_config_test.rs b/crates/config/tests/project_config_test.rs index 6ae48caa6b9..9f6cd65fbd6 100644 --- a/crates/config/tests/project_config_test.rs +++ b/crates/config/tests/project_config_test.rs @@ -62,7 +62,7 @@ tasks: assert_eq!(build.args, TaskArgs::None); assert_eq!( build.inputs, - Some(vec![Input::Glob(create_glob_input("src/**/*"))]) + Some(vec![Input::Glob(stub_glob_input("src/**/*"))]) ); let start = config.tasks.get("start").unwrap(); @@ -71,7 +71,7 @@ tasks: assert_eq!(start.args, TaskArgs::String("serve".to_owned())); assert_eq!( start.inputs, - Some(vec![Input::Glob(create_glob_input("src/**/*"))]) + Some(vec![Input::Glob(stub_glob_input("src/**/*"))]) ); } @@ -102,7 +102,7 @@ tasks: assert_eq!(build.args, TaskArgs::None); assert_eq!( build.inputs, - Some(vec![Input::Glob(create_glob_input("src/**/*"))]) + Some(vec![Input::Glob(stub_glob_input("src/**/*"))]) ); let start = config.tasks.get("start").unwrap(); @@ -111,7 +111,7 @@ tasks: assert_eq!(start.args, TaskArgs::String("serve".to_owned())); assert_eq!( start.inputs, - Some(vec![Input::Glob(create_glob_input("src/**/*"))]) + Some(vec![Input::Glob(stub_glob_input("src/**/*"))]) ); } @@ -231,17 +231,17 @@ fileGroups: ( Id::raw("files"), vec![ - Input::File(create_file_input("/ws/relative")), - Input::File(create_file_input("proj/relative")) + Input::File(stub_file_input("/ws/relative")), + Input::File(stub_file_input("proj/relative")) ] ), ( Id::raw("globs"), vec![ - Input::Glob(create_glob_input("/ws/**/*")), - Input::Glob(create_glob_input("!/ws/**/*")), - Input::Glob(create_glob_input("proj/**/*")), - Input::Glob(create_glob_input("!proj/**/*")), + Input::Glob(stub_glob_input("/ws/**/*")), + Input::Glob(stub_glob_input("!/ws/**/*")), + Input::Glob(stub_glob_input("proj/**/*")), + Input::Glob(stub_glob_input("!proj/**/*")), ] ), ]) @@ -755,11 +755,11 @@ workspace: file_groups: FxHashMap::from_iter([ ( Id::raw("sources"), - vec![Input::Glob(create_glob_input("src/**/*"))] + vec![Input::Glob(stub_glob_input("src/**/*"))] ), ( Id::raw("tests"), - vec![Input::Glob(create_glob_input("/**/*.test.*"))] + vec![Input::Glob(stub_glob_input("/**/*.test.*"))] ) ]), id: Some(Id::raw("custom-id")), diff --git a/crates/config/tests/task_config_test.rs b/crates/config/tests/task_config_test.rs index ddad3b8e525..4c49f63c4a2 100644 --- a/crates/config/tests/task_config_test.rs +++ b/crates/config/tests/task_config_test.rs @@ -4,7 +4,7 @@ mod utils; use moon_common::Id; use moon_config::{ - FileGroupInput, FileGroupInputFormat, FilePath, Input, OneOrMany, OutputPath, PlatformType, + FileGroupInput, FileGroupInputFormat, FilePath, Input, OneOrMany, Output, PlatformType, ProjectInput, TaskArgs, TaskConfig, TaskDependency, TaskDependencyConfig, TaskMergeStrategy, TaskOptionCache, TaskOutputStyle, TaskType, }; @@ -261,12 +261,12 @@ inputs: assert_eq!( config.inputs.unwrap(), vec![ - Input::File(create_file_input("/ws/path")), - Input::Glob(create_glob_input("/ws/glob/**/*")), - Input::Glob(create_glob_input("!/ws/glob/**/*")), - Input::File(create_file_input("proj/path")), - Input::Glob(create_glob_input("proj/glob/{a,b,c}")), - Input::Glob(create_glob_input("!proj/glob/{a,b,c}")), + Input::File(stub_file_input("/ws/path")), + Input::Glob(stub_glob_input("/ws/glob/**/*")), + Input::Glob(stub_glob_input("!/ws/glob/**/*")), + Input::File(stub_file_input("proj/path")), + Input::Glob(stub_glob_input("proj/glob/{a,b,c}")), + Input::Glob(stub_glob_input("!proj/glob/{a,b,c}")), ] ); } @@ -290,20 +290,20 @@ inputs: config.inputs.unwrap(), vec![ Input::File({ - let mut inner = create_file_input("/ws/path"); + let mut inner = stub_file_input("/ws/path"); inner.content = Some(RegexSetting::new("a|b|c").unwrap()); inner }), - Input::Glob(create_glob_input("/ws/glob/**/*")), - Input::Glob(create_glob_input("!/ws/glob/**/*")), + Input::Glob(stub_glob_input("/ws/glob/**/*")), + Input::Glob(stub_glob_input("!/ws/glob/**/*")), Input::File({ - let mut inner = create_file_input("proj/path"); + let mut inner = stub_file_input("proj/path"); inner.optional = Some(true); inner }), - Input::Glob(create_glob_input("proj/glob/{a,b,c}")), + Input::Glob(stub_glob_input("proj/glob/{a,b,c}")), Input::Glob({ - let mut inner = create_glob_input("!proj/glob/{a,b,c}"); + let mut inner = stub_glob_input("!proj/glob/{a,b,c}"); inner.cache = false; inner }), @@ -333,20 +333,20 @@ inputs: config.inputs.unwrap(), vec![ Input::File({ - let mut inner = create_file_input("/ws/path"); + let mut inner = stub_file_input("/ws/path"); inner.content = Some(RegexSetting::new("a|b|c").unwrap()); inner }), - Input::Glob(create_glob_input("/ws/glob/**/*")), - Input::Glob(create_glob_input("!/ws/glob/**/*")), + Input::Glob(stub_glob_input("/ws/glob/**/*")), + Input::Glob(stub_glob_input("!/ws/glob/**/*")), Input::File({ - let mut inner = create_file_input("proj/path"); + let mut inner = stub_file_input("proj/path"); inner.optional = Some(true); inner }), - Input::Glob(create_glob_input("proj/glob/{a,b,c}")), + Input::Glob(stub_glob_input("proj/glob/{a,b,c}")), Input::Glob({ - let mut inner = create_glob_input("!proj/glob/{a,b,c}"); + let mut inner = stub_glob_input("!proj/glob/{a,b,c}"); inner.cache = false; inner }), @@ -375,20 +375,20 @@ inputs: config.inputs.unwrap(), vec![ Input::File({ - let mut inner = create_file_input("/ws/path"); + let mut inner = stub_file_input("/ws/path"); inner.content = Some(RegexSetting::new("a|b|c").unwrap()); inner }), - Input::Glob(create_glob_input("/ws/glob/**/*")), - Input::Glob(create_glob_input("!/ws/glob/**/*")), + Input::Glob(stub_glob_input("/ws/glob/**/*")), + Input::Glob(stub_glob_input("!/ws/glob/**/*")), Input::File({ - let mut inner = create_file_input("proj/path"); + let mut inner = stub_file_input("proj/path"); inner.optional = Some(true); inner }), - Input::Glob(create_glob_input("proj/glob/{a,b,c}")), + Input::Glob(stub_glob_input("proj/glob/{a,b,c}")), Input::Glob({ - let mut inner = create_glob_input("!proj/glob/{a,b,c}"); + let mut inner = stub_glob_input("!proj/glob/{a,b,c}"); inner.cache = false; inner }), @@ -413,7 +413,7 @@ inputs: vec![ Input::EnvVar("FOO_BAR".into()), Input::EnvVarGlob("FOO_*".into()), - Input::File(create_file_input("file/path")), + Input::File(stub_file_input("file/path")), ] ); } @@ -516,12 +516,12 @@ outputs: assert_eq!( config.outputs.unwrap(), vec![ - OutputPath::WorkspaceFile("ws/path".into()), - OutputPath::WorkspaceGlob("ws/glob/**/*".into()), - // OutputPath::WorkspaceGlob("!ws/glob/**/*".into()), - OutputPath::ProjectFile("proj/path".into()), - OutputPath::ProjectGlob("proj/glob/{a,b,c}".into()), - // OutputPath::ProjectGlob("!proj/glob/{a,b,c}".into()), + Output::File(stub_file_output("/ws/path")), + Output::Glob(stub_glob_output("/ws/glob/**/*")), + // Output::WorkspaceGlob("!ws/glob/**/*".into()), + Output::File(stub_file_output("proj/path")), + Output::Glob(stub_glob_output("proj/glob/{a,b,c}")), + // Output::ProjectGlob("!proj/glob/{a,b,c}".into()), ] ); } @@ -941,19 +941,19 @@ options: inputs: Some(vec![ Input::EnvVar("ENV".into()), Input::EnvVarGlob("ENV_*".into()), - Input::File(create_file_input("file.txt")), - Input::Glob(create_glob_input("file.*")), - Input::File(create_file_input("/file.txt")), - Input::Glob(create_glob_input("/file.*")), + Input::File(stub_file_input("file.txt")), + Input::Glob(stub_glob_input("file.*")), + Input::File(stub_file_input("/file.txt")), + Input::Glob(stub_glob_input("/file.*")), Input::TokenFunc("@dirs(name)".into()) ]), local: Some(true), outputs: Some(vec![ - OutputPath::TokenVar("$workspaceRoot".into()), - OutputPath::ProjectFile("file.txt".into()), - OutputPath::ProjectGlob("file.*".into()), - OutputPath::WorkspaceFile("file.txt".into()), - OutputPath::WorkspaceGlob("file.*".into()), + Output::TokenVar("$workspaceRoot".into()), + Output::File(stub_file_output("file.txt")), + Output::Glob(stub_glob_output("file.*")), + Output::File(stub_file_output("/file.txt")), + Output::Glob(stub_glob_output("/file.*")), ]), options: TaskOptionsConfig { cache: Some(TaskOptionCache::Enabled(false)), diff --git a/crates/project-graph/tests/project_graph_test.rs b/crates/project-graph/tests/project_graph_test.rs index 3413bda58b7..1f9d570a7c5 100644 --- a/crates/project-graph/tests/project_graph_test.rs +++ b/crates/project-graph/tests/project_graph_test.rs @@ -6,14 +6,14 @@ use moon_config::{ use moon_project::{FileGroup, Project}; use moon_project_graph::*; use moon_query::build_query; -use moon_task::{Target, TaskFileInput, TaskGlobInput}; +use moon_task::{Target, TaskFileInput, TaskFileOutput, TaskGlobInput}; use moon_test_utils2::{WorkspaceGraph, WorkspaceMockOptions, WorkspaceMocker}; use moon_workspace::{ ExtendProjectData, ExtendProjectEvent, ExtendProjectGraphData, ExtendProjectGraphEvent, WorkspaceProjectsCacheState, }; use petgraph::prelude::*; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::FxHashMap; use starbase_events::EventState; use starbase_sandbox::{Sandbox, assert_snapshot, create_sandbox, locate_fixture}; use starbase_utils::{fs, json, string_vec}; @@ -804,7 +804,10 @@ mod project_graph { assert_eq!( task.output_files, - FxHashSet::from_iter([WorkspaceRelativePathBuf::from("tasks/build")]) + FxHashMap::from_iter([( + WorkspaceRelativePathBuf::from("tasks/build"), + TaskFileOutput::default() + )]) ); assert_eq!( diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index e1726f6dc3d..6c055ef5166 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -26,15 +26,18 @@ cacheable!( pub config: ProjectConfig, /// List of other projects this project depends on. + #[serde(skip_serializing_if = "Vec::is_empty")] pub dependencies: Vec, /// File groups specific to the project. Inherits all file groups from the global config. + #[serde(skip_serializing_if = "BTreeMap::is_empty")] pub file_groups: BTreeMap, /// Unique ID for the project. Is the LHS of the `projects` setting. pub id: Id, /// Task configuration that was inherited from ".moon/tasks". + #[serde(skip_serializing_if = "Option::is_none")] pub inherited: Option, /// Primary programming language of the project. @@ -61,13 +64,16 @@ cacheable!( /// Tasks specific to the project. Inherits all tasks from the global config. /// Note: This map is empty when the project is in the project graph! + #[serde(skip_serializing_if = "BTreeMap::is_empty")] pub tasks: BTreeMap, /// List of targets of all tasks configured or inherited for the project. /// Includes internal tasks! + #[serde(skip_serializing_if = "Vec::is_empty")] pub task_targets: Vec, /// Toolchains derived from the configured language. + #[serde(skip_serializing_if = "Vec::is_empty")] pub toolchains: Vec, } ); diff --git a/crates/task-builder/tests/tasks_builder_test.rs b/crates/task-builder/tests/tasks_builder_test.rs index f0c4c36d410..af1234979eb 100644 --- a/crates/task-builder/tests/tasks_builder_test.rs +++ b/crates/task-builder/tests/tasks_builder_test.rs @@ -23,11 +23,11 @@ mod tasks_builder { assert_eq!( build.inputs, vec![ - Input::File(create_file_input("abc")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("abc")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); - assert_eq!(build.outputs, vec![OutputPath::ProjectFile("out".into())]); + assert_eq!(build.outputs, vec![Output::File(stub_file_output("out"))]); assert!(!build.state.local_only); let run = tasks.get("local-run").unwrap(); @@ -36,8 +36,8 @@ mod tasks_builder { assert_eq!( run.inputs, vec![ - Input::File(create_file_input("xyz")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("xyz")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert_eq!(run.outputs, vec![]); @@ -49,8 +49,8 @@ mod tasks_builder { assert_eq!( test.inputs, vec![ - Input::Glob(create_glob_input("**/*")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("**/*")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!test.state.local_only); @@ -71,11 +71,11 @@ mod tasks_builder { assert_eq!( build.inputs, vec![ - Input::File(create_file_input("abc")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("abc")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); - assert_eq!(build.outputs, vec![OutputPath::ProjectFile("out".into())]); + assert_eq!(build.outputs, vec![Output::File(stub_file_output("out"))]); assert!(!build.state.local_only); let run = tasks.get("local-run").unwrap(); @@ -84,8 +84,8 @@ mod tasks_builder { assert_eq!( run.inputs, vec![ - Input::File(create_file_input("xyz")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("xyz")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert_eq!(run.outputs, vec![]); @@ -408,7 +408,7 @@ mod tasks_builder { filter: vec![], group: Some(Id::raw("sources")), }), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); } @@ -429,7 +429,7 @@ mod tasks_builder { filter: vec!["src/**/*".into()], group: None, }), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); } @@ -463,7 +463,7 @@ tasks: filter: vec!["src/**/*".into()], group: None, }), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); } @@ -758,7 +758,7 @@ tasks: assert_eq!( task.options.env_files, - Some(vec![Input::File(create_file_input(".env"))]) + Some(vec![Input::File(stub_file_input(".env"))]) ); let task = tasks.get("no-env-file").unwrap(); @@ -769,14 +769,14 @@ tasks: assert_eq!( task.options.env_files, - Some(vec![Input::File(create_file_input(".env.test"))]) + Some(vec![Input::File(stub_file_input(".env.test"))]) ); let task = tasks.get("env-file-workspace").unwrap(); assert_eq!( task.options.env_files, - Some(vec![Input::File(create_file_input("/.env.shared"))]) + Some(vec![Input::File(stub_file_input("/.env.shared"))]) ); let task = tasks.get("env-file-list").unwrap(); @@ -784,8 +784,8 @@ tasks: assert_eq!( task.options.env_files, Some(vec![ - Input::File(create_file_input(".env.test")), - Input::File(create_file_input("/.env.shared")) + Input::File(stub_file_input(".env.test")), + Input::File(stub_file_input("/.env.shared")) ]) ); } @@ -799,31 +799,24 @@ tasks: let task = tasks.get("env-file").unwrap(); - assert!( - task.inputs - .contains(&Input::File(create_file_input(".env"))) - ); + assert!(task.inputs.contains(&Input::File(stub_file_input(".env")))); let task = tasks.get("no-env-file").unwrap(); - assert!( - !task - .inputs - .contains(&Input::File(create_file_input(".env"))) - ); + assert!(!task.inputs.contains(&Input::File(stub_file_input(".env")))); let task = tasks.get("env-file-project").unwrap(); assert!( task.inputs - .contains(&Input::File(create_file_input(".env.test"))) + .contains(&Input::File(stub_file_input(".env.test"))) ); let task = tasks.get("env-file-workspace").unwrap(); assert!( task.inputs - .contains(&Input::File(create_file_input("/.env.shared"))) + .contains(&Input::File(stub_file_input("/.env.shared"))) ); } @@ -1079,8 +1072,8 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("**/*")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("**/*")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1089,7 +1082,7 @@ tasks: assert_eq!( task.inputs, - vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] + vec![Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); @@ -1098,8 +1091,8 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("local/*")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("local/*")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1116,7 +1109,7 @@ tasks: assert_eq!( task.inputs, - vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] + vec![Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -1125,7 +1118,7 @@ tasks: assert_eq!( task.inputs, - vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] + vec![Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -1135,8 +1128,8 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("local/*")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")) + Input::Glob(stub_glob_input("local/*")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")) ] ); assert!(!task.state.empty_inputs); @@ -1155,8 +1148,8 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("**/*")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")) + Input::Glob(stub_glob_input("**/*")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")) ] ); assert!(!task.state.empty_inputs); @@ -1166,7 +1159,7 @@ tasks: assert_eq!( task.inputs, - vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] + vec![Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -1176,8 +1169,8 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("local/*")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")) + Input::Glob(stub_glob_input("local/*")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")) ] ); assert!(!task.state.empty_inputs); @@ -1196,9 +1189,9 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("src/**/*")), - Input::File(create_file_input("/workspace-local")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("src/**/*")), + Input::File(stub_file_input("/workspace-local")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1208,8 +1201,8 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("local.json")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("local.json")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1218,7 +1211,7 @@ tasks: assert_eq!( task.inputs, - vec![Input::Glob(create_glob_input("/.moon/*.{pkl,yml}"))] + vec![Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}"))] ); assert!(task.state.empty_inputs); } @@ -1264,10 +1257,10 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("global")), - Input::File(create_file_input("local")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("global")), + Input::File(stub_file_input("local")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1276,8 +1269,8 @@ tasks: assert_eq!( task.outputs, vec![ - OutputPath::ProjectFile("global".into()), - OutputPath::ProjectFile("local".into()), + Output::File(stub_file_output("global")), + Output::File(stub_file_output("local")), ] ); } @@ -1319,10 +1312,10 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("global")), - Input::File(create_file_input("local")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("global")), + Input::File(stub_file_input("local")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1331,8 +1324,8 @@ tasks: assert_eq!( task.outputs, vec![ - OutputPath::ProjectFile("global".into()), - OutputPath::ProjectFile("local".into()), + Output::File(stub_file_output("global")), + Output::File(stub_file_output("local")), ] ); } @@ -1374,10 +1367,10 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("local")), - Input::File(create_file_input("global")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("local")), + Input::File(stub_file_input("global")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1386,8 +1379,8 @@ tasks: assert_eq!( task.outputs, vec![ - OutputPath::ProjectFile("local".into()), - OutputPath::ProjectFile("global".into()), + Output::File(stub_file_output("local")), + Output::File(stub_file_output("global")), ] ); } @@ -1429,10 +1422,10 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("local")), - Input::File(create_file_input("global")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("local")), + Input::File(stub_file_input("global")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); @@ -1441,8 +1434,8 @@ tasks: assert_eq!( task.outputs, vec![ - OutputPath::ProjectFile("local".into()), - OutputPath::ProjectFile("global".into()), + Output::File(stub_file_output("local")), + Output::File(stub_file_output("global")), ] ); } @@ -1482,15 +1475,15 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("local")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("local")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); let task = tasks.get("outputs").unwrap(); - assert_eq!(task.outputs, vec![OutputPath::ProjectFile("local".into())]); + assert_eq!(task.outputs, vec![Output::File(stub_file_output("local"))]); } #[tokio::test(flavor = "multi_thread")] @@ -1528,15 +1521,15 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("local")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("local")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); let task = tasks.get("all").unwrap(); - assert_eq!(task.outputs, vec![OutputPath::ProjectFile("local".into())]); + assert_eq!(task.outputs, vec![Output::File(stub_file_output("local"))]); } #[tokio::test(flavor = "multi_thread")] @@ -1635,16 +1628,16 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("global")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("global")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); assert!(!task.state.empty_inputs); let task = tasks.get("outputs").unwrap(); - assert_eq!(task.outputs, vec![OutputPath::ProjectFile("global".into())]); + assert_eq!(task.outputs, vec![Output::File(stub_file_output("global"))]); } #[tokio::test(flavor = "multi_thread")] @@ -1683,16 +1676,16 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("global")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("global")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); assert!(!task.state.empty_inputs); let task = tasks.get("all").unwrap(); - assert_eq!(task.outputs, vec![OutputPath::ProjectFile("global".into())]); + assert_eq!(task.outputs, vec![Output::File(stub_file_output("global"))]); } #[tokio::test(flavor = "multi_thread")] @@ -1730,15 +1723,15 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("global")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("global")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); let task = tasks.get("outputs").unwrap(); - assert_eq!(task.outputs, vec![OutputPath::ProjectFile("global".into())]); + assert_eq!(task.outputs, vec![Output::File(stub_file_output("global"))]); } #[tokio::test(flavor = "multi_thread")] @@ -1776,15 +1769,15 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("global")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-merge.yml")), + Input::File(stub_file_input("global")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-merge.yml")), ] ); let task = tasks.get("all").unwrap(); - assert_eq!(task.outputs, vec![OutputPath::ProjectFile("global".into())]); + assert_eq!(task.outputs, vec![Output::File(stub_file_output("global"))]); } } @@ -1949,10 +1942,10 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("**/*")), - Input::Glob(create_glob_input("project/**/*")), - Input::File(create_file_input("/workspace.json")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("**/*")), + Input::Glob(stub_glob_input("project/**/*")), + Input::File(stub_file_input("/workspace.json")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -1969,9 +1962,9 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("project/**/*")), - Input::File(create_file_input("/workspace.json")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("project/**/*")), + Input::File(stub_file_input("/workspace.json")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(task.state.empty_inputs); @@ -1988,10 +1981,10 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("local/*")), - Input::Glob(create_glob_input("project/**/*")), - Input::File(create_file_input("/workspace.json")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("local/*")), + Input::Glob(stub_glob_input("project/**/*")), + Input::File(stub_file_input("/workspace.json")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); assert!(!task.state.empty_inputs); @@ -2125,8 +2118,8 @@ tasks: assert_eq!( task.inputs, vec![ - Input::Glob(create_glob_input("src/**/*")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), + Input::Glob(stub_glob_input("src/**/*")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), ] ); } @@ -2171,12 +2164,12 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("global-base")), - Input::File(create_file_input("global-extender")), - Input::File(create_file_input("local-base")), - Input::File(create_file_input("local-extender")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-extends.yml")), + Input::File(stub_file_input("global-base")), + Input::File(stub_file_input("global-extender")), + Input::File(stub_file_input("local-base")), + Input::File(stub_file_input("local-extender")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-extends.yml")), ] ); @@ -2198,10 +2191,10 @@ tasks: assert_eq!( task.inputs, vec![ - Input::File(create_file_input("global-base")), - Input::File(create_file_input("local-extender")), - Input::Glob(create_glob_input("/.moon/*.{pkl,yml}")), - Input::File(create_file_input("/global/tasks/tag-extends.yml")), + Input::File(stub_file_input("global-base")), + Input::File(stub_file_input("local-extender")), + Input::Glob(stub_glob_input("/.moon/*.{pkl,yml}")), + Input::File(stub_file_input("/global/tasks/tag-extends.yml")), ] ); } diff --git a/crates/task-expander/src/task_expander.rs b/crates/task-expander/src/task_expander.rs index 0fac806830d..d697678be7c 100644 --- a/crates/task-expander/src/task_expander.rs +++ b/crates/task-expander/src/task_expander.rs @@ -5,7 +5,7 @@ use moon_config::{Input, TaskArgs}; use moon_env_var::*; use moon_graph_utils::GraphExpanderContext; use moon_project::Project; -use moon_task::{Task, TaskFileInput, TaskGlobInput}; +use moon_task::{Task, TaskFileInput, TaskFileOutput, TaskGlobInput, TaskGlobOutput}; use moon_task_args::parse_task_args; use rustc_hash::FxHashMap; use std::mem; @@ -262,8 +262,21 @@ impl<'graph> TaskExpander<'graph> { // Expand outputs to file system paths let result = self.token.expand_outputs(task)?; - task.output_files.extend(result.files); - task.output_globs.extend(result.globs); + task.output_files.extend(result.files_for_output); + task.output_files.extend( + result + .files + .into_iter() + .map(|file| (file, TaskFileOutput::default())), + ); + + task.output_globs.extend(result.globs_for_output); + task.output_globs.extend( + result + .globs + .into_iter() + .map(|glob| (glob, TaskGlobOutput::default())), + ); Ok(()) } @@ -275,7 +288,7 @@ impl<'graph> TaskExpander<'graph> { for file in task.input_files.keys() { // If this dir is actually an output dir, just remove it - if task.output_files.contains(file) { + if task.output_files.contains_key(file) { to_remove.push(file.to_owned()); continue; } @@ -299,11 +312,11 @@ impl<'graph> TaskExpander<'graph> { // Outputs must not be considered an input, otherwise the content // hash will constantly change, and the cache will always be busted pub fn remove_input_output_overlaps(&mut self, task: &mut Task) { - for file in &task.output_files { + for file in task.output_files.keys() { task.input_files.remove(file); } - for glob in &task.output_globs { + for glob in task.output_globs.keys() { task.input_globs.remove(glob); } } diff --git a/crates/task-expander/src/token_expander.rs b/crates/task-expander/src/token_expander.rs index 88695fe240f..ae2c0a8bab6 100644 --- a/crates/task-expander/src/token_expander.rs +++ b/crates/task-expander/src/token_expander.rs @@ -4,11 +4,11 @@ use moon_common::{ color, path::{self, WorkspaceRelativePathBuf}, }; -use moon_config::{Input, OutputPath, ProjectMetadataConfig, patterns}; +use moon_config::{Input, Output, ProjectMetadataConfig, patterns}; use moon_env_var::{EnvScanner, EnvSubstitutor, GlobalEnvBag}; use moon_graph_utils::GraphExpanderContext; use moon_project::{FileGroup, Project}; -use moon_task::{Task, TaskFileInput, TaskGlobInput}; +use moon_task::{Task, TaskFileInput, TaskFileOutput, TaskGlobInput, TaskGlobOutput}; use moon_time::{now_millis, now_timestamp}; use pathdiff::diff_paths; use regex::Regex; @@ -24,8 +24,10 @@ pub struct ExpandedResult { pub env: Vec, pub files: Vec, pub files_for_input: FxHashMap, + pub files_for_output: FxHashMap, pub globs: Vec, pub globs_for_input: FxHashMap, + pub globs_for_output: FxHashMap, pub token: Option, pub value: Option, } @@ -324,31 +326,40 @@ impl<'graph> TokenExpander<'graph> { for output in &task.outputs { match output { - OutputPath::TokenFunc(func) => { + Output::TokenFunc(func) => { let inner_result = self.replace_function(task, func)?; result.files.extend(inner_result.files); result.globs.extend(inner_result.globs); result.value = inner_result.value; } - OutputPath::TokenVar(var) => { + Output::TokenVar(var) => { result.files.push( self.project .source .join(self.replace_variable(task, Cow::Borrowed(var))?.as_ref()), ); } - _ => { - let path = self.create_path_for_task( + Output::File(inner) => { + let file = self.create_path_for_task( task, - output.to_workspace_relative(&self.project.source).unwrap(), + inner.to_workspace_relative(&self.project.source), )?; - if output.is_glob() { - result.globs.push(path); - } else { - result.files.push(path); - } + result.files_for_output.insert( + file, + TaskFileOutput { + optional: inner.optional.unwrap_or_default(), + }, + ); + } + Output::Glob(inner) => { + let glob = self.create_path_for_task( + task, + inner.to_workspace_relative(&self.project.source), + )?; + + result.globs_for_output.insert(glob, TaskGlobOutput {}); } }; } @@ -451,19 +462,19 @@ impl<'graph> TokenExpander<'graph> { })?; match output { - OutputPath::ProjectFile(_) | OutputPath::WorkspaceFile(_) => { + Output::File(inner) => { result.files.push(self.create_path_for_task( task, - output.to_workspace_relative(&self.project.source).unwrap(), + inner.to_workspace_relative(&self.project.source), )?); } - OutputPath::ProjectGlob(_) | OutputPath::WorkspaceGlob(_) => { + Output::Glob(inner) => { result.globs.push(self.create_path_for_task( task, - output.to_workspace_relative(&self.project.source).unwrap(), + inner.to_workspace_relative(&self.project.source), )?); } - OutputPath::TokenFunc(func) => { + Output::TokenFunc(func) => { let inner_result = self.replace_function(task, func)?; result.files.extend(inner_result.files); result.globs.extend(inner_result.globs); diff --git a/crates/task-expander/tests/task_expander_test.rs b/crates/task-expander/tests/task_expander_test.rs index 42a3a293baf..78fd45c9986 100644 --- a/crates/task-expander/tests/task_expander_test.rs +++ b/crates/task-expander/tests/task_expander_test.rs @@ -1,7 +1,8 @@ mod utils; -use moon_common::path::WorkspaceRelativePathBuf; -use moon_config::{Input, OutputPath, TaskArgs, TaskDependencyConfig, schematic::RegexSetting}; +use moon_config::{ + Input, Output, TaskArgs, TaskDependencyConfig, schematic::RegexSetting, test_utils::*, +}; use moon_env_var::GlobalEnvBag; use moon_task::{Target, TaskFileInput, TaskGlobInput}; use moon_task_expander::TaskExpander; @@ -9,10 +10,6 @@ use rustc_hash::{FxHashMap, FxHashSet}; use starbase_sandbox::{create_empty_sandbox, create_sandbox}; use utils::*; -fn create_path_set(inputs: Vec<&str>) -> FxHashSet { - FxHashSet::from_iter(inputs.into_iter().map(|s| s.into())) -} - mod task_expander { use super::*; @@ -22,7 +19,7 @@ mod task_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs.push(OutputPath::ProjectFile("out".into())); + task.outputs.push(Output::File(stub_file_output("out"))); task.input_files .insert("project/source/out".into(), TaskFileInput::default()); @@ -32,7 +29,7 @@ mod task_expander { assert!(task.input_files.is_empty()); assert_eq!( task.output_files, - create_path_set(vec!["project/source/out"]) + create_file_output_map(vec!["project/source/out"]) ); } @@ -43,7 +40,7 @@ mod task_expander { let mut task = create_task(); task.outputs - .push(OutputPath::ProjectGlob("out/**/*".into())); + .push(Output::Glob(stub_glob_output("out/**/*"))); task.input_globs .insert("project/source/out/**/*".into(), TaskGlobInput::default()); @@ -53,7 +50,7 @@ mod task_expander { assert!(task.input_globs.is_empty()); assert_eq!( task.output_globs, - create_path_set(vec!["project/source/out/**/*"]) + create_glob_output_map(vec!["project/source/out/**/*"]) ); } @@ -918,19 +915,18 @@ mod task_expander { let mut task = create_task(); task.outputs - .push(OutputPath::ProjectFile("file.txt".into())); - task.outputs - .push(OutputPath::TokenFunc("@files(all)".into())); + .push(Output::File(stub_file_output("file.txt"))); + task.outputs.push(Output::TokenFunc("@files(all)".into())); let context = create_context(sandbox.path()); TaskExpander::new(&project, &context) .expand_outputs(&mut task) .unwrap(); - assert_eq!(task.output_globs, FxHashSet::default()); + assert_eq!(task.output_globs, FxHashMap::default()); assert_eq!( task.output_files, - create_path_set(vec![ + create_file_output_map(vec![ "project/source/dir/subdir/nested.json", "project/source/file.txt", "project/source/docs.md", @@ -947,9 +943,8 @@ mod task_expander { let mut task = create_task(); task.outputs - .push(OutputPath::ProjectFile("file.txt".into())); - task.outputs - .push(OutputPath::TokenFunc("@group(all)".into())); + .push(Output::File(stub_file_output("file.txt"))); + task.outputs.push(Output::TokenFunc("@group(all)".into())); let context = create_context(sandbox.path()); TaskExpander::new(&project, &context) @@ -958,11 +953,11 @@ mod task_expander { assert_eq!( task.output_globs, - create_path_set(vec!["project/source/*.md", "project/source/**/*.json"]) + create_glob_output_map(vec!["project/source/*.md", "project/source/**/*.json"]) ); assert_eq!( task.output_files, - create_path_set(vec![ + create_file_output_map(vec![ "project/source/dir/subdir", "project/source/file.txt", "project/source/config.yml", @@ -977,9 +972,9 @@ mod task_expander { let mut task = create_task(); task.outputs - .push(OutputPath::ProjectGlob("$task/**/*".into())); + .push(Output::Glob(stub_glob_output("$task/**/*"))); task.outputs - .push(OutputPath::WorkspaceFile("$project/index.js".into())); + .push(Output::File(stub_file_output("/$project/index.js"))); let context = create_context(sandbox.path()); TaskExpander::new(&project, &context) @@ -988,9 +983,12 @@ mod task_expander { assert_eq!( task.output_globs, - create_path_set(vec!["project/source/task/**/*"]) + create_glob_output_map(vec!["project/source/task/**/*"]) + ); + assert_eq!( + task.output_files, + create_file_output_map(vec!["project/index.js"]) ); - assert_eq!(task.output_files, create_path_set(vec!["project/index.js"])); } } } diff --git a/crates/task-expander/tests/token_expander_test.rs b/crates/task-expander/tests/token_expander_test.rs index d7698cf91d8..12477ac9abc 100644 --- a/crates/task-expander/tests/token_expander_test.rs +++ b/crates/task-expander/tests/token_expander_test.rs @@ -3,7 +3,7 @@ mod utils; use moon_common::Id; use moon_common::path::{self, WorkspaceRelativePathBuf}; use moon_config::{ - FileGroupInput, FileGroupInputFormat, Input, LanguageType, LayerType, OutputPath, + FileGroupInput, FileGroupInputFormat, Input, LanguageType, LayerType, Output, test_utils::*, }; use moon_env_var::GlobalEnvBag; use moon_task::{TaskFileInput, TaskGlobInput}; @@ -133,8 +133,7 @@ mod token_expander { let sandbox = create_empty_sandbox(); let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs - .push(OutputPath::TokenFunc("@globs(all)".into())); + task.outputs.push(Output::TokenFunc("@globs(all)".into())); let context = create_context(sandbox.path()); let expander = TokenExpander::new(&project, &context); @@ -154,7 +153,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); task.outputs - .push(OutputPath::TokenFunc("@globs(unknown)".into())); + .push(Output::TokenFunc("@globs(unknown)".into())); let context = create_context(sandbox.path()); let expander = TokenExpander::new(&project, &context); @@ -1488,7 +1487,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@group(all)".into())]; + task.outputs = vec![Output::TokenFunc("@group(all)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1515,7 +1514,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@dirs(dirs)".into())]; + task.outputs = vec![Output::TokenFunc("@dirs(dirs)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1539,7 +1538,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@files(all)".into())]; + task.outputs = vec![Output::TokenFunc("@files(all)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1565,7 +1564,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@globs(all)".into())]; + task.outputs = vec![Output::TokenFunc("@globs(all)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1589,7 +1588,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@root(all)".into())]; + task.outputs = vec![Output::TokenFunc("@root(all)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1613,7 +1612,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@in(0)".into())]; + task.outputs = vec![Output::TokenFunc("@in(0)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1630,7 +1629,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@out(0)".into())]; + task.outputs = vec![Output::TokenFunc("@out(0)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1647,7 +1646,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@meta(name)".into())]; + task.outputs = vec![Output::TokenFunc("@meta(name)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1664,7 +1663,7 @@ mod token_expander { let project = create_project(sandbox.path()); let mut task = create_task(); - task.outputs = vec![OutputPath::TokenFunc("@envs(envs)".into())]; + task.outputs = vec![Output::TokenFunc("@envs(envs)".into())]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); @@ -1679,10 +1678,10 @@ mod token_expander { let mut task = create_task(); task.outputs = vec![ - OutputPath::ProjectFile("$task/file.txt".into()), - OutputPath::ProjectGlob("$task/files/**/*".into()), - OutputPath::WorkspaceFile("cache/$target/file.txt".into()), - OutputPath::WorkspaceGlob("cache/$target/files/**/*".into()), + Output::File(stub_file_output("$task/file.txt")), + Output::Glob(stub_glob_output("$task/files/**/*")), + Output::File(stub_file_output("/cache/$target/file.txt")), + Output::Glob(stub_glob_output("/cache/$target/files/**/*")), ]; let context = create_context(sandbox.path()); @@ -1691,14 +1690,14 @@ mod token_expander { assert_eq!( expander.expand_outputs(&task).unwrap(), ExpandedResult { - files: vec![ - WorkspaceRelativePathBuf::from("project/source/task/file.txt"), - WorkspaceRelativePathBuf::from("cache/project:task/file.txt"), - ], - globs: vec![ - WorkspaceRelativePathBuf::from("project/source/task/files/**/*"), - WorkspaceRelativePathBuf::from("cache/project:task/files/**/*"), - ], + files_for_output: create_file_output_map(vec![ + "project/source/task/file.txt", + "cache/project:task/file.txt", + ]), + globs_for_output: create_glob_output_map(vec![ + "project/source/task/files/**/*", + "cache/project:task/files/**/*", + ]), ..ExpandedResult::default() } ); @@ -1714,10 +1713,10 @@ mod token_expander { task.env.insert("BAR".into(), "bar".into()); task.outputs = vec![ - OutputPath::ProjectFile("$FOO/file.txt".into()), - OutputPath::ProjectGlob("${BAR}/files/**/*".into()), - OutputPath::WorkspaceFile("cache/$FOO/file.txt".into()), - OutputPath::WorkspaceGlob("cache/${BAR}/files/**/*".into()), + Output::File(stub_file_output("$FOO/file.txt")), + Output::Glob(stub_glob_output("${BAR}/files/**/*")), + Output::File(stub_file_output("/cache/$FOO/file.txt")), + Output::Glob(stub_glob_output("/cache/${BAR}/files/**/*")), ]; let context = create_context(sandbox.path()); @@ -1726,14 +1725,14 @@ mod token_expander { assert_eq!( expander.expand_outputs(&task).unwrap(), ExpandedResult { - files: vec![ - WorkspaceRelativePathBuf::from("project/source/foo/file.txt"), - WorkspaceRelativePathBuf::from("cache/foo/file.txt"), - ], - globs: vec![ - WorkspaceRelativePathBuf::from("project/source/bar/files/**/*"), - WorkspaceRelativePathBuf::from("cache/bar/files/**/*"), - ], + files_for_output: create_file_output_map(vec![ + "project/source/foo/file.txt", + "cache/foo/file.txt", + ]), + globs_for_output: create_glob_output_map(vec![ + "project/source/bar/files/**/*", + "cache/bar/files/**/*", + ]), ..ExpandedResult::default() } ); @@ -1883,7 +1882,7 @@ mod token_expander { let mut task = create_task(); task.script = Some("bin --foo -az @out(0)".into()); - task.outputs = vec![OutputPath::ProjectGlob("**/*.json".into())]; + task.outputs = vec![Output::Glob(stub_glob_output("**/*.json"))]; let context = create_context(sandbox.path()); let mut expander = TokenExpander::new(&project, &context); diff --git a/crates/task-expander/tests/utils.rs b/crates/task-expander/tests/utils.rs index 27c96ebbb7a..3298a3624ba 100644 --- a/crates/task-expander/tests/utils.rs +++ b/crates/task-expander/tests/utils.rs @@ -5,7 +5,7 @@ use moon_common::path::WorkspaceRelativePathBuf; use moon_config::{Input, TaskOptionCache}; use moon_graph_utils::GraphExpanderContext; use moon_project::{FileGroup, Project}; -use moon_task::{Target, Task, TaskFileInput, TaskGlobInput}; +use moon_task::{Target, Task, TaskFileInput, TaskFileOutput, TaskGlobInput, TaskGlobOutput}; use rustc_hash::FxHashMap; use std::collections::BTreeMap; use std::path::Path; @@ -121,3 +121,23 @@ pub fn create_glob_input_map( .map(|input| (input.into(), TaskGlobInput::default())), ) } + +pub fn create_file_output_map( + outputs: Vec<&str>, +) -> FxHashMap { + FxHashMap::from_iter( + outputs + .into_iter() + .map(|output| (output.into(), TaskFileOutput::default())), + ) +} + +pub fn create_glob_output_map( + outputs: Vec<&str>, +) -> FxHashMap { + FxHashMap::from_iter( + outputs + .into_iter() + .map(|output| (output.into(), TaskGlobOutput::default())), + ) +} diff --git a/crates/task-hasher/src/task_hash.rs b/crates/task-hasher/src/task_hash.rs index 9bb111611bd..e6b6d8b440a 100644 --- a/crates/task-hasher/src/task_hash.rs +++ b/crates/task-hasher/src/task_hash.rs @@ -1,6 +1,6 @@ use moon_common::Id; use moon_common::path::WorkspaceRelativePathBuf; -use moon_config::OutputPath; +use moon_config::Output; use moon_hash::hash_content; use moon_project::Project; use moon_task::{Target, Task}; @@ -31,7 +31,7 @@ hash_content!( pub input_env: BTreeMap<&'task str, String>, // Relative output paths - pub outputs: Vec<&'task OutputPath>, + pub outputs: Vec<&'task Output>, // Project `dependsOn` pub project_deps: Vec<&'task Id>, diff --git a/crates/task-hasher/src/task_hasher.rs b/crates/task-hasher/src/task_hasher.rs index e2b8fbb72e2..20a7a68ac65 100644 --- a/crates/task-hasher/src/task_hasher.rs +++ b/crates/task-hasher/src/task_hasher.rs @@ -45,7 +45,6 @@ impl<'task> TaskHasher<'task> { pub fn hash(mut self) -> TaskHash<'task> { // Ensure hashing is deterministic self.content.args.sort(); - self.content.outputs.sort(); self.content.project_deps.sort(); // Consume the hasher and return the content @@ -177,7 +176,7 @@ impl<'task> TaskHasher<'task> { return false; } - for output in &self.task.output_files { + for output in self.task.output_files.keys() { if workspace_relative_path == output || workspace_relative_path.starts_with(output) { return false; } diff --git a/crates/task-runner/src/output_archiver.rs b/crates/task-runner/src/output_archiver.rs index b191b2d225c..5468715623b 100644 --- a/crates/task-runner/src/output_archiver.rs +++ b/crates/task-runner/src/output_archiver.rs @@ -70,7 +70,7 @@ impl OutputArchiver<'_> { let all_negated_globs = self .task .output_globs - .iter() + .keys() .all(|glob| glob.as_str().starts_with('!')); // If using globs, we have no way to truly determine if all outputs @@ -80,8 +80,8 @@ impl OutputArchiver<'_> { } // Check paths first since they are literal - for output in &self.task.output_files { - if !output.to_path(&self.app.workspace_root).exists() { + for (output, params) in &self.task.output_files { + if !output.to_path(&self.app.workspace_root).exists() && !params.optional { return Ok(false); } } @@ -111,11 +111,11 @@ impl OutputArchiver<'_> { // Create the archiver instance based on task outputs let mut archive = Archiver::new(&self.app.workspace_root, archive_file); - for output_file in &self.task.output_files { + for output_file in self.task.output_files.keys() { archive.add_source_file(output_file.as_str(), None); } - for output_glob in &self.task.output_globs { + for output_glob in self.task.output_globs.keys() { archive.add_source_glob(output_glob.as_str()); } diff --git a/crates/task-runner/src/output_hydrater.rs b/crates/task-runner/src/output_hydrater.rs index e26215ed8aa..53f19d977a7 100644 --- a/crates/task-runner/src/output_hydrater.rs +++ b/crates/task-runner/src/output_hydrater.rs @@ -83,11 +83,11 @@ impl OutputHydrater<'_> { // Create the archiver instance based on task outputs let mut archive = Archiver::new(&self.app.workspace_root, archive_file); - for output_file in &self.task.output_files { + for output_file in self.task.output_files.keys() { archive.add_source_file(output_file.as_str(), None); } - for output_glob in &self.task.output_globs { + for output_glob in self.task.output_globs.keys() { archive.add_source_glob(output_glob.as_str()); } diff --git a/crates/task-runner/tests/__fixtures__/archive/project/moon.yml b/crates/task-runner/tests/__fixtures__/archive/project/moon.yml index e36149dc174..af7a945f112 100644 --- a/crates/task-runner/tests/__fixtures__/archive/project/moon.yml +++ b/crates/task-runner/tests/__fixtures__/archive/project/moon.yml @@ -23,6 +23,12 @@ tasks: - '!b.txt' - 'c.txt' + file-outputs-optional: + command: noop + outputs: + - file: 'file.txt' + optional: true + glob-outputs: command: noop outputs: diff --git a/crates/task-runner/tests/output_archiver_test.rs b/crates/task-runner/tests/output_archiver_test.rs index d5756eb1a3d..43cfe7f5c75 100644 --- a/crates/task-runner/tests/output_archiver_test.rs +++ b/crates/task-runner/tests/output_archiver_test.rs @@ -21,6 +21,14 @@ mod output_archiver { archiver.archive("hash123", None).await.unwrap(); } + #[tokio::test(flavor = "multi_thread")] + async fn doesnt_error_if_outputs_not_created_but_marked_as_optional() { + let container = TaskRunnerContainer::new("archive", "file-outputs-optional").await; + let archiver = container.create_archiver(); + + let _ = archiver.archive("hash123", None).await.unwrap(); + } + #[tokio::test(flavor = "multi_thread")] async fn creates_an_archive() { let container = TaskRunnerContainer::new("archive", "file-outputs").await; diff --git a/crates/task/src/task.rs b/crates/task/src/task.rs index b453d4e6919..a28e0818194 100644 --- a/crates/task/src/task.rs +++ b/crates/task/src/task.rs @@ -1,7 +1,7 @@ use crate::task_options::TaskOptions; use moon_common::{Id, cacheable, path::WorkspaceRelativePathBuf}; use moon_config::{ - Input, OutputPath, PlatformType, TaskDependencyConfig, TaskOptionRunInCI, TaskPreset, TaskType, + Input, Output, PlatformType, TaskDependencyConfig, TaskOptionRunInCI, TaskPreset, TaskType, is_false, schematic::RegexSetting, }; use moon_feature_flags::glob_walk_with_options; @@ -64,23 +64,41 @@ impl Default for TaskGlobInput { } } +cacheable!( + #[derive(Clone, Debug, Default, Eq, PartialEq)] + #[serde(default)] + pub struct TaskFileOutput { + pub optional: bool, + } +); + +cacheable!( + #[derive(Clone, Debug, Default, Eq, PartialEq)] + #[serde(default)] + pub struct TaskGlobOutput {} +); + cacheable!( #[derive(Clone, Debug, Eq, PartialEq)] #[serde(default)] pub struct Task { + #[serde(skip_serializing_if = "Vec::is_empty")] pub args: Vec, pub command: String, + #[serde(skip_serializing_if = "Vec::is_empty")] pub deps: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, + #[serde(skip_serializing_if = "FxHashMap::is_empty")] pub env: FxHashMap, pub id: Id, + #[serde(skip_serializing_if = "Vec::is_empty")] pub inputs: Vec, #[serde(skip_serializing_if = "FxHashSet::is_empty")] @@ -94,13 +112,14 @@ cacheable!( pub options: TaskOptions, - pub outputs: Vec, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub outputs: Vec, - #[serde(skip_serializing_if = "FxHashSet::is_empty")] - pub output_files: FxHashSet, + #[serde(skip_serializing_if = "FxHashMap::is_empty")] + pub output_files: FxHashMap, - #[serde(skip_serializing_if = "FxHashSet::is_empty")] - pub output_globs: FxHashSet, + #[serde(skip_serializing_if = "FxHashMap::is_empty")] + pub output_globs: FxHashMap, #[deprecated] pub platform: PlatformType, @@ -115,6 +134,7 @@ cacheable!( pub target: Target, + #[serde(skip_serializing_if = "Vec::is_empty")] pub toolchains: Vec, #[serde(rename = "type")] @@ -128,7 +148,7 @@ impl Task { // Both inputs/outputs may have a mix of negated and // non-negated globs, so we must split them into groups let (gi, ni) = split_patterns(self.input_globs.keys()); - let (go, no) = split_patterns(&self.output_globs); + let (go, no) = split_patterns(self.output_globs.keys()); // We then only match against non-negated inputs let g = gi; @@ -243,7 +263,7 @@ impl Task { let mut list = FxHashSet::default(); if include_non_globs { - for file in &self.output_files { + for file in self.output_files.keys() { list.insert(file.to_logical_path(workspace_root)); } } @@ -251,7 +271,7 @@ impl Task { if !self.output_globs.is_empty() { list.extend(glob_walk_with_options( workspace_root, - &self.output_globs, + self.output_globs.keys(), GlobWalkOptions::default().files(), )?); } @@ -345,8 +365,8 @@ impl Default for Task { input_globs: FxHashMap::default(), options: TaskOptions::default(), outputs: vec![], - output_files: FxHashSet::default(), - output_globs: FxHashSet::default(), + output_files: FxHashMap::default(), + output_globs: FxHashMap::default(), platform: PlatformType::default(), preset: None, script: None, diff --git a/legacy/javascript/platform/src/infer_tasks.rs b/legacy/javascript/platform/src/infer_tasks.rs index 44f54d8522c..9a64b23d5f4 100644 --- a/legacy/javascript/platform/src/infer_tasks.rs +++ b/legacy/javascript/platform/src/infer_tasks.rs @@ -1,7 +1,7 @@ use moon_args::split_args; use moon_common::Id; use moon_config::{ - NodePackageManager, OneOrMany, OutputPath, PartialTaskArgs, PartialTaskConfig, + NodePackageManager, OneOrMany, Output, PartialTaskArgs, PartialTaskConfig, PartialTaskDependency, }; use moon_node_lang::package_json::{PackageJsonCache, ScriptsMap}; @@ -165,9 +165,7 @@ pub fn create_task( if ARG_OUTPUT_FLAG.is_match(arg) && let Some(output) = script_args.get(index + 1) { - outputs.push(OutputPath::ProjectFile(clean_output_path( - target_id, output, - )?)); + outputs.push(Output::parse(clean_output_path(target_id, output)?)?); } if !is_wrapping { diff --git a/legacy/javascript/platform/tests/infer_tasks_test.rs b/legacy/javascript/platform/tests/infer_tasks_test.rs index 704d330aa15..c951efab8a9 100644 --- a/legacy/javascript/platform/tests/infer_tasks_test.rs +++ b/legacy/javascript/platform/tests/infer_tasks_test.rs @@ -1,6 +1,6 @@ use moon_common::Id; use moon_config::{ - NodePackageManager, OneOrMany, OutputPath, PartialTaskArgs, PartialTaskConfig, + NodePackageManager, OneOrMany, Output, PartialTaskArgs, PartialTaskConfig, PartialTaskDependency, }; use moon_javascript_platform::infer_tasks::*; @@ -665,7 +665,7 @@ mod create_task { candidate.0, candidate.1 ])), - outputs: Some(vec![OutputPath::ProjectFile(candidate.2.to_owned())]), + outputs: Some(vec![Output::parse(candidate.2).unwrap()]), toolchain: Some(OneOrMany::One(Id::raw("node"))), ..PartialTaskConfig::default() } @@ -753,7 +753,7 @@ mod infer_tasks_from_scripts { "run", "build:app" ])), - outputs: Some(vec![OutputPath::ProjectFile("dist".into())]), + outputs: Some(vec![Output::parse("dist").unwrap()]), toolchain: Some(OneOrMany::One(Id::raw("node"))), ..PartialTaskConfig::default() } diff --git a/packages/types/src/project.ts b/packages/types/src/project.ts index abe64a15727..b50f97b767f 100644 --- a/packages/types/src/project.ts +++ b/packages/types/src/project.ts @@ -10,6 +10,7 @@ import type { import type { InheritedTasksConfig, Input, + Output, PartialInheritedTasksConfig, PlatformType, TaskDependencyConfig, @@ -79,6 +80,13 @@ export interface TaskGlobInput { cache?: boolean; } +export interface TaskFileOutput { + optional?: boolean; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface TaskGlobOutput {} + export interface Task { args: string[]; command: string; @@ -91,21 +99,21 @@ export interface Task { inputFiles: Record; inputGlobs: Record; options: TaskOptions; - outputs: string[]; - outputFiles: string[]; - outputGlobs: string[]; + outputs: Output[]; + outputFiles: Record; + outputGlobs: Record; platform: PlatformType; preset: TaskPreset | null; script: string | null; state: TaskState; target: string; - toolchains: string[]; + toolchains: Id[]; type: TaskType; } export interface TaskFragment { target: string; - toolchains: string[]; + toolchains: Id[]; } export interface Project { @@ -136,7 +144,7 @@ export interface ProjectFragment { dependencyScope: DependencyScope; id: Id; source: string; - toolchains: string[]; + toolchains: Id[]; } export interface ProjectGraphInner { diff --git a/packages/types/src/tasks-config.ts b/packages/types/src/tasks-config.ts index 52482b39ac0..82ec85c90b9 100644 --- a/packages/types/src/tasks-config.ts +++ b/packages/types/src/tasks-config.ts @@ -9,41 +9,73 @@ export type TaskDependencyType = 'cleanup' | 'required' | 'optional'; /** A file path input. */ export interface FileInput { + /** + * Regex pattern to match the file's contents against + * when determining affected status. + */ content: string | null; + /** The literal file path. */ file: string; + /** + * Mark the file as optional instead of logging a warning + * when hashing a task. + */ optional?: boolean | null; } -/** Format to resolve the file group into. */ +/** Available formats to resolve the file group into. */ export type FileGroupInputFormat = 'static' | 'dirs' | 'envs' | 'files' | 'globs' | 'root'; /** A file group input. */ export interface FileGroupInput { /** + * Format to resolve the file group into. + * * @default 'static' * @type {'static' | 'dirs' | 'envs' | 'files' | 'globs' | 'root'} */ as?: FileGroupInputFormat; /** + * Format to resolve the file group into. + * * @default 'static' * @type {'static' | 'dirs' | 'envs' | 'files' | 'globs' | 'root'} */ format?: FileGroupInputFormat; + /** The file group identifier. */ group: Id; } -/** A glob path input. */ +/** A glob pattern input. */ export interface GlobInput { - /** @default true */ + /** + * Cache the glob walking result for increased performance. + * + * @default true + */ cache?: boolean; + /** The glob pattern. */ glob: string; } /** An external project input. */ export interface ProjectInput { + /** + * A list of globs, relative from the project's root, + * in which to determine affected status. + */ filter?: string[]; + /** + * A file group identifier within the project in which + * to determine affected status. + */ fileGroup?: Id | null; + /** + * A file group identifier within the project in which + * to determine affected status. + */ group?: Id | null; + /** The external project identifier. */ project: string; } @@ -240,6 +272,25 @@ export interface TaskOptionsConfig { windowsShell: TaskWindowsShell | null; } +/** A file path output. */ +export interface FileOutput { + /** The literal file path. */ + file: string; + /** + * Mark the file as optional instead of failing with + * an error after running a task and the output doesn't exist. + */ + optional?: boolean | null; +} + +/** A glob pattern output. */ +export interface GlobOutput { + /** The glob pattern. */ + glob: string; +} + +export type Output = string | FileOutput | GlobOutput; + /** Platforms that each programming language can belong to. */ export type PlatformType = 'bun' | 'deno' | 'node' | 'python' | 'rust' | 'system' | 'unknown'; @@ -297,7 +348,7 @@ export interface TaskConfig { * Outputs that will be created when the task has successfully ran. * When `cache` is enabled, the outputs will be persisted for subsequent runs. */ - outputs: string[] | null; + outputs: Output[] | null; /** * The platform in which the task will be ran in. The platform determines * available binaries, lookup paths, and more. When not provided, will @@ -580,7 +631,7 @@ export interface PartialTaskConfig { * Outputs that will be created when the task has successfully ran. * When `cache` is enabled, the outputs will be persisted for subsequent runs. */ - outputs?: string[] | null; + outputs?: Output[] | null; /** * The platform in which the task will be ran in. The platform determines * available binaries, lookup paths, and more. When not provided, will diff --git a/website/docs/config/project.mdx b/website/docs/config/project.mdx index f48df012a31..3b069dc49ea 100644 --- a/website/docs/config/project.mdx +++ b/website/docs/config/project.mdx @@ -939,28 +939,58 @@ are _created_ as a result of executing this task, typically from a build or comp task. Outputs are necessary for [incremental caching and hydration](../concepts/cache). If you'd prefer to avoid that functionality, omit this field. -```yaml title="moon.yml" {4-6} +#### File paths + +File paths support +[project and workspace relative file/folder patterns](../concepts/file-pattern#project-relative). +They can be defined as a literal path, or a `file://` URI , +or as an object with a `file` property . Additionally, the +following parameters are supported as a URI query or as object fields: + +- `optional` (`boolean`) - When archiving and set to `true` and the file is missing, will not fail + with a missing output error. Defaults to `false`. + +```yaml title="moon.yml" tasks: - build: - command: 'webpack' - outputs: - # Relative from project root + example: + inputs: + # Literal paths - 'build/' + # Using file protocol + - 'file://build/' + # Using an object + - file: 'build/' + optional: true ``` -Globs can also be used if you'd like to restrict which files are cached. For example, when building -a JavaScript project, you may want to include `.js` files, but exclude `.map` and other files. +#### Glob patterns -```yaml title="moon.yml" {4-6} +Glob patterns support +[project and workspace relative file/folder patterns](../concepts/file-pattern#project-relative). +They can be defined as a literal path, or a `glob://` URI , +or as an object with a `glob` property . + +```yaml title="moon.yml" tasks: - build: - command: 'webpack' - outputs: + example: + inputs: + # Literal paths - 'build/**/*.js' - '!build/internal.js' + # Using glob protocol + - 'glob://build/**/*.js' + # Using an object + - glob: 'build/**/*.js' ``` -:::caution +:::warning + +Glob patterns that contain `?`, for example `*.tsx?`, cannot be used in URI format, as it conflicts +with the query string syntax. Use the path or object format instead. + +::: + +:::danger When using globs and moon hydrates an output (a cache hit), all files not matching the glob will be **deleted**. Ensure that all files critical for the build to function correctly are included. diff --git a/website/static/schemas/project.json b/website/static/schemas/project.json index 01f11fa95f7..782e8ee290e 100644 --- a/website/static/schemas/project.json +++ b/website/static/schemas/project.json @@ -205,6 +205,7 @@ "properties": { "as": { "title": "as", + "description": "Format to resolve the file group into.", "default": "static", "allOf": [ { @@ -214,6 +215,7 @@ }, "format": { "title": "format", + "description": "Format to resolve the file group into.", "default": "static", "allOf": [ { @@ -223,6 +225,7 @@ }, "group": { "title": "group", + "description": "The file group identifier.", "allOf": [ { "$ref": "#/definitions/Id" @@ -233,7 +236,7 @@ "additionalProperties": false }, "FileGroupInputFormat": { - "description": "Format to resolve the file group into.", + "description": "Available formats to resolve the file group into.", "type": "string", "enum": [ "static", @@ -250,6 +253,7 @@ "properties": { "content": { "title": "content", + "description": "Regex pattern to match the file's contents against when determining affected status.", "anyOf": [ { "type": "string", @@ -262,10 +266,36 @@ }, "file": { "title": "file", + "description": "The literal file path.", "type": "string" }, "optional": { "title": "optional", + "description": "Mark the file as optional instead of logging a warning when hashing a task.", + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + }, + "FileOutput": { + "description": "A file path output.", + "type": "object", + "properties": { + "file": { + "title": "file", + "description": "The literal file path.", + "type": "string" + }, + "optional": { + "title": "optional", + "description": "Mark the file as optional instead of failing with an error after running a task and the output doesn't exist.", "anyOf": [ { "type": "boolean" @@ -279,16 +309,30 @@ "additionalProperties": false }, "GlobInput": { - "description": "A glob path input.", + "description": "A glob pattern input.", "type": "object", "properties": { "cache": { "title": "cache", + "description": "Cache the glob walking result for increased performance.", "default": true, "type": "boolean" }, "glob": { "title": "glob", + "description": "The glob pattern.", + "type": "string" + } + }, + "additionalProperties": false + }, + "GlobOutput": { + "description": "A glob pattern output.", + "type": "object", + "properties": { + "glob": { + "title": "glob", + "description": "The glob pattern.", "type": "string" } }, @@ -380,6 +424,19 @@ "unknown" ] }, + "Output": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/FileOutput" + }, + { + "$ref": "#/definitions/GlobOutput" + } + ] + }, "OwnersConfig": { "description": "Defines ownership of source code within the current project, by mapping file paths and globs to owners. An owner is either a user, team, or group.", "type": "object", @@ -633,6 +690,7 @@ "properties": { "fileGroup": { "title": "fileGroup", + "description": "A file group identifier within the project in which to determine affected status.", "anyOf": [ { "$ref": "#/definitions/Id" @@ -644,6 +702,7 @@ }, "filter": { "title": "filter", + "description": "A list of globs, relative from the project's root, in which to determine affected status.", "type": "array", "items": { "type": "string" @@ -651,6 +710,7 @@ }, "group": { "title": "group", + "description": "A file group identifier within the project in which to determine affected status.", "anyOf": [ { "$ref": "#/definitions/Id" @@ -662,6 +722,7 @@ }, "project": { "title": "project", + "description": "The external project identifier.", "type": "string" } }, @@ -1114,7 +1175,7 @@ { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Output" } }, { diff --git a/website/static/schemas/tasks.json b/website/static/schemas/tasks.json index 56d3d3e1e67..79057511702 100644 --- a/website/static/schemas/tasks.json +++ b/website/static/schemas/tasks.json @@ -95,6 +95,7 @@ "properties": { "as": { "title": "as", + "description": "Format to resolve the file group into.", "default": "static", "allOf": [ { @@ -104,6 +105,7 @@ }, "format": { "title": "format", + "description": "Format to resolve the file group into.", "default": "static", "allOf": [ { @@ -113,6 +115,7 @@ }, "group": { "title": "group", + "description": "The file group identifier.", "allOf": [ { "$ref": "#/definitions/Id" @@ -123,7 +126,7 @@ "additionalProperties": false }, "FileGroupInputFormat": { - "description": "Format to resolve the file group into.", + "description": "Available formats to resolve the file group into.", "type": "string", "enum": [ "static", @@ -140,6 +143,7 @@ "properties": { "content": { "title": "content", + "description": "Regex pattern to match the file's contents against when determining affected status.", "anyOf": [ { "type": "string", @@ -152,10 +156,36 @@ }, "file": { "title": "file", + "description": "The literal file path.", "type": "string" }, "optional": { "title": "optional", + "description": "Mark the file as optional instead of logging a warning when hashing a task.", + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + }, + "FileOutput": { + "description": "A file path output.", + "type": "object", + "properties": { + "file": { + "title": "file", + "description": "The literal file path.", + "type": "string" + }, + "optional": { + "title": "optional", + "description": "Mark the file as optional instead of failing with an error after running a task and the output doesn't exist.", "anyOf": [ { "type": "boolean" @@ -169,16 +199,30 @@ "additionalProperties": false }, "GlobInput": { - "description": "A glob path input.", + "description": "A glob pattern input.", "type": "object", "properties": { "cache": { "title": "cache", + "description": "Cache the glob walking result for increased performance.", "default": true, "type": "boolean" }, "glob": { "title": "glob", + "description": "The glob pattern.", + "type": "string" + } + }, + "additionalProperties": false + }, + "GlobOutput": { + "description": "A glob pattern output.", + "type": "object", + "properties": { + "glob": { + "title": "glob", + "description": "The glob pattern.", "type": "string" } }, @@ -206,6 +250,19 @@ } ] }, + "Output": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/FileOutput" + }, + { + "$ref": "#/definitions/GlobOutput" + } + ] + }, "PlatformType": { "description": "Platforms that each programming language can belong to.", "type": "string", @@ -225,6 +282,7 @@ "properties": { "fileGroup": { "title": "fileGroup", + "description": "A file group identifier within the project in which to determine affected status.", "anyOf": [ { "$ref": "#/definitions/Id" @@ -236,6 +294,7 @@ }, "filter": { "title": "filter", + "description": "A list of globs, relative from the project's root, in which to determine affected status.", "type": "array", "items": { "type": "string" @@ -243,6 +302,7 @@ }, "group": { "title": "group", + "description": "A file group identifier within the project in which to determine affected status.", "anyOf": [ { "$ref": "#/definitions/Id" @@ -254,6 +314,7 @@ }, "project": { "title": "project", + "description": "The external project identifier.", "type": "string" } }, @@ -400,7 +461,7 @@ { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/Output" } }, { From 7ffdddd4910496a3e7a010e9d9b0f68a39cc7e6d Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Mon, 29 Sep 2025 12:14:54 -0700 Subject: [PATCH 12/12] docs: Add v1.41 blog post. (#2142) * Update deps. * Start on docs. * Improve hashing. * Polish. * Fix tests. --- Cargo.lock | 298 +++++++++---------- Cargo.toml | 4 +- crates/actions/src/actions/run_task.rs | 2 +- crates/file-group/src/file_group.rs | 31 +- crates/mcp/Cargo.toml | 3 +- crates/mcp/src/mcp.rs | 7 +- crates/process/Cargo.toml | 4 +- crates/query/Cargo.toml | 4 +- crates/remote/Cargo.toml | 4 +- crates/task-hasher/Cargo.toml | 2 + crates/task-hasher/src/task_hasher.rs | 88 ++++-- crates/task-hasher/tests/task_hasher_test.rs | 195 ++++++------ crates/task-runner/Cargo.toml | 1 + crates/task-runner/src/output_archiver.rs | 16 +- crates/task-runner/src/output_hydrater.rs | 13 +- crates/task-runner/src/task_hashing.rs | 6 +- crates/task-runner/src/task_runner.rs | 51 ++-- crates/task-runner/tests/utils.rs | 12 +- crates/vcs/Cargo.toml | 2 +- crates/vcs/src/git.rs | 7 +- crates/vcs/src/gitx/git.rs | 7 +- website/blog/2025-09-28_moon-v1.41.mdx | 161 ++++++++++ website/blog/img/moon/v1.41.png | Bin 0 -> 1014624 bytes website/docs/config/project.mdx | 25 ++ 24 files changed, 602 insertions(+), 341 deletions(-) create mode 100644 website/blog/2025-09-28_moon-v1.41.mdx create mode 100644 website/blog/img/moon/v1.41.png diff --git a/Cargo.lock b/Cargo.lock index cba5420ff0d..08cdf3c39f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,9 +86,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -398,9 +398,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +checksum = "98e529aee37b5c8206bb4bf4c44797127566d72f76952c970bd3d1e85de8f4e2" dependencies = [ "axum-core", "bytes", @@ -414,8 +414,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "sync_wrapper", "tower", "tower-layer", @@ -424,9 +423,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +checksum = "0ac7a6beb1182c7e30253ee75c3e918080bfb83f5a3023bcdf7209d85fd147e6" dependencies = [ "bytes", "futures-core", @@ -435,7 +434,6 @@ dependencies = [ "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -485,15 +483,16 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bazel-remote-apis" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6867061593bdc5b0e05bf212a0734f6e351fb4885ede8dbf302217d65379f80f" +checksum = "e57930c9446b6c677933ca5fbad18cd1e874d31acd01d07898b0e6d6edc75725" dependencies = [ "pbjson", "pbjson-types", - "prost 0.13.5", + "prost", "serde", "tonic", + "tonic-prost", ] [[package]] @@ -667,7 +666,7 @@ dependencies = [ "cached_proc_macro_types", "hashbrown 0.15.5", "once_cell", - "thiserror 2.0.16", + "thiserror 2.0.17", "web-time", ] @@ -1017,7 +1016,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -1535,7 +1534,7 @@ dependencies = [ "deno_semver", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -1551,7 +1550,7 @@ dependencies = [ "monch", "once_cell", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", ] @@ -1913,7 +1912,7 @@ dependencies = [ "base64 0.22.1", "bytemuck", "extism-convert-macros", - "prost 0.14.1", + "prost", "rmp-serde", "serde", "serde_json", @@ -2322,12 +2321,13 @@ checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "git-url-parse" -version = "0.4.6" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7b317d596ee92449fde128f598e56e2d75aaa9436a3db7620dd3c0bb3e1543" +checksum = "8df306e4dfc91752e89b74c88ee876c8518890600f82255254828f9192dd003c" dependencies = [ - "strum", - "thiserror 2.0.16", + "getset", + "nom 8.0.0", + "thiserror 2.0.17", "url", ] @@ -2614,7 +2614,7 @@ dependencies = [ "similar", "stringmetrics", "tabwriter", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "url", @@ -2729,7 +2729,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", + "socket2", "system-configuration", "tokio", "tower-service", @@ -2948,9 +2948,9 @@ dependencies = [ [[package]] name = "iocraft" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de67d28a265c69edcdf7bb3d7de3682e6254c7a8292664a4505c98fd58e36fc6" +checksum = "0e963ffa29832ebf7c92bce51b894a83bb845134748b812a65d4025ebc95c714" dependencies = [ "any_key", "bitflags", @@ -3201,9 +3201,9 @@ dependencies = [ [[package]] name = "liblzma" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10bf66f4598dc77ff96677c8e763655494f00ff9c1cf79e2eb5bb07bc31f807d" +checksum = "73c36d08cad03a3fbe2c4e7bb3a9e84c57e4ee4135ed0b065cade3d98480c648" dependencies = [ "liblzma-sys", ] @@ -3596,7 +3596,7 @@ dependencies = [ "rustc-hash", "starbase_sandbox", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -3807,7 +3807,7 @@ dependencies = [ "starbase_styles", "starbase_utils", "tera", - "thiserror 2.0.16", + "thiserror 2.0.17", "tiny_http", "tokio", "tracing", @@ -3832,7 +3832,7 @@ version = "0.0.1" dependencies = [ "miette 7.6.0", "shell-words", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -3986,7 +3986,7 @@ dependencies = [ "starbase_sandbox", "starbase_utils", "tera", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "url", @@ -4018,7 +4018,7 @@ dependencies = [ "serde", "starbase_id", "starbase_styles", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -4198,7 +4198,7 @@ dependencies = [ "serde", "starbase_sandbox", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -4273,7 +4273,7 @@ dependencies = [ "rust-mcp-sdk", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -4459,7 +4459,7 @@ dependencies = [ "starbase_sandbox", "starbase_styles", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "warpgate", @@ -4479,10 +4479,10 @@ dependencies = [ "rustc-hash", "starbase_shell", "system_env", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.1", ] [[package]] @@ -4495,7 +4495,7 @@ dependencies = [ "moon_file_group", "moon_task", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -4526,7 +4526,7 @@ dependencies = [ "moon_common", "moon_config", "moon_project", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -4540,7 +4540,7 @@ dependencies = [ "rustc-hash", "starbase_sandbox", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -4565,7 +4565,7 @@ dependencies = [ "starbase_events", "starbase_sandbox", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -4648,7 +4648,7 @@ dependencies = [ "pest", "pest_derive", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -4675,7 +4675,7 @@ dependencies = [ "serde", "sha2", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tokio-util", "tonic", @@ -4780,7 +4780,7 @@ dependencies = [ "regex", "schematic", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -4825,7 +4825,7 @@ dependencies = [ "moon_toolchain_plugin", "rustc-hash", "starbase_sandbox", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -4852,7 +4852,7 @@ dependencies = [ "rustc-hash", "starbase_sandbox", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -4871,7 +4871,7 @@ dependencies = [ "moon_task_expander", "petgraph 0.8.2", "rustc-hash", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -4880,12 +4880,14 @@ name = "moon_task_hasher" version = "0.0.1" dependencies = [ "miette 7.6.0", + "moon_app_context", "moon_common", "moon_config", "moon_env_var", "moon_feature_flags", "moon_hash", "moon_project", + "moon_project_graph", "moon_task", "moon_test_utils2", "moon_vcs", @@ -4893,7 +4895,7 @@ dependencies = [ "serde", "starbase_sandbox", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -4919,6 +4921,7 @@ dependencies = [ "moon_platform", "moon_process", "moon_project", + "moon_project_graph", "moon_remote", "moon_task", "moon_task_hasher", @@ -4931,7 +4934,7 @@ dependencies = [ "starbase_archive", "starbase_sandbox", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tokio-util", "tracing", @@ -5009,7 +5012,7 @@ dependencies = [ "proto_core", "rustc-hash", "starbase_styles", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "warpgate", ] @@ -5086,7 +5089,7 @@ dependencies = [ "serde", "starbase_sandbox", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -5136,7 +5139,7 @@ dependencies = [ "serde", "starbase_events", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -5207,7 +5210,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -5391,7 +5394,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "unicase", @@ -5411,7 +5414,7 @@ dependencies = [ "serde_json", "strum", "strum_macros", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -5529,9 +5532,9 @@ dependencies = [ [[package]] name = "owo-colors" -version = "4.2.2" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" [[package]] name = "package-lock-json-parser" @@ -5606,37 +5609,37 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pbjson" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68" +checksum = "898bac3fa00d0ba57a4e8289837e965baa2dee8c3749f3b11d45a64b4223d9c3" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "serde", ] [[package]] name = "pbjson-build" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9" +checksum = "af22d08a625a2213a78dbb0ffa253318c5c79ce3133d32d296655a7bdfb02095" dependencies = [ "heck", - "itertools 0.13.0", - "prost 0.13.5", + "itertools 0.14.0", + "prost", "prost-types", ] [[package]] name = "pbjson-types" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54e5e7bfb1652f95bc361d76f3c780d8e526b134b85417e774166ee941f0887" +checksum = "8e748e28374f10a330ee3bb9f29b828c0ac79831a32bab65015ad9b661ead526" dependencies = [ "bytes", "chrono", "pbjson", "pbjson-build", - "prost 0.13.5", + "prost", "prost-build", "serde", ] @@ -5689,7 +5692,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e0a3a33733faeaf8651dfee72dd0f388f0c8e5ad496a3478fa5a922f49cfa8" dependencies = [ "memchr", - "thiserror 2.0.16", + "thiserror 2.0.17", "ucd-trie", ] @@ -5996,16 +5999,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive 0.13.5", -] - [[package]] name = "prost" version = "0.14.1" @@ -6013,14 +6006,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" dependencies = [ "bytes", - "prost-derive 0.14.1", + "prost-derive", ] [[package]] name = "prost-build" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" dependencies = [ "heck", "itertools 0.14.0", @@ -6029,26 +6022,13 @@ dependencies = [ "once_cell", "petgraph 0.7.1", "prettyplease", - "prost 0.13.5", + "prost", "prost-types", "regex", "syn", "tempfile", ] -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "prost-derive" version = "0.14.1" @@ -6064,11 +6044,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" dependencies = [ - "prost 0.13.5", + "prost", ] [[package]] @@ -6103,7 +6083,7 @@ dependencies = [ "starbase_styles", "starbase_utils", "system_env", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "toml_edit 0.23.6", "tracing", @@ -6126,7 +6106,7 @@ dependencies = [ "serde", "serde_json", "system_env", - "thiserror 2.0.16", + "thiserror 2.0.17", "version_spec", "warpgate_api", ] @@ -6186,7 +6166,7 @@ dependencies = [ "pep440_rs", "pep508_rs", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", "toml 0.9.7", ] @@ -6212,8 +6192,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.0", - "thiserror 2.0.16", + "socket2", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -6234,7 +6214,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.16", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -6249,16 +6229,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.0", + "socket2", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -6376,7 +6356,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -6601,27 +6581,29 @@ dependencies = [ [[package]] name = "rust-mcp-sdk" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40acb5c1ee4f48c371dd35cef775b267eabc634573f053919eec0c34afc18bfe" +checksum = "961ec01d0bedecf488388e6b1cf04170f9badab4927061c6592ffa385c02c6c9" dependencies = [ "async-trait", + "base64 0.22.1", "futures", "rust-mcp-macros", "rust-mcp-schema", "rust-mcp-transport", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", + "uuid", ] [[package]] name = "rust-mcp-transport" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307ca48118e5525e3a08785b8e41901bedfd02ecf7d67beeb2d4ab9384d27a7e" +checksum = "35feabc5e4667019dc262178724c94cbced6f43959af15e214b52f79243f55ed" dependencies = [ "async-trait", "bytes", @@ -6629,7 +6611,7 @@ dependencies = [ "rust-mcp-schema", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -6718,7 +6700,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.0", + "security-framework 3.5.1", ] [[package]] @@ -6755,7 +6737,7 @@ dependencies = [ "rustls-native-certs", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework 3.5.0", + "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs", "windows-sys 0.59.0", @@ -6868,7 +6850,7 @@ dependencies = [ "serde_path_to_error", "serde_yml", "starbase_styles", - "thiserror 2.0.16", + "thiserror 2.0.17", "toml 0.9.7", "tracing", ] @@ -6936,9 +6918,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags", "core-foundation 0.10.1", @@ -6969,9 +6951,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -6989,18 +6971,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.227" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -7294,16 +7276,6 @@ dependencies = [ "serde", ] -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "socket2" version = "0.6.0" @@ -7374,7 +7346,7 @@ dependencies = [ "rustc-hash", "starbase_styles", "starbase_utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", "zip", "zstd", @@ -7391,7 +7363,7 @@ dependencies = [ "miette 7.6.0", "parking_lot", "starbase_styles", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -7419,7 +7391,7 @@ dependencies = [ "regex", "schematic", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7458,7 +7430,7 @@ dependencies = [ "regex", "shell-quote", "sysinfo", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", ] @@ -7494,7 +7466,7 @@ dependencies = [ "serde_json", "serde_yml", "starbase_styles", - "thiserror 2.0.16", + "thiserror 2.0.17", "toml 0.9.7", "tracing", "url", @@ -7524,9 +7496,6 @@ name = "strum" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] [[package]] name = "strum_macros" @@ -7660,7 +7629,7 @@ dependencies = [ "serde", "serde_json", "shell-words", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7698,7 +7667,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9" dependencies = [ "quick-xml", - "thiserror 2.0.16", + "thiserror 2.0.17", "windows 0.61.3", "windows-version", ] @@ -7784,11 +7753,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -7804,9 +7773,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -7905,7 +7874,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2 0.6.0", + "socket2", "tokio-macros", "tracing", "windows-sys 0.59.0", @@ -8061,9 +8030,9 @@ checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" [[package]] name = "tonic" -version = "0.13.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9" +checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" dependencies = [ "async-trait", "axum", @@ -8079,9 +8048,9 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "prost 0.13.5", "rustls-native-certs", - "socket2 0.5.10", + "socket2", + "sync_wrapper", "tokio", "tokio-rustls", "tokio-stream", @@ -8091,6 +8060,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "tonic-prost" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +dependencies = [ + "bytes", + "prost", + "tonic", +] + [[package]] name = "tower" version = "0.5.2" @@ -8510,7 +8490,7 @@ dependencies = [ "schematic", "semver", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -8569,7 +8549,7 @@ dependencies = [ "starbase_styles", "starbase_utils", "system_env", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "ureq", @@ -8590,7 +8570,7 @@ dependencies = [ "serde_json", "starbase_id", "system_env", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -9765,7 +9745,7 @@ checksum = "46a94a329f3c1ca33731094a08af14c21180556c86292842c57c150a7bd87b59" dependencies = [ "nom 8.0.0", "nom-language", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f11313dde46..770bea978e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ convert_case = "0.8.0" dirs = "6.0.0" futures = "0.3.31" indexmap = "2.11.4" -iocraft = "0.7.11" +iocraft = "0.7.13" md5 = "0.8.0" miette = "7.6.0" pathdiff = "0.2.3" @@ -59,7 +59,7 @@ schematic = { version = "0.18.12", default-features = false, features = [ ] } serial_test = "3.2.0" semver = "1.0.27" -serde = { version = "1.0.227", features = ["derive"] } +serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.145" serde_yml = "0.0.12" sha2 = "0.10.9" diff --git a/crates/actions/src/actions/run_task.rs b/crates/actions/src/actions/run_task.rs index 14ded7b6633..4e874bb8fda 100644 --- a/crates/actions/src/actions/run_task.rs +++ b/crates/actions/src/actions/run_task.rs @@ -23,7 +23,7 @@ pub async fn run_task( // and error is bubbled up the stack action.allow_failure = task.options.allow_failure; - let result = TaskRunner::new(&app_context, &project, &task)? + let result = TaskRunner::new(&app_context, &workspace_graph.projects, &project, &task)? .run(&action_context, &action.node) .await?; diff --git a/crates/file-group/src/file_group.rs b/crates/file-group/src/file_group.rs index 0b0ace3c1f8..e44a6d7fe0b 100644 --- a/crates/file-group/src/file_group.rs +++ b/crates/file-group/src/file_group.rs @@ -6,7 +6,7 @@ use moon_config::Input; use moon_feature_flags::glob_walk_with_options; use serde::{Deserialize, Serialize}; use starbase_utils::glob::{self, GlobWalkOptions}; -use std::path::Path; +use std::path::{Path, PathBuf}; #[derive(Clone, Debug, Default, Deserialize, Serialize)] #[serde(default)] @@ -148,12 +148,30 @@ impl FileGroup { Ok(".".into()) } - fn walk( + pub fn walk( &self, is_dir: bool, workspace_root: &Path, loose_check: bool, ) -> miette::Result> { + self.walk_absolute(is_dir, workspace_root, loose_check) + .map(|files| { + files + .into_iter() + .filter_map(|file| match file.strip_prefix(workspace_root) { + Ok(suffix) => WorkspaceRelativePathBuf::from_path(suffix).ok(), + Err(_) => None, + }) + .collect::>() + }) + } + + pub fn walk_absolute( + &self, + is_dir: bool, + workspace_root: &Path, + loose_check: bool, + ) -> miette::Result> { let mut list = vec![]; for path in &self.files { @@ -168,7 +186,7 @@ impl FileGroup { } if allowed { - list.push(path.to_owned()); + list.push(file); } } @@ -186,12 +204,7 @@ impl FileGroup { }; if allowed { - list.push( - WorkspaceRelativePathBuf::from_path( - path.strip_prefix(workspace_root).unwrap(), - ) - .unwrap(), - ); + list.push(path); } } } diff --git a/crates/mcp/Cargo.toml b/crates/mcp/Cargo.toml index 7c584c49655..03f4444c325 100644 --- a/crates/mcp/Cargo.toml +++ b/crates/mcp/Cargo.toml @@ -19,9 +19,10 @@ moon_task = { version = "0.2.0", path = "../task" } moon_workspace_graph = { path = "../workspace-graph" } async-trait = { workspace = true } miette = { workspace = true } -rust-mcp-sdk = { version = "0.6.0", default-features = false, features = [ +rust-mcp-sdk = { version = "0.7.0", default-features = false, features = [ "macros", "server", + "stdio", "2025_06_18", ] } serde = { workspace = true } diff --git a/crates/mcp/src/mcp.rs b/crates/mcp/src/mcp.rs index 40e186ad1c2..11461d481ce 100644 --- a/crates/mcp/src/mcp.rs +++ b/crates/mcp/src/mcp.rs @@ -26,7 +26,7 @@ impl ServerHandler for MoonMcpHandler { async fn handle_list_tools_request( &self, _request: ListToolsRequest, - _runtime: &dyn McpServer, + _runtime: Arc, ) -> Result { Ok(ListToolsResult { meta: None, @@ -38,7 +38,7 @@ impl ServerHandler for MoonMcpHandler { async fn handle_call_tool_request( &self, request: CallToolRequest, - _runtime: &dyn McpServer, + _runtime: Arc, ) -> std::result::Result { let tool_params: MoonTools = MoonTools::try_from(request.params).map_err(CallToolError::new)?; @@ -94,7 +94,8 @@ pub async fn run_mcp( }; // STEP 4: Create the MCP runtime - let server: ServerRuntime = server_runtime::create_server(server_details, transport, handler); + let server: Arc = + server_runtime::create_server(server_details, transport, handler); // STEP 5: Start the server server.start().await diff --git a/crates/process/Cargo.toml b/crates/process/Cargo.toml index 0c60b91b413..ee851570137 100644 --- a/crates/process/Cargo.toml +++ b/crates/process/Cargo.toml @@ -23,10 +23,10 @@ tracing = { workspace = true } tokio = { workspace = true, features = ["io-util", "signal", "sync"] } [target.'cfg(unix)'.dependencies] -libc = "0.2.174" +libc = "0.2.176" [target.'cfg(windows)'.dependencies] -windows-sys = { version = "0.60.2", default-features = false, features = [ +windows-sys = { version = "0.61.1", default-features = false, features = [ # "Win32_System_Console", "Win32_System_Threading", ] } diff --git a/crates/query/Cargo.toml b/crates/query/Cargo.toml index a5847d50d82..c0e253533fa 100644 --- a/crates/query/Cargo.toml +++ b/crates/query/Cargo.toml @@ -12,8 +12,8 @@ publish = false moon_common = { path = "../common" } moon_config = { path = "../config" } miette = { workspace = true } -pest = "2.8.1" -pest_derive = "2.8.1" +pest = "2.8.2" +pest_derive = "2.8.2" starbase_utils = { workspace = true, features = ["glob"] } thiserror = { workspace = true } tracing = { workspace = true } diff --git a/crates/remote/Cargo.toml b/crates/remote/Cargo.toml index 537294bb453..80321775061 100644 --- a/crates/remote/Cargo.toml +++ b/crates/remote/Cargo.toml @@ -13,7 +13,7 @@ moon_feature_flags = { path = "../feature-flags" } moon_process = { path = "../process" } moon_task = { path = "../task" } async-trait = { workspace = true } -bazel-remote-apis = { version = "0.18.0", features = ["serde"] } +bazel-remote-apis = { version = "0.20.0", features = ["serde"] } chrono = { workspace = true } miette = { workspace = true } reqwest = { workspace = true, features = ["json", "rustls-tls"] } @@ -32,7 +32,7 @@ zstd = "0.13.3" # gRPC async-stream = "0.3.6" http = "1.3.1" -tonic = { version = "0.13.1", default-features = false, features = [ +tonic = { version = "0.14.2", default-features = false, features = [ "channel", "codegen", "gzip", diff --git a/crates/task-hasher/Cargo.toml b/crates/task-hasher/Cargo.toml index b23533de437..d5ca2be1054 100644 --- a/crates/task-hasher/Cargo.toml +++ b/crates/task-hasher/Cargo.toml @@ -9,12 +9,14 @@ repository = "https://github.com/moonrepo/moon" publish = false [dependencies] +moon_app_context = { path = "../app-context" } moon_common = { path = "../common" } moon_config = { path = "../config" } moon_env_var = { path = "../env-var" } moon_feature_flags = { path = "../feature-flags" } moon_hash = { path = "../hash" } moon_project = { path = "../project" } +moon_project_graph = { path = "../project-graph" } moon_task = { path = "../task" } moon_vcs = { path = "../vcs" } miette = { workspace = true } diff --git a/crates/task-hasher/src/task_hasher.rs b/crates/task-hasher/src/task_hasher.rs index 20a7a68ac65..a167691a4b0 100644 --- a/crates/task-hasher/src/task_hasher.rs +++ b/crates/task-hasher/src/task_hasher.rs @@ -1,43 +1,45 @@ use crate::task_hash::TaskHash; use crate::task_hasher_error::TaskHasherError; use miette::IntoDiagnostic; +use moon_app_context::AppContext; use moon_common::path::{PathExt, WorkspaceRelativePath, WorkspaceRelativePathBuf}; use moon_common::{color, is_ci}; -use moon_config::{HasherConfig, HasherWalkStrategy}; +use moon_config::{HasherConfig, HasherWalkStrategy, Input, ProjectInput}; use moon_env_var::GlobalEnvBag; +use moon_feature_flags::glob_walk_with_options; use moon_project::Project; +use moon_project_graph::ProjectGraph; use moon_task::{Target, Task}; -use moon_vcs::BoxedVcs; use rustc_hash::{FxHashMap, FxHashSet}; -use starbase_utils::glob::GlobSet; -use std::path::{Path, PathBuf}; +use starbase_utils::glob::{GlobSet, GlobWalkOptions}; +use std::path::PathBuf; use tracing::{trace, warn}; // Hash all inputs for a task, but exclude outputs and moon specific configuration files! pub struct TaskHasher<'task> { - pub hasher_config: &'task HasherConfig, + pub app_context: &'task AppContext, + pub project_graph: &'task ProjectGraph, pub project: &'task Project, pub task: &'task Task, - pub vcs: &'task BoxedVcs, - pub workspace_root: &'task Path, + pub hasher_config: &'task HasherConfig, content: TaskHash<'task>, } impl<'task> TaskHasher<'task> { pub fn new( + app_context: &'task AppContext, + project_graph: &'task ProjectGraph, project: &'task Project, task: &'task Task, - vcs: &'task BoxedVcs, - workspace_root: &'task Path, hasher_config: &'task HasherConfig, ) -> Self { Self { - hasher_config, + app_context, project, + project_graph, task, - vcs, - workspace_root, + hasher_config, content: TaskHash::new(project, task), } } @@ -71,10 +73,10 @@ impl<'task> TaskHasher<'task> { let absolute_inputs = self.aggregate_inputs().await?; let processed_inputs = self.process_inputs(absolute_inputs)?; - if !processed_inputs.is_empty() && self.vcs.is_enabled() { + if !processed_inputs.is_empty() && self.app_context.vcs.is_enabled() { let files = processed_inputs.into_iter().collect::>(); - self.content.inputs = self.vcs.get_file_hashes(&files, true).await?; + self.content.inputs = self.app_context.vcs.get_file_hashes(&files, true).await?; } if !self.task.input_env.is_empty() { @@ -92,30 +94,36 @@ impl<'task> TaskHasher<'task> { async fn aggregate_inputs(&mut self) -> miette::Result> { let mut files = FxHashSet::default(); - let vcs_enabled = self.vcs.is_enabled(); + let vcs_enabled = self.app_context.vcs.is_enabled(); + let workspace_root = &self.app_context.workspace_root; if !self.task.input_files.is_empty() { for file in self.task.input_files.keys() { - files.insert(file.to_logical_path(self.workspace_root)); + files.insert(file.to_logical_path(workspace_root)); } } if !self.task.input_globs.is_empty() { - let use_globs = self.project.root == self.workspace_root + let use_globs = &self.project.root == workspace_root || matches!(self.hasher_config.walk_strategy, HasherWalkStrategy::Glob) || !vcs_enabled; // Collect inputs by walking and globbing the file system if use_globs { files.extend(self.task.get_input_files_with_globs( - self.workspace_root, + workspace_root, self.task.input_globs.iter().collect(), )?); } // Collect inputs by querying VCS which is faster than globbing else { - for file in self.vcs.get_file_tree(&self.project.source).await? { - files.insert(file.to_logical_path(self.workspace_root)); + for file in self + .app_context + .vcs + .get_file_tree(&self.project.source) + .await? + { + files.insert(file.to_logical_path(workspace_root)); } // However that completely ignores workspace level globs, @@ -130,17 +138,25 @@ impl<'task> TaskHasher<'task> { if !workspace_globs.is_empty() { files.extend( self.task - .get_input_files_with_globs(self.workspace_root, workspace_globs)?, + .get_input_files_with_globs(workspace_root, workspace_globs)?, ); } } } + for input in &self.task.inputs { + if let Input::Project(inner) = &input + && !inner.is_all_deps() + { + files.extend(self.aggregate_inputs_from_project(inner).await?); + } + } + // Include local file changes so that development builds work. // Also run this LAST as it should take highest precedence! if !is_ci() && vcs_enabled { - for local_file in self.vcs.get_touched_files().await?.all() { - let abs_file = local_file.to_logical_path(self.workspace_root); + for local_file in self.app_context.vcs.get_touched_files().await?.all() { + let abs_file = local_file.to_logical_path(workspace_root); // Deleted files are listed in `git status` but are // not valid inputs, so avoid hashing them! @@ -157,6 +173,30 @@ impl<'task> TaskHasher<'task> { Ok(files) } + async fn aggregate_inputs_from_project( + &mut self, + input: &ProjectInput, + ) -> miette::Result> { + let mut files = FxHashSet::default(); + let project = self.project_graph.get(&input.project)?; + + if let Some(group_id) = &input.group { + files.extend(project.get_file_group(group_id)?.walk_absolute( + false, + &self.app_context.workspace_root, + false, + )?) + } else if !input.filter.is_empty() { + files.extend(glob_walk_with_options( + &project.root, + &input.filter, + GlobWalkOptions::default().cache().files(), + )?); + } + + Ok(files) + } + fn is_valid_input_source( &self, sources_globset: &GlobSet, @@ -201,7 +241,7 @@ impl<'task> TaskHasher<'task> { // We need to use relative paths from the workspace root // so that it works the same across all machines let rel_path = abs_path - .relative_to(self.workspace_root) + .relative_to(&self.app_context.workspace_root) .into_diagnostic()?; if has_globs && !self.is_valid_input_source(&globset, &rel_path) { diff --git a/crates/task-hasher/tests/task_hasher_test.rs b/crates/task-hasher/tests/task_hasher_test.rs index 5cf4cec769b..8bf78306502 100644 --- a/crates/task-hasher/tests/task_hasher_test.rs +++ b/crates/task-hasher/tests/task_hasher_test.rs @@ -1,10 +1,12 @@ +use moon_app_context::AppContext; +use moon_common::path::WorkspaceRelativePathBuf; use moon_config::{GlobPath, HasherConfig, HasherWalkStrategy, PortablePath}; use moon_project::Project; use moon_task::Task; use moon_task_hasher::{TaskHash, TaskHasher}; use moon_test_utils2::{WorkspaceGraph, WorkspaceMocker}; -use moon_vcs::BoxedVcs; use starbase_sandbox::create_sandbox; +use std::collections::BTreeMap; use std::fs; use std::path::Path; @@ -31,7 +33,7 @@ fn create_hasher_configs() -> (HasherConfig, HasherConfig) { ) } -async fn mock_workspace(workspace_root: &Path) -> (WorkspaceGraph, BoxedVcs) { +async fn mock_workspace(workspace_root: &Path) -> (WorkspaceGraph, AppContext) { create_out_files(workspace_root); let mock = WorkspaceMocker::new(workspace_root) @@ -41,21 +43,28 @@ async fn mock_workspace(workspace_root: &Path) -> (WorkspaceGraph, BoxedVcs) { .with_inherited_tasks() .with_global_envs(); - (mock.mock_workspace_graph().await, mock.mock_vcs_adapter()) + (mock.mock_workspace_graph().await, mock.mock_app_context()) } async fn generate_hash<'a>( project: &'a Project, task: &'a Task, - vcs: &'a BoxedVcs, - workspace_root: &'a Path, - hasher_config: &'a HasherConfig, + wg: &'a WorkspaceGraph, + app: &'a AppContext, + config: &'a HasherConfig, ) -> TaskHash<'a> { - let mut hasher = TaskHasher::new(project, task, vcs, workspace_root, hasher_config); + let mut hasher = TaskHasher::new(app, &wg.projects, project, task, config); hasher.hash_inputs().await.unwrap(); hasher.hash() } +fn get_input_files( + mut inputs: BTreeMap, +) -> Vec { + inputs.remove(&WorkspaceRelativePathBuf::from(".moon/cache/CACHEDIR.TAG")); + inputs.into_keys().collect::>() +} + mod task_hasher { use super::*; @@ -64,7 +73,7 @@ mod task_hasher { let sandbox = create_sandbox("ignore-patterns"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "testPatterns").unwrap(); @@ -73,10 +82,10 @@ mod task_hasher { ..HasherConfig::default() }; - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &hasher_config).await; + let result = generate_hash(&project, &task, &wg, &app, &hasher_config).await; assert_eq!( - result.inputs.keys().collect::>(), + get_input_files(result.inputs), [".gitignore", "package.json"] ); } @@ -89,7 +98,7 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "files").unwrap(); @@ -97,14 +106,14 @@ mod task_hasher { let expected = ["2.txt", "dir/abc.txt"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -112,7 +121,7 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "dirs").unwrap(); @@ -120,14 +129,14 @@ mod task_hasher { let expected = ["dir/abc.txt", "dir/az.txt", "dir/xyz.txt"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -135,7 +144,7 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "globStar").unwrap(); @@ -143,14 +152,14 @@ mod task_hasher { let expected = ["1.txt", "2.txt", "3.txt"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -158,7 +167,7 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "globNestedStar").unwrap(); @@ -173,14 +182,14 @@ mod task_hasher { ]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -188,7 +197,7 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "globGroup").unwrap(); @@ -196,14 +205,14 @@ mod task_hasher { let expected = ["dir/az.txt", "dir/xyz.txt"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -211,7 +220,7 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "globNegated").unwrap(); @@ -219,14 +228,14 @@ mod task_hasher { let expected = ["2.txt", "dir/abc.txt", "dir/xyz.txt"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -234,15 +243,15 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "none").unwrap(); let hasher_config = HasherConfig::default(); - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &hasher_config).await; + let result = generate_hash(&project, &task, &wg, &app, &hasher_config).await; - assert_eq!(result.inputs.keys().collect::>(), Vec::<&str>::new()); + assert_eq!(get_input_files(result.inputs), Vec::<&str>::new()); } #[tokio::test] @@ -255,15 +264,15 @@ mod task_hasher { cmd.args(["add", "created.txt", "filtered.txt"]); }); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "touched").unwrap(); let hasher_config = HasherConfig::default(); - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &hasher_config).await; + let result = generate_hash(&project, &task, &wg, &app, &hasher_config).await; - assert_eq!(result.inputs.keys().collect::>(), ["created.txt"]); + assert_eq!(get_input_files(result.inputs), ["created.txt"]); } #[tokio::test] @@ -272,7 +281,7 @@ mod task_hasher { sandbox.enable_git(); sandbox.create_file(".env", ""); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "envFile").unwrap(); @@ -280,14 +289,14 @@ mod task_hasher { let expected = [".env"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -297,7 +306,7 @@ mod task_hasher { sandbox.create_file(".env.prod", ""); sandbox.create_file(".env.local", ""); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "envFileList").unwrap(); @@ -305,14 +314,14 @@ mod task_hasher { let expected = [".env.local", ".env.prod"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -320,14 +329,14 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "moonConfig").unwrap(); let hasher_config = HasherConfig::default(); - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &hasher_config).await; + let result = generate_hash(&project, &task, &wg, &app, &hasher_config).await; - assert_eq!(result.inputs.keys().collect::>(), ["moon.yml"]); + assert_eq!(get_input_files(result.inputs), ["moon.yml"]); } #[tokio::test] @@ -336,12 +345,12 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, _) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "filesRequired").unwrap(); - generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + generate_hash(&project, &task, &wg, &app, &vcs_config).await; } #[tokio::test] @@ -349,12 +358,12 @@ mod task_hasher { let sandbox = create_sandbox("inputs"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, _) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "filesOptional").unwrap(); - let _ = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let _ = generate_hash(&project, &task, &wg, &app, &vcs_config).await; } } @@ -366,7 +375,7 @@ mod task_hasher { let sandbox = create_sandbox("output-filters"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "inFileOutFile").unwrap(); @@ -379,14 +388,14 @@ mod task_hasher { ]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -394,7 +403,7 @@ mod task_hasher { let sandbox = create_sandbox("output-filters"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "inFileOutDir").unwrap(); @@ -402,14 +411,14 @@ mod task_hasher { let expected = [".moon/toolchain.yml", ".moon/workspace.yml"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -417,7 +426,7 @@ mod task_hasher { let sandbox = create_sandbox("output-filters"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "inFileOutGlob").unwrap(); @@ -425,14 +434,14 @@ mod task_hasher { let expected = [".moon/toolchain.yml", ".moon/workspace.yml"]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -440,7 +449,7 @@ mod task_hasher { let sandbox = create_sandbox("output-filters"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "inGlobOutFile").unwrap(); @@ -456,14 +465,14 @@ mod task_hasher { ]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -471,7 +480,7 @@ mod task_hasher { let sandbox = create_sandbox("output-filters"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "inGlobOutDir").unwrap(); @@ -484,14 +493,14 @@ mod task_hasher { ]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } #[tokio::test] @@ -499,7 +508,7 @@ mod task_hasher { let sandbox = create_sandbox("output-filters"); sandbox.enable_git(); - let (wg, vcs) = mock_workspace(sandbox.path()).await; + let (wg, app) = mock_workspace(sandbox.path()).await; let (vcs_config, glob_config) = create_hasher_configs(); let project = wg.get_project("root").unwrap(); let task = wg.get_task_from_project("root", "inGlobOutGlob").unwrap(); @@ -512,14 +521,14 @@ mod task_hasher { ]; // VCS - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &vcs_config).await; + let result = generate_hash(&project, &task, &wg, &app, &vcs_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); // Glob - let result = generate_hash(&project, &task, &vcs, sandbox.path(), &glob_config).await; + let result = generate_hash(&project, &task, &wg, &app, &glob_config).await; - assert_eq!(result.inputs.keys().collect::>(), expected); + assert_eq!(get_input_files(result.inputs), expected); } } } diff --git a/crates/task-runner/Cargo.toml b/crates/task-runner/Cargo.toml index d2ee686a7cd..6968dc4d5be 100644 --- a/crates/task-runner/Cargo.toml +++ b/crates/task-runner/Cargo.toml @@ -25,6 +25,7 @@ moon_pdk_api = { path = "../pdk-api" } moon_platform = { path = "../../legacy/core/platform" } moon_process = { path = "../process" } moon_project = { path = "../project" } +moon_project_graph = { path = "../project-graph" } moon_remote = { path = "../remote" } moon_task = { path = "../task" } moon_task_hasher = { path = "../task-hasher" } diff --git a/crates/task-runner/src/output_archiver.rs b/crates/task-runner/src/output_archiver.rs index 5468715623b..62ec929d115 100644 --- a/crates/task-runner/src/output_archiver.rs +++ b/crates/task-runner/src/output_archiver.rs @@ -13,7 +13,7 @@ use tracing::{debug, instrument, warn}; /// so that subsequent builds are faster, and any local outputs /// can be hydrated easily. pub struct OutputArchiver<'task> { - pub app: &'task AppContext, + pub app_context: &'task AppContext, pub project: &'task Project, pub task: &'task Task, } @@ -26,7 +26,7 @@ impl OutputArchiver<'_> { remote_state: Option<&mut ActionState<'_>>, ) -> miette::Result> { let mut archived = false; - let archive_file = self.app.cache_engine.hash.get_archive_path(hash); + let archive_file = self.app_context.cache_engine.hash.get_archive_path(hash); // Check that outputs actually exist if self.task.is_build_type() && !self.has_outputs_been_created(false)? { @@ -39,7 +39,7 @@ impl OutputArchiver<'_> { // If so, create and pack the archive! if archive_file.exists() { archived = true; - } else if self.app.cache_engine.is_writable() { + } else if self.app_context.cache_engine.is_writable() { debug!( task_target = self.task.target.as_str(), hash, "Archiving task outputs from project" @@ -81,7 +81,7 @@ impl OutputArchiver<'_> { // Check paths first since they are literal for (output, params) in &self.task.output_files { - if !output.to_path(&self.app.workspace_root).exists() && !params.optional { + if !output.to_path(&self.app_context.workspace_root).exists() && !params.optional { return Ok(false); } } @@ -92,7 +92,7 @@ impl OutputArchiver<'_> { if has_globs && !all_negated_globs { let outputs = self .task - .get_output_files(&self.app.workspace_root, false)?; + .get_output_files(&self.app_context.workspace_root, false)?; return Ok(!outputs.is_empty()); } @@ -109,7 +109,7 @@ impl OutputArchiver<'_> { ); // Create the archiver instance based on task outputs - let mut archive = Archiver::new(&self.app.workspace_root, archive_file); + let mut archive = Archiver::new(&self.app_context.workspace_root, archive_file); for output_file in self.task.output_files.keys() { archive.add_source_file(output_file.as_str(), None); @@ -121,7 +121,7 @@ impl OutputArchiver<'_> { // Also include stdout/stderr logs in the tarball let state_dir = self - .app + .app_context .cache_engine .state .get_target_dir(&self.task.target); @@ -148,7 +148,7 @@ impl OutputArchiver<'_> { async fn upload_to_remote_service(&self, state: &mut ActionState<'_>) -> miette::Result { if let Some(remote) = RemoteService::session() { if remote.can_upload() { - state.compute_outputs(&self.app.workspace_root)?; + state.compute_outputs(&self.app_context.workspace_root)?; } match remote.save_action(state).await { diff --git a/crates/task-runner/src/output_hydrater.rs b/crates/task-runner/src/output_hydrater.rs index 53f19d977a7..005e4072fe8 100644 --- a/crates/task-runner/src/output_hydrater.rs +++ b/crates/task-runner/src/output_hydrater.rs @@ -16,7 +16,7 @@ pub enum HydrateFrom { } pub struct OutputHydrater<'task> { - pub app: &'task AppContext, + pub app_context: &'task AppContext, pub task: &'task Task, } @@ -46,10 +46,10 @@ impl OutputHydrater<'_> { // Otherwise write to local cache _ => { - let archive_file = self.app.cache_engine.hash.get_archive_path(hash); + let archive_file = self.app_context.cache_engine.hash.get_archive_path(hash); let mut hydrated = false; - if self.app.cache_engine.is_readable() { + if self.app_context.cache_engine.is_readable() { debug!( task_target = self.task.target.as_str(), hash, "Hydrating cached outputs into project" @@ -81,7 +81,7 @@ impl OutputHydrater<'_> { ); // Create the archiver instance based on task outputs - let mut archive = Archiver::new(&self.app.workspace_root, archive_file); + let mut archive = Archiver::new(&self.app_context.workspace_root, archive_file); for output_file in self.task.output_files.keys() { archive.add_source_file(output_file.as_str(), None); @@ -139,7 +139,10 @@ impl OutputHydrater<'_> { } fn delete_existing_outputs(&self) -> miette::Result<()> { - for output in self.task.get_output_files(&self.app.workspace_root, true)? { + for output in self + .task + .get_output_files(&self.app_context.workspace_root, true)? + { // Ignore failures as we don't want to crash the entire pipeline, // and in most cases, these artifacts will just be overwritten // on the next hydration anyways! diff --git a/crates/task-runner/src/task_hashing.rs b/crates/task-runner/src/task_hashing.rs index 620836c8877..dc6ea25a648 100644 --- a/crates/task-runner/src/task_hashing.rs +++ b/crates/task-runner/src/task_hashing.rs @@ -9,6 +9,7 @@ use moon_pdk_api::{ ParseLockInput, ParseLockOutput, ParseManifestInput, ParseManifestOutput, }; use moon_project::{Project, ProjectFragment}; +use moon_project_graph::ProjectGraph; use moon_task::{Task, TaskFragment}; use moon_task_hasher::TaskHasher; use moon_toolchain_plugin::ToolchainPlugin; @@ -22,16 +23,17 @@ use tokio::task::JoinSet; pub async fn hash_common_task_contents( app_context: &AppContext, action_context: &ActionContext, + project_graph: &ProjectGraph, project: &Project, task: &Task, node: &ActionNode, hasher: &mut ContentHasher, ) -> miette::Result<()> { let mut task_hasher = TaskHasher::new( + app_context, + project_graph, project, task, - &app_context.vcs, - &app_context.workspace_root, &app_context.workspace_config.hasher, ); diff --git a/crates/task-runner/src/task_runner.rs b/crates/task-runner/src/task_runner.rs index ca829ab88c0..1478af9ce97 100644 --- a/crates/task-runner/src/task_runner.rs +++ b/crates/task-runner/src/task_runner.rs @@ -13,6 +13,7 @@ use moon_console::TaskReportItem; use moon_platform::PlatformManager; use moon_process::ProcessError; use moon_project::Project; +use moon_project_graph::ProjectGraph; use moon_remote::{ActionState, Digest, RemoteService}; use moon_task::Task; use moon_time::{is_stale, now_millis}; @@ -29,7 +30,8 @@ pub struct TaskRunResult { } pub struct TaskRunner<'task> { - app: &'task Arc, + app_context: &'task Arc, + project_graph: &'task ProjectGraph, project: &'task Project, pub task: &'task Task, platform_manager: &'task PlatformManager, @@ -47,7 +49,8 @@ pub struct TaskRunner<'task> { impl<'task> TaskRunner<'task> { pub fn new( - app: &'task Arc, + app_context: &'task Arc, + project_graph: &'task ProjectGraph, project: &'task Project, task: &'task Task, ) -> miette::Result { @@ -56,7 +59,7 @@ impl<'task> TaskRunner<'task> { "Creating a task runner for target" ); - let mut cache = app + let mut cache = app_context .cache_engine .state .load_target_state::(&task.target)?; @@ -67,9 +70,14 @@ impl<'task> TaskRunner<'task> { Ok(Self { cache, - archiver: OutputArchiver { app, project, task }, - hydrater: OutputHydrater { app, task }, + archiver: OutputArchiver { + app_context, + project, + task, + }, + hydrater: OutputHydrater { app_context, task }, platform_manager: PlatformManager::read(), + project_graph, project, remote_state: None, report_item: TaskReportItem { @@ -78,7 +86,7 @@ impl<'task> TaskRunner<'task> { }, target_state: None, task, - app, + app_context, operations: OperationList::default(), }) } @@ -155,7 +163,7 @@ impl<'task> TaskRunner<'task> { self.report_item.hash = maybe_hash.clone(); - self.app.console.on_task_completed( + self.app_context.console.on_task_completed( &self.task.target, &self.operations, &self.report_item, @@ -176,7 +184,7 @@ impl<'task> TaskRunner<'task> { self.inject_failed_task_execution(Some(&error))?; - self.app.console.on_task_completed( + self.app_context.console.on_task_completed( &self.task.target, &self.operations, &self.report_item, @@ -209,7 +217,7 @@ impl<'task> TaskRunner<'task> { #[instrument(skip(self))] pub async fn is_cached(&mut self, hash: &str) -> miette::Result> { - let cache_engine = &self.app.cache_engine; + let cache_engine = &self.app_context.cache_engine; debug!( task_target = self.task.target.as_str(), @@ -219,7 +227,7 @@ impl<'task> TaskRunner<'task> { // If a lifetime has been configured, we need to check the last run and the archive // for staleness, and return a cache miss/skip let cache_lifetime = match &self.task.options.cache_lifetime { - Some(lifetime) => Some(self.app.cache_engine.parse_lifetime(lifetime)?), + Some(lifetime) => Some(self.app_context.cache_engine.parse_lifetime(lifetime)?), None => None, }; @@ -339,7 +347,7 @@ impl<'task> TaskRunner<'task> { pub fn is_cache_enabled(&self) -> bool { // If the VCS root does not exist (like in a Docker container), // we should avoid failing and simply disable caching - self.task.options.cache.is_enabled() && self.app.vcs.is_enabled() + self.task.options.cache.is_enabled() && self.app_context.vcs.is_enabled() } #[instrument(skip_all)] @@ -384,14 +392,15 @@ impl<'task> TaskRunner<'task> { "Generating a unique hash for this task" ); - let hash_engine = &self.app.cache_engine.hash; + let hash_engine = &self.app_context.cache_engine.hash; let mut hasher = hash_engine.create_hasher(node.label()); let mut operation = Operation::hash_generation(); // Hash common fields hash_common_task_contents( - self.app, + self.app_context, context, + self.project_graph, self.project, self.task, node, @@ -409,13 +418,14 @@ impl<'task> TaskRunner<'task> { self.project, node.get_runtime(), &mut hasher, - &self.app.workspace_config.hasher, + &self.app_context.workspace_config.hasher, ) .await?; } // Hash toolchain fields - hash_toolchain_task_contents(self.app, self.project, self.task, &mut hasher).await?; + hash_toolchain_task_contents(self.app_context, self.project, self.task, &mut hasher) + .await?; // Generate the hash and persist values let hash = hash_engine.save_manifest(&mut hasher)?; @@ -469,7 +479,7 @@ impl<'task> TaskRunner<'task> { ); // Build the command from the current task - let mut builder = CommandBuilder::new(self.app, self.project, self.task, node); + let mut builder = CommandBuilder::new(self.app_context, self.project, self.task, node); builder.set_platform_manager(self.platform_manager); let command = builder @@ -480,7 +490,8 @@ impl<'task> TaskRunner<'task> { .await?; // Execute the command and gather all attempts made - let executor = CommandExecutor::new(self.app, self.project, self.task, node, command); + let executor = + CommandExecutor::new(self.app_context, self.project, self.task, node, command); let result = if let Some(mutex_name) = &self.task.options.mutex { let mut operation = Operation::mutex_acquisition(); @@ -689,7 +700,7 @@ impl<'task> TaskRunner<'task> { output.exit_code = Some(self.cache.data.exit_code); let state_dir = self - .app + .app_context .cache_engine .state .get_target_dir(&self.task.target); @@ -745,7 +756,7 @@ impl<'task> TaskRunner<'task> { operation.finish(ActionStatus::Aborted); - self.app.console.on_task_finished( + self.app_context.console.on_task_finished( &self.task.target, &operation, &self.report_item, @@ -759,7 +770,7 @@ impl<'task> TaskRunner<'task> { fn persist_state(&mut self, operation: &Operation) -> miette::Result<()> { let state_dir = self - .app + .app_context .cache_engine .state .get_target_dir(&self.task.target); diff --git a/crates/task-runner/tests/utils.rs b/crates/task-runner/tests/utils.rs index 8bbe5ba9e51..5bd5101b94f 100644 --- a/crates/task-runner/tests/utils.rs +++ b/crates/task-runner/tests/utils.rs @@ -83,7 +83,7 @@ impl TaskRunnerContainer { pub fn create_archiver(&self) -> OutputArchiver<'_> { OutputArchiver { - app: &self.app_context, + app_context: &self.app_context, project: &self.project, task: &self.task, } @@ -91,7 +91,7 @@ impl TaskRunnerContainer { pub fn create_hydrator(&self) -> OutputHydrater<'_> { OutputHydrater { - app: &self.app_context, + app_context: &self.app_context, task: &self.task, } } @@ -127,7 +127,13 @@ impl TaskRunnerContainer { } pub fn create_runner(&self) -> TaskRunner<'_> { - let mut runner = TaskRunner::new(&self.app_context, &self.project, &self.task).unwrap(); + let mut runner = TaskRunner::new( + &self.app_context, + &self.workspace_graph.projects, + &self.project, + &self.task, + ) + .unwrap(); runner.set_platform_manager(&self.platform_manager); runner } diff --git a/crates/vcs/Cargo.toml b/crates/vcs/Cargo.toml index aedb07d9caa..5f444f2c246 100644 --- a/crates/vcs/Cargo.toml +++ b/crates/vcs/Cargo.toml @@ -14,7 +14,7 @@ moon_env_var = { path = "../env-var" } moon_process = { path = "../process" } async-trait = { workspace = true } futures = { workspace = true } -git-url-parse = "0.4.5" +git-url-parse = "0.6.0" ignore = "0.4.23" miette = { workspace = true } regex = { workspace = true } diff --git a/crates/vcs/src/git.rs b/crates/vcs/src/git.rs index 6b0a7b51060..685d29d9138 100644 --- a/crates/vcs/src/git.rs +++ b/crates/vcs/src/git.rs @@ -5,6 +5,7 @@ use crate::process_cache::ProcessCache; use crate::touched_files::TouchedFiles; use crate::vcs::Vcs; use async_trait::async_trait; +use git_url_parse::types::provider::GenericProvider; use ignore::gitignore::{Gitignore, GitignoreBuilder}; use miette::Diagnostic; use moon_common::path::{RelativePath, RelativePathBuf, WorkspaceRelativePathBuf}; @@ -706,8 +707,10 @@ impl Vcs for Git { if let Ok(output) = self .process .run_with_formatter(["remote", "get-url", candidate], true, |out| { - if let Ok(url) = GitUrl::parse(&out) { - url.fullname + if let Ok(url) = + GitUrl::parse(&out).and_then(|url| url.provider_info::()) + { + url.fullname() } else { out } diff --git a/crates/vcs/src/gitx/git.rs b/crates/vcs/src/gitx/git.rs index 026b9e1067d..c84972ed600 100644 --- a/crates/vcs/src/gitx/git.rs +++ b/crates/vcs/src/gitx/git.rs @@ -5,6 +5,7 @@ use crate::process_cache::ProcessCache; use crate::touched_files::*; use crate::vcs::Vcs; use async_trait::async_trait; +use git_url_parse::types::provider::GenericProvider; use miette::IntoDiagnostic; use moon_common::path::{PathExt, WorkspaceRelativePath, WorkspaceRelativePathBuf}; use moon_env_var::GlobalEnvBag; @@ -340,8 +341,10 @@ impl Vcs for Gitx { if let Ok(output) = self .get_process() .run_with_formatter(["remote", "get-url", candidate], true, |out| { - if let Ok(url) = GitUrl::parse(&out) { - url.fullname + if let Ok(url) = + GitUrl::parse(&out).and_then(|url| url.provider_info::()) + { + url.fullname() } else { out } diff --git a/website/blog/2025-09-28_moon-v1.41.mdx b/website/blog/2025-09-28_moon-v1.41.mdx new file mode 100644 index 00000000000..3e186af1393 --- /dev/null +++ b/website/blog/2025-09-28_moon-v1.41.mdx @@ -0,0 +1,161 @@ +--- +slug: moon-v1.41 +title: moon v1.41 - Deno WASM toolchain and task input/output improvements +authors: [milesj] +tags: [toolchain, wasm, javascript, deno, task, input, output, v2] +image: ./img/moon/v1.41.png +--- + +With this release, we're introducing the final piece of the JavaScript ecosystem puzzle, Deno! +Additionally, we're introducing new task input and output formats. + + + +## v2 in development! + +We've been talking about v2 for many years now, and with the near stabilization of toolchain WASM +plugins, we're ready to pull the trigger! So what does this mean exactly? + +We'd like to land v2 at the start of the new year, and to hit this milestone, we'll be focusing all +our efforts on this initiative and _will not_ be releasing any new features or improvements to the +v1 line until v2 is released. This does not include bug fixes or security patches, which we will +continue to provide as needed. + +So what should you expect in v2? + +- Toolchain WASM plugins stabilized, with the old platform system removed. +- Extension WASM plugins can extend the project graph and tasks. +- Remote cache powered by Bazel Remote Execution API stabilized. +- Task inheritance via inline configuration. +- Task inheritance deep merging/extending (is shallow right now). +- Default project when running tasks. +- Renamed and improved configuration settings. +- New binary release strategy. +- Improved CLI commands. +- [And much more!](https://github.com/moonrepo/moon/issues/1681) + +If you have any requests for v2, please leave a comment in the PR linked above! Additionally, if +you'd like to help with v2, let us know! + +## New Deno toolchain powered by WASM + +In our [last release](./moon-v1.40) we introduced an array of new JavaScript ecosystem toolchain +plugins, but there was important plugin missing, Deno! Deno works quite differently than Node.js and +Bun, so we wanted to spend some extra time and effort to get it right. + +We're excited to announce Deno support, with full workspaces support and npm compatibility. This +toolchain, unlike the previous implementation, only supports Deno >= v2, but also supports the +following: + +- Updated `unstable_javascript.packageManager` with `deno`. +- Will parse `deno.json` and `deno.jsonc` manifest files. +- Will parse `deno.lock` lock files. +- Will install dependencies with `deno install`. + +```yaml title=".moon/toolchain.yml" +unstable_deno: + version: '2.5.0' + +unstable_javascript: + packageManager: 'deno' +``` + +## New task inputs + +In [v1.39](./moon-v1.39) we introduced new formats for task inputs, a URI string format and an +object format, based on this [RFC](https://github.com/moonrepo/moon/issues/1985). However, we only +implemented support for files and globs. In this release, we have added support for more input +types. + +### File groups + +Similar to the existing file group tokens (`@files`, `@dirs`, etc), we are introducing a new +[file group input type](/docs/config/project#file-groups), with support for `group://` URIs and +`group` objects. + +```yaml title="moon.yml" +fileGroups: + sources: + - 'src/**/*' + +tasks: + build: + # ... + inputs: + # Using group protocol + - 'group://sources?format=dirs' + # Using an object + - group: 'sources' + format: 'dirs' +``` + +### External projects + +This feature has been highly requested, but we were unsure how to best implement it... until now. +With the new external project input type, you can now rely on arbitrary files from other projects as +inputs, instead of requiring no-op or intermediate task relationships. This is perfect for "I want +any file change in a project dependency to trigger a rebuild" scenarios. + +This input type supports both `project://` URIs and `project` objects. Both of which require a +project identifier, or `^` to inherit all project dependencies (similar to targets). + +```yaml title="moon.yml" +tasks: + example: + inputs: + # Using project protocol + - 'project://foo' + # Using an object + - project: 'foo' +``` + +By default this will include all files in the target project, using `**/*`, but this can be +customized with explicit globs, or referencing a file group in the target project. + +```yaml title="moon.yml" +tasks: + example: + inputs: + - 'project://foo?filter=src/**/*' + - project: 'foo' + group: 'sources' +``` + +## Improved task outputs + +In the spirit of the new task inputs, we have also improved task outputs by applying the same +formats treatment! All file and glob outputs now support the URI and object formats. + +```yaml title="moon.yml" +tasks: + example: + outputs: + # Literal + - 'dist/**/*' + # Using glob protocol + - 'glob://dist/**/*' + # Using an object + - glob: 'dist/**/*' +``` + +Additionally, file based outputs now support an `optional` parameter, which will avoid throwing an +error if the output does not exist after a task has ran. This has also been a much requested +feature! + +```yaml title="moon.yml" +tasks: + example: + outputs: + - 'file://build/artifact?optional' + - file: 'build/artifact' + optional: true +``` + +## Other changes + +View the [official release](https://github.com/moonrepo/moon/releases/tag/v1.41.0) for a full list +of changes. + +- Added new values to the `runInCI` task option: + - `only` - Only run the task in CI, and not locally, when affected. + - `skip` - Skip running in CI but run locally and allow task relationships to be valid. diff --git a/website/blog/img/moon/v1.41.png b/website/blog/img/moon/v1.41.png new file mode 100644 index 0000000000000000000000000000000000000000..979c17b04d0687ef88c88f1fd5ae63019c10fa1a GIT binary patch literal 1014624 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 |rFd!dhUE(yL~w#xWt`|d|z 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%0AkS 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

^UC4BTXQ!}|C*cZ;R5WK7I!#zG|G(Cx)xSv zD+;kEh$9#{y-vPedHc0K@P|LVaPm94aO#-snUkFwV~A4Mr@Rq+P|f*LnS*`|tDB{i zANl@j^r~gP`}$fCdST^jQRTI{diJ6(J>n1tcNBhT{vUoZX}6DF!oKWQU$6LHPk7s{ z>IC_(#!6>E)U}^^22m(d7MGw#CfXU+48Zd3o3K0~{a6^$D3n z4C1u-C2bE;};(TfEa(9Ye}-M#n<#=8)wVTlUohF zYpv&Zmu#QPw=$0pDJyKknAvA^e!3mPHvcsN33g!skiU-w>@UN!MsmiPPypVolBe?Rn9HP7M> zTrD9v$v9@yh%fOy4a#YZ#bE$B-fx9Sk4c%THvRrRce{RC;AOYp|HHHA0H$lNE0bUj`xqCpBAM*g3uqbQ2tMK-0^qE+s7&4^Y{N858I)Oe_Hwf7@yfghoG2N z>B}G}&>u8%{phML#NUp3b*RPQof)r&ZMUO!xAe5l@q7w!B3PYOZ=5I~EkF;~Ai zNGFdAIxGg^8iZoa1he;dV!eubOOMICRIGER0Ev z5-%l=Hf)~@eHH3^l&50t(>foXQW+W5xPi4;(f`C0D+ik5Q)&zZNNm zIyM*vwmPZAJE=ffw0tAF*mpMWH{U!z%|Yb-hMyz;M{%T+tMC>)u9{*!VX)!H~FY?h_UJErB%QGi+Gz7MX z2R_0R19Y7W^}Py`8cK;n@&|MG2~#&#Q*>gU^}{iy#-Ug7sxdTbXVrza*83*5!M041uAt&hc-%XsTIH+)!r+I$Q{ z7nl<6Ha!m`Z5Y4z2!J8f_LkQL`z$APhcj2s#o|C>JI5GSWSkkn_HcvP$mXmt!Ecfh ze9m*qiE89Xi~lX=wij{|+gi+r&ecrsNzLWP@_xh`HAc=2lNx0$nl-EbgrgIPw-o4f}o9O1yZ-I7RK)}Ki zo!1Gj>=fdlrJt*1G$`)&Kf}*F_b1UHl%-WTSo3ByPiWn1B@wNw$xqDJ;D67G%4Zyt z8Ts6kk?MQAEBJ;n-PA` zGW|@jbiBT(_&=pCchJIxA0JQPgADrdVo>>ONd8D+Eh%H=@!+r$zQ|L;U523cXM8Yb zc+TtZ*T-yK@`mA8_6Uo)iQ5VQ!AOr%MDZ)Jh0=GhgZb->{~*pHWw06lX8Y*trPCQM zDHRtBtyF2d9eq27&g2?9VBh?JoQJupGFJY#dsV<(vlv=&7NSSysZ;S-)D}%>d<1c8 z<-lCZ^Maf-i&({f^WM20CO6~%wAl{N{{su>1S5uC8czYiqZ$4C5#k(Ngj0>B=~P&1 zA9i~mutR+(=R(f8=21D^j`Y-!_(yCAATl~X4?NgpDLY0iE>>5L%FYRpnxS|4 zzHhiD^+5aUh~uWIAvg4^n;$9sIez-r56t+lH;Tn|FH>WnIEa3ozTEW&hV1?7*tPKl zU%0D!WkSG!U-2!$*s{-X57pvBKB<_;Qnou?D{D58mL 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

Fune&|ICg&pRL6B)VKLx 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�vYL|WWA{W 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%0DJ?U=a1{26LPr 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� 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

  • #?y&XznIG5Qd@a3kNTz(}`fr0Gbb6X`00YFC$(+#sk-V9( zinS^eVQLJxK3aLxdqPbG496hgF;F6=0L8)Rj-Ni?Kwd%(cBTltud@PD zR&HLu)}6 z>(}Fk1jv;u4*vesiLa&?ANg~n@Vm~y?Ym45-fvI()caq#nEWW^nBz}wAx@5L#Mku~ zIvI+4`Tk8i6uK=XVNqV^Wn`~^3@nWP^;d`BbJ?M?RLX9S-+SdV>h2OSzV%aa*=gXX z*BtfaAz`w-`=jjgD6hKe>C4jAn~y(r@%bV%pM2lT>B$E_$R8pi5B4h!i5|4?9%J%j zw_TTm@W-5RTIF3P0^6~Uolt+mS7J=OQj#AheBf^upDoFYKYP~;9X{^&S&|5U_RbfK z^_SYR9VL|xxQcKVe!vuUzaqB*a>*+tu-4H2*Px&#Nc7#qaqBLby?E5af0CXwo}IF~ z_-Zcqo>%Wr$a0CB-xqr$!xi`k9qcVFXe%wDuTG%2vmHQKuVvDS6DC$x1(MNsBKY37 z-9oYkJe#SGuVk2R`v`puJsJqLp%v7CMdc5jZCRxt<@;3+rU(vty zQVvsJ+6_@&1$9HISH}jj>U)W+1Ix893<;mboialb^?{ItQTtyKOmF|A(>}uN*LZzl+%l3|c6Bn*#%s@YR<-~A(yLvei&d?t!~*xLU9a&sN13jbmq zu?y3yixG#OTu2BeGK^2_MdO(Ox)`q0za;Tjf;sTym8J@+AJ~DlM%6yMU4~}4+7$h+ zb{8lHQ(5o2xflzsDt9VGxl+qu{Zk$*4+hI7DYJ&L6lllvI3=4B0QY`!34wHIi$Eq^ z|3F~UF0splBw7ds-(C9?g9&I8#+i&~7?BQbP-JAn?`$v#OpI)215sb!QLi0T4&6#s z55zl68Ekk>xsliXa^?;i_(R8`mW>UEAL9)i#tr1shJo#Oye`1w+AaI|jrZ8-!q8EW z9ggCvpD6cP0c85ACeeQpCzKUG6Q}m;AXr_*+3zB=Rry-W{`AA6ZuG$a0-^`ej{3A}53-7r@CY%8X)n7H{ zNF4cBV5kD?q`thrsAs}wppY)GW)cZXhcbQAt#lFfS)S9o-Z5SfPrl@up{iZD!*PwJs9o`BBRtz{U8?4KrXCJZ@q;(STA zb-X@2ur+lGueg{|s-hh3Wg@oX=XHB4cw|8>NY(D#y-p?=Im@RLvbML>&eT|~+rhO8 zrVejD=-GoYpvi~N@7?&l@l22xKWIp9?DSv4Gk4wYhsLDGJO1ui`jwx0_H6RwO(pqJ z4m?-tsFEr02s`YF;vsRMpaD*JG2oOGG}4jOXzO>1uOYHN8d5u5@DT5;V0eCrq9Tx1 zHAz>k_sjnK?KLJf=E^QR?Jy<{R_*l2r3COFcldADS6{XGC?6{?mjuYOpZciTehLg< zKJCqP;>n+-cfJ4Pbl%r5vUUpncG+=zy3d|JLN7h?=f~GX^-4*El)pzD`igO9O7cU; zvP`X+3O1xsQIgPdk$$42(C$sg{UyEb=))Etf60&lIc!KGlpP~qDLVt|St=#Ce4jn< zMMoTVz$`7WG`l}Wd|KYopqnt<(eKHqm%lU5`3Kmk(w5(Q)vt`Ni7GoOF1j?H^KsF) zzC)Y9H>Ks5zxkvgQLyJCFP3vo%Il}jJokce_eN>ABw|YN`d&luz9e1>U3OlBpMUGv zlML?(2nh~Jq1!RXpE4v~4xVkJ^z*h?K7FiH>YhLFt-fP_mz}m7VSVyrCzw~2lTQ8o zm;~~PD(Ln#idOUYEW6%2;l#h8Cm-~n#RN=&vFzaZ-~dNC2cwKp33Qe~Xrb?;9`Rr4 zkb@q$lD6g9iwD}dK3)%g=PWO%M^M~WCp6p%)D|xu4}`yN_7y}Wu~BxlTs+`S9GbE6 zD~CLSUUc|lXuSes$4uxsta?tZTwF-8>N$1H2s}(^H93K+*vhOtyDuXmjUN;z{yl)7;QfA_)-5GrF(w=e9-DK1=7iD{AM?|TZGGX~Z#ZCm2f%cxl9HOq(zKi7>4)q; z+s^?H+ndfF`VyiL(EH;Le3lM)=sqiVsgyH8o_NrH+CKV`l#`u-y&Wu zcs`-#+Bo_(X(*X--h=SQ?~+=Y)IOV!%^ivaxfh4uSKv*3x(`lGP?r#Tra)r}z0K2w zIUOk94CZgpa;7{TilTw=`==wkTK8{ zco!J8Oj-f?LJ{$mttcGE4SdENVGLlyNc4n>5HCsMpCuPP$$lf7 z;_`{HkdU;P*uUAaEsd?BCShPE*mS=cqFPUaPMq3hA8(oX92kX+=FlI?u-3_mc_z@C zN*ng^bE;5?jlmth z=TdI(#oHNCMt<^z&}N4_W1@CUZ?Xd2(UXe6M6X(3>DN$dVpzdT6iDHHbJP*tSX>Z6 zp`doFOt=JVO$K@CMZ{GmvbCvv!I`)4Iii?ML0!ZYr60x@;5K;y$Jd@7V|5WK^Oc8t zTLr<#kQHaP*;rn>Pt?T>k83UB-e!L3N|EiWAd3UD7>n zaO1$tsJ_cikdnmco$XPQAg_Gb?{vEylOIF!(u{7l!(Nf^GBXMXjSCycMwS}K~vDD}rAM#Z57UDrv{eDqW24#|RVc4cp! zg3s6pAbK{WOe<9jM?Rg5;zXaa3uK=miBWb*ES0j`;k7FgB}=6Q@gIN08w3AQNB&KX zCWUTnE*>;hT7GN@)*rFr+>t{D{0>PtKJQh3JOs(l^tP%HT=cEW=(pbdfiZEiR0>TF zDSsRG?4(rOf z*J0WuX;`xaK418n|1s|JSXIgnj-?$QOQj?a-h9HTM8v_Mw}RA`=5CmQ`uD6E=ZeXm z0W!VjYVPcgk{J2WJD*R-p72rn_!)msS6_4e*hbMkk9zoh#$6w)&i%mNC$PmQuhpU6 zl45SsTF zV&TId{X2h>IdYzO`yozBYLlJ5r+?U+|F0$wtmwsb8FcCVgcTkm{GQV z8S=Qo2EOAI1c~zjo0MBU32+0{-I6%R;B%1J^w2a;$&cX5rx+QKMy)v0S@g?471m9l zYfe1$5?fP0947LiS4OW>$5(Abf`=L+SUpZ{%u}=9Oc;wQo7{F4#5N9!>V|PE1La*Z zS^SOl$9BcBI>>$11GsQPQae*DA*YP7waVM@>HbFa^_9LYZ$)|Jpd_OF zkK-10Mxfl$IR4bpFWwJ9vJT}RFc6CNU+q?~Iam)aWxG@BZAugrCQ30Zc4UamR=`7K zzFJpDaMe3FQiOxlw1@iId_kaRRz6Bz|6O6Oc;*BLa+cDS7&VqB7hO`N^Eo{nG)a}0 z+}6~W>RJx^HV}iRdz+gG15@O;IMxj@DAFP(Nx4EIp{_M0u0J-EM0wR>zo>GJ0Rjy8 zdx9bXRGr<>8oNQU`}MmMi>Q~RK?R`ynX?0ZS`oh!6N(U|X(yoBiY zuf1v73DSEVRmV!5&+94j%NH^knJ8(P(BRL8`~x) zwxPEWHD2Ll39DWbccKVC34RAF7?g@qK^lSkw=X3r@$f@mK7QiZBR@t1>q_>tAvy7e z$K%Xf-@=LFqK^$ z<#k=RXF2A$Q|R~;|Jr`*%I;C}I&AWcqyE5>CAUW@$-efSf4V*? zBQsDZ>r?*$xUFn4*#8fma`s~F5==ez6;Gq{|N2dI z-Y4Hk7k%L!!}m9i=bEga{Fq=9bo%P|&AHi2c(VE`0&+sMhQ?{z#Z_^Q@42!;u6EQN zdZeYbfr?|@wsA5k?ryGwCDyV}2sWs@x>h>^+{CE=gLmN$uYOYUwvf0y{d3lr{*l%# zr_UYijl!H1^_HFkvUG5|4aU_IczKbrj4 ziS}hD$J3sBe9$+yN4a?D=k0&^$=bEcrcKghJ+5^fh`yvW${kryIxZi&i(PMJJ=Tu} zSli`Czk&S+KB?8y48WS}bwS{aS6m>N0RVJuF_Q%Wf~Zv;g~3b>Lin@uif;n~v9RRB z(8M+kYi@&s=sQl|IW`q+xofbVZ_1q?t1XArMBLrzAxIB_)4{=2Eyk$jsq1P z;y8!$f4s%bj@vka40H=1Y zU~nBe{?bFwJ9=~O0tb#oBj9!blT8 zke!FQ((wnilBHGBBiwr!Zm0}Pz$wc=@Gi(dK7sNddhg&J7BMk$3iPV;7`qPgFEfBr zowIewocWH)6L}1kl>dYLgF$G{n&r-SHZ~(PEvgT6>{R}PIGWGemzD85QTwCvpT)6a zqZA$iCQ(14{;lObf18i2{Odof69CtxQ;q|YH~9}o7!^8jdCk+9qp+2Sm0Pf z^IDGsL-BZ?wEGa$6vQXnFCx`Ct^UqZQp$#1X7VJ2_;+bUQbNNy^O%EyP`NTcH-Ku= zq$%QcdPpK1`57}v^>@GzpJxi!Y=V#oA7HO-H6fP(YZ*p?Bpc)RB|g5w1$n ziM2PSNvG+4Rto*`xP3}_jn%aC<1z}XWT`iagRz1j-W%Ta7sKCrNsuimCD{K62f>M5qo4w8hBnojZKEeM084@S=Z}2j?UDo;+dkrrwu`3pSPbo^P%|O)QLLXr zNy&N<@hfG7U;gG37Z2E8D*AqLb<(D$dE9kT{%(&lwtd1W)SDOywc}j)rv%uZ@a$v8 z*KPf4mofQqt=A+iqD=y)k~TJjWP>SSoBSgbAnJto}j>um%S|1LEcEbJpLX z@zo11sW6~kk|;z>!7nS{%WIw1Ddhm~vIE51?%A|yJfHZO<((4c^;eAzVF-5ArqG@c zfgcSvq?8Yz_C;DM2R?l7Anz*wicEfjy2%nX4nmwI|lvbk1A7VtCAm{zMH&|7+=T?oWcLE-yPp2e@bG% z&AcoZrnsn$0Z!EkIr$R%@Sqr_ey8>}*rjXYO*XxuyvopQBX{C_h4Y{Y52vA(jHZ1q zs+bPHXC6kGl*)J|=fw4bvjn@mv*J~Mxbnb-f^GnG6H*r<% zz7sbxAz=ij2Q0`dY_KQ}ldkh|#JLC=JXI4hLOiw40K4muM&S@8N5%VbA?*(>>Z(ZR zXg|D_|37x~{6V&;5J@ChE7} z_kPYkd#_ci#;asmdLG9^gq#bUztbH0uqhuh&+GU4a7G(8 z6l+DqR(#)(4r+}cxtmJs{leg-9?H4FHgZfKLaVDzqWXJ~>?_lL(emy!zVHdO`M(Om z4-z3Wn9h8yI(66(3sbwBR7RH!yz{|Mfnu)iy;DWBX3~@I#ucV(;;vMt5X0 zr%!uql+f2?CH~h*#NMfzrKcqe3|bdGV!Jz)rw;OpwRt{}^A}apK_3BG#!`SS|kLU-~QY z5B|Wv^G(}yIQ0Ba|KKlwY=D@l4H*yAeF~TV(8~hYU-7s7bB|A`e6x<@6B$4I@B3HJ zCzv;j8JVlz(B0$-RL};#sSSVdm;M_3J^$D*d0Eu^=6tH<*u?pp|Negszv5T@)|FdI zmjP$57aowDD2LXgnZI8{{q-t33aADa`uJM z`ebeR(Q)o%yY!=?Z%!kc(u(n86Sx+ILjTYpS#jSnS>xX!t6ZY1!k3d&&7pH{>wOl= z6ud2BlH6~6@F!``SFwrnYuF}ocWr+J-bUSA(Qn8a-J>^3w=uu;s=cH0t;c(Rn|NcR z#w|ZpS!}w$m}k~rs`0`jOMAz-DdN(@vGL(_(YayPOl)HYhrJOa2Iu^L)l!DCr^RAn z`9;`BsC&_k_h8?(HhB7c*$(uHh0>?xTv|kM%vQO%gX|(!n5fcwJ=FLEXxO^>S^wvL}Biwx5 z^`gQ4A=fOs2ZqIc#-np=&w8rl3*Jiy={Io!8@n6p!^SliEg^l*LN2*^zT6}~0Z=59 z_=nF{F1&I4lP=eJ;9Y$R-W1!mbmKx>5O(?`hb~FYpaFg*hBSg1+9M&jRlk z#aqc9?~4lg@H%caDkw0Q(wg3R!Dtiv7=^Tf9Ly&p^vWSBn=4jyd9m#jzD>B3Z%?2| zunc82<-2gLPp5DaqbBw0%8MFP9oH$iIH=xx+2r__HlGBEA3XnqU-;h}4F*$k%n>6! z&?vAYv0O)SeO;E*tMhB?Vsy&bP9S1r_3|U@L(5^-_}Vq1ag72w0$|_c8$XUu5FB4u z^)r6XFL?ae`R_Uw(#w;pZk43|FKyAjU2z^Kl*j} zOMmV!d~ANii0le{?0w=5j_!Ymjk?#gZ(BOtEsCCh`Uij6;}aX-h(6-S)&KIB4V7b2 z`r4b$*EiLM7ELtSU9|q=mra46`E!5ZYv4VQ$}{oDh9@J-vDxr9{(b+-gZ?*i92*Tk z^KboU@o)aJ|4OkUxLNP-E%rm!kp0l_Km5=9d-#Wb(ZBl*ZOj~-F~9I%{T2AxfBz2( zozTJ8e`uZ&-~yz``nA8|cj9ON1OM9N2hYEemhX)&!*PeAXgZK33 zZzi?bv-V#@##prm=eU;owa)Xx_%{I;CuZaPO}GmWH&jlHE43JWolgh7rKh|5SU3Sq znojrZbsE;Ip{4W3#^#%RJyU)%gI%TRFBfSki5?Tg=U;18$MJ*dOqSqVj=%C}d=Gy7 zpY&aqbRJ)S^*erl*~?uPjk@c}6NlxPH3xKm$p6~cVEtKt#-F@;Lit}|_Jx;Cq<`X{ z`xW@>|E^#B4Syxp!OOq?Z~gl9$&w$2D$3Ijs&?nf^~v$Do7W#tg?KS0C;rqAT>nGn z4$teAOFYx!3p*$c3YlkdK)}cfvEI3Up!;Ys%8q>yb#1WW_+3ops^r& zJ&yQf0a^{9GKF$n{GC{!zItx$s$JBF{fOLo14O>tjVQYIs86h5;x)<@ql_(68NVql zQ+)Hrn{)j?Quj$*<9}6tGUn>wE;R}b4tXFCI)}cFJp<@RLIwMPud&n$3NGg{FRSyw z22v#fgqPzd{zZ%-^%`Hxss_4;F6lB@7B9I^KX1B1#o10{M$XJJQZfP%)C1|F_|$cS z@RK&!nnM_hpVWt6#E20GBD=BZGWPCBy)dq#a+T{O037H>@l)e1+o7;Q2>`JcAh6$P zrMW?`C8aEKI_&uxhxaQ*M~OQWlcW_g-$AjC#@vj<=zs_{MB$aQX9 zjk@0iHDwph8Ama95^@2sQza^O_@Uv z)j#j0s1)&^$9Mm-$CUr`nMRQ1ur&vIiQ|L&076m%`) z$B1%;@j0{$jj;}hP5hTgdAWjO#lNYqo*h*8g}*w)^jkfQ<9`VhU){;NIC-Q^ii{f* z{yUp%kgGT1%vt-ItxY9f|C_RnI6WB>?2l`^{GT?3ZZkyp;m3n-UJaqjF$WQJYXltn ziJI~zeV}?GXNTv(yHHd7?DPM~=lsA2??2@JMFhdi|8HXvJ}2=^JwPHHC4ih9+g0(h zAkP9wB^T_}Co8y@1wYXzb7M{Bb8(dw5!Wn$#}|LLl8o273bp64iUz7UPK71oV#iEZ zLq_HEh82iLyf4MRw>}B-bAIyQiJ$)C|B{!@kUxNb`*;45^_w3hGe~183aXF{U0a*v zu+3NQ$hII`ioKRzC5qN~DYrw{u3YiWRwF0yRsA3dSPfDB=C~-pcb?`6U^O zd;A@X*MIO2|6h-{55Z=k7E)2m;I{WgkSm}{d#=qWg)256&e3$ zoRW?@w--Ly3%%-FK!0qI{rNxZpM2r{r{Vj*@2BIZ{rNu$*GC0F0{Ld(CdaW6^J{;@@4zqrHNO>K{Nh(vLZHP8@FHsIYp7yXUD5P!?}{e}2Pf8O`K`a{ac@mpRtKK_$m z{og(|eU9Tz`Xu8kNd@*lWtsZz;`G(gB(D`x+KH!>dewT}Rbr z^^yIxU2|Ud$_j6KjQDSrD%T8g?o^v35ijwMjfcPc=lqPPc{ArJ`^7<=Y$Lu} z|NOV%-~AQ8@dcmXLoWGB%~q4nlXY)AJUJHl>QlVP8cCXAs9V>IiEUNV=bNT7WjA*X%G!s#u7!1 z*Xdw0r?7G{6d?H+0EvH$Bi;Q&qn7cbx(ITP>$pwd+~_>O6;PHc{KHT#G8PveTx1<@8YJF(2V$waAx+bNAYe z#sGH_q=RmHeWWh1rr)i+o$)8M=&B);K=ls9qSU&;iOXz@98ldL|b(! zsx}4p*2`kyz@f9$-`R&J*u}giNT*H$veq>~erD=>J3h7Gwnn8CC=)T$@pOlhDD;bM zg4lgsE!@LAiEQpU`CQY+vRA~;aU9>d|GhuyPsR8C#Ginl@ZgkO))Hf7l8UcGC&xy}k3V$sLO=4-F~$$Q z&^|U}j?IRNL)YM{?m>x#{gedf`2YO3f9|mf@{@n!k6)WJHO{fgaMuD;_u{LMI9vJZ zi!U3j|I`2SLyu2={GtEzhfnTWE=zc0hZf9xrC9Tt*fUmcphB)O2CY#==_cFw&)Q4uOr1pkod3I%CMQFmC%J3i+8w;enRN4Z=2jC3%5;g690B3Kg$f!UtiQwtSZ`F zx1v8+Jbl=sVZHXT`IfN1=jj~|WXM8g+{MPL@!x&J(c+(d5U$;kBwn!5ogUDd0*zmn7~GkA>2qmqw>zQRjUadWhcm`r?0`jQ9_O;kEd$I`C_c|GFP9H`a;G z_-Eb3c|ZDGrf+cPVB5gucyMwi1J~io2J^`+8IIzGd7m%0--nh z3V^s2{qxIIbq6JDK_fG?T*C!Kpt1aqnI7ra)W23_6&n;|M;T{J!_u z`TuMwnyd4@VzK4QfS%4pV~xkBmHw-TCWIan$){Ez5==Fru4|MHCRPFHxl}-rl1nUw zdrJVIYkXX26gxDEq}?aFdVdn%O%RTYl_!lZ^I|3wR<62kl#iaozBXIe__grMiUMEB2xmv63 zbddhUao(^lPan0(O5Ktl>K2oa$objGRR0_dbAewmxxX@Zdw!vIaE|pi&~@qz=nG%N zi+X%xil`URCTS(}i2tx#GPUIvSZ%yxCG&}%1<0oeo_BH3bA>JfLPxTq$?z{6b0fkv z-K&-M_FMGwQ-pubh4~60J-X};&+x2GI{=zT+xEzJK z$H9wcbUSsf`GBuE)Yz172*i2r$01WWmKVlda}IHjVcoDSh8AF9Y2BwoEO)Sg1hwVh`Ik`bkakNC$X{~zsahLZ2Yt9wD`poBiJ?|9u0ZV`5tuUL6cy&yPg$ zn*SSX81RkHcjCIr*<-ruY6v}-{CKQ(IrV2ks-^RSSt?MLOaCV96lp6HF&kD-?=lNsr$>pFeOhTD4T__T2@ zYGj_PyqK74r1CCRU~-H9eCpZ*%j{Ag#VN&qUZr@CIOSMqa>v3O?-p{y??6|F-1nMe8i#Q6y;mD3d8I{?Hu#PdivE1m-9HU0rzbg$RQ z4`-o8Hd6uHqDIlXvplrm5FlgqI9B446V1XJq>l!3VbAatW{G`0$4VUDgzqjKsqgtj z+>`kCNhYJ**&G`GA@fPHGlh}=!TN9=D+2~S?pFNExE22oyad4YM3SaJ;A?3csq@QT zfpdKkqUhAW1&Nlq$SAmt{a8gp6IUaUB_v1OZd!s&JbcH?u4ZZ*lTk!4bmLym$4K^GpEACL?Q*5SDAv5|5eUnL-$x(`&j|o! zJD~eHV-!>Y!mPf!D@~(Lf-j5wt;wzjJ5LDCh(q_21+TmwJ^ zU@&9zQX3Tv8+kW2KQjJp;SR@oTcfHQWy<;l2yyfFJ8$9BpLzT|2;P71V|@JaCzHF@ zCvwCvi))+hbLc2Ql`O>!@T_S?z?Z{-A|vgz4z6R@X06lOFow`O@2Dh zt!d0rRFO*-g)=5+tK8!U;glsBpZj=A4Vty-#0zVxxE#YS(pIBJ}gK2WXb|5eoPt< z;V}eX^weiu_ zWPhF%9}Irxb1$;J{UY0kFL?6)N9Yv0ec~UT^i{k`{B>qr^O1<#LX8(|`8^*-dSF5^ zG5O4kPu||L7n^;858nR-CbllVca!jei_&7(QlF?p=!4|!vIPyUgU=yN?7bWPGoL$T zyFFz4@coY$9UqefUBsv$V4pAik)GJ9psqre(z5UXjRDD*>O-uP^X6fzhs|z=4?lRZ z*#{q|{~pKqy1R}ijq@J=%sE6_-&}2R>7`FG-G6{7L+B}KuJ*?s!%=V9TfiqD`9rqh_dzQB{qe?RpdOz* zY3qyBWAZ~7cT!ZqwXLtK{d*2MP7Z(k%xB+ze828TFF5(Zdmm$W^!U$OLL|J13-KK? z;+135^;)=a#8(_T-HXLAmOJ$J*4szD_12@^5p#!pTR%`qNusziaf(}Z5tQ6;+RE)b z&cK*W{F7=9eEiglY{&8bOHFdrCVL;J_?7F>uy)2~8%gVx@ZTQZ#yQ`v_-A_&-DAkN zUTUpRefq7((1&dIPbwd;^_cbE)^8!4y|3b*1JfFB40+MGe)~gt^i_k3jEzQ5*^BLe0v=fh<(&EnsJ8cB=(-oL+zhf0|FSa{m8>#0h0BpG)xK~L58k(I;DW=r7 z&-vZKcmL#$jvYEa{PLK0A8~f%w)-dDX4N8r`survQVhejwF6A78SL*P{?DH5gD8G<=PUCsG~aN?8Q{AI1=ZM=1}vzC03t<>FO zbn9dk{~{DgKs?m@!hl_Djx3`dW|2k@6$$~dL2Ib>Ce9Pkn^Jt{81}+8b(+g*aebidKx=YMNao+cBvYR zaRChTQJ~O0IUDfVo%%p5_m*F_DR( z7X!!3r(P!Fpa1-)lm3zPe&mn6_t@YWiI^P(kU*44o$Yzli5fS=g{P9rf*z@I24E5R z+_!xSpZ&JClfqGi{qP_AD$WO>R+2N5g(l{i#}-~=j1Bq;$aooqCmDt+68d60q}4pw z2aW}l@A&+uvd1xT`@)aBe=az?i`@WVyZkE*Z*Hf^WhdMCWG%qkV86S34!dJz@p()P zzWqBsmG=(Y{pgEq$0o?h4lh)ae%3v`SU|zkZr?DKUd;(ak^)5bZTx~{8G_o2U%rFS zzAVVb@yQ|EOT69F_Y~BD7DryR`5I^D)B~T3l2jH`HBo|U5^(@-h<)3)zx!CU4BifV z{qP@qUvzw~h2zjw?QMpU2Q{o<2{oZ;hN{mRELe;-k?OZ83sD@?R=fZSv~71buZ zoX^BAogSd3?}E2mwc&McTz&q#KJ~JZdP^Mo$`?Pxdz%fON8ix@qdV6UTr&a}A+EeN zt8;!MZZisMLAWidG*WTzSVaH)cfI>~jV53H(npVnp?t(T_bf`f8D7Il>mL6-Su&eG zE+;Jrrq(Duc8~MJZr}OcpFU$?UH|HrK7PnHkCS_zN}gBsz4mDF?~`BKi~-KgCu2)q zOC5Ji?Z>fr@|{2C)2rXv=8Hf2;UmZ8_#R&uw_%EW)Ev0ljIX&z$?QD9MNQ2^)%jci z5VqFX@4jphe8+dblf93H%P;=$OP%~lwRyl=2d&P*F8&+vb?jhX@(r}@E>GG{XaG6~ zJQs()?c3ieHeRlM;fFtb)Rc7b5*)_jkmXhIV@6{kwz0RXf0-u7VGZPin~0gueD1Bs zLkn>nbJ8Duk<0Jl+ju4Yw~N68|AKp22yw~zPj)(HT?K|Gd0T2B> zTY>sUzLZAB;#T}mILp3@~W%Xw+`zkG4P<T@B!>X2FW$ z4j$t>zx&-s{tha~172VH;>T_5oiblPzMl9`ojCVjd|$;srk@`7KL6eCq-;mC_rLnd z%RJ{3WWA$cJ>#GJ1$0mHHPlzQ--+p+v+IbG+v~Nb-(yqYJ3jx;V>2%1|7VSSzaU85 zF_v&%B9>azi7x})3);ps>Er5kD{8~s@A@(493V#f;6=8tyvV5XOm3c!Hd|iZ>pY&a z;l!RryT_nKBQHMy`Sx)fbAa#ouJfV8TL-DnecQXE&N{9Y@y5|E9_{*m8oB9-YnZLh zy1qB#jy%}BDCFSdQJ}4Mwv+8ij4(g4F#%9gHlb|Pi z`2^oPP;t()cp_kT&-n@^vJ4Q1Cg~I=nMx^Q!33i?Kd%{Sq|N*CcszwjiaO+q18rwsE!L!SCzYMR^tsPzydA*vsrAV+Ykf)#^%IpxJV{cllpw%vCO!CQp=X_h zj-+GXH^D*u6E_wckEcpM_139#iW8l9SYgt_Dz%An!V^-g_$rX8#x9;${bKwJ^9SKC!Xr9z!0VPb5fMB*dsq2san)sEvS z%VRN?f)$_o^xKb3gNz%wz0YB{x;Wv+rJu z{QXF1L&+WmV$}%6)Tw)~1*p75S-+Viag5|nPC8G zf4KWule|@e;r#T~152Req`rJCVP^cZ-kf|ebT{g2V;s~3;u%{=y(Gpo=hqZcZ$7g= zu@g9cv-1;5$RWN`e$m<(0hov0F6Y)~dBRrfqPt@>(vs)OuPU6g^!S)JWee<2*k7*|+M=qJP*jV*?;rHkgKe zd<0MDkWRhJp$h4I`DgKPb%f6Dl;jhqo#^4r-6?<{^P87?<VGujA^GB4PIcm={_piT>FBh*(mIav%QJ3|dFk;9Eag<`n#fmeGXCkV@?!GdR-ATh z3Ykh+7adQlmIq{{9Juk>w^0k&=cgTyKXlH>-bNJ9Fe_=C3iiNv0W_z4xGu}Wzc-eX zT;vs#b_Q&N;_a6?+B+Dl^R~yrdis70v7~D8za?!Z^A*+7-26B#PZ*kfYlL2H zespylN6L|b;CS~l=bT5k&w9^#Tl1Ogqhh^cPvhUjXLG*l>5|v+AAEpryu7~q>Dwc| zIQ}1>P+ebFRPk@u@xN4)X$>6z%7aVNt&S(}PVySH_c3lyP*u;J^p5;|d;45BxUHL+ z4>oo$&xtvjOT*5!=kS)gj@<3eIiWfl)g&ClfQFvte;0d3`{RL=huysV;gIj~wP6$q zrFW*Mqp5^bW)Z_S7uwoKRo|2gz&V8QYc;F7?ToiWw&R><-{(um%EvWICcFI5t>F;= zll#_axQ;J}U!3zbf6}B~*sc5V;+4NPUgwi!3!_I-T@ygRI3-2{p^fwE}7*-(Xir3+XLdYU}Y%o%3Ag?lX`bvcEuLHw>SWN?PtPEc*@ z?5RsG2>ELe!ry&U1?8yAXDl(X7U*J(MNIhMMMyK!5!*lMm!xqQ*7QKWd%LN;wVuFZ zZrU{bFW#5!I5a3BxpZ!r;Jg3@mOyyxyl!J-^{hp6D?S2qh<}MwCd#%jE1X-nT-O02 zoe&V>-i!4clNXx{k!Lmja@EKW!fs*)jrFpa>*dA* z^VhY`ByX%EW6`~GRMRW3Ft~@V6C(3oADeNu&T~NV-?5~f`M*nRMZ4pgF$bo&gbg-` ze&YhgKSimaL(L)K$th}WDQRPZ<3D)OCua2It-^yB8IrO{ERDU#;d}y z{j-%BQ%KPiy_dfE(_}tgo%op()5jzhWvjdN*M;=J)2Kg<{50-M{D(dS>jHZ%8ykZj z#Wshjx3;lxTX9kzq+Tw|Q4NK_L4(it8vIca;x(x#}q8W=ZJO~?7kM!HEd+*g44rYQAx!v0_P zW?V#T#^0zNr94WNFqQ~JZ}P4ylHHo|ZOI#=*60MZ1TIFHmgAL?s{Y3~L_a3sxa2UU ziQ3!*Fly)&LE@t9eH=H67yehVoiGWZvj~bs4~37`q&jU?)#F&DXbybZ2{Sl}zf;~d z>W$>Ks*eLFVL-3d!mw>yUHA0Z%vjF zWjrrI=v*HJaX|9FgSR&>QC#!ufNaU_!{9 zRcS(B<3Hlgn}^fdFe`9?TAA(yf2=UADFLAMayRWhG!wl&;=F(5< ze*pa8l|JOgx+oo>&F4V!$-_z)heQ3HiJWqg9t9R`)NqW9mD7F3^J>djMq0^hB5LR= z4P1CD>t@m0jQAj~t>&ZZUwWh$I(sC_v3>TD`Cd@*8k_k*=AQGb%c9#&M?1eZqaW|T z_ffTJ?Z-KfiA|eb+luWWkF>XTulMadnbJJI%N|3vkN55Scsu^Q0vW?8Fl9sq-k989 z>CBk2WuWZjC?`4zeYC!|tk^9Sl7(>N;To`F9?r;Ww0kZ9Qj-C+1R1$g7G>nM65H{; z;d0N;-;$^V#JwyNe2#%Z8dAwea9JhiEZR}Ptx3c+|G1+Tod`(%Y1BT7%=h1~*h;&7 z@Nr0!_f$`H^jao|p=6v-@+EJPI41BhU4Bw1L-t&f+fAZpa#3`uh2<{E;$Cblo_fPcWx5w8X9)22nJIA=2PhtoW{KSm{n_iu<7-<>#eG^8HP} znBeoLf3_rn{H|ZW&ubF@>tBy}Fdl11yKEl#W{Iifqv409_-#y>@_*p3;HUGaW(!*% z@g>(@{Pg`hTB(zhbY8&Z9BMR<3%ax?TUjaj%9{qR?a&oRwGn9}OII(Oq}?d~&)?ip z-KKmi{%?dQFh#{#!q)E-Iq87kuZu07m_pQKd!0ue0OIR|_vhU0QE!o0(T^W;O1oHO z0dQ$0V+SEy@t^j0!hb9KvJZqW>rvuJQi@@*jO1{#g1>A6+aI%+g%YTf93#aNw_ZpQMf=2Oi%AA39(x&IMGXxVJZneh}k?wNH*Jy={B_r7+S;Z*LLu2Ez{O4H4(nE5fIi-z zHsV}?^J~xt%36yd;v-wff^^hC9L0e+mNcBsHUFQv*@5YFu3X8x3<`hLRv&%DKYV=F zTZg>StW8fSUMMl3a)Z&BPWL$unZLAA!knp0;WKT#0z{IM-rqktzxEI`?6Jx4ke6bx z{DJ789>j^O&9(CriE+gK-<|6<0Qz~EvUlZNOIeKKzrQ-E>7x(sqjo;#a`C&HE(xGL z5VJY5{%_Y=2bCu!+e1*#X+z$L_t)Yd75|SMEv7x^+u(6hI?J3O{GMOLQhxj*^Z}Z0y?uVX|5(KQYAj@O5F3wz>wxUi+2($K{~A5cM4jgDe6@?@ za9f`$IKGSez4tzvd|uJn$r6s-*_6qgEzr-ng6^;tk438b#E(2#^8zklK0Xq-pPwi= zjxT@Z!^aN=4pB0}MWKf(9MDx@$#1k39t(F;HeGxW+(b-r*%_n%8K6Gg;e!v(fE>>j}{4;1OD(1n-3puHQ*gqFwh)m`YvjT5!z*<-nr?~U+hv)BM zJbd!yzxTfU(b~*nX-L}0er5%ZYzMfu^^!}I11^1+^}%=hr#Iv{fWOf?7G;l*^B=Mu z#mbkz^x?x#huw^xuCTT+A3nF_3_xSM%ERwstI!})?sR1LlrQe@!e9KC!^fPUN#Jjo&` z<$?HP^(K2UKdATuN4K>&BVT6U2vVT&M1LfZpsEOZEI9l5I~jIP#J~83k7yEesl7&CQnni-sSM`;Po1Qt0+rGr7Zmg@L!GY&dN^&-1|aPL@H@bw!Y=jO-p{kW1tGX5*~W_&jWPmR*2KaKBz zAqAtbq48W6o|ny0V?N9GaU6>c2kyW9&WV#>eW@c4zci=#Pp#C#ulNKg{^L&QL&UQo zLqbkx)dG_+F)i*(%&Lzb$066_D`0OYBE0w2PaZ!yZNv8`s&Li8i|mXxi61ol(73fp zIt|=&{o!Yix~tiGr=G{=zMr+^fsOBd`Qw*GTCPbd{`q%6LgzNwtoWy#tl(C7^T5$% z@a|`}m^K)si1S?3O|Dz{wBZuLt%v zXh_;I5sh&}&O4vbhk|xixwa@;eaW?q2F7FV_F}tpeuK0fY@=i268+TSZEF;u0Dz=0 zmbI`yIbwk&FBf()j)u;h_+guV^pQX2Hpj;AF|YaZOPzfG7|l!-QvhggRgHR`TJ=SX zH`G!k-4R1YTYF}_&>xDW=p8ya=cOmUAF_Sriyxm4J$Qwdm}C9p5Y}rbi4pQ0HkbkP zVb&TzO3@aV#X!5U3A|&``K?t;9zOZyFMOnR0t>JgrqXL;sAyZL3U|MfMH^`D{UOK%eYP~Cp~ zp+COD>}YeGKYY?P{z)h;|F49xkiRhOyzHA?6!EY5PUfZSO{Go3I+EX3$8$r@^DB&x z-!*yvt8?@FY#)JFeB1C(NPS?2hCN}O@*u7`&O5gXwu>6=_-`P!~8J3jpIC3he5Zu{K#e!nXRn3dzR zgE{mk{rUZy(!Qb}=h(c*hKDBsHfUY({Nx$~z}dv!OfM$>IzU+YR04g`fJKOwJ%?Ns zbLnua<6v{AW3-zA7&s?ikz{hwtOe`75Zyb40&_vXH+=}d-HzA@)ORu@`H@&nXMD}K za`cXlnOtPZ&Aq-ML_M;ItXtWq&ydA?0~zBLI?mcA!wUssuJVuh%RH`z^U>*8xj@TE)H(xgp&v96@Fzv4fCrjkCeK-nJ)d7n~?N)%_WJ{hm%tp2eQ8_cov*TJfj5#tbcl*%Z|L z1RP^sjj{0n57X}yh1R~#ndSb3C*$Ovsv7A0%9L1yyoyv%`+1c&vi7-f<7jsICa>JP zjyF=x$gbhMQ671_z3=UllLi67+gwn&I9A{IEw_q)#i{Aw$`JSShUuOHw*cw(K*wEw z;$gc$wn6J*r}dD@8-%}Lh-~0@L7yH4tg#>`xat@jkLV(|2_EV8NE5|?QzK;9PHk6F(wx{vG@pV@gACsk=umA$G&hgr4Zk*<8iT{uu zcou}sf`QRjjhn7}K9LQA?Ep{7QU@W5D;YEgUc`S8vI`!Ej;n4!qaPg{rCsb|b&d1% zVVNO|#(&RDJzn`;!rVp|Axqeu<7q&k=!xRc)JDC&7!q>)zjg?m zSMFeuSTEMv0CpWAZ{WMxH1%2YvP0g-Mq`VAzaVX$pf3Swp`+*6ybXshpMhk9Q$21wDd3wL|Gk~8Z@9`HC;RxXxopw*7At5z714U0 zZP!e^@>2M7v`f9Y#<e4 z4V|ktSNgFta5&D-%g2ocx9;GNL`J|k(Xyn44KUbhvj%ac(Ld=BtmZRc#5+HIh^8bSfkBP zq6lZ<7~U3OodcBk0J|C|rg|Swn~ktZ(|L%LycsY6zMevx0T>_K5Ag4-YLJB&u76!T zeUVS^f-cf)sF5fcGn~lzYZk)gjyC5n8`)J96MsA5@3b7ZFwsRfDQn>FrYim z!83&|DtwvQihqigQ9P7g_(=aG`3=y?Hx2eI8O6?cKXTKI-p6a`*jdM{`%*4zjR(Cf zMso2yFm(M55qu}hIZ}-1(AZ>q@&dhJUB)iR>3|IY=-6SVUi@GiZqg4%#hO%ti;&lo zWWj&pLX4FyTyqk$%#^LNM|@v=&`i9H++i~^!v0|&W|wiV^s;US?O-UJ#FbAXm#^8( z3w>C!m;@#=ZG7b9$z_o3EA7|+!pA?+j!D=8# zaSW2*I*Zou#tF~J6Blk9`Ef>$k&HP>v&I39O>xNdyNI0M!%cSapZFQ_4Ah%C?fI6o zO4T{UAH|n5AMgQqnFmFOypUo=)7z!hC0j&Hk>9XnT(~`32)Juk>{=??T1XsSknwMA zD<*BTr<*xB{$*h^{KI}RN*#(Tfk!7De$O6PPcWilf*{Rl{GfdkBdiId$0zS*{Kq(5 z?TIJQ_)jgmYE`|7m+Y&rhC#^`Mwn@nHwFq& zaPRy!<9pK;g`X$?rR$mh+4tl|X~@-YpVp4)i!Rr6;b}mE*iXk^4r&$4?hRWA7ep?K zol*ZU=hr-07!-(nKJeIMd-?etG?`gA5Xpt-=eC2z{d+{>E#_AiJdg0C4 zPjh+B2h0eNm4pRvaX&$)jp!S9CufLmUI}KzY%Q{d9a&?LbMc{+VXi0$&Rd|%@@=g554Tr{BnNI4%hJn7tOM>xmM~Tg`vIh;ua$r%uf#y;1mJl`KzH-lMYr@& zwF>|3dd&607^k;=lcP8&0x|z8Y0IVsBunjqGrn4orxgEk^C$h48W<=(~+p7u!|=xx>A%bq!&CY$=jkjDzeV{n1rIcp$yt#}(6b%&#VEtipA|ftLSytmVA> z_}?hE)r=OnEO2OpvD&OcF5d71IO035@qg=VC?u~-75|Y*YU)|cBnF}75|Hnk(QsvV z>&asqKTVPB=#~l-EW7(|*(CBU_UPzkio^~t{Mi81z6mML+aW-mx(dX3cmqO+9m9ALP+xW7TgZpcfwvuN&JMa3 zv{djtO?eMco|_G)537yyz3m2SwJY>I=`Wv;8p90eb*HVIl(z0euK3{a4!q=p<&an~ z(45bbzt{{(pBVYyiWjcMTKu9kFnlZXI}A?PA3bE#JTR&aF@~}jjcFOI#lLT2GW4-T z8VARyN&FkdX2?@{gy$u}aN;V$7kd0JKU$*+_Y(h>mr^&DgO`pRnG1~ihb%Fy+L|Iv z6}*Z6C2dc9>z?9=mlBjXMG%OtrAoNv880zk*Y+Y;%NCIj!ah6~Kl4q~Pm^cwIeOP! zw70EQBqpIcX@kiQFD`Ae=}?CIX9g0-QYV88fOl`vDe}b zi>+Pn^ttWsK1bG$PH$^Z?myGGZ+N;I%loBTm`g12aEwYAve*{^9RwqmdIF(@h6r$! zQ)D}{?F2+b%6Qenr3wd~)b@XQ5}F=uWIl~kaIq@xz=@>=QRiF%G>W0%F@m36Xk)lg zFJ(&){`$BCYT{N#L7Y5$lfx6#RmQm-)!j&4SOM%5GaW{61Q65pDr{T^3#ztwjQ(fy z3N)AdJYYiZ8m9<{f7E~`y0IqkjbhSTaZ=--J{`r(-Sr8^Lf%v8OrA}ANV0Qi^=H|a zeT^j$0OxU8z~SY=Kk40&e{42kaqAV8*y9NZ+hnzJXI^YO-;MZWi4EI=sUKyR^2eZE zXH0!g-r}Y$zG9-_4HN=X;XaFDlvnmA+{`XHZ**K})g|kvN!Qnj6Q7AEIF+xlgLEFJ zE`vKBmn(c}e06^IHH5xbJb`FZyUpl?dDU8qV|c|I#rRo}_~1Q?79IlF#rL{S1*@>g zzGm%-yEMoiJK3ncP>QcIVqP*21q-%AKD0bbjWV!{!0Fee)`)j5=v2?egD7k1fJDan zc`wojmj5}~p7=zKPxF|(-LFYp04WPa9s=VoHzg@$)t_mOqgq5eo@4nd!1T~>))-E} z?^G?6Uq+02oycKCS1!a`YnV)d9h*Q=-{s=ts;waBhJp3o@xkj~-?Fp9$H=ah*h(ZY z1byY0e#v%^ankuAix=@P2WE@^8UWD5I6=2^A4KjjcTFz6*{918*Ij&7Hi%f&cP?<{|h4*%0vyd(4 zs$L6}x~bJ2A9*ixs1t01a5$KV_M(uIG4S=i^QL?Z)A#?fIhH@+k{NJOVirk*mWF zj0OcvAK%I7#Ah!mk{5e3N9XdmCg^p~#5pP{+m)9hF%NxWDT{wVF68L=JpgQQDn+yf zeAxJ*&(n8I5t zIYg(Dv+p1G*S!>35M0Ks#s80%_a)fzdiSoc_2QH zE$Fb9&`P%uxWDe3VmRH4BEDCA!J+NpscMG4DR{QB26CC08c)Lq1AHE_ z`*7*uYa0gwO=R<$5xpMMouq>&>g*=F1!~e-35~+#9gEYa=;@)z5vjO}Kr12I_~q|% zQO4J4Z|JGM7rsW~Vjevv%mywfGv}2X%79-td8(ST%3a4cB?xl0idRl<2eGymZ5h(}_V% zreeCty0o6vJ#FYQ{rr3b0m;x8gC?m=HfJ{MUoQka&v{ckJd5Rh0Jz>wk-6<5#V zpW4c1%hJaw@AKnwLD=yI2W>K;@DGavIobjfhXdEYp!2dQ#i5t3oW`*}6ew>e%rZ_} z^U1c@rEH(A9U}(WZ;2RY8=I;Z7+4SibbHq*l51M7a z_~eyLeFj6N7;`O-u)g|M z&QTZethMJsu~iJxE07O>NDoGH+fudNcoOO^N+Oibrn#B5h%%?y2Cp9-BZbi|_xe5~ zB7I5m^l@gDzr+t*N%mOe5&MIS@y16_-jswm+{_6ltsC{-bMvP6?a95Xes5x>XMOES zTfgYf`Ig7kq2Y`G*Jp2eVHJ>A}zqmTO;Glx)4$Vk?ax8ioXSCF)^k< z8`WKtlF#cYTAJ)NI6zyi;-@`oBL=HrF)%Y(V31C0Qh>C3ck-}5Ck#D;hvr9JQYSwM z9@qK3`?O@@`BdF-8Me1U60!P{_SDTkfEQ%ACv~8@O2NG*fpeVk-b{)(2eyfu$3^q? zZYs`~tf@+oed^VRmpl}UyDVMTsbz#hF1Du_l%q(*JyztaWxEM zF$(aB^MboDG5KAzZdAlQbnWD)BuMx@!$4f0Z@dkCc8b{N2xdP~dZY-;c!sUC2NAkm5cT z7F=U+DFiwYMVN^oEk28e#;QIs9M`%P{VLzAv1MXMc`^UBI)|10b`yPM{Q>a8yFp_t zU!qCFP#f~J2PHIgE{;7uv2SVHlL_{X8u7GIT&B*l)WN2T5YUgahD3&cuKTQ*OmNie* z-ittf|eXs#_aAnh(!R0(E-m z*Re_bXH7y~o2%qn43h?Go|pXe_*X`y-p=~J5ncV9>RaC68R`Eqgj#lLP4f@)W8JwV zqg8*7yMP$U|A|pt8y3#hE7Wg{tI^$Y(z~_zSFdLR-u_CqXS4d+>fX#|5bFu$0d!uV%hkzSl9dkEd7L`rno_@|70L#TQ+rg4G+n zjz60)%kv&Hrh^OuMv2ZOehfqL1maF-{Yw>QyuIns9Dy>$q`gB23JSSz7xeo%F0R{? zwy$a(8$IgeP>KhZ&p^q{fQ}2^5?N5TfVW6SR`jzmJ=N)(Cw=_MrVKC&=*4V-V4tiH zz~X4H&4u;$@&4ZUvf$gn6oOrDg)_*jm8~&$MQFSTNGzo58!w$7LjkU4bf~@D>AZ$u z(2PmLLl34SUAnvJQ~w;8=}gw>1vr~8ecox5rawm(2DNxZMUrES6~~3U$Jjg0D{0_T zQhic{O&t0rZovx-(NGgs-6WOm4_YaR7&&vXrQVhCz96T*vV)W0Z*`ZJ8}h5I7ic@M zTR;@NO272syvkD~(M&tgbg&s`9k-jtR(FS7l)3WauB^Z?_o)Z0>q~wR7G|-;35xV< zgoVCg#gkA?N@9}BPkJSOExx7TB9VlF6)eGjMyopn(dZF6rz3(AKvB!}p;lTba3p`XORuSrYgve093wAy7{ z6<49czyleN^+oj=Y{Nzdq+ScxcZo-S2w~PGyZ{sYFwfK#nkzS1kHcU9)dq_<@usza z(oHfhY)P}wr4h}*=*UmGxkq(|w>UqJ8^wQOs1t^Ou#mdTd_?41Ji2&7-s9;f`w}1B zCyab%47ND0oD~lxgnxPY9gV>8Gq5G}wa#n7#p;vG?t)=G{)=x&o0Wi&S1;mMa@cIK ziGQ-si2p0x+#d(YJI#4EBQG{N{&_(-zNP{~Bh(c+CvhQ#B;R=4v}OxtQuz)0dUQt- z*05w-hrKF(vfag4j1Fw0z)fJ<%ZNnS{J}D>zO*?}_$YZ-60n8}Jv2DxA#y@q&vR@2 za5?{1WUTwV5Ea)({hzpy;+^e4@7HUfPvInC7@$O>0uVxB$CanieAyX!Y*SlUXDKh= zo$ohpBKEAJ&NAj*X;J&EGkDCg(8ou4ljb&-ipDVHoOxR>EL!KdJpPivW@_WLFP4X4 zKk8K3pb348Tt4_PY&fLmHQ(dcQ=z*D9E*UpdezFuJ?w>~tMRVaz4PnSJ2h^gICC?V zZHqY_tJb+IO^tuu%nQ7T1^=*1^iA>(v2`Ebu(1xuKef&Hw??X&Of*Km#WHgI>#^iQ z`FF`*vdnsr`ukY}ar{Wmwzh${useg*$j+PkvhaGxy*@A=3Sk^b3`zV53%K|a2VJap ztg@$#?v;0+99OtfM(TQX!MQ7`&$!=T7ak#_q3T_l<6j6N8Z~6w(@q*IH+((EYubx8 z{z`wlXz!c0f4mNV<^9M#jwr6vEqHOru;t%3^j(slDl8`CVYKK#`Q<#nn21EOVT$1x zwHS^{B;-%>lz>BmUG;GyOf2H_&g>c7%9A*M1Mm*?wJ>JHXA2Voi%0^+cLR6Quj<;JZs?v8X-?+o{^IHW*yOMR7%%?-EEg<{_;k_{k>5kH%{M!> zv8<6`deA!m=juA;YNx-*0*SlmFM6_1xg^HahVlQD1QB{*y8$?}(IH3R#?SKJe;y-XXTmRh7t?+GE38|#PO6a?Kns{uGhiJl_xUdUEDoNq zrf@v7<->~}lTlx(jkvK`LgS&cB$uX^oPJ<979BK)aGqp0S75&1?>fd3vzH|Xjt|T8 z^bOaM!FkQeh+%hj#^~DOKU0R0-;zbm0B3uvpl^7vW~O}#`+J{Odk*OGtdGCzj}>jiyPYRE?7tSntf~J({wFRsQ^ej_WVz=+nEe^2%L1B z3ve;ceT^X)Vifa>VJ~-)n#7m<%7Bmf4`1CariVy94^*5xG#V>!bkr8QuIFQ+0II*t zPf$ii{cq<#TwC3nPo^F~{dd4TuL`L#ISf>x%FcmcCkp3k8fy?+OTf?SX zZ4aC0wrSL}+xgBFH}g7(f6`?OTBGFNAdoiL>u@A8)GR>7tow;nCC(rZY z9$l!_PlIsD9fI<5O5|9J_KQZrid;;wt>os4_-<2uT;#$HsI74?NFQ`*#YvjZeoOohDpU-~c$L5`l-&0!6|TTVzB zgl~*I5JNwk|L-1@(f7<|&82MQe{F5Vb6tbv|G|!gR|yn;AuiMW)*Hv{GcttxMf{h4 z>Ut3|6=Qmh7uf2=gm=+v@F($4f*3Mi0?O-%|JBLJXPj_9`oy?<{|tH+rMAGs3<8*U z!b1{_h$y}D#Kql#n#=WSxoQ^$fSOZ!4ML9XR6p0+gBpT;&Q`y<*tc<-?P1`$qWU@p z8rs}69$1$a#aLrm^WV7eBw0yLt?OI%<;83S24aH?d7 zY6K7))V9IAOHtFWP3id6Q@m7b4}O~rcsu8fAD%q!QWAsSZUFv`i#~N=-ZSW3A!G|J znMfEO0&?Suk7Tk-nzr%3vu#^yN*`ugCnH&CE`>`mQP8u?nK@QaV}=9ZIDyx$ws*YC z@rt+g7qT!Nluviw9O`M6C`|`6_G#}9Cm|5>j(K>*pAc?#U-9lO{&!do>=&=*4t_1v z+Q$A&0BAs$zms*#7i;pKgHXRoRQ>N_5d|3BtIt*2J$<&GJ#C*YT+efHGYlp(i#TtL z6A>eRcyh^wUoB|a1yhg-LtW=WXGD}>Ot;%^fx@(VzWQ#K0bovM=WF?S|74unGA4v~ zxY~g7+wpo^zPsB%(r7tz+8v6EwYX>E9aT_Hf8)ubkx;{0s_3HYb-^hws8Yow3pkwzIvF{Iitkq%Cwj% z0K_&~wvRYpO+#Pd`6aH+9J^x5=WMljOCQzvXI)#9X!oR_12Z4v$^#uv`92oZZ8I9P zW1Y2(LznPpC+V4-(@tEdg^1eFcs#AR{KKG~hW{>Jm?ke4aM&+Y%6Uv;lwIr=K2x%s^^${LF^*~tWQ2g1X`qZl|8WN`PSB3d-fR%xq$0Yc)z<|i> zIVcM5jFeZK>3!Zd%Op#i%ajZ~7IqtME9Td!+6~yvzr4vA@n708p%MOne0zmQaG;hTANSw`_W?9RyUkBaHNul!|{~(^T&B9|!=+EQ7V?eZ-hhyqUV%;eI z8_y8gx{i8a74MMPIdm)^$!nbPD0Ry7WtRQ%(6Zzoiq(`yHIWn?QZvM9aZ)*`{FCYE z>$5BKUgoCMEb_k@$D8u;tlt%luY+eUq-tT20?7-A`v%Ez+_QM?;nD~E`Cy0H|PeHOEv%)+L@G(VNk34x#dxe5|4Ldf;# zmBy|gvsqM3fqfHuGD+`#k^C{ZR*|0Ck=(>7q4=nY84|RaC3*S+0{P?MBC{4_XcFtn z0p-L62{QJ{+B!34(1qyW*IR5Z{D?(`MxAxZNxIv;Oz1Tr>6+D;yhZ_KCb7XXSP!PB zM{(O14bQ9k5zxYl!tgLkJ{jx00Z#D`)rYm}`h0(4NS`S1ll`?w)UaX`MG*rx%4NJT zau(B@r5dZRX$ig!g_r!~pE<`_Iw079>`Or}Csouu{K26Ut1A8pD+&@o0aNDO(t_ikF-dAXWIl*c8u9OK5X^Byo(#uwH|#2k z%qhXKyZl9)K2*=cM)+CxTw~cH=F4wcKeiNOtQ1a$ps#&pz*zm#6b^>N^%VuZDc9jU zXThj@VBLR8AKHNFMg05d#~8{7FA#*?O6NwIdSO_PkO*sub5Pxm)PHW$vdy2wf8eO| z^`IMg>Lf?_JNA>$7@p1QtwGhO^;Bo{O+SZ|tAxHVLZv*DHs5-o5RFp_R2#5jmU8;S zV1MvTy#WQ2X@fbunZ{8OVV*km>P%|NaZMVn*hY(gJjwsmv-2up&e*Vte{Pq)L~X!% zkFkMh_Z$((QKc)B@eQCk!;;t8a|}G+Esc;a+EMUfnhRJrgzd~r(2V#u zi1%&iAcW3%j+nf92&MXAbD`#e#i|#M(EIdj5{YFHuwM-VuZ|8&xv z_4?nE&lZ}+TT)~BS;Oq)F0Va4xE0S6d92En(EKU3HgJtQOcZS~F(&jG_e^k97rKw* zF8NGxYv(_iqe%vEdw9lIaiuYRi}+o>6m}LtB(PikpZ5)1hcA-Z&j?E_DZ22=v-z@g zEhr01K+FHG?6%g)3-x=<$HEt>HOF^e6F=VNQOm!W*Jgdm80XXPOCFZPz+TJw*-){c z@efE%!Tu_t)fw>G$g*H4;vX&kP4Pq}kNB@ar98ALN5`g_F|iqm*^fFZ28_Y!aJ4F zVuLqys>rb+PmWjA@Y)dxTZ?4Uu_u{gs~_1K3@YTtbPLp#0>YnE8f+_ zk#z>}LW)ZZ+IUKwEE@%QD7}?eT+xOXMpG+YadArd2Ttx*9UC9k=wck*?u=2KhrBZo zwk!i`_#0aON7=xto)KPJ^=m{h^s0;abuTc6xJ3a@*{J+_$rJu&Hf$!fPddSjA;Acf zA?rGwJ3DWi(e;HXHd)qdGQ8(_xmb;cZ7u&_$A2-F6DCmnFT-+e_ALI9?n5!sKsVGX zn;;>UfCE<#sd*GrcFF1+REgjMe)xICprHB)e)_J*$WTMh2cU~j;+MoP*OXb>wlJm z>vs)4R4b|m%s2i~<9QYU#Us~h>gcP-ijmI0p1a0zI`(;AekZ97vG?W@GjR~zYrnSq zAM}uZptz(9X(YFE-Q$w0m?oJ!>z5w>2tAo)&fr|0uM0!V$4xO_wUj(Frk$p=R*!K2 zV(QCEep~#~(lpAxC#_=LiALcp=N(1@;oe>1jPX7?1}3`q?tM1EE^NZ(<@`TkZ(?W8 zOX9xpZxxpr-*eqW;+cHHa&VeA^iG7CI<^m)3kw*BG}5}sopAL=@+VEghmbEQ-S2f? z^W~jIPFgo908H+&W}W1@`;;R$m<(ylogcD{F{W&o<~+J2c@?Pm^aXEBi=-yPJA@nj=)dr2`2IU}Z(Mi<# z%AbL0>^o2tia<0PU3mc287^`>jsL~IGDnHvP2xXdv^)E{m;9}Ny$>f+yBMBpjkqBZ zW7fu9SdoL$r$Tdl!lm?!dyb&%e<2$CN@R}6pS*@@GLD{wSTrX>#Sx1Ud1LB`L|xP} zMwk9#y`!%t<=EXv8*Qm81_i7!v~8i8vC*Vo-0vH=jMaVpAjYsBpv>3jzW4ignDGDY zW1!O;bRiJDD*weX4O&EB9j9f_K%t3Kjkf{V7|Z$|;ov&+1y6YUz+>0m2bnr)iPP3O zGZ>g@Q2rh0IYoytYk&v%mJ+4~j24(Bkh2SmpSp9QMx zrX1aX;FwLz9`|mKkLs@C1@weq$os_JG&jvV=}(&&W90;HWUQLnEaJB&W7Z1!D=VK@ z??Imkhrfr-Wy8$9hfT)L)&~ru5N8G3E{6b$&sVv;w`n*cO^32iCU|0asj`SC5+reo zMe>fL(YD@ivCq1aY>vM!4{Tod+3vfX)MH=x#@BX~3_NKlRzWNZ=f#A;?$rH=IHS5saSfaLf*wd{=Zj+*LKY26D(KRj;yU|^#CH)$-hhUm5}-bO zHHMRVpw*L=#(FK*Hkda0XaC##mx;VGom#iNhzW1Iw6-FNX% zaV51kaH&%cP0>@Mt1d!XD#vY}K^Q|ZF=_Mxd>rJ4F3%ndZ%|P?v9g9#jIDfs zb@X}MJi7C%BDyZCjw9LWK49D0PSB^tu4-cI*{>cG(_<`>K_(1`19Xhy^xrUk8X3J# zRa@dgpX*9P^CRnZ`GltPoSrhb>(H68#@DeK$?=*`Fh4?V$rt>cmufzGyP2p1*v~bH zZ5?Ns=cw{yqdS`}`a>^7nB$};shzK6e`XMnT4yj%W2OB5cr^3;ofOJf6YEv?9Yb6B zMDLf}LA%*|hrfJZqkA45Yc>8gC+v=}feq*~9)yh3HSs+D%XST?jMh#_j>sX8JFa*w zp(umkLP-;Vb^cG7Qc#!ipTcej#n4-J>2xmRUs#)jhJZVtWQ-rTvP;ik73`<4jP<`O zsDUC4KU7t6lr4SZgV(qj^mo4U%n(X>p(@ldREKsUE9aDeAb!BIdw* z$WGj!z>MAP3x-Z=ed0`$qvC6|bD-}KhD%=+Fh$>oOtvYQcGqj zNx*QHgHx;JSq;ph*(Tx9SWADQSLMGbYr$UhV%NSFLW}%)9u84NjhG2PVPG^8UUcCu zsGhQ?ZU>$sCJsUuQJ~ZUM)+ZmkMPmmlLSoEn&Uc(mr5FnS+YpT=352SsXiBeR9@#H z!5dx1oxIvtF$y&c^l6G7yZsopB9Fu-7C1ID7EKc+(w88Km>8jWDhx~?Duu)P=pM2G zV*xnNoAm=v&A^)6(Ic5*RFXL)KSzd7jDNXN8+Oq z>ByO=g|K+~>^Ne=7kHlJV8z4IP29gF0G#o8OB^LnGacVHiNwIdSmh2RdC7O#mtzya z)gnglTQURzTe>8)Fv1?=F?t>;HY(4NZ+XKgD=cB$gvEx|-XCimH8wwKnAmtj7VML!xW8CwfrFm}}HkI8a?vdk3m-SE7J9nw)IQ}^YE!>ST_5m}qe&ax=iFA+u z#5?LA3u&q8&;j9H;4eB4gdtFl_Bjq4-^up@lVQJSSTMk+g~#SAI2gkhn*4_UPlK zgAuY!6Y)dXb@lG#x*MB_yuQ(-?PD)=8F3Z0usi50gz@+anG@cPa&z^o{8f4}8Z&*}G0yTBUHOIf;1q#3zH#PqIKpoSyZH@(_d}Sn~lU~k1Xl|p2U{VTH@gMmnL|N@P z{;8YF@E*K2{~H^R58#uXcSi77fD%sJmzAl1B#?v=S9>#`M0st4$&kc=Eq)sYHY z?JV`kbCYc6*XwpwFFfinR|DPKmU(c~L$wn9O_Htl1P9n|Y$TMmIfxxMTYKFBvOP9=QAAZL% z&R5gttn=%dI5N{N@bubj$N)58Gb6~P-g(u5DS6Vu0~$$R|G0R&YG4tO_UIr&&B6kP zKAt9A2EVw=MHt&`yAjg=T?#H>An5TbBm&Ky5TA?O*dXcX%l65H=eqdJ{dl8=HPVZ| z;orx#J6$l<3%dQx#stSb{G<^!8h@g=a0#(n4P0_fn^h~3CSNb=A1Th+Z`gjuG@N|N z*nik;6upuE0JW9XxdCm0cAj~QbIJuGWAGcgUsux(eX<<`+hR<84uWgkNh6>Ytt9&< zq?>F^$9IN<;$ZPv>Di^LmGgx{$&Jp2x9$Yu&qb`u<*j(>WR3-#864C%$Kp-xipiL$ zggpXp(msyF6v<%-ai}B;5vS?I z&NUDdO z==$O}WyrT)vNyha*rZ->YvAMU4VouRbr-|)gf)lVb# zcZ>Qk#bSx9hHNg%H2>;En%O^Vxc4Z;#eSL(d*rDH?R2T2!|i&k$_Y8t2)2hr=k%JWg9 z1iqasn9_7txJh6NpN{!K=xPC0i3d|bY@;E_7V>y`1}^cHG?y8iAo|5tLJ_XytVp{0<+YjLm36t!jeSYo{=vz7mv z+@ULLa6M@zy(#Q_^ChIXTy6FNUkFJa8(XMXue|&p}#%J-vPV1?=D^HA3 zIp$M~yZjF)@2`i0%qss^T-X@1HYxYK80jw8;PM{#V&5#g7u2-?aE!cM9U}fw&YbbT zw*kLdsaN8p4{rdiW7Lu9XYUYF4w)5$y_Pj@s8$^L{^|UG#c5pbYa^YOqcRk44CpHa zxA>aalPHCK^d;KocjwKH(OcW+#8) zJVwpaS$CwcOs#K_DsK=WEioG>rl0T>_x-uN>uK;J!bi< zxEoP%;T7Pd%Q$}Ca!BRfb?EE^_oNeJ+>A#&|EmReLMhu=&DsRpfSs2ax3}hV8Fjm- zE2wvi*9g;~8-58y%$P1Rwe}Bb3Rc03R#DXCQc$`>;Rjot8VY1;6HCsUOd^Ca1e!dzzdPVq{j zv?eDP-XhZ3S3Hdn1-A*%vaT?l-B9uGrN^=W#~9GjG}`u~r-JEuCUi^NHcAmPC%A^l z2`d8oJ$+0DS9G z=MRwk2Hbj06bw{eHF8X=*s_-YIerz45cQlzJ|n#v>mcycRW{x{)v~At3fkq%tVtHJ zG+0FCUAQu8ZsaWfIt@f&e=Ka_KOqjnp6HqS=wVvCZr3z6m$Ij^9)R7{zT)2{H`DK_}jOfV{yGMXv;$6DXWl!Mk~(>k;8< zd49=+mi;+9h=V-kHqVUy1?I;FYf%CUihQJloxEgtIKStFR>2XzHWxfiBo40kq1ITj z*3Jroos!PVcGWlmn83%{gquKGz^Cb)gT4w~o$PYkhwq>Ro55fsnf63L*uCEP`i{+2 zTtwTRY1y}ILXf-Kg}o-YBPpn7Q3>6&T5z2o`nV}^NmS|)oY(=?dH7HkLIHfB#aePY zTbZdZp6Ldax<B(7wf62zil6nZg!$8QP?!s_$-EdVtxg3iSUPD(qh%=vAIO=Q^a8Gq}$ zVh0W{Vo_JiR}XdGy=3-`mx$Zoy*}0*F3U6kj+?^M$cZ&^M_unRwTXW{=0bVdjA(L` z92+B!lIIv#W*1!0D|Uk9E|WU}i;-wkM!{_rkMf5nDfc!WsI2Zz-rw8xJt?>7T6C*e z?EOg}@o)H`Box9DfoWYRjrcc;|Ma=#bS{iEW|f&52b;tC{XQvp+U4nSBbjx>VE?2c z%apN0IAj@Ur@e1+G5wp2MRl{p03sd%*=#3MRn8*b-9-+@c5B1;qiTkT4M zpVh172Yq;IZ7#2O5&w5o{5uom)9_u6;U0L|7GMyhc{*~kAK}}S#8KfJ8Iz9aOOIZ6 z>6wp`LP!vH_Sj zqj2H(e9b8q7nMO%j}2yGA4B^_j%PLTf>(A3;#mdh`LZ6$i1#Sy2o`L^Qvmz&ZPAAn zUeiF;-ohRn%T!BB$B7fQk#K#4PBLd$cbIC)8)m<+^xEu=!OR;UlY!)q=@t%I)|I^Jn;X(7{d6qQd=xA? zi(Bc=z2sh<`i3><(z7K!6boQ@)XIa-cijnYQrW{UQhye?@;vWh>O^Gmv*aoBTzP!c z>n{Gi*7?ejYObB(432-B@eh>m^f{uhzl=4W|NC_=At>EqF6KE+?MO~-6gj8su>tGi zrJr}Jo$VFQ$iF~wgM!3dCuzLZgC>e@ZEL=GLf?M#!BONn_GvzLp{sWo|4gr2-LHG0 zr#UYO9O72dgw&MM6jf_>HSoy1c@z%`MJ)2>C7ORo__I@c;SvYVw>CgtIk;f1iBiuP zi36Dk88_53C;_D3c`FVXBP$e?pAE0g-4=0rZHs5H1fz5q@_h!HT*8RRiy{-M1bH&C z0TIK9p@UDna;q84$txl;Aq&ECa4096*W1fejrzV8Tg?KA9BBjHd>FYD^5>hx5FA=aV@TApd~dxiWd*Qv3#&L1KC#sN1OmE$7?J_iWKO~2s$@6Ob`|g@w+&f1L{quiu{n4t$Ttd1C zVwFp%?k&#)>M2qe-wlYV%@4?&Gh{Hlfj^k?95I&HC_nJiy{&s^Z`>bP39Tn`zOsBp z=gk#d;t#1xLLOt>E^J{uI)39%HjKb}gWx#pGq~Zn(UC+zaXx3vr2b-5-mHg zq_|_lm?h5~q*41bTn*wzJT|AU^#VhmFP;yZ2-}rMY}zB(bVtj<$lAXUjyJNC$rO8` zM7B4SzsO*rl`JMr+Vi?h`Nl5VOFg_sqIWoMYaFMT9)1!51c29?=7VI-FTB>DY$=56 z=!j{>l@^UW?x7>Yi%Cpc!( z!57}_^cnF`pJI}@S^qVFR$148jMwSlrel6<1LVoU@TC(&&&h2Eqk1Bch>-sVNM#Jt z!3Dq9$aSB=W^+{kq7f3rgySqKK;VoTuSJy6jdN(LKd(g*%cM%Wv*LMMXoLH4^4Kra zn)Hn^=;^s}*k}t*k_1q#rqF^9n}KDNId%l@ZX!}S#wgKMJ6^zz#GM~^OZv+M%Z_)l zMcPS`e}DK8hLU3ZW35Z*%cY+JlBxe=cV2}HFZi7-yLK?5>%~VUbk{ZwRJ%PDEM0ht z1*cZ-Xrz{SLPwWp_lue!SCKZp1 zm3W-Y)W)@BTy)-_5E35f{Iv}Oo|HPMcx~3>0@lEbDzS*-OXuhLonu52kzL z_+NR(@C0|+-uJqFzt;pi^Iu{)WMchzf2U2e6=;>OD*p3mOtFo!FouCA^;HX))DBtr zJ1`fZp$Qq)7EYT}nLBLM1UY{rf|;^`dT=XfuRP*L{(4+rUwsueto&c&Wtu_BoaeX2 zA1IDnB8)bv`=$!+P_g5i{11s$&7kLTvnu#Ug+WBbUs_y`*zw}wD*nZsJXyu&Fi8A* z`lj~tA%n)IwtekjpbMM%Wl!&Sxh5>86Gy;4W!$ggU-S~)SPCmWjFey%Ux6_*|4$iG zlg;UB0eH&Kwye-!`mn08BPRzkF!tbUjeip2PVvt=w_a~;$R)-GM%o;Y^Od8(ifag? z_pB$2F~-PAtp-XgtoW~m8|xyRJP0jMnUb>La~s)6ex@CHp9;CatH1@3qT@lgD~;dd ze=%IAz!n3j{FnG=Pl@<tTCj0(m|Cho#$n_=gLfxyB%MwYB_@ieZs~ zUV~;?3JWt^hk?Zd0O+3H@a=WR45+U_hxQHMazx^#nxq=pb#Es>6Fh8~Z^R4PB4W(> z)3>JnT;YEX7N^#vGpml-@y~gg&mQ4wl`FcJGp45wZnbtJ^9FbH zym|L-N9Pm<#>mjC4a-xG-UXrfX;F3Yt->ykLM`uF@x?gA_UQUyP_w{`$|+$pXM1%A zCVZ+8w8W*z#gVIJZcoBTzUY|BemfY*{Av=9{A1f(Zm`J8cIBEC1ClT7vF6>d9S8I%)@8=Q#2(&7jH?UZY38|M@alH4T-;6<=@pXXr?@g zC5+kia9PPx_k({c0n`?bHpfEOl*a$MdXu?X$x-of#+L(nEoqn+r#;e)CTKdSddv9I$6ChNoS>eOed_OM(@ZX>uRAaXplRx75tho?vk9+ zZp#+&^gu<~e8PmEN)T}4644drm z>fuCOVR6Zm3Cd=t$PvV7!k@82A#D;u%R*?%0e+ zh%vFl?z&t3Blb#Dj0MGSjVD-Um_6e7Gr!re9%a@yz{F9v|g*cZvV%U;?n~nwjtz6RN7eA|$LZyXj39_uWUF-F

    I`WZk7<^#Tm0_eA9T|U@Ub2opT;r2~Sn-0$$W2-R!$oW5b2W8{ zd4?}CiPMv4z$f^wF@`hXtV}#K^Bd;T-^ycw#`le_B1mbT?br_;6E%ybP3+QG!JcDJ zxX*f+1mZmrxGR(Mta*`Ltt^42@kQB*ifJ8a$Y0kK1rdZxJH}R@CCuvn3!#FSp92E=Tyw z!&AZ`L_Jh-j_Q{+`2`%zkdKwMyIs=)B~3bxqm$uBpV>M+E3 z$T5h4Aqn=yN(0*FRL$sU@-6l}Wr|%=u|oj>H$u4KtM}=P*Y@49h!=;SHr!x%_enRBHmd*gKPHvtXOek57K#YxL#Q zzDZv?^&7+Ix9FRve|K8gtn}UKRySGP00H)cjKVHA$hT~Q9RL1L)6d@QdUWfX9YlA# z{mtptH$RB>z1nt9!e*C{N!nKMmzV+W2-*O=Enmb`zLhx&)6i0jB0_)969Q~0}7E%>5(o3bd{SgcUCofmdL(&J{-!mw{)743m#-uCmtrsMIa-ZMEC-M)-|yw11oan(tBdBV34Z zlJ)D2588imjIvYFA@E=JNrx zvxd~+{PcqF`7-ec$p%vch3`J$U+8~5@)u|Cm?`f9`TQyWK?nWR|Ck-;Jtv%8ZLQLZ zU{Z-ceZ%8|j(y`t={+AjB^(oq@!3cZ2_x9LB~4YHgqgTo@TSecqT@?1g&77q7uDyr zSHIL8Zmx*L`9T~fs>QinE*L|Kj+e?`zT=bhp^txw3>61DzW?2e#s!7-#yG}dL>t)% zb}y7IeFr9J4dAgX;6}U2}^whE1sQUXa4k zt#5Hdy4BC!VDRl5jGx<-vI+8s&$ur=^6_t(a;uW>%XC*Qk~7ADCZ5GFpqiR^q}ZS_ zJ<;GY5J>4@Fπ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 z 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

    @x@jne*bC|lsNPDWE^Py(0_grNH6#raj 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 z zF7m057W~f{Y$t0@kVy~xkYC}ykf`xS@?$-m8v{4_znx(^ojRz7U4Zb>%(DRM!7y%3 zIzq9Y!U}g~a6va_=Q!*0r5V4nsme;FT;yHX_8tBVnB-Z;G>LtXU2;t`8(0y%j4SIN zuYEtCbqO!5g8RMahAV+;Ou34la=Coun^|*)u%FmOcSRW1WcG~B_-Qa#N|6r54c73F z4*x{sF2{{-MqFSOUoFJUbba7p1QY%{&!A#B*BHjE%z1ydBY9$O23Ov6p*6uB{<9BZ zNQHCZH5S^NvX*#uVXswn)@PAG@?fY|Fxxy#Yb*#he|Jvz*`$UPA*^DHhxDSO_@nBH zXAT^3?Zod1=y^}zjmnTPVN#2CkbLH%!=foE5J0K|wl zTBjfzZ-QU%%i-+02M0_F)e5d8GulM6Hh%_~6=2KAb>k%1rae=!edqax?oMvN1tM=< z(5%gZkDO$VYe{-Rc+!7e1cpe3R4V0M<(HbuX#^oNUlOn9JoR*yZrl@1%}d zDG9(EBdmeo(ZVML(B<&$TWI8qjA=V5Y$~R&Z-t}|)xXEJPU`djMF3jF(PE0Fcjb!W zgXrhzi@1y>xn`=nZTOAwCWS&c)T$k+vA4S=g+Ui+759;U?54`n&8f-tl>d1F!xaGI zcpnm;vMh_oa;nG+aQ$IT&YFu%Q*n+}M_%yG@G4(W2uQEQnYUObT;JGI)I-G4v?=9( zYtzNp97Z8;#;Z5IsIKtnljn)YtUbw$Y=TagyxCK2Yn~Ji?XB3!<(0NrQqR-@%Jng% zwd*OgTwDE}3r;7@5T1;pEo(EWJzw+dWI=aYXrj22y2@ASz29V`g)Q`t*a}z5;^wiD zrLGR08pcd%(ptaKM{SY|>VnP03~l6B=l$VcF>AajZQNwWXnl^U!zE0MRWk)gR%hN= zd35~KE8SM#)G}p*p>-Ep_pi#X*mH2))U5?n%&4HwUB#^#t?gi~ay6Rce? zdsU0#!;mpKg68suAK8p$IjjcbjoCo#WPWfcYHdMn=6oFuCByE}H3wQo?Dc9oWzJcm zFvod@Uga!}g|zAp|6!Vkjy)PI+Tphz!!}`y`j#Qb`lbCbtQzg(d{{=JV#f)sxGD8% zmDRg#KCd-pz2-X9`T$caL%Tl5dz1@}8xa6kK&ZbJ0*mogH>PJZ}3`Mg`6Vee4lG=;-mC4BWRA_ zve@{So9Gp~#+&9T8P;1|s_z0guQ88fotNd&z9#ZSCL8bKh8!|)FC#33QlDjS&r#{z zgJ-GDY-AKzOYQZrWzF3*EIniD9lvFKR32DI*&oYVkmfPQKMh&?Vin`VHx<`;VZP=V z?i%a)4waV|$r&Xaz3~l@j6M`7sT$xm9ty;;Ui8<(auKB*JcA7VFnK5OY2+L;{S8Z- zja*_9@@+6WSk5WFin@>3+NPuLxM z_|wA8((f!CCrTGFeg1Lj5z%YW*bnJF&(Kp#QRKL1nBVmr1xXbb*P2`)IwL&EA)i)+eNR8Kj&&pmUwnQbx7iyjfO$-c8w#LF)K z&j4J8WNz-`g>7@73RuBRaWIW(bCGEjOU@ftmOM+5HvSF+Q4w!c?h1L$kF0^QT9p4K zd(2S}9i4QkG+>}iN!-JJaP4C%^KN4>ZNzFdIF-r<&S#t}%qnl0DLt5Bsr$L+_;pIrqqA4f;~NG zlzgn?ab#a@9a={fSyV81?a!=ST|fJrYk7(ZQ~2c=>E^ah0Of?sZbtiussHHQ$Iic* zVQucnMG>Pgu~pUsAWk(%UWxNr>Z0%?IWKr@i~p6=Yd({BDY+qhWpRP*pBy@klHpAB zWgz@_yrXnw8FTy`;k@>c@stm&^)=Fycr;!aGk|1gr#ZzJ)UryC+Ox}Z^L%E10V_nW z;roiap0_HFlz(KbC3l$CRv6wp$7lQljnf`&-s!{0!wgTwv!@(PzN=ceI~HW!J%x`qO&m|vrb4BdPHT|jW)pVp(#uPB#< z)0sqfPes=1JjB=MrFxv1WTvVx;(7 z^=!+qD8d4yXDkKmBX+Uz^R0DR{+<31(!Y;)_N*=vd(50e@k1~rs{tE1{D!x^7j<{U z%LXQSck=CGZmV_%^|ue+Xo*d4kKYot{h~JfTZ@U1qxoW)tZM=a4AUlex-HkHtmw&o znRGep9Vuis;}gGue`H*05_0nOT}&@A{@V+HO&nK*Fn|0u^s~(k`(*rj{*Roe#G!fB zexq(FT*F7|1xT*c1(x9-m?cM+IC4myRUfVVfSt%&JX*cHa%mZBUg^4i)1Eg#3Vl!U z9#Y5Df}u;YlS|`DZD>o+Z-{1!qh2RVKf9?o2!y-q64tYA{Nd_YXm3rLxD4K@5jnT$ z`!?^*XQQI9Hd0M8Gg~U>nB92J9G~;qLI6xqjn`mH`M;O|9pbcU0&Lm1ljB{cqvu&A zcAP}74W-|LgS#kbtrn;%*O_U*MPJ978*hzKHd}qO(V3;{J}}m5x6t(sq13H7+S6Xv9Re^SnqdJI|Zgzq`{q z)+o-Awm^=vlc{R>(5qr^cVkX)6aP}%1^%RJ%%`##{rem6zjQZFp6e)dDVw^>`hU~| zugGn6!zycp>!r<0w!EWeO-XysjE@o}H0E|anz%?!b z?&aE@7_2v+n;HU?htt>ChvZheG^V!Y2hnO`o8KlYE`9JKPG>5@HXe{Qy*YY;9)sq_ zo{jTsAk4YAE1i!wyoqHbt0?N447m7FG>*x2A^mDJMFlmi z)15&UgBZ06A%|0@Oi~S_kX#1W>ttUE4URkuk?YQF>0E%VX9%_IjvGU4VSSne#iK-q z`III)lkI)gTwzAlobhNXA(Xkq3&bBjNDb;|wT^b$#oRHa~HPY=l7*F?*JY+qC+TQNuS;51{)w zVpGnsOq~d79MhHm)Na?_~U86#M z;hVS|-=J9Z_a#!>`G{9-W1JY`bqWzr71n9HgFk$o8o7B_>2~F;##?K|dg{$ryce)PWeHU$4|YrxWOjI%?PP_blnnPP@YIVZHIofS)RAe-{Z&} zSOM!KN6-J(_+!XSPp24GqNi6&eOL&POgwSvBDu)4G`x$46d^F%L1_Sg`yesmcr|Cq z=AjeU1XoTachqcMF7O2ldLgfYOx6)l$$C__$G5joRfo{ zh7*0~KLIQGqvkoKr5)qi=%;+qU4FKG#C&15>BREa%pg19k-jl{{i!*hG8ZeKukpvQ zt!Q)2<0O+Wz*20+xT9YNKYBeA18Y9B0_(h3r^%0-`n1>kVh(FhjAC;*Jyg|dEzZSG z7vlLft2g!#ef^q}R zy%;2T9*rBhVd@>ZB1NcN=@8C~n;)D%r6wmku?d4a^zbDIFKXmTD|{&0TQBQVR9)6u zt+P6)+-h&4WkqJz%dgd}O_uFxnryX`OYUgMz`9>hb>!?cIIALCuS=#N{fO@}=E&M) zF#y_S&`q^4ng={j#2$?rzGA%AH%ZAsA|tTlRcx|F^%ZZ~(w8^DgG5)3Sr>UW=k1%~ zF{zo@R$e*J4tx^c1fwApsfR5R>4CZE@0v28p=>bD!O^jK%&_)+LmEB8HtO9v+c z;MnT%WSp}mn0laXgyLI<}$g)923rNH`|EUB9ah^eIwM z`+POsJk`k~nU4_)I~xYrU_uvdP)slZv@txc!zGcXA63LQhVl|`mhSZQCDYM0l-+hX z7&B->h_+H=_-^Fc+sgAgFJvJrvZDN*o2Y%Rjaq6u+MtLy9Ruc76SVR;uiytayfBp- zoWkcF1)KSvzka_VErtJ3KI7E3T@ph)$h>$S z$BeIVU+0eCaxK7O{M80sP93eT$07*H4TPmkTh{n0ruOYT!HW`SX=5F`aIB|8)a2$+ z-FV|EaAWTI=dqj2%UIJVaziR8BNsPCGL{1mTfPL4O-IZzk~DdP zixxGRhlb4$#Epu|4H-S|RIhDfC>5<3c`R|I;Ln?C6yMWzInfeJTm-q8a?W7?HFqjUwnne?;N2O2X!5|&Hp<*yKn3NlDF^@fGwJe_y*-9#Z3&4%6cTnp$;w7DiSUK6=(nY1;P(?$McBficipLq?T=&$pY??Tq%!5U(d(=5J~Nn(0! zuNWzR00NWi=eSy2WXw2YstJm+p&tIWx`@mkr6g8!WRpbhe{XUgW8BWKSN z$#onA4!xL`%OrUKj?*Ym*hmFT?ZNmVY;)}o5@BEegYuLoA7(^ZfA|X-`=YLsmncSK zTscp=^i_sp77UWa%EM?qx;B$320ufXS45!por?#jdE*H3ZRe^!F#l(unrn_@%xQhJ z(aF1Aea-*t!+Ex?E3`%dmg%MutdkYGy=~=>iT^vOQba9rQu{|!O5d*yIhO{H2R7TZ zSQXU%B6wbp`Nu1t=bC8e^{hvraakX{aqZOam=>ZOu?o%>r(v7#YyYnW(}nxjlP%yF2Sd zRHiaSa^#KB{)Cq;-VN!V^GyAsn3Q1g9yoQrpL1op<#5tB!!6_kCrH#cc)fz}(yInZ zL-LKMU^24?m$2W1hzl)%0VUg4k7>Ib*eqv)VVChKAR@+`?}nC8ev>WiPIxAqo&>wt zrq|MXlT@9GmN=h_53j!7ricvMV6=!hLP1_#XEYSfS|%KxhS-BAcB-re0y=ML<8K#N-2tq|jU_&-8}>V|X~6>(V#%>U3h zGWt5#YaGfXw{7xM0VZzpsG$t4kA^$Fy5z9%!9n>yGS?vk4U5}Oc0}rl*o^U1cYb=Q z%bjsG4eTx7#-?Sjv11nIiMq*e@WdaMxk2p9vU2HSGtg5TULSPAS@sc2w6 z<2Et5a2%Pe$1IiUbW9)khAYi#U9sa)so!Gi!nLz*Bn#K!oXc~djf8QNF#`}+gMSzsSZZp;e*^7uSjOXe zg@)}X>MVl!nFj}+8UL%Wio03MIOm#r>NKvg3?X*#F;Q}!yW}#?DQIzD8$?P2?c3B6 z+Eo9Oo)C6HixZcZ*i-}dIp;hM!jn;!lKdZQ#lR>_z|ixmU8ismbt@?$tWiIWS{M+Q zV>g`MREAgvg-I*!tV=1i zI}+BOx>WwRiGRGB{}cZYoyZBCwPy6a0Q0TMX_~VzYcJfok#KFyK zuHA9CEJfc# zvo_ySZx#3wd$s=;Ez9qjhrNrUJjnW#WVn%R4OXfDWAY{sNQ~i2<&0=s`*kh<6L#A4 zh`qz#p8tXT8&XVk-k5>%`FT82fUp=17@HNLAa5`+$&}Ji;+q~0u;dh}WD8viz`~mc z;uFw;oV;TlXs@QtST$dqToy3L1YVC=Cc#Mh0M?sD=T|h3sqYjs5oI(~5XS?WsQHOw zzQe9TrKDV7DVuK&i^c1tovEkCABy&fnV2z8K%WFaIx0co^+ZAZoI?4cz7plszFAn3 zk?+tjC2xE|kgvWjT{*x^$Fx#hi`ns2Tbr4cZxDqYqrdYwEWEN$O)bJI4)m3t%o1~P z%(^BoG((_q1B%#XbF0a~a&m5qn1~{v2%r&Co5#R7ccR{PqraXiL+W`r!`p>$5BKB~ z<|y4fDdRf@h}@`w@>1Hfg=>rtU|YOp{F6R1UOS2pK-RfG^5%&3arEnw2+U5o$W;sf zvah*l42iN}ZPFF~Y9XWriI=<{pB-JrDi|zv0euFIm<5~FV!HSrnP+Tr>taq06hL8n z4f~+EO!;qfR4mJI^?A!>^RvgzuR;Yc(Rg9k=QC(5iW1q*iho&*&=oDVCuVeB6K-BM zJ%Z=?y3u%Z;gYCzvYA10UkXlVGM7aDmqu~Jl@&uR4wwUHH;#9q2Tx=iZ-nVa0xzi~cYPXTGz@K|?xpET+;p1N_kHHq|wcgZu{w&!@! z$ke7g_(u#GiZAkE05Gi8=S%^-h>kH+raAW5s5SZ{$FAR?Fbfs~g?h;xG0GDM4y^bs z@-m;R_$k`~wlIKCOrCA{;qzn3Q}-x@AYoZG^zt5aOHEb6)5-yfEts z#-of!0_bL-w-T#iehO2YYLzc|lg$_hw&$LBLrj>j292L=+kV=$=d#tp?QF;9!o!vS zqdc@|7CKG5)=%@06B)?Sk8r-`Mkil&-ccQy&kFxBRB`B{V&Y$81-6S?<>6xeYBQ}> zxg*baB-H0HjhTK1ofDo~By(NE^ywJEdT`T`PH681Ju6sg;p2BNz<`3cr z5FNxn#`$gXBn>FG@F6e%Z9YK#&Db(3LY#P|*Na&j2EQ89)yM8|B#3CSi`>;M!bz58=673cY7Fx?P0&H{}Jm9sCkO+Ae|?Fa}p3Zx=VCcybxz{zRlNWx0Ka&EI>Gh zW2%f)4>SU_pU}uG<#dQ_Msi2k>8?)UBW{#&ZjCjBCFk`Ug{-HM@L1}}*828*K&Mo7 zTK^B-49Xn$2YG|y&FE^xpAqND>fgO`-!f-CAfYvf#=lv&kBiQ#zi;&@nHjh1Q4bB$ zY+et@MCK@6Z50XnS!y`jUg z=)wjPG`soEe;@pHzA1BZJ8EGl87cJxEgEVO9Y(aylGMK!`A&Qw0d7PNbHQyTV37&6 zAD3g%f&>A#R8y)A*7rn!U{;}IaZH`OoaeJ}FsEhgCfaukm|(pJ1A)OHk-gcN+sLk- z8YATf_(2QY`A-mnMc4W2EVyNljB~i(>l^mTE*!H~Vz!PRibMg?xYv#;#2}BBo`m^;`^^1y(!i<_9tf za6xJS_^FZHh|2+{eQhgJYRCFlra%=98(j#g84JE;0K?tWDno9h49fx*al>s|eCp!F z1uRB7**Vf~Sjl7lR*d<+eJ`%DVAm7>k61iR8TeCRb-EKv9+*j(3lQ~bfDNj@BR4{- zSXMlQzPO7;B3$3Q66NK|JBV{$KO>37GW(&xfBU25|M6jB*n3AQvRyt~Es6}1`gstl zvqaa9>pVMgTATD5tJ#NmJLFX1*+M)tDXcSmaNHD<_0Z#q_x`ciCDG=?s_L(<`yv&t3eg$%6h0m?b3 z#A2#vawf;i^^Bm=iB{rdUROGdDz6-kQV4HJC zJRU0p6JXPBG@qHAmi(6282|lx0GQ*j{1tLEWTgE9%Y7-9+K=xBDQTHiZJoOEEnfa26C_fp=t+W7qgIlPV!?p=vC?AYu;!ek_S zadp^~qg!!a5uZXVb9RYYcF&f_w2`+tMjYw5hBb_>@$uCzuorpUOzfCX;I{RPZ*eKwB+~4%NV*Fsj$a(G!iv-A$rG%m5NRb6EM0=;F%@{-P{Cifv zdlB$xyaI)Nfjb#69PJpN{K&z{d7YZ4j%{M8cd){eES=V7oIgo4{vQW>x}m$3kTY5< zG+zIU+=ar9QtXXKT>qcs%l;Jq&@ngx<_s?|h{OfiTUBYA>mmjt7kkIO1I^oK4Afk* z>UFOs7rw>@dosW=#+z2gj3<7O#zPH|6f|#n=#Ouw>pSsZUftI(^kBZ}s@MJfv7fhS zFHfIk8_OCbw=ef08ltM9132X{tAC+1Ygk59MAO#AX0H8#1D6_9>#otZnN04=Xzm-X zCI@ZalB1u#(0-zyD@dl2l)Vc_W&Mu}F7hMJ|3~@1uOPG$bi6iZR=Mj$GEK5R!KJQ{ zw3Mhp?a1k!dBS>x15tCq2Pxo@Nk=9lvr{-EFSs#2EFm8}Q?QCYDCi9xe1nc<8+D1| z8^)ku;(*RJH8pynjOAF-E}gRRgWlCySn>;EQ@fJRd|k@#2XFE?8cojHye`88L zgd^EGmiR!(Vfu7LA3AK%NrPlh9gwWu{S*_r?5$7`e~D1#MPOkui~3AR0Bo0Kp@4h+ zJzGpfic?is7S;O=fz2TM;nN1|W(}&SvdzRX@YafFLtmgA3LCaA-XlJj1tEtpDQEFD z1+O3g$5~HFOI(W&c)MoXqG-4-5lUyOL83Ux#UC&(VSVqkpr6;pd+}tvzEHt&Q8>LG zp1d;O+^spZk{p(EKL0{7$gx%-flb}RodkWN$Rh}nSHl)=05~=^@1`ao9Xk@&bRt{r zbCCj;@xi<^xlrle7ETitU2F`w|9i&{9l6j{U$TvjBd)#iEj_Ik*Uzb>T%d4e#Yh2> zlN}}Fc#dgvP|cK+H+zQCq>LAeP zO^;`bGF_~bIah4uyIjxj;@e18ey=Ss>l`By9`wpN8L@F_c&cCHJVMfJZ`WLCO-A?m zKP}b^Jwwh_(l*IJ;akuSofPbn>^*~Nnyhgj4w@}cxJlrNopUi5^xumTgoX>|ea#UI z41r%vv4EDI8a2}plM^~7k3JKW$<26l%pg`22jnQd=Jw$%=Bg!ifPLR6{DP=?~NNt&}F<#<&KUT>mf;RzN8vG zgL9LtUxc>A z_`bniX2+J)wiuLs9M<9q$;WIt^@hhWcX62aChp1_8jbnX)3g763_T-*g^y9ZcK_SX zC*>{c#soW@WI&D_>%K;~%x#_8syxnE3Pu+e!WZ7^QumeewWA9uL``>~dVyeVfJ~aU zp@{;O0#ZOS$2_(9NLx_{>;$_mLPyZ1X{>~foLaSv)%dfsuTgOuh9}c~vRc;* zNMgLA0YYn}z_LhU#1r>)Xwlv5ok3`THPGRPm58SMSdGmKqtS(T*HsW;y&+N|lwFCZ zHKw<^a1N5Uc0@VJ)xwKQQG0(}l6jdZU!G>kWGp%-FgKZE=^w8M|IStU$o388qkvxCj+OkimpLjCd1NeA$X`vlTU%Z(RZi|W9qVOOX8i6 zqcUwyqqs$eKaXXU)QlJUsa+bxdk)v|lq2GOzMFyWkCVg37t@EM77HD^(PN7qs@+0p zZRZYt8nd%iNzw^|bg<)DQJj{s!Ntw8aYk{SHey(##L0_p z>Ce+QVv;Wfs56h1z{N>tUtPrhio<$zeyOK5UQ7!tUq5o{JdV##+yzkaL_I)Y_L8TH zIB&Fc(Tg6V{2%WPSd4DPGHRf@8E8JaDf|U7)ae-OaT?p(n7kO%!auJC_nYuXY@i7J>=A7sbKm%xk(o&|u3PjY z3c_CVEJsTV%rpBUCZ|UAr*Cou)0NoG`fGl|ahVgM>9(#(nQaxPBj3z1X02*b$7eiQ zF*yTjjqAd|cwZQt;#A(q`u}=E{_jrNf4V9=pt!wJ{$G#`5yJ^9;cJGhAJJ{=G#`(; zZw}IPArHlQJ-L;q>al_bkKKJc{KCRVJkL>L2oKqpcm{MF16s@*SgD>4fdDZ5&-$Ny z+0i!-3u25Qo!ux7);rIgI`ovyivIn2o*Akj-NC|dr&LpM)T7f>QTk>Jyz`GjP(Gan8hSjeqC)GdA(xFtZ7+ zIl?stEaI7fBx-~^$2hTHSh!m^NQ-V_&-s1&R4%#Sw`%_H-GuYFB%$Y4U9ADrpO@S)i*^~7W7wend{-n+&b6CJCc2W`%vM!ejd96V>- z_15FC{@$=1l>v02Nb*Y21C=eYKQMswWwB{Kk(i4VR6JNBQj3oW*n$~)yTcSCo-$|% z0O(;|8{^f0mgENhcR-txb^u;O%yt+!7*6ZAUhY^YJJ7hA@0W=&Wz7uQ01u96Qe=r^ za}1-gXk#N~CWgRZ6N^(306JMkI>#EEBeB(a^2&amzF9kgwP;PjEM5sccg_`MPfI5e zi4f?-MKc3XfP4<)`!Si`vMB2H5wD~di6`||hBs5XgGC13TD;(KYWoYXT{d%V(GG_!f@eFEua1(1Eo^*a+L?=q zHvJYciZ^J|@%HJB82{k$EX%C0>5++(Ccv&L6W%z6lP2-!@d*pUC-TRLoAf0sa#Z)F zf7tYe{baEQW;k2gZe$tVc6KIt{K0Xke_>VUomnkEw++_2m*AugCE8(MBkt{AcU#31}WA0x0 zworF8_bQqNtSJXJ!|Wz3AbRpXCj1naQLu*Idi>M7^zSN|vzIajUVN-<<*3?qNN?D3-eNjo6vz z{62`*xwZUXSjrCP(xQz8WbG3Autl(@NcLM@|J_}d=`nDvtA4=6j>&N z8wPZ4FmImZ#ItWr2^jxoEPM53yM*35uFD#N(Wkb$9i|!$+;`I^4H|!};*PM4`+FuQ zBEA7xj<1xdB$U=>-SOwWlk*}f2RK@OrSTdahNHv{BWOHb{Ja*k8ln*91t!JZCGb7x z9&A^veq|{BFCr(Z{h2a&3VPS!!4lgxOeT;u8uBMT7^6xCzE}hnKO}aN>2onv@{nsI z2CDB(atJ$Pj%?WG!qgYdvBL$^Y-DrBp44$WG+q~Mw~(5$1``cW z4z~T&Q_hW2A*IvBQE0rah(6-et;svFL%5mh!q+rHQW`E%e5l$7< z5%$@Lu+Opwi`KElT6|eWxb3!d$S8B1E>p$=RyB($GUi(=D?ictpRi}6Bj1d}bF9QH z8h?;-@Y+J$^!eX7KrLMk+KYY(xq(lCZDW1HET*Ci+6&)3C(IEmp?H;0&a|?zw^YulM_ussIvDtgPd6Db$ z$8!rliLDv%nUx{PJI6l`9YYFkvY#eI@?oq#vds9*7XQoF>BraWCD*s#zr*{Nc)Net z%S)o1ARN3wOk|Awv>Op+@R#G=i%;IRdvn}! zo#c~+Y2|z6jl~4VW1h2l+Yt#f8x$m{mfwJAzkh$l+q+w~PoGX2-^KU4 z&G_IS?9=7H&`HG#$7PQZeide=&9vPt=*sU|#-W!ROTG`;KCjGkLW0`C2m=C75*e&v z%;wn37PO(gXS~%oGyXXii?RE7_hPpnrcZwS_!+#pRsL@&i~2>&Vc15%;@iwU(CuZ+ zp0qO3gN!p}^w#E^7p(mDySF#Keg1q-KOn!s;u_*#;qMhb>K9ADr=#l-ylA+||7-W= zUsv9K!N_mk+~=P^l`pTnlzoijy2)e|quA*e(7f!Bd|bS0+n~)86lq7t@#2Hue>bo{ zYAsuI!IM{dx&?}jMh@fBznyRL1voZ$HsMg3;WbJZ%J&uJ;ECJikKca#_9k$CcGW2# z*Db5BoPgjcM+d)BXN--5h+_bXB`IUa7-asp)Nko1>#*54bast(VdOXIlV^a3LvU3PmHvbnNrIS$XyR>3^$X<{yMSMha$Le?3LJTQd&y2e1zatZIe_wN1h z$v4ON)bp5^zM@~-uA!r<+|sjZ|+*_!pE4} zMD59SY3oiQ;PQ*lYu&m@nl}USKoF!{-PzV!sK)r5D`XRA8u0C#Ywq^;mTzpPPZ~7F zf-j`tzB$2*d&)P?V>^-x+9qvD<5hZptO zf1*#;K52Joa3|AYufm2Z++$s1zCDyg40p}ls!nz$J@~wT4;5LhW}ZDDHEjN-wa5k1 z#Tp!?mbQ+R_qoOBaC9N&%C(w#+`MJ`e#G3Tk0&y3U=0)Ju8dWic7R$!i|@aAsm(uo z{ziy~zinlNyy_Lkg}})}WCdhR%GlO@g!VozsX#=e+FvntnDsGfFmVz;%a# z>wgfh)vZ1;^0bz16n@;f#-{*V5>Ut*NkG*QdExsPjI{6n=YNPgF3|k*pMQ8+M4v*x zB)wb6h!JW@Fa`#)*-q$zaxOw{ecU zhWht^|M3pU>)ti_`O9DabqA!AE<=AMtP$Pbh`yx9nDLhlWjX*j3k zXv_z;PW)hi~!YkKYWynR5N-|MyRJtyhjQw(?m*cmvk(%bgE(`9VInOTO8T`_lW+>$Sk} z$3K3DSTMTn_Fq50EEIjd8-@>fkEI<;bberia~OQb6BADb7{~G&ki2MCwpUOdI=L3T z{_uzIlg#Irh4jDt<(IiI3p_0lt~`~F&)A4z;hHlE9!!S|KE-akgkbWLJ`yrT^WXjW z9>4qDH`(nfqW|j!C(m;mo=H;^2tD~r@^j;sYlL|5wZY`zKXutXM9+smjs?6QU*!7X zMZVzZx8FX!*zM;g%Zz`5C-IpXUn6cqO6DZ~cG)Zb)(Ji&?o$eTMuEZSm;_wSe)n(R z-V5n*{QAo${QYmgsG=#x@LGJM$3JtmajIm#7ED5N&W((bPt?kfFkRpAZ@>Tc-fRpa zKmGGJ{OeyI&=iuatOOyx^(-@}?x0USNbXRsIse1g7=QB4IR5MgTOxDSkHCT)}MVT~^ zCj1LA$uJc0Kjf;17igf7FKvgRvqtEKpZ)&y=kM-^O``2T|M6kiF7@B@V#%6y)lJ)T zF(711RycPNZ;H38Nx!U}1x53?<^X^C)3^8LTpa)W`-@-x@^QtY;LRcVJY$B29S>0) z@C9dEf6{?L?XBm*Lk^(6zRCaB!zO>YWIJk#`?tUTiVwei5`~fpAq(nV0skAvQvc_e z{9u>HHt0GxDtz*Lq4JL}K6%W=;wvWq_EK+s`qUVHh-ZFkxa+)Zg~cbI>wn^z$8G%Y z+Hloyy}M-l)1SXhzq&R+{`z9K^D|?^#xOL-VH9(y`kyf~?mp=~Q8?yknYUfyQu>l; z`QECIz7`n%?f2iL9xvJc@}IvJjUArHI4I)z-p72`d$9!U^M+|omxgO15&wx6(ZBMA z;fLS7#rHqF3ytC9%VO-`|Mpvcxmn=n zzaGZ;{U3M^aN@83`CHmxIT{x2a9vnxzGOsWYshYtZqFU$J4ipJtIH>U{QdiEf5q8f z|LeDWfbI7A&ttw|aK^^{`QyO2ET&$$XZ0gg7n8VZ9gi1l&xa%HS!@>OeXj={+^pLcSp#Q zF*kkbC;^&XDvAYa9uQHZh7~P6OIw=c{P=6ldoW3YdjsgP7$_i{s9ti=C0X7-pB3hxayHV z{OSGJV4b}D<8L4F+pnMTYK{T0u6q$y`F>vP(tm{mCmlkm>fqaZ>v7%r{h#0851T~G z%O8LJ>GR&zQ%~}UG+gp;%?so~yHaz>LY!P}kDmXdAzH`q$4NI4oI>(C{`l|T+%~MQ zz?xG3_~W-PlY}?Ot}jmdZ-4j>XhK)F!EJ#&M6me14xb%Q`lxC=@$C$Na-nEOVQ4Xd znt>B?^F$zSSLPV^fB*aM@`r4n2mOv~O9CV(q4V)|ht?SqwyuF|TEx zNzCiLSvf~EpQJH)p1h$b- zD_ryAzQ%$R-=VuKe8&Kyw>badhi|edx{eE1u8q2c3U~Evc2$%;ecESySgSTa#I2?Q z9Z-Lsgn9ELF^beg5GWWDiI*o}*YVxAa}j;Mzn@P0_8t1+B#1MwVH>b+Te~7(dh+78 z;+ObO2=z>+p7MD4ah%Ud{5iqriivCUgU7u#>ArdYRxpB-5|7I=48KNs>+F9R>2?0A zW5zlat46x?9E)R@Fl++^Ve9*8`|sZ+&Fla56xiEqf!4j^kixfcRu5;|?P~d6jN&P4 zgAdFsGJKb8-eD*x#dv*D{<6>a-@O-}e)#d58!rQIvyUqsBVV)@%bkbOr(U_hVGIiV zkcrSG<1YU<*>uqHsg}3%6J(*g#1??^|J0{r!3fc5&pW1LSAF56r=pW%23?pAmcwXn zt(-fK>q$M{{J4(F_tk^YWp?J;S$H3g4PIQENlSdzNPh&6S-0d3!lLg2H|DtaH!%FL){+Q) z#yG5@h`pQdqvSF|QEO`Uid9<%>G)vikdatQvZmc%?p%4BvEbc1yFZyU+Q&kuBNsy| zn7ib6-Ef{xxuHds*W)!y{qO42!MpJ}!ChhqynJNZ>?B*?cuz3?=K5sW%OWP@wumBr z67fRu?>s))2*haKsDd%OY&_NwWJV)-jh*G6pI> z_)?fI7xc)nYJA3!p^$_+!rjCrr<*cK56wI-rj2pC7dr< zEo%a-#L0Wiweohve8d9P1!vl~=4HwM{3;#E|Ipu9iJaEYFB@GCo$zsO(v5EfsX1}b zj9P$eE}lcmd&Vy`f6mZ#p_wwF*2#=I8G){4E@az|;Dfwz6HSyp$GBZ zFFFLib8WE4`_xVT)|n|?t}O&}Q93os>rZq1INpDI#nvI=f7i)}#=kq#hQ={(NF22p z9Jg%rJAt__1roP|l2y)+2ks=M?mh_s!*>^FaA|(~EOoM|YsNaUntg3y)Z zT*OtN)g)ouJC0WzkDMm;3Z#>H1J=VTnvUaG$nD08V37$mfWD}Z3(aX8jKVrZvD&TV zWZ{5J0Q6NSQJuRCCNkvP1j=ad_4FPA7%#w$R;Xa0Df%5lAXx45AcqMIe{Q9w4Y`|g2 z(Wj*s@C4eV5@6|XWmhk3AU(jEC0W<*f(Kx}s9hAxsE{t;o>vl+=6e@x@=EHYvzROe zZ&B!2^HXp3>-KEl2 z7NnoAu{WE#D^`GPgJvHxo?=;HZ%krKCia1fg*UVa9oVii_<~i#g*HL}ncHHND%$Ib zDe{Q4t(e^xg2_u&8sq(~w>MUN5uH2UGF`d&RLEJ2g|?MP7A2vq0EH3W`^;Qf-qKd z6wjmM{N3*`r6D%StR{5==LaXAY-i3SX$7bxd&M&O7z!V&D^D2L{6F&8ifcFh`86*w zM9>fBnHG?q6QCrbApL>$hLXigYjGUYh>sWq8Af!PK5Dg~8c-S-Sqm-zT#!JpI`Nkq zXYIpICY&sWU2!N8Q~E9S`a|A{Pk%?->v%(TSZcHYVCGcSeb$gNhLz00;*7Pzhh}H% z_|Ngk@$ORJmQz`^JHoFjVq&w$DDG;g=Ht-GxyXjqE)oC1ZuqGg^FSEJa+*?S++wUl z)Zz!dpZ(>lo*+XheRUN?ZW(TBE&i?9BJ#VE=m*!Jm5VZwQSDM2bm0ltgF&6$w{L5q z-;C$2mKa&gl%5UGj8?9@`Wo?G4_ZWjt?zho(G;pkx3Q4UbCa8|lO@f&tc zX?*e_ayE>FK5eOTb6aCYfFpu+BTbl(YI@6X&28NEsq5=nTFGKj)`);&eQ;2L*2pESvf;ip{7#L19(oQIhyOkrIBq2TNq!B#~`CPYtciSB~u zWP{?+upD$r`~yDiq{p?!P*{w3A}#Z5`oY11Ks!hcm`UGv+z)ZUj7r`le3M8&*0~eI-1uLr@^l;U|$~S?0AlciJ`Ru zsX{1Z$@Vartd|_s=0nKa_(?FI|Fftwt1&{S-jZ4J?-TH1mk;1YVi{|vlg`h4&&lPw zaofzwi*8weEx9<*6hv5Gq{FnCw_vda&?2DNZ^JfRbP?gHGlu|}FL9fr{POch)Pm>$ z{_E=)B9Vxlp~`e2<>lCB`Qxr0I_9);(flq#!HXu zHx~vwsvyr-U2Jxzwlm&ixZn>we)or-jhq(COl?gsse|&BqJN!#`0yF6>upQE7V%Wc zK4kHfH49P^T3??QTPj(fse;^?q->G3mi0l%sI$-Y6@wo?eU{j{{tcgWx<)z6%6o%c zA-^wt=XopGxj673(qJB&d+Cl-*51Fef?qleoOL!!oi@!6ROEh z(`QljHUa=` z>%|;LNOUQvd7hBQJI0WpcYP%r2o14l%JP53f911~)tapW3uAJvbS?E_k|zPi&A_nW zZE{ihAEopQV}EPw4F+N^G=f zp^K(i>NgP11ipm+uCH_K_20)2XXRZ_GoeDKJGad+UY*Ke8ha3T6we?;h5APL2ewD@ z@2bP=D-U&~tG@hHov2pLjgK}-+b-f)aG)mI-KU-o z&Is&hMK5fNtg$AGV7K%ggwyM9zkF`M?RT9Vu~1`2%%Eauy4d~7_;8*L*Br@q49>1; zy1*7ea5_>(b|AJfp!p)~bm3uXef0U|*UxiIuRDx?3kK7*i=WTYwEIr9Z#Z-2{m9`li?KzF5(O>9w2E#2%SXP5tn14}bVAeuu2qDlge$ ztweYU+PCjlzDKK(hVDJ(41d>(S7~egPZq62LSqmwR4dTM`&e+q#ytG~G+#VyPhYE- zx~4HqCSNY&>P8?Q`4H!e-w!LJR!8xb-nHWY*I&=HRha$4l^*{&{}n8&BjX>MTgLdF zI4}J4gF6L}r-N(GsO>>G%6hg&|ME$o;^;cg&tvWueR<<5)=WI<6^`<#p)cR%d44S= zNIjA`FZmza{O`@4L4W*y=;-(6-T(dn{x75AD;9&^fAj8kl%HP~*8lPMU$E}Jmg8`+ zR3%?D18}xVdVS@@H3|Rc z^yP>quwU|BADzDK_7ZxR z-L8f7)F;V7-oMBTY1yw={{UQ&j!T{ZHY^}l6M%KVm8)@Flh(^_*H?vHetmtv{ZBuA z%pY_z;w$x@fH`#wrO%6G;mgH{iR{C#jBkTnR6KyfKVxo-cN45GEV<-*Gk>??U;q5@ zvRU_eryd@Ru3NrFlH^wb5$QXh{7@l_t_7~vQn?~n3d@pToRmuzSJ zm?{TGg+Jk9J*^!7gU3EO2HU_wHdB76r9Gfj;gAce;)Z zt&O#uQJbM*WA#+R8i~j8D*2pr_<2s^-o6`O%W&b!KmPII-aroAHL7i>v*iDZ>x!dn zp8d<9!n^NXbXos0bz061W$0>q&L2A*etF!o{q(PobFoPrfat$+Jlqy+VOoSmd5!vv zSBe8tGRtnpgAd)s{N~1zmj)MR{_7v3PUif-6Cr&RSmOo2QytW0D2hrw7nJB;gq}!3 z{={_0{O0-!v$wY&{_?VM{L{Za>3CC+dPo3U@J;)Pva{y2aR~`reFS7i{`=f-EU%kd^!S+Ri48fJkadFiV^D*n6@wcx@zOACW%i+U-1ofKyDjU5CRa_nHMyu1zifpbfO%{wsC0L{Mzuiz6$Fi_3?w_ zAAkFhJ|FXobWi%Eryzw@`_cD~7EqRwG4HdMvp7!4#DvXGW3?ydOTEo|K|4#GgoawKY||7^(>eahfYeco$%Tr z)LmN8dyfYNRa+U@H01)CK*)tTWyFj<68XbV@oTGbWA039@yZK_E%;)R;l#rOFZv^T z^)y~Rsj{K*@ESlBf$Zeud~G-RT=;|38S#l%(whp^bs>p{b<}WEoT|$N%VdgOF!?TF z@ifvl&Zpqu-lav#!=Gx=Ri#(GR^+`}o}6UpycT^_GPWImVwX)+w7rLVvt@yLw@IiR z)9s!5X_9bR3`z~`W{fF+lM_$zYbqDS{CQ)wUMFJ(Vaz$b8L>qvsM|P_l!&D^Ulx#B z2XVJo+$1TOZv3rSYg#T+di#o4 z>bQHo5g6TI7%$|OY}zKn#Fs%5SNxSE|MkbS%z;+5pr$=kzUC7~{@k4&DmPkds?eKLH(EqsmDQ+V_|^VIXvHTz)B_+lGS1YX_rS=7CcrHr>%B)+c7 zk6%|Zk{rOEBeFJHIiC9>o75Oj%39(Gl>eP-tmwK^D?TM&bW0bWg-#^? zp)~@Z^}L6~rh+*a|FQ*_0mf)i^s7hZf7;jqz|7|ulzX7;2sU(2x;HFN->|cIjNTQU z?2m52!~`Ol6UN@rNliU`mw|Y3W{u}8;_D3H>CSHAJ648*MFVy)dEn~u&W+j?tR^{ z45K2VZB#>6^#;P!D%^l4)04R=#Pyrq1|*L9pN`I{qrS zDqUW;V3U}*L5mQx6?@qZ%^z31pRvW)8E_l|#Dk{R4?@nvA8GFG#Ve>kfMuGo5024J zmq9eX$9-Gti%Hu^538S!cR5$0F-k^_!PnhTacdo8$_~%#_sOZi(^T-PKi&D?9rett z&bz);KR!ti=Pc9mpzO{EsZ08>zcOG6k_HfrOW8MLut3b|!I(k#O1wu8OZ+o2--4x2 z@vn|9e3U~?!0VjG%VGIVHcm1zE`Zo@qjfxN{HEbi-oI%T_%c=tUyj8Q*7<+57vef} z%27=^T(NiRoY7Gu?B-Xs!l8B&cG^h&AjU*2n|1+xD;UHN*ro`hnOe;$%W|wd*Q!eZ4=PI^Sq8&LFb_ z9NVE$6FqQl#XMTfG}9s{=}YtZgme|qq8D$#Oa8H2I8Qb9LM-^f?huZGe9HXT%Yu(h z$9$`P9K2meK7{QB%+}cw>L$_1^-;dgaeB-c1*uv1{^SelPVSnlC}OGjuHX(`^MuXq z0sJTy-4ikq*kWW0g?`ApJN{?fi1p0a2?R7*-ja`mZT^af@%1_bton8G)9GzgWBpxV zE60E8%^MCO@yDaPhaartc+j23HdElSMTqb^2CeZw5}t8?OuE^plI3DAczxtu#xxpx zum3eI5bmd*AXsZp%1?Z$Q5nyd0VB6;`PlQwaTEhu7^~flHX8lPZh^0iIP8v9#PTUD zF){Q;{UdKMEki3dqi+sfFB>&yo}~^I{a_aq#&_x+@lPGYfL3A8;cq({DC`Z#tc4uk zj{8IhjhD(FYy6w3Q*Mh`uRiCgF|kf?Tx?*_$Tb!gg&!ej<&JcC?2c{z2QuEmf2262 z+|cuH`QFh*hj>W(qM`!-4SYG~f1^8rKxS2etZ`+UAJ`{|n(D)}1~pn_nR&%Gbu4fE zW*-RzVl3(=FTaV`U5uAccc*9Hf#!HRp0JGTi$N!%7vRN@xM_O;K-q(?%?oBGv5{lN zM08$E`EoG?IR|N6PhX_rrI~LrJ!NraF~`r|rg%<*@nTcRKrLT6G_S-$7DCRTMMRu$ z#NAS&@{Ad5NTmK4zP05nSvGwQjS4u_@+*~*e6Hs3$*7AKd z#5Nj4hJH|KiTaA1VzvB~{b#eO2f{oW%y=M{bK1Ies%Ta=SNluNe}CYqzLqJ~6nT&F z!Abz0N3bG11=3qg=N`WV&H6v<$D`tpm9U@xpBaxlR(1koCCE1kZ&A9>UNaS`4BiKz z_r8WmN|$z63&-pd3c*gJVpqv4xj1=vtj3=MsS<;p_J+ z`Dcx33CqFML2D#ZOS0}3zFI!G+tvJ$7bZovpxIzs{L~fyd%os+soRx3B`}=t8pr?4 zAW>u6{Ks{&uj(jj?j)OHk6;eCvr&wC54Feq-^qk$<-E>4<>CAk>W9IczkX)ekjxVu#~DxG&xH_>?gy{`qFq z9^78$ZWRBWx^Ha2{SC!?+>MCI^Hy^J9WPi1lj>CQ>SCk=rn}7lSq{s-jC+dj%P{hK zC_xRzP+pp9gAq#ElsDsK5)Lo})@zZtCX96yxYw?uCDM6n_3B$7Imeje=w<|md~I6bqT&CdX#t4dqp#VJjyqMIi5qaob{PWP#whCeJ!{PBNb|I_kS8 z`(ehqG1376pVgQh>moF|KLz;I0&D3mu5A}52#7&vx^T=<;0r)N_=D1O-uTi9O+R?? zbO)H>>-=dBfSzv1SR?(RijJ_!Nq!i5jHf@web3ZzT|CV437K8os?4=f<}-16_)+qw z{?mbQ(Fev8JeIP06`nxK%X~O(G%IC}Sj}5tbbuxbKtm)s6+ox! z@&r=rY81beUlV9@%;^(h`)o&C=q8)Zq!PrOc%!FZh#nTqjXqZTyaiGWV*V|$V! zCH^C(Wy~NG7!Y?#Zlm#hlkt1OCL1COK#4EG>rOT$8Q9@st=;d;g_ z`y}ilqJQoBQKm31^2 z(HVohA=soL2133mJgSMfqhf_?_UNTD+g6{P#yoQs<(>`zTbtC0_3MD>&Aa}b+tj78 zk)gDlD0Twj_wE!^1xi&bsxwc$mTpGeND`v=gvYM0VyF4mci;&n{rHajSH}q*hED^G z!y5lpgD|8;ob)u){oAK6(1jYX<2sn29$aH)ZD#5Vp=MqHsManu|BjPIe3FTK|wt>?p0xU|8qGMHSDpxN~aoCpj`-mjN@s%zTLSBwpr zqJH68m-Xb7|KTzJ-yhBGxheAl}?aLIc)cub5Yja*Zg8P!EdZjW&KVa*#4ZOxF&F- zmvm*Y19_J&UI_aGl&N?L41f86iV%B(Bm|my9_*wMwwyk+8#^t6<`AnK-y(FJe ze|FD_&1`ss{qApzx7F{eE=MW9>JEah9HR4#?>`m@RDVHU;j!%g-12 z!Z)z`Y+_6J5u1-gz?A~WKTvrnnsaW*^$~btK@GO`Dyne-cIm>RUHpS$VjJ!4u(F9Q zUW(#4&SxJ?3`$e5qM&n?OkPkSWON~J9vsm5eQSmsMqZB$B5LUjK-f5d zVNI@1+QX{BoUqHTtW&|}g1pw85y27_Xra&&oOX8;AYshvqt zRPlu|j!sID!Cjy~0|CgQwRm8MAfbJp!ecfZI6xX_d=IV9Lg3NR+j-yGz3yDh6}i5EYpsQOc3Dn+4i<- zIgt2Z7Fz`Ro&@yC!a6rZzLkVP?42#yvr3}q?10AOl}&>yqa>mBF3I}&W?}`OyxFE7 z!C~XCk0*Mk_=`qt)1U{6ZF0km(@Hwk*|$DLT&F2b>=PIun+Jk$BgVidD8M zwgMmde(C{*S@-4_Ytw2;FK{N)0>^yV&)0~KvFU|;l*cN46#+^^xWZulC zB(ur2l6j>Ce~>-&xHnnq!6ehJ_{~RCqvEk(SYfW2go(s+&57h?;>HY-BEF`xwjmbfN2+dt@U8wHd(wITy2i43W(%-lNw7CH=j`J>hz) z*i(VVjh`c%bk2G<@ObmUFJ`-KgB8=)L3n^%}I1mR0Wt}Thb<# zs{hAdS(KFgU*ld!`v!K!3Zl-w60PDo>y+&!F4q!P=&p3Y`5(f+qt9*-?$iczv=0Ce zy`L?JdOouDN;Ri5|1%y8Xz>rK%j>+ZM=WjPKMhN)<&!exG;UC+Als8_b1q)&5*9&K zoc>k(hmUr3mK`S%$x`MIBS03J8L4K0sFHJDyd5V8q>VIH$`NHvfkeR4s&9A^Z z(|$fUw(r)yb}{0;=jN(~T-p-J>5tm)9_H-3RjuFs#upysw#)|%eO}pXYwmZ9jw=WS zU<5j_qp{W6XL7!qp;x7;)@u8XUFb^%byuEdbB#ckO~HpNOz7?QfXAeg|=%mN7n z2^u5W-A^*Wg}6;x0WK3Y)n(0wO21op-cbHW_BysJ2lbAF#h z8eX7D7z_Unp4{pf{kVJDF6KA*YP1ZwRV7VYI+ZL~Tmx(&RG3r~YD~R@N*xpWb!}zL z7j36lG^+abM!0Heid$IdS{8!!UNK1WzqNKYu=*rtDSsT74yrM%W%-y?X1q3exPaax zM3W`im=jojkE?*4wIgElH+$dLPR@mZ$kYpCn}2kHIN-T|8iagB5)AN^|Chrx|HEV9 zapN=F$=w*FyR&~$vyBZdc;>)i$Bv2Bz8)fC+sn}1hl+sc-1Ay1AjofxgRRNufaE+7 zKTK|s8~ZGjSle=5=JPK=R%7%OE`(0Ve38G zYO_~}G0vcdzVU|mTn?v`hC!(w=Fdy+(0_)))UiaD6~w0-beq#SfNyhe@)~jA8q&_e zZq+=mrOu`fZTM#B{1AV^8f(^lbz%VtP+vRD^_*+}1A>v^A4~kYNH9N|2es;NSkk`G)$V~)XZRIUw2NjWzEjCAV{T`IQKax1=(f(Z{R zyefu9JH^6*4@QAY4|n)%@8tiCSsUi1&LuYyzoxMF{(B;{0mJJt;j?{g&QC_5mb{+6 zGRiO=;ACa>VWyVMJ+eY7_sV#&O;B zKGyihEAj7J9~pgCUAgq{*HnUiUuTDb+GRIall3K7VyUbJK{uFoqgx5KJp$%4|0loL z$hIFV^l2LvTyh+X!=^{lqIM=Ui&#M{c$C)Wp9mn^3FI};F?w34s;J`8Yq!Zbxl;6w zCl%&ft7SEo#VEq6psZs)P~_UK5N0 z*hrYZ#*ykcCZ}1fQcy@=3F#fn=w&57uZUAgv9qRhm zYkkk~=$)G_;lE*z;5Wh4#P;EqhO#xN!0@IcIj5TpX!SdUPO2$>gZFC(eh1GiXZkc~ z5n={cEgXBH8B{i=(eEYS-Iq~MPIS4e1^EEoUIC~(@(S{iD6I_;HfP^Fvax!KPPo0{ ztv9*mRRVaYB8mNyKtd?RdyePeLq>H@TxarO5RHiaq8rOi6qCnY(Zh#Pyp<#HPI&+! ziXV4Q-Fe-iN!cF;W$cgla-a0blSVGq;5=!uYD-vmWE@jmPr_VJ9rYVN$y)ZuCcmLy>qvxijAP$md%NT4Wg14ztvdm=idf^8HGXH1W(Xbb_ zp);c~qhA~+$1j)}Yj-q;c1LYW`?P<>64UR+WYk6y%hN{=@F&TJ9uBGnKz3d}K2Lo_ zXs+on7Al<11AE28sQ&?oKUvF7VUHsd2u)G}!bq?0Fels$w~1JB;u#woi!-s9(DzSA z*bOrVok+E)5OU6#7&40vIsl;YPD~TnI`LldVTql==ViDjL7lkBx=+S&w@9g44sW1O=QOHUC%@`C=Z=j%1!88ODV*Qf;mFb*>1 z&|BBDD@O0`4?-pmm-_RnGYJZ?PU4{lVQQrb>B3ieG5d?u)ri?Qu_cTm^L@<=A}XfE89R=O8*gz}q2j`G4x0KV z-V65hXa+Mw|t;SxMd{+v)Kc#Sbn_ab6wHX^*6^rVg? zJ(T`?mLZ!4kLh!9p}bW$Pmzk*;YgfbPk6K5xLz+#$k8436;~9G$wkXGK`+;`mf(fZ za$jMS*O#u7BOQzJ$#YCB{mQ3u4eP)c4_!woJ>P$idRS=RcgF|HsO(!__$CjGNjDSv zX=@(mBC&imkuucrm)C15z>iyJR!9()Kn{*r!$tB?{^MCno#dWR!rEU`l4#Au# zDAP0%S`y!Od6?EM4V~&3>z?-c^0GN!$WB1>7lKDS0{)G=CK3|ck-;P-De8&&Tk6wL^Bst*t z$JfTc#`-q?t;c_V%@HHb32E!BAsx?7f!yo3@DuPK@}K$Th6k z(Tq5FonvfldxQe5c|I^T!gr7bf1GRt=i& zd2oenF~kL_C9q7 zsEq~i#okcW?QFlfvI1ApvsPFSnXS<%aLuM^ndi>BI)NY`naE;XPZ-)ih2(KFy5CBwqNdNigI( z#UjO5<6>TS)MmoyZA}xb@1qL?)~9~@C_3fB??#@a;gt|w6fxr;g+sClYn+5xy40+2 z%1M`H6R)=w$2>?mZ}zthm;kBi@3kQW@%PRKqs|0YM`wPl0-ucLQQ$~Yk)Iq#KmRNq6_$rnW_Og46y^aTS zw2>d^hv7Jv}6#O>WMwTX0Cfk&FD^pphanbTIXh_(w6rM?Psou@-}boK%|R zZ$@G9x6;H(m>o8$%{Nh-_(+Dy#Gw$h{D#K!^3}u^qlXPr7A#{LF}_<^t%Zl+h-6Sw zG$E{Oc|Y<3dk)8uv^BY!Z~$P<$CY0Sds+kEU*;N^rf5?5%ylUCZ0<;c9#0v31xmyD;+91O{=<&Vqp}qY~ zVkWMEazR`Qeiq&Kpi^f{rYfHVMi?bGq?{=)8m`U%($&!hx{d>CNfhX1Q`7vRbHrT-N3%k6qL0Uwfg9ll*i zI~NND&$^fLi;<1Uw;eJ#=Ll8+&zp0TIy9}KyjN@O^u3? zkjZ&u4o#wG0+*6|G}cw7+qQ=Z&(?`_8LS>m4*b%h=@>qjUqT*YHBgX3sf}gJ&{GcD zaG$YmiOEVp=Kod!Ue`jVpzjcO1jnCO-nrhQ)No5u%6cSKOH0DlLs;-k#Q!qu7}@F8xk&-xynbFhdck# z4@!mwjz|SPsEQ90_3A*?22CI&b5nkC?hB_aIWx$60)~M%h+rl~!1&4%*W$I4CjUx%qZUSC6|>Ep z5{JsI^2>v`q6!#7IP`-ZZv-Pwz`j@t$@t~)SN^zR#82=t$M7BR^PH4-SpNuXDO&w& z(GGGM#ronZ7=>rPqooPL!{n|zGugb7)YN7KUyJSZNB3>w;`jN=@zR|rd`LY;3LfFu z_c3Z4tbw=J&Lj;Re&CV>p!RW4&L}eMGtBa-%B?o2&Ee?NbtpN6^&B~7Hj0IwV;5ypWdA0yAkZBgP*ujBx2gm>Rf=@;gAisn-N@%?!JAQP)g#;FJKJUd4)m zL2X=_54gG?-)FsNP7vN2o>SZfwxQ?A`+DVg_wtv!&3S^-|LVLP%h%f$$HkIsU&6}q zbh4AH*Z4+y4S$N9S%!18AZEZ`^-~;*_hL2=Yd9Jd5PvmH+s&%YSUfww-G92HzL+b*UB)yH2;UU>x_wE>kLp!wx#{#*YcjzxGq=} zbR|ZZp=+4A8tUm~)lXf?N(j-+?B%WxR#Zn+0YPg>FaE^wEf`AiXj=@Xcol3S#$97g zl0C->w7cYzi2+ilc#Dk{d{b4fm#8$Wb*Yl2d@O>Iu@W>~uM6|~62L*;Qs}DxHQ63#n*Y%Yz0R#-{-6%|h6J8aiYQXUMa$Z406i84%$8!N@o2hq9NNG2@m{+Ea zwcZk3-oIXtzFC31E)>`J5l6~v4Zw1dHE7r)4z@`TgPhfX^L>Gv)5HM_f9}{$G=d*v zqXiGnK)|w*N-3bjCoSEZu32xVIqK}d%0S`uR8~FAQ|N1?2LWXjcbNkLAgiSJE}$ey z06huRCQ{P!@|BY&XyV7+{tcfEYU_GZO8tYMx*&x$x};E2fD|v3oN@t(yLT!ZP^C&7 ztecG43M$jMm?KU(y|4m&FT%d$XB{HmEx`2n4uTKZOunLe04ZL9nsoJbu2 z91;ou4V*ABLv*P~V2h}+05H!vLXB){VpSQUCo-KdIk@`ag+AZuegkYGLG#JLN-*yA z7(~UTZ6I+SoNtVN`qe;XtECvA{_H!61%!)Bkv#Qn$+M^qiX?^2f;oA<2)7=tHsD1= z@qWF;YCr<3+ys@7GPV5hSG?>&C%^! z`fO~=RhZ!QPz1+$rJ}Yd+icA`B^8Z(2Fd?nm(rtU+%d+QVKKJ%V5a^xfiv+zr?H}j za-zrf4K@~=PW|j+2FecUprcVeV8OMTPoLq?kuqGTYy1~&?}}^3R^ybvD*x#OwZ^6~W4vCI#XyYP484(LtZvyObIAO^ z!>%WJgZEvV#HfhVDG}Fsm2)Z1DL#cBooP)*{CCc+VTX0zT>&lI6pk`7$NYGxwy-i% z6n`~yD4d_9T>P3?br4Xvp_n&`fsEwM-U3W+0N_he)-Alj>V~uGrDA5OSWblER1NmeJWcvXAL#~oP9IB5Wbco$XfFgtOu_>Q2faGY#$H&S*H)% z*9KSnbIQ5X3;Ak!9E5MB*8*yH80m`n1E8Dw>Ikup!tiQLQ}i*21Rk)ZN6Xa$UG*EOep zEin69#-Ou4?9eff^M18G_w|3&dyxkK2?AbwkwJqgBb{@;fm0JByEZ=#{>{YCebE6q z=E4V%Pi?m*`@<4ji+Acf^O0$fTURWHsKm>6C3|Pi(D#++wEbYE@&vy!H?7#89C~k+ zXBGddKi)9i#lO>e{pWc?M9mz>`=?JrCgsVSQ!&hEexEP(b$eYmCi3(BuQ{~*r!{a& z7da>J!cVUKhhB+!XdE6Co8cQ`iy)P`UUjlslmTOv!wLJ#e_lBJ{(t_5uP#G`L+P8z zMBEOcIL^3B3h5jGb?v^NUr$wp`cp{07g<%2%5!N8a!A`aNcC?Dq5`s#yFn(#G(pZn z$a}%MV-^A@Io?j+UpmMh42cYwsuSCih<*#B6lkYAC3`kwNS~63qVUBP|1itV^AFfU1zb-dbH#( zBtamO15ZxqJ#!st9?%UKx8unmT%m;@+v$v-a=ZH-qS&$gCIO*&#nQXISQN$#y>Bcv>oeV1f z;ZGcwPg0AGAA+}V6E#lb8Q`bTx!JQ9Kl}SGA{XUJzNl6XSy=9r?hDbf+VmrFDdc8# z0}ts#v1}*Vf^XS#@1nJhS-xpxkE!gxpn7L?4#b^V~6FLr&^4X zgxKW&!p)w6I@W?*l{-P6}Laai>Cqy5BqFa7g_01e2B&jShoT|cG| zPW4o=t$};o0{fiADrmU5q^CxbT_bgWy*-<})5i{~HG3RAVlT}{cl>hxrw^aZF+uW_ zpNPkipn2+z6&F#&H&Y?@Tsb(@Z>ZD;HUJt6fK?~C;0fDr#gUz!LJwFmeWQ~nA72jd zekiw+78ZQ%1GR%$a=q4Tf2%b+owW=OmKu}dcs-PxjCWsK zJoN^i;~(gHp!L77VJAc#d)~1YXiF~K%(Fy83ILB1Jk`@r#}UNtA0_Wpg8uUAIf?^h z=yA^n$!IbJjvxI71qcO|fXeJIN}Kepu~#e`@#NJOT)5S4RtHqDF^-~XL5LDpiSNow zg5zK|PGg6xHd7!w;8QDE)UMH7*) zf*1p7@SD5O7Ecs_VrxT)t8RA!T-A9&A&*UDAHl|iUj(*-1o#WOFI|7)!_20tPb&XsLYgrW7+tZ_M+?*M^S_8eP@#2=5dn|JsW_#Ti&w>JgG?`1v%>4O zkadaq>n}fH=}WRSI%nB9Ct=#0Y-&&}NqKe(L+Zktyb;GKyVrPIe2XYgJgW1!TN3J~ zf`%_IxJ^C;CcSHRk!SgxgXy1Pqh0=I7pOX51*VE~<-nW&r23k(vVJB1P2A=DAO2$G zf_<32#m0Fr*w~q#dSrWsQdw~FbraBA!g3BcpkYc}^ZcLrU+Oi;d$Sdvso{`bOs%>w z28&*wK{3atb4=s`*T}tIX4%;rc4`hwa$Ov)wO-lxE!<*yjH#9X(~rcFW86J|1(Kyd z#fpg!?oEwlBjGvl!7Ar!0w}wMzi|!4T28o;`X6E)L6G^wvxnr30Li_MVH^D~^%Ei2 zwegGc<-(UUG1ACb))a4D75%1Ni%Vzuv&H<=1&57row2p@%rej-_XMKOS>k9>7&HWX z$;A{ZZK~S|3KdwBPb&1yi5L22g~~b8?p8k9F^M-*7^ZD*QWUm@_=S-OMML%Y+{D7L^bmopusy%EG&E4rYbLjAP!g+*v6IPE>dY?lsE%`Z>_aojqSZ_e0PAxMR(m%0G8b%uZW zf;;C;qx%M3SP#&Pwn(3B%9fb*q--sgp}67Yhp<|Qw54XS3{t7pJwc!J#{ZGE@WApT zWegbz6^rJ?P@NalqB&apCp{GQY5w}sQT#4RJ#<0wzt)4r%fL^?gQx{`or3$IVOqUD zt&{M3iLtatDI)8C_Tx$0JK3ClkR-o|L zsThr47ugmd1kcl==RHF;J^Y^^%3}k3Y<3#aLX2=?=MUNtTD;jxFemo5_62w|V6$-6 zT8GixHMp-LazFyUHls@KDV)ndA#nv#eLvO;~I}%#;VWZW-1PUnD=t=9UR=y1T(=i{PGDT z#bpi3yKk;7^3ph&cunA96&BBmK(~*HD+ab0^KXstZeaFl(hK|cBR{|w?`9GB;M=CA zN?vp`FizOsrnr_tzOpgXWHc5%E=ycHmw_bsM_C1>nbId}3kNnSsC!GOZb-CU()3V+H!SQ1C(-g>+Ar|y}n=w|8l z%ktwjyaBekNL2r&fJFB<0rMaX-^h6URFW)Ek^*?K!+LOXm#;J4?54#5>pLE#-5s61 zh}$K0g74P=APLgLEONf|B1j6b@8uyUauN<+IY0#L;cUb|7e>f0CsYz zf;eaLUnD7mJp`8K9{{^roR4k5TZUWNPvy(ne3M(;ztT<&>aH0q>$f(i-LVdISS*2- z9O;FPUw>3?tFEQ&T(HLqL$IFH>xtZAwTvKmO0ee(KJomPo97_WhoJ#ruhz96L|$N^HDy%LX|w9;Z#ONgA!uMJjbcQ3p)w0HpB0M_-IwgE|)+wqZ=FW4<$z7DH? z16hyc&7vJ{G7HzsDeu>Hi(S9;0p@)h|JA8`7b~vESI3obRXw-ykG%}69&Ph_{MQwLIqtcAYe%e>_&OZv zPPpdMp#7XDM_*Y}vg=3CtpM95XEBk8*W1Y9Bm_dEalP)Gr1}gdu1(OJhv~3tF79N> zBwCy6@6ju;$zy=du7GIGS4BA~(A(G)A-m0wc=9o=fK68pMhYHQ+-^q{8-o(1<;W+L zIPm=0F|8Bx=aKTsx(SYpd3FFh6!O2g>jBmw$9-H(YzkWdS-j-}eiJgh%~Dq&#k81>_z%4ZjcU$1 zmnYM*wPm{z>pi%ZV8H@bDYo*=&Dg%)7YM?clO6TJ&M(35!YTK(&cxC>d^`L#;znbm z*N%a);2dD;phiRR!v7QBWqX4Z`DDi^X2Y+ZH-7s;SnE~%tXLa)HQrUc$w(aA0GR2wu=m3u2XW9mJZf9MA0v#P&>is^eH^KWjmpZ|FKv z+vO_mbFjlZck&khotCZLP#E>vac*)V*jI^<2k4^w&+oDNvopV!VTN*j{uBBH$n28O z<$Mj2u^=H=7=30-#)NWYYqAxM>Srzg%V9;_tb7^C#~N|~*AJE;m6O8_PRoYnklX_4}wsmRtbh{lxbiJv}ks;;Ge z-8uZVCibGW&vCRs;$;i{wd3{JZRiF*3En5RWSDe95SJi%G+7ri)NgQBKJ|q`&Pjx4 z86dSTz;l_WWA6tjec}0j@q^s_7;f)`b?ae7iysUKeiVZ(Ww}}$Gj7&(i-~tH|4yRo z5zv$NW&V>KDWjJ#i(^}Ia`fRgL|Y{s7mh?9b)Vop=k)w5@=3)cbkQ&ep?AD-*l6xH-(FE;Q1`~4}V@_p&tTO<$oQS^M<^VKc*gs<*qx2 z1{FBBnwO_sAKBXSDehu~>bMmrb4rxo3a!9gl1+W8u%rfSJ^{2`8QI-rWV+d0kMlogE znCtFuwhZ1{+rE}C2>xel&i|WEee>gvwd*%PW+uao@r_c*wJj1w`)p})LV$z_JeQ&_ z3dZQ>+>JP3MXG7LXmvQh-)o|^o+FtCo6KYT;Ir|#XF4bm$!@|_8(PS&yLj8a+-GS* z!ACN&%3nRYcW)Z-b6X;R=k?)wswl6U_=rnqyehMrCG29!DffCz98Kn8tN7}Z_W#bo z0L_yju7P_3mivxY0JSFpqS=wGgGrwml^;@x3QtXuXR3!bim84j)tJJD(Jm)~6fBt?&mIKhr17lt*l+be@$F zd$?D085c!vZiJRsuxUuX(L~zfmv1Le{)}~whShwwEAn=mL0>+)k3EII(TV!x%E^+5 zqMd0ErzT&Hee9=s+_tlq<4wWI%hLCgul~7+~djNxPM>k=+45hsFa&1 zCqDVe8f)bLeRc+Wv{V=KIdgy1*3rh%+_px;>-gFWw0>W2?!u+FEZgk$_Ub1@H@L>5hwb(r zz8;(dw)2nutY2wBYlB@Jaa!hwMi%)9w?IDVU(EksI3DVcUDWRG?cB>ADD3QkhuXsz z>=-p+#Y@b4=Y8M!dmq_%_=Jb?v5FwcJ6;+NZ|zs(gYsuAY{)}r(+|?=sJjeIq?hn- z*SX&sL(CL4T})G+%Q*m<%-+?}u%HL_#v#*R_a|MX(*6l{L+= zO-wl?o;m(ad?X1>J6|vB?|X2}7rhwbdVhc00>*<2aV==eT*%oNko=#zp}Z&?9p1ua z+m2&)#Aa@+&cRZ*FE-SLaUm#r%ufY%mqm=d$Ct$@QFnpXW6l_E;74JD`hmV>{Yrisj`v1Jnw$4GU?78I6KIX5 zYmCrMXHVn-Rv(u3UzmUMy~c3JGKSd2|4s+RsK{AY(FIxNy1_z^|M06XIroFZ^!24L z9Xdi=Q)52|zMzT!=4h&T!2g?+tk&aLT*i~}kRv5nm(KCV!FPvI{LX~wn0IAmG}3(P zAerVT04&F-#G8~CUasSQO2F$06cL7nCS$DL9{f19E-(wRoX4Nd9erS4kVZ2UuzLc{ z`h}oF-v_=pr(x@?J)lCW{^YyS>u&My(PMYV4F3Bm3Zu@!qW~BZgkd^R?cPJcEBVht z*Ix;!2*A_EP`_Evbqd3o>ZwzCS&QR zdrBtI`7SR7c5?_UPo+%8^NAo7B6qj&1y!)lH`osV0Z+4iEGK*H%JC$JwOwIT8TL<= z5hl42k0IyqHFp`k_1y|ZvJK^Ck{}yB)CeU)8fJ94zXzJ+;ew-{?u01Y`@J34YT6?2jz`Ac$q{Lm{H^(2*$|y&rJu-Am|z@7oR_8z8P<88 zv<@`@TCb(*h3|=#EJS} zv9g$ll$uB@liPZYr-T;F5G6uO5TYEXE>31M?|9;3kN(E7{fhw{Z^a z5IX$Dv!%0XTm0}D>)hzJM1{oiGB!g>*KJ-e43^GJYpK6Xa%0xo9-Nmg`dCIez!r{o zwkdg8Z~eZLgY@*z;}<0rGt-B&Us5{;fJToegJy~W96G+}^~^a!;(c<{QMFZWbj{m^+ zsCTPX@l<@*@Eg%K(vSI$BBHl5ZVk$=LK=!LMt3SHFk<^&_=kI)p61Wsq!v_BF>$}w z1>VG8+X!cP$c^)M6K}!k?WZW#c&zwxvJW7OIzD)hd2E4~lJ*pb7C*v8XQORSAp%*q zn+tT8vFqY_R@CMm)VvZ{dH+ASmkT@u&x3T(GiX`qi>&>U*pPJ;b9w6xY`sKB|2B(s z6Q_qE!cSPIqT41PfO=}3@`cwY+jP*vX7^-U^ZK-V_~XI4twB+nALPG960wO$u$T7Y znmh7kV)VxU%l7k=C>c|x^9--8nZX$0Xa>VX8E^!qk6KdW*)*J6C#5 z_8$NJ;P?+&f?V9MP`8zU_{83agATvjBqVGQe&MUeSzBuSm;Su*QSHL+t6sxbSe-cr z!NMYk7v=a3@vwvPiidlit}Hk}e~$oe2E<52Cfr$h_RaVNry%Ynl=5d3%&6p;fHMw=8%y~Igj zZj7(GW!!wEigK=M6u)J#D;A!vYv@;egwN$6lo{f;P$s5~@ozaW0 zv+aG#5MSxVIVIu1#SIXxjZjxtOcrXX?IDb4?fsk?tUdI*qVq2BJwluER zxk%pD z&vjkX9`#<2uC&jSMgg4n3I1Ozx%If-#ymvrCy**DCCSqYDkWG&nvp&z$E@gP)`l1_ zmN@AYC;6~N38w<>*ba(Kui;wRI_<{b=$UYwF`{$A@n?0y zb}k<*oyevynqM_Pp{6N`w0F70G z)Z82oz1@a?j!E8Nb>XpthfAz8T-0Utg$SjLcNDFt>%((7D~1lPdA4_4J!n8?m)j+v zx#ah2zFc*#2}Z{I1rLC%@fq_Rq(ky)W-WM$Vb}#lcgr=W?w0%m?CZLod7b9^AIW7# zOhDIDyakEGfA}QnWA9fT#K_03tsfA*4Ff{Pmn-^ynM=&;-CxEq?3ba>VnMLDivzCM z24|@s=em{0txv)$$yVi(?;5w**ed8~dA8FF+L+ouJI5*4%7Rs0llAazBeC!%R03mM z$B$Z-=U=5?YdjI%V<#C3UyRaa{sDNdp;D25&d$D)CcYtan=Wtl8CQ->ykq8^j@n~o zoJ=MVfou!q0HdCy7RaC|%04q_L@^{l8gVL7=vYe-bZ!~gd*dVqndX(?BcFz{0PWz_ zc4&Y=&Lfibf0~))Uc^}0qTBU@0}d! zemZ6g?xfGaDp=XK(-n|c`^4lUiuSvJ^BU7S*vx(%&tyUj>n>BSHjBa9oGh@ot{se@ z;qP6fh^>ePZ<;YJ$0W9#cw9|K1|ZB~Ie4z;qxN5-wieQMnMJTFfk z%tRQIy|nq{)1khU5ReoIs~--Lhh=H5&mk2Un(CStGaRiwU9(iSUW0SOBDv{Z`9exZ zbVz`X)y(%!2|N*9uuM?X*1pLrdC=)wdJIGHKl<8AI)X)dCw4J`x>2K=lBvR~VUyE_ zB{YP?W|1FwKFE`Tw6*akJX8lEi7bpz|G<{8?-_pV1p?0UgO;95^}qY=k%RKEZ}10_ z3rTmN{7YB54s%g_8MzI>Ie_nG{Cn|WrMFnnan#}fV-1Ip169j(HnO002{5gV%I7uw zOS;b?>jsq(nIoL!_R1~Bv^L!BYNNw)p=R(}v3*~)TKMHxZj-VF zPVsDyc+YE`$eiWlP0Arp&!0-U_{#u6)37fm(KG#BV<89I#6OesuNcD<)8MPe1a1y& zaP(xsi_VH8=Q1A8Ii2!FqQ7IAvkAWePNqvWiB(QJ66oxA;B}f9t^IcR5TV`Jz_@x*0@IfvJa; zpYT|2^S4T!MFW$R51|0y0%fd?_{{zDdVHz|YHRBt)i5Hl$Jw8Osy%A%TzHDd`ag9m z@lW|3o(P=z9|9*yGjSvNwk6-`phU|VXOJ;mFs|_`hiS~Tv<#r09?$qEpG*5=*jbd* z!`7AYnoE0;3_J_wl1ZWi!gljTJZHXUa7BzGeF*A2hcR`r{}@Nba_EC9Ra?Y5PckU@ z#QG4^ShdUR?z>dDIcNhC<693Rhx=;KVJkOjV~dOUihps(Y2C4#C=~%#XU5U#5MOpD zyFh&zGzMdL+0s{kh!FRR8J&AXdy4nl4*Cf2(WWq?&Bz&toU%^zi_!znBjr#TCDfx zWdl{NQ!}=!Exda>Co^HOwoEpJ5js;tZr7##sdlf1Ms1^S%>Nz0qKY`ln4(;<9b+P~ zEtfE2W|Eup^D^oULctOu($P0MD)Cf1o~UtAnT0)(lvB z>v1`yF8)r%HwUve_Ck>Lgwko)ot-(uJ(A4jq(?Kmai9$S@>fQkuIyfaPV%7&)&jDH z?>^}aKyQjl(X7Fw7qQ&;2!sab}r(kd0bv?0XB$Da#>6QU`}Ge z{cR>aibrtV3EkVWq%7pSq3nyTxEItFWCTB{UC+l&e2Q$T3U$|lP zaAq<9T0tHS0J1kP03|ypU#d_vtW_p4V_1^$JtE=M={2z%bgF1ckE1}d_PQIIWiw-& zw-%f}q7TJR$~bxU8T1|lPuXR2)roiv?I?YQe^@NCN5|q}-8AwA-=doobQx;p5mCGh z`}JpXwCjev)E(?u?6|&GiOW%&;@g{PXD_(8|I61<^q8Yq3cpQkgvPVTgvv!6ixVZu z?=1oiHCbniv0bJvnqn&tM7$gIubi5`M81)^4M<<%xa8a>wTYO3eHldb&6#@kw=4mu!h!4Uhwcye!k`P#si!;mqHh;O(+*om9kqq89 z6~q6%*Q(73(d8iA(Q?9czDaG89~Q{V45HYGxx^S@9wCgUvdH#9zq?R5D`I0ScwXDP zVkYr$e;t%(D;BkQ^1hJhl>d$7Fd4E4V0=Y=<3Gd=Uy(ZJoSP8l%5PKfcK%QD^LclJ zWsbo)miQETQoIC!Mz{uJ+)R2vCj>13Xnt%^K2ldCoHaQp{*yDOya8xxkkB!zh1U2V zcs!|c{IiZ-!Mner7ia>kEPE}&ssJe6AymxH~muP*tH7z&dpW%i0( zPV62(^6B725F-nqpPq5XF}F-Yxs!OE&-gJKAEh1-3_~Q^YZrL)0;^l#fDQtH)rA<1w5ccD`XmsQ9FooOyTUL~A0GPL zvw?MDD;bISUbAg%6Po&Gyr_&Z{2Y-qoUGVwd3=?tcnDnSb&28W$u9WG zZ<_R_d$ih1FrM%;1_=GjAu=&O)KQb@(e{wvS)=A@PDg``^r<-ap8v@uk`+47LOTO> zTF1B&SYxekM$w%|d@2h&7^!!$HZX6E4ck$4y>h*Mtfk6v%J(wZhz2cW@zb75^gHJ< z%Uqm;1!m6phZ!`>lN^Th{NR0vZP}3XV#Gqo!J9)*^@25dSl(_sp5!K8I0*ZhM+nV4 zv&sdPXDBukBkh4-mfacJk_VqMiFaveso%>%0TM$k@!xv1$zhj0uLDcW^O1NpM>_Hc z3q0#V8Pk2MrSO@stt>vz6M3YkjI+)CNz}?Odz>044fYAb-I#-wzZ9NxK9+;#Q(;Js zjh;I*?}(j!=H3}cRv9JBm>H85H#A>-z$7&6bvd~RQ~n7on0}Q}f1S^#(L7 z{yB-BY-wf|f@eOOV1Z!)~ODZdyII9H$J zD8~`~Fh6JJ%)nsd;p3bz0>ZYn09r-r$Ff*%*wp`Vek3Lok0E0W>E%bg#v6{w`fItrIcP&v-X&5*oKYr0lnWOn)>6rYbzRAVmj|y j*V%09bwBU9w)_79*P`#E?%&^300000NkvXXu0mjfUgi$$ literal 0 HcmV?d00001 diff --git a/website/docs/config/project.mdx b/website/docs/config/project.mdx index 3b069dc49ea..c82ee4fec7c 100644 --- a/website/docs/config/project.mdx +++ b/website/docs/config/project.mdx @@ -814,6 +814,31 @@ tasks: content: 'a|b|c' ``` +#### File groups + +A file group input will reference the defined files/globs within from a file group in the current +project. It can be defined with a `group://` URI, or as an object with a `group` property. +Additionally, the following parameters are supported as a URI query or as object fields: + +- `format`, `as` (`string`) - The format in which to gather the file group results. Supported values + are `static` (default), `files`, `dirs`, `globs`, `envs`, and `root`. + +```yaml title="moon.yml" +fileGroups: + sources: + - 'src/**/*' + +tasks: + build: + # ... + inputs: + # Using group protocol + - 'group://sources?format=dirs' + # Using an object + - group: 'sources' + format: 'dirs' +``` + #### Glob patterns Glob patterns support

    qgc}dM6VF**AmjV{x;g*X08bqn3@p2wBg69~2-w ze)r=V;1zW1-D_-}=k zlgwiP19rR7vIkntGZU&MQvvk^Aidx8JCAq@An<5_78kY_$KTrQYct`_R{a&|>Z+-pHHsqB*=!!;xSd;!MZqGUDH`19qNQ7-KYUV1; zcFv_CZ+z`)NjX{0UxrR`y)eh0IaYR0ZtBgEl?K)vRnFDAbRWpk zKmLwbZ^fU}7dGU2P%c$#Zt54{mOpzKat;e^^rtLZXA(5?6md4&Qj-lT)`3^$(#iII zX~W)(;u=TuT-9$_a>GupekS;TeLw(PO4|xejrhhj{BD6>gY4?4`*|5+5eOwj~#UHlBXpBRC17Ui; zJ2*G;L3vVfy0@TsY+!O-Be=-yn}0}(60 z8k=EL5dJ$Kp+0lG+{M|B`*XsO2OA!w L?<^SRPt4@Jw=wf51DZ_b#TYl+)<)S=1 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