diff --git a/index.ts b/.SRCINFO similarity index 100% rename from index.ts rename to .SRCINFO diff --git a/.cargo/config.toml b/.cargo/config.toml deleted file mode 100644 index be5f3f9..0000000 --- a/.cargo/config.toml +++ /dev/null @@ -1,3 +0,0 @@ -[alias] -bin = ["run", "--package", "cargo-bin", "--"] -watch = ["bin", "cargo-watch"] diff --git a/.github/DISCUSSION_TEMPLATE/ideas.md b/.github/DISCUSSION_TEMPLATE/ideas.md new file mode 100644 index 0000000..566f827 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/ideas.md @@ -0,0 +1,16 @@ +--- +title: "[Idea] " +labels: discussion +--- + +## Summary +Briefly describe your idea. + +## Problem +What problem does this solve? + +## Proposed Solution +What’s your suggested approach? + +## Benefits +Why should this be considered? diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index a9d61d2..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: Bug report -about: Create a bug report to help us improve -title: "[Bug]" -labels: '' -assignees: ErenayDev - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**OS Information (please complete the following information):** - - OS: [MacOS, Linux (Give distro if its neccessary), Windows] - - Version [e.g. 0.1.0] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000..c0e9037 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,98 @@ +name: Bug Report +description: Report a bug in the system +title: "[Bug]: " +labels: ["bug"] +assignees: + - ErenayDev +body: + - type: markdown + attributes: + value: | + Please provide detailed information about the bug to help us resolve it quickly. + + - type: textarea + id: description + attributes: + label: Bug Description + description: A clear and concise description of the bug. + placeholder: Describe what happened... + validations: + required: true + + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to Reproduce + description: List the steps to reproduce the behavior. + placeholder: | + 1. Go to '...' + 2. Click on '...' + 3. See error + validations: + required: true + + - type: textarea + id: expected-behavior + attributes: + label: Expected Behavior + description: What did you expect to happen? + placeholder: Explain what you expected to happen... + validations: + required: true + + - type: dropdown + id: operating-system + attributes: + label: Operating System + description: What OS are you using? + options: + - Windows 10 + - Windows 11 + - macOS + - Linux (Ubuntu) + - Linux (Fedora) + - Linux (Arch) + - Linux (Other) + - Other + validations: + required: true + + - type: input + id: version + attributes: + label: Version + description: What version of the software are you running? + placeholder: e.g., 1.1.0 + validations: + required: true + + - type: dropdown + id: browsers + attributes: + label: Browser (if applicable) + description: Which browser are you using? + multiple: true + options: + - Chrome + - Firefox + - Safari + - Edge + - Opera + - Other + + - type: textarea + id: additional-context + attributes: + label: Additional Context + description: Add any other context, screenshots, or logs about the problem. + placeholder: Include screenshots, error messages, or any other relevant information... + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I have searched existing issues to avoid duplicates + required: true + - label: I have provided all required information + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..6d17197 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Security Issues + url: https://github.com/ErenayDev/checkpoint-ts/security/advisories/new + about: Report security vulnerabilities privately + - name: Discussions + url: https://github.com/ErenayDev/checkpoint-ts/discussions + about: Ask questions and discuss ideas diff --git a/.github/ISSUE_TEMPLATE/documentation.yaml b/.github/ISSUE_TEMPLATE/documentation.yaml new file mode 100644 index 0000000..1544889 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.yaml @@ -0,0 +1,82 @@ +name: Documentation Update +description: Suggest updates or additions to documentation +title: "[Docs]: " +labels: ["documentation", "improvement"] +assignees: [] +body: + - type: markdown + attributes: + value: | + Help us improve our documentation by suggesting updates or additions. + + - type: dropdown + id: doc-type + attributes: + label: Documentation Type + description: What type of documentation needs updating? + options: + - README + - API Documentation + - Installation Guide + - User Guide + - Developer Guide + - Code Comments + - Other + validations: + required: true + + - type: textarea + id: current-issue + attributes: + label: Current Issue + description: What's wrong with the current documentation? + placeholder: Describe what's missing, outdated, or unclear... + validations: + required: true + + - type: textarea + id: suggested-changes + attributes: + label: Suggested Changes + description: What changes would you like to see? + placeholder: Provide detailed description of the changes... + validations: + required: true + + - type: input + id: affected-sections + attributes: + label: Affected Sections + description: Which sections or files need updating? + placeholder: e.g., README.md section 3, API endpoint /users + + - type: dropdown + id: urgency + attributes: + label: Urgency + description: How urgent is this documentation update? + options: + - Low - Nice to have + - Medium - Should be updated soon + - High - Needs immediate attention + - Critical - Blocking users + default: 1 + validations: + required: true + + - type: textarea + id: additional-resources + attributes: + label: Additional Resources + description: Any related links, examples, or resources? + placeholder: Include any relevant links, examples, or references... + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I have checked the current documentation + required: true + - label: I have searched for existing documentation issues + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 6a1f988..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: "[Feature]" -labels: '' -assignees: ErenayDev - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 0000000..d28e6a7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,76 @@ +name: Feature Request +description: Suggest a new feature or improvement +title: "[Feature]: " +labels: ["enhancement", "feature-request"] +assignees: + - ErenayDev +body: + - type: markdown + attributes: + value: | + Thank you for suggesting a new feature! Please provide as much detail as possible. + + - type: textarea + id: feature-description + attributes: + label: Feature Description + description: What feature would you like to see? + placeholder: Describe the feature you'd like to request... + validations: + required: true + + - type: textarea + id: problem-statement + attributes: + label: Problem Statement + description: What problem does this feature solve? + placeholder: Explain the problem or need for this feature... + validations: + required: true + + - type: textarea + id: proposed-solution + attributes: + label: Proposed Solution + description: How should this feature work? + placeholder: Describe how this feature could be implemented... + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternative Solutions + description: Have you considered any alternative solutions? + placeholder: Describe any alternative solutions you've considered... + + - type: dropdown + id: priority + attributes: + label: Priority + description: How important is this feature to you? + options: + - Low + - Medium + - High + - Critical + default: 1 + validations: + required: true + + - type: textarea + id: additional-context + attributes: + label: Additional Context + description: Add any other context, screenshots, mockups, or resources. + placeholder: Include any relevant screenshots, links, or resources... + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I have searched existing issues to avoid duplicates + required: true + - label: This feature aligns with the project's goals + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..342f38c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ +## Description +Explain the changes you made and why. + +Fixes # (issue number) + +## Type of Change +- [ ] Bug fix +- [ ] New feature +- [ ] Documentation update + +## Checklist +- [ ] Code follows project guidelines +- [ ] Tests added/updated +- [ ] Documentation updated diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f74b904..4f7f524 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ concurrency: jobs: fmt: name: fmt - runs-on: ubuntu-latest + runs-on: self-hosted steps: - name: Checkout uses: actions/checkout@v5 @@ -37,7 +37,7 @@ jobs: run: cargo fmt -- --check clippy: name: clippy - runs-on: ubuntu-latest + runs-on: self-hosted permissions: contents: read checks: write @@ -54,7 +54,7 @@ jobs: uses: clechasseur/rs-clippy-check@v5 doc: name: doc - runs-on: ubuntu-latest + runs-on: self-hosted steps: - uses: actions/checkout@v5 - name: Install Rust nightly diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 0ab93e6..031caf2 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -8,7 +8,7 @@ on: jobs: coverage: - runs-on: ubuntu-latest + runs-on: self-hosted steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..3dfcda0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,296 @@ +# This file was autogenerated by dist: https://axodotdev.github.io/cargo-dist +# +# Copyright 2022-2024, axodotdev +# SPDX-License-Identifier: MIT or Apache-2.0 +# +# CI that: +# +# * checks for a Git Tag that looks like a release +# * builds artifacts with dist (archives, installers, hashes) +# * uploads those artifacts to temporary workflow zip +# * on success, uploads the artifacts to a GitHub Release +# +# Note that the GitHub Release will be created with a generated +# title/body based on your changelogs. + +name: Release +permissions: + "contents": "write" + +# This task will run whenever you push a git tag that looks like a version +# like "1.0.0", "v0.1.0-prerelease.1", "my-app/0.1.0", "releases/v1.0.0", etc. +# Various formats will be parsed into a VERSION and an optional PACKAGE_NAME, where +# PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION +# must be a Cargo-style SemVer Version (must have at least major.minor.patch). +# +# If PACKAGE_NAME is specified, then the announcement will be for that +# package (erroring out if it doesn't have the given version or isn't dist-able). +# +# If PACKAGE_NAME isn't specified, then the announcement will be for all +# (dist-able) packages in the workspace with that version (this mode is +# intended for workspaces with only one dist-able package, or with all dist-able +# packages versioned/released in lockstep). +# +# If you push multiple tags at once, separate instances of this workflow will +# spin up, creating an independent announcement for each one. However, GitHub +# will hard limit this to 3 tags per commit, as it will assume more tags is a +# mistake. +# +# If there's a prerelease-style suffix to the version, then the release(s) +# will be marked as a prerelease. +on: + pull_request: + push: + tags: + - '**[0-9]+.[0-9]+.[0-9]+*' + +jobs: + # Run 'dist plan' (or host) to determine what tasks we need to do + plan: + runs-on: self-hosted + outputs: + val: ${{ steps.plan.outputs.manifest }} + tag: ${{ !github.event.pull_request && github.ref_name || '' }} + tag-flag: ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }} + publishing: ${{ !github.event.pull_request }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive + - name: Install dist + # we specify bash to get pipefail; it guards against the `curl` command + # failing. otherwise `sh` won't catch that `curl` returned non-0 + shell: bash + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.31.0/cargo-dist-installer.sh | sh" + - name: Cache dist + uses: actions/upload-artifact@v6 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/dist + # sure would be cool if github gave us proper conditionals... + # so here's a doubly-nested ternary-via-truthiness to try to provide the best possible + # functionality based on whether this is a pull_request, and whether it's from a fork. + # (PRs run on the *source* but secrets are usually on the *target* -- that's *good* + # but also really annoying to build CI around when it needs secrets to work right.) + - id: plan + run: | + dist ${{ (!github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name)) || 'plan' }} --output-format=json > plan-dist-manifest.json + echo "dist ran successfully" + cat plan-dist-manifest.json + echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT" + - name: "Upload dist-manifest.json" + uses: actions/upload-artifact@v6 + with: + name: artifacts-plan-dist-manifest + path: plan-dist-manifest.json + + # Build and packages all the platform-specific things + build-local-artifacts: + name: build-local-artifacts (${{ join(matrix.targets, ', ') }}) + # Let the initial task tell us to not run (currently very blunt) + needs: + - plan + if: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix.include != null && (needs.plan.outputs.publishing == 'true' || fromJson(needs.plan.outputs.val).ci.github.pr_run_mode == 'upload') }} + strategy: + fail-fast: false + # Target platforms/runners are computed by dist in create-release. + # Each member of the matrix has the following arguments: + # + # - runner: the github runner + # - dist-args: cli flags to pass to dist + # - install-dist: expression to run to install dist on the runner + # + # Typically there will be: + # - 1 "global" task that builds universal installers + # - N "local" tasks that build each platform's binaries and platform-specific installers + matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }} + runs-on: ${{ matrix.runner }} + container: ${{ matrix.container && matrix.container.image || null }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json + steps: + - name: enable windows longpaths + run: | + git config --global core.longpaths true + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive + - name: Install Rust non-interactively if not already installed + if: ${{ matrix.container }} + run: | + if ! command -v cargo > /dev/null 2>&1; then + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + echo "$HOME/.cargo/bin" >> $GITHUB_PATH + fi + - name: Install dist + run: ${{ matrix.install_dist.run }} + # Get the dist-manifest + - name: Fetch local artifacts + uses: actions/download-artifact@v7 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - name: Install dependencies + run: | + ${{ matrix.packages_install }} + - name: Build artifacts + run: | + # Actually do builds and make zips and whatnot + dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json + echo "dist ran successfully" + - id: cargo-dist + name: Post-build + # We force bash here just because github makes it really hard to get values up + # to "real" actions without writing to env-vars, and writing to env-vars has + # inconsistent syntax between shell and powershell. + shell: bash + run: | + # Parse out what we just built and upload it to scratch storage + echo "paths<> "$GITHUB_OUTPUT" + dist print-upload-files-from-manifest --manifest dist-manifest.json >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + cp dist-manifest.json "$BUILD_MANIFEST_NAME" + - name: "Upload artifacts" + uses: actions/upload-artifact@v6 + with: + name: artifacts-build-local-${{ join(matrix.targets, '_') }} + path: | + ${{ steps.cargo-dist.outputs.paths }} + ${{ env.BUILD_MANIFEST_NAME }} + + # Build and package all the platform-agnostic(ish) things + build-global-artifacts: + needs: + - plan + - build-local-artifacts + runs-on: self-hosted + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive + - name: Install cached dist + uses: actions/download-artifact@v7 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/ + - run: chmod +x ~/.cargo/bin/dist + # Get all the local artifacts for the global tasks to use (for e.g. checksums) + - name: Fetch local artifacts + uses: actions/download-artifact@v7 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - id: cargo-dist + shell: bash + run: | + dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json + echo "dist ran successfully" + + # Parse out what we just built and upload it to scratch storage + echo "paths<> "$GITHUB_OUTPUT" + jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + + cp dist-manifest.json "$BUILD_MANIFEST_NAME" + - name: "Upload artifacts" + uses: actions/upload-artifact@v6 + with: + name: artifacts-build-global + path: | + ${{ steps.cargo-dist.outputs.paths }} + ${{ env.BUILD_MANIFEST_NAME }} + # Determines if we should publish/announce + host: + needs: + - plan + - build-local-artifacts + - build-global-artifacts + # Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine) + if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + runs-on: self-hosted + outputs: + val: ${{ steps.host.outputs.manifest }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive + - name: Install cached dist + uses: actions/download-artifact@v7 + with: + name: cargo-dist-cache + path: ~/.cargo/bin/ + - run: chmod +x ~/.cargo/bin/dist + # Fetch artifacts from scratch-storage + - name: Fetch artifacts + uses: actions/download-artifact@v7 + with: + pattern: artifacts-* + path: target/distrib/ + merge-multiple: true + - id: host + shell: bash + run: | + dist host ${{ needs.plan.outputs.tag-flag }} --steps=upload --steps=release --output-format=json > dist-manifest.json + echo "artifacts uploaded and released successfully" + cat dist-manifest.json + echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT" + - name: "Upload dist-manifest.json" + uses: actions/upload-artifact@v6 + with: + # Overwrite the previous copy + name: artifacts-dist-manifest + path: dist-manifest.json + # Create a GitHub Release while uploading all files to it + - name: "Download GitHub Artifacts" + uses: actions/download-artifact@v7 + with: + pattern: artifacts-* + path: artifacts + merge-multiple: true + - name: Cleanup + run: | + # Remove the granular manifests + rm -f artifacts/*-dist-manifest.json + - name: Create GitHub Release + env: + PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--prerelease' || '' }}" + ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}" + ANNOUNCEMENT_BODY: "${{ fromJson(steps.host.outputs.manifest).announcement_github_body }}" + RELEASE_COMMIT: "${{ github.sha }}" + run: | + # Write and read notes from a file to avoid quoting breaking things + echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt + + gh release create "${{ needs.plan.outputs.tag }}" --target "$RELEASE_COMMIT" $PRERELEASE_FLAG --title "$ANNOUNCEMENT_TITLE" --notes-file "$RUNNER_TEMP/notes.txt" artifacts/* + + announce: + needs: + - plan + - host + # use "always() && ..." to allow us to wait for all publish jobs while + # still allowing individual publish jobs to skip themselves (for prereleases). + # "host" however must run to completion, no skipping allowed! + if: ${{ always() && needs.host.result == 'success' }} + runs-on: self-hosted + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + submodules: recursive diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml new file mode 100644 index 0000000..1094037 --- /dev/null +++ b/.github/workflows/web.yml @@ -0,0 +1,99 @@ +# Workflow to build your docs with oranda (and mdbook) +# and deploy them to Github Pages +name: Web + +# We're going to push to the gh-pages branch, so we need that permission +permissions: + contents: write + +# What situations do we want to build docs in? +# All of these work independently and can be removed / commented out +# if you don't want oranda/mdbook running in that situation +on: + # Check that a PR didn't break docs! + # + # Note that the "Deploy to Github Pages" step won't run in this mode, + # so this won't have any side-effects. But it will tell you if a PR + # completely broke oranda/mdbook. Sadly we don't provide previews (yet)! + pull_request: + + # Whenever something gets pushed to main, update the docs! + # This is great for getting docs changes live without cutting a full release. + # + # Note that if you're using cargo-dist, this will "race" the Release workflow + # that actually builds the Github Release that oranda tries to read (and + # this will almost certainly complete first). As a result you will publish + # docs for the latest commit but the oranda landing page won't know about + # the latest release. The workflow_run trigger below will properly wait for + # cargo-dist, and so this half-published state will only last for ~10 minutes. + # + # If you only want docs to update with releases, disable this, or change it to + # a "release" branch. You can, of course, also manually trigger a workflow run + # when you want the docs to update. + push: + branches: + - main + + # Whenever a workflow called "Release" completes, update the docs! + # + # If you're using cargo-dist, this is recommended, as it will ensure that + # oranda always sees the latest release right when it's available. Note + # however that Github's UI is wonky when you use workflow_run, and won't + # show this workflow as part of any commit. You have to go to the "actions" + # tab for your repo to see this one running (the gh-pages deploy will also + # only show up there). + workflow_run: + workflows: [ "Release" ] + types: + - completed + +# Alright, let's do it! +jobs: + web: + name: Build and deploy site and docs + runs-on: self-hosted + steps: + # Setup + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dtolnay/rust-toolchain@stable + - uses: swatinem/rust-cache@v2 + + # If you use any mdbook plugins, here's the place to install them! + + # Install and run oranda (and mdbook)! + # + # This will write all output to ./public/ (including copying mdbook's output to there). + - name: Install and run oranda + run: | + curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/oranda/releases/latest/download/oranda-installer.sh | sh + oranda build + + - name: Prepare HTML for link checking + # untitaker/hyperlink supports no site prefixes, move entire site into + # a subfolder + run: mkdir /tmp/public/ && cp -R public /tmp/public/oranda + + - name: Check HTML for broken internal links + uses: untitaker/hyperlink@0.1.29 + with: + args: /tmp/public/ + + # Deploy to our gh-pages branch (creating it if it doesn't exist). + # The "public" dir that oranda made above will become the root dir + # of this branch. + # + # Note that once the gh-pages branch exists, you must + # go into repo's settings > pages and set "deploy from branch: gh-pages". + # The other defaults work fine. + - name: Deploy to Github Pages + uses: JamesIves/github-pages-deploy-action@v4.4.1 + # ONLY if we're on main (so no PRs or feature branches allowed!) + if: ${{ github.ref == 'refs/heads/main' }} + with: + branch: gh-pages + # Gotta tell the action where to find oranda's output + folder: public + token: ${{ secrets.GITHUB_TOKEN }} + single-commit: true diff --git a/.gitignore b/.gitignore index f2f1649..d21a424 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,9 @@ target ## Cargo-run-bin specific .bin/ + +## Generated folder by Node +node_modules + +## Oranda output +public diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5842937..503e49b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ repos: rev: v4.4.0 hooks: - id: trailing-whitespace - - id: end-of-file-fixer +# - id: end-of-file-fixer - id: check-merge-conflict - repo: https://github.com/doublify/pre-commit-rust diff --git a/CHANGELOG.md b/CHANGELOG.md index 12511b0..6b41175 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,62 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.1.2] - 20 November 2025 +## [0.1.3] - 27 February 2026 + +### βš™οΈ Miscellaneous Tasks + +- **tooling**: Remove cargo-bin wrapper and custom aliases + +- Remove root-level test artifacts + +- **github**: Update PR template location + +- **config**: Add node_modules to gitignore + +- **pre-commit**: Disable end-of-file-fixer hook + +- Add .checkpoint to gitignore + +- Add oranda output to gitignore + +- Add project metadata and distribution config + +- Remove tracked .checkpoint artifacts + +### πŸ—οΈ Build System + +- Bump workspace to v0.1.3, update swc_core and throbber-widgets-tui deps, add dist profile + +### πŸ‘· CI/CD + +- Switch runners from ubuntu-latest to self-hosted + +- Add release and web workflows + +### πŸ“š Documentation + +- Update CHANGELOG for v0.1.2 + +- Rewrite README with simplified structure and sponsor section + +- Add installation and release documentation + +- Add crate-level READMEs + +### πŸš€ Features + +- **github**: Add issue and PR templates + +- **runtime**: Add shared memory IPC runtime and examples + +### 🚜 Refactor + +- **workspace**: Migrate to multi-crate workspace structure + +- **core**: Remove old monolithic source structure + +- Replace strip_type with typescript transform using GLOBALS context +---## [0.1.2] - 20 November 2025 ### βš™οΈ Miscellaneous Tasks @@ -17,8 +72,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### πŸ‘· CI/CD -- Added linux environment - - Configure openssl for windows - Add path filters to optimize workflow triggers @@ -29,12 +82,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### πŸš€ Features -- Updated dashboard layout - -- Added variable editor skeleton - -- Added keymap controls for TUI switching - - Added git-cliff for keeping changelogs - **profiler**: Implement performance profiler scene @@ -52,4 +99,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **app**: Extract keyboard handling and improve state management - **variable_editor**: Remove unnecessary references +---## [0.1.1] - 17 November 2025 + +### πŸ‘· CI/CD + +- Added linux environment + +### πŸš€ Features + +- Updated dashboard layout + +- Added variable editor skeleton + +- Added keymap controls for TUI switching + +### 🚜 Refactor + +- Cargo fmt linting fix + +- Cargo fmt linting fix --- diff --git a/Cargo.lock b/Cargo.lock index 0866154..811e453 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,27 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -32,6 +53,15 @@ dependencies = [ "libc", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anstream" version = "0.6.21" @@ -88,6 +118,41 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "ar_archive_writer" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a" +dependencies = [ + "object 0.32.2", +] + +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + +[[package]] +name = "ast_node" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb025ef00a6da925cf40870b9c8d008526b6004ece399cb0974209720f0b194" +dependencies = [ + "quote", + "swc_macros_common", + "syn 2.0.114", +] + +[[package]] +name = "atomic" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +dependencies = [ + "bytemuck", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -104,22 +169,98 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.37.3", "rustc-demangle", "windows-link", ] +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "better_scoped_tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd228125315b132eed175bf47619ac79b945b26e56b848ba203ae4ea8603609" +dependencies = [ + "scoped-tls", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "bytemuck" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "bytes" @@ -128,34 +269,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] -name = "cargo-bin" -version = "0.1.0" +name = "bytes-str" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c60b5ce37e0b883c37eb89f79a1e26fbe9c1081945d024eee93e8d91a7e18b3" dependencies = [ - "cargo-run-bin", + "bytes", + "serde", ] [[package]] -name = "cargo-run-bin" -version = "1.7.5" +name = "camino" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba4ea665f68a2042470ec6e27a36755783ebd3367b90bec2fb100f9d5012fd8" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ - "anyhow", - "cfg-if", - "clap", - "rustversion", "serde", - "toml", - "toml_edit", - "version_check", - "which", ] [[package]] -name = "cassowary" -version = "0.3.0" +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.17", +] [[package]] name = "castaway" @@ -168,9 +335,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.46" +version = "1.2.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ "find-msvc-tools", "shlex", @@ -182,48 +349,82 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "checkpoint-parser" +version = "0.1.3" +dependencies = [ + "checkpoint-shared", + "serde", + "serde_json", + "swc_core", +] + +[[package]] +name = "checkpoint-shared" +version = "0.1.3" +dependencies = [ + "serde", + "serde_json", + "shared_memory", +] + [[package]] name = "checkpoint-ts" -version = "0.1.2" +version = "0.1.3" dependencies = [ + "checkpoint-parser", + "checkpoint-shared", "chrono", + "clap", "color-eyre", - "crossterm 0.29.0", + "crossterm", + "dirs", "futures", "ratatui", "serde", "serde_json", + "sha2", + "thiserror 2.0.17", "throbber-widgets-tui", "tokio", + "walkdir", ] [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] [[package]] name = "clap" -version = "4.5.51" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", + "clap_derive", ] [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ "anstream", "anstyle", @@ -231,11 +432,23 @@ dependencies = [ "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 2.0.114", +] + [[package]] name = "clap_lex" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] name = "color-eyre" @@ -272,9 +485,22 @@ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "compact_str" -version = "0.8.1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "ryu", + "static_assertions", +] + +[[package]] +name = "compact_str" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" dependencies = [ "castaway", "cfg-if", @@ -286,9 +512,9 @@ dependencies = [ [[package]] name = "convert_case" -version = "0.7.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ "unicode-segmentation", ] @@ -300,19 +526,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "crossterm" -version = "0.28.1" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "bitflags", - "crossterm_winapi", - "mio", - "parking_lot", - "rustix 0.38.44", - "signal-hook", - "signal-hook-mio", - "winapi", + "libc", ] [[package]] @@ -321,14 +540,14 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags", + "bitflags 2.10.0", "crossterm_winapi", "derive_more", "document-features", "futures-core", "mio", "parking_lot", - "rustix 1.1.2", + "rustix", "signal-hook", "signal-hook-mio", "winapi", @@ -343,14 +562,44 @@ dependencies = [ "winapi", ] +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csscolorparser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" +dependencies = [ + "lab", + "phf", +] + [[package]] name = "darling" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -364,7 +613,20 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.114", ] [[package]] @@ -373,101 +635,308 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", "quote", - "syn", + "syn 2.0.114", ] [[package]] -name = "derive_more" -version = "2.0.1" +name = "darling_macro" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "derive_more-impl", + "darling_core 0.23.0", + "quote", + "syn 2.0.114", ] [[package]] -name = "derive_more-impl" -version = "2.0.1" +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "debugid" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn", + "serde", + "uuid", ] [[package]] -name = "document-features" -version = "0.2.12" +name = "deltae" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ - "litrs", + "powerfmt", ] [[package]] -name = "either" -version = "1.15.0" +name = "derive_builder" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] [[package]] -name = "equivalent" -version = "1.0.2" +name = "derive_builder_core" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.114", +] [[package]] -name = "errno" -version = "0.3.14" +name = "derive_builder_macro" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ - "libc", - "windows-sys 0.61.2", + "derive_builder_core", + "syn 2.0.114", ] [[package]] -name = "eyre" -version = "0.6.12" +name = "derive_more" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ - "indenter", - "once_cell", + "derive_more-impl", ] [[package]] -name = "find-msvc-tools" -version = "0.1.5" +name = "derive_more-impl" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.114", +] [[package]] -name = "fnv" -version = "1.0.7" +name = "diff" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] -name = "foldhash" -version = "0.1.5" +name = "difference" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" [[package]] -name = "futures" -version = "0.3.31" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dragonbox_ecma" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd8e701084c37e7ef62d3f9e453b618130cbc0ef3573847785952a3ac3f746bf" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fancy-regex" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" +dependencies = [ + "bit-set", + "regex", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "filedescriptor" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +dependencies = [ + "libc", + "thiserror 1.0.69", + "winapi", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" + +[[package]] +name = "finl_unicode" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "from_variant" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ff35a391aef949120a0340d690269b3d9f63460a6106e99bd07b961f345ea9" +dependencies = [ + "swc_macros_common", + "syn 2.0.114", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[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", @@ -514,7 +983,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -547,28 +1016,71 @@ dependencies = [ "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", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + [[package]] name = "gimli" version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ + "ahash", "allocator-api2", - "equivalent", - "foldhash", ] [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -577,12 +1089,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "home" -version = "0.5.12" +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hstr" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +checksum = "faa57007c3c9dab34df2fa4c1fb52fe9c34ec5a27ed9d8edea53254b50cd7887" dependencies = [ - "windows-sys 0.61.2", + "hashbrown 0.14.5", + "new_debug_unreachable", + "once_cell", + "rustc-hash", + "serde", + "triomphe", ] [[package]] @@ -609,12 +1138,120 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +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 = "if_chain" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd62e6b5e86ea8eeeb8db1de02880a6abc01a397b2ebb64b5d74ac255318f5cb" + [[package]] name = "indenter" version = "0.3.4" @@ -623,12 +1260,12 @@ checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" -version = "2.12.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", ] [[package]] @@ -642,15 +1279,27 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" +checksum = "357b7205c6cd18dd2c86ed312d1e70add149aea98e7ef72b9fdf0270e555c11d" dependencies = [ - "darling", + "darling 0.23.0", "indoc", "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "is-macro" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.114", ] [[package]] @@ -668,22 +1317,48 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", ] +[[package]] +name = "kasuari" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fe90c1150662e858c7d5f945089b7517b0a80d8bf7ba4b1b5ffc984e7230a5b" +dependencies = [ + "hashbrown 0.16.1", + "portable-atomic", + "thiserror 2.0.17", +] + +[[package]] +name = "lab" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" + [[package]] name = "lazy_static" version = "1.5.0" @@ -692,22 +1367,41 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] -name = "linux-raw-sys" -version = "0.4.15" +name = "libredox" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.10.0", + "libc", +] [[package]] -name = "linux-raw-sys" -version = "0.11.0" +name = "line-clipping" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - +checksum = "5f4de44e98ddbf09375cbf4d17714d18f39195f4f4894e8524501726fd9a8a4a" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + [[package]] name = "litrs" version = "1.0.0" @@ -725,17 +1419,36 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru" -version = "0.12.5" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "mac_address" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" +dependencies = [ + "nix 0.29.0", + "winapi", +] + +[[package]] +name = "matchers" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "hashbrown 0.15.5", + "regex-automata", ] [[package]] @@ -744,6 +1457,60 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[package]] +name = "memmem" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "cfg-if", + "miette-derive", + "owo-colors", + "textwrap", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -755,9 +1522,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", @@ -765,6 +1532,94 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset 0.9.1", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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", + "serde", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[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-traits" version = "0.2.19" @@ -774,6 +1629,34 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "object" version = "0.37.3" @@ -795,12 +1678,42 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + [[package]] name = "owo-colors" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +[[package]] +name = "par-core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96cbd21255b7fb29a5d51ef38a779b517a91abd59e2756c039583f43ef4c90f" +dependencies = [ + "once_cell", +] + [[package]] name = "parking_lot" version = "0.12.5" @@ -825,276 +1738,1278 @@ dependencies = [ ] [[package]] -name = "paste" -version = "1.0.15" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "pin-project-lite" -version = "0.2.16" +name = "pest" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" +dependencies = [ + "memchr", + "ucd-trie", +] [[package]] -name = "pin-utils" -version = "0.1.0" +name = "pest_derive" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed" +dependencies = [ + "pest", + "pest_generator", +] [[package]] -name = "proc-macro2" -version = "1.0.103" +name = "pest_generator" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5" dependencies = [ - "unicode-ident", + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.114", ] [[package]] -name = "quote" -version = "1.0.42" +name = "pest_meta" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365" dependencies = [ - "proc-macro2", + "pest", + "sha2", ] [[package]] -name = "ratatui" -version = "0.29.0" +name = "phf" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "bitflags", - "cassowary", - "compact_str", - "crossterm 0.28.1", - "indoc", - "instability", - "itertools", - "lru", - "paste", - "strum", - "unicode-segmentation", - "unicode-truncate", - "unicode-width 0.2.0", + "phf_macros", + "phf_shared", ] [[package]] -name = "redox_syscall" -version = "0.5.18" +name = "phf_codegen" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "bitflags", + "phf_generator", + "phf_shared", ] [[package]] -name = "rustc-demangle" -version = "0.1.26" +name = "phf_generator" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand", +] [[package]] -name = "rustix" -version = "0.38.44" +name = "phf_macros" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.114", ] [[package]] -name = "rustix" -version = "1.1.2" +name = "phf_shared" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "siphasher 1.0.1", ] [[package]] -name = "rustversion" -version = "1.0.22" +name = "pin-project-lite" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] -name = "ryu" -version = "1.0.20" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "scopeguard" -version = "1.2.0" +name = "portable-atomic" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" [[package]] -name = "serde" -version = "1.0.228" +name = "potential_utf" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ - "serde_core", - "serde_derive", + "zerovec", ] [[package]] -name = "serde_core" -version = "1.0.228" +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "serde_derive" -version = "1.0.228" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "proc-macro2", - "quote", - "syn", + "zerocopy", ] [[package]] -name = "serde_json" -version = "1.0.145" +name = "pretty_assertions" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", + "diff", + "yansi", ] [[package]] -name = "sharded-slab" -version = "0.1.7" +name = "proc-macro2" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ - "lazy_static", + "unicode-ident", ] [[package]] -name = "shlex" -version = "1.3.0" +name = "psm" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01" +dependencies = [ + "ar_archive_writer", + "cc", +] [[package]] -name = "signal-hook" -version = "0.3.18" +name = "quote" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ - "libc", - "signal-hook-registry", + "proc-macro2", ] [[package]] -name = "signal-hook-mio" +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[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.17", +] + +[[package]] +name = "ratatui" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1ce67fb8ba4446454d1c8dbaeda0557ff5e94d39d5e5ed7f10a65eb4c8266bc" +dependencies = [ + "instability", + "ratatui-core", + "ratatui-crossterm", + "ratatui-macros", + "ratatui-termwiz", + "ratatui-widgets", +] + +[[package]] +name = "ratatui-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" +dependencies = [ + "bitflags 2.10.0", + "compact_str 0.9.0", + "hashbrown 0.16.1", + "indoc", + "itertools 0.14.0", + "kasuari", + "lru", + "strum", + "thiserror 2.0.17", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.2.2", +] + +[[package]] +name = "ratatui-crossterm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "577c9b9f652b4c121fb25c6a391dd06406d3b092ba68827e6d2f09550edc54b3" +dependencies = [ + "cfg-if", + "crossterm", + "instability", + "ratatui-core", +] + +[[package]] +name = "ratatui-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f1342a13e83e4bb9d0b793d0ea762be633f9582048c892ae9041ef39c936f4" +dependencies = [ + "ratatui-core", + "ratatui-widgets", +] + +[[package]] +name = "ratatui-termwiz" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f76fe0bd0ed4295f0321b1676732e2454024c15a35d01904ddb315afd3d545c" +dependencies = [ + "ratatui-core", + "termwiz", +] + +[[package]] +name = "ratatui-widgets" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db" +dependencies = [ + "bitflags 2.10.0", + "hashbrown 0.16.1", + "indoc", + "instability", + "itertools 0.14.0", + "line-clipping", + "ratatui-core", + "strum", + "time", + "unicode-segmentation", + "unicode-width 0.2.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.17", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[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.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[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 = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[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 2.0.114", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared_memory" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8593196da75d9dc4f69349682bd4c2099f8cde114257d1ef7ef1b33d1aba54" +dependencies = [ + "cfg-if", + "libc", + "nix 0.23.2", + "rand", + "win-sys", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smartstring" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" +dependencies = [ + "autocfg", + "static_assertions", + "version_check", +] + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stacker" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_enum" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36a4951ca7bd1cfd991c241584a9824a70f6aff1e7d4f693fb3f2465e4030e" +dependencies = [ + "quote", + "swc_macros_common", + "syn 2.0.114", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "swc_allocator" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d7eefd2c8b228a8c73056482b2ae4b3a1071fbe07638e3b55ceca8570cc48bb" +dependencies = [ + "allocator-api2", + "bumpalo", + "hashbrown 0.14.5", + "rustc-hash", +] + +[[package]] +name = "swc_atoms" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ccbe2ecad10ad7432100f878a107b1d972a8aee83ca53184d00c23a078bb8a" +dependencies = [ + "hstr", + "once_cell", + "serde", +] + +[[package]] +name = "swc_common" +version = "18.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1c06698254e9b47daaf9bbb062af489a350bd8d10dfaab0cabbd32d46cec69d" +dependencies = [ + "anyhow", + "ast_node", + "better_scoped_tls", + "bytes-str", + "either", + "from_variant", + "num-bigint", + "once_cell", + "parking_lot", + "rustc-hash", + "serde", + "siphasher 0.3.11", + "swc_atoms", + "swc_eq_ignore_macros", + "swc_sourcemap", + "swc_visit", + "termcolor", + "tracing", + "unicode-width 0.2.2", + "url", +] + +[[package]] +name = "swc_config" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e90b52ee734ded867104612218101722ad87ff4cf74fe30383bd244a533f97" +dependencies = [ + "anyhow", + "bytes-str", + "indexmap", + "serde", + "serde_json", + "swc_config_macro", +] + +[[package]] +name = "swc_config_macro" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b416e8ce6de17dc5ea496e10c7012b35bbc0e3fef38d2e065eed936490db0b3" dependencies = [ - "libc", - "mio", - "signal-hook", + "proc-macro2", + "quote", + "swc_macros_common", + "syn 2.0.114", ] [[package]] -name = "signal-hook-registry" -version = "1.4.6" +name = "swc_core" +version = "57.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "afb84a28511166b70a7e651b730d99bd4d3e2914ede7009d77c65afbcdbae0ce" dependencies = [ - "libc", + "swc_allocator", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_codegen", + "swc_ecma_parser", + "swc_ecma_transforms_base", + "swc_ecma_transforms_testing", + "swc_ecma_transforms_typescript", + "swc_ecma_visit", + "vergen", ] [[package]] -name = "slab" -version = "0.4.11" +name = "swc_ecma_ast" +version = "20.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "252124d0d786aa2338860701a067c93488747dfadbfedb16ac78f386e16a0ac4" +dependencies = [ + "bitflags 2.10.0", + "is-macro", + "num-bigint", + "once_cell", + "phf", + "rustc-hash", + "string_enum", + "swc_atoms", + "swc_common", + "swc_visit", + "unicode-id-start", +] [[package]] -name = "smallvec" -version = "1.15.1" +name = "swc_ecma_codegen" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "56116de786118dce35e90b612a1f4d952116dd2728ecb197c8064cfccf527baf" +dependencies = [ + "ascii", + "compact_str 0.7.1", + "dragonbox_ecma", + "memchr", + "num-bigint", + "once_cell", + "regex", + "rustc-hash", + "serde", + "swc_allocator", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_codegen_macros", + "tracing", +] [[package]] -name = "socket2" -version = "0.6.1" +name = "swc_ecma_codegen_macros" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "e276dc62c0a2625a560397827989c82a93fd545fcf6f7faec0935a82cc4ddbb8" dependencies = [ - "libc", - "windows-sys 0.60.2", + "proc-macro2", + "swc_macros_common", + "syn 2.0.114", ] [[package]] -name = "static_assertions" -version = "1.1.0" +name = "swc_ecma_hooks" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "8c9adff1f01550ef653e262ad709a2914d3dd6cfd559aea2e28eeeab8f895981" +dependencies = [ + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_visit", +] [[package]] -name = "strsim" -version = "0.11.1" +name = "swc_ecma_parser" +version = "34.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "18271343933dfa820caba5fabb36118b1cfbf0010702a2947c8bf81b9154e36c" +dependencies = [ + "bitflags 2.10.0", + "either", + "num-bigint", + "phf", + "rustc-hash", + "seq-macro", + "serde", + "smartstring", + "stacker", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "tracing", +] [[package]] -name = "strum" -version = "0.26.3" +name = "swc_ecma_testing" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "177244625cdecd268a07534c3b087f7f263604dd40f3ec7c7a984ca95351b632" dependencies = [ - "strum_macros", + "anyhow", + "hex", + "sha2", + "testing", + "tracing", ] [[package]] -name = "strum_macros" -version = "0.26.4" +name = "swc_ecma_transforms_base" +version = "37.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "dcea2b456609d624513ebd884c7152d5b1a04ad5dd8fcb957e00e8993387ed00" +dependencies = [ + "better_scoped_tls", + "indexmap", + "once_cell", + "par-core", + "phf", + "rustc-hash", + "serde", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_parser", + "swc_ecma_utils", + "swc_ecma_visit", + "tracing", +] + +[[package]] +name = "swc_ecma_transforms_react" +version = "41.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e071551d429c184f40080696ee0bcbd54ccf75bf11569302b6dc5de106a6984" +dependencies = [ + "base64", + "bytes-str", + "indexmap", + "once_cell", + "rustc-hash", + "serde", + "sha1", + "string_enum", + "swc_atoms", + "swc_common", + "swc_config", + "swc_ecma_ast", + "swc_ecma_hooks", + "swc_ecma_parser", + "swc_ecma_transforms_base", + "swc_ecma_utils", + "swc_ecma_visit", +] + +[[package]] +name = "swc_ecma_transforms_testing" +version = "41.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1385bece088a1c51d0c3c379642eacf5ed9a69c1b6fe5c4c07878eeecbb55ff8" +dependencies = [ + "ansi_term", + "anyhow", + "base64", + "hex", + "serde", + "serde_json", + "sha2", + "swc_common", + "swc_ecma_ast", + "swc_ecma_codegen", + "swc_ecma_parser", + "swc_ecma_testing", + "swc_ecma_transforms_base", + "swc_ecma_utils", + "swc_ecma_visit", + "swc_sourcemap", + "tempfile", + "testing", +] + +[[package]] +name = "swc_ecma_transforms_typescript" +version = "41.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59c1d87f4c36161833462cbf16d769fce63158da04a42dbb83c8fac7ee8e04e" +dependencies = [ + "bytes-str", + "rustc-hash", + "serde", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_transforms_base", + "swc_ecma_transforms_react", + "swc_ecma_utils", + "swc_ecma_visit", +] + +[[package]] +name = "swc_ecma_utils" +version = "26.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3669c1d92ba315caff5a80df76141367acf61b2d846231a1960e25be65a20fbd" +dependencies = [ + "dragonbox_ecma", + "indexmap", + "num_cpus", + "once_cell", + "par-core", + "rustc-hash", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_visit", + "tracing", +] + +[[package]] +name = "swc_ecma_visit" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e971a258717db3dc8939c38410d8b8cb8126f1b05b9758672daa7cae3e0248c2" +dependencies = [ + "new_debug_unreachable", + "num-bigint", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_visit", + "tracing", +] + +[[package]] +name = "swc_eq_ignore_macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c16ce73424a6316e95e09065ba6a207eba7765496fed113702278b7711d4b632" dependencies = [ - "heck", "proc-macro2", "quote", - "rustversion", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "swc_error_reporters" +version = "20.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3615d499e30e5bc4d53978d1fc4c1975c8be9acc79f42b5956bbca7fc7c6dc58" +dependencies = [ + "anyhow", + "miette", + "once_cell", + "serde", + "swc_common", +] + +[[package]] +name = "swc_macros_common" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1efbaa74943dc5ad2a2fb16cbd78b77d7e4d63188f3c5b4df2b4dcd2faaae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "swc_sourcemap" +version = "9.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de08ef00f816acdd1a58ee8a81c0e1a59eefef2093aefe5611f256fa6b64c4d7" +dependencies = [ + "base64-simd", + "bitvec", + "bytes-str", + "data-encoding", + "debugid", + "if_chain", + "rustc-hash", + "serde", + "serde_json", + "unicode-id-start", + "url", +] + +[[package]] +name = "swc_visit" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62fb71484b486c185e34d2172f0eabe7f4722742aad700f426a494bb2de232a2" +dependencies = [ + "either", + "new_debug_unreachable", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] name = "syn" -version = "2.0.110" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "terminfo" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" +dependencies = [ + "fnv", + "nom", + "phf", + "phf_codegen", +] + +[[package]] +name = "termios" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" +dependencies = [ + "libc", +] + +[[package]] +name = "termwiz" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" +dependencies = [ + "anyhow", + "base64", + "bitflags 2.10.0", + "fancy-regex", + "filedescriptor", + "finl_unicode", + "fixedbitset", + "hex", + "lazy_static", + "libc", + "log", + "memmem", + "nix 0.29.0", + "num-derive", + "num-traits", + "ordered-float", + "pest", + "pest_derive", + "phf", + "sha2", + "signal-hook", + "siphasher 1.0.1", + "terminfo", + "termios", + "thiserror 1.0.69", + "ucd-trie", + "unicode-segmentation", + "vtparse", + "wezterm-bidi", + "wezterm-blob-leases", + "wezterm-color-types", + "wezterm-dynamic", + "wezterm-input-types", + "winapi", +] + +[[package]] +name = "testing" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1506c602222ebab5d96100180f8d3c015b2394eceb00a46d20c25b8b1e5100" +dependencies = [ + "cargo_metadata 0.18.1", + "difference", + "once_cell", + "pretty_assertions", + "regex", + "rustc-hash", + "serde", + "serde_json", + "swc_common", + "swc_error_reporters", + "testing_macros", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "testing_macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7442bd3ca09f38d4788dc5ebafbc1967c3717726b4b074db011d470b353548b" +dependencies = [ + "anyhow", + "glob", + "once_cell", + "proc-macro2", + "quote", + "regex", + "relative-path", + "syn 2.0.114", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "thread_local" version = "1.1.9" @@ -1105,19 +3020,50 @@ dependencies = [ ] [[package]] -name = "throbber-widgets-tui" -version = "0.9.0" +name = "throbber-widgets-tui" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e6941f74491a80911cb8821cb1f55f7e13bca867b28a2b14e5a1daaf691eb3" +dependencies = [ + "ratatui", +] + +[[package]] +name = "time" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +dependencies = [ + "deranged", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" + +[[package]] +name = "tinystr" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e58887883fb0a259717b16d68d251983e40850b4b2f45c2da410f46d4333dc" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ - "ratatui", + "displaydoc", + "zerovec", ] [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -1138,50 +3084,36 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", + "syn 2.0.114", ] [[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - -[[package]] -name = "toml_edit" -version = "0.19.15" +name = "tracing" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "indexmap", - "toml_datetime", - "winnow", + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] [[package]] -name = "tracing" -version = "0.1.41" +name = "tracing-attributes" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ - "pin-project-lite", - "tracing-core", + "proc-macro2", + "quote", + "syn 2.0.114", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -1197,23 +3129,75 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", "sharded-slab", + "smallvec", "thread_local", + "tracing", "tracing-core", + "tracing-log", +] + +[[package]] +name = "triomphe" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" +dependencies = [ + "serde", + "stable_deref_trait", ] +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicode-id-start" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007" + [[package]] name = "unicode-ident" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -1222,13 +3206,13 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-truncate" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +checksum = "8fbf03860ff438702f3910ca5f28f8dac63c1c11e7efb5012b8b175493606330" dependencies = [ - "itertools", + "itertools 0.13.0", "unicode-segmentation", - "unicode-width 0.1.14", + "unicode-width 0.2.2", ] [[package]] @@ -1239,9 +3223,27 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.0" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +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 = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" @@ -1249,29 +3251,100 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "atomic", + "getrandom 0.3.4", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vergen" +version = "9.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777" +dependencies = [ + "anyhow", + "cargo_metadata 0.19.2", + "derive_builder", + "regex", + "rustversion", + "vergen-lib", +] + +[[package]] +name = "vergen-lib" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", +] + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "vtparse" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -1282,9 +3355,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1292,36 +3365,105 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.114", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] [[package]] -name = "which" -version = "4.4.2" +name = "wezterm-bidi" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", + "log", + "wezterm-dynamic", +] + +[[package]] +name = "wezterm-blob-leases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7" +dependencies = [ + "getrandom 0.3.4", + "mac_address", + "sha2", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "wezterm-color-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" +dependencies = [ + "csscolorparser", + "deltae", + "lazy_static", + "wezterm-dynamic", +] + +[[package]] +name = "wezterm-dynamic" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" +dependencies = [ + "log", + "ordered-float", + "strsim", + "thiserror 1.0.69", + "wezterm-dynamic-derive", +] + +[[package]] +name = "wezterm-dynamic-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c0cf2d539c645b448eaffec9ec494b8b19bd5077d9e58cb1ae7efece8d575b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wezterm-input-types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" +dependencies = [ + "bitflags 1.3.2", + "euclid", + "lazy_static", + "serde", + "wezterm-dynamic", +] + +[[package]] +name = "win-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b7b128a98c1cfa201b09eb49ba285887deb3cbe7466a98850eb1adabb452be5" +dependencies = [ + "windows", ] [[package]] @@ -1340,12 +3482,34 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" +dependencies = [ + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", +] + [[package]] name = "windows-core" version = "0.62.2" @@ -1367,7 +3531,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1378,7 +3542,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1477,6 +3641,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -1489,6 +3659,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -1513,6 +3689,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -1525,6 +3707,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -1549,6 +3737,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -1562,10 +3756,131 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] -name = "winnow" -version = "0.5.40" +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wyz" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ - "memchr", + "tap", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", ] + +[[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 2.0.114", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zmij" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" diff --git a/Cargo.toml b/Cargo.toml index 2f84676..fe377d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,42 +1,36 @@ -[package] -name = "checkpoint-ts" -version = "0.1.2" -description = "Interactive checkpoint system for TypeScript/JavaScript development. Debug with TUI, inspect state, skip functions, inject values." -authors = ["ErenayDev "] -license = "MIT" +[workspace] +resolver = "2" +members = ["crates/core", "crates/parser", "crates/shared"] + +[workspace.package] +version = "0.1.3" edition = "2024" +license = "MIT" repository = "https://github.com/ErenayDev/checkpoint-ts" +description = "Interactive checkpoint system for TypeScript/JavaScript development. Debug with TUI, inspect state, skip functions, inject values." +authors = ["ErenayDev erenaydev@proton.me"] homepage = "https://github.com/ErenayDev/checkpoint-ts" documentation = "https://docs.rs/checkpoint-ts" readme = "README.md" keywords = ["debug", "typescript", "javascript", "tui", "checkpoint"] categories = ["development-tools::debugging", "command-line-utilities"] -rust-version = "1.87" -exclude = [ - "target/", - ".git/", - ".github/", - "tools/", - "*.log" -] - -[[bin]] -name = "checkpoint" -path = "src/main.rs" - -[workspace] -members = ["tools/cargo-bin"] -[package.metadata.bin] -cargo-watch = { version = "8.5.2" } +[workspace.dependencies] +shared_memory = "0.12" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +swc_core = { version = "57.0.1", features = [ + "__common", + "__ecma", + "ecma_ast", + "ecma_parser", + "ecma_transforms_typescript", + "ecma_codegen", + "ecma_visit", + "__testing_transform", +] } # old ver -> 54 -[dependencies] -chrono = "0.4.42" -color-eyre = "0.6.3" -crossterm = { version = "0.29.0", features = ["event-stream"] } -futures = "0.3.31" -ratatui = "0.29.0" -serde = "1.0.228" -serde_json = "1.0.145" -throbber-widgets-tui = "0.9.0" -tokio = { version = "1.40.0", features = ["full"] } +# The profile that 'dist' will build with +[profile.dist] +inherits = "release" +lto = "thin" diff --git a/FUNDING.yml b/FUNDING.yml new file mode 100644 index 0000000..a4d752a --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1,3 @@ +github: [ErenayDev] +liberapay: ErenayDev +open_collective: erenay diff --git a/README.md b/README.md index a2c8ea8..64b437b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# checkpoint.ts +# Checkpoint.ts [![codecov](https://codecov.io/gh/ErenayDev/checkpoint-ts/branch/main/graph/badge.svg)](https://codecov.io/gh/ErenayDev/checkpoint-ts) [![CI](https://github.com/ErenayDev/checkpoint-ts/workflows/CI/badge.svg)](https://github.com/ErenayDev/checkpoint-ts/actions) @@ -7,6 +7,49 @@ [![Rust Version](https://img.shields.io/badge/rust-1.85+-orange.svg)](https://www.rust-lang.org) [![Downloads](https://img.shields.io/crates/d/checkpoint-ts.svg)](https://crates.io/crates/checkpoint-ts) +<<<<<<< develop +Interactive checkpoint system for TypeScript/JavaScript. + +## Quick Start + +See [INSTALLATION.md](./doc/INSTALLATION.md) + +## Key Features + +When you run program, first parses your code with AST's and injects checkpointing functions. +Then injects runtime codes and then a TUI appears to you view. +When you wanna checkpoint in a point, the function name and its parameters, variables written to cache(in your .checkpoint folder) +If you wanna run the checkpointed function, just do it. You can edit the parameters, variables for the function. +You can profile execution times for each function. +Also you can edit whatever you want. really. try it yourself. + +## Usage + +### Basic Usage + +```bash +checkpoint script.ts +``` + +### Runtime Selection + +Currently only [Bun](https://bun.sh) is available. Check again in future for more runtimes + +```bash +checkpoint script.ts --interpreter bun +``` + +### Pre-instrumented Files (not available yet) + +```bash +checkpoint --instrumented script.ts +``` + +## Supported Features + +Covers like 85% TypeScript/JavaScript ecosystem codes. I'm planning optimize code and performance with switching to [oxc](https://oxc.rs) from [swc](https://swc.rs). +And for dead-code elimination, I wanna use the [jsshaker](https://github.com/kermanx/jsshaker) for O(n) to O(1) optimization +======= > Stop rerunning 10 functions to debug the 11th. @@ -20,13 +63,12 @@ Written in Rust πŸ¦€ | Works with Bun, Node, Deno Functional logic has not yet been implemented. Please check again in the future. --- +>>>>>>> main ## Contributing We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details. ---- - ## License Copyright (c) ErenayDev @@ -35,26 +77,20 @@ This project is licensed under the MIT license ([LICENSE] or + + ErenayDev's sponsors + +

## Acknowledgments Built with: + - [SWC](https://swc.rs/) for TypeScript/JavaScript parsing - [Ratatui](https://ratatui.rs/) for terminal user interface - [Tokio](https://tokio.rs/) for async runtime support diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..1a8ea52 --- /dev/null +++ b/TODO.md @@ -0,0 +1,3 @@ +[ ] JSX/TSX support +[+] Discord RPC +[ ] Settings page or ~/.config/checkpoint/config.yml diff --git a/assets/logo-tests.png b/assets/logo-tests.png new file mode 100644 index 0000000..3f0abcf Binary files /dev/null and b/assets/logo-tests.png differ diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000..d3a09dd Binary files /dev/null and b/assets/logo.png differ diff --git a/assets/logo2.png b/assets/logo2.png new file mode 100644 index 0000000..ba6eac5 Binary files /dev/null and b/assets/logo2.png differ diff --git a/assets/logo3.png b/assets/logo3.png new file mode 100644 index 0000000..0158df3 Binary files /dev/null and b/assets/logo3.png differ diff --git a/assets/logo4.png b/assets/logo4.png new file mode 100644 index 0000000..a4bbe43 Binary files /dev/null and b/assets/logo4.png differ diff --git a/crates/core/Cargo.lock b/crates/core/Cargo.lock new file mode 100644 index 0000000..0866154 --- /dev/null +++ b/crates/core/Cargo.lock @@ -0,0 +1,1571 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "cargo-bin" +version = "0.1.0" +dependencies = [ + "cargo-run-bin", +] + +[[package]] +name = "cargo-run-bin" +version = "1.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba4ea665f68a2042470ec6e27a36755783ebd3367b90bec2fb100f9d5012fd8" +dependencies = [ + "anyhow", + "cfg-if", + "clap", + "rustversion", + "serde", + "toml", + "toml_edit", + "version_check", + "which", +] + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cc" +version = "1.2.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "checkpoint-ts" +version = "0.1.2" +dependencies = [ + "chrono", + "color-eyre", + "crossterm 0.29.0", + "futures", + "ratatui", + "serde", + "serde_json", + "throbber-widgets-tui", + "tokio", +] + +[[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", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.5.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +dependencies = [ + "clap_builder", +] + +[[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_lex" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + +[[package]] +name = "color-eyre" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "compact_str" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "crossterm" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags", + "crossterm_winapi", + "mio", + "parking_lot", + "rustix 0.38.44", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags", + "crossterm_winapi", + "derive_more", + "document-features", + "futures-core", + "mio", + "parking_lot", + "rustix 1.1.2", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[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 = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +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 = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "instability" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" +dependencies = [ + "darling", + "indoc", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[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.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "owo-colors" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[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 = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ratatui" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" +dependencies = [ + "bitflags", + "cassowary", + "compact_str", + "crossterm 0.28.1", + "indoc", + "instability", + "itertools", + "lru", + "paste", + "strum", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.2.0", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[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 = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "throbber-widgets-tui" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e58887883fb0a259717b16d68d251983e40850b4b2f45c2da410f46d4333dc" +dependencies = [ + "ratatui", +] + +[[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 = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools", + "unicode-segmentation", + "unicode-width 0.1.14", +] + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml new file mode 100644 index 0000000..5150c6b --- /dev/null +++ b/crates/core/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "checkpoint-ts" +description = "Interactive checkpoint system for TypeScript/JavaScript development. Debug with TUI, inspect state, skip functions, inject values." +authors = ["ErenayDev erenaydev@proton.me"] +license = "MIT" +repository = "https://github.com/ErenayDev/checkpoint-ts" +homepage = "https://github.com/ErenayDev/checkpoint-ts" +documentation = "https://docs.rs/checkpoint-ts" +readme = "README.md" +keywords = ["debug", "typescript", "javascript", "tui", "checkpoint"] +categories = ["development-tools::debugging", "command-line-utilities"] +version.workspace = true +edition.workspace = true +rust-version = "1.87" +exclude = ["target/", ".git/", ".github/", "tools/", "*.log"] + +[[bin]] +name = "checkpoint" +path = "src/main.rs" + +[dependencies] +checkpoint-shared = { path = "../shared" } +checkpoint-parser = { path = "../parser" } +serde.workspace = true +serde_json.workspace = true +chrono = { version = "0.4", features = ["serde"] } +color-eyre = "0.6" +crossterm = { version = "0.29", features = ["event-stream"] } +futures = "0.3" +ratatui = "0.30" +throbber-widgets-tui = "0.11.0" +tokio = { version = "1", features = ["full"] } +clap = { version = "4.5.54", features = ["derive"] } +thiserror = "2.0.17" +dirs = "6.0.0" +walkdir = "2" +sha2 = "0.10" diff --git a/crates/core/README.md b/crates/core/README.md new file mode 100644 index 0000000..e69de29 diff --git a/crates/core/src/main.rs b/crates/core/src/main.rs new file mode 100644 index 0000000..9a73b42 --- /dev/null +++ b/crates/core/src/main.rs @@ -0,0 +1,206 @@ +use clap::Parser; +use color_eyre::{Result, eyre}; + +pub mod services; +pub mod tui; +pub mod utils; + +use std::{ + path::PathBuf, + time::{SystemTime, UNIX_EPOCH}, +}; +use utils::discord_rpc::DiscordRpc; + +use services::transformer::TransformService; +use tui::CheckpointTUI; +use utils::{entry_finder, project_context::ProjectContext}; + +use crate::utils::discord_rpc::{Activity, Button, RpcSession}; + +#[derive(Parser)] +#[command(name = "checkpoint")] +#[command( + about = "Interactive checkpoint system for TypeScript/JavaScript development with time-travel capabilities" +)] +struct Cli { + #[arg(short, long, help = "Input file or directory path")] + input: std::path::PathBuf, + + #[arg(short, long, help = "Output path for transformed file")] + output: Option, + + #[arg( + short, + long, + help = "Enable minification", + default_value_t = false, + num_args = 0..=1, + default_missing_value = "true" + )] + minify: bool, + + #[arg(long, help = "Skip transformation, use cached files only")] + no_transform: bool, + + #[arg(long, help = "Transform only entry file and its imports")] + only_needed: bool, +} + +#[tokio::main] +async fn main() -> Result<()> { + color_eyre::install()?; + + let args = Cli::parse(); + + let entry_file: PathBuf = match entry_finder::find_entry_file(args.input.to_str()) { + Ok(path) => path, + Err(e) => { + eprintln!("[ERROR]: {e}"); + std::process::exit(1); + } + }; + + let ctx = ProjectContext::discover(&entry_file); + ctx.ensure_checkpoint_dir()?; + + let minify = args.minify || ctx.config.minify.unwrap_or(false); + + if !args.no_transform { + let mut transformer = TransformService::new(ctx.clone()); + + if args.only_needed { + println!("[INFO] Transforming entry file and dependencies..."); + transformer + .transform_file(&entry_file, minify) + .map_err(|e| eyre::eyre!("Transform failed: {}", e))?; + } else { + println!("[INFO] Transforming entire project..."); + let transformed = transformer + .transform_project(minify) + .map_err(|e| eyre::eyre!("Transform failed: {}", e))?; + println!("[INFO] Transformed {} files", transformed.len()); + } + } + + copy_runtime_files(&ctx)?; + + let transformed_entry: PathBuf = ctx + .checkpoint_dir + .join("transforms") + .join(entry_file.file_name().unwrap()); + + // discord rpc logic + // + // delete if u want + + let rpc = match DiscordRpc::connect("1232253585962700911") { + Ok(rpc) => { + println!("discord rpc connected"); + Some(rpc) + } + Err(_) => { + println!("discord not running, skipping rpc"); + None + } + }; + + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs(); + + let mut activity = Activity::new(); + activity.large_image = Some("logo".into()); + activity.large_text = Some("Checkpoint.ts".into()); + activity.start_timestamp = Some(now); + activity.buttons = Some(vec![Button { + label: "GitHub".into(), + url: "https://github.com/ErenayDev/Checkpoint-ts".into(), + }]); + + let mut rpc_session = RpcSession::new(rpc, activity); + rpc_session.update(); + + run_app(transformed_entry, entry_file, rpc_session).await?; + Ok(()) +} + +async fn run_app(transformed_entry: PathBuf, entry_file: PathBuf, rpc: RpcSession) -> Result<()> { + let terminal = ratatui::init(); + let mut app = CheckpointTUI::new( + Some(transformed_entry.to_string_lossy().to_string()), + Some(entry_file.to_string_lossy().to_string()), + rpc, + ); + let result = app.run(terminal).await; + ratatui::restore(); + + result +} + +fn copy_runtime_files(ctx: &ProjectContext) -> Result<()> { + use std::fs; + use std::process::Command; + + let runtime_src = std::path::Path::new("runtime"); + let runtime_dst = ctx.checkpoint_dir.join("runtime"); + + if !runtime_src.exists() { + return Err(eyre::eyre!("Runtime directory not found at ./runtime")); + } + + if runtime_dst.exists() { + fs::remove_dir_all(&runtime_dst)?; + } + + fs::create_dir_all(&runtime_dst)?; + + copy_dir_selective(runtime_src, &runtime_dst)?; + + println!("[INFO] Runtime files copied to .checkpoint/runtime"); + + if runtime_dst.join("package.json").exists() { + println!("[INFO] Installing runtime dependencies..."); + let install_result = Command::new("bun") + .arg("install") + .current_dir(&runtime_dst) + .output()?; + + if !install_result.status.success() { + eprintln!("[WARN] Failed to install dependencies, runtime may not work"); + } else { + println!("[INFO] Dependencies installed successfully"); + } + } + + Ok(()) +} + +fn copy_dir_selective(src: &std::path::Path, dst: &std::path::Path) -> Result<()> { + use std::fs; + + let skip_items = ["node_modules", ".git", "dist", "build", "target"]; + + for entry in fs::read_dir(src)? { + let entry = entry?; + let file_name = entry.file_name(); + let file_name_str = file_name.to_string_lossy(); + + if skip_items.contains(&file_name_str.as_ref()) { + continue; + } + + let src_path = entry.path(); + let dst_path = dst.join(&file_name); + let file_type = entry.file_type()?; + + if file_type.is_dir() { + fs::create_dir_all(&dst_path)?; + copy_dir_selective(&src_path, &dst_path)?; + } else if file_type.is_file() { + fs::copy(&src_path, &dst_path)?; + } + } + + Ok(()) +} diff --git a/crates/core/src/services/ipc_bridge.rs b/crates/core/src/services/ipc_bridge.rs new file mode 100644 index 0000000..61afe24 --- /dev/null +++ b/crates/core/src/services/ipc_bridge.rs @@ -0,0 +1,143 @@ +use checkpoint_shared::SharedMemoryBridge; +use std::io::Write; +use std::path::Path; +use std::process::{Child, Command, Stdio}; + +pub struct IpcBridge { + shm: SharedMemoryBridge, + child: Option, + buffered_messages: Vec, +} + +impl IpcBridge { + pub fn spawn_runtime(app_path: &str) -> Result> { + let shm = SharedMemoryBridge::create()?; + let shm_id = shm.os_id().to_string(); + + let app_path_buf = Path::new(app_path); + let runtime_dir = app_path_buf + .parent() + .and_then(|p| p.parent()) + .ok_or("Cannot find runtime directory")? + .join("runtime"); + + let runtime_index = runtime_dir.join("index.ts"); + + if !runtime_index.exists() { + return Err(format!("Runtime not found at {:?}", runtime_index).into()); + } + + let abs_app_path = std::fs::canonicalize(app_path_buf)?; + + let log_path = runtime_dir.join("runtime.log"); + let error_path = runtime_dir.join("runtime.error.log"); + + let mut log_file = std::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(&log_path)?; + + writeln!(log_file, "[RUST] Starting runtime with SHM: {}", shm_id)?; + writeln!(log_file, "[RUST] App path: {}", abs_app_path.display())?; + drop(log_file); + + let log_file = std::fs::OpenOptions::new() + .create(true) + .append(true) + .open(&log_path)?; + + let error_file = std::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(&error_path)?; + + let child = Command::new("bun") + .arg("run") + .arg("index.ts") + .env("CHECKPOINT_SHM_ID", &shm_id) + .env( + "CHECKPOINT_APP_PATH", + abs_app_path.to_string_lossy().as_ref(), + ) + .current_dir(&runtime_dir) + .stdin(Stdio::null()) + .stdout(Stdio::from(log_file)) + .stderr(Stdio::from(error_file)) + .spawn()?; + + std::thread::sleep(std::time::Duration::from_millis(200)); + + let mut attempts = 0; + let mut ready = false; + let mut buffered_messages = Vec::new(); + + while attempts < 10 && !ready { + if let Some(msg) = shm.wait_receive_json::(500) { + if msg.get("type").and_then(|v| v.as_str()) == Some("runtime_ready") { + ready = true; + } + buffered_messages.push(msg); + } else { + attempts += 1; + } + } + + if !ready { + return Err("Runtime failed to start".into()); + } + + Ok(Self { + shm, + child: Some(child), + buffered_messages, + }) + } + + pub fn load_app(&self) -> Result<(), Box> { + self.send_json(&serde_json::json!({ + "type": "load_app" + })) + } + + pub fn send_json( + &self, + value: &T, + ) -> Result<(), Box> { + self.shm.send_json(value) + } + + pub fn receive_json(&mut self, timeout_ms: u64) -> Option { + if !self.buffered_messages.is_empty() { + let msg = self.buffered_messages.remove(0); + return serde_json::from_value(msg).ok(); + } + + self.shm.wait_receive_json(timeout_ms) + } + + pub fn shutdown(&mut self) { + let _ = self.send_json(&serde_json::json!({ "type": "shutdown" })); + if let Some(ref mut child) = self.child { + let _ = child.wait(); + } + } +} + +impl Drop for IpcBridge { + fn drop(&mut self) { + if let Some(ref mut child) = self.child { + let _ = child.kill(); + } + } +} + +impl std::fmt::Debug for IpcBridge { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("IpcBridge") + .field("child", &self.child) + .field("buffered_messages_count", &self.buffered_messages.len()) + .finish_non_exhaustive() + } +} diff --git a/crates/core/src/services/mod.rs b/crates/core/src/services/mod.rs new file mode 100644 index 0000000..c6d9783 --- /dev/null +++ b/crates/core/src/services/mod.rs @@ -0,0 +1,4 @@ +pub mod ipc_bridge; +pub mod transformer; + +pub use ipc_bridge::IpcBridge; diff --git a/crates/core/src/services/transformer.rs b/crates/core/src/services/transformer.rs new file mode 100644 index 0000000..d519368 --- /dev/null +++ b/crates/core/src/services/transformer.rs @@ -0,0 +1,113 @@ +use crate::utils::project_context::ProjectContext; +use crate::utils::transform_cache::TransformCache; +use checkpoint_parser::transform_code; +use std::fs; +use std::path::{Path, PathBuf}; +use walkdir::WalkDir; + +pub struct TransformService { + ctx: ProjectContext, + cache: TransformCache, +} + +impl TransformService { + pub fn new(ctx: ProjectContext) -> Self { + let cache_path = ctx.checkpoint_dir.join("cache.json"); + let cache = TransformCache::load(&cache_path); + + Self { ctx, cache } + } + + pub fn transform_project( + &mut self, + minify: bool, + ) -> Result, Box> { + let mut transformed = Vec::new(); + + for entry in WalkDir::new(&self.ctx.root) + .follow_links(true) + .into_iter() + .filter_map(|e| e.ok()) + { + let path = entry.path(); + + if !self.is_transformable(path) { + continue; + } + + match self.transform_file(path, minify) { + Ok(output_path) => transformed.push(output_path), + Err(e) => eprintln!("[WARN] Failed to transform {}: {}", path.display(), e), + } + } + + let cache_path = self.ctx.checkpoint_dir.join("cache.json"); + self.cache.save(&cache_path)?; + + Ok(transformed) + } + + pub fn transform_file( + &mut self, + file_path: &Path, + minify: bool, + ) -> Result> { + let content = fs::read_to_string(file_path)?; + + let hash = TransformCache::compute_hash(&content); + let relative_path = file_path.strip_prefix(&self.ctx.root).unwrap_or(file_path); + + if self.cache.is_cached(relative_path.to_str().unwrap(), &hash) { + if let Some(cached_path) = self + .cache + .get_transform_path(relative_path.to_str().unwrap()) + { + if cached_path.exists() { + return Ok(cached_path.clone()); + } + } + } + + let transformed = transform_code(&content, file_path.to_str().unwrap(), minify) + .map_err(|e| format!("Transform failed: {:?}", e))?; + + let output_path = self + .ctx + .checkpoint_dir + .join("transforms") + .join(relative_path); + + if let Some(parent) = output_path.parent() { + fs::create_dir_all(parent)?; + } + + fs::write(&output_path, transformed)?; + + self.cache.update( + relative_path.to_string_lossy().to_string(), + hash, + output_path.clone(), + ); + + Ok(output_path) + } + + fn is_transformable(&self, path: &Path) -> bool { + if !path.is_file() { + return false; + } + + if path.starts_with(&self.ctx.checkpoint_dir) { + return false; + } + + if path.components().any(|c| c.as_os_str() == "node_modules") { + return false; + } + + matches!( + path.extension().and_then(|e| e.to_str()), + Some("ts") | Some("js") | Some("tsx") | Some("jsx") // modify later + ) + } +} diff --git a/src/tui/app.rs b/crates/core/src/tui/app.rs similarity index 84% rename from src/tui/app.rs rename to crates/core/src/tui/app.rs index 834e400..537c09f 100644 --- a/src/tui/app.rs +++ b/crates/core/src/tui/app.rs @@ -1,7 +1,9 @@ use super::events::EventHandler; use super::scenes::dashboard::DashboardState; +use super::scenes::history::ExecutionHistoryState; use super::scenes::profiler::PerformanceProfileState; use super::scenes::variable_editor::VariableEditorState; +use crate::utils::discord_rpc::RpcSession; use color_eyre::Result; use crossterm::event::{Event, KeyEventKind}; use ratatui::{DefaultTerminal, Frame}; @@ -19,7 +21,7 @@ pub enum Scene { } #[derive(Debug)] -pub struct TuiApp { +pub struct CheckpointTUI { pub current_scene: Scene, pub scene_stack: Vec, pub running: bool, @@ -27,16 +29,23 @@ pub struct TuiApp { pub dashboard_state: DashboardState, pub variable_state: VariableEditorState, pub profile_state: PerformanceProfileState, + pub history_state: ExecutionHistoryState, + pub rpc: RpcSession, } -impl TuiApp { - pub fn new(file: Option) -> Self { +impl CheckpointTUI { + pub fn new( + transformed_file: Option, + original_file: Option, + rpc: RpcSession, + ) -> Self { let mut dashboard_state = DashboardState::new(); let variable_state = VariableEditorState::new(); let profile_state = PerformanceProfileState::new(); + let history_state = ExecutionHistoryState::new(); - if let Some(f) = file { - dashboard_state.set_file(f); + if let (Some(transformed), Some(original)) = (transformed_file, original_file) { + let _ = dashboard_state.set_file(transformed, original); } Self { @@ -47,20 +56,22 @@ impl TuiApp { dashboard_state, variable_state, profile_state, + history_state, + rpc, } } pub async fn run(&mut self, mut terminal: DefaultTerminal) -> Result<()> { let mut interval = tokio::time::interval(tokio::time::Duration::from_millis(150)); - while self.running { tokio::select! { _ = interval.tick() => { self.dashboard_state.tick_throbber(); } - _ = self.handle_events() => {} + _= self.handle_events() => {} } terminal.draw(|frame| self.draw(frame))?; + self.dashboard_state.poll_ipc_messages(); } Ok(()) } @@ -79,7 +90,11 @@ impl TuiApp { pub fn navigate_to(&mut self, new_scene: Scene) { self.scene_stack.push(self.current_scene.clone()); - self.current_scene = new_scene; + self.current_scene = new_scene.clone(); + + self.rpc.activity.state = Some(format!(" {:?}", new_scene)); + self.rpc.update(); + self.dashboard_state .add_log(format!("Navigated to {:?}", self.current_scene)); } @@ -128,12 +143,7 @@ impl TuiApp { } fn draw_history(&self, frame: &mut Frame) { - use ratatui::widgets::{Block, Borders, Paragraph}; - frame.render_widget( - Paragraph::new("Execution History\n\n[↑↓] Navigate [Enter] Go to Checkpoint [R] Replay from Here\n[D] Show Details [S] Save History [Esc] Back") - .block(Block::default().borders(Borders::ALL).title("Execution History")), - frame.area(), - ); + crate::tui::scenes::history::draw(frame, frame.area(), &self.history_state); } fn draw_profiler(&self, frame: &mut Frame) { diff --git a/src/tui/events.rs b/crates/core/src/tui/events.rs similarity index 100% rename from src/tui/events.rs rename to crates/core/src/tui/events.rs diff --git a/src/tui/keyboard_handler.rs b/crates/core/src/tui/keyboard_handler.rs similarity index 57% rename from src/tui/keyboard_handler.rs rename to crates/core/src/tui/keyboard_handler.rs index 845212d..3e1a43f 100644 --- a/src/tui/keyboard_handler.rs +++ b/crates/core/src/tui/keyboard_handler.rs @@ -1,8 +1,15 @@ -use super::app::{Scene, TuiApp}; +use super::app::{CheckpointTUI, Scene}; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; -impl TuiApp { +impl CheckpointTUI { pub fn handle_key_event(&mut self, key: KeyEvent) { + if key.modifiers.contains(KeyModifiers::CONTROL) + && matches!(key.code, KeyCode::Char('c') | KeyCode::Char('C')) + { + self.quit(); + return; + } + match self.current_scene { Scene::Dashboard => self.handle_dashboard_keys(key), Scene::VariableEditor => self.handle_variable_editor_keys(key), @@ -15,52 +22,51 @@ impl TuiApp { } fn handle_dashboard_keys(&mut self, key: KeyEvent) { - match (key.modifiers, key.code) { - (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => { - self.quit(); + match key.code { + KeyCode::Char('c') | KeyCode::Char('C') => { + self.dashboard_state.continue_execution(); } - (_, KeyCode::Char('c')) => { - self.dashboard_state - .add_log("Continue execution".to_string()); + KeyCode::Char('s') | KeyCode::Char('S') => { + if self.dashboard_state.paused { + self.navigate_to(Scene::FunctionSkip); + } } - (_, KeyCode::Char('s')) => { - self.navigate_to(Scene::FunctionSkip); - } - (_, KeyCode::Char('e')) => { - self.navigate_to(Scene::VariableEditor); + KeyCode::Char('e') | KeyCode::Char('E') => { + if self.dashboard_state.paused { + self.navigate_to(Scene::VariableEditor); + } } - (_, KeyCode::Char('p')) => { + KeyCode::Char('p') | KeyCode::Char('P') => { self.navigate_to(Scene::Profiler); } - (_, KeyCode::Char('v')) => { + KeyCode::Char('v') | KeyCode::Char('V') => { self.navigate_to(Scene::CallStack); } - (_, KeyCode::Char('h')) => { + KeyCode::Char('h') | KeyCode::Char('H') => { self.navigate_to(Scene::History); } - (_, KeyCode::Esc | KeyCode::Char('q')) => { - self.quit(); + KeyCode::Char('q') | KeyCode::Char('Q') | KeyCode::Esc => { + self.navigate_back(); } _ => {} } } fn handle_variable_editor_keys(&mut self, key: KeyEvent) { - match (key.modifiers, key.code) { - (_, KeyCode::Enter) => { + match key.code { + KeyCode::Enter => { self.dashboard_state .add_log("Applied variable changes".to_string()); } - (_, KeyCode::Tab) => { + KeyCode::Tab => { self.dashboard_state .add_log("Next field selected".to_string()); } - (_, KeyCode::Char('r')) => { + KeyCode::Char('r') | KeyCode::Char('R') => { self.dashboard_state .add_log("Reset all variables".to_string()); } - (_, KeyCode::Esc | KeyCode::Char('q')) - | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => { + KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => { self.navigate_back(); } _ => {} @@ -68,23 +74,20 @@ impl TuiApp { } fn handle_function_skip_keys(&mut self, key: KeyEvent) { - match (key.modifiers, key.code) { - (_, KeyCode::Enter) => { - self.dashboard_state - .add_log("Function skipped with selected option".to_string()); + match key.code { + KeyCode::Enter => { + self.dashboard_state.skip_function(serde_json::Value::Null); self.navigate_back(); } - (_, KeyCode::Char('c')) => { - self.dashboard_state - .add_log("Continue normal execution".to_string()); + KeyCode::Char('c') | KeyCode::Char('C') => { + self.dashboard_state.continue_execution(); self.navigate_back(); } - (_, KeyCode::Up | KeyCode::Down) => { + KeyCode::Up | KeyCode::Down => { self.dashboard_state .add_log("Skip option changed".to_string()); } - (_, KeyCode::Esc | KeyCode::Char('q')) - | (KeyModifiers::CONTROL, KeyCode::Char('C')) => { + KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => { self.navigate_back(); } _ => {} @@ -92,29 +95,28 @@ impl TuiApp { } fn handle_history_keys(&mut self, key: KeyEvent) { - match (key.modifiers, key.code) { - (_, KeyCode::Up | KeyCode::Down) => { + match key.code { + KeyCode::Up | KeyCode::Down => { self.dashboard_state .add_log("History navigation".to_string()); } - (_, KeyCode::Enter) => { + KeyCode::Enter => { self.dashboard_state .add_log("Go to selected checkpoint".to_string()); } - (_, KeyCode::Char('r')) => { + KeyCode::Char('r') | KeyCode::Char('R') => { self.dashboard_state .add_log("Replay from selected point".to_string()); } - (_, KeyCode::Char('d')) => { + KeyCode::Char('d') | KeyCode::Char('D') => { self.dashboard_state .add_log("Show execution details".to_string()); } - (_, KeyCode::Char('s')) => { + KeyCode::Char('s') | KeyCode::Char('S') => { self.dashboard_state .add_log("Save execution history".to_string()); } - (_, KeyCode::Esc | KeyCode::Char('q')) - | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => { + KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => { self.navigate_back(); } _ => {} @@ -122,21 +124,20 @@ impl TuiApp { } fn handle_profiler_keys(&mut self, key: KeyEvent) { - match (key.modifiers, key.code) { - (_, KeyCode::Char('s')) => { + match key.code { + KeyCode::Char('s') | KeyCode::Char('S') => { self.profile_state.save_report(); self.dashboard_state .add_log("Performance report saved".to_string()); } - (_, KeyCode::Char('e')) => { + KeyCode::Char('e') | KeyCode::Char('E') => { self.profile_state.export_csv(); self.dashboard_state.add_log("Export to CSV".to_string()); } - (_, KeyCode::Char('f')) => { + KeyCode::Char('f') | KeyCode::Char('F') => { self.dashboard_state.add_log("Filter functions".to_string()); } - (_, KeyCode::Esc | KeyCode::Char('q')) - | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => { + KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => { self.navigate_back(); } _ => {} @@ -144,28 +145,26 @@ impl TuiApp { } fn handle_call_stack_keys(&mut self, key: KeyEvent) { - match (key.modifiers, key.code) { - (_, KeyCode::Up | KeyCode::Down) => { + match key.code { + KeyCode::Up | KeyCode::Down => { self.dashboard_state .add_log("Navigate call stack".to_string()); } - (_, KeyCode::Enter) => { + KeyCode::Enter => { self.dashboard_state .add_log("Jump to selected frame".to_string()); } - (_, KeyCode::Char('v')) => { + KeyCode::Char('v') | KeyCode::Char('V') => { self.navigate_to(Scene::VariableEditor); } - (_, KeyCode::Char('b')) => { + KeyCode::Char('b') | KeyCode::Char('B') => { self.dashboard_state.add_log("Breakpoint set".to_string()); } - (_, KeyCode::Char('c')) => { - self.dashboard_state - .add_log("Continue execution".to_string()); + KeyCode::Char('c') | KeyCode::Char('C') => { + self.dashboard_state.continue_execution(); self.navigate_back(); } - (_, KeyCode::Esc | KeyCode::Char('q')) - | (KeyModifiers::CONTROL, KeyCode::Char('C')) => { + KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => { self.navigate_back(); } _ => {} @@ -173,22 +172,20 @@ impl TuiApp { } fn handle_error_dialog_keys(&mut self, key: KeyEvent) { - match (key.modifiers, key.code) { - (_, KeyCode::Char('f')) => { + match key.code { + KeyCode::Char('f') | KeyCode::Char('F') => { self.navigate_to(Scene::VariableEditor); } - (_, KeyCode::Char('s')) => { - self.dashboard_state - .add_log("Function skipped with default value".to_string()); + KeyCode::Char('s') | KeyCode::Char('S') => { + self.dashboard_state.skip_function(serde_json::Value::Null); self.navigate_back(); } - (_, KeyCode::Char('r')) => { + KeyCode::Char('r') | KeyCode::Char('R') => { self.dashboard_state .add_log("Restart from last checkpoint".to_string()); self.navigate_back(); } - (_, KeyCode::Esc | KeyCode::Char('q')) - | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => { + KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => { self.navigate_back(); } _ => {} diff --git a/src/tui/mod.rs b/crates/core/src/tui/mod.rs similarity index 72% rename from src/tui/mod.rs rename to crates/core/src/tui/mod.rs index 821b78f..36e9eb1 100644 --- a/src/tui/mod.rs +++ b/crates/core/src/tui/mod.rs @@ -3,4 +3,4 @@ pub mod events; pub mod keyboard_handler; pub mod scenes; -pub use app::TuiApp; +pub use app::CheckpointTUI; diff --git a/src/tui/scenes/call_stack.rs b/crates/core/src/tui/scenes/call_stack.rs similarity index 100% rename from src/tui/scenes/call_stack.rs rename to crates/core/src/tui/scenes/call_stack.rs diff --git a/src/tui/scenes/dashboard.rs b/crates/core/src/tui/scenes/dashboard.rs similarity index 65% rename from src/tui/scenes/dashboard.rs rename to crates/core/src/tui/scenes/dashboard.rs index 168bb9c..d88bbeb 100644 --- a/src/tui/scenes/dashboard.rs +++ b/crates/core/src/tui/scenes/dashboard.rs @@ -1,3 +1,4 @@ +use crate::services::IpcBridge; use ratatui::{ Frame, layout::{Alignment, Constraint, Direction, Layout, Rect}, @@ -10,6 +11,8 @@ use throbber_widgets_tui::{BRAILLE_SIX, Throbber, ThrobberState}; #[derive(Debug)] pub struct DashboardState { pub file_path: Option, + pub transformed_path: Option, + pub ipc_bridge: Option, pub runtime: String, pub execution_time: String, pub status: String, @@ -20,6 +23,15 @@ pub struct DashboardState { pub timeline_functions: Vec, pub logs: Vec, pub throbber_state: ThrobberState, + pub paused: bool, + pub pending_checkpoint: Option, +} + +#[derive(Clone, Debug)] +pub struct CheckpointData { + pub function_name: String, + pub args: Vec, + pub context: Option, } #[derive(Clone, Debug)] @@ -29,7 +41,6 @@ pub struct TimelineFunction { pub duration: Option, } -#[allow(dead_code)] #[derive(Clone, Debug)] pub enum FunctionStatus { Completed, @@ -42,7 +53,9 @@ impl Default for DashboardState { fn default() -> Self { Self { file_path: None, - runtime: "Bun v1.3.2".to_string(), + transformed_path: None, + ipc_bridge: None, + runtime: "Bun v1.3.5".to_string(), execution_time: "0s".to_string(), status: "Ready".to_string(), current_function: None, @@ -50,6 +63,8 @@ impl Default for DashboardState { called_by: None, stack_depth: 0, throbber_state: ThrobberState::default(), + paused: false, + pending_checkpoint: None, timeline_functions: vec![ TimelineFunction { name: "initApp".to_string(), @@ -77,11 +92,7 @@ impl Default for DashboardState { duration: None, }, ], - logs: vec![ - "System initialized".to_string(), - "Ready to start debugging...".to_string(), - "Waiting for user input...".to_string(), - ], + logs: vec!["System initialized".to_string()], } } } @@ -91,9 +102,148 @@ impl DashboardState { Self::default() } - pub fn set_file(&mut self, file: String) { - self.file_path = Some(file); - self.add_log("File loaded successfully".to_string()); + pub fn poll_ipc_messages(&mut self) { + if let Some(ref mut bridge) = self.ipc_bridge { + if let Some(message) = bridge.receive_json::(100) { + self.add_log(format!( + "IPC: {}", + serde_json::to_string(&message).unwrap_or_default() + )); + self.handle_ipc_message(message); + } + } + } + + fn handle_ipc_message(&mut self, message: serde_json::Value) { + if let Some(log_msg) = message.get("log").and_then(|v| v.as_str()) { + self.add_log(log_msg.to_string()); + } + + if let Some(msg_type) = message.get("type").and_then(|v| v.as_str()) { + match msg_type { + "checkpoint" => { + if let Some(payload) = message.get("payload") { + let func_name = payload + .get("functionName") + .and_then(|v| v.as_str()) + .unwrap_or("unknown"); + + let args = payload + .get("args") + .and_then(|v| v.as_array()) + .cloned() + .unwrap_or_default(); + + let context = payload + .get("context") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + + self.current_function = Some(func_name.to_string()); + self.add_log(format!("Checkpoint: {}", func_name)); + + self.pending_checkpoint = Some(CheckpointData { + function_name: func_name.to_string(), + args, + context, + }); + + self.paused = true; + self.status = "Paused".to_string(); + } + } + "error" => { + if let Some(error_msg) = message.get("message").and_then(|v| v.as_str()) { + self.add_log(format!("Error: {}", error_msg)); + } + } + "version" => { + if let Some(value) = message.get("value") { + if let Some(lv) = value.get("lv").and_then(|v| v.as_str()) { + self.runtime = lv.to_string(); + } + } + + if let Some(ref bridge) = self.ipc_bridge { + let _ = bridge.send_json(&serde_json::json!({ + "type": "version_ack" + })); + } + } + _ => {} + } + } + + if let Some(func) = message.get("current_function").and_then(|v| v.as_str()) { + self.current_function = Some(func.to_string()); + } + if let Some(line) = message.get("current_line").and_then(|v| v.as_u64()) { + self.current_line = Some(line as u32); + } + } + + pub fn continue_execution(&mut self) { + if self.paused { + if let Some(ref bridge) = self.ipc_bridge { + let _ = bridge.send_json(&serde_json::json!({ + "type": "continue" + })); + } + self.paused = false; + self.pending_checkpoint = None; + self.status = "Running".to_string(); + self.add_log("Execution continued".to_string()); + } + } + + pub fn skip_function(&mut self, return_value: serde_json::Value) { + if self.paused { + if let Some(ref bridge) = self.ipc_bridge { + let _ = bridge.send_json(&serde_json::json!({ + "type": "skip", + "returnValue": return_value + })); + } + self.paused = false; + self.pending_checkpoint = None; + self.status = "Running".to_string(); + self.add_log("Function skipped".to_string()); + } + } + + pub fn set_file( + &mut self, + transformed_file: String, + original_file: String, + ) -> Result<(), Box> { + self.file_path = Some(original_file); + self.transformed_path = Some(transformed_file.clone()); + + match IpcBridge::spawn_runtime(&transformed_file) { + Ok(bridge) => { + self.status = "Starting".to_string(); + self.add_log("Runtime started, loading application...".to_string()); + + let _ = bridge.load_app(); + + self.ipc_bridge = Some(bridge); + self.status = "Running".to_string(); + Ok(()) + } + Err(e) => { + self.status = "Error".to_string(); + self.add_log(format!("Failed to start runtime: {}", e)); + Err(e) + } + } + } + + pub fn shutdown(&mut self) { + if let Some(ref mut bridge) = self.ipc_bridge { + bridge.shutdown(); + } + self.ipc_bridge = None; + self.status = "Stopped".to_string(); } pub fn tick_throbber(&mut self) { @@ -149,6 +299,12 @@ impl DashboardState { } } +impl Drop for DashboardState { + fn drop(&mut self) { + self.shutdown(); + } +} + pub fn draw(frame: &mut Frame, area: Rect, state: &mut DashboardState) { let main_layout = Layout::default() .direction(Direction::Vertical) @@ -182,7 +338,13 @@ fn draw_header(frame: &mut Frame, area: Rect, state: &DashboardState) { let line1_right = format!("Runtime: {}", state.runtime); let line1 = format!("{: = state.logs.iter().rev().take(10).rev().collect(); + let display_logs: Vec<_> = state.logs.iter().rev().take(30).rev().collect(); let logs_text = display_logs .iter() .map(|s| s.as_str()) diff --git a/src/tui/scenes/error_dialog.rs b/crates/core/src/tui/scenes/error_dialog.rs similarity index 100% rename from src/tui/scenes/error_dialog.rs rename to crates/core/src/tui/scenes/error_dialog.rs diff --git a/src/tui/scenes/function_skip.rs b/crates/core/src/tui/scenes/function_skip.rs similarity index 100% rename from src/tui/scenes/function_skip.rs rename to crates/core/src/tui/scenes/function_skip.rs diff --git a/crates/core/src/tui/scenes/history.rs b/crates/core/src/tui/scenes/history.rs new file mode 100644 index 0000000..37a0238 --- /dev/null +++ b/crates/core/src/tui/scenes/history.rs @@ -0,0 +1,200 @@ +use ratatui::{ + Frame, + layout::{Constraint, Direction, Layout, Rect}, + style::Stylize, + widgets::{Block, Borders, Cell, Paragraph, Row, Table}, +}; + +#[allow(dead_code)] +#[derive(Debug, Clone)] +pub struct ExecutionHistoryState { + pub total_functions: u32, + pub skipped: u32, + pub executed: u32, + pub total_time: f32, + pub function_calls: Vec, + pub selected_index: usize, +} + +#[derive(Clone, Debug)] +pub struct FunctionCall { + pub time: String, + pub function: String, + pub status: CallStatus, + pub duration: String, + pub return_value: String, +} + +#[allow(dead_code)] +#[derive(Clone, Debug)] +pub enum CallStatus { + Exec, + Skip, + Pause, +} + +impl Default for ExecutionHistoryState { + fn default() -> Self { + Self { + total_functions: 23, + skipped: 5, + executed: 18, + total_time: 1.2, + function_calls: vec![ + FunctionCall { + time: "0.0ms".to_string(), + function: "initApp()".to_string(), + status: CallStatus::Exec, + duration: "2ms".to_string(), + return_value: "undefined".to_string(), + }, + FunctionCall { + time: "2.1ms".to_string(), + function: "loadConfig()".to_string(), + status: CallStatus::Exec, + duration: "15ms".to_string(), + return_value: "{...}".to_string(), + }, + FunctionCall { + time: "17.3ms".to_string(), + function: "connectDB()".to_string(), + status: CallStatus::Exec, + duration: "120ms".to_string(), + return_value: "Connection".to_string(), + }, + FunctionCall { + time: "137.8ms".to_string(), + function: "fetchUser()".to_string(), + status: CallStatus::Exec, + duration: "45ms".to_string(), + return_value: "User{id:123}".to_string(), + }, + FunctionCall { + time: "183.2ms".to_string(), + function: "validateUser()".to_string(), + status: CallStatus::Skip, + duration: "0ms".to_string(), + return_value: "true (injected)".to_string(), + }, + FunctionCall { + time: "183.3ms".to_string(), + function: "loadPermissions()".to_string(), + status: CallStatus::Skip, + duration: "0ms".to_string(), + return_value: "['read','write']".to_string(), + }, + FunctionCall { + time: "183.4ms".to_string(), + function: "processOrder()".to_string(), + status: CallStatus::Exec, + duration: "25ms".to_string(), + return_value: "order{...}".to_string(), + }, + FunctionCall { + time: "208.7ms".to_string(), + function: "calculateTax()".to_string(), + status: CallStatus::Pause, + duration: "?".to_string(), + return_value: "?".to_string(), + }, + ], + selected_index: 0, + } + } +} + +impl ExecutionHistoryState { + pub fn new() -> Self { + Self::default() + } +} + +pub fn draw(frame: &mut Frame, area: Rect, state: &ExecutionHistoryState) { + let main_layout = Layout::default() + .direction(Direction::Vertical) + .constraints([ + Constraint::Length(3), + Constraint::Min(10), + Constraint::Length(5), + ]) + .split(area); + + draw_summary(frame, main_layout[0], state); + draw_function_timeline(frame, main_layout[1], state); + draw_navigation(frame, main_layout[2]); +} + +fn draw_summary(frame: &mut Frame, area: Rect, state: &ExecutionHistoryState) { + let summary_text = format!( + "Total Functions: {} Skipped: {} Executed: {} Total Time: {}s", + state.total_functions, state.skipped, state.executed, state.total_time + ); + frame.render_widget( + Paragraph::new(summary_text).block( + Block::default() + .borders(Borders::ALL) + .title("Execution History".blue().bold()), + ), + area, + ); +} + +fn draw_function_timeline(frame: &mut Frame, area: Rect, state: &ExecutionHistoryState) { + let header = Row::new(vec![ + Cell::from("Time").style(ratatui::style::Style::default().bold()), + Cell::from("Function").style(ratatui::style::Style::default().bold()), + Cell::from("Status").style(ratatui::style::Style::default().bold()), + Cell::from("Duration").style(ratatui::style::Style::default().bold()), + Cell::from("Return Value").style(ratatui::style::Style::default().bold()), + ]); + + let rows: Vec = state + .function_calls + .iter() + .map(|call| { + let status_symbol = match call.status { + CallStatus::Exec => "βœ“ Exec", + CallStatus::Skip => "⊘ Skip", + CallStatus::Pause => "⏸ Pause", + }; + Row::new(vec![ + Cell::from(call.time.clone()), + Cell::from(call.function.clone()), + Cell::from(status_symbol), + Cell::from(call.duration.clone()), + Cell::from(call.return_value.clone()), + ]) + }) + .collect(); + + let table = Table::new( + rows, + [ + Constraint::Length(10), + Constraint::Percentage(25), + Constraint::Length(12), + Constraint::Length(10), + Constraint::Percentage(35), + ], + ) + .header(header) + .block( + Block::default() + .borders(Borders::ALL) + .title("Function Call Timeline".yellow().bold()), + ); + + frame.render_widget(table, area); +} + +fn draw_navigation(frame: &mut Frame, area: Rect) { + let navigation_text = "[↑↓] Navigate [Enter] Go to Checkpoint [R] Replay from Here [D] Show Details [S] Save History [Esc] Back to Dashboard"; + frame.render_widget( + Paragraph::new(navigation_text).block( + Block::default() + .borders(Borders::ALL) + .title("Navigation".green().bold()), + ), + area, + ); +} diff --git a/src/tui/scenes/mod.rs b/crates/core/src/tui/scenes/mod.rs similarity index 100% rename from src/tui/scenes/mod.rs rename to crates/core/src/tui/scenes/mod.rs diff --git a/src/tui/scenes/profiler.rs b/crates/core/src/tui/scenes/profiler.rs similarity index 98% rename from src/tui/scenes/profiler.rs rename to crates/core/src/tui/scenes/profiler.rs index 01a547e..13efb78 100644 --- a/src/tui/scenes/profiler.rs +++ b/crates/core/src/tui/scenes/profiler.rs @@ -157,7 +157,7 @@ fn draw_performance_stats(frame: &mut Frame, area: Rect, state: &PerformanceProf fn draw_slowest_functions(frame: &mut Frame, area: Rect, state: &PerformanceProfileState) { let mut functions = state.functions.clone(); - functions.sort_by(|a, b| b.ms.cmp(&a.ms)); + functions.sort_by_key(|f| std::cmp::Reverse(f.ms)); let max_duration = functions.first().map(|f| f.ms).unwrap_or(0); let available_width = area.width.saturating_sub(20); @@ -205,7 +205,7 @@ fn draw_slowest_functions(frame: &mut Frame, area: Rect, state: &PerformanceProf fn draw_call_frequency(frame: &mut Frame, area: Rect, state: &PerformanceProfileState) { let mut functions = state.functions.clone(); - functions.sort_by(|a, b| b.call_count.cmp(&a.call_count)); + functions.sort_by_key(|f| std::cmp::Reverse(f.call_count)); let max_calls = functions.first().map(|f| f.call_count).unwrap_or(0); let available_width = area.width.saturating_sub(35); diff --git a/src/tui/scenes/variable_editor.rs b/crates/core/src/tui/scenes/variable_editor.rs similarity index 100% rename from src/tui/scenes/variable_editor.rs rename to crates/core/src/tui/scenes/variable_editor.rs diff --git a/crates/core/src/utils/discord_rpc.rs b/crates/core/src/utils/discord_rpc.rs new file mode 100644 index 0000000..ef6d087 --- /dev/null +++ b/crates/core/src/utils/discord_rpc.rs @@ -0,0 +1,340 @@ +#[cfg(windows)] +use std::fs::OpenOptions; +use std::io::{self, Read, Write}; +#[cfg(unix)] +use std::os::unix::net::UnixStream; +use std::path::PathBuf; + +const RPC_VERSION: u32 = 1; + +#[derive(Debug, Clone, Copy)] +#[repr(u32)] +enum OpCode { + Handshake = 0, + Frame = 1, + Close = 2, + #[expect(dead_code)] + Ping = 3, + #[expect(dead_code)] + Pong = 4, +} + +#[derive(Debug, Default)] +pub struct Activity { + pub state: Option, + pub details: Option, + pub large_image: Option, + pub large_text: Option, + pub small_image: Option, + pub small_text: Option, + pub start_timestamp: Option, + pub buttons: Option>, +} + +#[derive(Debug)] +pub struct Button { + pub label: String, + pub url: String, +} + +impl Activity { + pub fn new() -> Self { + Self::default() + } + + fn to_json(&self) -> serde_json::Value { + let mut activity = serde_json::Map::new(); + + if let Some(ref state) = self.state { + activity.insert("state".into(), serde_json::Value::String(state.clone())); + } + if let Some(ref details) = self.details { + activity.insert("details".into(), serde_json::Value::String(details.clone())); + } + + let mut assets = serde_json::Map::new(); + let mut has_assets = false; + + if let Some(ref key) = self.large_image { + assets.insert("large_image".into(), serde_json::Value::String(key.clone())); + has_assets = true; + } + if let Some(ref text) = self.large_text { + assets.insert("large_text".into(), serde_json::Value::String(text.clone())); + has_assets = true; + } + if let Some(ref key) = self.small_image { + assets.insert("small_image".into(), serde_json::Value::String(key.clone())); + has_assets = true; + } + if let Some(ref text) = self.small_text { + assets.insert("small_text".into(), serde_json::Value::String(text.clone())); + has_assets = true; + } + + if has_assets { + activity.insert("assets".into(), serde_json::Value::Object(assets)); + } + + if let Some(ts) = self.start_timestamp { + let timestamps = serde_json::json!({ "start": ts }); + activity.insert("timestamps".into(), timestamps); + } + + if let Some(ref buttons) = self.buttons { + let button_array: Vec = buttons + .iter() + .map(|btn| { + serde_json::json!({ + "label": btn.label, + "url": btn.url + }) + }) + .collect(); + activity.insert("buttons".into(), serde_json::Value::Array(button_array)); + } + + serde_json::Value::Object(activity) + } +} + +enum Connection { + #[cfg(unix)] + Unix(UnixStream), + #[cfg(windows)] + Pipe(std::fs::File), +} + +impl std::fmt::Debug for Connection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + #[cfg(unix)] + Connection::Unix(_) => f.write_str("Connection::Unix(..)"), + #[cfg(windows)] + Connection::Pipe(_) => f.write_str("Connection::Pipe(..)"), + } + } +} + +impl Connection { + fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { + match self { + #[cfg(unix)] + Connection::Unix(stream) => stream.write_all(buf), + #[cfg(windows)] + Connection::Pipe(file) => file.write_all(buf), + } + } + + fn flush(&mut self) -> io::Result<()> { + match self { + #[cfg(unix)] + Connection::Unix(stream) => stream.flush(), + #[cfg(windows)] + Connection::Pipe(file) => file.flush(), + } + } + + fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> { + match self { + #[cfg(unix)] + Connection::Unix(stream) => stream.read_exact(buf), + #[cfg(windows)] + Connection::Pipe(file) => file.read_exact(buf), + } + } +} + +pub struct DiscordRpc { + client_id: String, + connection: Connection, + pid: u32, +} + +impl std::fmt::Debug for DiscordRpc { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DiscordRpc") + .field("client_id", &self.client_id) + .field("pid", &self.pid) + .finish_non_exhaustive() + } +} + +impl DiscordRpc { + pub fn connect(client_id: &str) -> io::Result { + let connection = Self::open_connection()?; + let mut rpc = Self { + client_id: client_id.to_string(), + connection, + pid: std::process::id(), + }; + rpc.handshake()?; + Ok(rpc) + } + + #[cfg(unix)] + fn open_connection() -> io::Result { + let candidates = Self::socket_paths(); + for path in &candidates { + if let Ok(stream) = UnixStream::connect(path) { + return Ok(Connection::Unix(stream)); + } + } + Err(io::Error::new( + io::ErrorKind::NotFound, + "discord ipc socket not found", + )) + } + + #[cfg(unix)] + fn socket_paths() -> Vec { + let dirs: Vec = [ + std::env::var("XDG_RUNTIME_DIR").ok(), + std::env::var("TMPDIR").ok(), + std::env::var("TMP").ok(), + std::env::var("TEMP").ok(), + Some("/tmp".into()), + ] + .into_iter() + .flatten() + .collect(); + + let mut paths = Vec::new(); + for dir in dirs { + for i in 0..10 { + paths.push(PathBuf::from(&dir).join(format!("discord-ipc-{i}"))); + let snap_path = PathBuf::from(&dir) + .join("snap.discord") + .join(format!("discord-ipc-{i}")); + paths.push(snap_path); + let flatpak_path = PathBuf::from(&dir) + .join("app") + .join("com.discordapp.Discord") + .join(format!("discord-ipc-{i}")); + paths.push(flatpak_path); + } + } + paths + } + + #[cfg(windows)] + fn open_connection() -> io::Result { + for i in 0..10 { + let pipe_name = format!(r"\\.\pipe\discord-ipc-{i}"); + let file = OpenOptions::new().read(true).write(true).open(&pipe_name); + if let Ok(f) = file { + return Ok(Connection::Pipe(f)); + } + } + Err(io::Error::new( + io::ErrorKind::NotFound, + "discord ipc pipe not found", + )) + } + + fn handshake(&mut self) -> io::Result<()> { + let payload = serde_json::json!({ + "v": RPC_VERSION, + "client_id": self.client_id, + }); + self.send(OpCode::Handshake, &payload)?; + let (_op, _response) = self.recv()?; + Ok(()) + } + + pub fn set_activity(&mut self, activity: &Activity) -> io::Result<()> { + let payload = serde_json::json!({ + "cmd": "SET_ACTIVITY", + "args": { + "pid": self.pid, + "activity": activity.to_json(), + }, + "nonce": Self::nonce(), + }); + self.send(OpCode::Frame, &payload)?; + let _ = self.recv()?; + Ok(()) + } + + pub fn clear_activity(&mut self) -> io::Result<()> { + let payload = serde_json::json!({ + "cmd": "SET_ACTIVITY", + "args": { + "pid": self.pid, + }, + "nonce": Self::nonce(), + }); + self.send(OpCode::Frame, &payload)?; + let _ = self.recv()?; + Ok(()) + } + + fn send(&mut self, opcode: OpCode, payload: &serde_json::Value) -> io::Result<()> { + let json_bytes = serde_json::to_vec(payload) + .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; + let mut header = [0u8; 8]; + header[..4].copy_from_slice(&(opcode as u32).to_le_bytes()); + header[4..8].copy_from_slice(&(json_bytes.len() as u32).to_le_bytes()); + self.connection.write_all(&header)?; + self.connection.write_all(&json_bytes)?; + self.connection.flush() + } + + fn recv(&mut self) -> io::Result<(u32, serde_json::Value)> { + let mut header = [0u8; 8]; + self.connection.read_exact(&mut header)?; + let opcode = u32::from_le_bytes(header[..4].try_into().unwrap()); + let length = u32::from_le_bytes(header[4..8].try_into().unwrap()) as usize; + let mut buf = vec![0u8; length]; + self.connection.read_exact(&mut buf)?; + let value: serde_json::Value = serde_json::from_slice(&buf) + .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; + + if opcode == OpCode::Close as u32 { + let msg = value["message"] + .as_str() + .unwrap_or("connection closed by discord"); + return Err(io::Error::new(io::ErrorKind::ConnectionReset, msg)); + } + + Ok((opcode, value)) + } + + fn nonce() -> String { + use std::time::{SystemTime, UNIX_EPOCH}; + let ts = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default(); + format!("{}{}", ts.as_nanos(), std::process::id()) + } +} + +impl Drop for DiscordRpc { + fn drop(&mut self) { + let _ = self.clear_activity(); + let payload = serde_json::json!({}); + let _ = self.send(OpCode::Close, &payload); + } +} + +#[derive(Debug)] +pub struct RpcSession { + rpc: Option, + pub activity: Activity, +} + +impl RpcSession { + pub fn new(rpc: Option, activity: Activity) -> Self { + Self { rpc, activity } + } + + pub fn update(&mut self) { + if let Some(ref mut rpc) = self.rpc { + let _ = rpc.set_activity(&self.activity); + } + } + + pub fn connected(&self) -> bool { + self.rpc.is_some() + } +} diff --git a/crates/core/src/utils/entry_finder.rs b/crates/core/src/utils/entry_finder.rs new file mode 100644 index 0000000..9a287bb --- /dev/null +++ b/crates/core/src/utils/entry_finder.rs @@ -0,0 +1,70 @@ +use serde_json::Value; +use std::fs; +use std::path::{Path, PathBuf}; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum EntryError { + #[error("Path does not exist: {0}")] + PathNotFound(PathBuf), + #[error("Cannot read package.json: {0}")] + PackageJsonReadError(#[from] std::io::Error), + #[error("Invalid package.json format")] + InvalidPackageJson, + #[error( + "No entry file found in {0}. Looked for: package.json main, index.ts, index.js, main.ts, main.js" + )] + NoEntryFound(PathBuf), +} + +pub fn find_entry_file(path: Option<&str>) -> Result { + let path = path.ok_or_else(|| EntryError::PathNotFound(PathBuf::new()))?; + let base = Path::new(path); + + if !base.exists() { + return Err(EntryError::PathNotFound(base.to_path_buf())); + } + + if base.is_file() { + return Ok(base.to_path_buf()); + } + + if let Some(entry) = try_package_json(base)? { + return Ok(entry); + } + + let candidates = ["index.ts", "index.js", "main.ts", "main.js"]; + + for candidate in candidates { + let candidate_path = base.join(candidate); + if candidate_path.is_file() { + return Ok(candidate_path); + } + } + + Err(EntryError::NoEntryFound(base.to_path_buf())) +} + +fn try_package_json(base: &Path) -> Result, EntryError> { + let pkg_path = base.join("package.json"); + + if !pkg_path.exists() { + return Ok(None); + } + + let content = fs::read_to_string(&pkg_path)?; + let pkg: Value = serde_json::from_str(&content).map_err(|_| EntryError::InvalidPackageJson)?; + + let main_field = match pkg.get("main").and_then(|v| v.as_str()) { + Some(m) => m.trim(), + None => return Ok(None), + }; + + let main_path = base.join(main_field); + + if main_path.is_file() { + return Ok(Some(main_path)); + } + + Ok(None) +} diff --git a/crates/core/src/utils/mod.rs b/crates/core/src/utils/mod.rs new file mode 100644 index 0000000..228aa3e --- /dev/null +++ b/crates/core/src/utils/mod.rs @@ -0,0 +1,5 @@ +pub mod discord_rpc; +pub mod entry_finder; +pub mod num_utils; +pub mod project_context; +pub mod transform_cache; diff --git a/src/utils/num_utils.rs b/crates/core/src/utils/num_utils.rs similarity index 100% rename from src/utils/num_utils.rs rename to crates/core/src/utils/num_utils.rs diff --git a/crates/core/src/utils/project_context.rs b/crates/core/src/utils/project_context.rs new file mode 100644 index 0000000..049b446 --- /dev/null +++ b/crates/core/src/utils/project_context.rs @@ -0,0 +1,80 @@ +use serde::{Deserialize, Serialize}; +use std::fs; +use std::path::{Path, PathBuf}; + +#[derive(Debug, Serialize, Deserialize, Default, Clone)] +pub struct CheckpointConfig { + pub output_dir: Option, + pub minify: Option, + pub preserve_sessions: Option, +} + +#[derive(Clone)] +pub struct ProjectContext { + pub root: PathBuf, + pub checkpoint_dir: PathBuf, + pub config: CheckpointConfig, +} + +impl ProjectContext { + pub fn discover(entry_file: &Path) -> Self { + let root = Self::find_project_root(entry_file); + let checkpoint_dir = root.join(".checkpoint"); + let config = Self::load_config(&root); + + Self { + root, + checkpoint_dir, + config, + } + } + + fn find_project_root(entry_file: &Path) -> PathBuf { + let start_dir = if entry_file.is_file() { + entry_file.parent().unwrap_or(entry_file) + } else { + entry_file + }; + + let mut current = start_dir.to_path_buf(); + + loop { + if current.join("package.json").exists() { + return current; + } + + if !current.pop() { + return start_dir.to_path_buf(); + } + } + } + + fn load_config(root: &Path) -> CheckpointConfig { + let local_config = root.join(".checkpointrc.json"); + let global_config = dirs::home_dir() + .map(|h| h.join(".checkpointrc.json")) + .unwrap_or_default(); + + if local_config.exists() { + return Self::parse_config(&local_config).unwrap_or_default(); + } + + if global_config.exists() { + return Self::parse_config(&global_config).unwrap_or_default(); + } + + CheckpointConfig::default() + } + + fn parse_config(path: &Path) -> Option { + let content = fs::read_to_string(path).ok()?; + serde_json::from_str(&content).ok() + } + + pub fn ensure_checkpoint_dir(&self) -> std::io::Result<()> { + fs::create_dir_all(&self.checkpoint_dir)?; + fs::create_dir_all(self.checkpoint_dir.join("sessions"))?; + fs::create_dir_all(self.checkpoint_dir.join("transforms"))?; + Ok(()) + } +} diff --git a/crates/core/src/utils/transform_cache.rs b/crates/core/src/utils/transform_cache.rs new file mode 100644 index 0000000..f0415b2 --- /dev/null +++ b/crates/core/src/utils/transform_cache.rs @@ -0,0 +1,68 @@ +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use std::collections::HashMap; +use std::fs; +use std::path::{Path, PathBuf}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct FileCache { + pub hash: String, + pub last_transform: String, + pub transform_path: PathBuf, +} + +#[derive(Debug, Serialize, Deserialize, Default)] +pub struct TransformCache { + pub version: String, + pub files: HashMap, +} + +impl TransformCache { + const VERSION: &'static str = env!("CARGO_PKG_VERSION"); + + pub fn load(cache_path: &Path) -> Self { + if !cache_path.exists() { + return Self::default(); + } + + fs::read_to_string(cache_path) + .ok() + .and_then(|content| serde_json::from_str(&content).ok()) + .filter(|cache: &TransformCache| cache.version == Self::VERSION) + .unwrap_or_default() + } + + pub fn save(&self, cache_path: &Path) -> std::io::Result<()> { + let content = serde_json::to_string_pretty(self)?; + fs::write(cache_path, content) + } + + pub fn compute_hash(content: &str) -> String { + let mut hasher = Sha256::new(); + hasher.update(content.as_bytes()); + format!("{:x}", hasher.finalize()) + } + + pub fn is_cached(&self, file_path: &str, current_hash: &str) -> bool { + self.files + .get(file_path) + .map(|cache| cache.hash == current_hash) + .unwrap_or(false) + } + + pub fn get_transform_path(&self, file_path: &str) -> Option<&PathBuf> { + self.files.get(file_path).map(|cache| &cache.transform_path) + } + + pub fn update(&mut self, file_path: String, hash: String, transform_path: PathBuf) { + self.version = Self::VERSION.to_string(); + self.files.insert( + file_path, + FileCache { + hash, + last_transform: chrono::Utc::now().to_rfc3339(), + transform_path, + }, + ); + } +} diff --git a/crates/parser/Cargo.lock b/crates/parser/Cargo.lock new file mode 100644 index 0000000..f8746bb --- /dev/null +++ b/crates/parser/Cargo.lock @@ -0,0 +1,2471 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "ar_archive_writer" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a" +dependencies = [ + "object", +] + +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + +[[package]] +name = "ast_node" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb025ef00a6da925cf40870b9c8d008526b6004ece399cb0974209720f0b194" +dependencies = [ + "quote", + "swc_macros_common", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "better_scoped_tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd228125315b132eed175bf47619ac79b945b26e56b848ba203ae4ea8603609" +dependencies = [ + "scoped-tls", +] + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "bytecheck" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "rancor", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "bytes-str" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c60b5ce37e0b883c37eb89f79a1e26fbe9c1081945d024eee93e8d91a7e18b3" +dependencies = [ + "bytes", + "rkyv", + "serde", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cbor4ii" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faed1a83001dc2c9201451030cc317e35bef36c84d3781d7c5bb9f343c397da8" + +[[package]] +name = "cc" +version = "1.2.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "compact_str" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "ryu", + "static_assertions", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "serde", + "uuid", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "difference" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[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 = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "from_variant" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ff35a391aef949120a0340d690269b3d9f63460a6106e99bd07b961f345ea9" +dependencies = [ + "swc_macros_common", + "syn", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hstr" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c43c0a9e8fbdb3bb9dc8eee85e1e2ac81605418b4c83b6b7413cbf14d56ca5c" +dependencies = [ + "hashbrown 0.14.5", + "new_debug_unreachable", + "once_cell", + "rustc-hash", + "serde", + "triomphe", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +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 = "if_chain" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd62e6b5e86ea8eeeb8db1de02880a6abc01a397b2ebb64b5d74ac255318f5cb" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", +] + +[[package]] +name = "is-macro" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "cfg-if", + "miette-derive", + "owo-colors", + "textwrap", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "munge" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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", + "serde", +] + +[[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-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "owo-colors" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" + +[[package]] +name = "par-core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96cbd21255b7fb29a5d51ef38a779b517a91abd59e2756c039583f43ef4c90f" +dependencies = [ + "once_cell", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.1", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "proc-macro2" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "psm" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01" +dependencies = [ + "ar_archive_writer", + "cc", +] + +[[package]] +name = "ptr_meta" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +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 = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rancor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" +dependencies = [ + "ptr_meta", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + +[[package]] +name = "rend" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360b333c61ae24e5af3ae7c8660bd6b21ccd8200dbbc5d33c2454421e85b9c69" +dependencies = [ + "bytecheck", + "bytes", + "hashbrown 0.16.1", + "indexmap", + "munge", + "ptr_meta", + "rancor", + "rend", + "rkyv_derive", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02f8cdd12b307ab69fe0acf4cd2249c7460eb89dce64a0febadf934ebb6a9e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rust_swc_parser" +version = "0.1.0" +dependencies = [ + "serde", + "swc_core", + "swc_ecma_codegen", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" + +[[package]] +name = "ryu-js" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[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 = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[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.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smartstring" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" +dependencies = [ + "autocfg", + "static_assertions", + "version_check", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stacker" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_enum" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36a4951ca7bd1cfd991c241584a9824a70f6aff1e7d4f693fb3f2465e4030e" +dependencies = [ + "quote", + "swc_macros_common", + "syn", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swc_allocator" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d7eefd2c8b228a8c73056482b2ae4b3a1071fbe07638e3b55ceca8570cc48bb" +dependencies = [ + "allocator-api2", + "bumpalo", + "hashbrown 0.14.5", + "rustc-hash", +] + +[[package]] +name = "swc_atoms" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ccbe2ecad10ad7432100f878a107b1d972a8aee83ca53184d00c23a078bb8a" +dependencies = [ + "bytecheck", + "cbor4ii", + "hstr", + "once_cell", + "rancor", + "rkyv", + "serde", +] + +[[package]] +name = "swc_common" +version = "18.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1c06698254e9b47daaf9bbb062af489a350bd8d10dfaab0cabbd32d46cec69d" +dependencies = [ + "anyhow", + "ast_node", + "better_scoped_tls", + "bytecheck", + "bytes-str", + "cbor4ii", + "either", + "from_variant", + "num-bigint", + "once_cell", + "parking_lot", + "rancor", + "rkyv", + "rustc-hash", + "serde", + "siphasher 0.3.11", + "swc_atoms", + "swc_eq_ignore_macros", + "swc_sourcemap", + "swc_visit", + "termcolor", + "tracing", + "unicode-width 0.2.2", + "url", +] + +[[package]] +name = "swc_config" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e90b52ee734ded867104612218101722ad87ff4cf74fe30383bd244a533f97" +dependencies = [ + "anyhow", + "bytes-str", + "indexmap", + "serde", + "serde_json", + "swc_config_macro", +] + +[[package]] +name = "swc_config_macro" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b416e8ce6de17dc5ea496e10c7012b35bbc0e3fef38d2e065eed936490db0b3" +dependencies = [ + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + +[[package]] +name = "swc_core" +version = "54.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f361c932ffe029754a10512ee217f550109ee80dda1fe6ec90772440bfc0a68" +dependencies = [ + "swc_allocator", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_codegen", + "swc_ecma_parser", + "swc_ecma_transforms_base", + "swc_ecma_transforms_testing", + "swc_ecma_transforms_typescript", + "swc_ecma_visit", + "swc_plugin", + "swc_plugin_macro", + "swc_plugin_proxy", + "swc_transform_common", + "vergen", +] + +[[package]] +name = "swc_ecma_ast" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "724195600825cbdd2a899d5473d2ce1f24ae418bff1231f160ecf38a3bc81f46" +dependencies = [ + "bitflags", + "cbor4ii", + "is-macro", + "num-bigint", + "once_cell", + "phf", + "rustc-hash", + "string_enum", + "swc_atoms", + "swc_common", + "swc_visit", + "unicode-id-start", +] + +[[package]] +name = "swc_ecma_codegen" +version = "21.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c77d9d21345ca986ae3b5ff1a4fa3607b15b07ed397506e6dba32e867cf40fd" +dependencies = [ + "ascii", + "compact_str", + "memchr", + "num-bigint", + "once_cell", + "regex", + "rustc-hash", + "ryu-js", + "serde", + "swc_allocator", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_codegen_macros", + "swc_sourcemap", + "tracing", +] + +[[package]] +name = "swc_ecma_codegen_macros" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e276dc62c0a2625a560397827989c82a93fd545fcf6f7faec0935a82cc4ddbb8" +dependencies = [ + "proc-macro2", + "swc_macros_common", + "syn", +] + +[[package]] +name = "swc_ecma_parser" +version = "32.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d0c36843109fff178bbedc439b4190daa865d78e553134243a4df220329fdd" +dependencies = [ + "bitflags", + "either", + "num-bigint", + "phf", + "rustc-hash", + "seq-macro", + "serde", + "smartstring", + "stacker", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "tracing", +] + +[[package]] +name = "swc_ecma_testing" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177244625cdecd268a07534c3b087f7f263604dd40f3ec7c7a984ca95351b632" +dependencies = [ + "anyhow", + "hex", + "sha2", + "testing", + "tracing", +] + +[[package]] +name = "swc_ecma_transforms_base" +version = "35.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83f9f0dee4466e6eeb7042f2a0fc6c84298dfa914baff5bcfb44beb9f24b215f" +dependencies = [ + "better_scoped_tls", + "indexmap", + "once_cell", + "par-core", + "phf", + "rustc-hash", + "serde", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_parser", + "swc_ecma_utils", + "swc_ecma_visit", + "tracing", +] + +[[package]] +name = "swc_ecma_transforms_react" +version = "38.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "652b77238937631359f964e53d53ca2b92f9fa29c6a28c9d3b054c44e18a17b9" +dependencies = [ + "base64", + "bytes-str", + "indexmap", + "once_cell", + "rustc-hash", + "serde", + "sha1", + "string_enum", + "swc_atoms", + "swc_common", + "swc_config", + "swc_ecma_ast", + "swc_ecma_parser", + "swc_ecma_transforms_base", + "swc_ecma_utils", + "swc_ecma_visit", +] + +[[package]] +name = "swc_ecma_transforms_testing" +version = "38.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df902ecb7e522c8df33f11db02fbed22abd4809663490100e3ea66c103130dd" +dependencies = [ + "ansi_term", + "anyhow", + "base64", + "hex", + "serde", + "serde_json", + "sha2", + "swc_common", + "swc_ecma_ast", + "swc_ecma_codegen", + "swc_ecma_parser", + "swc_ecma_testing", + "swc_ecma_transforms_base", + "swc_ecma_utils", + "swc_ecma_visit", + "swc_sourcemap", + "tempfile", + "testing", +] + +[[package]] +name = "swc_ecma_transforms_typescript" +version = "38.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c32bbafb42b8f0f2013e94a4b4981d643a645b1a7f9c20931cbca5bf78c1538" +dependencies = [ + "bytes-str", + "rustc-hash", + "serde", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_transforms_base", + "swc_ecma_transforms_react", + "swc_ecma_utils", + "swc_ecma_visit", +] + +[[package]] +name = "swc_ecma_utils" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dd5ee449d21110a271e73d0a9f7640a8854a62cb0e2cb0c9db3445383598e21" +dependencies = [ + "indexmap", + "num_cpus", + "once_cell", + "par-core", + "rustc-hash", + "ryu-js", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_visit", + "tracing", +] + +[[package]] +name = "swc_ecma_visit" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69d63f7f704a2ec937edef90a3eba1f64602eceb60c8deb260c01131f680e8b" +dependencies = [ + "new_debug_unreachable", + "num-bigint", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_visit", + "tracing", +] + +[[package]] +name = "swc_eq_ignore_macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c16ce73424a6316e95e09065ba6a207eba7765496fed113702278b7711d4b632" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_error_reporters" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbc236f3f44337cbc13f49c7e25e92082e59279c268cbd928c3568f339d3fe0" +dependencies = [ + "anyhow", + "miette", + "once_cell", + "serde", + "swc_common", +] + +[[package]] +name = "swc_macros_common" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1efbaa74943dc5ad2a2fb16cbd78b77d7e4d63188f3c5b4df2b4dcd2faaae" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_plugin" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92b27449420554de6ad8d49004ad3d36e6ac64ecb51d1b0fe1002afcd7a45d85" +dependencies = [ + "once_cell", +] + +[[package]] +name = "swc_plugin_macro" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace467dfafbbdf3aecff786b8605b35db57d945e92fd88800569aa2cba0cdf61" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_plugin_proxy" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f976dc63cd8b1916f265ee7d2647c28a85b433640099a5bf07153346dedffda" +dependencies = [ + "better_scoped_tls", + "cbor4ii", + "rustc-hash", + "swc_common", + "swc_ecma_ast", + "swc_trace_macro", + "tracing", +] + +[[package]] +name = "swc_sourcemap" +version = "9.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de08ef00f816acdd1a58ee8a81c0e1a59eefef2093aefe5611f256fa6b64c4d7" +dependencies = [ + "base64-simd", + "bitvec", + "bytes-str", + "data-encoding", + "debugid", + "if_chain", + "rustc-hash", + "serde", + "serde_json", + "unicode-id-start", + "url", +] + +[[package]] +name = "swc_trace_macro" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfd2b4b0adb82e36f2ac688d00a6a67132c7f4170c772617516793a701be89e8" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "swc_transform_common" +version = "12.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cc4a0e2aa9fac44d383127e01327710416dda5b637b0d134b7b8cf2ba6bde8e" +dependencies = [ + "better_scoped_tls", + "rustc-hash", + "serde", + "swc_common", +] + +[[package]] +name = "swc_visit" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62fb71484b486c185e34d2172f0eabe7f4722742aad700f426a494bb2de232a2" +dependencies = [ + "either", + "new_debug_unreachable", +] + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[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 = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "testing" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1506c602222ebab5d96100180f8d3c015b2394eceb00a46d20c25b8b1e5100" +dependencies = [ + "cargo_metadata 0.18.1", + "difference", + "once_cell", + "pretty_assertions", + "regex", + "rustc-hash", + "serde", + "serde_json", + "swc_common", + "swc_error_reporters", + "testing_macros", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "testing_macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7442bd3ca09f38d4788dc5ebafbc1967c3717726b4b074db011d470b353548b" +dependencies = [ + "anyhow", + "glob", + "once_cell", + "proc-macro2", + "quote", + "regex", + "relative-path", + "syn", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "triomphe" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" +dependencies = [ + "serde", + "stable_deref_trait", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-id-start" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +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 = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vergen" +version = "9.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777" +dependencies = [ + "anyhow", + "cargo_metadata 0.19.2", + "derive_builder", + "regex", + "rustversion", + "vergen-lib", +] + +[[package]] +name = "vergen-lib" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[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", +] + +[[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" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +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 = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml new file mode 100644 index 0000000..8e5b3bd --- /dev/null +++ b/crates/parser/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "checkpoint-parser" +version.workspace = true +edition.workspace = true + +[dependencies] +checkpoint-shared = { path = "../shared" } +swc_core.workspace = true +serde.workspace = true +serde_json.workspace = true diff --git a/crates/parser/README.md b/crates/parser/README.md new file mode 100644 index 0000000..e69de29 diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs new file mode 100644 index 0000000..2c12256 --- /dev/null +++ b/crates/parser/src/lib.rs @@ -0,0 +1,706 @@ +use std::collections::{HashMap, HashSet}; +use std::mem; +use std::sync::Arc; +use swc_core::common::{ + DUMMY_SP, FileName, FilePathMapping, GLOBALS, Mark, SourceMap, Span, Spanned, SyntaxContext, +}; +use swc_core::ecma::ast::{ + ArrayLit, ArrowExpr, AssignExpr, AwaitExpr, BinExpr, BinaryOp, CallExpr, Callee, CondExpr, + EsVersion, Expr, ExprOrSpread, FnDecl, FnExpr, ForStmt, Ident, IdentName, IfStmt, ImportDecl, + ImportNamedSpecifier, ImportPhase, ImportSpecifier, Lit, MemberExpr, MemberProp, ModuleDecl, + ModuleItem, NewExpr, ObjectLit, ParenExpr, Pass, Pat, Program, Prop, PropOrSpread, SeqExpr, + Str, TaggedTpl, UnaryExpr, UpdateExpr, VarDeclarator, WhileStmt, YieldExpr, +}; +use swc_core::ecma::codegen::{Config, Emitter, text_writer::JsWriter}; +use swc_core::ecma::parser::{Parser, StringInput, Syntax}; +use swc_core::ecma::transforms::testing::test_inline; +// use swc_core::ecma::transforms::typescript::strip_type; +use swc_core::ecma::transforms::typescript::{Config as TsConfig, typescript}; +use swc_core::ecma::visit::{VisitMut, VisitMutWith}; + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ExprId(Span); + +impl From for ExprId { + fn from(span: Span) -> Self { + ExprId(span) + } +} + +#[derive(Debug, Clone, PartialEq)] +pub enum ExprContext { + TernaryCondition, + TernaryConsequent, + TernaryAlternate, + LogicalAndLeft, + LogicalAndRight, + LogicalOrLeft, + LogicalOrRight, + NullishLeft, + NullishRight, + BinaryLeft, + BinaryRight, + UnaryOperand, + UpdateOperand, + AssignRight, + IfCondition, + WhileCondition, + ForCondition, + ForUpdate, + ArrayElement(usize), + ObjectValue, + ObjectSpread, + SequenceItem(usize), + YieldValue, + AwaitValue, + TaggedTemplate, + Parenthesized, + FunctionCall, + NewExpression, + Root, +} + +#[derive(Default)] +pub struct AsyncCollector { + async_functions: HashSet, +} + +impl AsyncCollector { + pub fn new() -> Self { + Self::default() + } +} + +impl VisitMut for AsyncCollector { + fn visit_mut_fn_decl(&mut self, node: &mut FnDecl) { + if node.function.is_async { + self.async_functions + .insert(node.ident.sym.as_str().to_string()); + } + node.visit_mut_children_with(self); + } + + fn visit_mut_fn_expr(&mut self, node: &mut FnExpr) { + if node.function.is_async + && let Some(ident) = &node.ident + { + self.async_functions.insert(ident.sym.as_str().to_string()); + } + node.visit_mut_children_with(self); + } + + fn visit_mut_arrow_expr(&mut self, node: &mut ArrowExpr) { + node.visit_mut_children_with(self); + } + + fn visit_mut_var_declarator(&mut self, node: &mut VarDeclarator) { + if let Some(init) = &node.init { + match init.as_ref() { + Expr::Arrow(arrow) if arrow.is_async => { + if let Pat::Ident(ident) = &node.name { + self.async_functions.insert(ident.sym.as_str().to_string()); + } + } + Expr::Fn(fn_expr) if fn_expr.function.is_async => { + if let Pat::Ident(ident) = &node.name { + self.async_functions.insert(ident.sym.as_str().to_string()); + } + } + _ => {} + } + } + node.visit_mut_children_with(self); + } +} + +pub struct ContextAnalyzer { + expression_contexts: HashMap, + function_calls: HashSet, + current_context: ExprContext, +} + +impl Default for ContextAnalyzer { + fn default() -> Self { + Self::new() + } +} + +impl ContextAnalyzer { + pub fn new() -> Self { + Self { + expression_contexts: HashMap::new(), + function_calls: HashSet::new(), + current_context: ExprContext::Root, + } + } + + fn with_context(&mut self, context: ExprContext, f: F) + where + F: FnOnce(&mut Self), + { + let old_context = mem::replace(&mut self.current_context, context); + f(self); + self.current_context = old_context; + } + + fn mark_expression(&mut self, expr: &Expr, context: ExprContext) { + let expr_id = ExprId::from(expr.span()); + self.expression_contexts.insert(expr_id, context); + } + + fn mark_function_call(&mut self, expr: &CallExpr) { + let expr_id = ExprId::from(expr.span); + self.function_calls.insert(expr_id); + self.mark_expression(&Expr::Call(expr.clone()), ExprContext::FunctionCall); + } +} + +impl VisitMut for ContextAnalyzer { + fn visit_mut_call_expr(&mut self, node: &mut CallExpr) { + self.mark_function_call(node); + node.visit_mut_children_with(self); + } + + fn visit_mut_new_expr(&mut self, node: &mut NewExpr) { + let expr_id = ExprId::from(node.span); + self.function_calls.insert(expr_id); + self.mark_expression(&Expr::New(node.clone()), ExprContext::NewExpression); + node.visit_mut_children_with(self); + } + + fn visit_mut_cond_expr(&mut self, node: &mut CondExpr) { + self.with_context(ExprContext::TernaryCondition, |analyzer| { + analyzer.mark_expression(&node.test, ExprContext::TernaryCondition); + node.test.visit_mut_with(analyzer); + }); + self.with_context(ExprContext::TernaryConsequent, |analyzer| { + analyzer.mark_expression(&node.cons, ExprContext::TernaryConsequent); + node.cons.visit_mut_with(analyzer); + }); + self.with_context(ExprContext::TernaryAlternate, |analyzer| { + analyzer.mark_expression(&node.alt, ExprContext::TernaryAlternate); + node.alt.visit_mut_with(analyzer); + }); + } + + fn visit_mut_bin_expr(&mut self, node: &mut BinExpr) { + let (left_context, right_context) = match node.op { + BinaryOp::LogicalAnd => (ExprContext::LogicalAndLeft, ExprContext::LogicalAndRight), + BinaryOp::LogicalOr => (ExprContext::LogicalOrLeft, ExprContext::LogicalOrRight), + BinaryOp::NullishCoalescing => (ExprContext::NullishLeft, ExprContext::NullishRight), + _ => (ExprContext::BinaryLeft, ExprContext::BinaryRight), + }; + + self.with_context(left_context.clone(), |analyzer| { + analyzer.mark_expression(&node.left, left_context); + node.left.visit_mut_with(analyzer); + }); + self.with_context(right_context.clone(), |analyzer| { + analyzer.mark_expression(&node.right, right_context); + node.right.visit_mut_with(analyzer); + }); + } + + fn visit_mut_unary_expr(&mut self, node: &mut UnaryExpr) { + self.with_context(ExprContext::UnaryOperand, |analyzer| { + analyzer.mark_expression(&node.arg, ExprContext::UnaryOperand); + node.arg.visit_mut_with(analyzer); + }); + } + + fn visit_mut_update_expr(&mut self, node: &mut UpdateExpr) { + self.with_context(ExprContext::UpdateOperand, |analyzer| { + analyzer.mark_expression(&node.arg, ExprContext::UpdateOperand); + node.arg.visit_mut_with(analyzer); + }); + } + + fn visit_mut_assign_expr(&mut self, node: &mut AssignExpr) { + node.left.visit_mut_with(self); + self.with_context(ExprContext::AssignRight, |analyzer| { + analyzer.mark_expression(&node.right, ExprContext::AssignRight); + node.right.visit_mut_with(analyzer); + }); + } + + fn visit_mut_seq_expr(&mut self, node: &mut SeqExpr) { + for (i, expr) in node.exprs.iter_mut().enumerate() { + self.with_context(ExprContext::SequenceItem(i), |analyzer| { + analyzer.mark_expression(expr, ExprContext::SequenceItem(i)); + expr.visit_mut_with(analyzer); + }); + } + } + + fn visit_mut_yield_expr(&mut self, node: &mut YieldExpr) { + if let Some(arg) = &mut node.arg { + self.with_context(ExprContext::YieldValue, |analyzer| { + analyzer.mark_expression(arg, ExprContext::YieldValue); + arg.visit_mut_with(analyzer); + }); + } + } + + fn visit_mut_await_expr(&mut self, node: &mut AwaitExpr) { + self.with_context(ExprContext::AwaitValue, |analyzer| { + analyzer.mark_expression(&node.arg, ExprContext::AwaitValue); + node.arg.visit_mut_with(analyzer); + }); + } + + fn visit_mut_tagged_tpl(&mut self, node: &mut TaggedTpl) { + self.with_context(ExprContext::TaggedTemplate, |analyzer| { + analyzer.mark_expression(&node.tag, ExprContext::TaggedTemplate); + node.tag.visit_mut_with(analyzer); + }); + } + + fn visit_mut_paren_expr(&mut self, node: &mut ParenExpr) { + self.with_context(ExprContext::Parenthesized, |analyzer| { + analyzer.mark_expression(&node.expr, ExprContext::Parenthesized); + node.expr.visit_mut_with(analyzer); + }); + } + + fn visit_mut_array_lit(&mut self, node: &mut ArrayLit) { + for (i, elem) in node.elems.iter_mut().enumerate() { + if let Some(expr_or_spread) = elem { + self.with_context(ExprContext::ArrayElement(i), |analyzer| { + analyzer.mark_expression(&expr_or_spread.expr, ExprContext::ArrayElement(i)); + expr_or_spread.expr.visit_mut_with(analyzer); + }); + } + } + } + + fn visit_mut_object_lit(&mut self, node: &mut ObjectLit) { + for prop in &mut node.props { + match prop { + PropOrSpread::Spread(spread) => { + self.with_context(ExprContext::ObjectSpread, |analyzer| { + analyzer.mark_expression(&spread.expr, ExprContext::ObjectSpread); + spread.expr.visit_mut_with(analyzer); + }); + } + PropOrSpread::Prop(prop) => match prop.as_mut() { + Prop::KeyValue(kv) => { + self.with_context(ExprContext::ObjectValue, |analyzer| { + analyzer.mark_expression(&kv.value, ExprContext::ObjectValue); + kv.value.visit_mut_with(analyzer); + }); + } + Prop::Getter(getter) => { + if let Some(body) = &mut getter.body { + body.visit_mut_children_with(self); + } + } + Prop::Setter(setter) => { + if let Some(body) = &mut setter.body { + body.visit_mut_children_with(self); + } + } + Prop::Method(method) => { + method.function.visit_mut_children_with(self); + } + _ => {} + }, + } + } + } + + fn visit_mut_if_stmt(&mut self, node: &mut IfStmt) { + self.with_context(ExprContext::IfCondition, |analyzer| { + analyzer.mark_expression(&node.test, ExprContext::IfCondition); + node.test.visit_mut_with(analyzer); + }); + node.cons.visit_mut_with(self); + if let Some(alt) = &mut node.alt { + alt.visit_mut_with(self); + } + } + + fn visit_mut_while_stmt(&mut self, node: &mut WhileStmt) { + self.with_context(ExprContext::WhileCondition, |analyzer| { + analyzer.mark_expression(&node.test, ExprContext::WhileCondition); + node.test.visit_mut_with(analyzer); + }); + node.body.visit_mut_with(self); + } + + fn visit_mut_for_stmt(&mut self, node: &mut ForStmt) { + if let Some(init) = &mut node.init { + init.visit_mut_with(self); + } + if let Some(test) = &mut node.test { + self.with_context(ExprContext::ForCondition, |analyzer| { + analyzer.mark_expression(test, ExprContext::ForCondition); + test.visit_mut_with(analyzer); + }); + } + if let Some(update) = &mut node.update { + self.with_context(ExprContext::ForUpdate, |analyzer| { + analyzer.mark_expression(update, ExprContext::ForUpdate); + update.visit_mut_with(analyzer); + }); + } + node.body.visit_mut_with(self); + } +} + +pub struct DualPhaseTransformer { + async_functions: HashSet, + expression_contexts: HashMap, + function_calls: HashSet, +} + +impl DualPhaseTransformer { + pub fn new(async_functions: HashSet) -> Self { + Self { + async_functions, + expression_contexts: HashMap::new(), + function_calls: HashSet::new(), + } + } + + pub fn set_analysis_results( + &mut self, + contexts: HashMap, + function_calls: HashSet, + ) { + self.expression_contexts = contexts; + self.function_calls = function_calls; + } + + fn is_method_chaining(&self, member_expr: &MemberExpr) -> bool { + match &member_expr.obj.as_ref() { + Expr::Call(_) => true, + Expr::Member(nested) => self.is_method_chaining(nested), + _ => false, + } + } + + fn is_checkpoint_reference(&self, member_expr: &MemberExpr) -> bool { + match &member_expr.obj.as_ref() { + Expr::Ident(ident) => ident.sym.as_str() == "__checkpoint__", + Expr::Member(nested) => self.is_checkpoint_reference(nested), + _ => false, + } + } + + fn is_complex_computed_access(&self, member_expr: &MemberExpr) -> bool { + matches!(member_expr.prop, MemberProp::Computed(_)) + } + + fn should_skip_transformation(&self, member_expr: &MemberExpr) -> bool { + if self.is_checkpoint_reference(member_expr) { + return true; + } + if self.is_method_chaining(member_expr) { + return true; + } + if self.is_complex_computed_access(member_expr) { + return true; + } + false + } + + fn extract_call_info(&self, node: &CallExpr) -> (Option, Option) { + match &node.callee { + Callee::Expr(expr) => match expr.as_ref() { + Expr::Ident(ident) => (Some(ident.sym.as_str().to_string()), None), + Expr::Member(member_expr) => { + if self.should_skip_transformation(member_expr) { + return (None, None); + } + let name = extract_member_name(member_expr); + let context = extract_member_context(member_expr); + (Some(name), Some(context)) + } + _ => (None, None), + }, + _ => (None, None), + } + } +} + +impl VisitMut for DualPhaseTransformer { + fn visit_mut_call_expr(&mut self, node: &mut CallExpr) { + node.visit_mut_children_with(self); + let expr_id = ExprId::from(node.span); + if self.function_calls.contains(&expr_id) { + let (function_name, this_context) = self.extract_call_info(node); + if let Some(name) = function_name { + let is_async = self.async_functions.contains(&name); + let wrapper = if is_async { + create_async_wrapper(&name, &node.args, this_context) + } else { + create_sync_wrapper(&name, &node.args, this_context) + }; + *node = wrapper; + } + } + } + + fn visit_mut_new_expr(&mut self, node: &mut NewExpr) { + node.visit_mut_children_with(self); + } + + fn visit_mut_program(&mut self, program: &mut Program) { + let named_specifier = ImportNamedSpecifier { + span: DUMMY_SP, + local: Ident::new_no_ctxt("__checkpoint__".into(), DUMMY_SP), + imported: None, + is_type_only: false, + }; + let import_specifier = ImportSpecifier::Named(named_specifier); + let import_decl = ImportDecl { + span: DUMMY_SP, + specifiers: vec![import_specifier], + src: Box::new(Str { + span: DUMMY_SP, + value: "../runtime/checkpoint-runtime".into(), + raw: None, + }), + type_only: false, + with: None, + phase: ImportPhase::Evaluation, + }; + let module_item = ModuleItem::ModuleDecl(ModuleDecl::Import(import_decl)); + match program { + Program::Module(module) => { + module.body.insert(0, module_item); + } + Program::Script(_) => {} + } + program.visit_mut_children_with(self); + } +} + +impl Pass for DualPhaseTransformer { + fn process(&mut self, program: &mut Program) { + program.visit_mut_with(self); + } +} + +#[derive(Debug)] +pub enum TransformError { + ParseError(String), + TransformError(String), + CodegenError(String), +} + +fn create_async_wrapper(name: &str, args: &[ExprOrSpread], context: Option) -> CallExpr { + let checkpoint_ident = Ident::new_no_ctxt("__checkpoint__".into(), DUMMY_SP); + let execute_async_ident = IdentName::new("executeAsync".into(), DUMMY_SP); + let member_expr = MemberExpr { + obj: Box::new(Expr::Ident(checkpoint_ident)), + prop: MemberProp::Ident(execute_async_ident), + span: DUMMY_SP, + }; + let function_name_lit = Lit::Str(Str { + value: name.into(), + raw: None, + span: DUMMY_SP, + }); + let function_ident = Ident::new_no_ctxt(name.into(), DUMMY_SP); + let function_name_arg = ExprOrSpread { + expr: Box::new(Expr::Lit(function_name_lit)), + spread: None, + }; + let function_identifier_arg = ExprOrSpread { + expr: Box::new(Expr::Ident(function_ident)), + spread: None, + }; + let original_args_array = ArrayLit { + span: DUMMY_SP, + elems: args.iter().map(|arg| Some(arg.clone())).collect(), + }; + let original_args_arg = ExprOrSpread { + expr: Box::new(Expr::Array(original_args_array)), + spread: None, + }; + let mut call_args = vec![ + function_name_arg, + function_identifier_arg, + original_args_arg, + ]; + if let Some(ctx) = context { + let context_arg = ExprOrSpread { + expr: Box::new(ctx), + spread: None, + }; + call_args.push(context_arg); + } + CallExpr { + callee: Callee::Expr(Box::new(Expr::Member(member_expr))), + args: call_args, + span: DUMMY_SP, + ctxt: SyntaxContext::empty(), + type_args: None, + } +} + +fn create_sync_wrapper(name: &str, args: &[ExprOrSpread], context: Option) -> CallExpr { + let checkpoint_ident = Ident::new_no_ctxt("__checkpoint__".into(), DUMMY_SP); + let execute_ident = IdentName::new("execute".into(), DUMMY_SP); + let member_expr = MemberExpr { + obj: Box::new(Expr::Ident(checkpoint_ident)), + prop: MemberProp::Ident(execute_ident), + span: DUMMY_SP, + }; + let function_name_lit = Lit::Str(Str { + value: name.into(), + raw: None, + span: DUMMY_SP, + }); + let function_ident = Ident::new_no_ctxt(name.into(), DUMMY_SP); + let function_name_arg = ExprOrSpread { + expr: Box::new(Expr::Lit(function_name_lit)), + spread: None, + }; + let function_identifier_arg = ExprOrSpread { + expr: Box::new(Expr::Ident(function_ident)), + spread: None, + }; + let original_args_array = ArrayLit { + span: DUMMY_SP, + elems: args.iter().map(|arg| Some(arg.clone())).collect(), + }; + let original_args_arg = ExprOrSpread { + expr: Box::new(Expr::Array(original_args_array)), + spread: None, + }; + let mut call_args = vec![ + function_name_arg, + function_identifier_arg, + original_args_arg, + ]; + if let Some(ctx) = context { + let context_arg = ExprOrSpread { + expr: Box::new(ctx), + spread: None, + }; + call_args.push(context_arg); + } + CallExpr { + callee: Callee::Expr(Box::new(Expr::Member(member_expr))), + args: call_args, + span: DUMMY_SP, + ctxt: SyntaxContext::empty(), + type_args: None, + } +} + +pub fn transform_code( + source: &str, + file_path: &str, + minify: bool, +) -> Result { + let unresolved_mark = Mark::new(); + let top_level_mark = Mark::new(); + + let syntax = if file_path.ends_with(".ts") || file_path.ends_with(".tsx") { + Syntax::Typescript(Default::default()) + } else { + Syntax::Es(Default::default()) + }; + let cm = Arc::new(SourceMap::new(FilePathMapping::empty())); + let fm = cm.new_source_file(FileName::Real(file_path.into()).into(), source.to_string()); + let input = StringInput::from(&*fm); + let mut parser = Parser::new(syntax, input, None); + let module = parser + .parse_module() + .map_err(|e| TransformError::ParseError(format!("{:?}", e)))?; + let mut program = Program::Module(module); + if file_path.ends_with(".ts") || file_path.ends_with(".tsx") { + // program.visit_mut_with(&mut strip_type()); + GLOBALS.set(&Default::default(), || { + program.mutate(typescript( + TsConfig::default(), + unresolved_mark, + top_level_mark, + )) + }) + } + let mut collector = AsyncCollector::new(); + program.visit_mut_with(&mut collector); + let mut analyzer = ContextAnalyzer::new(); + program.visit_mut_with(&mut analyzer); + let mut transformer = DualPhaseTransformer::new(collector.async_functions); + transformer.set_analysis_results(analyzer.expression_contexts, analyzer.function_calls); + program.visit_mut_with(&mut transformer); + let mut buf = Vec::new(); + let wr = JsWriter::new(cm.clone(), "\n", &mut buf, None); + let mut emitter = Emitter { + cfg: Config::default() + .with_minify(minify) + .with_omit_last_semi(true) + .with_target(EsVersion::Es2024), + cm: cm.clone(), + comments: None, + wr, + }; + emitter + .emit_program(&program) + .map_err(|e| TransformError::CodegenError(format!("{:?}", e)))?; + String::from_utf8(buf).map_err(|e| TransformError::CodegenError(format!("{:?}", e))) +} + +fn extract_member_name(member_expr: &MemberExpr) -> String { + let obj_name = match &member_expr.obj.as_ref() { + Expr::Ident(ident) => ident.sym.as_str().to_string(), + Expr::Member(nested_member) => extract_member_name(nested_member), + Expr::This(_) => "this".to_string(), + _ => "unknown".to_string(), + }; + let prop_name = match &member_expr.prop { + MemberProp::Ident(ident) => ident.sym.as_str().to_string(), + MemberProp::Computed(_) => "computed".to_string(), + _ => "unknown".to_string(), + }; + format!("{}.{}", obj_name, prop_name) +} + +fn extract_member_context(member_expr: &MemberExpr) -> Expr { + match &member_expr.obj.as_ref() { + Expr::Member(nested_member) => Expr::Member(nested_member.clone()), + Expr::This(this_expr) => Expr::This(*this_expr), + _ => (*member_expr.obj).clone(), + } +} + +#[allow(dead_code)] +fn create_test_transformer(source: &str, async_functions: HashSet) -> DualPhaseTransformer { + let syntax = Syntax::Es(Default::default()); + let cm = Arc::new(SourceMap::new(FilePathMapping::empty())); + let fm = cm.new_source_file(FileName::Real("test.js".into()).into(), source.to_string()); + let input = StringInput::from(&*fm); + let mut parser = Parser::new(syntax, input, None); + let module = parser.parse_module().unwrap(); + let mut test_program = Program::Module(module); + let mut collector = AsyncCollector::new(); + collector.async_functions = async_functions; + let mut analyzer = ContextAnalyzer::new(); + test_program.visit_mut_with(&mut analyzer); + let mut transformer = DualPhaseTransformer::new(collector.async_functions); + transformer.set_analysis_results(analyzer.expression_contexts, analyzer.function_calls); + transformer +} + +test_inline!( + Default::default(), + |_| { + let mut async_funcs = HashSet::new(); + async_funcs.insert("fetchData".to_string()); + create_test_transformer( + r#"export {}; async function fetchData() { return "data"; } fetchData()"#, + async_funcs, + ) + }, + async_function_call, + r#"export {}; async function fetchData() { return "data"; } fetchData()"#, + r#"import { __checkpoint__ } from "../runtime/checkpoint-runtime"; +export {}; +async function fetchData() { return "data"; } +__checkpoint__.executeAsync("fetchData", fetchData, []);"# +); diff --git a/crates/shared/Cargo.toml b/crates/shared/Cargo.toml new file mode 100644 index 0000000..daaee11 --- /dev/null +++ b/crates/shared/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "checkpoint-shared" +version.workspace = true +edition.workspace = true + +[dependencies] +shared_memory.workspace = true +serde.workspace = true +serde_json.workspace = true diff --git a/crates/shared/README.md b/crates/shared/README.md new file mode 100644 index 0000000..e69de29 diff --git a/crates/shared/src/lib.rs b/crates/shared/src/lib.rs new file mode 100644 index 0000000..d40e5cd --- /dev/null +++ b/crates/shared/src/lib.rs @@ -0,0 +1,120 @@ +use shared_memory::{Shmem, ShmemConf}; +use std::sync::atomic::{AtomicU32, Ordering}; + +const HEADER_SIZE: usize = 8; +const BUFFER_SIZE: usize = 1024 * 1024; +const SINGLE_CHANNEL_SIZE: usize = HEADER_SIZE + BUFFER_SIZE; +const TOTAL_SIZE: usize = SINGLE_CHANNEL_SIZE * 2; + +#[repr(C)] +struct ChannelHeader { + ready_flag: AtomicU32, + data_len: AtomicU32, +} + +pub struct SharedMemoryBridge { + shmem: Shmem, +} + +impl SharedMemoryBridge { + pub fn create() -> Result { + let shmem = ShmemConf::new().size(TOTAL_SIZE).create()?; + + let rust_to_ts = unsafe { &*(shmem.as_ptr() as *const ChannelHeader) }; + let ts_to_rust = + unsafe { &*(shmem.as_ptr().add(SINGLE_CHANNEL_SIZE) as *const ChannelHeader) }; + + rust_to_ts.ready_flag.store(0, Ordering::SeqCst); + rust_to_ts.data_len.store(0, Ordering::SeqCst); + ts_to_rust.ready_flag.store(0, Ordering::SeqCst); + ts_to_rust.data_len.store(0, Ordering::SeqCst); + + Ok(Self { shmem }) + } + + pub fn open(os_id: &str) -> Result { + let shmem = ShmemConf::new().os_id(os_id).open()?; + Ok(Self { shmem }) + } + + pub fn os_id(&self) -> &str { + self.shmem.get_os_id() + } + + pub fn send(&self, data: &[u8]) -> Result<(), &'static str> { + if data.len() > BUFFER_SIZE { + return Err("data too large"); + } + + let header = unsafe { &*(self.shmem.as_ptr() as *const ChannelHeader) }; + let buffer = unsafe { + std::slice::from_raw_parts_mut( + self.shmem.as_ptr().add(HEADER_SIZE), // as *mut u8 + BUFFER_SIZE, + ) + }; + + buffer[..data.len()].copy_from_slice(data); + header.data_len.store(data.len() as u32, Ordering::SeqCst); + header.ready_flag.store(1, Ordering::SeqCst); + + Ok(()) + } + + pub fn send_json( + &self, + value: &T, + ) -> Result<(), Box> { + let json = serde_json::to_vec(value)?; + self.send(&json).map_err(|e| e.into()) + } + + pub fn receive(&self) -> Option> { + let header = + unsafe { &*(self.shmem.as_ptr().add(SINGLE_CHANNEL_SIZE) as *const ChannelHeader) }; + + if header.ready_flag.load(Ordering::SeqCst) == 0 { + return None; + } + + let len = header.data_len.load(Ordering::SeqCst) as usize; + let buffer = unsafe { + std::slice::from_raw_parts( + self.shmem.as_ptr().add(SINGLE_CHANNEL_SIZE + HEADER_SIZE), + len, + ) + }; + + let data = buffer.to_vec(); + header.ready_flag.store(0, Ordering::SeqCst); + + Some(data) + } + + pub fn receive_json(&self) -> Option { + let data = self.receive()?; + serde_json::from_slice(&data).ok() + } + + pub fn wait_receive(&self, timeout_ms: u64) -> Option> { + let start = std::time::Instant::now(); + let timeout = std::time::Duration::from_millis(timeout_ms); + + loop { + if let Some(data) = self.receive() { + return Some(data); + } + + if start.elapsed() > timeout { + return None; + } + + std::hint::spin_loop(); + } + } + + pub fn wait_receive_json(&self, timeout_ms: u64) -> Option { + let data = self.wait_receive(timeout_ms)?; + serde_json::from_slice(&data).ok() + } +} diff --git a/dist-workspace.toml b/dist-workspace.toml new file mode 100644 index 0000000..4fedcff --- /dev/null +++ b/dist-workspace.toml @@ -0,0 +1,25 @@ +[workspace] +members = ["cargo:."] + +# Config for 'dist' +[dist] +# The preferred dist version to use in CI (Cargo.toml SemVer syntax) +cargo-dist-version = "0.31.0" +# CI backends to support +ci = "github" +# The installers to generate for each app +installers = ["shell", "powershell"] +# Target platforms to build apps for (Rust target-triple syntax) +targets = [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-unknown-linux-gnu", + "x86_64-pc-windows-msvc", +] +# Path that installers should place binaries in +install-path = "CARGO_HOME" +# Whether to install an updater program +install-updater = false +# Allow self-hosted in workflow file +allow-dirty = ["ci"] diff --git a/doc/INSTALLATION.md b/doc/INSTALLATION.md new file mode 100644 index 0000000..e38f0b5 --- /dev/null +++ b/doc/INSTALLATION.md @@ -0,0 +1,61 @@ +# How to install? + +## If you wanna just downloading the pre-compiled binary (Recommended) + +1- Go to [Github Releases](https://github.com/ErenayDev/checkpoint-ts/releases) page and download your platforms file. +2- If you wanna download pre-compiled binary with [cargo-binstall](https://github.com/cargo-bins/cargo-binstall): + +```bash +cargo install cargo-binstall # skip if already installed +cargo binstall checkpoint-ts # downloads the file for specific your platforms +``` + +## If you wanna build from source + +From [crates.io](https://crates.io/crates/checkpoint-ts): + +```bash +cargo install checkpoint-ts +``` + +From [GitHub](https://github.com/ErenayDev/checkpoint-ts): + +```bash +git clone https://github.com/ErenayDev/checkpoint-ts.git +cd checkpoint-ts +cargo build --release +``` + +## Platform specific downloads + +### Arch Linux(AUR) + +#### Binary + +```bash +pacman -S checkpoint +``` + +#### From source + +```bash +yay -S checkpoint +``` + +### NixOS + +Just a placeholder + +### RPM-Based + +Just a placeholder + +### Debian-Based + +Just a placeholder + +## Versions + + + Packaging status + diff --git a/doc/RELEASE.md b/doc/RELEASE.md new file mode 100644 index 0000000..6afdab1 --- /dev/null +++ b/doc/RELEASE.md @@ -0,0 +1,13 @@ +# How to release? + +1. Bump the version in [Cargo.toml](Cargo.toml) according to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +2. Update [Cargo.lock](Cargo.lock) by building the project: `cargo build` +3. Ensure [CHANGELOG.md](CHANGELOG.md) is updated according to [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format. [git-cliff](https://github.com/orhun/git-cliff) recommended. +4. Commit and push the changes. +5. Create a new tag: `git tag -s -a v[x.y.z]` ([signed](https://keyserver.ubuntu.com/pks/lookup?search=0xA89C8C7D22FFF4FB&op=vindex)) +6. Push the tag: `git push --tags` +7. Wait for [Continuous Deployment](https://github.com/ErenayDev/checkpoint-ts/actions) workflow to finish. +8. Publish to crates.io: `cargo publish` +9. Update [AUR](https://aur.archlinux.org) package in [PKGBUILDs](https://github.com/ErenayDev/PKGBUILDs) repository: + - Run `update.sh checkpoint-ts [x.y.z]` + - Run `aurpublish checkpoint-ts` diff --git a/examples/transform_examples/.gitignore b/examples/transform_examples/.gitignore new file mode 100644 index 0000000..9d312f5 --- /dev/null +++ b/examples/transform_examples/.gitignore @@ -0,0 +1,37 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# Checkpoint.ts releated +.checkpoint diff --git a/examples/transform_examples/README.md b/examples/transform_examples/README.md new file mode 100644 index 0000000..944354d --- /dev/null +++ b/examples/transform_examples/README.md @@ -0,0 +1,15 @@ +# transform_examples + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.3.5. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime. diff --git a/examples/transform_examples/bun.lock b/examples/transform_examples/bun.lock new file mode 100644 index 0000000..ced13be --- /dev/null +++ b/examples/transform_examples/bun.lock @@ -0,0 +1,26 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "transform_examples", + "devDependencies": { + "@types/bun": "latest", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + }, + "packages": { + "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="], + + "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], + + "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + } +} diff --git a/examples/transform_examples/index.ts b/examples/transform_examples/index.ts new file mode 100644 index 0000000..4816882 --- /dev/null +++ b/examples/transform_examples/index.ts @@ -0,0 +1,98 @@ +type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE"; + +interface RequestConfig { + headers?: Record; + params?: Record; + body?: unknown; + timeout?: number; +} + +interface ApiResponse { + data: T; + status: number; + headers: Headers; +} + +class ApiClient { + private baseUrl: string; + private defaultHeaders: Record; + private defaultTimeout: number; + + constructor(baseUrl: string, defaultTimeout = 10000) { + this.baseUrl = baseUrl.replace(/\/$/, ""); + this.defaultHeaders = { "Content-Type": "application/json" }; + this.defaultTimeout = defaultTimeout; + } + + setHeader(key: string, value: string): void { + this.defaultHeaders[key] = value; + } + + removeHeader(key: string): void { + delete this.defaultHeaders[key]; + } + + private buildUrl(endpoint: string, params?: Record): string { + const url = new URL(`${this.baseUrl}${endpoint}`); + if (params) { + Object.entries(params).forEach(([key, value]) => { + url.searchParams.append(key, value); + }); + } + return url.toString(); + } + + private async request( + method: HttpMethod, + endpoint: string, + config: RequestConfig = {}, + ): Promise> { + const controller = new AbortController(); + const timeoutId = setTimeout( + () => controller.abort(), + config.timeout ?? this.defaultTimeout, + ); + + const response = await fetch(this.buildUrl(endpoint, config.params), { + method, + headers: { ...this.defaultHeaders, ...config.headers }, + body: config.body ? JSON.stringify(config.body) : undefined, + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + return { data, status: response.status, headers: response.headers }; + } + + get(endpoint: string, config?: RequestConfig): Promise> { + return this.request("GET", endpoint, config); + } + + post( + endpoint: string, + body: unknown, + config?: RequestConfig, + ): Promise> { + return this.request("POST", endpoint, { ...config, body }); + } + + put( + endpoint: string, + body: unknown, + config?: RequestConfig, + ): Promise> { + return this.request("PUT", endpoint, { ...config, body }); + } + + delete(endpoint: string, config?: RequestConfig): Promise> { + return this.request("DELETE", endpoint, config); + } +} + +export { ApiClient, type ApiResponse, type RequestConfig }; diff --git a/examples/transform_examples/package.json b/examples/transform_examples/package.json new file mode 100644 index 0000000..c38c9e7 --- /dev/null +++ b/examples/transform_examples/package.json @@ -0,0 +1,12 @@ +{ + "name": "transform_examples", + "module": "index.ts", + "type": "module", + "private": true, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5" + } +} diff --git a/examples/transform_examples/tsconfig.json b/examples/transform_examples/tsconfig.json new file mode 100644 index 0000000..bfa0fea --- /dev/null +++ b/examples/transform_examples/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/oranda.json b/oranda.json new file mode 100644 index 0000000..3012cc4 --- /dev/null +++ b/oranda.json @@ -0,0 +1,41 @@ +{ + "project": { + "name": "Checkpoint.ts", + "repository": "https://github.com/ErenayDev/checkpoint-ts", + "license": "MIT" + }, + "styles": { + "theme": "axodark", + "favicon": "https://www.axo.dev/favicon.ico" + }, + "marketing": { + "social": { + "image": "https://www.axo.dev/meta_small.jpeg", + "image_alt": "erenay", + "twitter_account": "@erenaydev" + } + }, + "build": { + "path_prefix": "checkpoint-ts" + }, + "components": { + "changelog": true, + "funding": { + "yml_path": "FUNDING.yml", + "preferred_funding": "github" + }, + "artifacts": { + "package_managers": { + "preferred": { + "cargo": "cargo install checkpoint-ts" + }, + "additional": { + "binstall": "cargo binstall checkpoint-ts", + "aur": "pacman -S checkpoint", + "nix-env": "nix-env -i checkpoint-ts", + "nix flake": "nix profile install github:ErenayDev/checkpoint-ts" + } + } + } + } +} diff --git a/package.json b/package.json deleted file mode 100644 index 145cf8b..0000000 --- a/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main": "index.ts" -} diff --git a/runtime/bun.lock b/runtime/bun.lock new file mode 100644 index 0000000..9ab82ca --- /dev/null +++ b/runtime/bun.lock @@ -0,0 +1,22 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "checkpoint-runtime", + "devDependencies": { + "@types/bun": "latest", + "@types/node": "^25.0.8", + }, + }, + }, + "packages": { + "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="], + + "@types/node": ["@types/node@25.0.8", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg=="], + + "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + } +} diff --git a/runtime/checkpoint-runtime.ts b/runtime/checkpoint-runtime.ts new file mode 100644 index 0000000..df93f95 --- /dev/null +++ b/runtime/checkpoint-runtime.ts @@ -0,0 +1,57 @@ +import { SharedMemory } from "./shm/shared-memory"; + +const shmId = process.env.CHECKPOINT_SHM_ID; +if (!shmId) { + console.error("CHECKPOINT_SHM_ID not set"); + process.exit(1); +} + +const shm = SharedMemory.open(shmId); + +interface ExecuteRequest { + functionName: string; + args: unknown[]; + context?: unknown; +} + +interface ExecuteResponse { + type: "continue" | "skip" | "error"; + returnValue?: unknown; + error?: string; +} + +export const __checkpoint__ = { + execute( + functionName: string, + fn: (...args: unknown[]) => T, + args: unknown[], + context?: unknown, + ): T { + const request: ExecuteRequest = { + functionName, + args, + context: context ? context.constructor.name : undefined, + }; + + shm.writeJson({ + type: "checkpoint", + payload: request, + }); + + let response: ExecuteResponse | null = null; + + while (!response) { + response = shm.waitAndReadJson(1000); + } + + if (response.type === "error") { + throw new Error(response.error || "Checkpoint error"); + } + + if (response.type === "skip") { + return response.returnValue as T; + } + + return fn.apply(context, args as never[]); + }, +}; diff --git a/runtime/index.ts b/runtime/index.ts new file mode 100644 index 0000000..5c9c777 --- /dev/null +++ b/runtime/index.ts @@ -0,0 +1,126 @@ +import { SharedMemory } from "./shm/shared-memory"; + +const shmId = process.env.CHECKPOINT_SHM_ID; +if (!shmId) { + console.error("CHECKPOINT_SHM_ID not set"); + process.exit(1); +} + +let shm: SharedMemory; +try { + shm = SharedMemory.open(shmId); + console.error(`[DEBUG] SHM opened successfully`); +} catch (error) { + console.error(`[DEBUG] Failed to open SHM: ${error}`); + process.exit(1); +} + +interface Message { + type: string; + payload?: unknown; +} + +interface CheckpointPayload { + functionName: string; + args: unknown[]; + context?: string; +} + +const appPath = process.env.CHECKPOINT_APP_PATH; + +function handleCheckpoint(payload: CheckpointPayload): void { + const { functionName, args, context } = payload; + const logMessage = context + ? `${context}.${functionName}(${JSON.stringify(args)})` + : `${functionName}(${JSON.stringify(args)})`; + + shm.writeJson({ + log: logMessage, + current_function: functionName, + }); + + shm.writeJson({ + type: "continue", + }); +} + +async function mainLoop(): Promise { + console.error(`[DEBUG] Entering main loop`); + + console.error(`[DEBUG] Sending ready message`); + shm.writeJson({ + type: "runtime_ready", + log: "Runtime ready, waiting for commands", + }); + + while (true) { + const message = shm.waitAndReadJson(100); + + if (!message) continue; + + console.error(`[DEBUG] Received message: ${JSON.stringify(message)}`); + + switch (message.type) { + case "load_app": + console.error(`[DEBUG] Load app command received`); + + shm.writeJson({ + type: "version", + value: { + lv: Bun.version_with_sha, + v: Bun.version, + }, + }); + + if (!appPath) { + shm.writeJson({ + log: "CHECKPOINT_APP_PATH not set", + type: "error", + }); + break; + } + + shm.writeJson({ + log: `Loading application: ${appPath}`, + }); + + try { + const absolutePath = + appPath.startsWith("/") || appPath.startsWith("file://") + ? appPath + : `file://${appPath}`; + + console.error(`[DEBUG] Importing: ${absolutePath}`); + await import(absolutePath); + console.error(`[DEBUG] App loaded successfully`); + + shm.writeJson({ + log: "Application loaded and ready", + }); + } catch (error) { + console.error(`[DEBUG] Import failed: ${error}`); + shm.writeJson({ + log: `Failed to load app: ${error}`, + type: "error", + }); + } + break; + + case "checkpoint": + console.error(`[DEBUG] Handling checkpoint`); + handleCheckpoint(message.payload as CheckpointPayload); + break; + + case "shutdown": + console.error(`[DEBUG] Shutdown requested`); + shm.close(); + process.exit(0); + + default: + console.error(`[DEBUG] Unknown message type: '${message.type}'`); + shm.writeJson({ type: "error", message: "unknown message type" }); + } + } +} + +mainLoop(); diff --git a/runtime/package-lock.json b/runtime/package-lock.json new file mode 100644 index 0000000..905dc5e --- /dev/null +++ b/runtime/package-lock.json @@ -0,0 +1,53 @@ +{ + "name": "checkpoint-runtime", + "version": "0.1.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "checkpoint-runtime", + "version": "0.1.2", + "devDependencies": { + "@types/bun": "latest", + "@types/node": "^25.0.8" + } + }, + "node_modules/@types/bun": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.6.tgz", + "integrity": "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bun-types": "1.3.6" + } + }, + "node_modules/@types/node": { + "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.8.tgz", + "integrity": "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/bun-types": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.6.tgz", + "integrity": "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/runtime/package.json b/runtime/package.json new file mode 100644 index 0000000..2eba471 --- /dev/null +++ b/runtime/package.json @@ -0,0 +1,13 @@ +{ + "name": "checkpoint-runtime", + "version": "0.1.2", + "type": "module", + "main": "index.ts", + "scripts": { + "start": "bun run index.ts" + }, + "devDependencies": { + "@types/bun": "latest", + "@types/node": "^25.0.8" + } +} diff --git a/runtime/shm/constants.ts b/runtime/shm/constants.ts new file mode 100644 index 0000000..03ef9e2 --- /dev/null +++ b/runtime/shm/constants.ts @@ -0,0 +1,9 @@ +export const HEADER_SIZE = 8; +export const BUFFER_SIZE = 1024 * 1024; +export const SINGLE_CHANNEL_SIZE = HEADER_SIZE + BUFFER_SIZE; +export const TOTAL_SIZE = SINGLE_CHANNEL_SIZE * 2; + +export const O_RDWR = 2; +export const PROT_READ = 0x1; +export const PROT_WRITE = 0x2; +export const MAP_SHARED = 0x01; diff --git a/runtime/shm/ffi.ts b/runtime/shm/ffi.ts new file mode 100644 index 0000000..5150ebf --- /dev/null +++ b/runtime/shm/ffi.ts @@ -0,0 +1,38 @@ +import { dlopen, FFIType } from "bun:ffi"; + +const libcPath = + process.platform === "linux" ? "libc.so.6" : "libSystem.B.dylib"; + +export const libc = dlopen(libcPath, { + shm_open: { + args: [FFIType.ptr, FFIType.i32, FFIType.i32], + returns: FFIType.i32, + }, + ftruncate: { + args: [FFIType.i32, FFIType.i64], + returns: FFIType.i32, + }, + mmap: { + args: [ + FFIType.ptr, + FFIType.u64, + FFIType.i32, + FFIType.i32, + FFIType.i32, + FFIType.i64, + ], + returns: FFIType.ptr, + }, + munmap: { + args: [FFIType.ptr, FFIType.u64], + returns: FFIType.i32, + }, + close: { + args: [FFIType.i32], + returns: FFIType.i32, + }, + shm_unlink: { + args: [FFIType.ptr], + returns: FFIType.i32, + }, +}); diff --git a/runtime/shm/shared-memory.ts b/runtime/shm/shared-memory.ts new file mode 100644 index 0000000..0c825de --- /dev/null +++ b/runtime/shm/shared-memory.ts @@ -0,0 +1,113 @@ +import { ptr, toArrayBuffer } from "bun:ffi"; +import { libc } from "./ffi"; +import { + HEADER_SIZE, + BUFFER_SIZE, + SINGLE_CHANNEL_SIZE, + TOTAL_SIZE, + O_RDWR, + PROT_READ, + PROT_WRITE, + MAP_SHARED, +} from "./constants"; + +export class SharedMemory { + private pointer: number; + private buffer: Uint8Array; + private name: string; + + private constructor(name: string, pointer: number) { + this.name = name; + this.pointer = pointer; + this.buffer = new Uint8Array(toArrayBuffer(pointer, 0, TOTAL_SIZE)); + } + + static open(shmName: string): SharedMemory { + const nameBuffer = Buffer.from(shmName + "\0"); + + const fd = libc.symbols.shm_open(ptr(nameBuffer), O_RDWR, 0o666); + if (fd < 0) { + throw new Error(`shm_open failed: ${shmName}`); + } + + const address = libc.symbols.mmap( + null, + TOTAL_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED, + fd, + 0, + ); + + libc.symbols.close(fd); + + if (address === 0 || address === 0xffffffffffffffffn) { + throw new Error("mmap failed"); + } + + return new SharedMemory(shmName, Number(address)); + } + + read(): Uint8Array | null { + const view = new DataView(this.buffer.buffer, 0); + const flagArray = new Uint32Array(this.buffer.buffer, 0, 1); + const readyFlag = Atomics.load(flagArray, 0); + + if (readyFlag === 0) { + return null; + } + + const dataLen = view.getUint32(4, true); + const data = this.buffer.slice(HEADER_SIZE, HEADER_SIZE + dataLen); + + Atomics.store(flagArray, 0, 0); + + return data; + } + + write(data: Uint8Array): void { + if (data.length > BUFFER_SIZE) { + throw new Error("data exceeds buffer size"); + } + + const offset = SINGLE_CHANNEL_SIZE; + const view = new DataView(this.buffer.buffer, offset); + const flagArray = new Uint32Array(this.buffer.buffer, offset, 1); + + this.buffer.set(data, offset + HEADER_SIZE); + view.setUint32(4, data.length, true); + Atomics.store(flagArray, 0, 1); + } + + readJson(): T | null { + const data = this.read(); + if (!data) return null; + return JSON.parse(new TextDecoder().decode(data)); + } + + writeJson(obj: unknown): void { + const data = new TextEncoder().encode(JSON.stringify(obj)); + this.write(data); + } + + waitAndRead(timeoutMs: number): Uint8Array | null { + const start = performance.now(); + + while (performance.now() - start < timeoutMs) { + const data = this.read(); + if (data) return data; + } + + return null; + } + + waitAndReadJson(timeoutMs: number): T | null { + const data = this.waitAndRead(timeoutMs); + if (!data) return null; + return JSON.parse(new TextDecoder().decode(data)); + } + + close(): void { + libc.symbols.munmap(this.pointer, TOTAL_SIZE); + } +} diff --git a/src/analyzer/ast.rs b/src/analyzer/ast.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/analyzer/ast.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/analyzer/metadata.rs b/src/analyzer/metadata.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/analyzer/metadata.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/analyzer/mod.rs b/src/analyzer/mod.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/analyzer/mod.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/cli/args.rs b/src/cli/args.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/cli/args.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/cli/mod.rs b/src/cli/mod.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/cli/mod.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/instrumenter/injector.rs b/src/instrumenter/injector.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/instrumenter/injector.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/instrumenter/mod.rs b/src/instrumenter/mod.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/instrumenter/mod.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 55b8879..0000000 --- a/src/main.rs +++ /dev/null @@ -1,28 +0,0 @@ -use color_eyre::Result; -mod analyzer; -mod cli; -mod instrumenter; -mod runtime; -mod state; -mod tui; -mod utils; -use tui::TuiApp; -use utils::entry_finder; - -#[tokio::main] -async fn main() -> Result<()> { - color_eyre::install()?; - - let entry_file = entry_finder::find_entry_file(); - - if entry_file.is_none() { - println!("No entry file found. Usage: `checkpoint `"); - std::process::exit(1); - } - - let terminal = ratatui::init(); - let mut app = TuiApp::new(entry_file); - let result = app.run(terminal).await; - ratatui::restore(); - result -} diff --git a/src/runtime/adapter.rs b/src/runtime/adapter.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/runtime/adapter.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/runtime/bun.rs b/src/runtime/bun.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/runtime/bun.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/runtime/deno.rs b/src/runtime/deno.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/runtime/deno.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/runtime/mod.rs b/src/runtime/mod.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/runtime/mod.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/runtime/node.rs b/src/runtime/node.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/runtime/node.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/state/checkpoint.rs b/src/state/checkpoint.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/state/checkpoint.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/state/manager.rs b/src/state/manager.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/state/manager.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/state/mod.rs b/src/state/mod.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/state/mod.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/tui/scenes/history.rs b/src/tui/scenes/history.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/tui/scenes/history.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/utils/entry_finder.rs b/src/utils/entry_finder.rs deleted file mode 100644 index 24c24d4..0000000 --- a/src/utils/entry_finder.rs +++ /dev/null @@ -1,39 +0,0 @@ -use serde_json::Value; -use std::fs; - -pub fn find_entry_file() -> Option { - // Looking for package.json - if fs::metadata("./package.json").is_ok() { - let pkg_content = fs::read_to_string("./package.json").ok()?; - let pkg: Value = serde_json::from_str(&pkg_content).ok()?; - if let Some(main_field) = pkg.get("main").and_then(|v| v.as_str()) { - let main_path = main_field.trim(); - if fs::metadata(main_path).is_ok() { - return Some(main_path.to_string()); - } - } - } - - // Looking for index.ts - if fs::metadata("./index.ts").is_ok() { - return Some("./index.ts".to_string()); - } - - // Looking for index.js - if fs::metadata("./index.js").is_ok() { - return Some("./index.js".to_string()); - } - - // Looking for main.ts - if fs::metadata("./main.ts").is_ok() { - return Some("./main.ts".to_string()); - } - - // Looking for main.js - if fs::metadata("./main.js").is_ok() { - return Some("./main.js".to_string()); - } - - // If nothing, return None - None -} diff --git a/src/utils/mod.rs b/src/utils/mod.rs deleted file mode 100644 index e126a96..0000000 --- a/src/utils/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod entry_finder; -pub mod num_utils; diff --git a/tools/cargo-bin/Cargo.lock b/tools/cargo-bin/Cargo.lock deleted file mode 100644 index ce858d1..0000000 --- a/tools/cargo-bin/Cargo.lock +++ /dev/null @@ -1,448 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "anstream" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", -] - -[[package]] -name = "anyhow" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "bitflags" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" - -[[package]] -name = "cargo-bin" -version = "0.1.0" -dependencies = [ - "cargo-run-bin", -] - -[[package]] -name = "cargo-run-bin" -version = "1.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba4ea665f68a2042470ec6e27a36755783ebd3367b90bec2fb100f9d5012fd8" -dependencies = [ - "anyhow", - "cfg-if", - "clap", - "rustversion", - "serde", - "toml", - "toml_edit", - "version_check", - "which", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "clap" -version = "4.5.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" -dependencies = [ - "clap_builder", -] - -[[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_lex" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "indexmap" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[package]] -name = "libc" -version = "0.2.177" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "memchr" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "proc-macro2" -version = "1.0.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[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 = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "syn" -version = "2.0.110" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - -[[package]] -name = "unicode-ident" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[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", -] - -[[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 = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] diff --git a/tools/cargo-bin/Cargo.toml b/tools/cargo-bin/Cargo.toml deleted file mode 100644 index 24bd493..0000000 --- a/tools/cargo-bin/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "cargo-bin" -version = "0.1.0" -edition = "2024" - -[dependencies] -cargo-run-bin = { version = "1.7.5", features = ["cli"] } diff --git a/tools/cargo-bin/src/main.rs b/tools/cargo-bin/src/main.rs deleted file mode 100644 index 640466c..0000000 --- a/tools/cargo-bin/src/main.rs +++ /dev/null @@ -1,12 +0,0 @@ -use std::process; - -fn main() { - let res = cargo_run_bin::cli::run(); - - // Only reached if run-bin code fails, otherwise process exits early from within - // binary::run. - if let Err(res) = res { - eprintln!("\x1b[31m{}\x1b[0m", format!("run-bin failed: {res}")); - process::exit(1); - } -}