Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: vfox backend #2187

Merged
merged 1 commit into from
Aug 18, 2024
Merged

feat: vfox backend #2187

merged 1 commit into from
Aug 18, 2024

Conversation

jdx
Copy link
Owner

@jdx jdx commented May 25, 2024

this is very, very experimental. Don't try to use it. It almost certainly won't work for you yet.

@jdx jdx force-pushed the vfox branch 9 times, most recently from 427208b to 9303f85 Compare May 25, 2024 20:11
@jdx jdx force-pushed the vfox branch 3 times, most recently from 7f42092 to bb6be26 Compare May 30, 2024 03:46
@jdx jdx force-pushed the vfox branch 2 times, most recently from 8dc0899 to db62562 Compare August 17, 2024 21:13
@jdx jdx changed the title feat: vfox backend feat: vfox backend (very experimental) Aug 17, 2024
@jdx jdx changed the title feat: vfox backend (very experimental) feat: vfox backend Aug 17, 2024
@jdx jdx force-pushed the vfox branch 2 times, most recently from 1163dc4 to b1c2ed4 Compare August 17, 2024 22:30
Copy link

codacy-production bot commented Aug 17, 2024

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
-0.53% 37.69%
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (d2f7f33) 17423 13935 79.98%
Head commit (6f2ca45) 17580 (+157) 13967 (+32) 79.45% (-0.53%)

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#2187) 260 98 37.69%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

See your quality gate settings    Change summary preferences

Codacy stopped sending the deprecated coverage status on June 5th, 2024. Learn more

@jdx jdx force-pushed the vfox branch 5 times, most recently from cd3ae8b to 9fee860 Compare August 18, 2024 18:24
@jdx jdx marked this pull request as ready for review August 18, 2024 18:24
@jdx jdx enabled auto-merge (squash) August 18, 2024 18:25
@jdx jdx disabled auto-merge August 18, 2024 18:25
@jdx jdx enabled auto-merge (squash) August 18, 2024 18:25
diff --git a/Cargo.lock b/Cargo.lock
index bd3fea9db..b582b14fd 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -17,6 +17,30 @@ version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"

+[[package]]
+name = "aes"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
+dependencies = [
+ "cfg-if",
+ "cipher",
+ "cpufeatures",
+]
+
+[[package]]
+name = "ahash"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
+dependencies = [
+ "cfg-if",
+ "getrandom",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
 [[package]]
 name = "aho-corasick"
 version = "1.1.3"
@@ -153,6 +177,12 @@ dependencies = [
  "tokio",
 ]

+[[package]]
+name = "atomic-waker"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
 [[package]]
 name = "autocfg"
 version = "1.3.0"
@@ -252,6 +282,27 @@ version = "1.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"

+[[package]]
+name = "bzip2"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8"
+dependencies = [
+ "bzip2-sys",
+ "libc",
+]
+
+[[package]]
+name = "bzip2-sys"
+version = "0.1.11+1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
 [[package]]
 name = "calm_io"
 version = "0.1.1"
@@ -315,7 +366,7 @@ checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb"
 dependencies = [
  "chrono",
  "chrono-tz-build",
- "phf",
+ "phf 0.11.2",
 ]

 [[package]]
@@ -325,8 +376,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1"
 dependencies = [
  "parse-zoneinfo",
- "phf",
- "phf_codegen",
+ "phf 0.11.2",
+ "phf_codegen 0.11.2",
 ]

 [[package]]
@@ -338,6 +389,16 @@ dependencies = [
  "envmnt",
 ]

+[[package]]
+name = "cipher"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
+dependencies = [
+ "crypto-common",
+ "inout",
+]
+
 [[package]]
 name = "clap"
 version = "4.5.16"
@@ -369,7 +430,7 @@ dependencies = [
  "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -421,7 +482,7 @@ dependencies = [
  "nom",
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -483,6 +544,12 @@ version = "0.9.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"

+[[package]]
+name = "constant_time_eq"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2"
+
 [[package]]
 name = "contracts"
 version = "0.6.3"
@@ -519,6 +586,21 @@ dependencies = [
  "libc",
 ]

+[[package]]
+name = "crc"
+version = "3.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
+
 [[package]]
 name = "crc32fast"
 version = "1.4.2"
@@ -563,6 +645,29 @@ dependencies = [
  "typenum",
 ]

+[[package]]
+name = "cssparser"
+version = "0.31.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b3df4f93e5fbbe73ec01ec8d3f68bba73107993a5b1e7519273c32db9b0d5be"
+dependencies = [
+ "cssparser-macros",
+ "dtoa-short",
+ "itoa",
+ "phf 0.11.2",
+ "smallvec",
+]
+
+[[package]]
+name = "cssparser-macros"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
+dependencies = [
+ "quote",
+ "syn 2.0.75",
+]
+
 [[package]]
 name = "ctor"
 version = "0.2.8"
@@ -570,7 +675,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
 dependencies = [
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -597,9 +702,15 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

+[[package]]
+name = "deflate64"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b"
+
 [[package]]
 name = "demand"
 version = "1.2.4"
@@ -638,7 +749,18 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
+]
+
+[[package]]
+name = "derive_more"
+version = "0.99.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -667,6 +789,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
 dependencies = [
  "block-buffer",
  "crypto-common",
+ "subtle",
 ]

 [[package]]
@@ -677,7 +800,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -692,6 +815,21 @@ version = "0.15.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"

+[[package]]
+name = "dtoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653"
+
+[[package]]
+name = "dtoa-short"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
+dependencies = [
+ "dtoa",
+]
+
 [[package]]
 name = "duct"
 version = "0.13.7"
@@ -735,6 +873,12 @@ dependencies = [
  "zeroize",
 ]

+[[package]]
+name = "ego-tree"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591"
+
 [[package]]
 name = "either"
 version = "1.13.0"
@@ -750,6 +894,15 @@ version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"

+[[package]]
+name = "encoding_rs"
+version = "0.8.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "env_filter"
 version = "0.1.2"
@@ -787,6 +940,16 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"

+[[package]]
+name = "erased-serde"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d"
+dependencies = [
+ "serde",
+ "typeid",
+]
+
 [[package]]
 name = "errno"
 version = "0.2.8"
@@ -945,6 +1108,16 @@ dependencies = [
  "winapi",
 ]

+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
 [[package]]
 name = "futures"
 version = "0.3.30"
@@ -1001,7 +1174,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -1034,6 +1207,15 @@ dependencies = [
  "slab",
 ]

+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
 [[package]]
 name = "generic-array"
 version = "0.14.7"
@@ -1044,6 +1226,15 @@ dependencies = [
  "version_check",
 ]

+[[package]]
+name = "getopts"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
+dependencies = [
+ "unicode-width",
+]
+
 [[package]]
 name = "getrandom"
 version = "0.2.15"
@@ -1106,6 +1297,25 @@ dependencies = [
  "walkdir",
 ]

+[[package]]
+name = "h2"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "http",
+ "indexmap 2.4.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
 [[package]]
 name = "hashbrown"
 version = "0.12.3"
@@ -1145,6 +1355,15 @@ version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"

+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest",
+]
+
 [[package]]
 name = "home"
 version = "0.5.9"
@@ -1168,6 +1387,32 @@ dependencies = [
  "wmi",
 ]

+[[package]]
+name = "homedir"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bed305c13ce3829a09d627f5d43ff738482a09361ae4eb8039993b55fb10e5e"
+dependencies = [
+ "cfg-if",
+ "nix 0.26.4",
+ "widestring",
+ "windows 0.57.0",
+]
+
+[[package]]
+name = "html5ever"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
+]
+
 [[package]]
 name = "http"
 version = "1.1.0"
@@ -1232,6 +1477,7 @@ dependencies = [
  "bytes",
  "futures-channel",
  "futures-util",
+ "h2",
  "http",
  "http-body",
  "httparse",
@@ -1308,7 +1554,7 @@ dependencies = [
  "iana-time-zone-haiku",
  "js-sys",
  "wasm-bindgen",
- "windows-core",
+ "windows-core 0.52.0",
 ]

 [[package]]
@@ -1393,6 +1639,15 @@ version = "2.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"

+[[package]]
+name = "inout"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+dependencies = [
+ "generic-array",
+]
+
 [[package]]
 name = "insta"
 version = "1.39.0"
@@ -1428,6 +1683,15 @@ version = "1.70.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"

+[[package]]
+name = "itertools"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
+dependencies = [
+ "either",
+]
+
 [[package]]
 name = "itertools"
 version = "0.13.0"
@@ -1553,6 +1817,16 @@ version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"

+[[package]]
+name = "lock_api"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
 [[package]]
 name = "lockfree-object-pool"
 version = "0.1.6"
@@ -1565,6 +1839,66 @@ version = "0.4.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"

+[[package]]
+name = "lua-src"
+version = "547.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edaf29e3517b49b8b746701e5648ccb5785cde1c119062cbabbc5d5cd115e42"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "luajit-src"
+version = "210.5.9+04dca79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e03d48e8d8c11c297d49ea6d2cf6cc0d7657eb3d175219bba47d59a601b7ca9"
+dependencies = [
+ "cc",
+ "which",
+]
+
+[[package]]
+name = "lzma-rs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e"
+dependencies = [
+ "byteorder",
+ "crc",
+]
+
+[[package]]
+name = "lzma-sys"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "markup5ever"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45"
+dependencies = [
+ "log",
+ "phf 0.11.2",
+ "phf_codegen 0.11.2",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+]
+
 [[package]]
 name = "matchers"
 version = "0.1.0"
@@ -1609,7 +1943,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -1683,7 +2017,7 @@ dependencies = [
  "indicatif",
  "indoc",
  "insta",
- "itertools",
+ "itertools 0.13.0",
  "log",
  "nix 0.29.0",
  "num_cpus",
@@ -1724,12 +2058,59 @@ dependencies = [
  "url",
  "usage-lib",
  "versions",
+ "vfox",
  "walkdir",
  "which",
  "xx",
  "zip",
 ]

+[[package]]
+name = "mlua"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d111deb18a9c9bd33e1541309f4742523bfab01d276bfa9a27519f6de9c11dc7"
+dependencies = [
+ "bstr",
+ "erased-serde",
+ "futures-util",
+ "mlua-sys",
+ "mlua_derive",
+ "num-traits",
+ "once_cell",
+ "rustc-hash",
+ "serde",
+ "serde-value",
+]
+
+[[package]]
+name = "mlua-sys"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ab7a5b4756b8177a2dfa8e0bbcde63bd4000afbc4ab20cbb68d114a25470f29"
+dependencies = [
+ "cc",
+ "cfg-if",
+ "lua-src",
+ "luajit-src",
+ "pkg-config",
+]
+
+[[package]]
+name = "mlua_derive"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09697a6cec88e7f58a02c7ab5c18c611c6907c8654613df9cc0192658a4fb859"
+dependencies = [
+ "itertools 0.12.1",
+ "once_cell",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "syn 2.0.75",
+]
+
 [[package]]
 name = "native-tls"
 version = "0.2.12"
@@ -1747,6 +2128,12 @@ dependencies = [
  "tempfile",
 ]

+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
 [[package]]
 name = "nix"
 version = "0.26.4"
@@ -1876,7 +2263,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -1897,6 +2284,15 @@ dependencies = [
  "vcpkg",
 ]

+[[package]]
+name = "ordered-float"
+version = "2.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
+dependencies = [
+ "num-traits",
+]
+
 [[package]]
 name = "os_pipe"
 version = "1.2.1"
@@ -1932,6 +2328,29 @@ dependencies = [
  "unicode-width",
 ]

+[[package]]
+name = "parking_lot"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets 0.52.6",
+]
+
 [[package]]
 name = "parse-zoneinfo"
 version = "0.3.1"
@@ -1965,6 +2384,16 @@ dependencies = [
  "once_cell",
 ]

+[[package]]
+name = "pbkdf2"
+version = "0.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2"
+dependencies = [
+ "digest",
+ "hmac",
+]
+
 [[package]]
 name = "percent-encoding"
 version = "2.3.1"
@@ -2002,7 +2431,7 @@ dependencies = [
  "pest_meta",
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -2026,13 +2455,33 @@ dependencies = [
  "indexmap 2.4.0",
 ]

+[[package]]
+name = "phf"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
+dependencies = [
+ "phf_shared 0.10.0",
+]
+
 [[package]]
 name = "phf"
 version = "0.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
 dependencies = [
- "phf_shared",
+ "phf_macros",
+ "phf_shared 0.11.2",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
 ]

 [[package]]
@@ -2041,8 +2490,18 @@ version = "0.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a"
 dependencies = [
- "phf_generator",
- "phf_shared",
+ "phf_generator 0.11.2",
+ "phf_shared 0.11.2",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+dependencies = [
+ "phf_shared 0.10.0",
+ "rand",
 ]

 [[package]]
@@ -2051,10 +2510,32 @@ version = "0.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
 dependencies = [
- "phf_shared",
+ "phf_shared 0.11.2",
  "rand",
 ]

+[[package]]
+name = "phf_macros"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
+dependencies = [
+ "phf_generator 0.11.2",
+ "phf_shared 0.11.2",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+dependencies = [
+ "siphasher 0.3.11",
+]
+
 [[package]]
 name = "phf_shared"
 version = "0.11.2"
@@ -2081,7 +2562,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -2133,6 +2614,12 @@ dependencies = [
  "zerocopy",
 ]

+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
 [[package]]
 name = "predicates"
 version = "3.1.2"
@@ -2384,9 +2871,11 @@ dependencies = [
  "async-compression",
  "base64",
  "bytes",
+ "encoding_rs",
  "futures-channel",
  "futures-core",
  "futures-util",
+ "h2",
  "http",
  "http-body",
  "http-body-util",
@@ -2411,6 +2900,7 @@ dependencies = [
  "serde_json",
  "serde_urlencoded",
  "sync_wrapper",
+ "system-configuration",
  "tokio",
  "tokio-native-tls",
  "tokio-rustls",
@@ -2585,6 +3075,28 @@ dependencies = [
  "windows-sys 0.52.0",
 ]

+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "scraper"
+version = "0.19.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "761fb705fdf625482d2ed91d3f0559dcfeab2798fe2771c69560a774865d0802"
+dependencies = [
+ "ahash",
+ "cssparser",
+ "ego-tree",
+ "getopts",
+ "html5ever",
+ "once_cell",
+ "selectors",
+ "tendril",
+]
+
 [[package]]
 name = "security-framework"
 version = "2.11.1"
@@ -2608,6 +3120,25 @@ dependencies = [
  "libc",
 ]

+[[package]]
+name = "selectors"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06"
+dependencies = [
+ "bitflags 2.6.0",
+ "cssparser",
+ "derive_more",
+ "fxhash",
+ "log",
+ "new_debug_unreachable",
+ "phf 0.10.1",
+ "phf_codegen 0.10.0",
+ "precomputed-hash",
+ "servo_arc",
+ "smallvec",
+]
+
 [[package]]
 name = "self-replace"
 version = "1.4.0"
@@ -2657,6 +3188,16 @@ dependencies = [
  "serde_derive",
 ]

+[[package]]
+name = "serde-value"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c"
+dependencies = [
+ "ordered-float",
+ "serde",
+]
+
 [[package]]
 name = "serde_derive"
 version = "1.0.208"
@@ -2665,7 +3206,7 @@ checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -2701,6 +3242,26 @@ dependencies = [
  "serde",
 ]

+[[package]]
+name = "servo_arc"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d036d71a959e00c77a63538b90a6c2390969f9772b096ea837205c6bd0491a44"
+dependencies = [
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
 [[package]]
 name = "sha2"
 version = "0.10.8"
@@ -2864,6 +3425,38 @@ 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 = "string_cache"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
+dependencies = [
+ "new_debug_unreachable",
+ "once_cell",
+ "parking_lot",
+ "phf_shared 0.10.0",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro2",
+ "quote",
+]
+
 [[package]]
 name = "strsim"
 version = "0.11.1"
@@ -2889,7 +3482,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustversion",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -2911,9 +3504,9 @@ dependencies = [

 [[package]]
 name = "syn"
-version = "2.0.74"
+version = "2.0.75"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7"
+checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2936,6 +3529,27 @@ dependencies = [
  "libc",
 ]

+[[package]]
+name = "system-configuration"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "system-configuration-sys",
+]
+
+[[package]]
+name = "system-configuration-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
 [[package]]
 name = "tabled"
 version = "0.16.0"
@@ -2985,6 +3599,17 @@ dependencies = [
  "windows-sys 0.59.0",
 ]

+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
 [[package]]
 name = "tera"
 version = "1.20.0"
@@ -3050,7 +3675,7 @@ dependencies = [
  "cfg-if",
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -3061,7 +3686,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
  "test-case-core",
 ]

@@ -3084,7 +3709,7 @@ checksum = "5999e24eaa32083191ba4e425deb75cdf25efefabe5aaccb7446dd0d4122a3f5"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -3104,7 +3729,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -3175,11 +3800,25 @@ dependencies = [
  "bytes",
  "libc",
  "mio",
+ "parking_lot",
  "pin-project-lite",
+ "signal-hook-registry",
  "socket2",
+ "tokio-macros",
  "windows-sys 0.52.0",
 ]

+[[package]]
+name = "tokio-macros"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
+]
+
 [[package]]
 name = "tokio-native-tls"
 version = "0.3.1"
@@ -3339,6 +3978,12 @@ version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"

+[[package]]
+name = "typeid"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e"
+
 [[package]]
 name = "typenum"
 version = "1.17.0"
@@ -3466,7 +4111,7 @@ dependencies = [
  "clap",
  "heck 0.5.0",
  "indexmap 2.4.0",
- "itertools",
+ "itertools 0.13.0",
  "kdl",
  "log",
  "miette",
@@ -3478,6 +4123,12 @@ dependencies = [
  "xx",
 ]

+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
 [[package]]
 name = "utf8parse"
 version = "0.2.2"
@@ -3508,11 +4159,32 @@ version = "6.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f25d498b63d1fdb376b4250f39ab3a5ee8d103957346abacd911e2d8b612c139"
 dependencies = [
- "itertools",
+ "itertools 0.13.0",
  "nom",
  "serde",
 ]

+[[package]]
+name = "vfox"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cac975b54f4b0f6cc67ddaaf3414ce9a763a734e6a78ca34a3add26a5335126e"
+dependencies = [
+ "homedir 0.3.3",
+ "indexmap 2.4.0",
+ "itertools 0.13.0",
+ "log",
+ "mlua",
+ "once_cell",
+ "reqwest",
+ "scraper",
+ "serde_json",
+ "thiserror",
+ "tokio",
+ "url",
+ "xx",
+]
+
 [[package]]
 name = "vte"
 version = "0.10.1"
@@ -3590,7 +4262,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
  "wasm-bindgen-shared",
 ]

@@ -3624,7 +4296,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -3709,9 +4381,19 @@ version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
 dependencies = [
- "windows-core",
- "windows-implement",
- "windows-interface",
+ "windows-core 0.52.0",
+ "windows-implement 0.52.0",
+ "windows-interface 0.52.0",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
+dependencies = [
+ "windows-core 0.57.0",
  "windows-targets 0.52.6",
 ]

@@ -3724,6 +4406,18 @@ dependencies = [
  "windows-targets 0.52.6",
 ]

+[[package]]
+name = "windows-core"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
+dependencies = [
+ "windows-implement 0.57.0",
+ "windows-interface 0.57.0",
+ "windows-result",
+ "windows-targets 0.52.6",
+]
+
 [[package]]
 name = "windows-implement"
 version = "0.52.0"
@@ -3732,7 +4426,18 @@ checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -3743,7 +4448,27 @@ checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
+dependencies = [
+ "windows-targets 0.52.6",
 ]

 [[package]]
@@ -3930,7 +4655,7 @@ dependencies = [
  "log",
  "serde",
  "thiserror",
- "windows",
+ "windows 0.52.0",
 ]

 [[package]]
@@ -3950,14 +4675,40 @@ version = "1.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9960db6d05795260d426061b0a962282cf67c3cdc81656731d0f646807c26237"
 dependencies = [
+ "bzip2",
  "duct",
  "filetime",
+ "flate2",
  "globwalk",
- "homedir",
+ "homedir 0.2.1",
  "log",
  "miette",
  "regex",
+ "reqwest",
+ "sha2",
+ "tar",
  "thiserror",
+ "tokio",
+ "xz",
+ "zip",
+]
+
+[[package]]
+name = "xz"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c887690ff2a2e233e8e49633461521f98ec57fbff9d59a884c9a4f04ec1da34"
+dependencies = [
+ "xz2",
+]
+
+[[package]]
+name = "xz2"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2"
+dependencies = [
+ "lzma-sys",
 ]

 [[package]]
@@ -3984,7 +4735,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.74",
+ "syn 2.0.75",
 ]

 [[package]]
@@ -3992,6 +4743,20 @@ name = "zeroize"
 version = "1.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.75",
+]

 [[package]]
 name = "zip"
@@ -3999,15 +4764,27 @@ version = "2.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e"
 dependencies = [
+ "aes",
  "arbitrary",
+ "bzip2",
+ "constant_time_eq",
  "crc32fast",
  "crossbeam-utils",
+ "deflate64",
  "displaydoc",
  "flate2",
+ "hmac",
  "indexmap 2.4.0",
+ "lzma-rs",
  "memchr",
+ "pbkdf2",
+ "rand",
+ "sha1",
  "thiserror",
+ "time",
+ "zeroize",
  "zopfli",
+ "zstd",
 ]

 [[package]]
@@ -4034,3 +4811,31 @@ dependencies = [
  "once_cell",
  "simd-adler32",
 ]
+
+[[package]]
+name = "zstd"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
+dependencies = [
+ "zstd-safe",
+]
+
+[[package]]
+name = "zstd-safe"
+version = "7.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059"
+dependencies = [
+ "zstd-sys",
+]
+
+[[package]]
+name = "zstd-sys"
+version = "2.0.13+zstd.1.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
+dependencies = [
+ "cc",
+ "pkg-config",
+]
diff --git a/Cargo.toml b/Cargo.toml
index 16a4ee661..2fa678499 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -119,6 +119,7 @@ toml_edit = { version = "0.22.12", features = ["parse"] }
 url = "2.5.0"
 usage-lib = { version = "0.3", features = ["clap"] }
 versions = { version = "6.2.0", features = ["serde"] }
+vfox = "0.1.0"
 walkdir = "2.5.0"
 which = "6.0.1"
 xx = { version = "1.0.0", features = ["glob"] }
diff --git a/src/backend/mod.rs b/src/backend/mod.rs
index 2a8bc978b..c43bf7c12 100644
--- a/src/backend/mod.rs
+++ b/src/backend/mod.rs
@@ -35,6 +35,7 @@ pub mod npm;
 pub mod pipx;
 pub mod spm;
 pub mod ubi;
+pub mod vfox;

 pub type ABackend = Arc<dyn Backend>;
 pub type BackendMap = BTreeMap<String, ABackend>;
@@ -63,6 +64,7 @@ pub enum BackendType {
     Pipx,
     Spm,
     Ubi,
+    Vfox,
 }

 impl Display for BackendType {
@@ -104,6 +106,7 @@ fn list_installed_backends() -> eyre::Result<BackendList> {
                 BackendType::Pipx => Arc::new(pipx::PIPXBackend::from_arg(ba)) as ABackend,
                 BackendType::Spm => Arc::new(spm::SPMBackend::from_arg(ba)) as ABackend,
                 BackendType::Ubi => Arc::new(ubi::UbiBackend::from_arg(ba)) as ABackend,
+                BackendType::Vfox => Arc::new(vfox::VfoxBackend::from_arg(ba)) as ABackend,
             }
         })
         .filter(|f| f.fa().backend_type != BackendType::Asdf)
@@ -136,6 +139,7 @@ pub fn get(fa: &BackendArg) -> ABackend {
                 BackendType::Pipx => Arc::new(pipx::PIPXBackend::from_arg(fa)),
                 BackendType::Spm => Arc::new(spm::SPMBackend::from_arg(fa)),
                 BackendType::Ubi => Arc::new(ubi::UbiBackend::from_arg(fa)),
+                BackendType::Vfox => Arc::new(vfox::VfoxBackend::from_arg(fa)) as ABackend,
             })
             .clone()
     }
diff --git a/src/backend/vfox.rs b/src/backend/vfox.rs
new file mode 100644
index 000000000..dea7e41dd
--- /dev/null
+++ b/src/backend/vfox.rs
@@ -0,0 +1,116 @@
+use eyre::{eyre, Report};
+use std::collections::BTreeMap;
+use std::env;
+use std::fmt::Debug;
+use tokio::runtime::Runtime;
+use url::Url;
+
+use crate::backend::{Backend, BackendType};
+use crate::cache::CacheManager;
+use crate::cli::args::BackendArg;
+use crate::config::{Config, Settings};
+use crate::dirs;
+use crate::install_context::InstallContext;
+use crate::toolset::{ToolVersion, Toolset};
+use vfox::Vfox;
+
+#[derive(Debug)]
+pub struct VfoxBackend {
+    fa: BackendArg,
+    vfox: Vfox,
+    remote_version_cache: CacheManager<Vec<String>>,
+}
+
+impl Backend for VfoxBackend {
+    fn get_type(&self) -> BackendType {
+        BackendType::Vfox
+    }
+
+    fn fa(&self) -> &BackendArg {
+        &self.fa
+    }
+
+    fn _list_remote_versions(&self) -> eyre::Result<Vec<String>> {
+        self.remote_version_cache
+            .get_or_try_init(|| {
+                let plugin = self.vfox.install_plugin_from_url(&self.get_url()?)?;
+                let versions = self
+                    .runtime()?
+                    .block_on(self.vfox.list_available_versions(&plugin.name))?;
+                Ok(versions
+                    .into_iter()
+                    .rev()
+                    .map(|v| v.version)
+                    .collect::<Vec<String>>())
+            })
+            .cloned()
+    }
+
+    fn install_version_impl(&self, ctx: &InstallContext) -> eyre::Result<()> {
+        let settings = Settings::get();
+        settings.ensure_experimental("vfox backend")?;
+        let plugin = self.vfox.install_plugin_from_url(&self.get_url()?)?;
+        self.runtime()?.block_on(self.vfox.install(
+            &plugin.name,
+            &ctx.tv.version,
+            ctx.tv.install_path(),
+        ))?;
+        Ok(())
+    }
+
+    fn exec_env(
+        &self,
+        _config: &Config,
+        _ts: &Toolset,
+        tv: &ToolVersion,
+    ) -> eyre::Result<BTreeMap<String, String>> {
+        Ok(self
+            .runtime()?
+            .block_on(self.vfox.env_keys(self.name(), &tv.version))?
+            .into_iter()
+            .map(|envkey| (envkey.key, envkey.value))
+            .collect())
+    }
+}
+
+fn vfox_to_url(version: &str) -> eyre::Result<Url> {
+    let res = if let Some(caps) = regex!(r#"^([^/]+)/([^/]+)$"#).captures(version) {
+        let user = caps.get(1).unwrap().as_str();
+        let repo = caps.get(2).unwrap().as_str();
+        format!("https://github.com/{user}/{repo}").parse()
+    } else {
+        version.to_string().parse()
+    };
+    res.map_err(|e| eyre!("Invalid version: {}: {}", version, e))
+}
+
+impl VfoxBackend {
+    pub fn new(name: String) -> Self {
+        let fa = BackendArg::new(BackendType::Vfox, &name);
+        let mut vfox = Vfox::new();
+        vfox.plugin_dir = dirs::PLUGINS.to_path_buf();
+        vfox.cache_dir = dirs::CACHE.to_path_buf();
+        vfox.download_dir = dirs::DOWNLOADS.to_path_buf();
+        vfox.install_dir = dirs::INSTALLS.to_path_buf();
+        vfox.temp_dir = env::temp_dir().join("mise-vfox");
+        Self {
+            vfox,
+            remote_version_cache: CacheManager::new(
+                fa.cache_path.join("remote_versions-$KEY.msgpack.z"),
+            ),
+            fa,
+        }
+    }
+
+    fn runtime(&self) -> eyre::Result<Runtime, Report> {
+        let rt = tokio::runtime::Builder::new_current_thread()
+            .enable_time()
+            .enable_io()
+            .build()?;
+        Ok(rt)
+    }
+
+    fn get_url(&self) -> eyre::Result<Url> {
+        vfox_to_url(&self.fa.name)
+    }
+}
diff --git a/src/cli/args/backend_arg.rs b/src/cli/args/backend_arg.rs
index 3bad37d9d..508a36729 100644
--- a/src/cli/args/backend_arg.rs
+++ b/src/cli/args/backend_arg.rs
@@ -124,6 +124,7 @@ mod tests {
         let cargo = |s, id, name| t(s, id, name, BackendType::Cargo);
         // let core = |s, id, name| t(s, id, name, BackendType::Core);
         let npm = |s, id, name| t(s, id, name, BackendType::Npm);
+        let vfox = |s, id, name| t(s, id, name, BackendType::Vfox);

         asdf("asdf:poetry", "asdf:poetry", "poetry");
         asdf("poetry", "poetry", "poetry");
@@ -132,6 +133,11 @@ mod tests {
         // core("node", "node", "node");
         npm("npm:@antfu/ni", "npm:@antfu/ni", "@antfu/ni");
         npm("npm:prettier", "npm:prettier", "prettier");
+        vfox(
+            "vfox:version-fox/vfox-nodejs",
+            "vfox:version-fox/vfox-nodejs",
+            "version-fox/vfox-nodejs",
+        );
     }

     #[test]
@@ -148,5 +154,10 @@ mod tests {
         t("cargo:eza", "cargo-eza");
         t("npm:@antfu/ni", "npm-antfu-ni");
         t("npm:prettier", "npm-prettier");
+        t(
+            "vfox:version-fox/vfox-nodejs",
+            "vfox-version-fox-vfox-nodejs",
+        );
+        t("vfox:version-fox/nodejs", "vfox-version-fox-nodejs");
     }
 }
diff --git a/src/cli/backends/snapshots/mise__cli__backends__ls__tests__backends_list.snap b/src/cli/backends/snapshots/mise__cli__backends__ls__tests__backends_list.snap
index 31f7a741b..5ef5c807b 100644
--- a/src/cli/backends/snapshots/mise__cli__backends__ls__tests__backends_list.snap
+++ b/src/cli/backends/snapshots/mise__cli__backends__ls__tests__backends_list.snap
@@ -9,3 +9,4 @@ npm
 pipx
 spm
 ubi
+vfox
diff --git a/src/cli/snapshots/mise__cli__trust__tests__trust-6.snap b/src/cli/snapshots/mise__cli__trust__tests__trust-6.snap
deleted file mode 100644
index e650db175..000000000
--- a/src/cli/snapshots/mise__cli__trust__tests__trust-6.snap
+++ /dev/null
@@ -1,5 +0,0 @@
----
-source: src/cli/trust.rs
-expression: output
----
-mise untrusted ~/cwd/.test-tool-versions
diff --git a/src/registry.rs b/src/registry.rs
index 15b767f65..6747bc9a6 100644
--- a/src/registry.rs
+++ b/src/registry.rs
@@ -2,12 +2,46 @@ use std::collections::BTreeMap;

 use once_cell::sync::Lazy;

+#[cfg(unix)]
 const _REGISTRY: &[(&str, &str)] = &[
     ("ubi", "cargo:ubi"),
     ("cargo-binstall", "cargo:cargo-binstall"),
     // ("elixir", "asdf:mise-plugins/mise-elixir"),
 ];

+#[cfg(windows)]
+const _REGISTRY: &[(&str, &str)] = &[
+    ("bun", "vfox:ahai-code/vfox-bun"),
+    ("cargo-binstall", "cargo:cargo-binstall"),
+    ("cmake", "vfox:version-fox/vfox-cmake"),
+    ("crystal", "vfox:yanecc/vfox-crystal"),
+    ("dart", "vfox:version-fox/vfox-dart"),
+    ("deno", "vfox:version-fox/vfox-deno"),
+    ("dotnet", "vfox:version-fox/vfox-dotnet"),
+    ("elixir", "vfox:version-fox/vfox-elixir"),
+    ("erlang", "vfox:version-fox/vfox-erlang"),
+    ("etcd", "vfox:version-fox/vfox-etcd"),
+    ("flutter", "vfox:version-fox/vfox-flut"),
+    ("golang", "vfox:version-fox/vfox-golang"),
+    ("gradle", "vfox:version-fox/vfox-gradle"),
+    ("groovy", "vfox:version-fox/vfox-groovy"),
+    ("java", "vfox:version-fox/vfox-java"),
+    ("julia", "vfox:ahai-code/vfox-julia"),
+    ("kotlin", "vfox:version-fox/vfox-kotlin"),
+    ("kubectl", "vfox:ahai-code/vfox-kubectl"),
+    ("maven", "vfox:version-fox/vfox-maven"),
+    ("mongo", "vfox:yeshan333/vfox-mongo"),
+    ("php", "vfox:version-fox/vfox-php"),
+    ("protobuf", "vfox:ahai-code/vfox-protobuf"),
+    ("python", "vfox:version-fox/vfox-python"),
+    ("ruby", "vfox:yanecc/vfox-ruby"),
+    ("scala", "vfox:version-fox/vfox-scala"),
+    ("terraform", "vfox:enochchau/vfox-terraform"),
+    ("ubi", "cargo:ubi"),
+    ("vlang", "vfox:ahai-code/vfox-vlang"),
+    ("zig", "vfox:version-fox/vfox-zig"),
+];
+
 pub static REGISTRY: Lazy<BTreeMap<&str, String>> = Lazy::new(|| {
     // TODO: make sure core plugins can be overridden with this enabled
     // let core = CORE_PLUGINS
Copy link

Code Coverage

Package Line Rate Complexity Health
src.backend 62% 0
src 86% 0
src.cli 82% 0
src.cli.alias 89% 0
src.cli.args 97% 0
src.cli.backends 95% 0
src.cli.cache 95% 0
src.cli.config 92% 0
src.cli.direnv 80% 0
src.cli.generate 87% 0
src.cli.plugins 85% 0
src.cli.settings 93% 0
src.cli.sync 58% 0
src.cli.tasks 71% 0
src.config.config_file 87% 0
src.config 88% 0
src.plugins 82% 0
src.plugins.core 55% 0
src.shell 98% 0
src.toolset 86% 0
src.ui 63% 0
Summary 79% (13967 / 17580) 0

@jdx jdx merged commit 7b458a9 into main Aug 18, 2024
12 checks passed
@jdx jdx deleted the vfox branch August 18, 2024 18:34
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Aug 19, 2024
[2024.8.11](https://github.com/jdx/mise/compare/v2024.8.10..v2024.8.11) - 2024-08-19

 🐛 Bug Fixes

- bump xx by [@jdx](https://github.com/jdx) in [9a9d3c1](jdx/mise@9a9d3c1)

[2024.8.10](https://github.com/jdx/mise/compare/v2024.8.9..v2024.8.10) - 2024-08-18

 🚀 Features

- python on windows by [@jdx](https://github.com/jdx) in [2d4cee2](jdx/mise@2d4cee2)

 🐛 Bug Fixes

- hide non-working core plugins on windows by [@jdx](https://github.com/jdx) in [16a08fc](jdx/mise@16a08fc)
- windows compat by [@jdx](https://github.com/jdx) in [2084a37](jdx/mise@2084a37)
- vfox tweaks by [@jdx](https://github.com/jdx) in [c260ab2](jdx/mise@c260ab2)
- remove windows warning by [@jdx](https://github.com/jdx) in [9be937e](jdx/mise@9be937e)

 📚 Documentation

- windows by [@jdx](https://github.com/jdx) in [437b63c](jdx/mise@437b63c)

 🧪 Testing

- fixing tests by [@jdx](https://github.com/jdx) in [1206497](jdx/mise@1206497)
- reset test by [@jdx](https://github.com/jdx) in [c740cfd](jdx/mise@c740cfd)

 🔍 Other Changes

- clippy by [@jdx](https://github.com/jdx) in [ee005ff](jdx/mise@ee005ff)
- fix windows build by [@jdx](https://github.com/jdx) in [28c5cb6](jdx/mise@28c5cb6)
- set GITHUB_TOKEN in release task by [@jdx](https://github.com/jdx) in [0ae049b](jdx/mise@0ae049b)

[2024.8.9](https://github.com/jdx/mise/compare/v2024.8.8..v2024.8.9) - 2024-08-18

 🚀 Features

- use registry shortname for mise.toml/install dirs by [@jdx](https://github.com/jdx) in [#2470](jdx/mise#2470)
- vfox backend by [@jdx](https://github.com/jdx) in [#2187](jdx/mise#2187)

 🐛 Bug Fixes

- hide file tasks starting with "." by [@jdx](https://github.com/jdx) in [#2466](jdx/mise#2466)
- mise prune removes tool versions which are in use by [@roele](https://github.com/roele) in [#2469](jdx/mise#2469)
- cargo_binstall missing from set commands by [@roele](https://github.com/roele) in [#2471](jdx/mise#2471)
- only warn if config properties are not found by [@jdx](https://github.com/jdx) in [#2472](jdx/mise#2472)

 🚜 Refactor

- Asdf -> AsdfBackend by [@jdx](https://github.com/jdx) in [#2467](jdx/mise#2467)
- backend repetition by [@jdx](https://github.com/jdx) in [d2f7f33](jdx/mise@d2f7f33)

[2024.8.8](https://github.com/jdx/mise/compare/v2024.8.7..v2024.8.8) - 2024-08-17

 🚜 Refactor

- split asdf into forge+plugin by [@jdx](https://github.com/jdx) in [#2226](jdx/mise#2226)

 🧪 Testing

- fix home directory for win tests by [@jdx](https://github.com/jdx) in [#2464](jdx/mise#2464)

 📦️ Dependency Updates

- update rust crate tabled to 0.16.0 by [@renovate[bot]](https://github.com/renovate[bot]) in [#2452](jdx/mise#2452)

[2024.8.7](https://github.com/jdx/mise/compare/v2024.8.6..v2024.8.7) - 2024-08-16

 🐛 Bug Fixes

- mise treats escaped newlines in env files differently than dotenvy by [@roele](https://github.com/roele) in [#2455](jdx/mise#2455)
- wait for spawned tasks to die before exiting by [@jdx](https://github.com/jdx) in [#2461](jdx/mise#2461)

 📦️ Dependency Updates

- update dependency vitepress to v1.3.2 by [@renovate[bot]](https://github.com/renovate[bot]) in [#2450](jdx/mise#2450)
triarius pushed a commit to triarius/mise that referenced this pull request Sep 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant