diff --git a/Cargo.lock b/Cargo.lock index 6cbb3708..874aa38e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aes" @@ -81,9 +81,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -96,43 +96,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "arraydeque" @@ -180,14 +180,14 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.1", - "futures-lite 2.3.0", + "fastrand 2.2.0", + "futures-lite 2.5.0", "slab", ] @@ -225,18 +225,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "parking", - "polling 3.7.3", - "rustix 0.38.35", + "polling 3.7.4", + "rustix 0.38.41", "slab", "tracing", "windows-sys 0.59.0", @@ -275,7 +275,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.35", + "rustix 0.38.41", "windows-sys 0.48.0", ] @@ -287,7 +287,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -296,13 +296,13 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ - "async-io 2.3.4", + "async-io 2.4.0", "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.35", + "rustix 0.38.41", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -316,13 +316,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -331,28 +331,17 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.5" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", @@ -377,7 +366,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tower", + "tower 0.5.1", "tower-layer", "tower-service", "tracing", @@ -385,9 +374,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", @@ -398,7 +387,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -406,29 +395,28 @@ dependencies = [ [[package]] name = "axum-macros" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00c055ee2d014ae5981ce1016374e8213682aa14d9bf40e48ab48b5f3ef20eaa" +checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ - "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -518,18 +506,18 @@ dependencies = [ "async-channel", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" dependencies = [ "memchr", - "regex-automata 0.4.7", + "regex-automata 0.4.9", "serde", ] @@ -573,7 +561,7 @@ dependencies = [ "clap", "futures", "heck 0.5.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "libc", "log", "p256", @@ -587,9 +575,10 @@ dependencies = [ "serde_json", "shell-escape", "tempfile", + "terminal-link", "tokio", "tokio-util", - "toml_edit 0.22.20", + "toml_edit 0.22.22", "url", "warg-client", "warg-crypto", @@ -598,6 +587,7 @@ dependencies = [ "wasi-preview1-component-adapter-provider", "wasm-metadata 0.220.0", "wasm-pkg-client", + "wasm-pkg-core", "wasmparser 0.220.0", "wasmprinter 0.220.0", "wat", @@ -616,7 +606,7 @@ dependencies = [ "clap", "dirs", "futures", - "indexmap 2.5.0", + "indexmap 2.6.0", "libc", "log", "owo-colors", @@ -624,10 +614,11 @@ dependencies = [ "serde", "tokio", "tokio-util", - "toml_edit 0.22.20", - "unicode-width 0.1.13", + "toml_edit 0.22.22", + "unicode-width 0.1.14", "url", "wasm-pkg-client", + "wasm-pkg-core", "windows-sys 0.52.0", "wit-component 0.220.0", "wit-parser 0.220.0", @@ -642,7 +633,7 @@ dependencies = [ "home", "serde", "serde_derive", - "toml_edit 0.22.20", + "toml_edit 0.22.22", ] [[package]] @@ -665,7 +656,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -679,9 +670,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.16" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ "shlex", ] @@ -692,6 +683,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.38" @@ -719,9 +716,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.16" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -729,9 +726,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.15" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", @@ -741,27 +738,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -800,7 +797,7 @@ dependencies = [ "encode_unicode", "lazy_static 1.5.0", "libc", - "unicode-width 0.1.13", + "unicode-width 0.1.14", "windows-sys 0.52.0", ] @@ -857,9 +854,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" dependencies = [ "libc", ] @@ -919,7 +916,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -930,7 +927,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -983,7 +980,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -993,7 +990,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1005,7 +1002,7 @@ dependencies = [ "console", "shell-words", "tempfile", - "thiserror", + "thiserror 1.0.69", "zeroize", ] @@ -1057,6 +1054,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "dlv-list" version = "0.5.2" @@ -1131,9 +1139,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1156,7 +1164,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1248,9 +1256,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "ff" @@ -1294,9 +1302,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1309,9 +1317,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1319,15 +1327,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1336,9 +1344,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -1357,11 +1365,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-core", "futures-io", "parking", @@ -1370,32 +1378,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1427,8 +1435,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1440,14 +1450,14 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "group" @@ -1462,9 +1472,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -1472,7 +1482,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1496,6 +1506,12 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" + [[package]] name = "hashlink" version = "0.8.4" @@ -1517,15 +1533,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" @@ -1622,9 +1629,9 @@ checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1640,9 +1647,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", @@ -1679,9 +1686,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -1692,16 +1699,15 @@ dependencies = [ "pin-project-lite", "socket2 0.5.7", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1720,6 +1726,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "id-arena" version = "2.2.1" @@ -1734,12 +1858,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1769,12 +1904,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.1", "serde", ] @@ -1810,9 +1945,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -1857,9 +1992,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1924,9 +2059,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" [[package]] name = "libredox" @@ -1960,6 +2095,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -1978,33 +2119,33 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "logos" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1ceb190eb9bdeecdd8f1ad6a71d6d632a50905948771718741b5461fb01e13" +checksum = "1c6b6e02facda28ca5fb8dbe4b152496ba3b1bd5a4b40bb2b1b2d8ad74e0f39b" dependencies = [ "logos-derive", ] [[package]] name = "logos-codegen" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90be66cb7bd40cb5cc2e9cfaf2d1133b04a3d93b72344267715010a466e0915a" +checksum = "b32eb6b5f26efacd015b000bfc562186472cd9b34bdba3f6b264e2a052676d10" dependencies = [ "beef", "fnv", "lazy_static 1.5.0", "proc-macro2", "quote", - "regex-syntax 0.8.4", - "syn 2.0.77", + "regex-syntax 0.8.5", + "syn 2.0.87", ] [[package]] name = "logos-derive" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45154231e8e96586b39494029e58f12f8ffcb5ecf80333a603a13aa205ea8cbd" +checksum = "3e5d0c5463c911ef55624739fc353238b4e310f0144be1f875dc42fec6bfd5ec" dependencies = [ "logos-codegen", ] @@ -2056,8 +2197,8 @@ checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1" dependencies = [ "cfg-if", "miette-derive", - "thiserror", - "unicode-width 0.1.13", + "thiserror 1.0.69", + "unicode-width 0.1.14", ] [[package]] @@ -2068,7 +2209,7 @@ checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2095,11 +2236,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] @@ -2248,9 +2389,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] @@ -2275,7 +2416,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "unicase", @@ -2283,9 +2424,9 @@ dependencies = [ [[package]] name = "oci-spec" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cee185ce7cf1cce45e194e34cd87c0bad7ff0aa2e8917009a2da4f7b31fb363" +checksum = "da406e58efe2eb5986a6139626d611ce426e5324a824133d76367c765cf0b882" dependencies = [ "derive_builder", "getset", @@ -2294,7 +2435,7 @@ dependencies = [ "serde_json", "strum", "strum_macros", - "thiserror", + "thiserror 2.0.3", ] [[package]] @@ -2316,9 +2457,9 @@ dependencies = [ [[package]] name = "olpc-cjson" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d637c9c15b639ccff597da8f4fa968300651ad2f1e968aefc3b4927a6fb2027a" +checksum = "696183c9b5fe81a7715d074fd632e8bd46f4ccc0231a3ed7fc580a80de5f7083" dependencies = [ "serde", "serde_json", @@ -2327,9 +2468,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "option-ext" @@ -2374,9 +2515,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owo-colors" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" +checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56" [[package]] name = "p256" @@ -2392,9 +2533,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -2427,9 +2568,9 @@ checksum = "14248cc8eced350e20122a291613de29e4fa129ba2731818c4cdbb44fccd3e55" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" [[package]] name = "pbjson" @@ -2490,7 +2631,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.69", "ucd-trie", ] @@ -2514,7 +2655,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2535,34 +2676,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.5.0", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", + "indexmap 2.6.0", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2577,7 +2698,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-io", ] @@ -2609,15 +2730,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.35", + "rustix 0.38.41", "tracing", "windows-sys 0.59.0", ] @@ -2679,12 +2800,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2725,14 +2846,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -2764,7 +2885,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.77", + "syn 2.0.87", "tempfile", ] @@ -2778,7 +2899,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2815,7 +2936,7 @@ dependencies = [ "prost-reflect", "prost-types", "protox-parse", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2827,17 +2948,16 @@ dependencies = [ "logos", "miette", "prost-types", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "ptree" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709c3b241d6a6ccc1933b1c6d7d997fae2b3dff8981f6780eac67df03c32f3ef" +checksum = "e98cc9b19fef1b3e9d04e52df8a5b2a521e44d488cb3162bcd0bba3b5f0c35a4" dependencies = [ "ansi_term", - "atty", "config", "directories", "petgraph", @@ -2848,9 +2968,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -2859,34 +2979,38 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.7", - "thiserror", + "thiserror 2.0.3", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", "rustc-hash", "rustls", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.3", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2 0.5.7", @@ -2944,9 +3068,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -2959,19 +3083,19 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -2985,13 +3109,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -3002,15 +3126,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -3150,9 +3274,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", @@ -3163,9 +3287,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e" dependencies = [ "once_cell", "ring", @@ -3177,25 +3301,27 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" -version = "0.102.7" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -3204,9 +3330,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -3287,9 +3413,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -3306,9 +3432,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.209" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -3325,20 +3451,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -3364,14 +3490,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -3390,15 +3516,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -3408,14 +3534,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3424,7 +3550,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -3559,9 +3685,9 @@ dependencies = [ [[package]] name = "spdx" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47317bbaf63785b53861e1ae2d11b80d6b624211d42cb20efcd210ee6f8a14bc" +checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2" dependencies = [ "smallvec", ] @@ -3582,6 +3708,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -3610,7 +3742,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3632,9 +3764,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -3656,6 +3788,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "system-configuration" version = "0.6.1" @@ -3679,14 +3822,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand 2.2.0", "once_cell", - "rustix 0.38.35", + "rustix 0.38.41", "windows-sys 0.59.0", ] @@ -3699,6 +3842,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminal-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "253bcead4f3aa96243b0f8fa46f9010e87ca23bd5d0c723d474ff1d2417bbdf8" + [[package]] name = "termtree" version = "0.4.1" @@ -3707,22 +3856,42 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.3", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -3784,6 +3953,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -3801,9 +3980,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -3825,7 +4004,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3847,15 +4026,15 @@ checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" dependencies = [ "either", "futures-util", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -3873,7 +4052,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.20", + "toml_edit 0.22.22", ] [[package]] @@ -3891,22 +4070,22 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "winnow 0.6.20", ] [[package]] @@ -3914,11 +4093,22 @@ name = "tower" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 0.1.2", "tokio", "tower-layer", "tower-service", @@ -3982,7 +4172,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -4055,30 +4245,21 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] @@ -4091,9 +4272,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" @@ -4103,9 +4284,9 @@ checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsafe-libyaml" @@ -4121,9 +4302,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -4131,6 +4312,18 @@ dependencies = [ "serde", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -4189,11 +4382,11 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51cb70a7a94a8ac0e1d846495ad5391d998713b4949a04dcc8b75efc0b693554" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itertools 0.12.1", "serde", "serde_with", - "thiserror", + "thiserror 1.0.69", "warg-crypto", "warg-protocol", ] @@ -4212,7 +4405,7 @@ dependencies = [ "dialoguer", "dirs", "futures-util", - "indexmap 2.5.0", + "indexmap 2.6.0", "itertools 0.12.1", "keyring", "libc", @@ -4227,7 +4420,7 @@ dependencies = [ "serde_json", "sha256", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "tracing", @@ -4262,7 +4455,7 @@ dependencies = [ "serde", "sha2", "signature", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4293,14 +4486,14 @@ dependencies = [ "anyhow", "base64 0.21.7", "hex", - "indexmap 2.5.0", + "indexmap 2.6.0", "pbjson-types", "prost", "prost-types", "semver", "serde", "serde_with", - "thiserror", + "thiserror 1.0.69", "warg-crypto", "warg-protobuf", "warg-transparency", @@ -4318,15 +4511,15 @@ dependencies = [ "bytes", "clap", "futures", - "indexmap 2.5.0", + "indexmap 2.6.0", "secrecy", "serde", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "toml", - "tower", + "tower 0.4.13", "tower-http", "tracing", "tracing-subscriber", @@ -4345,9 +4538,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6b5ce0d43d043e084016b2814ae3a5e165e993d65be99be6afad0b74c2f9231" dependencies = [ "anyhow", - "indexmap 2.5.0", + "indexmap 2.6.0", "prost", - "thiserror", + "thiserror 1.0.69", "warg-crypto", "warg-protobuf", ] @@ -4366,9 +4559,9 @@ checksum = "0f76d9fa52234153eeb40b088de91a8c13dc28a912cf6f31cd89ca4bac9024e0" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -4377,24 +4570,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -4404,9 +4597,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4414,22 +4607,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-compose" @@ -4440,7 +4633,7 @@ dependencies = [ "anyhow", "heck 0.4.1", "im-rc", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "petgraph", "serde", @@ -4489,7 +4682,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af5a8e37a5e996861e1813f8de30911c47609c9ff51a7284f7dbd754dc3a9f3" dependencies = [ "anyhow", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -4505,7 +4698,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b" dependencies = [ "anyhow", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -4516,9 +4709,7 @@ dependencies = [ [[package]] name = "wasm-pkg-client" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde35f9ffbc6917f7876f9d07a1083eacb5915736ecfd64f784f4d634384c823" +version = "0.8.2" dependencies = [ "anyhow", "async-trait", @@ -4533,7 +4724,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "toml", @@ -4543,16 +4734,14 @@ dependencies = [ "warg-client", "warg-crypto", "warg-protocol", - "wasm-metadata 0.219.1", + "wasm-metadata 0.220.0", "wasm-pkg-common", - "wit-component 0.219.1", + "wit-component 0.220.0", ] [[package]] name = "wasm-pkg-common" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9a1ebffee2a4b3c19d64b264423ddff3a4303e2c3a0dc13f4c9211618e2b67" +version = "0.8.2" dependencies = [ "anyhow", "bytes", @@ -4564,17 +4753,39 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror", + "thiserror 1.0.69", "tokio", "toml", "tracing", ] +[[package]] +name = "wasm-pkg-core" +version = "0.8.2" +dependencies = [ + "anyhow", + "futures-util", + "indexmap 2.6.0", + "libc", + "semver", + "serde", + "tokio", + "tokio-util", + "toml", + "tracing", + "wasm-metadata 0.220.0", + "wasm-pkg-client", + "wasm-pkg-common", + "windows-sys 0.59.0", + "wit-component 0.220.0", + "wit-parser 0.220.0", +] + [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -4590,7 +4801,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" dependencies = [ "bitflags 2.6.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "semver", ] @@ -4603,7 +4814,7 @@ dependencies = [ "ahash", "bitflags 2.6.0", "hashbrown 0.14.5", - "indexmap 2.5.0", + "indexmap 2.6.0", "semver", ] @@ -4616,7 +4827,7 @@ dependencies = [ "ahash", "bitflags 2.6.0", "hashbrown 0.14.5", - "indexmap 2.5.0", + "indexmap 2.6.0", "semver", "serde", ] @@ -4666,9 +4877,19 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -4676,9 +4897,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.5" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ "rustls-pki-types", ] @@ -4691,7 +4912,7 @@ checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" dependencies = [ "either", "home", - "rustix 0.38.35", + "rustix 0.38.41", "winsafe", ] @@ -4924,9 +5145,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -4956,9 +5177,9 @@ checksum = "6d894e599c161d71acb6a78e8ec8a609a09c2bb227de50829f5afbd03b844a69" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "prettyplease", - "syn 2.0.77", + "syn 2.0.87", "wasm-metadata 0.220.0", "wit-bindgen-core", "wit-component 0.220.0", @@ -4972,7 +5193,7 @@ checksum = "ad1673163c0cb14a6a19ddbf44dd4efe6f015ec1ebb8156710ac32501f19fba2" dependencies = [ "anyhow", "bitflags 2.6.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "serde", "serde_derive", @@ -4991,7 +5212,7 @@ checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53" dependencies = [ "anyhow", "bitflags 2.6.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "serde", "serde_derive", @@ -5010,7 +5231,7 @@ checksum = "4a86f669283257e8e424b9a4fc3518e3ade0b95deb9fbc0f93a1876be3eda598" dependencies = [ "anyhow", "id-arena", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "semver", "serde", @@ -5028,7 +5249,7 @@ checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d" dependencies = [ "anyhow", "id-arena", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "semver", "serde", @@ -5038,6 +5259,18 @@ dependencies = [ "wasmparser 0.220.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "xdg-home" version = "1.3.0" @@ -5059,6 +5292,30 @@ dependencies = [ "hashlink", ] +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zbus" version = "3.15.2" @@ -5143,7 +5400,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -5152,6 +5430,28 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "zvariant" version = "3.15.2" diff --git a/Cargo.toml b/Cargo.toml index 90ba8c1d..6f748664 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,12 +46,14 @@ url = { workspace = true } wasi-preview1-component-adapter-provider = { workspace = true } wasm-metadata = { workspace = true } wasm-pkg-client = { workspace = true } +wasm-pkg-core = { workspace = true } wasmparser = { workspace = true } which = { workspace = true } wit-bindgen-core = { workspace = true } wit-bindgen-rust = { workspace = true } wit-component = { workspace = true } wit-parser = { workspace = true } +terminal-link = "0.1.0" [dev-dependencies] assert_cmd = { workspace = true } @@ -107,7 +109,8 @@ warg-protocol = "0.9.0" warg-server = "0.9.0" wasi-preview1-component-adapter-provider = "24" wasm-metadata = "0.220.0" -wasm-pkg-client = "0.8.0" +wasm-pkg-client = { path = "../wasm-pkg-tools/crates/wasm-pkg-client" } +wasm-pkg-core = { path = "../wasm-pkg-tools/crates/wasm-pkg-core" } wasmparser = "0.220.0" wasmprinter = "0.220.0" wat = "1.220.0" diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 302ef994..51359fb5 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -26,6 +26,7 @@ toml_edit = { workspace = true } unicode-width = { workspace = true } url = { workspace = true } wasm-pkg-client = { workspace = true } +wasm-pkg-core = { workspace = true } wit-component = { workspace = true } wit-parser = { workspace = true } diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 870258f1..0a392230 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -10,9 +10,7 @@ use semver::VersionReq; use wasm_pkg_client::PackageRef; pub mod command; -pub mod lock; pub mod progress; -pub mod registry; pub mod terminal; /// The root directory name used for default cargo component directories diff --git a/crates/core/src/lock.rs b/crates/core/src/lock.rs deleted file mode 100644 index 30f9a51a..00000000 --- a/crates/core/src/lock.rs +++ /dev/null @@ -1,571 +0,0 @@ -//! Module for the lock file implementation. - -use crate::registry::DEFAULT_REGISTRY_NAME; -use anyhow::{anyhow, bail, Context, Result}; -use semver::{Version, VersionReq}; -use serde::{de::IntoDeserializer, Deserialize, Serialize}; -use std::{ - fs::{File, OpenOptions}, - io::{self, Read, Seek, SeekFrom, Write}, - path::{Path, PathBuf}, -}; -use toml_edit::{DocumentMut, Item, Value}; -use wasm_pkg_client::{ContentDigest, PackageRef}; - -/// The file format version of the lock file. -const LOCK_FILE_VERSION: i64 = 1; - -/// Represents a locked package in a lock file. -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "kebab-case")] -pub struct LockedPackage { - /// The name of the locked package. - pub name: PackageRef, - /// The registry the package was resolved from. - /// - /// Defaults to the default registry if not specified. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub registry: Option, - /// The locked versions of a package. - /// - /// A package may have multiple locked versions if more than one - /// version requirement was specified for the package in `wit.toml`. - #[serde(rename = "version", default, skip_serializing_if = "Vec::is_empty")] - pub versions: Vec, -} - -impl LockedPackage { - /// Gets the key used in sorting and searching the package list. - pub fn key(&self) -> (&str, &str, &str) { - ( - self.name.namespace().as_ref(), - self.name.name().as_ref(), - self.registry.as_deref().unwrap_or(DEFAULT_REGISTRY_NAME), - ) - } -} - -/// Represents version information for a locked package. -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct LockedPackageVersion { - /// The version requirement used to resolve this version. - pub requirement: String, - /// The version the package is locked to. - pub version: Version, - /// The digest of the package contents. - pub digest: ContentDigest, -} - -impl LockedPackageVersion { - /// Gets the sort key for the locked package version. - pub fn key(&self) -> &str { - &self.requirement - } -} - -/// Represents a resolver for a lock file. -#[derive(Clone, Copy, Debug)] -pub struct LockFileResolver<'a>(&'a LockFile); - -impl<'a> LockFileResolver<'a> { - /// Creates a new lock file resolver for the given workspace and lock file. - pub fn new(lock_file: &'a LockFile) -> Self { - Self(lock_file) - } - - /// Resolves a package from the lock file. - /// - /// Returns `Ok(None)` if the package cannot be resolved. - /// - /// Fails if the package cannot be resolved and the lock file is not allowed to be updated. - pub fn resolve( - &'a self, - registry: &str, - package_ref: &PackageRef, - requirement: &VersionReq, - ) -> Result> { - if let Some(pkg) = self - .0 - .packages - .binary_search_by_key( - &( - package_ref.namespace().as_ref(), - package_ref.name().as_ref(), - registry, - ), - LockedPackage::key, - ) - .ok() - .map(|i| &self.0.packages[i]) - { - if let Ok(index) = pkg - .versions - .binary_search_by_key(&requirement.to_string().as_str(), LockedPackageVersion::key) - { - let locked = &pkg.versions[index]; - log::info!("dependency package `{package_ref}` from registry `{registry}` with requirement `{requirement}` was resolved by the lock file to version {version}", version = locked.version); - return Ok(Some(locked)); - } - } - - log::info!("dependency package `{package_ref}` from registry `{registry}` with requirement `{requirement}` was not in the lock file"); - Ok(None) - } -} - -/// Represents a resolved dependency lock file. -/// -/// This is a TOML file that contains the resolved dependency information from -/// a previous build. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] -#[serde(rename_all = "kebab-case")] -pub struct LockFile { - /// The version of the lock file. - /// - /// Currently this is always `1`. - pub version: i64, - /// The locked dependencies in the lock file. - /// - /// This list is sorted by the key of the locked package. - #[serde(rename = "package", default, skip_serializing_if = "Vec::is_empty")] - pub packages: Vec, -} - -impl LockFile { - /// Constructs a new lock file from a list of locked packages. - /// - /// It is expected that the packages will be already sorted. - pub fn new(packages: impl Into>) -> Self { - Self { - version: LOCK_FILE_VERSION, - packages: packages.into(), - } - } - - /// Reads the lock file from the given file object. - pub fn read(mut file: &File) -> Result { - let mut contents = String::new(); - file.read_to_string(&mut contents)?; - - let document: DocumentMut = contents.parse()?; - - match document.as_table().get("version") { - Some(Item::Value(Value::Integer(v))) => { - if *v.value() != LOCK_FILE_VERSION { - bail!( - "unsupported file format version {version}", - version = v.value() - ); - } - - // In the future, we should convert between supported versions here. - } - Some(_) => bail!("file format version is not an integer"), - None => bail!("missing file format version"), - } - - Self::deserialize(document.into_deserializer()).context("invalid file format") - } - - /// Writes the lock file to the given file object. - /// - /// The app name is used to generate a header comment. - pub fn write(&self, mut file: &File, app: &str) -> Result<()> { - let content = toml_edit::ser::to_string_pretty(&self)?; - - file.set_len(0)?; - write!(file, "# This file is automatically generated by {app}.\n# It is not intended for manual editing.\n")?; - file.write_all(content.as_bytes())?; - - Ok(()) - } -} - -impl Default for LockFile { - fn default() -> Self { - Self { - version: LOCK_FILE_VERSION, - packages: Vec::new(), - } - } -} - -/// Implements a file lock. -#[derive(Debug)] -pub struct FileLock { - file: File, - path: PathBuf, -} - -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -enum Access { - Shared, - Exclusive, -} - -impl FileLock { - /// Gets the path associated with the file lock. - pub fn path(&self) -> &Path { - &self.path - } - - /// Attempts to acquire exclusive access to a file, returning the locked - /// version of a file. - /// - /// This function will create a file at `path` if it doesn't already exist - /// (including intermediate directories), and then it will try to acquire an - /// exclusive lock on `path`. - /// - /// If the lock cannot be immediately acquired, `Ok(None)` is returned. - /// - /// The returned file can be accessed to look at the path and also has - /// read/write access to the underlying file. - pub fn try_open_rw(path: impl Into) -> Result> { - Self::open( - path.into(), - OpenOptions::new().read(true).write(true).create(true), - Access::Exclusive, - true, - ) - } - - /// Opens exclusive access to a file, returning the locked version of a - /// file. - /// - /// This function will create a file at `path` if it doesn't already exist - /// (including intermediate directories), and then it will acquire an - /// exclusive lock on `path`. - /// - /// If the lock cannot be acquired, this function will block until it is - /// acquired. - /// - /// The returned file can be accessed to look at the path and also has - /// read/write access to the underlying file. - pub fn open_rw(path: impl Into) -> Result { - Ok(Self::open( - path.into(), - OpenOptions::new().read(true).write(true).create(true), - Access::Exclusive, - false, - )? - .unwrap()) - } - - /// Attempts to acquire shared access to a file, returning the locked version - /// of a file. - /// - /// This function will fail if `path` doesn't already exist, but if it does - /// then it will acquire a shared lock on `path`. - /// - /// If the lock cannot be immediately acquired, `Ok(None)` is returned. - /// - /// The returned file can be accessed to look at the path and also has read - /// access to the underlying file. Any writes to the file will return an - /// error. - pub fn try_open_ro(path: impl Into) -> Result> { - Self::open( - path.into(), - OpenOptions::new().read(true), - Access::Shared, - true, - ) - } - - /// Opens shared access to a file, returning the locked version of a file. - /// - /// This function will fail if `path` doesn't already exist, but if it does - /// then it will acquire a shared lock on `path`. - /// - /// If the lock cannot be acquired, this function will block until it is - /// acquired. - /// - /// The returned file can be accessed to look at the path and also has read - /// access to the underlying file. Any writes to the file will return an - /// error. - pub fn open_ro(path: impl Into) -> Result { - Ok(Self::open( - path.into(), - OpenOptions::new().read(true), - Access::Shared, - false, - )? - .unwrap()) - } - - fn open( - path: PathBuf, - opts: &OpenOptions, - access: Access, - try_lock: bool, - ) -> Result> { - // If we want an exclusive lock then if we fail because of NotFound it's - // likely because an intermediate directory didn't exist, so try to - // create the directory and then continue. - let file = opts - .open(&path) - .or_else(|e| { - if e.kind() == io::ErrorKind::NotFound && access == Access::Exclusive { - std::fs::create_dir_all(path.parent().unwrap())?; - Ok(opts.open(&path)?) - } else { - Err(anyhow::Error::from(e)) - } - }) - .with_context(|| format!("failed to open `{path}`", path = path.display()))?; - - let lock = Self { file, path }; - - // File locking on Unix is currently implemented via `flock`, which is known - // to be broken on NFS. We could in theory just ignore errors that happen on - // NFS, but apparently the failure mode [1] for `flock` on NFS is **blocking - // forever**, even if the "non-blocking" flag is passed! - // - // As a result, we just skip all file locks entirely on NFS mounts. That - // should avoid calling any `flock` functions at all, and it wouldn't work - // there anyway. - // - // [1]: https://github.com/rust-lang/cargo/issues/2615 - if is_on_nfs_mount(&lock.path) { - return Ok(Some(lock)); - } - - let res = match (access, try_lock) { - (Access::Shared, true) => sys::try_lock_shared(&lock.file), - (Access::Exclusive, true) => sys::try_lock_exclusive(&lock.file), - (Access::Shared, false) => sys::lock_shared(&lock.file), - (Access::Exclusive, false) => sys::lock_exclusive(&lock.file), - }; - - return match res { - Ok(_) => Ok(Some(lock)), - - // In addition to ignoring NFS which is commonly not working we also - // just ignore locking on file systems that look like they don't - // implement file locking. - Err(e) if sys::error_unsupported(&e) => Ok(Some(lock)), - - // Check to see if it was a contention error - Err(e) if try_lock && sys::error_contended(&e) => Ok(None), - - Err(e) => Err(anyhow!(e).context(format!( - "failed to lock file `{path}`", - path = lock.path.display() - ))), - }; - - #[cfg(all(target_os = "linux", not(target_env = "musl")))] - fn is_on_nfs_mount(path: &Path) -> bool { - use std::ffi::CString; - use std::mem; - use std::os::unix::prelude::*; - - let path = match CString::new(path.as_os_str().as_bytes()) { - Ok(path) => path, - Err(_) => return false, - }; - - unsafe { - let mut buf: libc::statfs = mem::zeroed(); - let r = libc::statfs(path.as_ptr(), &mut buf); - - r == 0 && buf.f_type as u32 == libc::NFS_SUPER_MAGIC as u32 - } - } - - #[cfg(any(not(target_os = "linux"), target_env = "musl"))] - fn is_on_nfs_mount(_path: &Path) -> bool { - false - } - } - - /// Returns the underlying file handle of this lock. - pub fn file(&self) -> &File { - &self.file - } -} - -impl Read for FileLock { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - self.file().read(buf) - } -} - -impl Seek for FileLock { - fn seek(&mut self, to: SeekFrom) -> io::Result { - self.file().seek(to) - } -} - -impl Write for FileLock { - fn write(&mut self, buf: &[u8]) -> io::Result { - self.file().write(buf) - } - - fn flush(&mut self) -> io::Result<()> { - self.file().flush() - } -} - -impl Drop for FileLock { - fn drop(&mut self) { - let _ = sys::unlock(&self.file); - } -} - -#[cfg(unix)] -mod sys { - use std::fs::File; - use std::io::{Error, Result}; - use std::os::unix::io::AsRawFd; - - pub(super) fn lock_shared(file: &File) -> Result<()> { - flock(file, libc::LOCK_SH) - } - - pub(super) fn lock_exclusive(file: &File) -> Result<()> { - flock(file, libc::LOCK_EX) - } - - pub(super) fn try_lock_shared(file: &File) -> Result<()> { - flock(file, libc::LOCK_SH | libc::LOCK_NB) - } - - pub(super) fn try_lock_exclusive(file: &File) -> Result<()> { - flock(file, libc::LOCK_EX | libc::LOCK_NB) - } - - pub(super) fn unlock(file: &File) -> Result<()> { - flock(file, libc::LOCK_UN) - } - - pub(super) fn error_contended(err: &Error) -> bool { - err.raw_os_error().map_or(false, |x| x == libc::EWOULDBLOCK) - } - - pub(super) fn error_unsupported(err: &Error) -> bool { - match err.raw_os_error() { - // Unfortunately, depending on the target, these may or may not be the same. - // For targets in which they are the same, the duplicate pattern causes a warning. - #[allow(unreachable_patterns)] - Some(libc::ENOTSUP | libc::EOPNOTSUPP) => true, - Some(libc::ENOSYS) => true, - _ => false, - } - } - - #[cfg(not(target_os = "solaris"))] - fn flock(file: &File, flag: libc::c_int) -> Result<()> { - let ret = unsafe { libc::flock(file.as_raw_fd(), flag) }; - if ret < 0 { - Err(Error::last_os_error()) - } else { - Ok(()) - } - } - - #[cfg(target_os = "solaris")] - fn flock(file: &File, flag: libc::c_int) -> Result<()> { - // Solaris lacks flock(), so try to emulate using fcntl() - let mut flock = libc::flock { - l_type: 0, - l_whence: 0, - l_start: 0, - l_len: 0, - l_sysid: 0, - l_pid: 0, - l_pad: [0, 0, 0, 0], - }; - flock.l_type = if flag & libc::LOCK_UN != 0 { - libc::F_UNLCK - } else if flag & libc::LOCK_EX != 0 { - libc::F_WRLCK - } else if flag & libc::LOCK_SH != 0 { - libc::F_RDLCK - } else { - panic!("unexpected flock() operation") - }; - - let mut cmd = libc::F_SETLKW; - if (flag & libc::LOCK_NB) != 0 { - cmd = libc::F_SETLK; - } - - let ret = unsafe { libc::fcntl(file.as_raw_fd(), cmd, &flock) }; - - if ret < 0 { - Err(Error::last_os_error()) - } else { - Ok(()) - } - } -} - -#[cfg(windows)] -mod sys { - use std::fs::File; - use std::io::{Error, Result}; - use std::mem; - use std::os::windows::io::AsRawHandle; - - use windows_sys::Win32::Foundation::HANDLE; - use windows_sys::Win32::Foundation::{ERROR_INVALID_FUNCTION, ERROR_LOCK_VIOLATION}; - use windows_sys::Win32::Storage::FileSystem::{ - LockFileEx, UnlockFile, LOCKFILE_EXCLUSIVE_LOCK, LOCKFILE_FAIL_IMMEDIATELY, - }; - - pub(super) fn lock_shared(file: &File) -> Result<()> { - lock_file(file, 0) - } - - pub(super) fn lock_exclusive(file: &File) -> Result<()> { - lock_file(file, LOCKFILE_EXCLUSIVE_LOCK) - } - - pub(super) fn try_lock_shared(file: &File) -> Result<()> { - lock_file(file, LOCKFILE_FAIL_IMMEDIATELY) - } - - pub(super) fn try_lock_exclusive(file: &File) -> Result<()> { - lock_file(file, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY) - } - - pub(super) fn error_contended(err: &Error) -> bool { - err.raw_os_error() - .map_or(false, |x| x == ERROR_LOCK_VIOLATION as i32) - } - - pub(super) fn error_unsupported(err: &Error) -> bool { - err.raw_os_error() - .map_or(false, |x| x == ERROR_INVALID_FUNCTION as i32) - } - - pub(super) fn unlock(file: &File) -> Result<()> { - unsafe { - let ret = UnlockFile(file.as_raw_handle() as HANDLE, 0, 0, !0, !0); - if ret == 0 { - Err(Error::last_os_error()) - } else { - Ok(()) - } - } - } - - fn lock_file(file: &File, flags: u32) -> Result<()> { - unsafe { - let mut overlapped = mem::zeroed(); - let ret = LockFileEx( - file.as_raw_handle() as HANDLE, - flags, - 0, - !0, - !0, - &mut overlapped, - ); - if ret == 0 { - Err(Error::last_os_error()) - } else { - Ok(()) - } - } - } -} diff --git a/crates/core/src/registry.rs b/crates/core/src/registry.rs deleted file mode 100644 index a494d395..00000000 --- a/crates/core/src/registry.rs +++ /dev/null @@ -1,685 +0,0 @@ -//! Module for resolving dependencies from a component registry. -use std::{ - collections::{hash_map, HashMap}, - fmt::Debug, - path::{Path, PathBuf}, - str::FromStr, - sync::Arc, -}; - -use anyhow::{bail, Context, Result}; -use futures::TryStreamExt; -use indexmap::IndexMap; -use semver::{Comparator, Op, Version, VersionReq}; -use serde::{ - de::{self, value::MapAccessDeserializer}, - Deserialize, Serialize, -}; - -use tokio::io::AsyncReadExt; -use wasm_pkg_client::{ - caching::{CachingClient, FileCache}, - Client, Config, ContentDigest, Error as WasmPkgError, PackageRef, Release, VersionInfo, -}; -use wit_component::DecodedWasm; -use wit_parser::{PackageId, PackageName, Resolve, UnresolvedPackageGroup, WorldId}; - -use crate::lock::{LockFileResolver, LockedPackageVersion}; - -/// The name of the default registry. -pub const DEFAULT_REGISTRY_NAME: &str = "default"; - -/// Represents a WIT package dependency. -#[derive(Debug, Clone)] -pub enum Dependency { - /// The dependency is a registry package. - Package(RegistryPackage), - - /// The dependency is a path to a local directory or file. - Local(PathBuf), -} - -impl Serialize for Dependency { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - match self { - Self::Package(package) => { - if package.name.is_none() && package.registry.is_none() { - let version = package.version.to_string(); - version.trim_start_matches('^').serialize(serializer) - } else { - #[derive(Serialize)] - struct Entry<'a> { - package: Option<&'a PackageRef>, - version: &'a str, - registry: Option<&'a str>, - } - - Entry { - package: package.name.as_ref(), - version: package.version.to_string().trim_start_matches('^'), - registry: package.registry.as_deref(), - } - .serialize(serializer) - } - } - Self::Local(path) => { - #[derive(Serialize)] - struct Entry<'a> { - path: &'a PathBuf, - } - - Entry { path }.serialize(serializer) - } - } - } -} - -impl<'de> Deserialize<'de> for Dependency { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - struct Visitor; - - impl<'de> de::Visitor<'de> for Visitor { - type Value = Dependency; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(formatter, "a string or a table") - } - - fn visit_str(self, s: &str) -> Result - where - E: de::Error, - { - Ok(Self::Value::Package(s.parse().map_err(de::Error::custom)?)) - } - - fn visit_map(self, map: A) -> Result - where - A: de::MapAccess<'de>, - { - #[derive(Default, Deserialize)] - #[serde(default, deny_unknown_fields)] - struct Entry { - path: Option, - package: Option, - version: Option, - registry: Option, - } - - let entry = Entry::deserialize(MapAccessDeserializer::new(map))?; - - match (entry.path, entry.package, entry.version, entry.registry) { - (Some(path), None, None, None) => Ok(Self::Value::Local(path)), - (None, name, Some(version), registry) => { - Ok(Self::Value::Package(RegistryPackage { - name, - version, - registry, - })) - } - (Some(_), None, Some(_), _) => Err(de::Error::custom( - "cannot specify both `path` and `version` fields in a dependency entry", - )), - (Some(_), None, None, Some(_)) => Err(de::Error::custom( - "cannot specify both `path` and `registry` fields in a dependency entry", - )), - (Some(_), Some(_), _, _) => Err(de::Error::custom( - "cannot specify both `path` and `package` fields in a dependency entry", - )), - (None, None, _, _) => Err(de::Error::missing_field("package")), - (None, Some(_), None, _) => Err(de::Error::missing_field("version")), - } - } - } - - deserializer.deserialize_any(Visitor) - } -} - -impl FromStr for Dependency { - type Err = anyhow::Error; - - fn from_str(s: &str) -> Result { - Ok(Self::Package(s.parse()?)) - } -} - -/// Represents a reference to a registry package. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct RegistryPackage { - /// The name of the package. - /// - /// If not specified, the name from the mapping will be used. - pub name: Option, - - /// The version requirement of the package. - pub version: VersionReq, - - /// The name of the component registry containing the package. - /// - /// If not specified, the default registry is used. - pub registry: Option, -} - -impl FromStr for RegistryPackage { - type Err = anyhow::Error; - - fn from_str(s: &str) -> Result { - Ok(Self { - name: None, - version: s - .parse() - .with_context(|| format!("'{s}' is an invalid registry package version"))?, - registry: None, - }) - } -} - -/// Represents information about a resolution of a registry package. -#[derive(Clone)] -pub struct RegistryResolution { - /// The name of the dependency that was resolved. - /// - /// This may differ from `package` if the dependency was renamed. - pub name: PackageRef, - /// The name of the package from the registry that was resolved. - pub package: PackageRef, - /// The name of the registry used to resolve the package. - /// - /// A value of `None` indicates that the default registry was used. - pub registry: Option, - /// The version requirement that was used to resolve the package. - pub requirement: VersionReq, - /// The package version that was resolved. - pub version: Version, - /// The digest of the package contents. - pub digest: ContentDigest, - /// The client to use for fetching the package contents. - client: Arc>, -} - -impl Debug for RegistryResolution { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - f.debug_struct("RegistryResolution") - .field("name", &self.name) - .field("package", &self.package) - .field("registry", &self.registry) - .field("requirement", &self.requirement) - .field("version", &self.version) - .field("digest", &self.digest) - .finish() - } -} - -/// Represents information about a resolution of a local file. -#[derive(Clone, Debug)] -pub struct LocalResolution { - /// The name of the dependency that was resolved. - pub name: PackageRef, - /// The path to the resolved dependency. - pub path: PathBuf, -} - -/// Represents a resolution of a dependency. -#[derive(Debug, Clone)] -#[allow(clippy::large_enum_variant)] -pub enum DependencyResolution { - /// The dependency is resolved from a registry package. - Registry(RegistryResolution), - /// The dependency is resolved from a local path. - Local(LocalResolution), -} - -impl DependencyResolution { - /// Gets the name of the dependency that was resolved. - pub fn name(&self) -> &PackageRef { - match self { - Self::Registry(res) => &res.name, - Self::Local(res) => &res.name, - } - } - - /// Gets the resolved version. - /// - /// Returns `None` if the dependency is not resolved from a registry package. - pub fn version(&self) -> Option<&Version> { - match self { - Self::Registry(res) => Some(&res.version), - Self::Local(_) => None, - } - } - - /// The key used in sorting and searching the lock file package list. - /// - /// Returns `None` if the dependency is not resolved from a registry package. - pub fn key(&self) -> Option<(&PackageRef, Option<&str>)> { - match self { - DependencyResolution::Registry(pkg) => Some((&pkg.package, pkg.registry.as_deref())), - DependencyResolution::Local(_) => None, - } - } - - /// Decodes the resolved dependency. - pub async fn decode(&self) -> Result { - // If the dependency path is a directory, assume it contains wit to parse as a package. - let bytes = match self { - DependencyResolution::Local(LocalResolution { path, .. }) - if tokio::fs::metadata(path).await?.is_dir() => - { - return Ok(DecodedDependency::Wit { - resolution: self, - package: UnresolvedPackageGroup::parse_dir(path).with_context(|| { - format!("failed to parse dependency `{path}`", path = path.display()) - })?, - }); - } - DependencyResolution::Local(LocalResolution { path, .. }) => { - tokio::fs::read(path).await.with_context(|| { - format!( - "failed to read content of dependency `{name}` at path `{path}`", - name = self.name(), - path = path.display() - ) - })? - } - DependencyResolution::Registry(res) => { - let stream = res - .client - .get_content( - &res.package, - &Release { - version: res.version.clone(), - content_digest: res.digest.clone(), - }, - ) - .await?; - - let mut buf = Vec::new(); - tokio_util::io::StreamReader::new( - stream.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e)), - ) - .read_to_end(&mut buf) - .await?; - buf - } - }; - - if &bytes[0..4] != b"\0asm" { - return Ok(DecodedDependency::Wit { - resolution: self, - package: UnresolvedPackageGroup::parse( - // This is fake, but it's needed for the parser to work. - self.name().to_string(), - std::str::from_utf8(&bytes).with_context(|| { - format!( - "dependency `{name}` is not UTF-8 encoded", - name = self.name() - ) - })?, - )?, - }); - } - - Ok(DecodedDependency::Wasm { - resolution: self, - decoded: wit_component::decode(&bytes).with_context(|| { - format!( - "failed to decode content of dependency `{name}`", - name = self.name(), - ) - })?, - }) - } -} - -/// Represents a decoded dependency. -pub enum DecodedDependency<'a> { - /// The dependency decoded from an unresolved WIT package. - Wit { - /// The resolution related to the decoded dependency. - resolution: &'a DependencyResolution, - /// The unresolved WIT package. - package: UnresolvedPackageGroup, - }, - /// The dependency decoded from a Wasm file. - Wasm { - /// The resolution related to the decoded dependency. - resolution: &'a DependencyResolution, - /// The decoded Wasm file. - decoded: DecodedWasm, - }, -} - -impl<'a> DecodedDependency<'a> { - /// Fully resolves the dependency. - /// - /// If the dependency is an unresolved WIT package, it will assume that the - /// package has no foreign dependencies. - pub fn resolve(self) -> Result<(Resolve, PackageId, Vec)> { - match self { - Self::Wit { package, .. } => { - let mut resolve = Resolve::new(); - let source_files = package - .source_map - .source_files() - .map(Path::to_path_buf) - .collect(); - let pkg = resolve.push_group(package)?; - Ok((resolve, pkg, source_files)) - } - Self::Wasm { decoded, .. } => match decoded { - DecodedWasm::WitPackage(resolve, pkg) => Ok((resolve, pkg, Vec::new())), - DecodedWasm::Component(resolve, world) => { - let pkg = resolve.worlds[world].package.unwrap(); - Ok((resolve, pkg, Vec::new())) - } - }, - } - } - - /// Gets the package name of the decoded dependency. - pub fn package_name(&self) -> &PackageName { - match self { - Self::Wit { package, .. } => &package.main.name, - Self::Wasm { decoded, .. } => &decoded.resolve().packages[decoded.package()].name, - } - } - - /// Converts the decoded dependency into a component world. - /// - /// Returns an error if the dependency is not a decoded component. - pub fn into_component_world(self) -> Result<(Resolve, WorldId)> { - match self { - Self::Wasm { - decoded: DecodedWasm::Component(resolve, world), - .. - } => Ok((resolve, world)), - _ => bail!("dependency is not a WebAssembly component"), - } - } -} - -/// Used to resolve dependencies for a WIT package. -pub struct DependencyResolver<'a> { - client: Arc>, - lock_file: Option>, - registries: IndexMap<&'a str, Registry<'a>>, - resolutions: HashMap, -} - -impl<'a> DependencyResolver<'a> { - /// Creates a new dependency resolver. If `config` is `None`, then the resolver will be set to - /// offline mode and a lock file must be given as well. Anything that will require network - /// access will fail in offline mode. - pub fn new( - config: Option, - lock_file: Option>, - cache: FileCache, - ) -> anyhow::Result { - if config.is_none() && lock_file.is_none() { - anyhow::bail!("lock file must be provided when offline mode is enabled"); - } - let client = CachingClient::new(config.map(Client::new), cache); - Ok(DependencyResolver { - client: Arc::new(client), - lock_file, - registries: Default::default(), - resolutions: Default::default(), - }) - } - - /// Creates a new dependency resolver with the given client. This is useful when you already - /// have a client available. If the client is set to offline mode, then a lock file must be - /// given or this will error - pub fn new_with_client( - client: Arc>, - lock_file: Option>, - ) -> anyhow::Result { - if client.is_readonly() && lock_file.is_none() { - anyhow::bail!("lock file must be provided when offline mode is enabled"); - } - Ok(DependencyResolver { - client, - lock_file, - registries: Default::default(), - resolutions: Default::default(), - }) - } - - /// Add a dependency to the resolver. - pub async fn add_dependency( - &mut self, - name: &'a PackageRef, - dependency: &'a Dependency, - ) -> Result<()> { - match dependency { - Dependency::Package(package) => { - // Dependency comes from a registry, add a dependency to the resolver - let registry_name = package.registry.as_deref().unwrap_or(DEFAULT_REGISTRY_NAME); - let package_name = package.name.clone().unwrap_or_else(|| name.clone()); - - // Resolve the version from the lock file if there is one - let locked = match self.lock_file.as_ref().and_then(|resolver| { - resolver - .resolve(registry_name, &package_name, &package.version) - .transpose() - }) { - Some(Ok(locked)) => Some(locked), - Some(Err(e)) => return Err(e), - _ => None, - }; - - let registry = match self.registries.entry(registry_name) { - indexmap::map::Entry::Occupied(e) => e.into_mut(), - indexmap::map::Entry::Vacant(e) => e.insert(Registry { - client: self.client.clone(), - packages: HashMap::new(), - dependencies: Vec::new(), - }), - }; - - registry - .add_dependency(name, package_name, &package.version, locked) - .await?; - } - Dependency::Local(p) => { - // A local path dependency, insert a resolution immediately - let res = DependencyResolution::Local(LocalResolution { - name: name.clone(), - path: p.clone(), - }); - - let prev = self.resolutions.insert(name.clone(), res); - assert!(prev.is_none()); - } - } - - Ok(()) - } - - /// Resolve all dependencies. - /// - /// This will download all dependencies that are not already present in client storage. - /// - /// Returns the dependency resolution map. - pub async fn resolve(mut self) -> Result { - // Resolve all dependencies - for (name, registry) in self.registries.iter_mut() { - registry.resolve(name).await?; - } - - for resolution in self - .registries - .into_values() - .flat_map(|r| r.dependencies.into_iter()) - .map(|d| { - DependencyResolution::Registry( - d.resolution.expect("dependency should have been resolved"), - ) - }) - { - let prev = self - .resolutions - .insert(resolution.name().clone(), resolution); - assert!(prev.is_none()); - } - - Ok(self.resolutions) - } -} - -struct Registry<'a> { - client: Arc>, - packages: HashMap>, - dependencies: Vec>, -} - -impl<'a> Registry<'a> { - async fn add_dependency( - &mut self, - name: &'a PackageRef, - package: PackageRef, - version: &'a VersionReq, - locked: Option<&LockedPackageVersion>, - ) -> Result<()> { - let dep = RegistryDependency { - name, - package: package.clone(), - version, - locked: locked.map(|l| (l.version.clone(), l.digest.clone())), - resolution: None, - }; - - self.dependencies.push(dep); - - Ok(()) - } - - async fn resolve(&mut self, registry: &'a str) -> Result<()> { - for dependency in self.dependencies.iter_mut() { - // We need to clone a handle to the client because we mutably borrow self below. Might - // be worth replacing the mutable borrow with a RwLock down the line. - let client = self.client.clone(); - - let (selected_version, digest) = if client.is_readonly() { - dependency - .locked - .as_ref() - .map(|(ver, digest)| (ver, Some(digest))) - .ok_or_else(|| { - anyhow::anyhow!("Couldn't find locked dependency while in offline mode") - })? - } else { - let versions = - load_package(&mut self.packages, &self.client, dependency.package.clone()) - .await? - .with_context(|| { - format!( - "package `{name}` was not found in component registry `{registry}`", - name = dependency.package - ) - })?; - - match &dependency.locked { - Some((version, digest)) => { - // The dependency had a lock file entry, so attempt to do an exact match first - let exact_req = VersionReq { - comparators: vec![Comparator { - op: Op::Exact, - major: version.major, - minor: Some(version.minor), - patch: Some(version.patch), - pre: version.pre.clone(), - }], - }; - - // If an exact match can't be found, fallback to the latest release to satisfy - // the version requirement; this can happen when packages are yanked. If we did - // find an exact match, return the digest for comparison after fetching the - // release - find_latest_release(versions, &exact_req).map(|v| (&v.version, Some(digest))).or_else(|| find_latest_release(versions, dependency.version).map(|v| (&v.version, None))) - } - None => find_latest_release(versions, dependency.version).map(|v| (&v.version, None)), - }.with_context(|| format!("component registry package `{name}` has no release matching version requirement `{version}`", name = dependency.package, version = dependency.version))? - }; - - // We need to clone a handle to the client because we mutably borrow self above. Might - // be worth replacing the mutable borrow with a RwLock down the line. - let release = client - .get_release(&dependency.package, selected_version) - .await?; - if let Some(digest) = digest { - if &release.content_digest != digest { - bail!( - "component registry package `{name}` (v`{version}`) has digest `{content}` but the lock file specifies digest `{digest}`", - name = dependency.package, - version = release.version, - content = release.content_digest, - ); - } - } - - dependency.resolution = Some(RegistryResolution { - name: dependency.name.clone(), - package: dependency.package.clone(), - registry: if registry == DEFAULT_REGISTRY_NAME { - None - } else { - Some(registry.to_string()) - }, - requirement: dependency.version.clone(), - version: release.version.clone(), - digest: release.content_digest.clone(), - client: self.client.clone(), - }); - } - - Ok(()) - } -} - -async fn load_package<'b>( - packages: &'b mut HashMap>, - client: &CachingClient, - package: PackageRef, -) -> Result>> { - match packages.entry(package) { - hash_map::Entry::Occupied(e) => Ok(Some(e.into_mut())), - hash_map::Entry::Vacant(e) => match client.list_all_versions(e.key()).await { - Ok(p) => Ok(Some(e.insert(p))), - Err(WasmPkgError::PackageNotFound) => Ok(None), - Err(err) => Err(err.into()), - }, - } -} - -struct RegistryDependency<'a> { - /// The package name assigned in the configuration file. - name: &'a PackageRef, - /// The package name of the registry package. - package: PackageRef, - version: &'a VersionReq, - locked: Option<(Version, ContentDigest)>, - resolution: Option, -} - -/// Represents a map of dependency resolutions. -/// -/// The key to the map is the package name of the dependency. -pub type DependencyResolutionMap = HashMap; - -fn find_latest_release<'a>( - versions: &'a [VersionInfo], - req: &VersionReq, -) -> Option<&'a VersionInfo> { - versions - .iter() - .filter(|info| !info.yanked && req.matches(&info.version)) - .max_by(|a, b| a.version.cmp(&b.version)) -} diff --git a/src/bindings.rs b/src/bindings.rs index 7c34f416..9fe2cc50 100644 --- a/src/bindings.rs +++ b/src/bindings.rs @@ -6,11 +6,11 @@ use std::{ }; use anyhow::{bail, Context, Result}; -use cargo_component_core::registry::DecodedDependency; use heck::ToKebabCase; use indexmap::{IndexMap, IndexSet}; use semver::Version; use wasm_pkg_client::PackageRef; +use wasm_pkg_core::resolver::DecodedDependency; use wit_bindgen_core::Files; use wit_bindgen_rust::{Opts, WithOption}; use wit_component::DecodedWasm; @@ -179,7 +179,7 @@ impl<'a> BindingsGenerator<'a> { }; // Merge all component dependencies as interface imports - for (id, dependency) in &resolution.resolutions { + for (id, dependency) in resolution.resolutions.iter() { log::debug!("importing component dependency `{id}`"); empty_target = false; @@ -266,7 +266,7 @@ impl<'a> BindingsGenerator<'a> { // Start by decoding all of the target dependencies let mut deps = IndexMap::new(); - for (id, resolution) in &resolution.target_resolutions { + for (id, resolution) in resolution.target_resolutions.iter() { let decoded = resolution.decode().await?; let name = decoded.package_name(); diff --git a/src/commands/add.rs b/src/commands/add.rs index f4614bf3..bda1d26c 100644 --- a/src/commands/add.rs +++ b/src/commands/add.rs @@ -1,15 +1,10 @@ use std::{ fs, path::{Path, PathBuf}, - sync::Arc, }; use anyhow::{bail, Context, Result}; -use cargo_component_core::{ - command::CommonOptions, - registry::{Dependency, DependencyResolution, DependencyResolver, RegistryPackage}, - VersionedPackageName, -}; +use cargo_component_core::{command::CommonOptions, VersionedPackageName}; use cargo_metadata::Package; use clap::Args; use semver::VersionReq; @@ -18,6 +13,9 @@ use wasm_pkg_client::{ caching::{CachingClient, FileCache}, PackageRef, }; +use wasm_pkg_core::resolver::{ + Dependency, DependencyResolution, DependencyResolver, RegistryPackage, +}; use crate::{ config::CargoPackageSpec, @@ -127,7 +125,7 @@ impl AddCommand { async fn resolve_version( &self, - client: Arc>, + client: CachingClient, name: &PackageRef, ) -> Result { let mut resolver = DependencyResolver::new_with_client(client, None)?; diff --git a/src/commands/new.rs b/src/commands/new.rs index 51fa9906..d41a54f8 100644 --- a/src/commands/new.rs +++ b/src/commands/new.rs @@ -1,21 +1,24 @@ use std::{ borrow::Cow, + collections::HashMap, fs, path::{Path, PathBuf}, process::Command, - sync::Arc, }; use anyhow::{bail, Context, Result}; -use cargo_component_core::{ - command::CommonOptions, - registry::{Dependency, DependencyResolution, DependencyResolver, RegistryResolution}, -}; +use cargo_component_core::command::CommonOptions; use clap::Args; use heck::ToKebabCase; use semver::VersionReq; use toml_edit::{table, value, DocumentMut, Item, Table, Value}; -use wasm_pkg_client::caching::{CachingClient, FileCache}; +use wasm_pkg_client::{ + caching::{CachingClient, FileCache}, + PackageRef, +}; +use wasm_pkg_core::resolver::{ + Dependency, DependencyResolution, DependencyResolver, RegistryResolution, +}; use crate::{config::Config, generator::SourceGenerator, metadata, metadata::DEFAULT_WIT_DIR}; @@ -522,7 +525,7 @@ world example {{ /// `DependencyResolution` instead so we can actually resolve the dependency. async fn resolve_target( &self, - client: Arc>, + client: CachingClient, target: Option, ) -> Result)>> { match target { @@ -540,7 +543,7 @@ world example {{ assert_eq!(dependencies.len(), 1); Ok(Some(( - dependencies + as Clone>::clone(&dependencies) .into_values() .next() .expect("expected a target resolution"), diff --git a/src/commands/update.rs b/src/commands/update.rs index 6a2e57b2..7e7df90c 100644 --- a/src/commands/update.rs +++ b/src/commands/update.rs @@ -1,9 +1,20 @@ use anyhow::Result; -use cargo_component_core::command::CommonOptions; +use cargo_component_core::{command::CommonOptions, terminal::Colors}; use clap::Args; -use std::path::PathBuf; +use std::{ + collections::HashSet, + path::{Path, PathBuf}, +}; +use terminal_link::Link as TerminalLink; +use wasm_pkg_core::{ + lock::{LockFile, LockedPackageVersion}, + resolver::{DependencyResolver, RegistryPackage}, +}; -use crate::{load_component_metadata, load_metadata, Config}; +use crate::{ + load_component_metadata, load_metadata, metadata::ComponentMetadata, Config, + PackageComponentMetadata, +}; /// Update dependencies as recorded in the component lock file #[derive(Args)] @@ -41,18 +52,142 @@ impl UpdateCommand { let config = Config::new(self.common.new_terminal(), self.common.config).await?; let metadata = load_metadata(self.manifest_path.as_deref())?; let packages = load_component_metadata(&metadata, [].iter(), true)?; - - let lock_update_allowed = !self.frozen && !self.locked; let client = config.client(self.common.cache_dir, false).await?; - crate::update_lockfile( - client, - &config, - &metadata, - &packages, - lock_update_allowed, - self.locked, - self.dry_run, - ) - .await + let lock_file = if Path::exists(&PathBuf::from("Cargo-component.lock")) { + config.terminal().status_with_color( + "Warning", + format!( + "It seems you are using `Cargo-component.lock` for your lock file. + As of version 0.20.0, cargo-component uses `wkg.lock` from {}. + It is recommended you switch to `wkg.lock` by deleting your `Cargo-component.lock", + TerminalLink::new( + "wasm-pkg-tools", + "https://github.com/bytecodealliance/wasm-pkg-tools" + ) + ), + Colors::Yellow, + )?; + LockFile::load_from_path("Cargo-component.lock", true).await? + } else { + LockFile::load(true).await? + }; + let old_pkgs = lock_file.packages.clone(); + drop(lock_file); + + let mut new_packages = HashSet::new(); + for PackageComponentMetadata { + metadata: ComponentMetadata { section, .. }, + .. + } in &packages + { + let target_deps = section.target.dependencies(); + for (name, dep) in target_deps.iter() { + match &dep.0 { + wasm_pkg_core::resolver::Dependency::Package(RegistryPackage { + version, + .. + }) => { + new_packages.insert((name.clone(), version.clone())); + } + wasm_pkg_core::resolver::Dependency::Local(_) => todo!(), + } + } + for (name, dep) in section.dependencies.iter() { + match &dep.0 { + wasm_pkg_core::resolver::Dependency::Package(RegistryPackage { + version, + .. + }) => { + new_packages.insert((name.clone(), version.clone())); + } + wasm_pkg_core::resolver::Dependency::Local(_) => todo!(), + } + } + } + let mut resolver = DependencyResolver::new_with_client(client, None)?; + resolver.add_packages(new_packages).await?; + let deps = resolver.resolve().await?; + + let mut new_lock_file = LockFile::from_dependencies(&deps, "wkg.lock").await?; + + for old_pkg in &old_pkgs { + if let Some(new_pkg) = new_lock_file + .packages + .iter() + .find(|p| p.name == old_pkg.name) + { + for old_ver in &old_pkg.versions { + let new_ver = match new_pkg + .versions + .binary_search_by_key(&old_ver.key(), LockedPackageVersion::key) + .map(|index| &new_pkg.versions[index]) + { + Ok(ver) => ver, + Err(_) => { + config.terminal().status_with_color( + if self.dry_run { + "Would remove" + } else { + "Removing" + }, + format!( + "dependency `{name}` v{version}", + name = old_pkg.name, + version = old_ver.version, + ), + Colors::Red, + )?; + continue; + } + }; + if old_ver.version != new_ver.version { + config.terminal().status_with_color( + if self.dry_run { + "Would update" + } else { + "Updating" + }, + format!( + "dependency `{name}` v{old} -> v{new}", + name = old_pkg.name, + old = old_ver.version, + new = new_ver.version + ), + Colors::Cyan, + )?; + } + } + } else { + for old_ver in &old_pkg.versions { + config.terminal().status_with_color( + if self.dry_run { + "Would remove" + } else { + "Removing" + }, + format!("dependency `{}` v{}", old_pkg.name, old_ver.version), + Colors::Red, + )?; + } + } + } + for new_pkg in &new_lock_file.packages { + if old_pkgs.iter().find(|p| p.name == new_pkg.name).is_none() { + for new_ver in &new_pkg.versions { + config.terminal().status_with_color( + if self.dry_run { "Would add" } else { "Adding" }, + format!( + "dependency `{name}` v{version}", + name = new_pkg.name, + version = new_ver.version, + ), + Colors::Green, + )?; + } + } + } + + new_lock_file.write().await?; + Ok(()) } } diff --git a/src/config.rs b/src/config.rs index b6f54333..a82ff347 100644 --- a/src/config.rs +++ b/src/config.rs @@ -26,7 +26,6 @@ use parse_arg::{iter_short, match_arg}; use semver::Version; use std::fmt; use std::str::FromStr; -use std::sync::Arc; use std::{collections::BTreeMap, fmt::Display, path::PathBuf}; use toml_edit::DocumentMut; use wasm_pkg_client::caching::{CachingClient, FileCache}; @@ -525,11 +524,11 @@ impl Config { &self, cache: Option, offline: bool, - ) -> anyhow::Result>> { - Ok(Arc::new(CachingClient::new( + ) -> anyhow::Result> { + Ok(CachingClient::new( (!offline).then(|| Client::new(self.pkg_config.clone())), FileCache::new(cache_dir(cache)?).await?, - ))) + )) } } diff --git a/src/generator.rs b/src/generator.rs index 140472ef..2b2859bc 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -9,10 +9,10 @@ use std::{ }; use anyhow::{bail, Context, Result}; -use cargo_component_core::registry::DependencyResolution; use heck::{AsSnakeCase, ToSnakeCase, ToUpperCamelCase}; use indexmap::{map::Entry, IndexMap, IndexSet}; use wasm_pkg_client::PackageRef; +use wasm_pkg_core::resolver::DependencyResolution; use wit_bindgen_rust::to_rust_ident; use wit_parser::{ Function, FunctionKind, Handle, Interface, Resolve, Type, TypeDef, TypeDefKind, TypeId, diff --git a/src/lib.rs b/src/lib.rs index be055dbe..8b7cd7c0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,33 +11,30 @@ use std::{ io::{BufRead, BufReader, Read, Seek, SeekFrom}, path::{Path, PathBuf}, process::{Command, Stdio}, - sync::Arc, time::SystemTime, }; use anyhow::{bail, Context, Result}; use bindings::BindingsGenerator; -use cargo_component_core::{ - lock::{LockFile, LockFileResolver, LockedPackage, LockedPackageVersion}, - terminal::Colors, -}; +use cargo_component_core::terminal::Colors; use cargo_config2::{PathAndArgs, TargetTripleRef}; use cargo_metadata::{Artifact, Message, Metadata, MetadataCommand, Package}; use semver::Version; use shell_escape::escape; use tempfile::NamedTempFile; +use terminal_link::Link as TerminalLink; use wasm_metadata::{Link, LinkType, RegistryMetadata}; use wasm_pkg_client::{ caching::{CachingClient, FileCache}, PackageRef, PublishOpts, Registry, }; +use wasm_pkg_core::lock::LockFile; use wasmparser::{Parser, Payload}; use wit_component::ComponentEncoder; use crate::target::install_wasm32_wasip1; use config::{CargoArguments, CargoPackageSpec, Config}; -use lock::{acquire_lock_file_ro, acquire_lock_file_rw}; use metadata::ComponentMetadata; use registry::{PackageDependencyResolution, PackageResolutionMap}; @@ -45,7 +42,6 @@ mod bindings; pub mod commands; pub mod config; mod generator; -mod lock; mod metadata; mod registry; mod target; @@ -138,7 +134,7 @@ impl From<&str> for CargoCommand { /// /// Returns any relevant output components. pub async fn run_cargo_command( - client: Arc>, + client: CachingClient, config: &Config, metadata: &Metadata, packages: &[PackageComponentMetadata<'_>], @@ -146,7 +142,7 @@ pub async fn run_cargo_command( cargo_args: &CargoArguments, spawn_args: &[String], ) -> Result> { - let import_name_map = generate_bindings(client, config, metadata, packages, cargo_args).await?; + let import_name_map = generate_bindings(client, config, packages).await?; let cargo_path = std::env::var("CARGO") .map(PathBuf::from) @@ -260,7 +256,8 @@ pub async fn run_cargo_command( &import_name_map, command, output_args, - )?; + ) + .await?; if let Some(runner) = runner { spawn_outputs(config, &runner, output_args, &outputs, command)?; @@ -392,7 +389,7 @@ struct Output { display: Option, } -fn componentize_artifacts( +async fn componentize_artifacts( config: &Config, cargo_metadata: &Metadata, artifacts: &[Artifact], @@ -406,7 +403,7 @@ fn componentize_artifacts( env::current_dir().with_context(|| "couldn't get the current directory of the process")?; // Acquire the lock file to ensure any other cargo-component process waits for this to complete - let _file_lock = acquire_lock_file_ro(config.terminal(), cargo_metadata)?; + let _file_lock = LockFile::load(false).await?; for artifact in artifacts { for path in artifact @@ -733,30 +730,32 @@ pub fn load_component_metadata<'a>( } async fn generate_bindings( - client: Arc>, + client: CachingClient, config: &Config, - metadata: &Metadata, packages: &[PackageComponentMetadata<'_>], - cargo_args: &CargoArguments, ) -> Result>> { - let file_lock = acquire_lock_file_ro(config.terminal(), metadata)?; - let lock_file = file_lock - .as_ref() - .map(|f| { - LockFile::read(f.file()).with_context(|| { - format!( - "failed to read lock file `{path}`", - path = f.path().display() + let lock_file = if Path::exists(&PathBuf::from("Cargo-component.lock")) { + config.terminal().status_with_color( + "Warning", + format!( + "It seems you are using `Cargo-component.lock` for your lock file. + As of version 0.20.0, cargo-component uses `wkg.lock` from {}. + It is recommended you switch to `wkg.lock` by deleting your `Cargo-component.lock", + TerminalLink::new( + "wasm-pkg-tools", + "https://github.com/bytecodealliance/wasm-pkg-tools" ) - }) - }) - .transpose()?; + ), + Colors::Yellow, + )?; + LockFile::load_from_path("Cargo-component.lock", true).await? + } else { + LockFile::load(true).await? + }; let cwd = env::current_dir().with_context(|| "couldn't get the current directory of the process")?; - - let resolver = lock_file.as_ref().map(LockFileResolver::new); - let resolution_map = create_resolution_map(client, packages, resolver).await?; + let resolution_map = create_resolution_map(client, packages, &lock_file).await?; let mut import_name_map = HashMap::new(); for PackageComponentMetadata { package, .. } in packages { let resolution = resolution_map.get(&package.id).expect("missing resolution"); @@ -766,35 +765,17 @@ async fn generate_bindings( ); } - // Update the lock file if it exists or if the new lock file is non-empty - let new_lock_file = resolution_map.to_lock_file(); - if (lock_file.is_some() || !new_lock_file.packages.is_empty()) - && Some(&new_lock_file) != lock_file.as_ref() - { - drop(file_lock); - let file_lock = acquire_lock_file_rw( - config.terminal(), - metadata, - cargo_args.lock_update_allowed(), - cargo_args.locked, - )?; - new_lock_file - .write(file_lock.file(), "cargo-component") - .with_context(|| { - format!( - "failed to write lock file `{path}`", - path = file_lock.path().display() - ) - })?; - } + drop(lock_file); + let mut new_lock_file = resolution_map.to_lock_file().await; + new_lock_file.write().await?; Ok(import_name_map) } async fn create_resolution_map<'a>( - client: Arc>, + client: CachingClient, packages: &'a [PackageComponentMetadata<'_>], - lock_file: Option>, + lock_file: &LockFile, ) -> Result> { let mut map = PackageResolutionMap::default(); @@ -1079,7 +1060,7 @@ fn add_registry_metadata(package: &Package, bytes: &[u8], path: &Path) -> Result /// Publish a component for the given workspace and publish options. pub async fn publish( config: &Config, - client: Arc>, + client: CachingClient, options: &PublishOptions<'_>, ) -> Result<()> { if options.dry_run { @@ -1120,165 +1101,3 @@ pub async fn publish( Ok(()) } - -/// Update the dependencies in the lock file. -/// -/// This updates only `Cargo-component.lock`. -pub async fn update_lockfile( - client: Arc>, - config: &Config, - metadata: &Metadata, - packages: &[PackageComponentMetadata<'_>], - lock_update_allowed: bool, - locked: bool, - dry_run: bool, -) -> Result<()> { - // Read the current lock file and generate a new one - let map = create_resolution_map(client, packages, None).await?; - - let file_lock = acquire_lock_file_ro(config.terminal(), metadata)?; - let orig_lock_file = file_lock - .as_ref() - .map(|f| { - LockFile::read(f.file()).with_context(|| { - format!( - "failed to read lock file `{path}`", - path = f.path().display() - ) - }) - }) - .transpose()? - .unwrap_or_default(); - - let new_lock_file = map.to_lock_file(); - - for old_pkg in &orig_lock_file.packages { - let new_pkg = match new_lock_file - .packages - .binary_search_by_key(&old_pkg.key(), LockedPackage::key) - .map(|index| &new_lock_file.packages[index]) - { - Ok(pkg) => pkg, - Err(_) => { - // The package is no longer a dependency - for old_ver in &old_pkg.versions { - config.terminal().status_with_color( - if dry_run { "Would remove" } else { "Removing" }, - format!( - "dependency `{name}` v{version}", - name = old_pkg.name, - version = old_ver.version, - ), - Colors::Red, - )?; - } - continue; - } - }; - - for old_ver in &old_pkg.versions { - let new_ver = match new_pkg - .versions - .binary_search_by_key(&old_ver.key(), LockedPackageVersion::key) - .map(|index| &new_pkg.versions[index]) - { - Ok(ver) => ver, - Err(_) => { - // The version of the package is no longer a dependency - config.terminal().status_with_color( - if dry_run { "Would remove" } else { "Removing" }, - format!( - "dependency `{name}` v{version}", - name = old_pkg.name, - version = old_ver.version, - ), - Colors::Red, - )?; - continue; - } - }; - - // The version has changed - if old_ver.version != new_ver.version { - config.terminal().status_with_color( - if dry_run { "Would update" } else { "Updating" }, - format!( - "dependency `{name}` v{old} -> v{new}", - name = old_pkg.name, - old = old_ver.version, - new = new_ver.version - ), - Colors::Cyan, - )?; - } - } - } - - for new_pkg in &new_lock_file.packages { - let old_pkg = match orig_lock_file - .packages - .binary_search_by_key(&new_pkg.key(), LockedPackage::key) - .map(|index| &orig_lock_file.packages[index]) - { - Ok(pkg) => pkg, - Err(_) => { - // The package is new - for new_ver in &new_pkg.versions { - config.terminal().status_with_color( - if dry_run { "Would add" } else { "Adding" }, - format!( - "dependency `{name}` v{version}", - name = new_pkg.name, - version = new_ver.version, - ), - Colors::Green, - )?; - } - continue; - } - }; - - for new_ver in &new_pkg.versions { - if old_pkg - .versions - .binary_search_by_key(&new_ver.key(), LockedPackageVersion::key) - .map(|index| &old_pkg.versions[index]) - .is_err() - { - // The version is new - config.terminal().status_with_color( - if dry_run { "Would add" } else { "Adding" }, - format!( - "dependency `{name}` v{version}", - name = new_pkg.name, - version = new_ver.version, - ), - Colors::Green, - )?; - } - } - } - - if dry_run { - config - .terminal() - .warn("not updating component lock file due to --dry-run option")?; - } else { - // Update the lock file - if new_lock_file != orig_lock_file { - drop(file_lock); - let file_lock = - acquire_lock_file_rw(config.terminal(), metadata, lock_update_allowed, locked)?; - new_lock_file - .write(file_lock.file(), "cargo-component") - .with_context(|| { - format!( - "failed to write lock file `{path}`", - path = file_lock.path().display() - ) - })?; - } - } - - Ok(()) -} diff --git a/src/lock.rs b/src/lock.rs deleted file mode 100644 index f045bfad..00000000 --- a/src/lock.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! Module for the lock file implementation. - -use anyhow::Result; -use cargo_component_core::{ - lock::FileLock, - terminal::{Colors, Terminal}, -}; -use cargo_metadata::Metadata; - -/// The name of the lock file. -pub const LOCK_FILE_NAME: &str = "Cargo-component.lock"; - -pub(crate) fn acquire_lock_file_ro( - terminal: &Terminal, - metadata: &Metadata, -) -> Result> { - let path = metadata.workspace_root.join(LOCK_FILE_NAME); - if !path.exists() { - return Ok(None); - } - - log::info!("opening lock file `{path}`"); - match FileLock::try_open_ro(&path)? { - Some(lock) => Ok(Some(lock)), - None => { - terminal.status_with_color( - "Blocking", - format!("on access to lock file `{path}`"), - Colors::Cyan, - )?; - - FileLock::open_ro(&path).map(Some) - } - } -} - -pub(crate) fn acquire_lock_file_rw( - terminal: &Terminal, - metadata: &Metadata, - lock_update_allowed: bool, - locked: bool, -) -> Result { - if !lock_update_allowed { - let flag = if locked { "--locked" } else { "--frozen" }; - anyhow::bail!( - "the lock file {path} needs to be updated but {flag} was passed to prevent this\n\ - If you want to try to generate the lock file without accessing the network, \ - remove the {flag} flag and use --offline instead.", - path = metadata.workspace_root.join(LOCK_FILE_NAME) - ); - } - - let path = metadata.workspace_root.join(LOCK_FILE_NAME); - log::info!("creating lock file `{path}`"); - match FileLock::try_open_rw(&path)? { - Some(lock) => Ok(lock), - None => { - terminal.status_with_color( - "Blocking", - format!("on access to lock file `{path}`"), - Colors::Cyan, - )?; - - FileLock::open_rw(&path) - } - } -} diff --git a/src/metadata.rs b/src/metadata.rs index a9abdb76..8554928d 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -8,16 +8,16 @@ use std::{ }; use anyhow::{bail, Context, Result}; -use cargo_component_core::registry::{Dependency, RegistryPackage}; use cargo_metadata::Package; use semver::{Version, VersionReq}; use serde::{ de::{self, value::MapAccessDeserializer}, - Deserialize, + Deserialize, Serialize }; use serde_json::from_value; use url::Url; use wasm_pkg_client::PackageRef; +use wasm_pkg_core::resolver::{Dependency, RegistryPackage}; /// The default directory to look for a target WIT file. pub const DEFAULT_WIT_DIR: &str = "wit"; @@ -169,17 +169,17 @@ pub enum Target { /// [select-world]: https://docs.rs/wit-parser/latest/wit_parser/struct.Resolve.html#method.select_world world: Option, /// The dependencies of the wit document being targeted. - dependencies: HashMap, + dependencies: HashMap, }, } impl Target { /// Gets the dependencies of the target. - pub fn dependencies(&self) -> Cow> { + pub fn dependencies(&self) -> Cow> { match self { Self::Package { name, package, .. } => Cow::Owned(HashMap::from_iter([( name.clone(), - Dependency::Package(package.clone()), + WasmDependency(Dependency::Package(package.clone())), )])), Self::Local { dependencies, .. } => Cow::Borrowed(dependencies), } @@ -271,7 +271,7 @@ impl<'de> Deserialize<'de> for Target { world: Option, registry: Option, path: Option, - dependencies: HashMap, + dependencies: HashMap, } let entry = Entry::deserialize(MapAccessDeserializer::new(map))?; @@ -326,6 +326,112 @@ impl<'de> Deserialize<'de> for Target { } } +#[derive(Debug, Clone)] +pub struct WasmDependency(pub Dependency); + +impl Serialize for WasmDependency { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match &self.0 { + Dependency::Package(package) => { + if package.name.is_none() && package.registry.is_none() { + let version = package.version.to_string(); + version.trim_start_matches('^').serialize(serializer) + } else { + #[derive(Serialize)] + struct Entry<'a> { + package: Option<&'a PackageRef>, + version: &'a str, + registry: Option<&'a str>, + } + + Entry { + package: package.name.as_ref(), + version: package.version.to_string().trim_start_matches('^'), + registry: package.registry.as_deref(), + } + .serialize(serializer) + } + } + Dependency::Local(path) => { + #[derive(Serialize)] + struct Entry<'a> { + path: &'a PathBuf, + } + + Entry { path }.serialize(serializer) + } + } + } +} + +impl<'de> Deserialize<'de> for WasmDependency { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct Visitor; + + impl<'de> de::Visitor<'de> for Visitor { + type Value = WasmDependency; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(formatter, "a string or a table") + } + + fn visit_str(self, s: &str) -> Result + where + E: de::Error, + { + Ok(WasmDependency(Dependency::Package( + s.parse().map_err(de::Error::custom)?, + ))) + } + + fn visit_map(self, map: A) -> Result + where + A: de::MapAccess<'de>, + { + #[derive(Default, Deserialize)] + #[serde(default, deny_unknown_fields)] + struct Entry { + path: Option, + package: Option, + version: Option, + registry: Option, + } + + let entry = Entry::deserialize(MapAccessDeserializer::new(map))?; + + match (entry.path, entry.package, entry.version, entry.registry) { + (Some(path), None, None, None) => Ok(WasmDependency(Dependency::Local(path))), + (None, name, Some(version), registry) => { + Ok(WasmDependency(Dependency::Package(RegistryPackage { + name, + version, + registry, + }))) + } + (Some(_), None, Some(_), _) => Err(de::Error::custom( + "cannot specify both `path` and `version` fields in a dependency entry", + )), + (Some(_), None, None, Some(_)) => Err(de::Error::custom( + "cannot specify both `path` and `registry` fields in a dependency entry", + )), + (Some(_), Some(_), _, _) => Err(de::Error::custom( + "cannot specify both `path` and `package` fields in a dependency entry", + )), + (None, None, _, _) => Err(de::Error::missing_field("package")), + (None, Some(_), None, _) => Err(de::Error::missing_field("version")), + } + } + } + + deserializer.deserialize_any(Visitor) + } +} /// Represents the `package.metadata.component` section in `Cargo.toml`. #[derive(Default, Debug, Clone, Deserialize)] #[serde(default, deny_unknown_fields)] @@ -337,7 +443,7 @@ pub struct ComponentSection { /// The path to the WASI adapter to use. pub adapter: Option, /// The dependencies of the component. - pub dependencies: HashMap, + pub dependencies: HashMap, /// The registries to use for the component. pub registries: HashMap, /// The configuration for bindings generation. @@ -415,14 +521,14 @@ impl ComponentMetadata { } for dependency in dependencies.values_mut() { - if let Dependency::Local(path) = dependency { + if let Dependency::Local(path) = &mut dependency.0 { *path = manifest_dir.join(path.as_path()); } } } for dependency in section.dependencies.values_mut() { - if let Dependency::Local(path) = dependency { + if let Dependency::Local(path) = &mut dependency.0 { *path = manifest_dir.join(path.as_path()); } } diff --git a/src/registry.rs b/src/registry.rs index e65c21d4..b27dbda2 100644 --- a/src/registry.rs +++ b/src/registry.rs @@ -1,17 +1,17 @@ //! Module for interacting with component registries. -use std::{collections::HashMap, sync::Arc}; +use std::collections::HashMap; use anyhow::Result; -use cargo_component_core::{ - lock::{LockFile, LockFileResolver, LockedPackage, LockedPackageVersion}, - registry::{DependencyResolution, DependencyResolutionMap, DependencyResolver}, -}; use cargo_metadata::PackageId; -use semver::Version; +use semver::{Version, VersionReq}; use wasm_pkg_client::{ caching::{CachingClient, FileCache}, ContentDigest, PackageRef, }; +use wasm_pkg_core::{ + lock::{LockFile, LockedPackage, LockedPackageVersion}, + resolver::{Dependency, DependencyResolution, DependencyResolutionMap, DependencyResolver}, +}; use crate::metadata::ComponentMetadata; @@ -31,9 +31,9 @@ impl<'a> PackageDependencyResolution<'a> { /// /// Returns `Ok(None)` if the package is not a component package. pub async fn new( - client: Arc>, + client: CachingClient, metadata: &'a ComponentMetadata, - lock_file: Option>, + lock_file: &LockFile, ) -> Result> { Ok(Self { metadata, @@ -51,37 +51,42 @@ impl<'a> PackageDependencyResolution<'a> { } async fn resolve_target_deps( - client: Arc>, + client: CachingClient, metadata: &ComponentMetadata, - lock_file: Option>, + lock_file: &LockFile, ) -> Result { let target_deps = metadata.section.target.dependencies(); if target_deps.is_empty() { return Ok(Default::default()); } - let mut resolver = DependencyResolver::new_with_client(client, lock_file)?; + let mut resolver = DependencyResolver::new_with_client(client, Some(lock_file))?; for (name, dependency) in target_deps.iter() { - resolver.add_dependency(name, dependency).await?; + resolver.add_shallow_dependency(name, &dependency.0).await?; } resolver.resolve().await } async fn resolve_deps( - client: Arc>, + client: CachingClient, metadata: &ComponentMetadata, - lock_file: Option>, + lock_file: &LockFile, ) -> Result { if metadata.section.dependencies.is_empty() { return Ok(Default::default()); } - let mut resolver = DependencyResolver::new_with_client(client, lock_file)?; + let mut resolver = DependencyResolver::new_with_client(client, Some(lock_file))?; for (name, dependency) in &metadata.section.dependencies { - resolver.add_dependency(name, dependency).await?; + if let Dependency::Local(path) = dependency.clone().0 { + resolver.add_shallow_dependency(name, &Dependency::Local(path)).await?; + + } else { + resolver.add_dependency(name, &dependency.0).await?; + } } resolver.resolve().await @@ -111,7 +116,7 @@ impl<'a> PackageResolutionMap<'a> { } /// Converts the resolution map into a lock file. - pub fn to_lock_file(&self) -> LockFile { + pub async fn to_lock_file(&self) -> LockFile { type PackageKey = (PackageRef, Option); type VersionsMap = HashMap; let mut packages: HashMap = HashMap::new(); @@ -149,13 +154,13 @@ impl<'a> PackageResolutionMap<'a> { let mut versions: Vec = versions .into_iter() .map(|(requirement, (version, digest))| LockedPackageVersion { - requirement, + requirement: VersionReq::parse(&requirement).unwrap(), version, digest, }) .collect(); - versions.sort_by(|a, b| a.key().cmp(b.key())); + versions.sort_by(|a, b| a.key().cmp(&b.key())); LockedPackage { name, @@ -167,6 +172,6 @@ impl<'a> PackageResolutionMap<'a> { packages.sort_by(|a, b| a.key().cmp(&b.key())); - LockFile::new(packages) + LockFile::new_with_path(packages, "wkg.lock").await.unwrap() } } diff --git a/tests/build.rs b/tests/build.rs index 453d7473..218286bc 100644 --- a/tests/build.rs +++ b/tests/build.rs @@ -24,10 +24,6 @@ fn it_builds_debug() -> Result<()> { validate_component(&project.debug_wasm("foo"))?; - // A lock file should only be generated for projects with - // registry dependencies - assert!(!project.root().join("Cargo-component.lock").exists()); - Ok(()) } diff --git a/tests/publish.rs b/tests/publish.rs index 0c5b5566..25fe5416 100644 --- a/tests/publish.rs +++ b/tests/publish.rs @@ -57,7 +57,7 @@ world foo { validate_component(&project.release_wasm("foo"))?; - let path = project.root().join("Cargo-component.lock"); + let path = project.root().join("wkg.lock"); let contents = fs::read_to_string(&path) .with_context(|| format!("failed to read lock file `{path}`", path = path.display()))?;