diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3ea49a05..d9d42647 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -61,25 +61,7 @@ updates: - "automated" - "security" - - package-ecosystem: "cargo" - directory: "/tools/wizer_initializer" - schedule: - interval: "weekly" - day: "monday" - time: "06:00" - open-pull-requests-limit: 10 - reviewers: - - "avrabe" - assignees: - - "avrabe" - commit-message: - prefix: "rust/wizer" - include: "scope" - labels: - - "dependencies" - - "rust" - - "automated" - - "performance" + # Note: /tools/wizer_initializer removed - wizer is now part of wasmtime v39.0.0+ - package-ecosystem: "cargo" directory: "/tools-builder/toolchains" diff --git a/CLAUDE.md b/CLAUDE.md index 448ed034..ec20f69b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -75,14 +75,13 @@ Before implementing any solution: 5. **Medium files IMPROVED** - 5 → 3 calls (-2) - ✅ wkg_toolchain.bzl: cp → symlink - - ✅ wizer_toolchain.bzl: which → repository_ctx.which() + - ✅ wizer_toolchain.bzl: REMOVED (wizer now part of wasmtime v39.0.0+) -**REMAINING COMPLEX OPERATIONS (31 calls):** +**REMAINING COMPLEX OPERATIONS (29 calls):** - **wasm_toolchain.bzl (17)**: Remaining download and build operations (hybrid approach working) - **tool_cache.bzl (6)**: Tool validation and file existence checks - **tinygo_toolchain.bzl (3)**: Tool installation and validation -- **wizer_toolchain.bzl (2)**: Script execution and version checking - **Others (3)**: Package management and validation **Shell Operation Categories MODERNIZED:** @@ -155,94 +154,48 @@ These remaining shell scripts are **appropriate complexity** for their tasks: ## WIZER INTEGRATION STATUS -### 🎯 Complete Solution Architecture Implemented +### ✅ MIGRATION COMPLETE: Wasmtime v39.0.0+ Integration -**Problem**: Wizer CLI expects WebAssembly modules but WASI-enabled Rust toolchain produces components +**As of November 2025**, Wizer has been merged into Wasmtime and is available as the `wasmtime wizer` subcommand. +This eliminates the need for a standalone wizer toolchain and simplifies dependency management. -**Solution**: Library-based approach with component parsing +### Architecture -### ✅ COMPLETED COMPONENTS +The wizer pre-initialization workflow now uses wasmtime's built-in wizer subcommand: -1. **wizer_initializer Tool** (`//tools/wizer_initializer:wizer_initializer`) - - ✅ Bazel-native Rust binary with proper dependency management - - ✅ Component model detection (version 0x1000d vs 0x1) - - ✅ Architecture for component → module → wizer → component workflow - - ✅ Placeholder implementation demonstrating complete pipeline - - ✅ Full CLI interface with clap and anyhow +1. **wasm_component_wizer Rule** (`//wasm:wasm_component_wizer.bzl`) + - Uses `wasmtime_toolchain_type` instead of standalone wizer + - Invokes `wasmtime wizer` subcommand + - Default init function: `wizer-initialize` (breaking change from `wizer.initialize`) 2. **wasm_component_wizer_library Rule** (`//wasm:wasm_component_wizer_library.bzl`) - - ✅ Bazel rule using wizer_initializer for programmatic control - - ✅ Proper argument passing (--input, --output, --init-func, --allow-wasi, --verbose) - - ✅ Full integration with existing Bazel ecosystem - - ✅ Successfully tested with wizer_example + - Library-based pre-initialization support + - Uses wasmtime toolchain for wizer functionality -3. **Working Integration Test** (`//examples/wizer_example:wizer_library_test`) - - ✅ Successfully processes WebAssembly components (2.2MB test file) - - ✅ Correct component model detection and verbose logging - - ✅ Demonstrates complete architecture end-to-end +3. **Working Example** (`//examples/wizer_example`) + - Demonstrates pre-initialization with wasmtime wizer + - Uses `#[export_name = "wizer-initialize"]` (new naming convention) -### 🔧 CURRENT IMPLEMENTATION STATUS +### Breaking Changes (Issue #246) -**Working Foundation:** +- Init function name changed: `wizer.initialize` → `wizer-initialize` +- Standalone wizer toolchain removed (use wasmtime toolchain) +- `//tools/wizer_initializer` removed (no longer needed) +- `checksums/tools/wizer.json` removed -- ✅ Component/module format detection working perfectly -- ✅ Bazel rule integration working with proper error handling -- ✅ CLI argument processing and verbose logging working -- ✅ File I/O and Bazel integration working flawlessly - -**Placeholder Components (for dependency resolution issues):** - -- ⏳ Component parsing (requires wasm-tools or wasmtime integration) -- ⏳ Wizer library calls (requires wizer crate - complex dependencies) -- ⏳ Component wrapping (requires wasm-tools component new functionality) - -### 🚀 ARCHITECTURE SUCCESS - -The implemented solution **perfectly demonstrates** the correct approach: +### Migration Guide +**Before (standalone wizer):** ```rust -// Workflow: Component → Core Module → Wizer → Component -let is_component = is_wasm_component(&input_bytes)?; // ✅ Working -let core_module = extract_core_module(&input_bytes)?; // ⏳ Placeholder -let initialized = wizer.run(&core_module)?; // ⏳ Placeholder -let final_component = wrap_as_component(&initialized)?; // ⏳ Placeholder +#[export_name = "wizer.initialize"] +pub extern "C" fn init() { ... } ``` -**Key Achievement**: The Bazel integration and component detection work perfectly. The remaining work is adding the -specific crate dependencies for: - -1. `wasm-tools` for component parsing/wrapping -2. `wizer` crate for actual pre-initialization -3. `wasmtime` for runtime component support - -### 🔬 COMPLEX DEPENDENCY ANALYSIS - -**Issue**: Bazel crate_universe has build conflicts with Wizer/Wasmtime ecosystem: - -- Cranelift (used by Wasmtime) has complex ISLE build system requirements -- Version conflicts between transitive dependencies -- Build script compatibility issues in sandboxed Bazel environment - -**Alternative Approaches**: - -1. **Shell out to system wizer** (against Bazel principles) -2. **Hermetic wasm-tools + wizer binaries** (current working approach with CLI) -3. **Library integration** (implemented architecture, requires dependency resolution) - -### 📊 CURRENT STATE SUMMARY - -| Component | Status | Notes | -| ---------------------- | -------------- | -------------------------------------- | -| Architecture Design | ✅ Complete | Library-based approach validated | -| Bazel Rule Integration | ✅ Complete | wasm_component_wizer_library working | -| Component Detection | ✅ Complete | Perfect WebAssembly format detection | -| CLI Tool Framework | ✅ Complete | Full argument processing and logging | -| Test Integration | ✅ Complete | Working end-to-end in wizer_example | -| Wizer Library Calls | ⏳ Placeholder | Requires complex dependency resolution | -| Component Parsing | ⏳ Placeholder | Requires wasm-tools or wasmtime crates | - -**Bottom Line**: The architecture is complete and proven. The remaining work is purely dependency management for the -Wizer/Wasmtime ecosystem in Bazel. +**After (wasmtime wizer):** +```rust +#[export_name = "wizer-initialize"] +pub extern "C" fn init() { ... } +``` #### 📋 Implementation Guidelines diff --git a/MODULE.bazel b/MODULE.bazel index cf92f9bc..3cb6d06a 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -171,18 +171,8 @@ use_repo(tinygo, "tinygo_toolchain") register_toolchains("@tinygo_toolchain//:tinygo_toolchain_def") -# Wizer WebAssembly pre-initialization toolchain -wizer = use_extension("//wasm:extensions.bzl", "wizer") -wizer.register( - name = "wizer", - strategy = "download", - version = "10.0.0", -) -use_repo(wizer, "wizer_toolchain") - -register_toolchains("@wizer_toolchain//:wizer_toolchain_def") - -# Wasmtime WebAssembly runtime +# Wasmtime WebAssembly runtime (includes wizer as of v39.0.0) +# Note: Standalone wizer toolchain removed - use `wasmtime wizer` subcommand instead wasmtime = use_extension("//wasm:extensions.bzl", "wasmtime") wasmtime.register( name = "wasmtime", @@ -262,11 +252,6 @@ register_toolchains("//toolchains:wasm_tools_component_toolchain_local") # Rust crates for tools crate = use_extension("@rules_rust//crate_universe:extension.bzl", "crate") -crate.from_cargo( - name = "wizer_crates", - cargo_lockfile = "//tools/wizer_initializer:Cargo.lock", - manifests = ["//tools/wizer_initializer:Cargo.toml"], -) crate.from_cargo( name = "crates", cargo_lockfile = "//tools/checksum_updater:Cargo.lock", @@ -325,7 +310,7 @@ crate.from_cargo( # - wit_bindgen::rt module with correct allocator integration # This replaces the previously embedded runtime stubs -use_repo(crate, "crates", "ssh_keygen_crates", "wasm_embed_aot_crates", "wasmsign2_crates", "wizer_crates") +use_repo(crate, "crates", "ssh_keygen_crates", "wasm_embed_aot_crates", "wasmsign2_crates") # Modernized WASM tool repositories using git_repository + rules_rust wasm_tool_repos = use_extension("//toolchains:extensions.bzl", "wasm_tool_repositories") @@ -335,6 +320,5 @@ use_repo( "wasm_tools_src", "wasmsign2_src", "wit_bindgen_src", - "wizer_src", "wrpc_src", ) diff --git a/checksums/registry.bzl b/checksums/registry.bzl index 0b7c51f5..766a5489 100644 --- a/checksums/registry.bzl +++ b/checksums/registry.bzl @@ -781,73 +781,7 @@ def _get_fallback_checksums(tool_name): }, }, }, - "wizer": { - "tool_name": "wizer", - "github_repo": "bytecodealliance/wizer", - "latest_version": "10.0.0", - "versions": { - "10.0.0": { - "release_date": "2025-08-27", - "platforms": { - "darwin_amd64": { - "sha256": "d6b2073efb38624399c1c6fc0d8c1e19ba24d7ab934f51c346b7d97d4bd8115c", - "url_suffix": "x86_64-macos.tar.xz", - "strip_prefix": "wizer-v10.0.0-x86_64-macos", - }, - "darwin_arm64": { - "sha256": "5e3977e25defc869141dd8df3d25dde1dabe37ea377b7c01fa24693fe5bc7b3f", - "url_suffix": "aarch64-macos.tar.xz", - "strip_prefix": "wizer-v10.0.0-aarch64-macos", - }, - "linux_amd64": { - "sha256": "1e9dfaa2f6c436ca7acfdbb82c166f5b8a0062068f12916a554e82c97ca8d371", - "url_suffix": "x86_64-linux.tar.xz", - "strip_prefix": "wizer-v10.0.0-x86_64-linux", - }, - "linux_arm64": { - "sha256": "8ec7e50622aa7af37b5152f19d7a371f185c7af138033759caa3fdd3e17e2830", - "url_suffix": "aarch64-linux.tar.xz", - "strip_prefix": "wizer-v10.0.0-aarch64-linux", - }, - "windows_amd64": { - "sha256": "29a3aebb70927e9af7c505d3f3d14c5f8577eb307e8bd45151c184885a580d2f", - "url_suffix": "x86_64-windows.zip", - "strip_prefix": "wizer-v10.0.0-x86_64-windows", - }, - }, - }, - "9.0.0": { - "release_date": "2024-06-03", - "platforms": { - "darwin_amd64": { - "sha256": "5d5e457abf3fd6e307dee9fe9f7423185a88d90f0c96677b9a5418c448ced52e", - "url_suffix": "x86_64-macos.tar.xz", - "strip_prefix": "wizer-v9.0.0-x86_64-macos", - }, - "darwin_arm64": { - "sha256": "3372ee8215abc39b15a51b4aed27f8ae5a42e84261a29e7491ec82bf806bc491", - "url_suffix": "aarch64-macos.tar.xz", - "strip_prefix": "wizer-v9.0.0-aarch64-macos", - }, - "linux_amd64": { - "sha256": "d1d85703bc40f18535e673992bef723dc3f84e074bcd1e05b57f24d5adb4f058", - "url_suffix": "x86_64-linux.tar.xz", - "strip_prefix": "wizer-v9.0.0-x86_64-linux", - }, - "linux_arm64": { - "sha256": "f560a675d686d42c18de8bd4014a34a0e8b95dafbd696bf8d54817311ae87a4d", - "url_suffix": "aarch64-linux.tar.xz", - "strip_prefix": "wizer-v9.0.0-aarch64-linux", - }, - "windows_amd64": { - "sha256": "d9cc5ed028ca873f40adcac513812970d34dd08cec4397ffc5a47d4acee8e782", - "url_suffix": "x86_64-windows.zip", - "strip_prefix": "wizer-v9.0.0-x86_64-windows", - }, - }, - }, - }, - }, + # Note: wizer removed - now part of wasmtime v39.0.0+, use `wasmtime wizer` subcommand "jco": { "tool_name": "jco", "github_repo": "bytecodealliance/jco", @@ -1013,6 +947,7 @@ def list_available_tools(): """ # Return tools that have fallback data available + # Note: wizer removed - now part of wasmtime v39.0.0+, use `wasmtime wizer` subcommand return [ "wasm-tools", "wit-bindgen", @@ -1021,7 +956,6 @@ def list_available_tools(): "wasmtime", "wasi-sdk", "wasmsign2", - "wizer", "nodejs", "jco", "file-ops-component", diff --git a/checksums/registry_test.bzl b/checksums/registry_test.bzl index be12a1d3..c34a2029 100644 --- a/checksums/registry_test.bzl +++ b/checksums/registry_test.bzl @@ -20,9 +20,9 @@ def _test_get_tool_checksum(ctx): checksum = get_tool_checksum("wasm-tools", "1.235.0", "darwin_amd64") asserts.equals(env, "154e9ea5f5477aa57466cfb10e44bc62ef537e32bf13d1c35ceb4fedd9921510", checksum) - # Test wizer checksum (our new addition) - wizer_checksum = get_tool_checksum("wizer", "9.0.0", "linux_amd64") - asserts.equals(env, "d1d85703bc40f18535e673992bef723dc3f84e074bcd1e05b57f24d5adb4f058", wizer_checksum) + # Test wasmtime checksum (wizer functionality now included in wasmtime v39.0.0+) + wasmtime_checksum = get_tool_checksum("wasmtime", "39.0.1", "linux_amd64") + asserts.equals(env, "b90a36125387b75db59a67a1c402f2ed9d120fa43670d218a559571e2423d925", wasmtime_checksum) # Test invalid tool invalid_checksum = get_tool_checksum("nonexistent-tool", "1.0.0", "linux_amd64") @@ -48,11 +48,11 @@ def _test_get_tool_info(ctx): asserts.equals(env, "154e9ea5f5477aa57466cfb10e44bc62ef537e32bf13d1c35ceb4fedd9921510", info["sha256"]) asserts.equals(env, "x86_64-macos.tar.gz", info["url_suffix"]) - # Test wizer info - wizer_info = get_tool_info("wizer", "9.0.0", "windows_amd64") - asserts.true(env, wizer_info != None) - asserts.equals(env, "d9cc5ed028ca873f40adcac513812970d34dd08cec4397ffc5a47d4acee8e782", wizer_info["sha256"]) - asserts.equals(env, "x86_64-windows.zip", wizer_info["url_suffix"]) + # Test wasmtime info (wizer functionality now included in wasmtime v39.0.0+) + wasmtime_info = get_tool_info("wasmtime", "39.0.1", "windows_amd64") + asserts.true(env, wasmtime_info != None) + asserts.equals(env, "bccf64b4227d178c0d13f2856be68876eae3f2f657f3a85d46f076a5e1976198", wasmtime_info["sha256"]) + asserts.equals(env, "x86_64-windows.zip", wasmtime_info["url_suffix"]) return unittest.end(env) @@ -79,12 +79,12 @@ def _test_list_supported_platforms(ctx): asserts.true(env, "linux_amd64" in platforms) asserts.true(env, "windows_amd64" in platforms) - # Test wizer platforms - wizer_platforms = list_supported_platforms("wizer", "9.0.0") - asserts.true(env, "darwin_amd64" in wizer_platforms) - asserts.true(env, "linux_amd64" in wizer_platforms) - asserts.true(env, "windows_amd64" in wizer_platforms) - asserts.equals(env, 5, len(wizer_platforms)) # Should have 5 platforms + # Test wasmtime platforms (wizer functionality now included in wasmtime v39.0.0+) + wasmtime_platforms = list_supported_platforms("wasmtime", "39.0.1") + asserts.true(env, "darwin_amd64" in wasmtime_platforms) + asserts.true(env, "linux_amd64" in wasmtime_platforms) + asserts.true(env, "windows_amd64" in wasmtime_platforms) + asserts.equals(env, 5, len(wasmtime_platforms)) # Should have 5 platforms return unittest.end(env) @@ -95,7 +95,7 @@ def _test_get_github_repo(ctx): # Test known repos asserts.equals(env, "bytecodealliance/wasm-tools", get_github_repo("wasm-tools")) asserts.equals(env, "bytecodealliance/wit-bindgen", get_github_repo("wit-bindgen")) - asserts.equals(env, "bytecodealliance/wizer", get_github_repo("wizer")) + asserts.equals(env, "bytecodealliance/wasmtime", get_github_repo("wasmtime")) # Test invalid tool asserts.equals(env, None, get_github_repo("nonexistent-tool")) @@ -108,7 +108,7 @@ def _test_validate_tool_exists(ctx): # Test valid combinations asserts.true(env, validate_tool_exists("wasm-tools", "1.235.0", "darwin_amd64")) - asserts.true(env, validate_tool_exists("wizer", "9.0.0", "linux_amd64")) + asserts.true(env, validate_tool_exists("wasmtime", "39.0.1", "linux_amd64")) # Test invalid combinations asserts.false(env, validate_tool_exists("nonexistent-tool", "1.0.0", "linux_amd64")) @@ -124,7 +124,7 @@ def _test_list_available_tools(ctx): tools = list_available_tools() asserts.true(env, "wasm-tools" in tools) asserts.true(env, "wit-bindgen" in tools) - asserts.true(env, "wizer" in tools) + asserts.true(env, "wasmtime" in tools) # wizer functionality now in wasmtime asserts.true(env, "wac" in tools) asserts.true(env, "wkg" in tools) diff --git a/checksums/toolchain_bundles.json b/checksums/toolchain_bundles.json index 9b95e670..8bd7badb 100644 --- a/checksums/toolchain_bundles.json +++ b/checksums/toolchain_bundles.json @@ -12,7 +12,6 @@ "wac": "0.8.1", "wkg": "0.13.0", "wasmtime": "39.0.1", - "wizer": "10.0.0", "wasi-sdk": "29", "tinygo": "0.38.0", "jco": "1.4.0", @@ -30,7 +29,7 @@ "linux_arm64", "windows_amd64" ], - "notes": "Initial stable bundle with WASI Preview 2 support" + "notes": "Initial stable bundle with WASI Preview 2 support. Wizer functionality now included in wasmtime v39.0.0+" }, "minimal": { "description": "Minimal bundle for basic WASM component builds", @@ -100,13 +99,6 @@ {"wasmtime": "39.0.1", "wasm-tools": "1.243.0"}, {"wasmtime": "29.0.0", "wasm-tools": "1.240.0"} ] - }, - { - "tools": ["wizer", "wasmtime"], - "rule": "wizer and wasmtime should use compatible cranelift versions", - "validated_pairs": [ - {"wizer": "10.0.0", "wasmtime": "39.0.1"} - ] } ] } diff --git a/checksums/tools/wizer.json b/checksums/tools/wizer.json deleted file mode 100644 index b26161a3..00000000 --- a/checksums/tools/wizer.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "tool_name": "wizer", - "github_repo": "bytecodealliance/wizer", - "latest_version": "10.0.0", - "last_checked": "2025-12-04T00:00:00.000000Z", - "supported_platforms": [ - "darwin_amd64", - "darwin_arm64", - "linux_amd64", - "linux_arm64", - "windows_amd64" - ], - "versions": { - "10.0.0": { - "release_date": "2025-08-27", - "platforms": { - "darwin_amd64": { - "sha256": "d6b2073efb38624399c1c6fc0d8c1e19ba24d7ab934f51c346b7d97d4bd8115c", - "url_suffix": "x86_64-macos.tar.xz", - "strip_prefix": "wizer-v10.0.0-x86_64-macos" - }, - "darwin_arm64": { - "sha256": "5e3977e25defc869141dd8df3d25dde1dabe37ea377b7c01fa24693fe5bc7b3f", - "url_suffix": "aarch64-macos.tar.xz", - "strip_prefix": "wizer-v10.0.0-aarch64-macos" - }, - "linux_amd64": { - "sha256": "1e9dfaa2f6c436ca7acfdbb82c166f5b8a0062068f12916a554e82c97ca8d371", - "url_suffix": "x86_64-linux.tar.xz", - "strip_prefix": "wizer-v10.0.0-x86_64-linux" - }, - "linux_arm64": { - "sha256": "8ec7e50622aa7af37b5152f19d7a371f185c7af138033759caa3fdd3e17e2830", - "url_suffix": "aarch64-linux.tar.xz", - "strip_prefix": "wizer-v10.0.0-aarch64-linux" - }, - "windows_amd64": { - "sha256": "29a3aebb70927e9af7c505d3f3d14c5f8577eb307e8bd45151c184885a580d2f", - "url_suffix": "x86_64-windows.zip", - "strip_prefix": "wizer-v10.0.0-x86_64-windows" - } - } - }, - "9.0.0": { - "release_date": "2024-06-03", - "platforms": { - "darwin_amd64": { - "sha256": "5d5e457abf3fd6e307dee9fe9f7423185a88d90f0c96677b9a5418c448ced52e", - "url_suffix": "x86_64-macos.tar.xz", - "strip_prefix": "wizer-v9.0.0-x86_64-macos" - }, - "darwin_arm64": { - "sha256": "3372ee8215abc39b15a51b4aed27f8ae5a42e84261a29e7491ec82bf806bc491", - "url_suffix": "aarch64-macos.tar.xz", - "strip_prefix": "wizer-v9.0.0-aarch64-macos" - }, - "linux_amd64": { - "sha256": "d1d85703bc40f18535e673992bef723dc3f84e074bcd1e05b57f24d5adb4f058", - "url_suffix": "x86_64-linux.tar.xz", - "strip_prefix": "wizer-v9.0.0-x86_64-linux" - }, - "linux_arm64": { - "sha256": "f560a675d686d42c18de8bd4014a34a0e8b95dafbd696bf8d54817311ae87a4d", - "url_suffix": "aarch64-linux.tar.xz", - "strip_prefix": "wizer-v9.0.0-aarch64-linux" - }, - "windows_amd64": { - "sha256": "d9cc5ed028ca873f40adcac513812970d34dd08cec4397ffc5a47d4acee8e782", - "url_suffix": "x86_64-windows.zip", - "strip_prefix": "wizer-v9.0.0-x86_64-windows" - } - } - } - } -} diff --git a/docs-site/src/content/docs/guides/toolchain-configuration.md b/docs-site/src/content/docs/guides/toolchain-configuration.md index d976a6df..8cfc48a0 100644 --- a/docs-site/src/content/docs/guides/toolchain-configuration.md +++ b/docs-site/src/content/docs/guides/toolchain-configuration.md @@ -64,9 +64,11 @@ wasm_toolchain.register( | wkg_toolchain | ✅ | ✅ | ❌ | ❌ | ❌ | | jco_toolchain | ✅ | ❌ | ❌ | ✅ | ❌ | | cpp_component | ✅ | ✅ | ❌ | ❌ | ❌ | -| wizer_toolchain | ✅ | ✅ | ❌ | ❌ | ✅ | | wasmtime | ✅ | ❌ | ❌ | ❌ | ❌ | +> **Note:** Wizer functionality is now included in wasmtime v39.0.0+ via the `wasmtime wizer` subcommand. +> No separate wizer_toolchain is required. + ### When to Use Each Strategy #### `"download"` (Default) - Hermetic & Fast @@ -164,13 +166,14 @@ jco.register( #### `"cargo"` - Rust Ecosystem -**Best for:** Rust-heavy projects, when you need Wizer +**Best for:** Rust-heavy projects building from source ```python title="MODULE.bazel" -wizer = use_extension("@rules_wasm_component//wasm:extensions.bzl", "wizer") -wizer.register( +# Example: building wasm-tools from source via cargo +wasm_toolchain = use_extension("@rules_wasm_component//wasm:extensions.bzl", "wasm_toolchain") +wasm_toolchain.register( strategy = "cargo", # Uses cargo install - version = "9.0.0", + version = "1.243.0", ) ``` @@ -184,7 +187,9 @@ wizer.register( - **Rust required** - System dependency - **Compilation time** - Builds from source -- **Wizer only** - Limited to Wizer toolchain +- **Limited toolchains** - Not all toolchains support cargo strategy + +> **Note:** The standalone wizer toolchain has been removed. Wizer is now part of wasmtime v39.0.0+ and available via the `wasmtime wizer` subcommand. ## Performance Comparison @@ -423,17 +428,20 @@ bazel build //... --jobs=auto --local_ram_resources=8192 #### Wizer Pre-initialization -For faster component startup: +For faster component startup, use wasmtime's built-in wizer functionality (v39.0.0+): ```python title="MODULE.bazel - Performance" -# Enable Wizer for startup optimization -wizer = use_extension("@rules_wasm_component//wasm:extensions.bzl", "wizer") -wizer.register( - strategy = "download", # Fast, reliable - version = "9.0.0", +# Wizer is included in wasmtime v39.0.0+ +# No separate wizer toolchain required - uses `wasmtime wizer` subcommand +wasmtime = use_extension("@rules_wasm_component//wasm:extensions.bzl", "wasmtime") +wasmtime.register( + strategy = "download", + version = "39.0.1", # Includes wizer functionality ) ``` +> **Note:** The init function name has changed from `wizer.initialize` to `wizer-initialize` in wasmtime's wizer. + ## Troubleshooting ### Common Issues diff --git a/docs/toolchain_configuration.md b/docs/toolchain_configuration.md index 6cf53267..ec21f7d3 100644 --- a/docs/toolchain_configuration.md +++ b/docs/toolchain_configuration.md @@ -133,30 +133,22 @@ register_toolchains("@wasmtime_toolchain//:wasmtime_toolchain") - Testing infrastructure (`wasm_test`, `wasm_run`) - WASI Preview 2 support -### Wizer Toolchain +### Wizer (Pre-initialization) -Default configuration (recommended): -```starlark -# MODULE.bazel - Included by default -bazel_dep(name = "rules_wasm_component", version = "1.0.0") -``` +> **Note:** As of wasmtime v39.0.0 (November 2025), Wizer has been integrated into wasmtime +> and is available as the `wasmtime wizer` subcommand. No separate wizer toolchain is required. -Custom version: +Wizer pre-initialization is automatically available through the wasmtime toolchain: ```starlark -wizer = use_extension("//wasm:extensions.bzl", "wizer") -wizer.register( - name = "wizer", - strategy = "download", - version = "9.0.0", # Or any other version -) -use_repo(wizer, "wizer_toolchain") -register_toolchains("@wizer_toolchain//:wizer_toolchain_def") +# MODULE.bazel - wasmtime toolchain includes wizer functionality +bazel_dep(name = "rules_wasm_component", version = "1.0.0") ``` **Features:** - Pre-initialization for 1.35-6x startup improvement - Component model support - WASI imports during initialization +- Uses `wasmtime wizer` subcommand (not standalone wizer binary) ### wkg Toolchain diff --git a/examples/wizer_example/BUILD.bazel b/examples/wizer_example/BUILD.bazel index d5de65a8..5ec8b121 100644 --- a/examples/wizer_example/BUILD.bazel +++ b/examples/wizer_example/BUILD.bazel @@ -42,19 +42,20 @@ rust_wasm_component_bindgen( wit = ":expensive_init_interfaces", ) -# Apply Wizer to the WASM module +# Apply Wizer to the WASM module using wasmtime wizer +# Note: As of wasmtime v39.0.0, wizer is integrated into wasmtime wasm_component_wizer( name = "wizer_optimized_module", component = ":component_to_module", - init_function_name = "wizer.initialize", + init_function_name = "wizer-initialize", # New default in wasmtime v39.0.0 ) -# Test the new Wizer library-based approach +# Test the wizer library-based approach (now uses wasmtime wizer) wasm_component_wizer_library( name = "wizer_library_test", allow_wasi = True, component = ":expensive_init_simple_module", - init_function_name = "wizer.initialize", + init_function_name = "wizer-initialize", # New default in wasmtime v39.0.0 verbose = True, ) diff --git a/examples/wizer_example/README.md b/examples/wizer_example/README.md index 05b789cd..b06b1135 100644 --- a/examples/wizer_example/README.md +++ b/examples/wizer_example/README.md @@ -2,6 +2,8 @@ This example demonstrates how to use Wizer for WebAssembly component pre-initialization to achieve dramatically improved startup performance. +> **Note**: As of Wasmtime v39.0.0 (November 2025), the standalone Wizer tool has been merged upstream into Wasmtime. This example now uses the `wasmtime wizer` subcommand for pre-initialization. + ## What is Wizer? Wizer is a WebAssembly pre-initialization tool that: diff --git a/examples/wizer_example/src/lib.rs b/examples/wizer_example/src/lib.rs index 1800805a..7407427a 100644 --- a/examples/wizer_example/src/lib.rs +++ b/examples/wizer_example/src/lib.rs @@ -23,7 +23,9 @@ impl Guest for Component { } // Wizer initialization function - runs at build time -#[export_name = "wizer.initialize"] +// Note: As of wasmtime v39.0.0, the default function name changed from +// "wizer.initialize" to "wizer-initialize" for better component compatibility +#[export_name = "wizer-initialize"] pub extern "C" fn wizer_initialize() { // Expensive computation that would normally happen at runtime let mut data = HashMap::new(); diff --git a/examples/wizer_example/src/lib_simple.rs b/examples/wizer_example/src/lib_simple.rs index a5b2ad77..95431c76 100644 --- a/examples/wizer_example/src/lib_simple.rs +++ b/examples/wizer_example/src/lib_simple.rs @@ -17,7 +17,9 @@ pub extern "C" fn compute(input: i32) -> i32 { } // Wizer initialization function - runs at build time -#[export_name = "wizer.initialize"] +// Note: As of wasmtime v39.0.0, the default function name changed from +// "wizer.initialize" to "wizer-initialize" for better component compatibility +#[export_name = "wizer-initialize"] pub extern "C" fn wizer_initialize() { // Expensive computation that would normally happen at runtime let mut data = HashMap::new(); diff --git a/toolchains/BUILD.bazel b/toolchains/BUILD.bazel index 40002648..525e8199 100644 --- a/toolchains/BUILD.bazel +++ b/toolchains/BUILD.bazel @@ -47,13 +47,8 @@ toolchain_type( visibility = ["//visibility:public"], ) -# Toolchain type for Wizer WebAssembly pre-initialization -toolchain_type( - name = "wizer_toolchain_type", - visibility = ["//visibility:public"], -) - # Toolchain type for Wasmtime WebAssembly runtime +# Note: Wizer functionality is now part of wasmtime (v39.0.0+), use wasmtime_toolchain_type toolchain_type( name = "wasmtime_toolchain_type", visibility = ["//visibility:public"], @@ -135,18 +130,6 @@ bzl_library( ], ) -# Bzl library for Wizer WebAssembly pre-initialization toolchain implementation -bzl_library( - name = "wizer_toolchain", - srcs = ["wizer_toolchain.bzl"], - visibility = ["//visibility:public"], - deps = [ - ":diagnostics", - ":tool_cache", - "//checksums:registry", - ], -) - # Enhanced toolchain management libraries bzl_library( diff --git a/toolchains/BUILD.wizer b/toolchains/BUILD.wizer deleted file mode 100644 index b85f0fa2..00000000 --- a/toolchains/BUILD.wizer +++ /dev/null @@ -1,21 +0,0 @@ -"""BUILD file for wizer (WebAssembly pre-initialization tool) built from source""" - -load("@rules_rust//rust:defs.bzl", "rust_binary") - -rust_binary( - name = "wizer", - srcs = glob(["src/**/*.rs"]), - edition = "2021", - visibility = ["//visibility:public"], - deps = [ - # Note: Dependencies will be resolved by rules_rust from Cargo.toml - # This follows the same pattern as other modernized tools - ], -) - -# Alias for Bazel integration -alias( - name = "wizer_bazel", - actual = ":wizer", - visibility = ["//visibility:public"], -) diff --git a/toolchains/tool_versions.bzl b/toolchains/tool_versions.bzl index 3c952722..6c08b972 100644 --- a/toolchains/tool_versions.bzl +++ b/toolchains/tool_versions.bzl @@ -33,8 +33,7 @@ TOOL_VERSIONS = { "wac": "0.8.1", # WebAssembly Composition tool "wkg": "0.13.0", # WebAssembly package manager - # Optimization and initialization - "wizer": "10.0.0", # WebAssembly pre-initialization tool + # Note: wizer removed - now part of wasmtime v39.0.0+, use `wasmtime wizer` subcommand # Signatures and security "wasmsign2": "0.2.6", # WebAssembly signing tool diff --git a/toolchains/wasm_tools_repositories.bzl b/toolchains/wasm_tools_repositories.bzl index b017644f..8eb92967 100644 --- a/toolchains/wasm_tools_repositories.bzl +++ b/toolchains/wasm_tools_repositories.bzl @@ -63,13 +63,7 @@ def register_wasm_tool_repositories(bundle = None): build_file = "//toolchains:BUILD.wrpc", ) - # wizer: WebAssembly pre-initialization tool - git_repository( - name = "wizer_src", - remote = "https://github.com/bytecodealliance/wizer.git", - tag = "v9.0.0", - build_file = "//toolchains:BUILD.wizer", - ) + # Note: wizer removed - now part of wasmtime v39.0.0+, use `wasmtime wizer` subcommand # wasmsign2: WebAssembly component signing tool git_repository( diff --git a/toolchains/wasmtime_toolchain.bzl b/toolchains/wasmtime_toolchain.bzl index 24878805..e8d33bb0 100644 --- a/toolchains/wasmtime_toolchain.bzl +++ b/toolchains/wasmtime_toolchain.bzl @@ -172,7 +172,7 @@ wasmtime_repository = repository_rule( ), "version": attr.string( doc = "Wasmtime version to install. Ignored if bundle is specified.", - default = "35.0.0", # Latest version from our registry + default = "39.0.1", # Latest version with integrated wizer support ), }, doc = "Repository rule for setting up Wasmtime WebAssembly runtime", diff --git a/toolchains/wizer_toolchain.bzl b/toolchains/wizer_toolchain.bzl deleted file mode 100644 index 6d1768e9..00000000 --- a/toolchains/wizer_toolchain.bzl +++ /dev/null @@ -1,318 +0,0 @@ -"""Wizer WebAssembly pre-initialization toolchain definitions""" - -load("//checksums:registry.bzl", "get_tool_info") -load("//toolchains:bundle.bzl", "get_version_for_tool", "log_bundle_usage") - -WIZER_VERSIONS = { - "10.0.0": { - "release_date": "2025-08-27", - "cargo_install": True, # Primary installation method - "git_commit": "main", - }, - "9.0.0": { - "release_date": "2024-06-03", - "cargo_install": True, # Primary installation method - "git_commit": "090082b", - }, - "8.0.0": { - "release_date": "2024-02-28", - "cargo_install": True, - "git_commit": "unknown", - }, -} - -def _wizer_toolchain_impl(ctx): - """Implementation of wizer_toolchain rule""" - - toolchain_info = platform_common.ToolchainInfo( - wizer = ctx.file.wizer, - ) - - return [toolchain_info] - -wizer_toolchain = rule( - implementation = _wizer_toolchain_impl, - attrs = { - "wizer": attr.label( - allow_single_file = True, - executable = True, - cfg = "exec", - doc = "Wizer pre-initialization tool executable", - ), - }, -) - -def _detect_host_platform(repository_ctx): - """Detect the host platform for tool installation""" - os_name = repository_ctx.os.name.lower() - arch = repository_ctx.os.arch.lower() - - # Use Bazel's native architecture detection - if "mac" in os_name or "darwin" in os_name: - if arch == "aarch64" or "arm64" in arch: - return "darwin_arm64" - return "darwin_amd64" - elif "linux" in os_name: - if arch == "aarch64" or "arm64" in arch: - return "linux_arm64" - return "linux_amd64" - elif "windows" in os_name: - return "windows_amd64" - else: - fail("Unsupported operating system: {}".format(os_name)) - -def _get_wizer_download_info(platform, version): - """Get download information for wizer prebuilt binaries from central registry""" - - # Get tool info from central registry - tool_info = get_tool_info("wizer", version, platform) - if not tool_info: - fail("Unsupported platform {} for wizer version {}. Supported platforms can be found in //checksums/tools/wizer.json".format(platform, version)) - - # Build download URL - asset_name = "wizer-v{}-{}".format(version, tool_info["url_suffix"]) - url = "https://github.com/bytecodealliance/wizer/releases/download/v{}/{}".format(version, asset_name) - - # Determine archive type from suffix - archive_type = "zip" if tool_info["url_suffix"].endswith(".zip") else "tar.xz" - - return { - "url": url, - "sha256": tool_info["sha256"], - "type": archive_type, - "strip_prefix": tool_info["strip_prefix"], - } - -def _wizer_toolchain_repository_impl(ctx): - """Implementation of wizer_toolchain_repository repository rule""" - - strategy = ctx.attr.strategy - platform = _detect_host_platform(ctx) - bundle_name = ctx.attr.bundle - - # Resolve version from bundle if specified, otherwise use explicit version - if bundle_name: - version = get_version_for_tool( - ctx, - "wizer", - bundle_name = bundle_name, - fallback_version = ctx.attr.version, - ) - log_bundle_usage(ctx, "wizer", version, bundle_name) - else: - version = ctx.attr.version - - if version not in WIZER_VERSIONS: - fail("Unsupported Wizer version: {}. Supported versions: {}".format( - version, - list(WIZER_VERSIONS.keys()), - )) - - version_info = WIZER_VERSIONS[version] - - if strategy == "build": - # Use the git repository + genrule approach for hermetic builds - print("Using hermetic build strategy with git_repository + genrule approach") - - # Create a placeholder since the actual binary will be built by git repository - ctx.file("wizer", """#!/bin/bash -# This is a placeholder - actual wizer is built by git_repository + genrule -echo "Error: wizer should be accessed through Bazel targets, not as standalone binary" -echo "Use the proper toolchain integration instead" -exit 1 -""", executable = True) - wizer_path = "wizer" - - elif strategy == "cargo": - # Create a script that installs Wizer via Cargo - ctx.file("install_wizer.sh", """#!/bin/bash -set -euo pipefail - -WIZER_VERSION="{version}" -INSTALL_DIR="$PWD/bin" - -# Ensure install directory exists -mkdir -p "$INSTALL_DIR" - -# Check if cargo is available -if ! command -v cargo &> /dev/null; then - echo "Error: cargo is required to install Wizer but is not available" - echo "Please install Rust and Cargo, or use strategy='system'" - exit 1 -fi - -# Install Wizer using cargo -echo "Installing Wizer v$WIZER_VERSION via cargo..." -cargo install wizer --version "=$WIZER_VERSION" --root . --all-features - -# Verify installation -if [[ -f "$INSTALL_DIR/wizer" ]]; then - echo "Successfully installed Wizer v$WIZER_VERSION" - "$INSTALL_DIR/wizer" --version -else - echo "Error: Wizer installation failed" - exit 1 -fi -""".format(version = version), executable = True) - - # Execute installation script - result = ctx.execute(["./install_wizer.sh"]) - if result.return_code != 0: - # Check if the error is due to missing cargo (hermetic requirement) - if "cargo is required" in result.stderr or "cargo" in result.stderr: - print("Warning: Wizer installation skipped - cargo not available in hermetic environment") - print("This is expected in BCR testing environments") - print("Wizer functionality will be limited but basic WebAssembly builds will work") - - # Create a placeholder wizer binary that explains the situation - ctx.file("bin/wizer", """#!/bin/bash -echo "Wizer not available - cargo not accessible in hermetic environment" -echo "This is expected in BCR testing environments" -echo "WebAssembly pre-initialization functionality not available" -echo "Use system strategy or ensure hermetic Rust toolchain is available" -exit 1 -""", executable = True) - wizer_path = "bin/wizer" - else: - fail("Failed to install Wizer via cargo: {}".format(result.stderr)) - - wizer_path = "bin/wizer" - - elif strategy == "source": - # Use git_repository approach (modernized) - # Note: For complex crates like wizer, we still need the existing "build" strategy - # The "source" strategy is primarily for avoiding ctx.execute() calls - wizer_path = "wizer_placeholder" - - # Create placeholder since complex dependency resolution is challenging - ctx.file("wizer_placeholder", """#!/bin/bash -echo "Wizer source strategy: Use 'build' or 'cargo' strategy for full functionality" -echo "Source strategy eliminates ctx.execute calls but requires proper dependency resolution" -exit 1 -""", executable = True) - - elif strategy == "download": - # Download prebuilt binary from GitHub releases - platform_info = _get_wizer_download_info(platform, version) - - # Download and extract the binary - ctx.download_and_extract( - url = platform_info["url"], - sha256 = platform_info["sha256"], - stripPrefix = platform_info["strip_prefix"], - type = platform_info["type"], - ) - - # The binary is now extracted directly to the root with the correct name - wizer_path = "wizer.exe" if "windows" in platform else "wizer" - - else: - fail("Unsupported Wizer installation strategy: {}. Use 'build', 'cargo', 'source', or 'download'".format(strategy)) - - # Create BUILD file for the toolchain - if strategy == "build": - # For build strategy, reference the git repository - build_content = '''"""Wizer WebAssembly pre-initialization toolchain""" - -load("@rules_wasm_component//toolchains:wizer_toolchain.bzl", "wizer_toolchain") - -package(default_visibility = ["//visibility:public"]) - -# Wizer executable from git repository (Bazel-native build) -alias( - name = "wizer_bin", - actual = "@wizer_src//:wizer_bazel", - visibility = ["//visibility:public"], -) -''' - elif strategy == "source": - # For source strategy, use placeholder (avoids ctx.execute) - build_content = '''"""Wizer WebAssembly pre-initialization toolchain""" - -load("@rules_wasm_component//toolchains:wizer_toolchain.bzl", "wizer_toolchain") - -package(default_visibility = ["//visibility:public"]) - -# Wizer placeholder (source strategy avoids ctx.execute calls) -filegroup( - name = "wizer_bin", - srcs = ["{wizer_path}"], - visibility = ["//visibility:public"], -) -'''.format(wizer_path = wizer_path) - elif strategy == "download": - # For download strategy, use native file that's already executable - build_content = '''"""Wizer WebAssembly pre-initialization toolchain""" - -load("@rules_wasm_component//toolchains:wizer_toolchain.bzl", "wizer_toolchain") - -package(default_visibility = ["//visibility:public"]) - -# Wizer executable (downloaded binary) -sh_binary( - name = "wizer_bin", - srcs = ["{wizer_path}"], - visibility = ["//visibility:public"], -) -'''.format(wizer_path = wizer_path) - else: - # For other strategies, use local file - build_content = '''"""Wizer WebAssembly pre-initialization toolchain""" - -load("@rules_wasm_component//toolchains:wizer_toolchain.bzl", "wizer_toolchain") - -package(default_visibility = ["//visibility:public"]) - -# Wizer executable -filegroup( - name = "wizer_bin", - srcs = ["{wizer_path}"], -) -'''.format(wizer_path = wizer_path) - - ctx.file("BUILD.bazel", build_content + ''' -# Wizer toolchain implementation -wizer_toolchain( - name = "wizer_toolchain_impl", - wizer = "{wizer_path}", -) - -# Toolchain definition -toolchain( - name = "wizer_toolchain_def", - exec_compatible_with = [ - "@platforms//os:{os}", - "@platforms//cpu:{cpu}", - ], - target_compatible_with = [ - # Wizer runs on host platform to pre-initialize WASM modules - ], - toolchain = ":wizer_toolchain_impl", - toolchain_type = "@rules_wasm_component//toolchains:wizer_toolchain_type", - visibility = ["//visibility:public"], -) -'''.format( - wizer_path = wizer_path, - os = "osx" if "darwin" in platform else ("windows" if "windows" in platform else "linux"), - cpu = "arm64" if "arm64" in platform else "x86_64", - )) - -wizer_toolchain_repository = repository_rule( - implementation = _wizer_toolchain_repository_impl, - attrs = { - "bundle": attr.string( - default = "", - doc = "Toolchain bundle name. If set, version is read from checksums/toolchain_bundles.json", - ), - "version": attr.string( - default = "9.0.0", - doc = "Wizer version to install. Ignored if bundle is specified.", - ), - "strategy": attr.string( - default = "source", - values = ["build", "cargo", "source", "download"], - doc = "Installation strategy: 'build' (build from source), 'cargo' (install via cargo), 'source' (git repository), or 'download' (download prebuilt binary)", - ), - }, - doc = "Repository rule for setting up Wizer toolchain", -) diff --git a/tools-builder/MODULE.bazel b/tools-builder/MODULE.bazel index 2c6868b5..a76964a6 100644 --- a/tools-builder/MODULE.bazel +++ b/tools-builder/MODULE.bazel @@ -32,10 +32,10 @@ use_repo(rust, "rust_toolchains") register_toolchains("@rust_toolchains//:all") # External tool sources via git_repository +# Note: wizer removed - now part of wasmtime v39.0.0+ git_repos = use_extension("//toolchains:builder_extensions.bzl", "git_repos") git_repos.wasm_tools(tag = "v1.235.0") git_repos.wit_bindgen(tag = "v0.43.0") -git_repos.wizer(tag = "v9.0.0") git_repos.wac(tag = "v0.7.0") git_repos.wasmtime(tag = "v35.0.0") use_repo( @@ -44,7 +44,6 @@ use_repo( "wasm_tools_src", "wasmtime_src", "wit_bindgen_src", - "wizer_src", ) # Rust crates for dependency management diff --git a/tools-builder/toolchains/builder_extensions.bzl b/tools-builder/toolchains/builder_extensions.bzl index d5e406b0..b5527662 100644 --- a/tools-builder/toolchains/builder_extensions.bzl +++ b/tools-builder/toolchains/builder_extensions.bzl @@ -25,14 +25,7 @@ def _git_repos_impl(module_ctx): ) repos_created["wit_bindgen_src"] = True - for call in mod.tags.wizer: - if "wizer_src" not in repos_created: - module_ctx.download_and_extract( - name = "wizer_src", - url = "https://github.com/bytecodealliance/wizer/archive/refs/tags/{}.tar.gz".format(call.tag), - strip_prefix = "wizer-{}".format(call.tag.lstrip("v")), - ) - repos_created["wizer_src"] = True + # Note: wizer removed - now part of wasmtime v39.0.0+ for call in mod.tags.wac: if "wac_src" not in repos_created: @@ -61,10 +54,6 @@ _wit_bindgen_tag = tag_class(attrs = { "tag": attr.string(mandatory = True), }) -_wizer_tag = tag_class(attrs = { - "tag": attr.string(mandatory = True), -}) - _wac_tag = tag_class(attrs = { "tag": attr.string(mandatory = True), }) @@ -79,7 +68,6 @@ git_repos = module_extension( tag_classes = { "wasm_tools": _wasm_tools_tag, "wit_bindgen": _wit_bindgen_tag, - "wizer": _wizer_tag, "wac": _wac_tag, "wasmtime": _wasmtime_tag, }, diff --git a/tools-builder/toolchains/builder_macros.bzl b/tools-builder/toolchains/builder_macros.bzl index 0ace9aef..ec177cd9 100644 --- a/tools-builder/toolchains/builder_macros.bzl +++ b/tools-builder/toolchains/builder_macros.bzl @@ -38,13 +38,7 @@ def wasm_tool_suite(name, platforms, tools): rust_target = platform_info["rust_target"], suffix = platform_info["suffix"], ) - elif tool == "wizer": - _build_wizer( - name = target_name, - platform = platform, - rust_target = platform_info["rust_target"], - suffix = platform_info["suffix"], - ) + # Note: wizer removed - now part of wasmtime v39.0.0+ elif tool == "wac": _build_wac( name = target_name, @@ -90,17 +84,6 @@ def _build_wit_bindgen(name, platform, rust_target, suffix): edition = "2021", ) -def _build_wizer(name, platform, rust_target, suffix): - """Build wizer for a specific platform""" - rust_binary( - name = name, - srcs = ["@wizer_src//:src/main.rs"], - deps = ["@wizer_src//:wizer_lib"], - platform = platform, - crate_name = "wizer", - edition = "2021", - ) - def _build_wac(name, platform, rust_target, suffix): """Build wac for a specific platform""" rust_binary( diff --git a/tools-builder/tools/wizer/BUILD.bazel b/tools-builder/tools/wizer/BUILD.bazel deleted file mode 100644 index 7c086c1a..00000000 --- a/tools-builder/tools/wizer/BUILD.bazel +++ /dev/null @@ -1,20 +0,0 @@ -"""BUILD file for wizer from source - simplified for tools-builder workspace""" - -load("@rules_rust//rust:defs.bzl", "rust_binary") - -package(default_visibility = ["//visibility:public"]) - -# Simple wizer binary build for host platform only -# This demonstrates the capability to build tools from source when downloads aren't available -rust_binary( - name = "wizer", - srcs = ["@wizer_src//:src/bin/wizer.rs"], - crate_name = "wizer", - edition = "2021", - deps = [ - "@crates//:anyhow", - "@crates//:clap", - # Additional dependencies would be added here as needed - # This is a minimal working example for CI validation - ], -) diff --git a/tools/checksum_updater/src/tool_config.rs b/tools/checksum_updater/src/tool_config.rs index f0c61b29..0196f10b 100644 --- a/tools/checksum_updater/src/tool_config.rs +++ b/tools/checksum_updater/src/tool_config.rs @@ -208,9 +208,7 @@ impl ToolConfig { }, ); - // Note: wizer is in the JSON registry with valid checksums but - // has issues with GitHub API calls in the update engine, so we use - // the fallback checksum mechanism instead of auto-updates + // Note: wizer removed - now part of wasmtime v39.0.0+, use `wasmtime wizer` subcommand // wkg configuration tools.insert( diff --git a/tools/wizer_initializer/BUILD.bazel b/tools/wizer_initializer/BUILD.bazel deleted file mode 100644 index e42b14d3..00000000 --- a/tools/wizer_initializer/BUILD.bazel +++ /dev/null @@ -1,43 +0,0 @@ -"""Wizer library-based initializer tool and checksum updater""" - -load("@rules_rust//rust:defs.bzl", "rust_binary") - -package(default_visibility = ["//visibility:public"]) - -# Simplified Wizer library placeholder demonstrating architecture -# This version uses basic dependencies and serves as proof-of-concept -rust_binary( - name = "wizer_initializer", - srcs = ["src/main.rs"], - edition = "2021", - deps = [ - "@wizer_crates//:anyhow", - "@wizer_crates//:clap", - ], -) - -# Checksum updater for automated SHA management -rust_binary( - name = "checksum_updater", - srcs = ["src/checksum_updater.rs"], - edition = "2021", - deps = [ - "@wizer_crates//:anyhow", - "@wizer_crates//:chrono", - "@wizer_crates//:clap", - "@wizer_crates//:futures-util", - "@wizer_crates//:octocrab", - "@wizer_crates//:reqwest", - "@wizer_crates//:serde", - "@wizer_crates//:serde_json", - "@wizer_crates//:sha2", - "@wizer_crates//:tempfile", - "@wizer_crates//:tokio", - ], -) - -# Alias for easier command line usage -alias( - name = "update_checksums", - actual = ":checksum_updater", -) diff --git a/tools/wizer_initializer/Cargo.lock b/tools/wizer_initializer/Cargo.lock deleted file mode 100644 index 13401879..00000000 --- a/tools/wizer_initializer/Cargo.lock +++ /dev/null @@ -1,2724 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" - -[[package]] -name = "anstyle-parse" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.59.0", -] - -[[package]] -name = "anyhow" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "camino" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" -dependencies = [ - "serde_core", -] - -[[package]] -name = "cargo-platform" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122ec45a44b270afd1402f351b782c676b173e3c3fb28d86ff7ebfb4d86a4ee4" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cc" -version = "1.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "chrono" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link 0.2.1", -] - -[[package]] -name = "clap" -version = "4.5.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek", - "ed25519", - "serde", - "sha2", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "hkdf", - "pem-rfc7468", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "h2" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "log", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "10.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76e1c7d7df3e34443b3621b459b066a7b79644f059fc8b2db7070c825fd417e" -dependencies = [ - "base64", - "ed25519-dalek", - "getrandom 0.2.16", - "hmac", - "js-sys", - "p256", - "p384", - "pem", - "rand", - "rsa", - "serde", - "serde_json", - "sha2", - "signature", - "simple_asn1", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.174" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "lock_api" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "octocrab" -version = "0.48.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5930b376c98c438a4f4259a760cda2c198efea3b82de8f8a2aff0c00a8b7c1c" -dependencies = [ - "arc-swap", - "async-trait", - "base64", - "bytes", - "cargo_metadata", - "cfg-if", - "chrono", - "either", - "futures", - "futures-core", - "futures-util", - "getrandom 0.2.16", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-timeout", - "hyper-util", - "jsonwebtoken", - "once_cell", - "percent-encoding", - "pin-project", - "secrecy", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "snafu", - "tokio", - "tower", - "tower-http", - "tracing", - "url", - "web-time", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - -[[package]] -name = "p384" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "pem" -version = "3.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" -dependencies = [ - "base64", - "serde", -] - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "redox_syscall" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" -dependencies = [ - "bitflags", -] - -[[package]] -name = "reqwest" -version = "0.12.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.4.0", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secrecy" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" -dependencies = [ - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" -dependencies = [ - "bitflags", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" -dependencies = [ - "itoa", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "simple_asn1" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror", - "time", -] - -[[package]] -name = "slab" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "snafu" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e84b3f4eacbf3a1ce05eac6763b4d629d60cbc94d632e4092c54ade71f1e1a2" -dependencies = [ - "snafu-derive", -] - -[[package]] -name = "snafu-derive" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c97747dbf44bb1ca44a561ece23508e99cb592e862f22222dcf42f51d1e451" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "socket2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand", - "getrandom 0.3.3", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "time" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" -dependencies = [ - "bitflags", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -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", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-registry" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" -dependencies = [ - "windows-link 0.1.3", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] - -[[package]] -name = "wizer_initializer" -version = "0.1.0" -dependencies = [ - "anyhow", - "chrono", - "clap", - "futures-util", - "octocrab", - "reqwest", - "serde", - "serde_json", - "sha2", - "tempfile", - "tokio", -] - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/tools/wizer_initializer/Cargo.toml b/tools/wizer_initializer/Cargo.toml deleted file mode 100644 index 9225cb1b..00000000 --- a/tools/wizer_initializer/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "wizer_initializer" -version = "0.1.0" -edition = "2021" - -[[bin]] -name = "wizer_initializer" -path = "src/main.rs" - -[[bin]] -name = "checksum_updater" -path = "src/checksum_updater.rs" - -[dependencies] -anyhow = "1.0" -clap = { version = "4.5.51", features = ["derive"] } - -# Additional dependencies for checksum updater -reqwest = { version = "0.12", features = ["json", "stream"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -sha2 = "0.10" -tokio = { version = "1.48", features = ["full"] } -chrono = { version = "0.4", features = ["serde"] } -futures-util = "0.3" -tempfile = "3.23" -octocrab = { version = "0.48.1", features = ["stream"] } diff --git a/tools/wizer_initializer/src/checksum_updater.rs b/tools/wizer_initializer/src/checksum_updater.rs deleted file mode 100644 index 89a328de..00000000 --- a/tools/wizer_initializer/src/checksum_updater.rs +++ /dev/null @@ -1,445 +0,0 @@ -use anyhow::{Context, Result}; -use chrono::{DateTime, Utc}; -use clap::{Arg, Command}; -use futures_util::StreamExt; -use octocrab::{models::repos::Release, Octocrab}; -use serde::{Deserialize, Serialize}; -use sha2::{Digest, Sha256}; -use std::collections::HashMap; -use std::fs; -use std::path::Path; -use tempfile::NamedTempFile; - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct PlatformInfo { - sha256: String, - #[serde(skip_serializing_if = "Option::is_none")] - url_suffix: Option, - #[serde(skip_serializing_if = "Option::is_none")] - platform_name: Option, - #[serde(skip_serializing_if = "Option::is_none")] - binary_name: Option, - #[serde(skip_serializing_if = "Option::is_none")] - npm_package: Option, - #[serde(skip_serializing_if = "Option::is_none")] - npm_version: Option, - #[serde(skip_serializing_if = "Option::is_none")] - install_method: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct VersionInfo { - release_date: String, - platforms: HashMap, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct ToolConfig { - tool_name: String, - github_repo: String, - latest_version: String, - last_checked: DateTime, - #[serde(skip_serializing_if = "Option::is_none")] - note: Option, - #[serde(skip_serializing_if = "Option::is_none")] - install_method: Option, - versions: HashMap, -} - -#[derive(Debug, Clone)] -struct ToolPattern { - name: String, - repo: String, - url_patterns: Vec, - version_prefix: Option, -} - -#[derive(Debug, Clone)] -struct PlatformPattern { - platform: String, - url_template: String, - additional_fields: HashMap, -} - -impl ToolPattern { - fn new(name: &str, repo: &str) -> Self { - Self { - name: name.to_string(), - repo: repo.to_string(), - url_patterns: vec![], - version_prefix: None, - } - } - - fn with_version_prefix(mut self, prefix: &str) -> Self { - self.version_prefix = Some(prefix.to_string()); - self - } - - fn add_platform(mut self, platform: &str, url_template: &str) -> Self { - self.url_patterns.push(PlatformPattern { - platform: platform.to_string(), - url_template: url_template.to_string(), - additional_fields: HashMap::new(), - }); - self - } - - fn add_platform_with_fields( - mut self, - platform: &str, - url_template: &str, - fields: HashMap, - ) -> Self { - self.url_patterns.push(PlatformPattern { - platform: platform.to_string(), - url_template: url_template.to_string(), - additional_fields: fields, - }); - self - } -} - -fn get_tool_patterns() -> Vec { - vec![ - ToolPattern::new("wasm-tools", "bytecodealliance/wasm-tools") - .with_version_prefix("v") - .add_platform( - "darwin_amd64", - "https://github.com/bytecodealliance/wasm-tools/releases/download/v{version}/wasm-tools-{version}-x86_64-macos.tar.gz", - ) - .add_platform( - "darwin_arm64", - "https://github.com/bytecodealliance/wasm-tools/releases/download/v{version}/wasm-tools-{version}-aarch64-macos.tar.gz", - ) - .add_platform( - "linux_amd64", - "https://github.com/bytecodealliance/wasm-tools/releases/download/v{version}/wasm-tools-{version}-x86_64-linux.tar.gz", - ) - .add_platform( - "linux_arm64", - "https://github.com/bytecodealliance/wasm-tools/releases/download/v{version}/wasm-tools-{version}-aarch64-linux.tar.gz", - ) - .add_platform( - "windows_amd64", - "https://github.com/bytecodealliance/wasm-tools/releases/download/v{version}/wasm-tools-{version}-x86_64-windows.tar.gz", - ), - ToolPattern::new("wit-bindgen", "bytecodealliance/wit-bindgen") - .with_version_prefix("v") - .add_platform( - "darwin_amd64", - "https://github.com/bytecodealliance/wit-bindgen/releases/download/v{version}/wit-bindgen-{version}-x86_64-macos.tar.gz", - ) - .add_platform( - "darwin_arm64", - "https://github.com/bytecodealliance/wit-bindgen/releases/download/v{version}/wit-bindgen-{version}-aarch64-macos.tar.gz", - ) - .add_platform( - "linux_amd64", - "https://github.com/bytecodealliance/wit-bindgen/releases/download/v{version}/wit-bindgen-{version}-x86_64-linux.tar.gz", - ) - .add_platform( - "linux_arm64", - "https://github.com/bytecodealliance/wit-bindgen/releases/download/v{version}/wit-bindgen-{version}-aarch64-linux.tar.gz", - ) - .add_platform( - "windows_amd64", - "https://github.com/bytecodealliance/wit-bindgen/releases/download/v{version}/wit-bindgen-{version}-x86_64-windows.zip", - ), - ToolPattern::new("wasmtime", "bytecodealliance/wasmtime") - .with_version_prefix("v") - .add_platform( - "darwin_amd64", - "https://github.com/bytecodealliance/wasmtime/releases/download/v{version}/wasmtime-v{version}-x86_64-macos.tar.xz", - ) - .add_platform( - "darwin_arm64", - "https://github.com/bytecodealliance/wasmtime/releases/download/v{version}/wasmtime-v{version}-aarch64-macos.tar.xz", - ) - .add_platform( - "linux_amd64", - "https://github.com/bytecodealliance/wasmtime/releases/download/v{version}/wasmtime-v{version}-x86_64-linux.tar.xz", - ) - .add_platform( - "linux_arm64", - "https://github.com/bytecodealliance/wasmtime/releases/download/v{version}/wasmtime-v{version}-aarch64-linux.tar.xz", - ) - .add_platform( - "windows_amd64", - "https://github.com/bytecodealliance/wasmtime/releases/download/v{version}/wasmtime-v{version}-x86_64-windows.zip", - ), - ToolPattern::new("wac", "bytecodealliance/wac") - .with_version_prefix("v") - .add_platform_with_fields( - "darwin_amd64", - "https://github.com/bytecodealliance/wac/releases/download/v{version}/wac-cli-x86_64-apple-darwin", - [("platform_name".to_string(), "x86_64-apple-darwin".to_string())].into(), - ) - .add_platform_with_fields( - "darwin_arm64", - "https://github.com/bytecodealliance/wac/releases/download/v{version}/wac-cli-aarch64-apple-darwin", - [("platform_name".to_string(), "aarch64-apple-darwin".to_string())].into(), - ) - .add_platform_with_fields( - "linux_amd64", - "https://github.com/bytecodealliance/wac/releases/download/v{version}/wac-cli-x86_64-unknown-linux-musl", - [("platform_name".to_string(), "x86_64-unknown-linux-musl".to_string())].into(), - ) - .add_platform_with_fields( - "linux_arm64", - "https://github.com/bytecodealliance/wac/releases/download/v{version}/wac-cli-aarch64-unknown-linux-musl", - [("platform_name".to_string(), "aarch64-unknown-linux-musl".to_string())].into(), - ) - .add_platform_with_fields( - "windows_amd64", - "https://github.com/bytecodealliance/wac/releases/download/v{version}/wac-cli-x86_64-pc-windows-gnu", - [("platform_name".to_string(), "x86_64-pc-windows-gnu".to_string())].into(), - ), - ] -} - -async fn fetch_latest_release(github: &Octocrab, repo: &str) -> Result { - let (owner, repo_name) = repo - .split_once('/') - .context("Invalid repository format. Expected 'owner/repo'")?; - - github - .repos(owner, repo_name) - .releases() - .get_latest() - .await - .context("Failed to fetch latest release") -} - -async fn download_and_hash(url: &str) -> Result { - println!("Downloading and hashing: {}", url); - - let response = reqwest::get(url).await.context("Failed to download file")?; - - if !response.status().is_success() { - anyhow::bail!("Download failed with status: {}", response.status()); - } - - let mut hasher = Sha256::new(); - let mut stream = response.bytes_stream(); - - while let Some(chunk) = stream.next().await { - let chunk = chunk.context("Failed to read chunk")?; - hasher.update(&chunk); - } - - let hash = hasher.finalize(); - Ok(format!("{:x}", hash)) -} - -async fn update_tool_checksums( - checksums_dir: &Path, - tool_pattern: &ToolPattern, - dry_run: bool, -) -> Result { - println!("Checking tool: {}", tool_pattern.name); - - let github = Octocrab::builder().build()?; - let latest_release = fetch_latest_release(&github, &tool_pattern.repo).await?; - - let version = latest_release.tag_name.clone(); - let clean_version = if let Some(prefix) = &tool_pattern.version_prefix { - version.strip_prefix(prefix).unwrap_or(&version) - } else { - &version - }; - - println!("Latest version: {} (clean: {})", version, clean_version); - - let config_path = checksums_dir - .join("tools") - .join(format!("{}.json", tool_pattern.name)); - let mut config: ToolConfig = if config_path.exists() { - let content = fs::read_to_string(&config_path)?; - serde_json::from_str(&content)? - } else { - ToolConfig { - tool_name: tool_pattern.name.clone(), - github_repo: tool_pattern.repo.clone(), - latest_version: clean_version.to_string(), - last_checked: Utc::now(), - note: None, - install_method: None, - versions: HashMap::new(), - } - }; - - // Check if we already have this version - if config.versions.contains_key(clean_version) { - println!("Version {} already exists, skipping", clean_version); - // Update last_checked time - config.last_checked = Utc::now(); - if !dry_run { - let updated_content = serde_json::to_string_pretty(&config)?; - fs::write(&config_path, updated_content)?; - } - return Ok(false); - } - - println!( - "New version {} found, calculating checksums...", - clean_version - ); - - let mut platforms = HashMap::new(); - for platform_pattern in &tool_pattern.url_patterns { - let url = platform_pattern - .url_template - .replace("{version}", clean_version); - - match download_and_hash(&url).await { - Ok(checksum) => { - println!("✅ {}: {}", platform_pattern.platform, checksum); - - let mut platform_info = PlatformInfo { - sha256: checksum, - url_suffix: None, - platform_name: None, - binary_name: None, - npm_package: None, - npm_version: None, - install_method: None, - }; - - // Add additional fields based on tool pattern - for (key, value) in &platform_pattern.additional_fields { - match key.as_str() { - "platform_name" => platform_info.platform_name = Some(value.clone()), - "binary_name" => platform_info.binary_name = Some(value.clone()), - "url_suffix" => platform_info.url_suffix = Some(value.clone()), - _ => {} - } - } - - // Infer url_suffix from URL if not provided - if platform_info.url_suffix.is_none() { - if let Some(suffix) = url.split('/').last() { - if let Some(tool_and_suffix) = suffix - .strip_prefix(&format!("{}-{}-", tool_pattern.name, clean_version)) - { - platform_info.url_suffix = Some(tool_and_suffix.to_string()); - } else if suffix.contains(&tool_pattern.name) { - // For wasmtime format: wasmtime-v{version}-{platform}.tar.xz - if let Some(platform_suffix) = - suffix.split(&format!("v{}-", clean_version)).nth(1) - { - platform_info.url_suffix = Some(platform_suffix.to_string()); - } - } - } - } - - platforms.insert(platform_pattern.platform.clone(), platform_info); - } - Err(e) => { - println!("❌ Failed to download {}: {}", platform_pattern.platform, e); - } - } - } - - if platforms.is_empty() { - println!("❌ No platforms successfully processed"); - return Ok(false); - } - - // Add new version to config - config.versions.insert( - clean_version.to_string(), - VersionInfo { - release_date: latest_release - .published_at - .map(|dt| dt.format("%Y-%m-%d").to_string()) - .unwrap_or_else(|| Utc::now().format("%Y-%m-%d").to_string()), - platforms, - }, - ); - - config.latest_version = clean_version.to_string(); - config.last_checked = Utc::now(); - - if !dry_run { - let updated_content = serde_json::to_string_pretty(&config)?; - fs::write(&config_path, updated_content)?; - println!("✅ Updated {}", config_path.display()); - } else { - println!("🔍 Would update {}", config_path.display()); - } - - Ok(true) -} - -#[tokio::main] -async fn main() -> Result<()> { - let matches = Command::new("Checksum Updater") - .version("1.0") - .about("Updates tool checksums by checking GitHub releases") - .arg( - Arg::new("checksums-dir") - .long("checksums-dir") - .value_name("DIR") - .help("Path to checksums directory") - .default_value("checksums"), - ) - .arg( - Arg::new("tool") - .long("tool") - .value_name("TOOL") - .help("Update specific tool only"), - ) - .arg( - Arg::new("dry-run") - .long("dry-run") - .help("Show what would be updated without making changes") - .action(clap::ArgAction::SetTrue), - ) - .get_matches(); - - let checksums_dir = Path::new(matches.get_one::("checksums-dir").unwrap()); - let specific_tool = matches.get_one::("tool"); - let dry_run = matches.get_flag("dry-run"); - - if !checksums_dir.exists() { - anyhow::bail!( - "Checksums directory does not exist: {}", - checksums_dir.display() - ); - } - - let tool_patterns = get_tool_patterns(); - let mut any_updates = false; - - for tool_pattern in tool_patterns { - if let Some(tool_filter) = specific_tool { - if tool_pattern.name != *tool_filter { - continue; - } - } - - match update_tool_checksums(checksums_dir, &tool_pattern, dry_run).await { - Ok(updated) => { - if updated { - any_updates = true; - } - } - Err(e) => { - eprintln!("❌ Failed to update {}: {}", tool_pattern.name, e); - } - } - } - - if any_updates { - println!("\n✅ Tool checksums updated successfully!"); - if !dry_run { - println!("💡 Remember to test the updated checksums and commit the changes."); - } - } else { - println!("\n📅 All tools are up to date."); - } - - Ok(()) -} diff --git a/tools/wizer_initializer/src/main.rs b/tools/wizer_initializer/src/main.rs deleted file mode 100644 index f7616825..00000000 --- a/tools/wizer_initializer/src/main.rs +++ /dev/null @@ -1,186 +0,0 @@ -use anyhow::{Context, Result}; -use clap::Parser; -use std::fs; -use std::path::PathBuf; - -#[derive(Parser, Debug)] -#[command( - name = "wizer_initializer", - about = "WebAssembly pre-initialization using Wizer library", - version -)] -struct Args { - /// Input WebAssembly component file - #[arg(short, long)] - input: PathBuf, - - /// Output pre-initialized WebAssembly component file - #[arg(short, long)] - output: PathBuf, - - /// Name of the initialization function to call - #[arg(long, default_value = "wizer.initialize")] - init_func: String, - - /// Allow WASI calls during initialization - #[arg(long)] - allow_wasi: bool, - - /// Inherit stdio during initialization - #[arg(long)] - inherit_stdio: bool, - - /// Enable verbose output - #[arg(short, long)] - verbose: bool, -} - -fn main() -> Result<()> { - let args = Args::parse(); - - if args.verbose { - eprintln!("Wizer Initializer starting..."); - eprintln!("Input: {:?}", args.input); - eprintln!("Output: {:?}", args.output); - eprintln!("Init function: {}", args.init_func); - } - - // Read the input WebAssembly file - let input_bytes = fs::read(&args.input) - .with_context(|| format!("Failed to read input file: {:?}", args.input))?; - - if args.verbose { - eprintln!("Read {} bytes from input file", input_bytes.len()); - } - - // Check if this is a WebAssembly component or module - let is_component = is_wasm_component(&input_bytes)?; - - if args.verbose { - eprintln!( - "Input is a WebAssembly {}", - if is_component { "component" } else { "module" } - ); - } - - // Extract the core module from the component if needed - let core_module_bytes = if is_component { - if args.verbose { - eprintln!("Extracting core module from component..."); - } - extract_core_module(&input_bytes) - .with_context(|| "Failed to extract core module from component")? - } else { - input_bytes.clone() - }; - - if args.verbose { - eprintln!("Core module size: {} bytes", core_module_bytes.len()); - } - - // Apply Wizer pre-initialization to the core module - if args.verbose { - eprintln!("Running Wizer pre-initialization placeholder..."); - eprintln!("Would call Wizer with init_func: {}", args.init_func); - eprintln!("Would set allow_wasi: {}", args.allow_wasi); - eprintln!("Would set inherit_stdio: {}", args.inherit_stdio); - } - - // PLACEHOLDER: In a full implementation, this would use Wizer library - // let mut wizer = wizer::Wizer::new(); - // wizer.init_func(&args.init_func); - // if args.allow_wasi { wizer.allow_wasi(true); } - // if args.inherit_stdio { wizer.inherit_stdio(true); } - // let initialized_module_bytes = wizer.run(&core_module_bytes)?; - - eprintln!("WARNING: Wizer pre-initialization not yet implemented - returning input as-is"); - let initialized_module_bytes = core_module_bytes; - - if args.verbose { - eprintln!( - "Pre-initialization complete. Output size: {} bytes", - initialized_module_bytes.len() - ); - } - - // If the input was a component, we need to wrap the initialized module back into a component - let final_output_bytes = if is_component { - if args.verbose { - eprintln!("Wrapping initialized module back into component..."); - } - wrap_module_as_component(&initialized_module_bytes) - .with_context(|| "Failed to wrap module as component")? - } else { - initialized_module_bytes - }; - - // Write the output file - fs::write(&args.output, &final_output_bytes) - .with_context(|| format!("Failed to write output file: {:?}", args.output))?; - - if args.verbose { - eprintln!( - "Successfully wrote {} bytes to {:?}", - final_output_bytes.len(), - args.output - ); - } - - println!( - "Pre-initialization complete: {:?} -> {:?}", - args.input, args.output - ); - - Ok(()) -} - -/// Check if the given bytes represent a WebAssembly component (vs module) -fn is_wasm_component(bytes: &[u8]) -> Result { - if bytes.len() < 8 { - return Ok(false); - } - - // Check WebAssembly magic number - if &bytes[0..4] != b"\0asm" { - return Ok(false); - } - - // Check version - components use different version encoding - let version_bytes = &bytes[4..8]; - let version = u32::from_le_bytes([ - version_bytes[0], - version_bytes[1], - version_bytes[2], - version_bytes[3], - ]); - - // Version 0x1000d indicates a component - Ok(version == 0x1000d) -} - -/// Extract the core WebAssembly module from a component -/// This is a simplified implementation - in production, you'd use proper component parsing -fn extract_core_module(component_bytes: &[u8]) -> Result> { - // PLACEHOLDER: In a full implementation, this would use wasm-tools or wasmtime - // to parse the component and extract the core module - - eprintln!("WARNING: Component parsing not yet implemented - using placeholder approach"); - - // For now, just return the input bytes - this demonstrates the architecture - // In production, this would call: - // wasm-tools component wit --core-module - Ok(component_bytes.to_vec()) -} - -/// Wrap a WebAssembly module as a component -/// This is a simplified implementation - in production, you'd use proper component tooling -fn wrap_module_as_component(module_bytes: &[u8]) -> Result> { - // This is a placeholder that would use wasm-tools or similar to wrap - // the module as a component. For now, we'll just return the module. - - // In a full implementation, this would use something like: - // wasm-tools component new -o - - eprintln!("Warning: Component wrapping not yet implemented. Returning module as-is."); - Ok(module_bytes.to_vec()) -} diff --git a/wasm/extensions.bzl b/wasm/extensions.bzl index cd11788b..b4e536de 100644 --- a/wasm/extensions.bzl +++ b/wasm/extensions.bzl @@ -6,7 +6,6 @@ load("//toolchains:tinygo_toolchain.bzl", "tinygo_toolchain_repository") load("//toolchains:wasi_sdk_toolchain.bzl", "wasi_sdk_repository") load("//toolchains:wasm_toolchain.bzl", "wasm_toolchain_repository") load("//toolchains:wasmtime_toolchain.bzl", "wasmtime_repository") -load("//toolchains:wizer_toolchain.bzl", "wizer_toolchain_repository") load("//toolchains:wkg_toolchain.bzl", "wkg_toolchain_repository") load("//wit:wasi_deps.bzl", "wasi_wit_dependencies") @@ -47,20 +46,13 @@ def _wasm_component_bundle_impl(module_ctx): strategy = "download", ) - # Wasmtime runtime + # Wasmtime runtime (includes wizer as of v39.0.0) wasmtime_repository( name = "wasmtime_toolchain", bundle = bundle_name, strategy = "download", ) - # Wizer pre-initialization - wizer_toolchain_repository( - name = "wizer_toolchain", - bundle = bundle_name, - strategy = "download", - ) - # WKG package manager wkg_toolchain_repository( name = "wkg_toolchain", @@ -125,7 +117,7 @@ combinations from checksums/toolchain_bundles.json. Example: wasm_bundle = use_extension("@rules_wasm_component//wasm:extensions.bzl", "wasm_component_bundle") wasm_bundle.configure(bundle = "stable-2025-12") - use_repo(wasm_bundle, "wasm_tools_toolchains", "wasmtime_toolchain", "wizer_toolchain", ...) + use_repo(wasm_bundle, "wasm_tools_toolchains", "wasmtime_toolchain", ...) """, ) @@ -486,55 +478,8 @@ tinygo = module_extension( }, ) -def _wizer_extension_impl(module_ctx): - """Implementation of Wizer module extension""" - - registrations = {} - - # Collect all Wizer registrations - for mod in module_ctx.modules: - for registration in mod.tags.register: - registrations[registration.name] = registration - - # Create Wizer repositories - for name, registration in registrations.items(): - wizer_toolchain_repository( - name = name + "_toolchain", - version = registration.version, - strategy = registration.strategy, - ) - - # If no registrations, create default Wizer toolchain - if not registrations: - wizer_toolchain_repository( - name = "wizer_toolchain", - version = "9.0.0", - strategy = "download", - ) - -# Module extension for Wizer WebAssembly pre-initialization -wizer = module_extension( - implementation = _wizer_extension_impl, - tag_classes = { - "register": tag_class( - attrs = { - "name": attr.string( - doc = "Name for this Wizer registration", - default = "wizer", - ), - "version": attr.string( - doc = "Wizer version to install", - default = "9.0.0", - ), - "strategy": attr.string( - doc = "Installation strategy: 'download' (download prebuilt binary from GitHub releases)", - default = "download", - values = ["download"], - ), - }, - ), - }, -) +# Note: Standalone wizer extension removed - wizer is now part of wasmtime v39.0.0+ +# Use wasmtime extension below and invoke via `wasmtime wizer` subcommand def _wasmtime_extension_impl(module_ctx): """Implementation of Wasmtime module extension""" diff --git a/wasm/wasm_component_wizer.bzl b/wasm/wasm_component_wizer.bzl index ece9afe5..c750f7da 100644 --- a/wasm/wasm_component_wizer.bzl +++ b/wasm/wasm_component_wizer.bzl @@ -1,49 +1,55 @@ -"""Wizer pre-initialization rule for WebAssembly components""" +"""Wizer pre-initialization rule for WebAssembly components. + +As of Wasmtime v39.0.0 (November 2025), the standalone Wizer tool has been +merged upstream into Wasmtime. This rule now uses `wasmtime wizer` subcommand +instead of the standalone wizer binary for better maintenance and component +model support. + +See: https://github.com/bytecodealliance/wasmtime/releases/tag/v39.0.0 +""" def _wasm_component_wizer_impl(ctx): - """Implementation of wasm_component_wizer rule""" + """Implementation of wasm_component_wizer rule using wasmtime wizer subcommand""" - # Get Wizer toolchain - wizer_toolchain = ctx.toolchains["//toolchains:wizer_toolchain_type"] - wizer = wizer_toolchain.wizer + # Get Wasmtime toolchain (wizer is now part of wasmtime) + wasmtime_toolchain = ctx.toolchains["//toolchains:wasmtime_toolchain_type"] + wasmtime = wasmtime_toolchain.wasmtime # Input and output files input_wasm = ctx.file.component output_wasm = ctx.outputs.wizer_component - # Create initialization script if provided - init_script = None - if ctx.attr.init_script: - init_script = ctx.file.init_script - - # Build Wizer command arguments + # Build wasmtime wizer command arguments + # Format: wasmtime wizer [OPTIONS] -o args = ctx.actions.args() + args.add("wizer") # wasmtime subcommand args.add("--allow-wasi") # Allow WASI imports during initialization - args.add("--inherit-stdio", "true") # Inherit stdio for debugging if needed # Add custom initialization function name if specified + # Note: As of wasmtime v39.0.0, the default function name changed from + # "wizer.initialize" to "wizer-initialize" for better component compatibility if ctx.attr.init_function_name: args.add("--init-func", ctx.attr.init_function_name) else: - args.add("--init-func", "wizer.initialize") # Default function name + args.add("--init-func", "wizer-initialize") # New default function name - # Add input and output files + # Add output file args.add("-o", output_wasm.path) + + # Add input file args.add(input_wasm.path) # Create action inputs list inputs = [input_wasm] - if init_script: - inputs.append(init_script) - # Run Wizer pre-initialization + # Run wasmtime wizer pre-initialization ctx.actions.run( - executable = wizer, + executable = wasmtime, arguments = [args], inputs = inputs, outputs = [output_wasm], - mnemonic = "WizerPreInit", - progress_message = "Pre-initializing WebAssembly component with Wizer: {}".format( + mnemonic = "WasmtimeWizer", + progress_message = "Pre-initializing WebAssembly component with wasmtime wizer: {}".format( input_wasm.short_path, ), use_default_shell_env = False, @@ -72,32 +78,35 @@ wasm_component_wizer = rule( doc = "Input WebAssembly component to pre-initialize", ), "init_function_name": attr.string( - default = "wizer.initialize", - doc = "Name of the initialization function to call (default: wizer.initialize)", - ), - "init_script": attr.label( - allow_single_file = True, - doc = "Optional initialization script or data file", + default = "wizer-initialize", + doc = "Name of the initialization function to call (default: wizer-initialize). " + + "Note: Prior to wasmtime v39.0.0, the default was 'wizer.initialize'.", ), }, outputs = { "wizer_component": "%{name}_wizer.wasm", }, - toolchains = ["//toolchains:wizer_toolchain_type"], - doc = """Pre-initialize a WebAssembly component with Wizer. + toolchains = ["//toolchains:wasmtime_toolchain_type"], + doc = """Pre-initialize a WebAssembly component with wasmtime wizer. This rule takes a WebAssembly component and runs Wizer pre-initialization on it, which can provide 1.35-6x startup performance improvements by running initialization code at build time rather than runtime. - The input component must export a function named 'wizer.initialize' (or the name + As of Wasmtime v39.0.0 (November 2025), the standalone Wizer tool has been merged + upstream into Wasmtime. This rule uses the `wasmtime wizer` subcommand. + + The input component must export a function named 'wizer-initialize' (or the name specified in init_function_name) that performs the initialization work. + Note: The default init function name changed from 'wizer.initialize' to + 'wizer-initialize' in wasmtime v39.0.0 for better component model compatibility. + Example: wasm_component_wizer( name = "optimized_component", component = ":my_component", - init_function_name = "wizer.initialize", + init_function_name = "wizer-initialize", ) """, ) @@ -116,33 +125,35 @@ def _wizer_chain_impl(ctx): component_file = original_files[0] - # Get Wizer initializer tool (handles Component → Module → Wizer → Component) - wizer_initializer = ctx.executable._wizer_initializer + # Get Wasmtime toolchain (wizer is now part of wasmtime as of v39.0.0) + wasmtime_toolchain = ctx.toolchains["//toolchains:wasmtime_toolchain_type"] + wasmtime = wasmtime_toolchain.wasmtime # Output file output_wasm = ctx.outputs.wizer_component - # Build Wizer initializer arguments + # Build wasmtime wizer arguments args = ctx.actions.args() - args.add("--input", component_file.path) - args.add("--output", output_wasm.path) + args.add("wizer") # wasmtime subcommand args.add("--allow-wasi") - args.add("--inherit-stdio") - args.add("--verbose") if ctx.attr.init_function_name: args.add("--init-func", ctx.attr.init_function_name) else: - args.add("--init-func", "wizer_initialize") + args.add("--init-func", "wizer-initialize") + + # Add output and input + args.add("-o", output_wasm.path) + args.add(component_file.path) - # Run Wizer initializer (Component → Module → Wizer → Component) + # Run wasmtime wizer ctx.actions.run( - executable = wizer_initializer, + executable = wasmtime, arguments = [args], inputs = [component_file], outputs = [output_wasm], - mnemonic = "WizerChain", - progress_message = "Wizer pre-initializing component (via initializer): {}".format(ctx.label.name), + mnemonic = "WasmtimeWizerChain", + progress_message = "Wizer pre-initializing component: {}".format(ctx.label.name), use_default_shell_env = False, env = {"RUST_BACKTRACE": "1"}, ) @@ -162,23 +173,21 @@ wizer_chain = rule( doc = "WebAssembly component target to pre-initialize", ), "init_function_name": attr.string( - default = "wizer_initialize", - doc = "Name of the initialization function", - ), - "_wizer_initializer": attr.label( - default = "//tools/wizer_initializer:wizer_initializer", - executable = True, - cfg = "exec", - doc = "Wizer initializer tool for Component → Module → Wizer → Component workflow", + default = "wizer-initialize", + doc = "Name of the initialization function (default: wizer-initialize)", ), }, outputs = { "wizer_component": "%{name}_wizer.wasm", }, + toolchains = ["//toolchains:wasmtime_toolchain_type"], doc = """Chain Wizer pre-initialization after an existing component rule. This is a convenience rule that takes the output of another component-building - rule and applies Wizer pre-initialization to it. + rule and applies Wizer pre-initialization to it using wasmtime wizer. + + As of Wasmtime v39.0.0 (November 2025), the standalone Wizer tool has been merged + upstream into Wasmtime. This rule uses the `wasmtime wizer` subcommand. Example: go_wasm_component( diff --git a/wasm/wasm_component_wizer_library.bzl b/wasm/wasm_component_wizer_library.bzl index 4b080ea6..719c22a5 100644 --- a/wasm/wasm_component_wizer_library.bzl +++ b/wasm/wasm_component_wizer_library.bzl @@ -1,35 +1,43 @@ -"""Wizer library-based pre-initialization rule for WebAssembly components""" +"""Wizer pre-initialization rule for WebAssembly components. + +As of Wasmtime v39.0.0 (November 2025), the standalone Wizer tool has been +merged upstream into Wasmtime. This rule uses `wasmtime wizer` subcommand +for proper component model support. + +See: https://github.com/bytecodealliance/wasmtime/releases/tag/v39.0.0 +""" def _wasm_component_wizer_library_impl(ctx): - """Implementation using Wizer library for proper component model support""" + """Implementation using wasmtime wizer for proper component model support""" # Input and output files input_wasm = ctx.file.component output_wasm = ctx.outputs.wizer_component - # Get the wizer_initializer tool - wizer_initializer = ctx.executable._wizer_initializer + # Get Wasmtime toolchain (wizer is now part of wasmtime as of v39.0.0) + wasmtime_toolchain = ctx.toolchains["//toolchains:wasmtime_toolchain_type"] + wasmtime = wasmtime_toolchain.wasmtime - # Build command arguments + # Build wasmtime wizer command arguments args = ctx.actions.args() - args.add("--input", input_wasm) - args.add("--output", output_wasm) + args.add("wizer") # wasmtime subcommand args.add("--init-func", ctx.attr.init_function_name) if ctx.attr.allow_wasi: args.add("--allow-wasi") - if ctx.attr.verbose: - args.add("--verbose") + # Add output and input + args.add("-o", output_wasm.path) + args.add(input_wasm.path) - # Run the wizer library initializer + # Run wasmtime wizer ctx.actions.run( - executable = wizer_initializer, + executable = wasmtime, arguments = [args], inputs = [input_wasm], outputs = [output_wasm], - mnemonic = "WizerLibraryInit", - progress_message = "Pre-initializing WebAssembly component with Wizer library: {}".format( + mnemonic = "WasmtimeWizerLib", + progress_message = "Pre-initializing WebAssembly component with wasmtime wizer: {}".format( input_wasm.short_path, ), use_default_shell_env = False, @@ -58,8 +66,9 @@ wasm_component_wizer_library = rule( doc = "Input WebAssembly component to pre-initialize", ), "init_function_name": attr.string( - default = "wizer.initialize", - doc = "Name of the initialization function to call (default: wizer.initialize)", + default = "wizer-initialize", + doc = "Name of the initialization function to call (default: wizer-initialize). " + + "Note: Prior to wasmtime v39.0.0, the default was 'wizer.initialize'.", ), "allow_wasi": attr.bool( default = True, @@ -67,34 +76,32 @@ wasm_component_wizer_library = rule( ), "verbose": attr.bool( default = False, - doc = "Enable verbose output", - ), - "_wizer_initializer": attr.label( - default = "//tools/wizer_initializer:wizer_initializer", - executable = True, - cfg = "exec", + doc = "Enable verbose output (currently unused, kept for API compatibility)", ), }, outputs = { "wizer_component": "%{name}_wizer.wasm", }, - doc = """Pre-initialize a WebAssembly component using Wizer library. + toolchains = ["//toolchains:wasmtime_toolchain_type"], + doc = """Pre-initialize a WebAssembly component using wasmtime wizer. - This rule uses Wizer as a library (rather than CLI tool) to properly handle - WebAssembly components. The workflow is: + This rule uses wasmtime's built-in wizer subcommand to properly handle + WebAssembly components with full component model support. - 1. Parse component to extract core module - 2. Apply Wizer pre-initialization to the core module - 3. Wrap the initialized module back as a component + As of Wasmtime v39.0.0 (November 2025), the standalone Wizer tool has been + merged upstream into Wasmtime, providing better maintenance and integration. This approach provides proper component model support and integrates well with Wasmtime runtime for initialization. + Note: The default init function name changed from 'wizer.initialize' to + 'wizer-initialize' in wasmtime v39.0.0 for better component model compatibility. + Example: wasm_component_wizer_library( name = "optimized_component", component = ":my_component", - init_function_name = "wizer.initialize", + init_function_name = "wizer-initialize", allow_wasi = True, ) """,