Showing preview only (4,836K chars total). Download the full file or copy to clipboard to get everything.
Repository: voidzero-dev/vite-plus
Branch: main
Commit: a5b2e1f2b425
Files: 1701
Total size: 4.3 MB
Directory structure:
gitextract_0d0lq36w/
├── .cargo/
│ └── config.toml
├── .claude/
│ ├── agents/
│ │ ├── cargo-workspace-merger.md
│ │ └── monorepo-architect.md
│ └── skills/
│ ├── add-ecosystem-ci/
│ │ └── SKILL.md
│ ├── bump-vite-task/
│ │ └── SKILL.md
│ ├── spawn-process/
│ │ └── SKILL.md
│ └── sync-tsdown-cli/
│ └── SKILL.md
├── .clippy.toml
├── .devcontainer/
│ └── devcontainer.json
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── docs.yml
│ │ └── feature_request.yml
│ ├── actions/
│ │ ├── build-upstream/
│ │ │ └── action.yml
│ │ ├── clone/
│ │ │ └── action.yml
│ │ ├── download-rolldown-binaries/
│ │ │ └── action.yml
│ │ └── set-snapshot-version/
│ │ ├── action.yml
│ │ ├── compute-version.mjs
│ │ └── package.json
│ ├── renovate.json
│ ├── scripts/
│ │ └── upgrade-deps.mjs
│ └── workflows/
│ ├── ci.yml
│ ├── claude.yml
│ ├── cleanup-cache.yml
│ ├── deny.yml
│ ├── e2e-test.yml
│ ├── issue-close-require.yml
│ ├── issue-labeled.yml
│ ├── release.yml
│ ├── test-standalone-install.yml
│ ├── upgrade-deps.yml
│ └── zizmor.yml
├── .gitignore
├── .husky/
│ └── pre-commit
├── .node-version
├── .rustfmt.toml
├── .typos.toml
├── .vscode/
│ ├── extensions.json
│ └── settings.json
├── CLAUDE.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── README.md
├── bench/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── benches/
│ │ └── workspace_load.rs
│ ├── fixtures/
│ │ └── monorepo/
│ │ ├── package.json
│ │ ├── pnpm-workspace.yaml
│ │ └── vite-plus.json
│ ├── generate-monorepo.ts
│ ├── package.json
│ └── tsconfig.json
├── crates/
│ ├── vite_command/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── vite_error/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── vite_global_cli/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── cli.rs
│ │ ├── command_picker.rs
│ │ ├── commands/
│ │ │ ├── add.rs
│ │ │ ├── config.rs
│ │ │ ├── create.rs
│ │ │ ├── dedupe.rs
│ │ │ ├── delegate.rs
│ │ │ ├── dlx.rs
│ │ │ ├── env/
│ │ │ │ ├── bin_config.rs
│ │ │ │ ├── config.rs
│ │ │ │ ├── current.rs
│ │ │ │ ├── default.rs
│ │ │ │ ├── doctor.rs
│ │ │ │ ├── exec.rs
│ │ │ │ ├── global_install.rs
│ │ │ │ ├── list.rs
│ │ │ │ ├── list_remote.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── off.rs
│ │ │ │ ├── on.rs
│ │ │ │ ├── package_metadata.rs
│ │ │ │ ├── packages.rs
│ │ │ │ ├── pin.rs
│ │ │ │ ├── setup.rs
│ │ │ │ ├── unpin.rs
│ │ │ │ ├── use.rs
│ │ │ │ └── which.rs
│ │ │ ├── implode.rs
│ │ │ ├── install.rs
│ │ │ ├── link.rs
│ │ │ ├── migrate.rs
│ │ │ ├── mod.rs
│ │ │ ├── outdated.rs
│ │ │ ├── pm.rs
│ │ │ ├── remove.rs
│ │ │ ├── run_or_delegate.rs
│ │ │ ├── staged.rs
│ │ │ ├── unlink.rs
│ │ │ ├── update.rs
│ │ │ ├── upgrade/
│ │ │ │ ├── install.rs
│ │ │ │ ├── integrity.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── platform.rs
│ │ │ │ └── registry.rs
│ │ │ ├── version.rs
│ │ │ ├── vpx.rs
│ │ │ └── why.rs
│ │ ├── error.rs
│ │ ├── help.rs
│ │ ├── js_executor.rs
│ │ ├── main.rs
│ │ ├── shim/
│ │ │ ├── cache.rs
│ │ │ ├── dispatch.rs
│ │ │ ├── exec.rs
│ │ │ └── mod.rs
│ │ └── tips/
│ │ ├── mod.rs
│ │ ├── short_aliases.rs
│ │ └── use_vpx_or_run.rs
│ ├── vite_install/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ ├── commands/
│ │ │ ├── add.rs
│ │ │ ├── audit.rs
│ │ │ ├── cache.rs
│ │ │ ├── config.rs
│ │ │ ├── dedupe.rs
│ │ │ ├── deprecate.rs
│ │ │ ├── dist_tag.rs
│ │ │ ├── dlx.rs
│ │ │ ├── fund.rs
│ │ │ ├── install.rs
│ │ │ ├── link.rs
│ │ │ ├── list.rs
│ │ │ ├── login.rs
│ │ │ ├── logout.rs
│ │ │ ├── mod.rs
│ │ │ ├── outdated.rs
│ │ │ ├── owner.rs
│ │ │ ├── pack.rs
│ │ │ ├── ping.rs
│ │ │ ├── prune.rs
│ │ │ ├── publish.rs
│ │ │ ├── rebuild.rs
│ │ │ ├── remove.rs
│ │ │ ├── run.rs
│ │ │ ├── search.rs
│ │ │ ├── token.rs
│ │ │ ├── unlink.rs
│ │ │ ├── update.rs
│ │ │ ├── view.rs
│ │ │ ├── whoami.rs
│ │ │ └── why.rs
│ │ ├── config.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── package_manager.rs
│ │ ├── request.rs
│ │ └── shim.rs
│ ├── vite_js_runtime/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── cache.rs
│ │ ├── dev_engines.rs
│ │ ├── download.rs
│ │ ├── error.rs
│ │ ├── lib.rs
│ │ ├── platform.rs
│ │ ├── provider.rs
│ │ ├── providers/
│ │ │ ├── mod.rs
│ │ │ └── node.rs
│ │ └── runtime.rs
│ ├── vite_migration/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── ast_grep.rs
│ │ ├── eslint.rs
│ │ ├── file_walker.rs
│ │ ├── import_rewriter.rs
│ │ ├── lib.rs
│ │ ├── package.rs
│ │ ├── prettier.rs
│ │ ├── script_rewrite.rs
│ │ └── vite_config.rs
│ ├── vite_shared/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── env_config.rs
│ │ ├── env_vars.rs
│ │ ├── header.rs
│ │ ├── home.rs
│ │ ├── lib.rs
│ │ ├── output.rs
│ │ ├── package_json.rs
│ │ ├── path_env.rs
│ │ ├── string_similarity.rs
│ │ └── tracing.rs
│ ├── vite_static_config/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ └── lib.rs
│ └── vite_trampoline/
│ ├── Cargo.toml
│ └── src/
│ └── main.rs
├── deny.toml
├── docs/
│ ├── .gitignore
│ ├── .vitepress/
│ │ ├── config.mts
│ │ ├── env.d.ts
│ │ ├── theme/
│ │ │ ├── Layout.vue
│ │ │ ├── assets/
│ │ │ │ └── animations/
│ │ │ │ ├── 1280_x_580_vite+_masthead.riv
│ │ │ │ ├── 253_x_268_vite+_masthead_mobile.riv
│ │ │ │ ├── 514_x_246_focus_on_shipping_v2.riv
│ │ │ │ └── 561_x_273_stay_fast_at_scale.riv
│ │ │ ├── components/
│ │ │ │ ├── Footer.vue
│ │ │ │ └── home/
│ │ │ │ ├── CoreFeature3Col.vue
│ │ │ │ ├── FeatureCheck.vue
│ │ │ │ ├── FeatureDevBuild.vue
│ │ │ │ ├── FeaturePack.vue
│ │ │ │ ├── FeatureRun.vue
│ │ │ │ ├── FeatureRunTerminal.vue
│ │ │ │ ├── FeatureTest.vue
│ │ │ │ ├── FeatureToolbar.vue
│ │ │ │ ├── Fullstack2Col.vue
│ │ │ │ ├── HeadingSection2.vue
│ │ │ │ ├── HeadingSection3.vue
│ │ │ │ ├── HeadingSection4.vue
│ │ │ │ ├── Hero.vue
│ │ │ │ ├── HeroRive.vue
│ │ │ │ ├── InstallCommand.vue
│ │ │ │ ├── PartnerLogos.vue
│ │ │ │ ├── ProductivityGrid.vue
│ │ │ │ ├── StackedBlock.vue
│ │ │ │ ├── Terminal.vue
│ │ │ │ ├── TerminalTranscript.vue
│ │ │ │ └── Testimonials.vue
│ │ │ ├── data/
│ │ │ │ ├── feature-run-transcripts.ts
│ │ │ │ ├── performance.ts
│ │ │ │ ├── terminal-transcripts.ts
│ │ │ │ └── testimonials.ts
│ │ │ ├── index.ts
│ │ │ ├── layouts/
│ │ │ │ ├── Error404.vue
│ │ │ │ └── Home.vue
│ │ │ └── styles.css
│ │ └── tsconfig.json
│ ├── config/
│ │ ├── build.md
│ │ ├── fmt.md
│ │ ├── index.md
│ │ ├── lint.md
│ │ ├── pack.md
│ │ ├── run.md
│ │ ├── staged.md
│ │ └── test.md
│ ├── guide/
│ │ ├── build.md
│ │ ├── cache.md
│ │ ├── check.md
│ │ ├── ci.md
│ │ ├── commit-hooks.md
│ │ ├── create.md
│ │ ├── dev.md
│ │ ├── env.md
│ │ ├── fmt.md
│ │ ├── ide-integration.md
│ │ ├── implode.md
│ │ ├── index.md
│ │ ├── install.md
│ │ ├── lint.md
│ │ ├── migrate.md
│ │ ├── pack.md
│ │ ├── run.md
│ │ ├── test.md
│ │ ├── troubleshooting.md
│ │ ├── upgrade.md
│ │ ├── vpx.md
│ │ └── why.md
│ ├── index.md
│ ├── package.json
│ ├── pnpm-workspace.yaml
│ └── public/
│ └── _redirects
├── ecosystem-ci/
│ ├── clone.ts
│ ├── patch-project.ts
│ ├── paths.ts
│ ├── repo.json
│ └── verify-install.ts
├── justfile
├── netlify.toml
├── package.json
├── packages/
│ ├── cli/
│ │ ├── .gitignore
│ │ ├── AGENTS.md
│ │ ├── BUNDLING.md
│ │ ├── README.md
│ │ ├── bin/
│ │ │ ├── oxfmt
│ │ │ ├── oxlint
│ │ │ └── vp
│ │ ├── binding/
│ │ │ ├── .gitignore
│ │ │ ├── Cargo.toml
│ │ │ ├── build.rs
│ │ │ ├── index.cjs
│ │ │ ├── index.d.cts
│ │ │ ├── index.d.ts
│ │ │ ├── index.js
│ │ │ └── src/
│ │ │ ├── cli.rs
│ │ │ ├── exec/
│ │ │ │ ├── args.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── workspace.rs
│ │ │ ├── lib.rs
│ │ │ ├── migration.rs
│ │ │ ├── package_manager.rs
│ │ │ └── utils.rs
│ │ ├── build.ts
│ │ ├── install.ps1
│ │ ├── install.sh
│ │ ├── package.json
│ │ ├── publish-native-addons.ts
│ │ ├── rolldown.config.ts
│ │ ├── rules/
│ │ │ ├── vite-prepare.yml
│ │ │ └── vite-tools.yml
│ │ ├── skills/
│ │ │ └── vite-plus/
│ │ │ └── SKILL.md
│ │ ├── snap-tests/
│ │ │ ├── bin-oxfmt-wrapper/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── bin-oxlint-wrapper/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── build-vite-env/
│ │ │ │ ├── index.html
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── cache-clean/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ ├── subfolder/
│ │ │ │ │ └── .gitkeep
│ │ │ │ └── vite.config.ts
│ │ │ ├── cache-scripts-default/
│ │ │ │ ├── hello.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── cache-scripts-enabled/
│ │ │ │ ├── hello.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── change-passthrough-env-config/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── check-all-skipped/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── check-fail-fast/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-fix/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-fix-missing-stderr/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── check-fix-paths/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-fix-reformat/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-fmt-fail/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-lint-fail/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-lint-fail-no-typecheck/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── check-lint-fail-typecheck/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── check-lint-warn/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-no-fmt/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-no-lint/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-oxlint-env/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── check-pass/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ └── steps.json
│ │ │ ├── check-pass-no-typecheck/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── check-pass-typecheck/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── check-pass-typecheck-github-actions/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── cli-helper-message/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-dev-with-port/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-doc/
│ │ │ │ ├── api-examples.md
│ │ │ │ ├── index.md
│ │ │ │ ├── markdown-examples.md
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── command-exec/
│ │ │ │ ├── package.json
│ │ │ │ ├── setup-bin.js
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-exec-cwd/
│ │ │ │ ├── package.json
│ │ │ │ ├── setup.js
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-exec-monorepo/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app-a/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── app-b/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── lib-c/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-exec-monorepo-filter-v2/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app-a/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── app-b/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── lib-c/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-exec-monorepo-order/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app-mobile/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── app-web/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── cycle-a/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── cycle-b/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── cycle-c/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── cycle-d/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── cycle-e/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── lib-core/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── lib-ui/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── lib-utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-helper/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-init-inline-config/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-init-inline-config-existing/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── command-install-shortcut/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── command-pack/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ ├── hello.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── command-pack-external/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ └── steps.json
│ │ │ ├── command-pack-monorepo/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── array-config/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ ├── src/
│ │ │ │ │ │ │ └── sub/
│ │ │ │ │ │ │ ├── hello.ts
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── vite.config.ts
│ │ │ │ │ ├── default-config/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── hello.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── hello/
│ │ │ │ │ ├── package.json
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── hello.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── vite.config.ts
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── command-pack-no-input/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-preview/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-run-with-vp-config/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-version/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-vp-alias/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── exit-code/
│ │ │ │ ├── failure.js
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── fingerprint-ignore-test/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── fmt-check-with-vite-config/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── valid.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── fmt-ignore-patterns/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ ├── ignored/
│ │ │ │ │ │ └── badly-formatted.js
│ │ │ │ │ └── valid.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── ignore_dist/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── lint-ignore-patterns/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ ├── ignored/
│ │ │ │ │ │ └── has-error.js
│ │ │ │ │ └── valid.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── lint-vite-config-rules/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ ├── has-console.js
│ │ │ │ │ └── valid.js
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── npm-install-with-options/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── oxlint-typeaware/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ ├── types.ts
│ │ │ │ └── vite.config.ts
│ │ │ ├── pass-no-color-env/
│ │ │ │ ├── check.js
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── plain-terminal-ui/
│ │ │ │ ├── hello.mjs
│ │ │ │ ├── input.txt
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ ├── subfolder/
│ │ │ │ │ └── hello.mjs
│ │ │ │ └── vite.config.ts
│ │ │ ├── plain-terminal-ui-nested/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── a.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── run-task-command-conflict/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── synthetic-build-cache-disabled/
│ │ │ │ ├── index.html
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── synthetic-dev-cache-disabled/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── task-config-cwd/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ ├── subfolder/
│ │ │ │ │ └── a.js
│ │ │ │ └── vite.config.ts
│ │ │ ├── test-nested-tasks/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── vite-config-task/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── vite-task-path-env-include-pm/
│ │ │ │ ├── main.js
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── vitest-browser-mode/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ ├── bar.js
│ │ │ │ │ ├── foo.js
│ │ │ │ │ └── foo.test.js
│ │ │ │ ├── steps.json
│ │ │ │ ├── vite.config.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── vp-run-expansion/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── workspace-lint-subpackage/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── app-a/
│ │ │ │ │ ├── package.json
│ │ │ │ │ ├── src/
│ │ │ │ │ │ └── index.js
│ │ │ │ │ └── vite.config.ts
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── workspace-root-vite-config/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app-a/
│ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── app-b/
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ └── yarn-install-with-options/
│ │ │ ├── package.json
│ │ │ ├── snap.txt
│ │ │ ├── steps.json
│ │ │ └── vite.config.ts
│ │ ├── snap-tests-global/
│ │ │ ├── cli-helper-message/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-npm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-npm11/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-npm11-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-pnpm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-pnpm9/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-pnpm9-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-add-yarn4-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-cache-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-cache-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-cache-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-check-help/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-custom-dir-hook-path/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-help/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-no-agent-writes/
│ │ │ │ ├── CLAUDE.md
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-npm10/
│ │ │ │ ├── .npmrc
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-prepare-auto-hooks/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-replace-husky-hookspath/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-update-agents/
│ │ │ │ ├── AGENTS.md
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-yarn1/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-config-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-create-help/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-dedupe-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-dedupe-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-dedupe-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-dlx-no-package-json/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-dlx-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-dlx-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-dlx-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-exec/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-exec-shim-mode/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-install-conflict/
│ │ │ │ ├── conflict-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-install-fail/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-install-no-arg/
│ │ │ │ ├── .node-version
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-install-no-arg-fail/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-install-node-version/
│ │ │ │ ├── command-env-install-node-version-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-install-version-alias/
│ │ │ │ ├── command-env-install-version-alias-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-use/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-env-which/
│ │ │ │ ├── .node-version
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-exec/
│ │ │ │ ├── package.json
│ │ │ │ ├── setup-bin.js
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-fmt-help/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-install-auto-create-package-json/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-install-bug-31/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-link-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-link-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-link-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-lint-help/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-list-no-package-json/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-list-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-list-npm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-list-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-list-pnpm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-list-yarn1/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-list-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-outdated-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-outdated-npm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-outdated-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-outdated-pnpm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-outdated-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-owner-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-owner-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-owner-yarn1/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-owner-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-pack-exe/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── command-pack-exe-error/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── command-pack-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-pack-npm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-pack-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-pack-pnpm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-pack-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-pack-yarn4-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-pm-no-package-json/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-prune-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-prune-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-prune-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-publish-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-publish-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-publish-yarn1/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-publish-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-remove-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-remove-npm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-remove-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-remove-pnpm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-remove-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-remove-yarn4-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-run-without-vite-plus/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-staged-broken-config/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-staged-help/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-staged-no-config/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-staged-with-config/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── command-unlink-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-unlink-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-unlink-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-update-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-update-npm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-update-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-update-pnpm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-update-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-update-yarn4-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-upgrade-check/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-upgrade-rollback/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-version-no-side-effects/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-version-with-env/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-view-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-view-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-view-yarn1/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-view-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-vpx-no-package-json/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-vpx-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-why-npm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-why-npm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-why-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-why-pnpm10-with-workspace/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── command-why-yarn4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── create-from-monorepo-subdir/
│ │ │ │ ├── apps/
│ │ │ │ │ └── website/
│ │ │ │ │ └── package.json
│ │ │ │ ├── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── scripts/
│ │ │ │ │ └── helper/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── create-from-nonworkspace-subdir/
│ │ │ │ ├── package.json
│ │ │ │ ├── scripts/
│ │ │ │ │ └── .keep
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── create-generator-outside-monorepo/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── create-missing-typecheck/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── delegate-respects-default-node-version/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── dev-engines-runtime-pnpm10/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── env-install-binary-conflict/
│ │ │ │ ├── .node-version
│ │ │ │ ├── env-binary-conflict-pkg-a/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── env-binary-conflict-pkg-b/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── fallback-all-invalid-to-user-default/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── fallback-invalid-engines-to-dev-engines/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── global-cli-fallback/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-add-git-hooks/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-agent-claude/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ └── steps.json
│ │ │ ├── migration-already-vite-plus/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-already-vite-plus-with-husky-hookspath/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-already-vite-plus-with-husky-lint-staged/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-auto-create-vite-config/
│ │ │ │ ├── .oxfmtrc.json
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-baseurl-tsconfig/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── tsconfig.json
│ │ │ ├── migration-chained-lint-staged-pre-commit/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-check/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-composed-husky-custom-dir/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-composed-husky-prepare/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-env-prefix-lint-staged/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint/
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-legacy/
│ │ │ │ ├── .eslintrc
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-legacy-already-vite-plus/
│ │ │ │ ├── .eslintrc
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-lint-staged/
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-lint-staged-mjs/
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── lint-staged.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-lintstagedrc/
│ │ │ │ ├── .lintstagedrc.json
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-monorepo/
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-monorepo-package-only/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── app/
│ │ │ │ │ ├── eslint.config.mjs
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-npx-wrapper/
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-rerun/
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-rerun-dual-config/
│ │ │ │ ├── .eslintrc
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-eslint-rerun-mjs/
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.mjs
│ │ │ ├── migration-existing-husky/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-existing-husky-lint-staged/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-existing-husky-v8-hooks/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-existing-husky-v8-multi-hooks/
│ │ │ │ ├── .husky/
│ │ │ │ │ ├── commit-msg
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-existing-lint-staged-config/
│ │ │ │ ├── .lintstagedrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-existing-pnpm-exec-lint-staged/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-existing-pre-commit/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-existing-prepare-script/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-from-tsdown/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ └── tsdown.config.ts
│ │ │ ├── migration-from-tsdown-json-config/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ ├── tsdown.config.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── migration-from-vitest-config/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vitest.config.ts
│ │ │ ├── migration-from-vitest-files/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── test/
│ │ │ │ └── hello.ts
│ │ │ ├── migration-hooks-skip-on-existing-hookspath/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-husky-env-skip/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-husky-or-prepare/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-husky-semicolon-prepare/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-husky-v8-preserves-lint-staged/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-lint-staged-in-scripts/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-lint-staged-merge-fail/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── migration-lint-staged-ts-config/
│ │ │ │ ├── lint-staged.config.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-lintstagedrc-json/
│ │ │ │ ├── .lintstagedrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-lintstagedrc-merge-fail/
│ │ │ │ ├── .lintstagedrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── migration-lintstagedrc-not-support/
│ │ │ │ ├── .lintstagedrc
│ │ │ │ ├── .lintstagedrc.yaml
│ │ │ │ ├── lint-staged.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-lintstagedrc-staged-exists/
│ │ │ │ ├── .lintstagedrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── migration-merge-vite-config-js/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.js
│ │ │ ├── migration-merge-vite-config-ts/
│ │ │ │ ├── .oxfmtrc.json
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── migration-monorepo-husky-v8-preserves-lint-staged/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── app/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-monorepo-pnpm/
│ │ │ │ ├── .oxfmtrc.json
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── only-oxlint/
│ │ │ │ │ │ ├── .oxlintrc.json
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── migration-monorepo-pnpm-overrides-dependency-selector/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── app/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── migration-monorepo-skip-vite-peer-dependency/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── vite-plugin/
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-monorepo-yarn4/
│ │ │ │ ├── .oxlintrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── app/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ └── utils/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── steps.json
│ │ │ │ └── vite.config.ts
│ │ │ ├── migration-no-agent/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ └── steps.json
│ │ │ ├── migration-no-git-repo/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-no-hooks/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-no-hooks-with-husky/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-not-supported-npm8.2/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-not-supported-pnpm9.4/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-not-supported-vite6/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-not-supported-vitest3/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-other-hook-tool/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-partially-migrated-pre-commit/
│ │ │ │ ├── .husky/
│ │ │ │ │ └── pre-commit
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-pre-commit-env-setup/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-prettier/
│ │ │ │ ├── .prettierrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-prettier-eslint-combo/
│ │ │ │ ├── .prettierrc.json
│ │ │ │ ├── eslint.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-prettier-ignore-unknown/
│ │ │ │ ├── .prettierrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-prettier-lint-staged/
│ │ │ │ ├── .prettierrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-prettier-pkg-json/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-prettier-rerun/
│ │ │ │ ├── .prettierrc.json
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-rewrite-declare-module/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ └── steps.json
│ │ │ ├── migration-rewrite-reference-types/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── env.d.ts
│ │ │ │ └── steps.json
│ │ │ ├── migration-skip-vite-dependency/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ └── steps.json
│ │ │ ├── migration-skip-vite-peer-dependency/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ └── steps.json
│ │ │ ├── migration-standalone-npm/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-subpath/
│ │ │ │ ├── foo/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── migration-vite-version/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── new-check/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── new-create-vite/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── new-create-vite-directory-dot/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── new-create-vite-with-scope-name/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── new-vite-monorepo/
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-install-already-linked/
│ │ │ │ ├── .node-version
│ │ │ │ ├── npm-global-linked-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-install-custom-prefix/
│ │ │ │ ├── npm-global-custom-prefix-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-install-custom-prefix-on-path/
│ │ │ │ ├── npm-global-on-path-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-install-dot/
│ │ │ │ ├── npm-global-dot-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-install-hint/
│ │ │ │ ├── npm-global-hint-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-uninstall-link-cleanup/
│ │ │ │ ├── npm-global-uninstall-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-uninstall-preexisting-binary/
│ │ │ │ ├── npm-global-preexist-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-uninstall-prefix/
│ │ │ │ ├── npm-global-prefix-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-uninstall-shared-bin-name/
│ │ │ │ ├── pkg-a/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── pkg-b/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── npm-global-uninstall-vp-managed/
│ │ │ │ ├── npm-global-vp-managed-pkg/
│ │ │ │ │ ├── cli.js
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── shim-inherits-parent-dev-engines-runtime/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── app/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── shim-inherits-parent-engines-node/
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── app/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── shim-inherits-parent-node-version/
│ │ │ │ ├── .node-version
│ │ │ │ ├── package.json
│ │ │ │ ├── packages/
│ │ │ │ │ └── app/
│ │ │ │ │ └── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── shim-pnpm-uses-project-node-version/
│ │ │ │ ├── .node-version
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── shim-recursive-npm-run/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ └── shim-recursive-package-binary/
│ │ │ ├── .node-version
│ │ │ ├── recursive-cli-pkg/
│ │ │ │ ├── cli.js
│ │ │ │ └── package.json
│ │ │ ├── snap.txt
│ │ │ └── steps.json
│ │ ├── snap-tests-todo/
│ │ │ ├── command-pack-watch-restart/
│ │ │ │ ├── kill-watch.sh
│ │ │ │ ├── package.json
│ │ │ │ ├── run-watch.sh
│ │ │ │ ├── snap.txt
│ │ │ │ ├── src/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── steps.json
│ │ │ │ ├── vite.config.ts
│ │ │ │ ├── wait-for-dist.sh
│ │ │ │ └── wait-for-dist2.sh
│ │ │ ├── exit-non-zero-on-cmd-not-exists/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ ├── pnpm-install-with-options/
│ │ │ │ ├── package.json
│ │ │ │ ├── snap.txt
│ │ │ │ └── steps.json
│ │ │ └── test-panicked-fix/
│ │ │ ├── package.json
│ │ │ ├── snap.txt
│ │ │ └── steps.json
│ │ ├── src/
│ │ │ ├── __tests__/
│ │ │ │ ├── index.spec.ts
│ │ │ │ ├── init-config.spec.ts
│ │ │ │ ├── pack.spec.ts
│ │ │ │ └── resolve-vite-config.spec.ts
│ │ │ ├── bin.ts
│ │ │ ├── config/
│ │ │ │ ├── __tests__/
│ │ │ │ │ └── hooks.spec.ts
│ │ │ │ ├── bin.ts
│ │ │ │ └── hooks.ts
│ │ │ ├── create/
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── __snapshots__/
│ │ │ │ │ │ └── utils.spec.ts.snap
│ │ │ │ │ ├── discovery.spec.ts
│ │ │ │ │ ├── initial-template-options.spec.ts
│ │ │ │ │ ├── prompts.spec.ts
│ │ │ │ │ └── utils.spec.ts
│ │ │ │ ├── bin.ts
│ │ │ │ ├── command.ts
│ │ │ │ ├── discovery.ts
│ │ │ │ ├── initial-template-options.ts
│ │ │ │ ├── prompts.ts
│ │ │ │ ├── random-name.ts
│ │ │ │ ├── templates/
│ │ │ │ │ ├── builtin.ts
│ │ │ │ │ ├── generator.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── monorepo.ts
│ │ │ │ │ ├── remote.ts
│ │ │ │ │ └── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── define-config.ts
│ │ │ ├── index.cts
│ │ │ ├── index.ts
│ │ │ ├── init-config.ts
│ │ │ ├── lint.ts
│ │ │ ├── mcp/
│ │ │ │ └── bin.ts
│ │ │ ├── migration/
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── __snapshots__/
│ │ │ │ │ │ └── migrator.spec.ts.snap
│ │ │ │ │ ├── compat.spec.ts
│ │ │ │ │ └── migrator.spec.ts
│ │ │ │ ├── bin.ts
│ │ │ │ ├── compat.ts
│ │ │ │ ├── detector.ts
│ │ │ │ ├── migrator.ts
│ │ │ │ └── report.ts
│ │ │ ├── pack-bin.ts
│ │ │ ├── pack.ts
│ │ │ ├── resolve-doc.ts
│ │ │ ├── resolve-fmt.ts
│ │ │ ├── resolve-lint.ts
│ │ │ ├── resolve-pack.ts
│ │ │ ├── resolve-test.ts
│ │ │ ├── resolve-vite-config.ts
│ │ │ ├── resolve-vite.ts
│ │ │ ├── run-config.ts
│ │ │ ├── staged/
│ │ │ │ └── bin.ts
│ │ │ ├── staged-config.ts
│ │ │ ├── types/
│ │ │ │ ├── index.ts
│ │ │ │ ├── package.ts
│ │ │ │ └── workspace.ts
│ │ │ ├── utils/
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── agent.spec.ts
│ │ │ │ │ ├── editor.spec.ts
│ │ │ │ │ ├── help.spec.ts
│ │ │ │ │ └── package.spec.ts
│ │ │ │ ├── agent.ts
│ │ │ │ ├── command.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── editor.ts
│ │ │ │ ├── help.ts
│ │ │ │ ├── json.ts
│ │ │ │ ├── package.ts
│ │ │ │ ├── path.ts
│ │ │ │ ├── prompts.ts
│ │ │ │ ├── skills.ts
│ │ │ │ ├── terminal.ts
│ │ │ │ ├── tsconfig.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── workspace.ts
│ │ │ │ └── yaml.ts
│ │ │ └── version.ts
│ │ ├── templates/
│ │ │ ├── generator/
│ │ │ │ ├── README.md
│ │ │ │ ├── bin/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── src/
│ │ │ │ │ └── template.ts
│ │ │ │ └── tsconfig.json
│ │ │ └── monorepo/
│ │ │ ├── README.md
│ │ │ ├── _gitignore
│ │ │ ├── _yarnrc.yml
│ │ │ ├── package.json
│ │ │ ├── pnpm-workspace.yaml
│ │ │ ├── tsconfig.json
│ │ │ └── vite.config.ts
│ │ └── tsconfig.json
│ ├── core/
│ │ ├── .gitignore
│ │ ├── BUNDLING.md
│ │ ├── __tests__/
│ │ │ └── build-artifacts.spec.ts
│ │ ├── build-support/
│ │ │ ├── build-cjs-deps.ts
│ │ │ ├── find-create-require.ts
│ │ │ ├── rewrite-imports.ts
│ │ │ └── rewrite-module-specifiers.ts
│ │ ├── build.ts
│ │ ├── package.json
│ │ └── tsconfig.json
│ ├── prompts/
│ │ ├── LICENSE
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── __tests__/
│ │ │ │ ├── __snapshots__/
│ │ │ │ │ └── render.spec.ts.snap
│ │ │ │ └── render.spec.ts
│ │ │ ├── autocomplete.ts
│ │ │ ├── box.ts
│ │ │ ├── common.ts
│ │ │ ├── confirm.ts
│ │ │ ├── group-multi-select.ts
│ │ │ ├── group.ts
│ │ │ ├── index.ts
│ │ │ ├── limit-options.ts
│ │ │ ├── log.ts
│ │ │ ├── messages.ts
│ │ │ ├── multi-select.ts
│ │ │ ├── note.ts
│ │ │ ├── password.ts
│ │ │ ├── path.ts
│ │ │ ├── progress-bar.ts
│ │ │ ├── select-key.ts
│ │ │ ├── select.ts
│ │ │ ├── spinner.ts
│ │ │ ├── stream.ts
│ │ │ ├── task-log.ts
│ │ │ ├── task.ts
│ │ │ └── text.ts
│ │ └── tsdown.config.ts
│ ├── test/
│ │ ├── .gitignore
│ │ ├── BUNDLING.md
│ │ ├── __tests__/
│ │ │ └── build-artifacts.spec.ts
│ │ ├── build.ts
│ │ ├── package.json
│ │ └── tsconfig.json
│ └── tools/
│ ├── .upstream-versions.json
│ ├── README.md
│ ├── package.json
│ ├── snap-tests/
│ │ ├── json-sort/
│ │ │ ├── array.json
│ │ │ ├── snap.txt
│ │ │ └── steps.json
│ │ └── replace-file-content/
│ │ ├── foo/
│ │ │ └── example.toml
│ │ ├── snap.txt
│ │ └── steps.json
│ └── src/
│ ├── __tests__/
│ │ ├── __snapshots__/
│ │ │ └── utils.spec.ts.snap
│ │ └── utils.spec.ts
│ ├── bin.js
│ ├── brand-vite.ts
│ ├── index.ts
│ ├── install-global-cli.ts
│ ├── json-edit.ts
│ ├── json-sort.ts
│ ├── merge-peer-deps.ts
│ ├── replace-file-content.ts
│ ├── snap-test.ts
│ ├── sync-remote-deps.ts
│ └── utils.ts
├── pnpm-workspace.yaml
├── rfcs/
│ ├── add-remove-package-commands.md
│ ├── check-command.md
│ ├── cli-output-polish.md
│ ├── cli-tips.md
│ ├── code-generator.md
│ ├── config-and-staged-commands.md
│ ├── dedupe-package-command.md
│ ├── dlx-command.md
│ ├── env-command.md
│ ├── exec-command.md
│ ├── global-cli-rust-binary.md
│ ├── implode-command.md
│ ├── init-editor-configs.md
│ ├── install-command.md
│ ├── js-runtime.md
│ ├── link-unlink-package-commands.md
│ ├── merge-global-and-local-cli.md
│ ├── migration-command.md
│ ├── outdated-package-command.md
│ ├── pack-command.md
│ ├── pm-command-group.md
│ ├── run-without-vite-plus-dependency.md
│ ├── split-global-cli.md
│ ├── trampoline-exe-for-shims.md
│ ├── update-package-command.md
│ ├── upgrade-command.md
│ ├── vpx-command.md
│ └── why-package-command.md
├── rust-toolchain.toml
├── scripts/
│ └── generate-license.ts
├── tmp/
│ └── .gitignore
├── tsconfig.json
└── vite.config.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[env]
# Required by rolldown_workspace crate - points to the rolldown subproject root
WORKSPACE_DIR = { value = "rolldown", relative = true }
[build]
rustflags = ["--cfg", "tokio_unstable"] # also update .github/workflows/ci.yml
# fix sqlite build error on linux
[target.'cfg(target_os = "linux")']
rustflags = ["--cfg", "tokio_unstable", "-C", "link-args=-Wl,--warn-unresolved-symbols"]
# Increase stack size on Windows to avoid stack overflow
[target.'cfg(all(windows, target_env = "msvc"))']
rustflags = ["--cfg", "tokio_unstable", "-C", "link-arg=/STACK:8388608"]
[target.'cfg(all(windows, target_env = "gnu"))']
rustflags = ["--cfg", "tokio_unstable", "-C", "link-arg=-Wl,--stack,8388608"]
[unstable]
bindeps = true
[net]
git-fetch-with-cli = true # use git CLI to authenticate for vite-task git dependencies
================================================
FILE: .claude/agents/cargo-workspace-merger.md
================================================
---
name: cargo-workspace-merger
description: "Use this agent when you need to merge one Cargo workspace into another, specifically when integrating a subproject's crates and dependencies into a root workspace. This includes tasks like: adding crate path references to workspace members, merging workspace dependency definitions while avoiding duplicates, and ensuring only production dependencies (not unnecessary dev dependencies) are included.\\n\\n<example>\\nContext: The user wants to integrate the rolldown project into their existing Cargo workspace.\\nuser: \"I need to merge the rolldown Cargo workspace into our root workspace\"\\nassistant: \"I'll use the cargo-workspace-merger agent to handle this integration. This involves analyzing both Cargo.toml files, identifying the crates to add, and merging the necessary dependencies.\"\\n<Task tool call to launch cargo-workspace-merger agent>\\n</example>\\n\\n<example>\\nContext: The user has cloned a Rust project as a subdirectory and wants to integrate it.\\nuser: \"Can you add all the crates from ./external-lib into our workspace?\"\\nassistant: \"I'll launch the cargo-workspace-merger agent to analyze the external library's workspace structure and merge it into your root Cargo.toml.\"\\n<Task tool call to launch cargo-workspace-merger agent>\\n</example>"
model: opus
color: yellow
---
You are an expert Rust build system engineer specializing in Cargo workspace management and dependency resolution. You have deep knowledge of Cargo.toml structure, workspace inheritance, and dependency deduplication strategies.
## Your Primary Mission
Merge a child Cargo workspace (located in a subdirectory) into a parent root Cargo workspace. This involves two main tasks:
1. **Adding crate references**: Add all crates from the child workspace to the root workspace's `[workspace.dependencies]` section with proper path references.
2. **Merging workspace dependencies**: Combine the child workspace's `[workspace.dependencies]` with the root's dependencies, ensuring no duplicates and only including dependencies actually used by the crates being merged.
## Step-by-Step Process
### Step 1: Analyze the Child Workspace
- Read the child workspace's `Cargo.toml` (e.g., `./rolldown/Cargo.toml`)
- Identify all workspace members from the `[workspace.members]` section
- Extract all `[workspace.dependencies]` definitions
### Step 2: Identify Crates to Add
- For each workspace member, locate its `Cargo.toml`
- Extract the crate name from `[package].name`
- Build a list of path references in the format: `crate_name = { path = "./child/crates/crate_name" }`
### Step 3: Analyze Dependency Usage
- For each crate in the child workspace, read its `Cargo.toml`
- Collect all dependencies from `[dependencies]`, `[dev-dependencies]`, and `[build-dependencies]`
- Focus on dependencies that reference `workspace = true` - these need the workspace-level definition
- Create a set of actually-used workspace dependencies
### Step 4: Filter and Merge Dependencies
- From the child's `[workspace.dependencies]`, only include those that are actually used by the crates
- Check for conflicts with existing root workspace dependencies:
- Same dependency, same version: Skip (already exists)
- Same dependency, different version: Flag for manual resolution and suggest keeping the newer version
- Exclude dev-only dependencies that aren't needed for the merged crates
### Step 5: Update Root Cargo.toml
- Add all crate path references to `[workspace.dependencies]`
- Add filtered workspace dependencies to `[workspace.dependencies]`
- Maintain alphabetical ordering within sections for cleanliness
- Preserve any existing comments and formatting
## Output Format
Provide:
1. A summary of crates being added
2. A summary of dependencies being merged
3. Any conflicts or issues requiring manual attention
4. The exact additions to make to the root `Cargo.toml`
## Quality Checks
- Verify all paths exist before adding references
- Ensure no duplicate entries are created
- Validate that merged dependencies don't break existing crates
- After modifications, suggest running `cargo check --workspace` to verify the merge
- Use highest compatible semver versions (if not pinned) and merge features in crates
## Important Considerations
- Use `vite_path` types for path operations as per project conventions
- Dependencies with `path` references in the child workspace may need path adjustments
- Feature flags on dependencies must be preserved
- Optional dependencies must maintain their optional status
- If a dependency exists in both workspaces with different features, merge the feature lists
### Workspace Package Inheritance
Child crates may inherit fields from `[workspace.package]` using `field.workspace = true`. Common inherited fields include:
- `homepage`
- `repository`
- `license`
- `edition`
- `authors`
- `rust-version`
**Important**: If the child workspace's `[workspace.package]` defines fields that the root workspace does not, you must add those fields to the root workspace's `[workspace.package]` section. Otherwise, crates that inherit these fields will fail to build with errors like:
```
error inheriting `homepage` from workspace root manifest's `workspace.package.homepage`
Caused by: `workspace.package.homepage` was not defined
```
**Steps to handle this**:
1. Read the child workspace's `[workspace.package]` section
2. Compare with the root workspace's `[workspace.package]` section
3. Add any missing fields to the root workspace (use the root project's own values, not the child's)
## Error Handling
- If a crate path doesn't exist, report it clearly and skip
- If Cargo.toml parsing fails, provide the specific error
- If version conflicts exist, list all conflicts before proceeding and ask for guidance
### Crates with Compile-Time Environment Variables
Some crates use `env!()` macros that require compile-time environment variables set via `.cargo/config.toml`. These crates often have `relative = true` paths that only work when building from their original workspace root.
**Example**: `rolldown_workspace` uses `env!("WORKSPACE_DIR")` which is set in `rolldown/.cargo/config.toml`.
**How to handle**:
1. Check child workspace's `.cargo/config.toml` for `[env]` section
2. If crates use these env vars with `relative = true`, copy those env vars to root `.cargo/config.toml` with paths adjusted to point to the child workspace directory
3. Example: If child has `WORKSPACE_DIR = { value = "", relative = true }`, root should have `WORKSPACE_DIR = { value = "child-dir", relative = true }`
================================================
FILE: .claude/agents/monorepo-architect.md
================================================
---
name: monorepo-architect
description: Use this agent when you need architectural guidance for monorepo tooling, particularly for reviewing code organization, module boundaries, and ensuring proper separation of concerns in Rust/Node.js projects. This agent should be invoked after implementing new features or refactoring existing code to validate architectural decisions and placement of functionality.\n\nExamples:\n- <example>\n Context: The user has just implemented a new caching mechanism for the monorepo task runner.\n user: "I've added a new caching system to handle task outputs"\n assistant: "I'll use the monorepo-architect agent to review the architectural decisions and ensure the caching logic is properly placed within the module structure."\n <commentary>\n Since new functionality was added, use the monorepo-architect agent to review the code architecture and module boundaries.\n </commentary>\n</example>\n- <example>\n Context: The user is refactoring the task dependency resolution system.\n user: "I've refactored how we resolve task dependencies across packages"\n assistant: "Let me invoke the monorepo-architect agent to review the refactored code and ensure proper separation of concerns."\n <commentary>\n After refactoring core functionality, use the monorepo-architect agent to validate architectural decisions.\n </commentary>\n</example>\n- <example>\n Context: The user is adding cross-package communication features.\n user: "I've implemented a new IPC mechanism for packages to communicate during builds"\n assistant: "I'll use the monorepo-architect agent to review where this IPC logic lives and ensure it doesn't create inappropriate cross-module dependencies."\n <commentary>\n When adding features that span multiple modules, use the monorepo-architect agent to prevent architectural violations.\n </commentary>\n</example>
model: opus
color: purple
---
You are a senior software architect with deep expertise in Rust and Node.js ecosystems, specializing in monorepo tooling and build systems. You have extensively studied and analyzed the architectures of nx, Turborepo, Rush, and Lage, understanding their design decisions, trade-offs, and implementation patterns.
Your primary responsibility is to review code architecture and ensure that functionality is properly organized within the codebase. You focus on:
**Core Architectural Principles:**
- Single Responsibility: Each module, file, and function should have one clear purpose
- Separation of Concerns: Business logic, I/O operations, and configuration should be clearly separated
- Module Boundaries: Enforce clean interfaces between modules, preventing tight coupling
- Dependency Direction: Dependencies should flow in one direction, typically from high-level to low-level modules
**When reviewing code, you will:**
1. **Analyze Module Structure**: Examine where new functionality has been placed and determine if it belongs there based on the module's responsibility. Look for code that crosses logical boundaries or mixes concerns.
2. **Identify Architectural Violations**:
- Cross-module responsibilities where one module is doing work that belongs to another
- Circular dependencies or bidirectional coupling
- Business logic mixed with I/O operations
- Configuration logic scattered across multiple modules
- Violation of the dependency inversion principle
3. **Suggest Proper Placement**: When you identify misplaced functionality, provide specific recommendations:
- Identify the correct module/file where the code should reside
- Explain why the current placement violates architectural principles
- Suggest how to refactor without breaking existing functionality
- Consider the impact on testing and maintainability
4. **Reference Industry Standards**: Draw from your knowledge of nx, Turborepo, Rush, and Lage to:
- Compare architectural decisions with proven patterns from these tools
- Highlight when a different approach might be more scalable or maintainable
- Suggest battle-tested patterns for common monorepo challenges
5. **Focus on Rust/Node.js Best Practices**:
- In Rust: Ensure proper use of ownership, traits for abstraction, and module organization
- In Node.js: Validate CommonJS/ESM module patterns, async patterns, and package boundaries
- For interop: Review FFI boundaries and data serialization approaches
**Review Methodology:**
1. Start by understanding the intent of the recent changes
2. Map out the affected modules and their responsibilities
3. Identify any code that seems out of place or creates inappropriate coupling
4. Provide a prioritized list of architectural concerns (critical, important, minor)
5. For each concern, explain the principle being violated and suggest a concrete fix
**Output Format:**
Structure your review as:
- **Summary**: Brief overview of architectural health
- **Critical Issues**: Must-fix architectural violations that will cause problems
- **Recommendations**: Suggested improvements with rationale
- **Positive Patterns**: Acknowledge well-architected decisions
- **Comparison Notes**: When relevant, note how similar problems are solved in nx/Turborepo/Rush/Lage
You are pragmatic and understand that perfect architecture must be balanced with delivery speed. Focus on issues that will genuinely impact maintainability, testability, or scalability. Avoid nitpicking and recognize when 'good enough' is appropriate for the current stage of the project.
When you lack context about the broader system, ask clarifying questions rather than making assumptions. Your goal is to ensure the codebase remains maintainable and follows established architectural patterns while evolving to meet new requirements.
================================================
FILE: .claude/skills/add-ecosystem-ci/SKILL.md
================================================
---
name: add-ecosystem-ci
description: Add a new ecosystem-ci test case for testing real-world projects against vite-plus
allowed-tools: Bash, Read, Edit, Write, WebFetch, AskUserQuestion
---
# Add Ecosystem-CI Test Case
Add a new ecosystem-ci test case following this process:
## Step 1: Get Repository Information
Ask the user for the GitHub repository URL if not provided as argument: $ARGUMENTS
Use GitHub CLI to get repository info:
```bash
gh api repos/OWNER/REPO --jq '.default_branch'
gh api repos/OWNER/REPO/commits/BRANCH --jq '.sha'
```
## Step 2: Auto-detect Project Configuration
### 2.1 Check for Subdirectory
Fetch the repository's root to check if the main package.json is in a subdirectory (like `web/`, `app/`, `frontend/`).
### 2.2 Check if Project Already Uses Vite-Plus
Check the project's root `package.json` for `vite-plus` in `dependencies` or `devDependencies`. If the project already uses vite-plus, set `forceFreshMigration: true` in `repo.json`. This tells `patch-project.ts` to set `VITE_PLUS_FORCE_MIGRATE=1` so `vp migrate` forces full dependency rewriting instead of skipping with "already using Vite+".
### 2.3 Auto-detect Commands from GitHub Workflows
Fetch the project's GitHub workflow files to detect available commands:
```bash
# List workflow files
gh api repos/OWNER/REPO/contents/.github/workflows --jq '.[].name'
# Fetch workflow content (for each .yml/.yaml file)
gh api repos/OWNER/REPO/contents/.github/workflows/ci.yml --jq '.content' | base64 -d
```
Look for common patterns in workflow files:
- `pnpm run <command>` / `npm run <command>` / `yarn <command>`
- Commands like: `lint`, `build`, `test`, `type-check`, `typecheck`, `format`, `format:check`
- Map detected commands to `vp` equivalents: `vp run lint`, `vp run build`, etc.
### 2.4 Ask User to Confirm
Present the auto-detected configuration and ask user to confirm or modify:
- Which directory contains the main package.json? (auto-detected or manual)
- What Node.js version to use? (22 or 24, try to detect from workflow)
- Which commands to run? (show detected commands as multi-select options)
- Which OS to run on? (both, ubuntu-only, windows-only) - default: both
## Step 3: Update Files
1. **Add to `ecosystem-ci/repo.json`**:
```json
{
"project-name": {
"repository": "https://github.com/owner/repo.git",
"branch": "main",
"hash": "full-commit-sha",
"directory": "web", // only if subdirectory is needed
"forceFreshMigration": true // only if project already uses vite-plus
}
}
```
2. **Add to `.github/workflows/e2e-test.yml`** matrix:
```yaml
- name: project-name
node-version: 24
directory: web # only if subdirectory is needed
command: |
vp run lint
vp run build
```
## Step 4: Verify
Test the clone locally:
```bash
node ecosystem-ci/clone.ts project-name
```
3. **Add OS exclusion to `.github/workflows/e2e-test.yml`** (if not running on both):
For ubuntu-only:
```yaml
exclude:
- os: windows-latest
project:
name: project-name
```
For windows-only:
```yaml
exclude:
- os: ubuntu-latest
project:
name: project-name
```
## Important Notes
- The `directory` field is optional - only add it if the package.json is not in the project root
- If `directory` is specified in repo.json, it must also be specified in the workflow matrix
- `patch-project.ts` automatically handles running `vp migrate` in the correct directory
- `forceFreshMigration` is required for projects that already have `vite-plus` in their package.json — it sets `VITE_PLUS_FORCE_MIGRATE=1` so `vp migrate` forces full dependency rewriting instead of skipping
- OS exclusions are added to the existing `exclude` section in the workflow matrix
================================================
FILE: .claude/skills/bump-vite-task/SKILL.md
================================================
---
name: bump-vite-task
description: Bump vite-task git dependency to the latest main commit. Use when you need to update the vite-task crates (fspy, vite_glob, vite_path, vite_str, vite_task, vite_workspace) in vite-plus.
allowed-tools: Read, Grep, Glob, Edit, Bash, Agent, WebFetch
---
# Bump vite-task to Latest Main
Update the vite-task git dependency in `Cargo.toml` to the latest commit on the vite-task main branch, fix any breaking changes, and create a PR.
## Steps
### 1. Get current and target commits
- Read `Cargo.toml` and find the current `rev = "..."` for any vite-task git dependency (e.g., `vite_task`, `vite_path`, `fspy`, `vite_glob`, `vite_str`, `vite_workspace`). They all share the same revision.
- Get the latest commit hash on vite-task's main branch:
```bash
git ls-remote https://github.com/voidzero-dev/vite-task.git refs/heads/main
```
### 2. Update Cargo.toml
- Replace **all** occurrences of the old commit hash with the new one in `Cargo.toml`. There are 6 crate entries that reference the same vite-task revision: `fspy`, `vite_glob`, `vite_path`, `vite_str`, `vite_task`, `vite_workspace`.
### 3. Ensure upstream dependencies are cloned
- `cargo check` requires the `./rolldown` and `./vite` directories to exist (many workspace path dependencies point to `./rolldown/crates/...`).
- Locally, clone them using the commit hashes from `packages/tools/.upstream-versions.json`.
- CI handles this automatically via the `.github/actions/clone` action.
### 4. Verify compilation
- Run `cargo check` to ensure the new vite-task compiles without errors.
- If there are compilation errors, these are **breaking changes** from vite-task. Fix them in the vite-plus codebase (the consuming side), not in vite-task.
- Common breaking changes include: renamed functions/methods, changed function signatures, new required fields in structs, removed public APIs.
### 5. Run tests
- Run `cargo test -p vite_command -p vite_error -p vite_install -p vite_js_runtime -p vite_migration -p vite_shared -p vite_static_config -p vite-plus-cli -p vite_global_cli` to run the vite-plus crate tests.
- Note: Some tests require network access (e.g., `vite_install::package_manager` tests, `vite_global_cli::commands::env` tests). These may fail in sandboxed environments. Verify they also fail on the main branch before dismissing them.
- Note: `cargo test -p vite_task` will NOT work because vite_task is a git dependency, not a workspace member.
### 6. Update snap tests
vite-task changes often affect CLI output, which means snap tests need updating. Common output changes:
- **Status icons**: e.g., cache hit/miss indicators may change
- **New CLI options**: e.g., new flags added to `vp run` that show up in help output
- **Cache behavior messages**: e.g., new summary lines about cache status
- **Task output formatting**: e.g., step numbering, separator lines
To update snap tests:
1. Push your changes and let CI run the snap tests.
2. CI will show the diff in the E2E test logs if snap tests fail.
3. Extract the diff from CI logs and apply it locally.
4. Check all three platforms (Linux, Mac, Windows) since they may have slightly different snap test coverage.
5. Watch for trailing newline issues - ensure snap files end consistently.
Snap test files are at `packages/cli/snap-tests/*/snap.txt` and `packages/cli/snap-tests-global/*/snap.txt`.
### 7. Create the PR
- Commit message: `chore: bump vite-task to <short-hash>`
- PR title: `chore: bump vite-task to <short-hash>`
- PR body: Link to vite-task CHANGELOG.md diff between old and new commits:
```
https://github.com/voidzero-dev/vite-task/compare/<old-hash>...<new-hash>#diff-06572a96a58dc510037d5efa622f9bec8519bc1beab13c9f251e97e657a9d4ed
```
### 8. Verify CI
Wait for CI and ensure the `done` check passes. Key checks to monitor:
- **Lint**: Clippy and format checks
- **Test** (Linux, Mac, Windows): Rust unit tests
- **CLI E2E test** (Linux, Mac, Windows): Snap tests - most likely to fail on a vite-task bump
- **Run task**: Task runner integration tests
- **Cargo Deny**: License/advisory checks (may have pre-existing failures unrelated to bump)
The only **required** status check for merging is `done`, which aggregates the other checks (excluding Cargo Deny).
## Notes
- Building the full CLI locally (`pnpm bootstrap-cli`) requires the rolldown Node.js package to be built first, which is complex. Prefer relying on CI for snap test generation.
- `Cargo.lock` is automatically updated by cargo when you change the revision in `Cargo.toml`.
================================================
FILE: .claude/skills/spawn-process/SKILL.md
================================================
---
name: spawn-process
description: Guide for writing subprocess execution code using the vite_command crate
allowed-tools: Read, Grep, Glob, Edit, Write, Bash
---
# Add Subprocess Execution Code
When writing Rust code that needs to spawn subprocesses (resolve binaries, build commands, execute programs), always use the `vite_command` crate. Never use `which`, `tokio::process::Command::new`, or `std::process::Command::new` directly.
## Available APIs
### `vite_command::resolve_bin(name, path_env, cwd)` — Resolve a binary name to an absolute path
Handles PATHEXT (`.cmd`/`.bat`) on Windows. Pass `None` for `path_env` to search the current process PATH.
```rust
// Resolve using current PATH
let bin = vite_command::resolve_bin("node", None, &cwd)?;
// Resolve using a custom PATH
let custom_path = std::ffi::OsString::from(&path_env_str);
let bin = vite_command::resolve_bin("eslint", Some(&custom_path), &cwd)?;
```
### `vite_command::build_command(bin_path, cwd)` — Build a command for a pre-resolved binary
Returns `tokio::process::Command` with cwd, inherited stdio, and `fix_stdio_streams` on Unix already configured. Add args, envs, or override stdio as needed.
```rust
let bin = vite_command::resolve_bin("eslint", None, &cwd)?;
let mut cmd = vite_command::build_command(&bin, &cwd);
cmd.args(&[".", "--fix"]);
cmd.env("NODE_ENV", "production");
let mut child = cmd.spawn()?;
let status = child.wait().await?;
```
### `vite_command::build_shell_command(shell_cmd, cwd)` — Build a shell command
Uses `/bin/sh -c` on Unix, `cmd.exe /C` on Windows. Same stdio and `fix_stdio_streams` setup as `build_command`.
```rust
let mut cmd = vite_command::build_shell_command("echo hello && ls", &cwd);
let mut child = cmd.spawn()?;
let status = child.wait().await?;
```
### `vite_command::run_command(bin_name, args, envs, cwd)` — Resolve + build + run in one call
Combines resolve_bin, build_command, and status().await. The `envs` HashMap must include `"PATH"` if you want custom PATH resolution.
```rust
let envs = HashMap::from([("PATH".to_string(), path_value)]);
let status = vite_command::run_command("node", &["--version"], &envs, &cwd).await?;
```
## Dependency Setup
Add `vite_command` to the crate's `Cargo.toml`:
```toml
[dependencies]
vite_command = { workspace = true }
```
Do NOT add `which` as a direct dependency — binary resolution goes through `vite_command::resolve_bin`.
## Exception
`crates/vite_global_cli/src/shim/exec.rs` uses synchronous `std::process::Command` with Unix `exec()` for process replacement. This is the only place that bypasses `vite_command`.
================================================
FILE: .claude/skills/sync-tsdown-cli/SKILL.md
================================================
---
name: sync-tsdown-cli
description: Compare tsdown CLI options with vp pack and sync any new or removed options. Use when tsdown is upgraded or when you need to check for CLI option drift between tsdown and vp pack.
allowed-tools: Read, Grep, Glob, Edit, Bash
---
# Sync tsdown CLI Options with vp pack
Compare the upstream `tsdown` CLI options with `vp pack` (defined in `packages/cli/src/pack-bin.ts`) and sync any differences.
## Steps
1. Run `npx tsdown --help` from `packages/cli/` to get tsdown's current CLI options
2. Read `packages/cli/src/pack-bin.ts` to see vp pack's current options
3. Compare and add any new tsdown options to `pack-bin.ts` using the existing cac `.option()` pattern
4. If tsdown removed options, do NOT remove them from `pack-bin.ts` -- instead add a code comment like `// NOTE: removed from tsdown CLI in vX.Y.Z` above the option so reviewers can decide whether to follow up
5. Preserve intentional differences:
- `-c, --config` is intentionally commented out (vp pack uses vite.config.ts)
- `--env-prefix` has a different default (`['VITE_PACK_', 'TSDOWN_']`)
6. Verify with `pnpm --filter vite-plus build-ts` and `vp pack -h`
7. If new parameters were added, add a corresponding snap test under `packages/cli/snap-tests/` to verify the new option works correctly
================================================
FILE: .clippy.toml
================================================
avoid-breaking-exported-api = false
disallowed-methods = [
{ path = "str::to_ascii_lowercase", reason = "To avoid memory allocation, use `cow_utils::CowUtils::cow_to_ascii_lowercase` instead." },
{ path = "str::to_ascii_uppercase", reason = "To avoid memory allocation, use `cow_utils::CowUtils::cow_to_ascii_uppercase` instead." },
{ path = "str::to_lowercase", reason = "To avoid memory allocation, use `cow_utils::CowUtils::cow_to_lowercase` instead." },
{ path = "str::to_uppercase", reason = "To avoid memory allocation, use `cow_utils::CowUtils::cow_to_uppercase` instead." },
{ path = "str::replace", reason = "To avoid memory allocation, use `cow_utils::CowUtils::cow_replace` instead." },
{ path = "str::replacen", reason = "To avoid memory allocation, use `cow_utils::CowUtils::cow_replacen` instead." },
{ path = "std::env::current_dir", reason = "To get an `AbsolutePathBuf`, Use `vite_path::current_dir` instead." },
]
disallowed-types = [
{ path = "std::collections::HashMap", reason = "Use `rustc_hash::FxHashMap` instead, which is typically faster." },
{ path = "std::collections::HashSet", reason = "Use `rustc_hash::FxHashSet` instead, which is typically faster." },
{ path = "std::path::Path", reason = "Use `vite_path::RelativePath` or `vite_path::AbsolutePath` instead" },
{ path = "std::path::PathBuf", reason = "Use `vite_path::RelativePathBuf` or `vite_path::AbsolutePathBuf` instead" },
{ path = "std::string::String", reason = "Use `vite_str::Str` for small strings. For large strings, prefer `Box/Rc/Arc<str>` if mutation is not needed." },
]
disallowed-macros = [
{ path = "std::format", reason = "Use `vite_str::format` for small strings." },
{ path = "std::println", reason = "Use `vite_shared::output` functions (`info`, `note`, `success`) instead." },
{ path = "std::print", reason = "Use `vite_shared::output` functions (`info`, `note`, `success`) instead." },
{ path = "std::eprintln", reason = "Use `vite_shared::output` functions (`warn`, `error`) instead." },
{ path = "std::eprint", reason = "Use `vite_shared::output` functions (`warn`, `error`) instead." },
]
================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/rust
{
"name": "Rust",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/vscode/devcontainers/base:ubuntu-22.04",
"updateContentCommand": {
"rustToolchain": "rustup show"
},
"containerEnv": {
"CARGO_TARGET_DIR": "/tmp/target"
},
"features": {
"ghcr.io/devcontainers/features/rust:1": {},
"ghcr.io/devcontainers-extra/features/fish-apt-get:1": {}
},
"customizations": {
"vscode": {
"extensions": ["rust-lang.rust-analyzer", "tamasfe.even-better-toml", "fill-labs.dependi"],
"settings": {
"terminal.integrated.defaultProfile.linux": "fish",
"terminal.integrated.profiles.linux": {
"fish": {
"path": "/usr/bin/fish"
}
}
}
}
},
"postCreateCommand": "curl -fsSL https://vite.plus | bash"
// Use 'mounts' to make the cargo cache persistent in a Docker Volume.
// "mounts": [
// {
// "source": "devcontainer-cargo-cache-${devcontainerId}",
// "target": "/usr/local/cargo",
// "type": "volume"
// }
// ]
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "rustc --version",
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: "\U0001F41E Bug report"
description: Report an issue with Vite+
labels: [pending triage]
type: Bug
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report.
Please only file issues here if the bug is in Vite+ itself.
If the bug belongs to an underlying tool, report it in that project's tracker (linked in the "Create new issue" page).
- type: textarea
id: bug-description
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us in the description.
placeholder: I am doing ... What I expect is ... What is actually happening is ...
validations:
required: true
- type: input
id: reproduction
attributes:
label: Reproduction
description: Please provide a link to a minimal reproduction repository or a runnable stackblitz/sandbox. If a report is vague and has no reproduction, it may be closed.
placeholder: Reproduction URL
validations:
required: true
- type: textarea
id: reproduction-steps
attributes:
label: Steps to reproduce
description: Provide any required steps, commands, or setup details.
placeholder: Run `pnpm install` followed by `vp dev`
- type: textarea
id: system-info
attributes:
label: System Info
description: |
Paste the full output of both commands:
- `vp env current`
- `vp --version`
render: shell
placeholder: Paste `vp env current` and `vp --version` output here
validations:
required: true
- type: dropdown
id: package-manager
attributes:
label: Used Package Manager
description: Select the package manager used in your project
options:
- npm
- yarn
- pnpm
- bun
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs
description: |
Optional when a reproduction is provided. Please copy-paste text logs instead of screenshots.
If relevant, run your command with `--debug` and include the output.
render: shell
- type: checkboxes
id: checkboxes
attributes:
label: Validations
description: Before submitting the issue, please confirm the following
options:
- label: Read the [Contributing Guidelines](https://github.com/voidzero-dev/vite-plus/blob/main/CONTRIBUTING.md).
required: true
- label: Check that there isn't [already an issue](https://github.com/voidzero-dev/vite-plus/issues) for the same bug.
required: true
- label: Confirm this is a Vite+ issue and not an upstream issue (Vite, Vitest, tsdown, Rolldown, or Oxc).
required: true
- label: The provided reproduction is a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example).
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Vite Issues
url: https://github.com/vitejs/vite/issues/new/choose
about: Report issues specific to Vite core in the Vite repository.
- name: Vitest Issues
url: https://github.com/vitest-dev/vitest/issues/new/choose
about: Report issues specific to Vitest in the Vitest repository.
- name: tsdown Issues
url: https://github.com/rolldown/tsdown/issues/new/choose
about: Report issues specific to tsdown in the tsdown repository.
- name: Rolldown Issues
url: https://github.com/rolldown/rolldown/issues/new/choose
about: Report issues specific to Rolldown in the Rolldown repository.
- name: Oxc (Oxlint/Oxfmt) Issues
url: https://github.com/oxc-project/oxc/issues/new/choose
about: Report Oxlint/Oxfmt issues in the Oxc repository.
================================================
FILE: .github/ISSUE_TEMPLATE/docs.yml
================================================
name: "\U0001F4DA Documentation"
description: Suggest a documentation improvement for Vite+
labels: [documentation]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this issue.
- type: checkboxes
id: documentation_is
attributes:
label: Documentation is
options:
- label: Missing
- label: Outdated
- label: Confusing
- label: Not sure
- type: textarea
id: description
attributes:
label: Explain in Detail
description: A clear and concise description of your suggestion. If you intend to submit a PR for this issue, mention it here.
placeholder: The description of ... is not clear. I thought it meant ... but it wasn't.
validations:
required: true
- type: textarea
id: suggestion
attributes:
label: Your Suggestion for Changes
validations:
required: true
- type: input
id: reference
attributes:
label: Relevant Page
description: Link to the relevant doc page, section, or file.
placeholder: https://github.com/voidzero-dev/vite-plus/blob/main/docs/...
- type: input
id: reproduction
attributes:
label: Reproduction (Optional)
description: If the docs issue is tied to behavior, share a minimal reproduction link.
placeholder: Reproduction URL
- type: textarea
id: reproduction-steps
attributes:
label: Steps to reproduce (Optional)
description: Add steps if the docs issue is about incorrect behavior guidance.
placeholder: Run `pnpm install` followed by `vp dev`
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: "\U0001F680 New feature proposal"
description: Propose a new feature to be added to Vite+
labels: [pending triage]
type: Feature
body:
- type: markdown
attributes:
value: |
Thanks for your interest in Vite+ and taking the time to fill out this feature report.
Please only open feature proposals here for Vite+ itself.
If the proposal belongs to an underlying tool, use that project's tracker (linked in the "Create new issue" page).
- type: textarea
id: feature-description
attributes:
label: Description
description: 'Clear and concise description of the problem. Explain use cases and motivation. If you intend to submit a PR for this issue, mention it here.'
placeholder: As a developer using Vite+ I want [goal / wish] so that [benefit].
validations:
required: true
- type: textarea
id: suggested-solution
attributes:
label: Suggested solution
description: 'Describe a possible API, behavior, or implementation direction.'
validations:
required: true
- type: textarea
id: alternative
attributes:
label: Alternative
description: Describe any alternative solutions or features you've considered.
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Any other context, links, or screenshots about the feature request.
- type: checkboxes
id: checkboxes
attributes:
label: Validations
description: Before submitting the issue, please confirm the following
options:
- label: Read the [Contributing Guidelines](https://github.com/voidzero-dev/vite-plus/blob/main/CONTRIBUTING.md).
required: true
- label: Confirm this request is for Vite+ itself and not for Vite, Vitest, tsdown, Rolldown, or Oxc.
required: true
- label: Check that there isn't already an issue requesting the same feature.
required: true
================================================
FILE: .github/actions/build-upstream/action.yml
================================================
name: 'Build with Upstream Repositories'
description: 'Builds Vite+ with the upstream repositories'
inputs:
target:
description: 'The target platform'
required: true
print-after-build:
description: 'Print the output after the build'
required: false
default: 'false'
runs:
using: 'composite'
steps:
- uses: ./.github/actions/download-rolldown-binaries
with:
github-token: ${{ github.token }}
target: ${{ inputs.target }}
upload: 'false'
# Compute cache key once before any builds modify files
# (packages/cli/package.json is modified by syncTestPackageExports during build-ts)
# Include env vars (RELEASE_BUILD, DEBUG, VERSION) to ensure cache miss on release builds
- name: Compute NAPI binding cache key
id: cache-key
shell: bash
run: |
echo "key=napi-binding-v3-${{ inputs.target }}-${{ env.RELEASE_BUILD }}-${{ env.DEBUG }}-${{ env.VERSION }}-${{ env.NPM_TAG }}-${{ hashFiles('packages/tools/.upstream-versions.json', 'Cargo.lock', 'crates/**/*.rs', 'crates/*/Cargo.toml', 'packages/cli/binding/**/*.rs', 'packages/cli/binding/Cargo.toml', 'Cargo.toml', '.cargo/config.toml', 'packages/cli/package.json', 'packages/cli/build.ts') }}" >> $GITHUB_OUTPUT
# Cache NAPI bindings and Rust CLI binary (the slow parts, especially on Windows)
- name: Restore NAPI binding cache
id: cache-restore
uses: actions/cache/restore@94b89442628ad1d101e352b7ee38f30e1bef108e # v5
with:
path: |
packages/cli/binding/*.node
packages/cli/binding/index.js
packages/cli/binding/index.d.ts
packages/cli/binding/index.cjs
packages/cli/binding/index.d.cts
target/${{ inputs.target }}/release/vp
target/${{ inputs.target }}/release/vp.exe
target/${{ inputs.target }}/release/vp-shim.exe
key: ${{ steps.cache-key.outputs.key }}
# Apply Vite+ branding patches to vite source (CI checks out
# upstream vite which doesn't have branding patches)
- name: Brand vite
shell: bash
run: pnpm exec tool brand-vite
# Build upstream TypeScript packages first (don't depend on native bindings)
- name: Build upstream TypeScript packages
shell: bash
run: |
pnpm --filter @rolldown/pluginutils build
pnpm --filter rolldown build-node
pnpm --filter vite build-types
pnpm --filter "@voidzero-dev/*" build
pnpm --filter vite-plus build-ts
# NAPI builds - only run on cache miss (slow, especially on Windows)
# Must run before vite-plus TypeScript builds which depend on the bindings
- name: Build NAPI bindings (x86_64-linux)
shell: bash
if: steps.cache-restore.outputs.cache-hit != 'true' && inputs.target == 'x86_64-unknown-linux-gnu'
run: |
pnpm --filter=vite-plus build-native --target ${{ inputs.target }} --use-napi-cross
env:
TARGET_CC: clang
DEBUG: napi:*
- name: Build NAPI bindings (aarch64-linux)
shell: bash
if: steps.cache-restore.outputs.cache-hit != 'true' && inputs.target == 'aarch64-unknown-linux-gnu'
run: |
pnpm --filter=vite-plus build-native --target ${{ inputs.target }} --use-napi-cross
env:
TARGET_CC: clang
TARGET_CFLAGS: '-D_BSD_SOURCE'
DEBUG: napi:*
- name: Build NAPI bindings (non-Linux targets)
shell: bash
if: steps.cache-restore.outputs.cache-hit != 'true' && !contains(inputs.target, 'linux')
run: |
pnpm --filter=vite-plus build-native --target ${{ inputs.target }}
env:
DEBUG: napi:*
- name: Build Rust CLI binary (x86_64-linux)
if: steps.cache-restore.outputs.cache-hit != 'true' && inputs.target == 'x86_64-unknown-linux-gnu'
shell: bash
run: |
pnpm exec napi build --use-napi-cross --target ${{ inputs.target }} --release -p vite_global_cli
env:
TARGET_CC: clang
DEBUG: napi:*
- name: Build Rust CLI binary (aarch64-linux)
if: steps.cache-restore.outputs.cache-hit != 'true' && inputs.target == 'aarch64-unknown-linux-gnu'
shell: bash
run: |
pnpm exec napi build --use-napi-cross --target ${{ inputs.target }} --release -p vite_global_cli
env:
TARGET_CC: clang
TARGET_CFLAGS: '-D_BSD_SOURCE'
DEBUG: napi:*
- name: Build Rust CLI binary (non-Linux targets)
if: steps.cache-restore.outputs.cache-hit != 'true' && !contains(inputs.target, 'linux')
shell: bash
run: cargo build --release --target ${{ inputs.target }} -p vite_global_cli
- name: Build trampoline shim binary (Windows only)
if: steps.cache-restore.outputs.cache-hit != 'true' && contains(inputs.target, 'windows')
shell: bash
run: cargo build --release --target ${{ inputs.target }} -p vite_trampoline
- name: Save NAPI binding cache
if: steps.cache-restore.outputs.cache-hit != 'true'
uses: actions/cache/save@94b89442628ad1d101e352b7ee38f30e1bef108e # v5
with:
path: |
packages/cli/binding/*.node
packages/cli/binding/index.js
packages/cli/binding/index.d.ts
packages/cli/binding/index.cjs
packages/cli/binding/index.d.cts
target/${{ inputs.target }}/release/vp
target/${{ inputs.target }}/release/vp.exe
target/${{ inputs.target }}/release/vp-shim.exe
key: ${{ steps.cache-key.outputs.key }}
# Build vite-plus TypeScript after native bindings are ready
- name: Build vite-plus TypeScript packages
shell: bash
run: |
pnpm --filter=vite-plus build-ts
- name: Print output after build
shell: bash
if: inputs.print-after-build == 'true'
run: |
pnpm vp -h
pnpm vp run -h
pnpm vp lint -h
pnpm vp test -h
pnpm vp build -h
pnpm vp fmt -h
================================================
FILE: .github/actions/clone/action.yml
================================================
name: 'Clone Repositories'
description: 'Clone self and upstream repositories'
inputs:
ecosystem-ci-project:
description: 'The ecosystem ci project to clone'
required: false
default: ''
outputs:
ecosystem-ci-project-path:
description: 'The path where the ecosystem ci project was cloned'
value: ${{ steps.ecosystem-ci-project-hash.outputs.ECOSYSTEM_CI_PROJECT_PATH }}
runs:
using: 'composite'
steps:
- name: Output rolldown and vite hash
shell: bash
id: upstream-versions
run: |
node -e "console.log('ROLLDOWN_HASH=' + require('./packages/tools/.upstream-versions.json').rolldown.hash)" >> $GITHUB_OUTPUT
node -e "console.log('ROLLDOWN_VITE_HASH=' + require('./packages/tools/.upstream-versions.json')['vite'].hash)" >> $GITHUB_OUTPUT
- name: Output ecosystem ci project hash
shell: bash
id: ecosystem-ci-project-hash
if: ${{ inputs.ecosystem-ci-project != '' }}
run: |
node -e "console.log('ECOSYSTEM_CI_PROJECT_HASH=' + require('./ecosystem-ci/repo.json')['${{ inputs.ecosystem-ci-project }}'].hash)" >> $GITHUB_OUTPUT
node -e "console.log('ECOSYSTEM_CI_PROJECT_REPOSITORY=' + require('./ecosystem-ci/repo.json')['${{ inputs.ecosystem-ci-project }}'].repository.replace('https://github.com/', '').replace('.git', ''))" >> $GITHUB_OUTPUT
echo "ECOSYSTEM_CI_PROJECT_PATH=${{ runner.temp }}/vite-plus-ecosystem-ci/${{ inputs.ecosystem-ci-project }}" >> $GITHUB_OUTPUT
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
repository: rolldown/rolldown
path: rolldown
ref: ${{ steps.upstream-versions.outputs.ROLLDOWN_HASH }}
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
repository: vitejs/vite
path: vite
ref: ${{ steps.upstream-versions.outputs.ROLLDOWN_VITE_HASH }}
# Disable autocrlf to preserve LF line endings on Windows
# This prevents prettier/eslint from failing with "Delete ␍" errors
- name: Configure git for LF line endings
if: ${{ inputs.ecosystem-ci-project != '' }}
shell: bash
run: git config --global core.autocrlf false
- name: Clone ecosystem ci project
if: ${{ inputs.ecosystem-ci-project != '' }}
shell: bash
run: npx tsx ecosystem-ci/clone.ts ${{ inputs.ecosystem-ci-project }}
================================================
FILE: .github/actions/download-rolldown-binaries/action.yml
================================================
name: 'Download Rolldown Binaries'
description: 'Download previous release rolldown binaries and upload as artifact'
inputs:
github-token:
description: 'GitHub token for accessing GitHub Package Registry'
required: true
target:
description: 'The target platform'
default: 'x86_64-unknown-linux-gnu'
required: false
upload:
description: 'Upload the rolldown binaries as artifact'
required: false
default: 'true'
runs:
using: 'composite'
steps:
- name: Install previous release
shell: bash
run: |
if ${{ runner.os == 'Windows' }}; then
export TARGET="win32-x64-msvc"
elif ${{ runner.os == 'Linux' }}; then
export TARGET="linux-x64-gnu"
elif ${{ runner.os == 'macOS' }}; then
export TARGET="darwin-arm64"
fi
# Pin to the version from checked-out rolldown source to avoid mismatch
# between JS code (built from source) and native binary (downloaded from npm).
# Falls back to npm latest only when rolldown source isn't cloned yet
# (e.g., the standalone download-previous-rolldown-binaries job).
if [ -f "./rolldown/packages/rolldown/package.json" ]; then
export VERSION=$(node -p "require('./rolldown/packages/rolldown/package.json').version")
echo "Using rolldown version from source: ${VERSION}"
else
export VERSION=$(npm view --json rolldown | jq -r '.version')
echo "Warning: rolldown source not found, using npm latest: ${VERSION}"
fi
npm pack "@rolldown/binding-${TARGET}@${VERSION}"
tar -xzf "rolldown-binding-${TARGET}-${VERSION}.tgz"
if [ -d "./rolldown/packages/rolldown/src" ]; then
cp "./package/rolldown-binding.${TARGET}.node" ./rolldown/packages/rolldown/src
ls ./rolldown/packages/rolldown/src
fi
env:
GITHUB_TOKEN: ${{ inputs.github-token }}
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ inputs.upload == 'true' }}
with:
name: rolldown-binaries
path: ./package/rolldown-binding.*.node
if-no-files-found: error
- name: Clean up
shell: bash
run: |
rm -rf package
rm *.tgz
================================================
FILE: .github/actions/set-snapshot-version/action.yml
================================================
name: Compute Release Version
description: Get latest tag from GitHub and increment the patch version
inputs:
npm_tag:
description: 'npm tag (latest or alpha)'
required: true
default: 'latest'
outputs:
version:
description: The computed version string
value: ${{ steps.version.outputs.version }}
runs:
using: composite
steps:
- name: Compute next patch version
id: version
shell: bash
run: |
git fetch --tags --quiet
npm install --prefix ${{ github.action_path }} semver > /dev/null 2>&1
VERSION_OUTPUT=$(node ${{ github.action_path }}/compute-version.mjs "${{ inputs.npm_tag }}")
echo "$VERSION_OUTPUT"
echo "$VERSION_OUTPUT" | tail -n 1 >> $GITHUB_OUTPUT
================================================
FILE: .github/actions/set-snapshot-version/compute-version.mjs
================================================
import { execSync } from 'node:child_process';
import semver from 'semver';
const npmTag = process.argv[2] || 'latest';
// Get all version tags
const tagsOutput = execSync('git tag -l "v*"', { encoding: 'utf-8' }).trim();
const tags = tagsOutput ? tagsOutput.split('\n') : [];
// Parse and filter to valid semver, then find latest stable (no prerelease)
const stableTags = tags
.map((tag) => semver.parse(tag.replace(/^v/, '')))
.filter((v) => v !== null && v.prerelease.length === 0);
let nextVersion;
if (stableTags.length === 0) {
nextVersion = '0.1.0';
} else {
stableTags.sort(semver.rcompare);
const latest = stableTags[0];
nextVersion = semver.inc(latest, 'patch');
}
let version;
if (npmTag === 'alpha') {
// Find existing alpha tags for this version
const alphaPrefix = `v${nextVersion}-alpha.`;
const alphaTags = tags
.filter((tag) => tag.startsWith(alphaPrefix))
.map((tag) => semver.parse(tag.replace(/^v/, '')))
.filter((v) => v !== null);
let alphaNum = 0;
if (alphaTags.length > 0) {
alphaTags.sort(semver.rcompare);
alphaNum = alphaTags[0].prerelease[1] + 1;
}
version = `${nextVersion}-alpha.${alphaNum}`;
} else {
version = nextVersion;
}
const latestStable = stableTags.length > 0 ? `v${stableTags[0].version}` : 'none';
console.log(`Computed version: ${version} (latest stable tag: ${latestStable})`);
console.log(`version=${version}`);
================================================
FILE: .github/actions/set-snapshot-version/package.json
================================================
{
"private": true,
"type": "module"
}
================================================
FILE: .github/renovate.json
================================================
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>Boshen/renovate"],
"ignorePaths": [
"packages/cli/snap-tests/**",
"packages/cli/snap-tests-global/**",
"packages/cli/snap-tests-todo/**",
"bench/fixtures/**",
"rolldown/**",
"vite/**"
],
"packageRules": [
{
"matchPackageNames": ["vitest-dev"],
"enabled": false
},
{
"matchPackageNames": [
"fspy",
"vite_glob",
"vite_path",
"vite_str",
"vite_task",
"vite_workspace",
"https://github.com/voidzero-dev/vite-task"
],
"enabled": false
}
]
}
================================================
FILE: .github/scripts/upgrade-deps.mjs
================================================
import fs from 'node:fs';
import path from 'node:path';
const ROOT = process.cwd();
// ============ GitHub API ============
async function getLatestTagCommit(owner, repo) {
const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/tags`, {
headers: {
Authorization: `token ${process.env.GITHUB_TOKEN}`,
Accept: 'application/vnd.github.v3+json',
},
});
if (!res.ok) {
throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${res.status} ${res.statusText}`);
}
const tags = await res.json();
if (!Array.isArray(tags) || !tags.length) {
throw new Error(`No tags found for ${owner}/${repo}`);
}
if (!tags[0]?.commit?.sha) {
throw new Error(`Invalid tag structure for ${owner}/${repo}: missing commit SHA`);
}
console.log(`${repo} -> ${tags[0].name}`);
return tags[0].commit.sha;
}
// ============ npm Registry ============
async function getLatestNpmVersion(packageName) {
const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`);
if (!res.ok) {
throw new Error(
`Failed to fetch npm version for ${packageName}: ${res.status} ${res.statusText}`,
);
}
const data = await res.json();
if (!data?.version) {
throw new Error(`Invalid npm response for ${packageName}: missing version field`);
}
return data.version;
}
// ============ Update .upstream-versions.json ============
async function updateUpstreamVersions() {
const filePath = path.join(ROOT, 'packages/tools/.upstream-versions.json');
const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
// rolldown -> rolldown/rolldown
data.rolldown.hash = await getLatestTagCommit('rolldown', 'rolldown');
// vite -> vitejs/vite
data['vite'].hash = await getLatestTagCommit('vitejs', 'vite');
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n');
console.log('Updated .upstream-versions.json');
}
// ============ Update pnpm-workspace.yaml ============
async function updatePnpmWorkspace(versions) {
const filePath = path.join(ROOT, 'pnpm-workspace.yaml');
let content = fs.readFileSync(filePath, 'utf8');
// Update vitest-dev override (handle pre-release versions like -beta.1, -rc.0)
// Handle both quoted ('npm:vitest@^...') and unquoted (npm:vitest@^...) forms
content = content.replace(
/vitest-dev: '?npm:vitest@\^[\d.]+(-[\w.]+)?'?/,
`vitest-dev: 'npm:vitest@^${versions.vitest}'`,
);
// Update tsdown in catalog (handle pre-release versions)
content = content.replace(/tsdown: \^[\d.]+(-[\w.]+)?/, `tsdown: ^${versions.tsdown}`);
// Update @oxc-node/cli in catalog
content = content.replace(
/'@oxc-node\/cli': \^[\d.]+(-[\w.]+)?/,
`'@oxc-node/cli': ^${versions.oxcNodeCli}`,
);
// Update @oxc-node/core in catalog
content = content.replace(
/'@oxc-node\/core': \^[\d.]+(-[\w.]+)?/,
`'@oxc-node/core': ^${versions.oxcNodeCore}`,
);
// Update oxfmt in catalog
content = content.replace(/oxfmt: =[\d.]+(-[\w.]+)?/, `oxfmt: =${versions.oxfmt}`);
// Update oxlint in catalog (but not oxlint-tsgolint)
content = content.replace(/oxlint: =[\d.]+(-[\w.]+)?\n/, `oxlint: =${versions.oxlint}\n`);
// Update oxlint-tsgolint in catalog
content = content.replace(
/oxlint-tsgolint: =[\d.]+(-[\w.]+)?/,
`oxlint-tsgolint: =${versions.oxlintTsgolint}`,
);
fs.writeFileSync(filePath, content);
console.log('Updated pnpm-workspace.yaml');
}
// ============ Update packages/test/package.json ============
async function updateTestPackage(vitestVersion) {
const filePath = path.join(ROOT, 'packages/test/package.json');
const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8'));
// Update all @vitest/* devDependencies
for (const dep of Object.keys(pkg.devDependencies)) {
if (dep.startsWith('@vitest/')) {
pkg.devDependencies[dep] = vitestVersion;
}
}
// Update vitest-dev devDependency
if (pkg.devDependencies['vitest-dev']) {
pkg.devDependencies['vitest-dev'] = `^${vitestVersion}`;
}
// Update @vitest/ui peerDependency if present
if (pkg.peerDependencies?.['@vitest/ui']) {
pkg.peerDependencies['@vitest/ui'] = vitestVersion;
}
fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n');
console.log('Updated packages/test/package.json');
}
// ============ Update packages/core/package.json ============
async function updateCorePackage(devtoolsVersion) {
const filePath = path.join(ROOT, 'packages/core/package.json');
const pkg = JSON.parse(fs.readFileSync(filePath, 'utf8'));
// Update @vitejs/devtools in devDependencies
if (pkg.devDependencies?.['@vitejs/devtools']) {
pkg.devDependencies['@vitejs/devtools'] = `^${devtoolsVersion}`;
}
fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n');
console.log('Updated packages/core/package.json');
}
console.log('Fetching latest versions…');
const [
vitestVersion,
tsdownVersion,
devtoolsVersion,
oxcNodeCliVersion,
oxcNodeCoreVersion,
oxfmtVersion,
oxlintVersion,
oxlintTsgolintVersion,
] = await Promise.all([
getLatestNpmVersion('vitest'),
getLatestNpmVersion('tsdown'),
getLatestNpmVersion('@vitejs/devtools'),
getLatestNpmVersion('@oxc-node/cli'),
getLatestNpmVersion('@oxc-node/core'),
getLatestNpmVersion('oxfmt'),
getLatestNpmVersion('oxlint'),
getLatestNpmVersion('oxlint-tsgolint'),
]);
console.log(`vitest: ${vitestVersion}`);
console.log(`tsdown: ${tsdownVersion}`);
console.log(`@vitejs/devtools: ${devtoolsVersion}`);
console.log(`@oxc-node/cli: ${oxcNodeCliVersion}`);
console.log(`@oxc-node/core: ${oxcNodeCoreVersion}`);
console.log(`oxfmt: ${oxfmtVersion}`);
console.log(`oxlint: ${oxlintVersion}`);
console.log(`oxlint-tsgolint: ${oxlintTsgolintVersion}`);
await updateUpstreamVersions();
await updatePnpmWorkspace({
vitest: vitestVersion,
tsdown: tsdownVersion,
oxcNodeCli: oxcNodeCliVersion,
oxcNodeCore: oxcNodeCoreVersion,
oxfmt: oxfmtVersion,
oxlint: oxlintVersion,
oxlintTsgolint: oxlintTsgolintVersion,
});
await updateTestPackage(vitestVersion);
await updateCorePackage(devtoolsVersion);
console.log('Done!');
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
permissions:
# Doing it explicitly because the default permission only includes metadata: read.
contents: read
on:
workflow_dispatch:
pull_request:
types: [opened, synchronize, labeled]
push:
branches:
- main
paths-ignore:
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: ${{ github.ref_name != 'main' }}
defaults:
run:
shell: bash
jobs:
optimize-ci:
runs-on: ubuntu-latest # or whichever runner you use for your CI
outputs:
skip: ${{ steps.check_skip.outputs.skip }}
steps:
- name: Optimize CI
id: check_skip
uses: withgraphite/graphite-ci-action@ee395f3a78254c006d11339669c6cabddf196f72
with:
graphite_token: ${{ secrets.GRAPHITE_CI_OPTIMIZER_TOKEN }}
detect-changes:
runs-on: ubuntu-latest
needs: optimize-ci
if: needs.optimize-ci.outputs.skip == 'false'
permissions:
contents: read
pull-requests: read
outputs:
code-changed: ${{ steps.filter.outputs.code }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: filter
with:
filters: |
code:
- '!**/*.md'
download-previous-rolldown-binaries:
needs: detect-changes
if: needs.detect-changes.outputs.code-changed == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/download-rolldown-binaries
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
test:
needs: detect-changes
if: needs.detect-changes.outputs.code-changed == 'true'
name: Test
strategy:
fail-fast: false
matrix:
include:
- os: namespace-profile-linux-x64-default
target: x86_64-unknown-linux-gnu
- os: windows-latest
target: x86_64-pc-windows-msvc
- os: namespace-profile-mac-default
target: aarch64-apple-darwin
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
- name: Setup Dev Drive
if: runner.os == 'Windows'
uses: samypr100/setup-dev-drive@30f0f98ae5636b2b6501e181dfb3631b9974818d # v4.0.0
with:
drive-size: 12GB
drive-format: ReFS
env-mapping: |
CARGO_HOME,{{ DEV_DRIVE }}/.cargo
RUSTUP_HOME,{{ DEV_DRIVE }}/.rustup
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
with:
save-cache: ${{ github.ref_name == 'main' }}
cache-key: test
target-dir: ${{ runner.os == 'Windows' && format('{0}/target', env.DEV_DRIVE) || '' }}
- run: rustup target add x86_64-unknown-linux-musl
if: ${{ matrix.target == 'x86_64-unknown-linux-gnu' }}
- run: cargo check --all-targets --all-features
env:
RUSTFLAGS: '-D warnings --cfg tokio_unstable' # also update .cargo/config.toml
# Test all crates/* packages. New crates are automatically included.
# Also test vite-plus-cli (lives outside crates/) to catch type sync issues.
- run: cargo test $(for d in crates/*/; do echo -n "-p $(basename $d) "; done) -p vite-plus-cli
env:
RUST_MIN_STACK: 8388608
lint:
needs: detect-changes
if: needs.detect-changes.outputs.code-changed == 'true'
name: Lint
runs-on: namespace-profile-linux-x64-default
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
with:
save-cache: ${{ github.ref_name == 'main' }}
cache-key: lint
tools: cargo-shear
components: clippy rust-docs rustfmt
- run: |
cargo shear
cargo fmt --check
# cargo clippy --all-targets --all-features -- -D warnings
# RUSTDOCFLAGS='-D warnings' cargo doc --no-deps --document-private-items
- uses: crate-ci/typos@631208b7aac2daa8b707f55e7331f9112b0e062d # v1.44.0
with:
files: .
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
- name: Install docs dependencies
run: pnpm -C docs install --frozen-lockfile
- name: Deduplicate dependencies
run: pnpm dedupe --check
run:
name: Run task
runs-on: namespace-profile-linux-x64-default
needs:
- download-previous-rolldown-binaries
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
with:
save-cache: ${{ github.ref_name == 'main' }}
cache-key: run
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: rolldown-binaries
path: ./rolldown/packages/rolldown/src
merge-multiple: true
- name: Build with upstream
uses: ./.github/actions/build-upstream
with:
target: x86_64-unknown-linux-gnu
- name: Install Global CLI vp
run: |
pnpm bootstrap-cli:ci
echo "$HOME/.vite-plus/bin" >> $GITHUB_PATH
- name: Print help for built-in commands
run: |
which vp
vp -h
vp run -h
vp lint -h
vp test -h
vp build -h
vp fmt -h
cli-e2e-test:
name: CLI E2E test
needs:
- download-previous-rolldown-binaries
strategy:
fail-fast: false
matrix:
include:
- os: namespace-profile-linux-x64-default
- os: namespace-profile-mac-default
- os: windows-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
- name: Setup Dev Drive
if: runner.os == 'Windows'
uses: samypr100/setup-dev-drive@30f0f98ae5636b2b6501e181dfb3631b9974818d # v4.0.0
with:
drive-size: 12GB
drive-format: ReFS
env-mapping: |
CARGO_HOME,{{ DEV_DRIVE }}/.cargo
RUSTUP_HOME,{{ DEV_DRIVE }}/.rustup
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
with:
save-cache: ${{ github.ref_name == 'main' }}
cache-key: cli-e2e-test
target-dir: ${{ runner.os == 'Windows' && format('{0}/target', env.DEV_DRIVE) || '' }}
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
- name: Install docs dependencies
run: pnpm -C docs install --frozen-lockfile
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: rolldown-binaries
path: ./rolldown/packages/rolldown/src
merge-multiple: true
- name: Build with upstream
uses: ./.github/actions/build-upstream
with:
target: ${{ matrix.os == 'namespace-profile-linux-x64-default' && 'x86_64-unknown-linux-gnu' || matrix.os == 'windows-latest' && 'x86_64-pc-windows-msvc' || 'aarch64-apple-darwin' }}
- name: Check TypeScript types
if: ${{ matrix.os == 'namespace-profile-linux-x64-default' }}
run: pnpm tsgo
- name: Install Global CLI vp
run: |
pnpm bootstrap-cli:ci
if [[ "$RUNNER_OS" == "Windows" ]]; then
echo "$USERPROFILE\.vite-plus\bin" >> $GITHUB_PATH
else
echo "$HOME/.vite-plus/bin" >> $GITHUB_PATH
fi
- name: Verify vp installation
run: |
which vp
vp --version
vp -h
- name: Run vp check
run: vp check
- name: Test global package install (powershell)
if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh
run: |
echo "PATH: $env:Path"
where.exe node
where.exe npm
where.exe npx
where.exe vp
vp env doctor
# Test 1: Install a JS-based CLI (typescript)
vp install -g typescript
tsc --version
where.exe tsc
# Test 2: Verify the package was installed correctly
Get-ChildItem "$env:USERPROFILE\.vite-plus\packages\typescript\"
Get-ChildItem "$env:USERPROFILE\.vite-plus\bin\"
# Test 3: Uninstall
vp uninstall -g typescript
# Test 4: Verify uninstall removed shim
Write-Host "Checking bin dir after uninstall:"
Get-ChildItem "$env:USERPROFILE\.vite-plus\bin\"
$shimPath = "$env:USERPROFILE\.vite-plus\bin\tsc.cmd"
if (Test-Path $shimPath) {
Write-Error "tsc shim file still exists at $shimPath"
exit 1
}
Write-Host "tsc shim removed successfully"
# Test 5: use session
vp env use 18
node --version
vp env doctor
vp env use --unset
node --version
- name: Test global package install (cmd)
if: ${{ matrix.os == 'windows-latest' }}
shell: cmd
run: |
echo "PATH: %PATH%"
where.exe node
where.exe npm
where.exe npx
where.exe vp
vp env use 18
node --version
vp env use --unset
node --version
vp env doctor
REM Test 1: Install a JS-based CLI (typescript)
vp install -g typescript
tsc --version
where.exe tsc
REM Test 2: Verify the package was installed correctly
dir "%USERPROFILE%\.vite-plus\packages\typescript\"
dir "%USERPROFILE%\.vite-plus\bin\"
REM Test 3: Uninstall
vp uninstall -g typescript
REM Test 4: Verify uninstall removed shim (.cmd wrapper)
echo Checking bin dir after uninstall:
dir "%USERPROFILE%\.vite-plus\bin\"
if exist "%USERPROFILE%\.vite-plus\bin\tsc.cmd" (
echo Error: tsc.cmd shim file still exists
exit /b 1
)
echo tsc.cmd shim removed successfully
REM Test 5: Verify shell script was also removed (for Git Bash)
if exist "%USERPROFILE%\.vite-plus\bin\tsc" (
echo Error: tsc shell script still exists
exit /b 1
)
echo tsc shell script removed successfully
REM Test 6: use session
vp env use 18
node --version
vp env doctor
vp env use --unset
node --version
- name: Test global package install (bash)
run: |
echo "PATH: $PATH"
ls -la ~/.vite-plus/
ls -la ~/.vite-plus/bin/
which node
which npm
which npx
which vp
vp env doctor
# Test 1: Install a JS-based CLI (typescript)
vp install -g typescript
tsc --version
which tsc
# Test 2: Verify the package was installed correctly
ls -la ~/.vite-plus/packages/typescript/
ls -la ~/.vite-plus/bin/
# Test 3: Uninstall
vp uninstall -g typescript
# Test 4: Verify uninstall removed shim
echo "Checking bin dir after uninstall:"
ls -la ~/.vite-plus/bin/
if [ -f ~/.vite-plus/bin/tsc ]; then
echo "Error: tsc shim file still exists at ~/.vite-plus/bin/tsc"
exit 1
fi
echo "tsc shim removed successfully"
# Test 5: use session
vp env use 18
node --version
vp env doctor
vp env use --unset
node --version
- name: Install Playwright browsers
run: pnpx playwright install chromium
- name: Run CLI snapshot tests
run: |
RUST_BACKTRACE=1 pnpm test
if ! git diff --exit-code; then
echo "::error::Snapshot diff detected. Run 'pnpm -F vite-plus snap-test' locally and commit the updated snap.txt files."
git diff --stat
git diff
exit 1
fi
env:
RUST_MIN_STACK: 8388608
# Upgrade tests (merged from separate job to avoid duplicate build)
- name: Test upgrade (bash)
shell: bash
run: |
# Helper to read the installed CLI version from package.json
get_cli_version() {
node -p "require(require('path').resolve(process.env.USERPROFILE || process.env.HOME, '.vite-plus', 'current', 'node_modules', 'vite-plus', 'package.json')).version"
}
# Save initial (dev build) version
INITIAL_VERSION=$(get_cli_version)
echo "Initial version: $INITIAL_VERSION"
# --check queries npm registry and prints update status
vp upgrade --check
# full upgrade: download, extract, swap
vp upgrade --force
vp --version
vp env doctor
ls -la ~/.vite-plus/
# Verify version changed after update
UPDATED_VERSION=$(get_cli_version)
echo "Updated version: $UPDATED_VERSION"
if [ "$UPDATED_VERSION" == "$INITIAL_VERSION" ]; then
echo "Error: version should have changed after upgrade (still $INITIAL_VERSION)"
exit 1
fi
# rollback to the previous version
vp upgrade --rollback
vp --version
vp env doctor
# Verify version restored after rollback
ROLLBACK_VERSION=$(get_cli_version)
echo "Rollback version: $ROLLBACK_VERSION"
if [ "$ROLLBACK_VERSION" != "$INITIAL_VERSION" ]; then
echo "Error: version should have been restored after rollback (expected $INITIAL_VERSION, got $ROLLBACK_VERSION)"
exit 1
fi
- name: Test upgrade (powershell)
if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh
run: |
Get-ChildItem "$env:USERPROFILE\.vite-plus\"
# Helper to read the installed CLI version from package.json
function Get-CliVersion {
node -p "require(require('path').resolve(process.env.USERPROFILE, '.vite-plus', 'current', 'node_modules', 'vite-plus', 'package.json')).version"
}
# Save initial (dev build) version
$initialVersion = Get-CliVersion
Write-Host "Initial version: $initialVersion"
# --check queries npm registry and prints update status
vp upgrade --check
# full upgrade: download, extract, swap
vp upgrade --force
vp --version
vp env doctor
Get-ChildItem "$env:USERPROFILE\.vite-plus\"
# Verify version changed after update
$updatedVersion = Get-CliVersion
Write-Host "Updated version: $updatedVersion"
if ($updatedVersion -eq $initialVersion) {
Write-Error "Error: version should have changed after upgrade (still $initialVersion)"
exit 1
}
# rollback to the previous version
vp upgrade --rollback
vp --version
vp env doctor
# Verify version restored after rollback
$rollbackVersion = Get-CliVersion
Write-Host "Rollback version: $rollbackVersion"
if ($rollbackVersion -ne $initialVersion) {
Write-Error "Error: version should have been restored after rollback (expected $initialVersion, got $rollbackVersion)"
exit 1
}
- name: Test upgrade (cmd)
if: ${{ matrix.os == 'windows-latest' }}
shell: cmd
run: |
REM Save initial (dev build) version
for /f "usebackq delims=" %%v in (`node -p "require(require('path').resolve(process.env.USERPROFILE, '.vite-plus', 'current', 'node_modules', 'vite-plus', 'package.json')).version"`) do set INITIAL_VERSION=%%v
echo Initial version: %INITIAL_VERSION%
REM --check queries npm registry and prints update status
vp upgrade --check
REM full upgrade: download, extract, swap
vp upgrade --force
vp --version
vp env doctor
dir "%USERPROFILE%\.vite-plus\"
REM Verify version changed after update
for /f "usebackq delims=" %%v in (`node -p "require(require('path').resolve(process.env.USERPROFILE, '.vite-plus', 'current', 'node_modules', 'vite-plus', 'package.json')).version"`) do set UPDATED_VERSION=%%v
echo Updated version: %UPDATED_VERSION%
if "%UPDATED_VERSION%"=="%INITIAL_VERSION%" (
echo Error: version should have changed after upgrade, still %INITIAL_VERSION%
exit /b 1
)
REM rollback to the previous version
vp upgrade --rollback
vp --version
vp env doctor
REM Verify version restored after rollback
for /f "usebackq delims=" %%v in (`node -p "require(require('path').resolve(process.env.USERPROFILE, '.vite-plus', 'current', 'node_modules', 'vite-plus', 'package.json')).version"`) do set ROLLBACK_VERSION=%%v
echo Rollback version: %ROLLBACK_VERSION%
if not "%ROLLBACK_VERSION%"=="%INITIAL_VERSION%" (
echo Error: version should have been restored after rollback, expected %INITIAL_VERSION%, got %ROLLBACK_VERSION%
exit /b 1
)
- name: Test implode (bash)
shell: bash
run: |
vp implode --yes
ls -la ~/
VP_HOME="${USERPROFILE:-$HOME}/.vite-plus"
if [ -d "$VP_HOME" ]; then
echo "Error: $VP_HOME still exists after implode"
exit 1
fi
# Reinstall
pnpm bootstrap-cli:ci
vp --version
- name: Test implode (powershell)
if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh
run: |
vp implode --yes
Start-Sleep -Seconds 5
dir "$env:USERPROFILE\"
if (Test-Path "$env:USERPROFILE\.vite-plus") {
Write-Error "~/.vite-plus still exists after implode"
exit 1
}
pnpm bootstrap-cli:ci
vp --version
- name: Test implode (cmd)
if: ${{ matrix.os == 'windows-latest' }}
shell: cmd
run: |
REM vp.exe renames its own parent directory; cmd.exe may report
REM "The system cannot find the path specified" on exit — ignore it.
vp implode --yes || ver >NUL
timeout /T 5 /NOBREAK >NUL
dir "%USERPROFILE%\"
if exist "%USERPROFILE%\.vite-plus" (
echo Error: .vite-plus still exists after implode
exit /b 1
)
pnpm bootstrap-cli:ci
vp --version
install-e2e-test:
name: Local CLI `vp install` E2E test
needs:
- download-previous-rolldown-binaries
runs-on: namespace-profile-linux-x64-default
# Run if: not a PR, OR PR has 'test: install-e2e' label
if: >-
github.event_name != 'pull_request' ||
contains(github.event.pull_request.labels.*.name, 'test: install-e2e')
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
with:
save-cache: ${{ github.ref_name == 'main' }}
cache-key: install-e2e-test
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: rolldown-binaries
path: ./rolldown/packages/rolldown/src
merge-multiple: true
- name: Build with upstream
uses: ./.github/actions/build-upstream
with:
target: x86_64-unknown-linux-gnu
- name: Build CLI
run: |
pnpm bootstrap-cli:ci
echo "$HOME/.vite-plus/bin" >> $GITHUB_PATH
- name: Run local CLI `vp install`
run: |
export PATH=$PWD/node_modules/.bin:$PATH
vp -h
# Test vp install on various repositories with different package managers
repos=(
# pnpm workspace
"pnpm/pnpm:pnpm"
"vitejs/vite:vite"
# yarn workspace
"napi-rs/napi-rs:napi-rs"
"toeverything/AFFiNE:AFFiNE"
# npm workspace
"npm/cli:npm"
"redhat-developer/vscode-extension-tester:vscode-extension-tester"
)
for repo_info in "${repos[@]}"; do
IFS=':' read -r repo dir_name <<< "$repo_info"
echo "Testing vp install on $repo…"
# remove the directory if it exists
if [ -d "$RUNNER_TEMP/$dir_name" ]; then
rm -rf "$RUNNER_TEMP/$dir_name"
fi
git clone --depth 1 "https://github.com/$repo.git" "$RUNNER_TEMP/$dir_name"
cd "$RUNNER_TEMP/$dir_name"
vp install
# run again to show install cache increase by time
time vp install
echo "✓ Successfully installed dependencies for $repo"
echo ""
done
done:
runs-on: ubuntu-latest
if: always()
needs:
- test
- lint
- run
- cli-e2e-test
steps:
- run: exit 1
# Thank you, next https://github.com/vercel/next.js/blob/canary/.github/workflows/build_and_test.yml#L379
if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}
================================================
FILE: .github/workflows/claude.yml
================================================
name: Claude Code
on:
issues:
types: [assigned]
jobs:
analyze:
if: github.repository == 'voidzero-dev/vite-plus' && github.event.action == 'assigned' && github.event.assignee.login == 'boshen'
runs-on: ubuntu-slim
permissions:
contents: read
issues: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 100
persist-credentials: true
- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@26ec041249acb0a944c0a47b6c0c13f05dbc5b44 # v1.0.70
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
assignee_trigger: 'boshen'
claude_args: --allowedTools "Edit,Write,Read,Glob,Grep,Bash(gh:*),Bash(cargo:*),Bash(git:*),Bash(just:*),WebFetch,TodoWrite"
prompt: |
Analyze issue #${{ github.event.issue.number }} in ${{ github.repository }} and determine if it can be fixed.
First, use `gh issue view ${{ github.event.issue.number }}` to read the issue details.
Then:
1. Search the codebase to gather relevant context (related files, existing implementations, tests)
2. Determine if the issue is fixable and estimate the complexity
Finally, post a comment on the issue with:
- A brief summary of your understanding of the issue
- Relevant files/code you found
- Whether this issue is fixable (yes/no/needs clarification)
- If the issue is unclear, ask for more context
- If fixable, provide a concrete implementation plan with specific steps
- Any potential concerns or blockers
- name: Unassign boshen
if: always()
env:
GH_TOKEN: ${{ github.token }}
run: gh issue edit ${{ github.event.issue.number }} --remove-assignee Boshen
================================================
FILE: .github/workflows/cleanup-cache.yml
================================================
name: Cleanup github runner caches on closed pull requests
on:
pull_request:
types:
- closed
jobs:
cleanup:
runs-on: ubuntu-latest
permissions:
actions: write
steps:
- name: Cleanup
run: |
echo "Fetching list of cache keys"
cacheKeysForPR=$(gh cache list --ref $BRANCH --limit 100 --json id --jq '.[].id')
## Setting this to not fail the workflow while deleting cache keys.
set +e
echo "Deleting caches…"
for cacheKey in $cacheKeysForPR
do
gh cache delete $cacheKey
done
echo "Done"
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
BRANCH: refs/pull/${{ github.event.pull_request.number }}/merge
================================================
FILE: .github/workflows/deny.yml
================================================
name: Cargo Deny
permissions: {}
on:
workflow_dispatch:
pull_request:
types: [opened, synchronize]
paths:
- 'Cargo.lock'
- 'deny.toml'
- '.github/workflows/deny.yml'
push:
branches:
- main
paths:
- 'Cargo.lock'
- 'deny.toml'
- '.github/workflows/deny.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: ${{ github.ref_name != 'main' }}
jobs:
deny:
name: Cargo Deny
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: Output rolldown hash
id: upstream-versions
run: node -e "console.log('ROLLDOWN_HASH=' + require('./packages/tools/.upstream-versions.json').rolldown.hash)" >> $GITHUB_OUTPUT
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
repository: rolldown/rolldown
path: rolldown
ref: ${{ steps.upstream-versions.outputs.ROLLDOWN_HASH }}
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
with:
restore-cache: false
# Pinned to 0.18.6+ for CVSS 4.0 support (EmbarkStudios/cargo-deny#805)
tools: cargo-deny@0.19.0
- run: cargo deny check
================================================
FILE: .github/workflows/e2e-test.yml
================================================
name: E2E Test
permissions: {}
on:
workflow_dispatch:
schedule:
# Run every day at 0:00 GMT (8:00 AM Singapore time)
- cron: '0 0 * * *'
push:
branches:
- main
paths-ignore:
- '**/*.md'
pull_request:
types: [opened, synchronize, labeled]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: ${{ github.ref_name != 'main' }}
defaults:
run:
shell: bash
jobs:
detect-changes:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
outputs:
related-files-changed: ${{ steps.filter.outputs.related-files }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: filter
with:
filters: |
related-files:
- 'packages/**/build.ts'
- .github/workflows/e2e-test.yml
- 'ecosystem-ci/*'
download-previous-rolldown-binaries:
needs: detect-changes
runs-on: ubuntu-latest
# Run if: not a PR, OR PR has 'test: e2e' label, OR PR is from deps/upstream-update branch, OR build.ts files changed
if: >-
github.event_name != 'pull_request' ||
contains(github.event.pull_request.labels.*.name, 'test: e2e') ||
github.head_ref == 'deps/upstream-update' ||
needs.detect-changes.outputs.related-files-changed == 'true'
permissions:
contents: read
packages: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/download-rolldown-binaries
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
build:
name: Build vite-plus packages (${{ matrix.os }})
runs-on: ${{ matrix.os }}
permissions:
contents: read
packages: read
needs:
- download-previous-rolldown-binaries
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
- os: windows-latest
target: x86_64-pc-windows-msvc
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
# Disable Windows Defender real-time scanning to speed up I/O-heavy builds (~30-50% faster)
- name: Disable Windows Defender
if: runner.os == 'Windows'
shell: powershell
run: Set-MpPreference -DisableRealtimeMonitoring $true
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
with:
save-cache: ${{ github.ref_name == 'main' }}
cache-key: e2e-build-${{ matrix.os }}
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: rolldown-binaries
path: ./rolldown/packages/rolldown/src
merge-multiple: true
- name: Build with upstream
uses: ./.github/actions/build-upstream
with:
target: ${{ matrix.target }}
- name: Pack packages into tgz
run: |
mkdir -p tmp/tgz
cd packages/core && pnpm pack --pack-destination ../../tmp/tgz && cd ../..
cd packages/test && pnpm pack --pack-destination ../../tmp/tgz && cd ../..
cd packages/cli && pnpm pack --pack-destination ../../tmp/tgz && cd ../..
# Copy vp binary for e2e-test job (findVpBinary expects it in target/)
cp target/${{ matrix.target }}/release/vp tmp/tgz/vp 2>/dev/null || cp target/${{ matrix.target }}/release/vp.exe tmp/tgz/vp.exe 2>/dev/null || true
cp target/${{ matrix.target }}/release/vp-shim.exe tmp/tgz/vp-shim.exe 2>/dev/null || true
ls -la tmp/tgz
- name: Upload tgz artifacts
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: vite-plus-packages-${{ matrix.os }}
path: tmp/tgz/
retention-days: 1
e2e-test:
name: ${{ matrix.project.name }} E2E test (${{ matrix.os }})
env:
# For packing manager install from github package registry
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
permissions:
contents: read
packages: read
needs:
- build
runs-on: ${{ matrix.os }}
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- windows-latest
project:
- name: vibe-dashboard
node-version: 24
command: |
npx playwright install chromium
# FIXME: Failed to load JS plugin: ./plugins/debugger.js
# vp run ready
vp fmt
vp test
vp run build
# FIXME: TypeError: Failed to fetch dynamically imported module
# - name: skeleton
# node-version: 24
# command: |
# vp run format
# vp run lint:check
# vp run check
# npx playwright install chromium
# vp run test
- name: rollipop
node-version: 22
command: |
vp run -r build
# FIXME: typescript-eslint(no-redundant-type-constituents): 'rolldownExperimental.DevEngine' is an 'error' type that acts as 'any' and overrides all other types in this union type.
vp run lint || true
# FIXME: src/bundler-pool.ts(8,8): error TS2307: Cannot find module '@rollipop/core' or its corresponding type declarations.
vp run -r typecheck || true
vp run format
vp run @rollipop/common#test
vp run @rollipop/core#test
vp run @rollipop/dev-server#test
- name: frm-stack
node-version: 24
command: |
vp run lint:check
vp run format:check
vp run typecheck
vp run @yourcompany/api#test
vp run @yourcompany/backend-core#test
- name: vue-mini
node-version: 24
command: |
# FIXME: skip format for now, will re-enable after prettier migration support
# vp run format
vp run lint
vp run type
vp run test -- --coverage
# SKIP: vite-plugin-react - vite-task config loading incompatibility
# vite-task needs to load vite.config.js for all workspace packages to build the task graph,
# but the vite-plus process starts with workspace root as cwd.
# The plugin-react-swc playgrounds use SWC plugins (e.g., @swc/plugin-emotion) which
# cannot be resolved when loading the config from workspace root.
#
# Minimal reproduction:
# git clone https://github.com/vitejs/vite-plugin-react /tmp/vite-plugin-react-test
# cd /tmp/vite-plugin-react-test && pnpm install && pnpm run build
# node packages/plugin-react-swc/playground/emotion-plugin/vite.config.js
# # Error: Cannot find module '@swc/plugin-emotion'
#
# This works when running from within the playground directory (pnpm run build)
# because pnpm's symlink structure allows resolution, but fails when loading from workspace root.
# - name: vite-plugin-react
# node-version: 22
# command: |
# vp run format
# vp run lint -- --fix
# # TODO(fengmk2): run all builds and tests after tsdown version upgrade
# vp run @vitejs/plugin-rsc#build
# vp run @vitejs/plugin-rsc#test
- name: vitepress
node-version: 24
command: |
npx playwright install chromium
vp run format
vp run build
vp test run -r __tests__/unit
vp run tests-e2e#test
VITE_TEST_BUILD=1 vp run tests-e2e#test
vp run tests-init#test
- name: tanstack-start-helloworld
node-version: 24
command: |
npx playwright install chromium
vp run test
vp run build
- name: oxlint-plugin-complexity
node-version: 22
command: |
vp run format
vp run format:check
vp run build
vp run lint
vp run test:run
npx tsc --noEmit
- name: vite-vue-vercel
node-version: 24
command: |
npx playwright install chromium
vp run test
vp run build
- name: dify
node-version: 24
directory: web
command: |
vp run type-check:tsgo
vp run build
vp run test navigation-utils.test.ts real-browser-flicker.test.tsx workflow-parallel-limit.test.tsx
- name: viteplus-ws-repro
node-version: 24
command: |
vp test run
- name: vp-config
node-version: 22
command: |
vp check
vp pack
vp test
- name: vinext
node-version: 24
command: |
vp run build
vp check --fix
vp run check
vp run test
- name: reactive-resume
node-version: 24
command: |
vp fmt
vp lint --type-aware
vp build
vp test
- name: yaak
node-version: 24
command: |
vp fmt --ignore-path .oxfmtignore
# FIXME: type-aware lint fails with "Invalid tsconfig" without full Rust/wasm bootstrap
vp lint || true
vp test
- name: npmx.dev
node-version: 24
command: |
vp fmt
vp run lint
vp run test:types
vp test --project unit
- name: vite-plus-jest-dom-repro
node-version: 24
command: |
vp test run
exclude:
# frm-stack uses Docker (testcontainers) which doesn't work the same way on Windows
- os: windows-latest
project:
name: frm-stack
# dify only runs on Linux for now
- os: windows-latest
project:
name: dify
# vinext uses workerd native deps that don't build on Windows
- os: windows-latest
project:
name: vinext
# yaak is a Tauri app with Rust/wasm deps
- os: windows-latest
project:
name: yaak
# npmx.dev is a Nuxt app, ubuntu-only for now
- os: windows-latest
project:
name: npmx.dev
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
with:
ecosystem-ci-project: ${{ matrix.project.name }}
# Disable Windows Defender real-time scanning to speed up I/O-heavy operations
- name: Disable Windows Defender
if: runner.os == 'Windows'
shell: powershell
run: Set-MpPreference -DisableRealtimeMonitoring $true
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: ${{ matrix.project.node-version }}
package-manager-cache: false
- name: Download vite-plus packages
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: vite-plus-packages-${{ matrix.os }}
path: tmp/tgz
- name: Install vp CLI
shell: bash
run: |
# Place vp binary where install-global-cli.ts expects it (target/release/)
mkdir -p target/release
cp tmp/tgz/vp target/release/vp 2>/dev/null || cp tmp/tgz/vp.exe target/release/vp.exe 2>/dev/null || true
cp tmp/tgz/vp-shim.exe target/release/vp-shim.exe 2>/dev/null || true
chmod +x target/release/vp 2>/dev/null || true
node $GITHUB_WORKSPACE/packages/tools/src/install-global-cli.ts --tgz $GITHUB_WORKSPACE/tmp/tgz/vite-plus-0.0.0.tgz
# Use USERPROFILE (native Windows path) instead of HOME (Git Bash path /c/Users/...)
# so cmd.exe and Node.js execSync can resolve binaries in PATH
echo "${USERPROFILE:-$HOME}/.vite-plus/bin" >> $GITHUB_PATH
- name: Migrate in ${{ matrix.project.name }}
working-directory: ${{ runner.temp }}/vite-plus-ecosystem-ci/${{ matrix.project.name }}${{ matrix.project.directory && format('/{0}', matrix.project.directory) || '' }}
shell: bash
run: |
node $GITHUB_WORKSPACE/ecosystem-ci/patch-project.ts ${{ matrix.project.name }}
vp install --no-frozen-lockfile
- name: Verify local tgz packages installed
working-directory: ${{ runner.temp }}/vite-plus-ecosystem-ci/${{ matrix.project.name }}${{ matrix.project.directory && format('/{0}', matrix.project.directory) || '' }}
shell: bash
run: node $GITHUB_WORKSPACE/ecosystem-ci/verify-install.ts
- name: Run vite-plus commands in ${{ matrix.project.name }}
working-directory: ${{ runner.temp }}/vite-plus-ecosystem-ci/${{ matrix.project.name }}${{ matrix.project.directory && format('/{0}', matrix.project.directory) || '' }}
run: ${{ matrix.project.command }}
notify-failure:
name: Notify on failure
runs-on: ubuntu-latest
needs: e2e-test
if: ${{ failure() && github.event_name == 'schedule' }}
permissions:
contents: read
issues: write
steps:
- name: Create or update GitHub issue on failure
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
run: |
ISSUE_TITLE="E2E Test Scheduled Run Failed"
ISSUE_LABEL="e2e-failure"
RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
# Create label if it doesn't exist
if ! gh label list --json name --jq '.[].name' | grep -q "^${ISSUE_LABEL}$"; then
CREATE_LABEL_OUTPUT=$(gh label create "$ISSUE_LABEL" --color "d73a4a" --description "E2E test scheduled run failure" 2>&1)
if [ $? -eq 0 ]; then
echo "Created label: $ISSUE_LABEL"
elif echo "$CREATE_LABEL_OUTPUT" | grep -qi "already exists"; then
echo "Label '$ISSUE_LABEL' already exists, continuing."
else
echo "Error: Failed to create label '$ISSUE_LABEL':"
echo "$CREATE_LABEL_OUTPUT" >&2
exit 1
fi
fi
# Search for existing open issue with the label
EXISTING_ISSUE=$(gh issue list --label "$ISSUE_LABEL" --state open --json number --jq '.[0].number')
if [ -z "$EXISTING_ISSUE" ]; then
# Create new issue if none exists
gh issue create \
--title "$ISSUE_TITLE" \
--label "$ISSUE_LABEL" \
--body "The scheduled E2E test run has failed.
**Failed Run:** $RUN_URL
**Time:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')
Please investigate the failure and fix any issues."
echo "Created new issue"
else
# Add comment to existing issue
gh issue comment "$EXISTING_ISSUE" \
--body "The scheduled E2E test run has failed again.
**Failed Run:** $RUN_URL
**Time:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
echo "Added comment to issue #$EXISTING_ISSUE"
fi
================================================
FILE: .github/workflows/issue-close-require.yml
================================================
name: Issue Close Require
on:
schedule:
- cron: '0 0 * * *'
jobs:
close-issues:
if: github.repository == 'voidzero-dev/vite-plus'
runs-on: ubuntu-slim
permissions:
issues: write # for actions-cool/issues-helper to update issues
pull-requests: write # for actions-cool/issues-helper to update PRs
steps:
- name: needs reproduction
uses: actions-cool/issues-helper@71b62d7da76e59ff7b193904feb6e77d4dbb2777 # v3
with:
actions: 'close-issues'
token: ${{ secrets.GITHUB_TOKEN }}
labels: 'needs reproduction'
inactive-day: 3
================================================
FILE: .github/workflows/issue-labeled.yml
================================================
name: Issue Labeled
on:
issues:
types: [labeled]
jobs:
reply-labeled:
if: github.repository == 'voidzero-dev/vite-plus'
runs-on: ubuntu-slim
permissions:
issues: write # for actions-cool/issues-helper to update issues
pull-requests: write # for actions-cool/issues-helper to update PRs
steps:
- name: contribution welcome
if: github.event.label.name == 'contribution welcome' || github.event.label.name == 'help wanted'
uses: actions-cool/issues-helper@71b62d7da76e59ff7b193904feb6e77d4dbb2777 # v3
with:
actions: 'remove-labels'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: 'pending triage, needs reproduction'
- name: needs reproduction
if: github.event.label.name == 'needs reproduction'
uses: actions-cool/issues-helper@71b62d7da76e59ff7b193904feb6e77d4dbb2777 # v3
with:
actions: 'create-comment, remove-labels'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: 'pending triage'
body: |
Hello @${{ github.event.issue.user.login }} 👋
Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using a GitHub repository. This helps us understand and resolve your issue much faster.
**A good reproduction should be:**
- **Minimal** – include only the code necessary to demonstrate the issue
- **Complete** – contain everything needed to run and observe the problem
- **Reproducible** – consistently show the issue with clear steps
If no reproduction is provided, issues labeled `needs reproduction` will be closed after 3 days of inactivity.
For more context on why this is required, please read: https://antfu.me/posts/why-reproductions-are-required
================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on:
workflow_dispatch:
inputs:
npm_tag:
description: 'npm tag for publish'
required: true
default: 'latest'
type: choice
options:
- latest
- alpha
version:
description: 'Override version (leave empty to auto-compute). Use when retrying a failed publish.'
required: false
default: ''
type: string
permissions: {}
env:
RELEASE_BUILD: 'true'
DEBUG: 'napi:*'
NPM_TAG: ${{ inputs.npm_tag }}
jobs:
prepare:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0
fetch-tags: true
- uses: ./.github/actions/set-snapshot-version
if: ${{ inputs.version == '' }}
id: computed
with:
npm_tag: ${{ inputs.npm_tag }}
- name: Set final version
id: version
run: echo "version=${{ inputs.version || steps.computed.outputs.version }}" >> $GITHUB_OUTPUT
build-rust:
runs-on: ${{ matrix.settings.os }}
needs: prepare
permissions:
contents: read
env:
VERSION: ${{ needs.prepare.outputs.version }}
strategy:
fail-fast: false
matrix:
settings:
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-apple-darwin
os: macos-latest
- target: aarch64-unknown-linux-gnu
os: ubuntu-latest
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
- target: x86_64-pc-windows-msvc
os: windows-latest
- target: aarch64-pc-windows-msvc
os: windows-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.2
with:
save-cache: ${{ github.ref_name == 'main' }}
cache-key: release
- name: Rustup Adds Target
run: rustup target add ${{ matrix.settings.target }}
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
- name: Set binding version
shell: bash
run: |
pnpm exec tool replace-file-content packages/cli/binding/Cargo.toml 'version = "0.0.0"' 'version = "${{ env.VERSION }}"'
pnpm exec tool replace-file-content crates/vite_global_cli/Cargo.toml 'version = "0.0.0"' 'version = "${{ env.VERSION }}"'
cat crates/vite_global_cli/Cargo.toml
- name: Verify version replacement
shell: bash
run: |
if grep -q 'version = "0.0.0"' crates/vite_global_cli/Cargo.toml; then
echo "ERROR: Version replacement failed for crates/vite_global_cli/Cargo.toml"
head -5 crates/vite_global_cli/Cargo.toml
exit 1
fi
if grep -q 'version = "0.0.0"' packages/cli/binding/Cargo.toml; then
echo "ERROR: Version replacement failed for packages/cli/binding/Cargo.toml"
head -5 packages/cli/binding/Cargo.toml
exit 1
fi
echo "Version replacement verified successfully"
- name: Build
uses: ./.github/actions/build-upstream
with:
target: ${{ matrix.settings.target }}
- name: Upload Vite+ native artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: vite-plus-native-${{ matrix.settings.target }}
path: ./packages/cli/binding/*.node
if-no-files-found: error
- name: Upload Rust CLI binary artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: vite-global-cli-${{ matrix.settings.target }}
path: |
./target/${{ matrix.settings.target }}/release/vp
./target/${{ matrix.settings.target }}/release/vp.exe
./target/${{ matrix.settings.target }}/release/vp-shim.exe
if-no-files-found: error
- name: Remove .node files before upload dist
if: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' }}
run: |
rm ./packages/core/dist/**/*.node
- name: Upload core dist
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' }}
with:
name: core
path: ./packages/core/dist
if-no-files-found: error
- name: Upload cli dist
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' }}
with:
name: cli
path: ./packages/cli/dist
if-no-files-found: error
- name: Upload cli skills (docs for agent integration)
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' }}
with:
name: cli-skills
path: ./packages/cli/skills
if-no-files-found: error
Release:
runs-on: ubuntu-latest
needs: [prepare, build-rust]
permissions:
contents: write
packages: write
id-token: write # Required for OIDC
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
- uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: .node-version
package-manager-cache: false
registry-url: 'https://registry.npmjs.org'
cache: 'pnpm'
- name: Install dependencies
run: pnpm install
- name: Download cli dist
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
path: packages/cli/dist
pattern: cli
merge-multiple: true
- name: Download cli skills
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
path: packages/cli/skills
pattern: cli-skills
merge-multiple: true
- name: Download cli binding
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
path: packages/cli/artifacts
pattern: vite-plus-native-*
- name: Download core dist
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
path: packages/core/dist
pattern: core
merge-multiple: true
- uses: ./.github/actions/download-rolldown-binaries
with:
github-token: ${{ github.token }}
target: x86_64-unknown-linux-gnu
upload: 'false'
- name: Download Rust CLI binaries
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
path: rust-cli-artifacts
pattern: vite-global-cli-*
- name: Move Rust CLI binaries to target directories
run: |
# Move each artifact's binary to the correct target directory
for artifact_dir in rust-cli-artifacts/vite-global-cli-*/; do
if [ -d "$artifact_dir" ]; then
# Extract target name from directory (e.g., vite-global-cli-x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
dir_name=$(basename "$artifact_dir")
target_name=${dir_name#vite-global-cli-}
# Create target directory and copy binary
mkdir -p "target/${target_name}/release"
cp -r "$artifact_dir"* "target/${target_name}/release/"
fi
done
# Show what we have (fail if no binaries found)
vp_files=$(find target -name "vp*" -type f 2>/dev/null || echo "")
if [ -z "$vp_files" ]; then
echo "Error: No vp binaries found in target directory"
echo "Artifact contents:"
find rust-cli-artifacts -type f || true
exit 1
fi
echo "Found binaries:"
echo "$vp_files"
- name: Set npm packages version
run: |
sed -i 's/"version": "0.0.0"/"version": "${{ env.VERSION }}"/' packages/core/package.json
sed -i 's/"version": "0.0.0"/"version": "${{ env.VERSION }}"/' packages/test/package.json
sed -i 's/"version": "0.0.0"/"version": "${{ env.VERSION }}"/' packages/cli/package.json
- name: Build test
run: pnpm --filter=@voidzero-dev/vite-plus-test build
- name: 'Setup npm'
run: |
npm install -g npm@latest
- name: Publish native addons
run: |
node ./packages/cli/publish-native-addons.ts
- name: Publish
run: |
pnpm publish --filter=./packages/core --tag ${{ inputs.npm_tag }} --access public --no-git-checks
pnpm publish --filter=./packages/test --tag ${{ inputs.npm_tag }} --access public --no-git-checks
pnpm publish --filter=./packages/cli --tag ${{ inputs.npm_tag }} --access public --no-git-checks
- name: Create release body
run: |
if [[ "${{ inputs.npm_tag }}" == "latest" ]]; then
INSTALL_BASH="curl -fsSL https://vite.plus | bash"
INSTALL_PS1="irm https://vite.plus/ps1 | iex"
else
INSTALL_BASH="curl -fsSL https://vite.plus | VITE_PLUS_VERSION=${{ env.VERSION }} bash"
INSTALL_PS1="\\\$env:VITE_PLUS_VERSION=\\\"${{ env.VERSION }}\\\"; irm https://vite.plus/ps1 | iex"
fi
cat > ./RELEASE_BODY.md <<EOF
## vite-plus v${{ env.VERSION }}
### Published Packages
- \`@voidzero-dev/vite-plus-core@${{ env.VERSION }}\`
- \`@voidzero-dev/vite-plus-test@${{ env.VERSION }}\`
- \`vite-plus@${{ env.VERSION }}\`
### Installation
**macOS/Linux:**
\`\`\`bash
${INSTALL_BASH}
\`\`\`
**Windows:**
\`\`\`powershell
${INSTALL_PS1}
\`\`\`
View the full commit: https://github.com/${{ github.repository }}/commit/${{ github.sha }}
EOF
- name: Create GitHub Release
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
id: release
with:
body_path: ./RELEASE_BODY.md
draft: false
make_latest: ${{ inputs.npm_tag == 'latest' }}
prerelease: ${{ inputs.npm_tag == 'alpha' }}
name: vite-plus v${{ env.VERSION }}
tag_name: v${{ env.VERSION }}
target_commitish: ${{ github.sha }}
- name: Send Discord notification
if: ${{ inputs.npm_tag == 'latest' }}
uses: tsickert/discord-webhook@b217a69502f52803de774ded2b1ab7c282e99645 # v7.0.0
with:
webhook-url: ${{ secrets.DISCORD_RELEASES_WEBHOOK_URL }}
embed-title: vite-plus v${{ env.VERSION }}
embed-description: |
A new release is available!
**Published Packages:**
• @voidzero-dev/vite-plus-core@${{ env.VERSION }}
• @voidzero-dev/vite-plus-test@${{ env.VERSION }}
• vite-plus@${{ env.VERSION }}
**Install:**
• macOS/Linux: `curl -fsSL https://vite.plus | bash`
• Windows: `irm https://vite.plus/ps1 | iex`
embed-url: https://github.com/${{ github.repository }}/releases/tag/v${{ env.VERSION }}
================================================
FILE: .github/workflows/test-standalone-install.yml
================================================
name: Test Standalone Install Scripts
permissions: {}
on:
workflow_dispatch:
pull_request:
paths:
- 'packages/cli/install.sh'
- 'packages/cli/install.ps1'
- '.github/workflows/test-standalone-install.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
defaults:
run:
shell: bash
env:
VITE_PLUS_VERSION: alpha
jobs:
test-install-sh:
name: Test install.sh (${{ matrix.name }})
runs-on: ${{ matrix.os }}
permissions:
contents: read
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
name: Linux x64 glibc
- os: macos-15-intel
name: macOS x64
- os: macos-latest
name: macOS ARM64
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run install.sh
run: cat packages/cli/install.sh | bash
- name: Verify installation
working-directory: ${{ runner.temp }}
run: |
# Source shell config to get PATH updated
if [ -f ~/.zshenv ]; then
# non-interactive shells use zshenv
source ~/.zshenv
elif [ -f ~/.zshrc ]; then
# interactive shells use zshrc
source ~/.zshrc
elif [ -f ~/.bash_profile ]; then
# non-interactive shells use bash_profile
source ~/.bash_profile
elif [ -f ~/.bashrc ]; then
# interactive shells use bashrc
source ~/.bashrc
else
export PATH="$HOME/.vite-plus/bin:$PATH"
fi
echo "PATH: $PATH"
ls -al ~/
vp --version
vp --help
# test create command
vp create vite --no-interactive --no-agent -- hello --no-interactive -t vanilla
cd hello && vp run build && vp --version
- name: Set PATH
shell: bash
run: |
echo "$HOME/.vite-plus/bin" >> $GITHUB_PATH
- name: Verify bin setup
run: |
# Verify bin directory was created by vp env --setup
BIN_PATH="$HOME/.vite-plus/bin"
ls -al "$BIN_PATH"
if [ ! -d "$BIN_PATH" ]; then
echo "Error: Bin directory not found: $BIN_PATH"
exit 1
fi
# Verify shim executables exist
for shim in node npm npx; do
if [ ! -f "$BIN_PATH/$shim" ]; then
echo "Error: Shim not found: $BIN_PATH/$shim"
exit 1
fi
echo "Found shim: $BIN_PATH/$shim"
done
# Verify vp env doctor works
vp env doctor
vp env run --node 24 -- node -p "process.versions"
which node
which npm
which npx
which vp
- name: Verify upgrade
run: |
# --check queries npm registry and prints update status
vp upgrade --check
vp upgrade 0.0.0-gbe8891a5.20260227-1615
vp --version
# rollback to the previous version (should succeed after a real update)
vp upgrade --rollback
vp --version
test-install-sh-readonly-config:
name: Test install.sh (readonly shell config)
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Make shell config files read-only
run: |
# Simulate Nix-managed or read-only shell configs
touch ~/.bashrc ~/.bash_profile ~/.profile
chmod 444 ~/.bashrc ~/.bash_profile ~/.profile
- name: Run install.sh
run: |
output=$(cat packages/cli/install.sh | bash 2>&1) || {
echo "$output"
echo "Install script exited with non-zero status"
exit 1
}
echo "$output"
# Verify installation succeeds (not a fatal error)
echo "$output" | grep -q "successfully installed"
# Verify fallback message shows binary location
echo "$output" | grep -q "vp was installed to:"
# Verify fallback message shows manual instructions
echo "$output" | grep -q "Or run vp directly:"
# Verify the permission warning was shown
echo "$output" | grep -qi "permission denied"
- name: Verify vp works via direct path
run: |
~/.vite-plus/bin/vp --version
test-install-sh-arm64:
name: Test install.sh (Linux ARM64 glibc via QEMU)
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Set up QEMU
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
with:
platforms: arm64
- name: Run install.sh in ARM64 container
run: |
docker run --rm --platform linux/arm64 \
-v "${{ github.workspace }}:/workspace" \
-e VITE_PLUS_VERSION=alpha \
ubuntu:20.04 bash -c "
ls -al ~/
apt-get update && apt-get install -y curl ca-certificates
cat /workspace/packages/cli/install.sh | bash
if [ -f ~/.profile ]; then
source ~/.profile
elif [ -f ~/.bashrc ]; then
source ~/.bashrc
else
export PATH="$HOME/.vite-plus/bin:$PATH"
fi
vp --version
vp --help
vp dlx print-current-version
# Verify bin setup
BIN_PATH=\"\$HOME/.vite-plus/bin\"
if [ ! -d \"\$BIN_PATH\" ]; then
echo \"Error: Bin directory not found: \$BIN_PATH\"
exit 1
fi
for shim in node npm npx; do
if [ ! -f \"\$BIN_PATH/\$shim\" ]; then
echo \"Error: Shim not found: \$BIN_PATH/\$shim\"
exit 1
fi
echo \"Found shim: \$BIN_PATH/\$shim\"
done
vp env doctor
export VITE_LOG=trace
vp env run --node 24 -- node -p \"process.versions\"
# Verify upgrade
vp upgrade --check
vp upgrade 0.0.0-gbe8891a5.20260227-1615
vp --version
vp upgrade --rollback
vp --version
# FIXME: qemu: uncaught target signal 11 (Segmentation fault) - core dumped
# vp create vite --no-interactive --no-agent -- hello --no-interactive -t vanilla
# cd hello && vp run build
"
test-install-ps1-v5:
name: Test install.ps1 (Windows x64, PowerShell 5.1)
runs-on: windows-latest
permissions:
contents: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Assert PowerShell 5.x
shell: powershell
run: |
Write-Host "PowerShell version: $($PSVersionTable.PSVersion)"
if ($PSVersionTable.PSVersion.Major -ne 5) {
Write-Error "Expected PowerShell 5.x but got $($PSVersionTable.PSVersion)"
exit 1
}
- name: Run install.ps1
shell: powershell
run: |
& ./packages/cli/install.ps1
- name: Run install.ps1 via irm simulation (catches BOM issues)
shell: powershell
run: |
$ErrorActionPreference = "Stop"
Get-Content ./packages/cli/install.ps1 -Raw | Invoke-Expression
- name: Set PATH
shell: bash
run: |
echo "$USERPROFILE\.vite-plus\bin" >> $GITHUB_PATH
- name: Verify installation
shell: powershell
working-directory: ${{ runner.temp }}
run: |
Write-Host "PATH: $env:Path"
vp --version
vp --help
vp create vite --no-interactive --no-agent -- hello --no-interactive -t vanilla
cd hello
vp run build
vp --version
- name: Verify bin setup
shell: powershell
run: |
$binPath = "$env:USERPROFILE\.vite-plus\bin"
Get-ChildItem -Force $binPath
if (-not (Test-Path $binPath)) {
Write-Error "Bin directory not found: $binPath"
exit 1
}
$expectedShims = @("node.exe", "npm.exe", "npx.exe")
foreach ($shim in $expectedShims) {
$shimFile = Join-Path $binPath $shim
if (-not (Test-Path $shimFile)) {
Write-Error "Shim not found: $shimFile"
exit 1
}
Write-Host "Found shim: $shimFile"
}
where.exe node
where.exe npm
where.exe npx
where.exe vp
$env:Path = "$env:USERPROFILE\.vite-plus\bin;$env:Path"
vp env doctor
vp env run --node 24 -- node -p "process.versions"
- name: Verify upgrade
shell: powershell
run: |
vp upgrade --check
vp upgrade 0.0.0-gbe8891a5.20260227-1615
vp --version
vp upgrade --rollback
vp --version
test-install-ps1-arm64:
name: Test install.ps1 (Windows ARM64)
runs-on: windows-11-arm
permissions:
contents: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run install.ps1
shell: pwsh
run: |
& ./packages/cli/install.ps1
- name: Set PATH
shell: bash
run: |
echo "$USERPROFILE\.vite-plus\bin" >> $GITHUB_PATH
- name: Verify installation
shell: pwsh
working-directory: ${{ runner.temp }}
run: |
Write-Host "PATH: $env:Path"
vp --version
vp --help
vp create vite --no-interactive --no-agent -- hello --no-interactive -t vanilla
cd hello
vp run build
vp --version
- name: Verify bin setup
shell: pwsh
run: |
$binPath = "$env:USERPROFILE\.vite-plus\bin"
Get-ChildItem -Force $binPath
if (-not (Test-Path $binPath)) {
Write-Error "Bin directory not found: $binPath"
exit 1
}
$expectedShims = @("node.exe", "npm.exe", "npx.exe")
foreach ($shim in $expectedShims) {
$shimFile = Join-Path $binPath $shim
if (-not (Test-Path $shimFile)) {
Write-Error "Shim not found: $shimFile"
exit 1
}
Write-Host "Found shim: $shimFile"
}
where.exe node
where.exe npm
where.exe npx
where.exe vp
$env:Path = "$env:USERPROFILE\.vite-plus\bin;$env:Path"
vp env doctor
vp env run --node 24 -- node -p "process.versions"
- name: Verify upgrade
shell: pwsh
run: |
vp upgrade --check
vp upgrade 0.0.0-gbe8891a5.20260227-1615
vp --version
vp upgrade --rollback
vp --version
test-install-ps1:
name: Test install.ps1 (Windows x64)
runs-on: windows-latest
permissions:
contents: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run install.ps1
shell: pwsh
run: |
& ./packages/cli/install.ps1
- name: Set PATH
shell: bash
run: |
echo "$USERPROFILE\.vite-plus\bin" >> $GITHUB_PATH
- name: Verify upgrade
shell: pwsh
run: |
# --check queries npm registry and prints update status
vp upgrade --check
vp upgrade 0.0.0-gbe8891a5.20260227-1615
vp --version
# rollback to the previous version (should succeed after a real update)
vp upgrade --rollback
vp --version
- name: Verify installation on powershell
shell: pwsh
working-directory: ${{ runner.temp }}
run: |
# Print PATH from environment
echo "PATH: $env:Path"
vp --version
vp --help
# $env:VITE_LOG = "trace"
# test create command
vp create vite --no-interactive --no-agent -- hello --no-interactive -t vanilla
cd hello && vp run build && vp --version
- name: Verify bin setup on powershell
shell: pwsh
run: |
# Verify bin directory was created by vp env --setup
$binPath = "$env:USERPROFILE\.vite-plus\bin"
Get-ChildItem -Force $binPath
if (-not (Test-Path $binPath)) {
Write-Error "Bin directory not found: $binPath"
exit 1
}
# Verify shim executables exist (trampoline .exe files on Windows)
$expectedShims = @("node.exe", "npm.exe", "npx.exe")
foreach ($shim in $expectedShims) {
$shimFile = Join-Path $binPath $shim
if (-not (Test-Path $shimFile)) {
Write-Error "Shim not found: $shimFile"
exit 1
}
Write-Host "Found shim: $shimFile"
}
where.exe node
where.exe npm
where.exe npx
where.exe vp
# Verify vp env doctor works
$env:Path = "$env:USERPROFILE\.vite-plus\bin;$env:Path"
vp env doctor
vp env run --node 24 -- node -p "process.versions"
- name: Verify installation on cmd
shell: cmd
working-directory: ${{ runner.temp }}
run: |
echo PATH: %PATH%
dir "%USERPROFILE%\.vite-plus"
dir "%USERPROFILE%\.vite-plus\bin"
REM test create command
vp create vite --no-interactive --no-agent -- hello-cmd --no-interactive -t vanilla
cd hello-cmd && vp run build && vp --version
- name: Verify bin setup on cmd
shell: cmd
run: |
REM Verify bin directory was created by vp env --setup
set "BIN_PATH=%USERPROFILE%\.vite-plus\bin"
dir "%BIN_PATH%"
REM Verify shim executables exist (Windows uses trampoline .exe files)
for %%s in (node.exe npm.exe npx.exe vp.exe) do (
if not exist "%BIN_PATH%\%%s" (
echo Error: Shim not found: %BIN_PATH%\%%s
exit /b 1
)
echo Found shim: %BIN_PATH%\%%s
)
where node
where npm
where npx
where vp
REM Verify vp env doctor works
vp env doctor
vp env run --node 24 -- node -p "process.versions"
- name: Verify installation on bash
shell: bash
working-directory: ${{ runner.temp }}
run: |
echo "PATH: $PATH"
ls -al ~/.vite-plus
ls -al ~/.vite-plus/bin
vp --version
vp --help
# test create command
vp create vite --no-interactive --no-agent -- hello-bash --no-interactive -t vanilla
cd hello-bash && vp run build && vp --version
- name: Verify bin setup on bash
shell: bash
run: |
# Verify bin directory was created by vp env --setup
BIN_PATH="$HOME/.vite-plus/bin"
ls -al "$BIN_PATH"
if [ ! -d "$BIN_PATH" ]; then
echo "Error: Bin directory not found: $BIN_PATH"
exit 1
fi
# Verify trampoline .exe files exist
for shim in node.exe npm.exe npx.exe vp.exe; do
if [ ! -f "$BIN_PATH/$shim" ]; then
echo "Error: Trampoline shim not found: $BIN_PATH/$shim"
exit 1
fi
echo "Found trampoline shim: $BIN_PATH/$shim"
done
# Verify vp env doctor works
vp env doctor
vp env run --node 24 -- node -p "process.versions"
which node
which npm
which npx
which vp
================================================
FILE: .github/workflows/upgrade-deps.yml
================================================
name: Upgrade Upstream Dependencies
on:
schedule:
- cron: '0 0 * * *' # Daily at midnight UTC
workflow_dispatch: # Manual trigger
permissions: {}
jobs:
upgrade:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
actions: read
id-token: write
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/clone
- uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0
with:
save-cache: ${{ github.ref_name == 'main' }}
cache-key: upgrade-deps
tools: just,cargo-shear
- uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4
- name: Rustup Adds Target
run: rustup target add x86_64-unknown-linux-gnu
- name: Rustup Adds Target for rolldown
working-directory: rolldown
run: rustup target add x86_64-unknown-linux-gnu
- name: Upgrade dependencies
id: upgrade
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: node .github/scripts/upgrade-deps.mjs
- name: Sync remote and build
id: build
continue-on-error: true # Create PR even if build fails
run: |
pnpm install --no-frozen-lockfile
pnpm tool sync-remote
pnpm install --no-frozen-lockfile
- name: Build
uses: ./.github/actions/build-upstream
id: build-upstream
continue-on-error: true
with:
target: x86_64-unknown-linux-gnu
print-after-build: 'true'
env:
RELEASE_BUILD: 'true'
- uses: anthropics/claude-code-action@eb99fb38f09dedf69f423f1315d6c0272ace56a0 # Claude Code to 2.1.72
env:
RELEASE_BUILD: 'true'
with:
claude_code_oauth_token: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
show_full_output: 'true'
prompt: |
Check if the build-upstream steps failed and fix them.
### Background
- The build-upstream steps are at ./.github/actions/build-upstream/action.yml
- The deps upgrade script is at ./.github/scripts/upgrade-deps.mjs
### Instructions
- We are using `pnpm` as the package manager
- We are aiming to upgrade all dependencies to the latest versions in this workflow, so don't downgrade any dependencies.
- Compare tsdown CLI options with `vp pack` and sync any new or removed options. Follow the instructions in `.claude/skills/sync-tsdown-cli/SKILL.md`.
- Check `.claude/agents/cargo-workspace-merger.md` if rolldown hash is changed.
- Run the steps in `build-upstream` action.yml after your fixing. If no errors are found, you can safe to exit.
- Install global CLI after the build-upstream steps are successful, by running the following commands:
- `pnpm bootstrap-cli:ci`
- `echo "$HOME/.vite-plus/bin" >> $GITHUB_PATH`
- Run `pnpm run lint` to check if there are any issues after the build, if has, deep investigate it and fix it. You need to run `just build` before you can run `pnpm run lint`.
- Run `pnpm run test` after `just build` to ensure all tests are successful.
- The snapshot tests in `pnpm run test` are always successful, you need to check the snapshot diffs in git to see if there is anything wrong after our deps upgrade.
- If deps in our `Cargo.toml` need to be upgraded, you can refer to the `./.claude/agents/cargo-workspace-merger.md`
- If `Cargo.toml` has been modified, you need to run `cargo shear` to ensure there is nothing wrong with our dependencies.
- Run `cargo check --all-targets --all-features` to ensure everything works fine if any Rust related codes are modified.
- Run the following commands to ensure everything works fine:
vp -h
vp run -h
vp lint -h
vp test -h
vp build -h
vp fmt -h
vp pack -h
- Your final step is to run `just build` to ensure all builds are successful.
Help me fix the errors in `build-upstream` steps if exists.
No need to commit changes after your fixing we have a following step to commit all file changes.
claude_args: |
--model opus --allowedTools "Bash,Edit,Replace,NotebookEditCell"
additional_permissions: |
actions: read
- name: Update lockfile
run: |
pnpm install --no-frozen-lockfile
pnpm dedupe
- name: Checkout binding files
run: |
git checkout packages/cli/binding/index.cjs
git checkout packages/cli/binding/index.d.cts
- name: Format code
run: pnpm fmt
- name: Close and delete previous PR
env:
GH_TOKEN: ${{ secrets.AUTO_UPDATE_BRANCH_TOKEN }}
run: |
# Find PR with the deps/upstream-update branch
PR_NUMBER=$(gh pr list --head deps/upstream-update --json number --jq '.[0].number')
if [ -n "$PR_NUMBER" ]; then
echo "Found existing PR #$PR_NUMBER, closing and deleting branch…"
gh pr close "$PR_NUMBER" --delete-branch
else
echo "No existing PR found with branch deps/upstream-update"
fi
- name: Create/Update PR
uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11
with:
base: main
branch: deps/upstream-update
title: 'feat(deps): upgrade upstream dependencies'
sign-commits: true
token: ${{ secrets.AUTO_UPDATE_BRANCH_TOKEN }}
branch-token: ${{ secrets.GITHUB_TOKEN }}
body: |
Automated daily upgrade of upstream dependencies:
- rolldown (latest tag)
- vite (latest tag)
- vitest (latest npm version)
- tsdown (latest npm version)
Build status: ${{ steps.build.outcome }}
commit-message: 'feat(deps): upgrade upstream dependencies'
================================================
FILE: .github/workflows/zizmor.yml
================================================
name: Zizmor
permissions: {}
on:
workflow_dispatch:
pull_request:
types: [opened, synchronize]
paths:
- '.github/workflows/**'
push:
branches:
- main
- 'renovate/**'
paths:
- '.github/workflows/**'
jobs:
zizmor:
name: zizmor
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
persist-credentials: false
submodules: true
- uses: taiki-e/install-action@ae97ff9daf1cd2e216671a047d80ff48461e30bb # v2.49.1
with:
tool: zizmor
- name: Run zizmor
run: zizmor --format sarif . > results.sarif
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3
with:
sarif_file: results.sarif
category: zizmor
================================================
FILE: .gitignore
================================================
/target
node_modules
dist
.claude/settings.local.json
*.tsbuildinfo
.DS_Store
rolldown
rolldown-vite
vite
/crates/vite_global_cli/vp
================================================
FILE: .husky/pre-commit
================================================
pnpm lint-staged
================================================
FILE: .node-version
================================================
22.18.0
================================================
FILE: .rustfmt.toml
================================================
style_edition = "2024"
# Make Rust more readable given most people have wide screens nowadays.
# This is also the setting used by [rustc](https://github.com/rust-lang/rust/blob/master/rustfmt.toml)
use_small_heuristics = "Max"
# Use field initialize shorthand if possible
use_field_init_shorthand = true
reorder_modules = true
# All unstable features that we wish for
# unstable_features = true
# Provide a cleaner impl order
reorder_impl_items = true
# Provide a cleaner import sort order
group_imports = "StdExternalCrate"
# Group "use" statements by crate
imports_granularity = "Crate"
================================================
FILE: .typos.toml
================================================
[default.extend-words]
ratatui = "ratatui"
PUNICODE = "PUNICODE"
Jod = "Jod" # Node.js v22 LTS codename
[files]
extend-exclude = [
"**/snap-tests/**/snap.txt",
"crates/fspy_detours_sys/detours",
"crates/fspy_detours_sys/src/generated_bindings.rs",
"packages/cli/src/oxfmt-config.ts",
]
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": ["VoidZero.vite-plus-extension-pack"]
}
================================================
FILE: .vscode/settings.json
================================================
{
"editor.formatOnSave": true,
"files.insertFinalNewline": true,
"files.trimFinalNewlines": true,
"[javascript]": {
"editor.defaultFormatter": "oxc.oxc-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "oxc.oxc-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "oxc.oxc-vscode"
},
"[json]": {
"editor.defaultFormatter": "oxc.oxc-vscode"
},
"typescript.preferences.importModuleSpecifierEnding": "js",
"typescript.reportStyleChecksAsWarnings": false,
"typescript.updateImportsOnFileMove.enabled": "always",
"typescript.experimental.useTsgo": true
}
================================================
FILE: CLAUDE.md
================================================
# Vite-Plus
A monorepo task runner (like nx/turbo) with intelligent caching and dependency resolution.
## Core Concept
**Task Execution**: Run tasks across monorepo packages with automatic dependency ordering.
```bash
# Built-in commands
vp build # Run Vite build (dedicated command)
vp test # Run Vitest (dedicated command)
vp lint # Run oxlint (dedicated command)
# Run tasks across packages (explicit mode)
vp run build -r # recursive with topological ordering
vp run app#build web#build # specific packages
vp run build -r --no-topological # recursive without implicit deps
# Run task in current package (implicit mode - for non-built-in tasks)
vp run dev # runs dev script from package.json
```
## Key Architecture
- **Entry**: `crates/vite_task/src/lib.rs` - CLI parsing and main logic
- **Workspace**: `crates/vite_task/src/config/workspace.rs` - Loads packages, creates task graph
- **Task Graph**: `crates/vite_task/src/config/task_graph_builder.rs` - Builds dependency graph
- **Execution**: `crates/vite_task/src/schedule.rs` - Executes tasks in dependency order
## Task Dependencies
1. **Explicit** (always applied): Defined in `vite-task.json`
```json
{
"tasks": {
"test": {
"command": "jest",
"dependsOn": ["build", "lint"]
}
}
}
```
2. **Implicit** (when `--topological`): Based on package.json dependencies
- If A depends on B, then A#build depends on B#build automatically
## Key Features
- **Topological Flag**: Controls implicit dependencies from package relationships
- Default: ON for `--recursive`, OFF otherwise
- Toggle with `--no-topological` to disable
- **Boolean Flags**: All support `--no-*` pattern for explicit disable
- Example: `--recursive` vs `--no-recursive`
- Conflicts handled by clap
- If you want to add a new boolean flag, follow this pattern
## Path Type System
- **Type Safety**: All paths use typed `vite_path` instead of `std::path` for better safety
- **Absolute Paths**: `vite_path::AbsolutePath` / `AbsolutePathBuf`
- **Relative Paths**: `vite_path::RelativePath` / `RelativePathBuf`
- **Usage Guidelines**:
- Use methods such as `strip_prefix`/`join` provided in `vite_path` for path operations instead of converting to std paths
- Only convert to std paths when interfacing with std library functions, and this should be implicit in most cases thanks to `AsRef<Path>` implementations
- Add necessary methods in `vite_path` instead of falling back to std path types
- **Converting from std paths** (e.g., `TempDir::path()`):
```rust
let temp_path = AbsolutePathBuf::new(temp_dir.path().to_path_buf()).unwrap();
```
- **Function signatures**: Prefer `&AbsolutePath` over `&std::path::Path`
- **Passing to std functions**: `AbsolutePath` implements `AsRef<Path>`, use `.as_path()` when explicit `&Path` is required
## Clippy Rules
All **new** Rust code must follow the custom clippy rules defined in `.clippy.toml` (disallowed types, macros, and methods). Existing code may not fully comply due to historical reasons.
## CLI Output
All user-facing output must go through shared output modules instead of raw print calls.
- **Rust**: Use `vite_shared::output` functions (`info`, `warn`, `error`, `note`, `success`) — never raw `println!`/`eprintln!` (enforced by clippy `disallowed-macros`)
- **TypeScript**: Use `packages/cli/src/utils/terminal.ts` functions (`infoMsg`, `warnMsg`, `errorMsg`, `noteMsg`, `log`) — never raw `console.log`/`console.error`
## Git Workflow
- Run `vp check --fix` before committing to format and lint code
## Quick Reference
- **Compound Commands**: `"build": "tsc && rollup"` splits into subtasks
- **Task Format**: `package#task` (e.g., `app#build`)
- **Path Types**: Use `vite_path` types instead of `std::path` types for type safety
- **Tests**: Run `cargo test -p vite_task` to verify changes
- **Debug**: Use `--debug` to see cache operations
## Tests
- Run `cargo test` to execute all tests
- You never need to run `pnpm install` in the test fixtures dir, vite-plus should able to load and parse the workspace without `pnpm install`.
## Build
- Run `pnpm bootstrap-cli` from the project root to build all packages and install the global CLI
- This builds all `@voidzero-dev/*` and `vite-plus` packages
- Compiles the Rust NAPI bindings and the `vp` Rust binary
- Installs the CLI globally to `~/.vite-plus/`
## Snap Tests
Snap tests are located in `packages/cli/snap-tests/` (local CLI) and `packages/cli/snap-tests-global/` (global CLI). Each test case is a directory containing:
- `package.json` - Package configuration for the test
- `steps.json` - Commands to run and environment variables
- `src/` - Source files for the test
- `snap.txt` - Expected output (generated/updated by running the test)
```bash
# Run all snap tests (local + global)
pnpm -F vite-plus snap-test
# Run only local CLI snap tests
pnpm -F vite-plus snap-test-local
pnpm -F vite-plus snap-test-local <name-filter>
# Run only global CLI snap tests
pnpm -F vite-plus snap-test-global
pnpm -F vite-plus snap-test-global <name-filter>
```
The snap test will automatically generate/update the `snap.txt` file with the command outputs. It exits with zero status even if there are output differences; you need to manually check the diffs(`git diff`) to verify correctness.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guide
## Initial Setup
### macOS / Linux
You'll need the following tools installed on your system:
```
brew install pnpm node just cmake
```
Install Rust & Cargo using rustup:
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install cargo-binstall
```
Initial setup to install dependencies for Vite+:
```
just init
```
### Windows
You'll need the following tools installed on your system. You can use [winget](https://learn.microsoft.com/en-us/windows/package-manager/).
```powershell
winget install pnpm.pnpm OpenJS.NodeJS.LTS Casey.Just Kitware.CMake
```
Install Rust & Cargo from [rustup.rs](https://rustup.rs/), then install `cargo-binstall`:
```powershell
cargo install cargo-binstall
```
Initial setup to install dependencies for Vite+:
```powershell
just init
```
**Note:** Run commands in PowerShell or Windows Terminal. Some commands may require elevated permissions.
## Build Vite+ and upstream dependencies
To create a release build of Vite+ and all upstream dependencies, run:
```
just build
```
## Install the Vite+ Global CLI from source code
```
pnpm bootstrap-cli
vp --version
```
This builds all packages, compiles the Rust `vp` binary, and installs the CLI to `~/.vite-plus`.
## Workflow for build and test
You can run this command to build, test and check if there are any snapshot changes:
```
pnpm bootstrap-cli && pnpm test && git status
```
## Running Snap Tests
Snap tests verify CLI output. They are located in `packages/cli/snap-tests/` (local CLI) and `packages/cli/snap-tests-global/` (global CLI).
```bash
# Run all snap tests (local + global)
pnpm -F vite-plus snap-test
# Run only local CLI snap tests
pnpm -F vite-plus snap-test-local
pnpm -F vite-plus snap-test-local <name-filter>
# Run only global CLI snap tests
pnpm -F vite-plus snap-test-global
pnpm -F vite-plus snap-test-global <name-filter>
```
Snap tests auto-generate `snap.txt` files. Check `git diff` to verify output changes are correct.
## Verified Commits
All commits in PR branches should be GitHub-verified so reviewers can confirm commit authenticity.
Set up local commit signing and GitHub verification first:
- Follow GitHub's guide for GPG commit signature verification: https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification#gpg-commit-signature-verification
- If you use Graphite, add the Graphite GPG key to your GitHub account from the Graphite UI as well, otherwise commits updated by Graphite won't show as verified.
After setup, re-sign any existing commits in your branch so the full branch is verified:
```bash
# Re-sign each commit on your branch (replace origin/main with your branch base if needed)
git rebase -i origin/main
# At each stop:
git commit --amend --date=now --no-edit -S
# Then continue:
git rebase --continue
```
When done, force-push the updated branch history:
```bash
git push --force-with-lease
```
## Pull upstream dependencies
> [!NOTE]
>
> Upstream dependencies only need to be updated when an ["upgrade upstream dependencies"](https://github.com/voidzero-dev/vite-plus/pulls?q=is%3Apr+feat%28deps%29%3A+upgrade+upstream+dependencies+merged) pull request is merged.
To sync the latest upstream dependencies such as Rolldown and Vite, run:
```
pnpm tool sync-remote
just build
```
## macOS Performance Tip
If you are using macOS, add your terminal app (Ghostty, iTerm2, Terminal, …) to the approved "Developer Tools" apps in the Privacy panel of System Settings and restart your terminal app. Your Rust builds will be about ~30% faster.
================================================
FILE: Cargo.toml
================================================
[workspace]
resolver = "3"
members = ["bench", "crates/*", "packages/cli/binding"]
[workspace.metadata.cargo-shear]
ignored = [
# These workspace dependencies are used by rolldown crates, not our local crates
"css-module-lexer",
"html5gum",
"rolldown_filter_analyzer",
"rolldown_plugin_vite_asset",
"rolldown_plugin_vite_asset_import_meta_url",
"rolldown_plugin_vite_css",
"rolldown_plugin_vite_css_post",
"rolldown_plugin_vite_html",
"rolldown_plugin_vite_html_inline_proxy",
"string_cache",
]
[workspace.package]
authors = ["Vite+ Authors"]
edition = "2024"
homepage = "https://github.com/voidzero-dev/vite-plus"
license = "MIT"
repository = "https://github.com/voidzero-dev/vite-plus"
rust-version = "1.92.0"
[workspace.lints.rust]
absolute_paths_not_starting_with_crate = "warn"
non_ascii_idents = "warn"
unit-bindings = "warn"
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage)', 'cfg(coverage_nightly)'] }
unsafe_op_in_unsafe_fn = "warn"
unused_unsafe = "warn"
[workspace.lints.clippy]
all = { level = "warn", priority = -1 }
# restriction
dbg_macro = "warn"
todo = "warn"
unimplemented = "warn"
print_stdout = "warn"
print_stderr = "warn"
allow_attributes = "warn"
pedantic = { level = "warn", priority = -1 }
nursery = { level = "warn", priority = -1 }
cargo = { level = "warn", priority = -1 }
cargo_common_metadata = "allow"
[workspace.dependencies]
anyhow = "1.0.98"
append-only-vec = "0.1.7"
arcstr = { version = "1.2.0", default-features = false }
ariadne = { package = "rolldown-ariadne", version = "0.5.3" }
ast-grep-config = "0.40.1"
ast-grep-core = "0.40.1"
ast-grep-language = { version = "0.40.1", default-features = false, features = [
"tree-sitter-bash",
"tree-sitter-typescript",
] }
async-channel = "2.3.1"
async-scoped = "0.9.0"
async-trait = "0.1.89"
backon = "1.3.0"
base-encode = "0.3.1"
base64-simd = "0.8.0"
bincode = "2.0.1"
bstr = { version = "1.12.0", default-features = false, features = ["alloc", "std"] }
bitflags = "2.9.1"
brush-parser = "0.3.0"
blake3 = "1.8.2"
chrono = { version = "0.4", features = ["serde"] }
clap = "4.5.40"
clap_complete = "4.6.0"
commondir = "1.0.0"
cow-utils = "0.1.3"
criterion = { version = "0.7", features = ["html_reports"] }
criterion2 = { version = "3.0.0", default-features = false }
crossterm = { version = "0.29.0", features = ["event-stream"] }
css-module-lexer = "0.0.15"
dashmap = "6.1.0"
derive_more = { version = "2.0.1", features = ["debug"] }
directories = "6.0.0"
dunce = "1.0.5"
fast-glob = "1.0.0"
flate2 = { version = "=1.1.9", features = ["zlib-rs"] }
form_urlencoded = "1.2.1"
fspy = { git = "https://github.com/voidzero-dev/vite-task.git", rev = "69cc6eba95a3b7f25f7d4d32c3f29b1386995907" }
futures = "0.3.31"
futures-util = "0.3.31"
glob = "0.3.2"
heck = "0.5.0"
hex = "0.4.3"
html5gum = "0.8.1"
httpmock = "0.7"
ignore = "0.4"
indicatif = "0.18"
indexmap = "2.9.0"
indoc = "2.0.5"
infer = "0.19.0"
insta = "1.43.1"
itertools = "0.14.0"
itoa = "1.0.15"
json-escape-simd = "3"
json-strip-comments = "3"
jsonschema = { version = "0.45.0", default-features = false }
junction = "1.4.1"
memchr = "2.7.4"
mimalloc-safe = "0.1.52"
mime = "0.3.17"
napi = { version = "3.0.0", default-features = false, features = [
"async",
"error_anyhow",
"anyhow",
"tracing",
"object_indexmap",
] }
napi-build = "2"
napi-derive = { version = "3.0.0", default-features = false, features = [
"type-def",
"strict",
"tracing",
] }
nix = { version = "0.30.1", features = ["dir"] }
nodejs-built-in-modules = "1.0.0"
nom = "8.0.0"
num-bigint = "0.4.6"
num-format = "0.4"
num_cpus = "1.17"
owo-colors = "4.2.2"
parking_lot = "0.12.5"
pathdiff = "0.2.3"
pnp = "0.12.7"
percent-encoding = "2.3.1"
petgraph = "0.8.2"
pretty_assertions = "1.4.1"
phf = "0.13.0"
rayon = "1.10.0"
regex = "1.11.1"
regress = "0.11.0"
reqwest = { version = "0.12", default-features = false }
rolldown-notify = "10.2.0"
rolldown-notify-debouncer-full = "0.7.5"
ropey = "1.6.1"
rusqlite = { version = "0.37.0", features = ["bundled"] }
rustc-hash = "2.1.1"
schemars = "1.0.0"
self_cell = "1.2.0"
node-semver = "2.2.0"
semver = "1.0.26"
serde = { version = "1.0.219", features = ["derive"] }
serde_json = "1.0.140"
serde_yaml = "0.9.34"
serde_yml = "0.0.12"
serial_test = "3.2.0"
sha1 = "0.10.6"
sha2 = "0.10.9"
simdutf8 = "0.1.5"
smallvec = "1.15.0"
string_cache = "0.9.0"
sugar_path = { version = "2.0.1", features = ["cached_current_dir"] }
tar = "0.4.43"
tempfile = "3.14.0"
terminal_size = "0.4.2"
test-log = { version = "0.2.18", features = ["trace"] }
testing_macros = "1.0.0"
thiserror = "2"
tokio = { version = "1.48.0", default-features = false }
tracing = "0.1.41"
tracing-chrome = "0.7.2"
tracing-subscriber = { version = "0.3.19", default-features = false, features = [
"env-filter",
"fmt",
"json",
"serde",
"std",
] }
ts-rs = "12.0"
typedmap = "0.6.0"
url = "2.5.4"
urlencoding = "2.1.3"
uuid = "1.17.0"
vfs = "0.13.0"
vite_command = { path = "crates/vite_command" }
vite_error = { path = "crates/vite_error" }
vite_js_runtime = { path = "crates/vite_js_runtime" }
vite_glob = { git = "https://github.com/voidzero-dev/vite-task.git", rev = "69cc6eba95a3b7f25f7d4d32c3f29b1386995907" }
vite_install = { path = "crates/vite_install" }
vite_migration = { path = "crates/vite_migration" }
vite_shared = { path = "crates/vite_shared" }
vite_static_config = { path = "crates/vite_static_config" }
vite_path = { git = "https://github.com/voidzero-dev/vite-task.git", rev = "69cc6eba95a3b7f25f7d4d32c3f29b1386995907" }
vite_str = { git = "https://github.com/voidzero-dev/vite-task.git", rev = "69cc6eba95a3b7f25f7d4d32c3f29b1386995907" }
vite_task = { git = "https://github.com/voidzero-dev/vite-task.git", rev = "69cc6eba95a3b7f25f7d4d32c3f29b1386995907" }
vite_workspace = { git = "https://github.com/voidzero-dev/vite-task.git", rev = "69cc6eba95a3b7f25f7d4d32c3f29b1386995907" }
walkdir = "2.5.0"
wax = "0.6.0"
which = "8.0.0"
xxhash-rust = "0.8.15"
zip = "7.2"
# oxc crates with the same version
oxc = { version = "0.121.0", features = [
"ast_visit",
"transformer",
"minifier",
"mangler",
"semantic",
"codegen",
"serialize",
"isolated_declarations",
"regular_expression",
"cfg",
] }
oxc_allocator = { version = "0.121.0", features = ["pool"] }
oxc_ast = "0.121.0"
oxc_ecmascript = "0.121.0"
oxc_parser = "0.121.0"
oxc_span = "0.121.0"
oxc_napi = "0.121.0"
oxc_minify_napi = "0.121.0"
oxc_parser_napi = "0.121.0"
oxc_transform_napi = "0.121.0"
oxc_traverse = "0.121.0"
# oxc crates in their own repos
oxc_index = { version = "4", features = ["rayon", "serde"] }
oxc_resolver = { version = "11.19.1", features = ["yarn_pnp"] }
oxc_resolver_napi = { version = "11.19.1", default-features = false, features = ["yarn_pnp"] }
oxc_sourcemap = "6"
# rolldown crates
rolldown = { path = "./rolldown/crates/rolldown" }
rolldown_binding = { path = "./rolldown/crates/rolldown_binding" }
rolldown_common = { path = "./rolldown/crates/rolldown_common" }
rolldown_dev = { path = "./rolldown/crates/rolldown_dev" }
rolldown_dev_common = { path = "./rolldown/crates/rolldown_dev_common" }
rolldown_devtools = { path = "./rolldown/crates/rolldown_devtools" }
rolldown_devtools_action = { path = "./rolldown/crates/rolldown_devtools_action" }
rolldown_ecmascript = { path = "./rolldown/crates/rolldown_ecmascript" }
rolldown_ecmascript_utils = { path = "./rolldown/crates/rolldown_ecmascript_utils" }
rolldown_error = { path = "./rolldown/crates/rolldown_error" }
rolldown_filter_analyzer = { path = "./rolldown/crates/rolldown_filter_analyzer" }
rolldown_fs = { path = "./rolldown/crates/rolldown_fs" }
rolldown_fs_watcher = { path = "./rolldown/crates/rolldown_fs_watcher" }
rolldown_plugin = { path = "./rolldown/crates/rolldown_plugin" }
rolldown_plugin_asset_module = { path = "./rolldown/crates/rolldown_plugin_asset_module" }
rolldown_plugin_bundle_analyzer = { path = "./rolldown/crates/rolldown_plugin_bundle_analyzer" }
rolldown_plugin_chunk_import_map = { path = "./rolldown/crates/rolldown_plugin_chunk_import_map" }
rolldown_plugin_copy_module = { path = "./rolldown/crates/rolldown_plugin_copy_module" }
rolldown_plugin_data_url = { path = "./rolldown/crates/rolldown_plugin_data_url" }
rolldown_plugin_esm_external_require = { path = "./rolldown/crates/rolldown_plugin_esm_external_require" }
rolldown_plugin_hmr = { path = "./rolldown/crates/rolldown_plugin_hmr" }
rolldown_plugin_isolated_declaration = { path = "./rolldown/crates/rolldown_plugin_isolated_declaration" }
rolldown_plugin_lazy_compilation = { path = "./rolldown/crates/rolldown_plugin_lazy_compilation" }
rolldown_plugin_oxc_runtime = { path = "./rolldown/crates/rolldown_plugin_oxc_runtime" }
rolldown_plugin_replace = { path = "./rolldown/crates/rolldown_plugin_replace" }
rolldown_plugin_utils = { path = "./rolldown/crates/rolldown_plugin_utils" }
rolldown_plugin_vite_alias = { path = "./rolldown/crates/rolldown_plugin_vite_alias" }
rolldown_plugin_vite_asset = { path = "./rolldown/crates/rolldown_plugin_vite_asset" }
rolldown_plugin_vite_asset_import_meta_url = { path = "./rolldown/crates/rolldown_plugin_vite_asset_import_meta_url" }
rolldown_plugin_vite_build_import_analysis = { path = "./rolldown/crates/rolldown_plugin_vite_build_import_analysis" }
rolldown_plugin_vite_css = { path = "./rolldown/crates/rolldown_plugin_vite_css" }
rolldown_plugin_vite_css_post = { path = "./rolldown/crates/rolldown_plugin_vite_css_post" }
rolldown_plugin_vite_dynamic_import_vars = { path = "./rolldown/crates/rolldown_plugin_vite_dynamic_import_vars" }
rolldown_plugin_vite_html = { path = "./rolldown/crates/rolldown_plugin_vite_html" }
rolldown_plugin_vite_html_inline_proxy = { path = "./rolldown/crates/rolldown_plugin_vite_html_inline_proxy" }
rolldown_plugin_vite_import_glob = { path = "./rolldown/crates/rolldown_plugin_vite_import_glob" }
rolldown_plugin_vite_json = { path = "./rolldown/crates/rolldown_plugin_vite_json" }
rolldown_plugin_vite_load_fallback = { path = "./rolldown/crates/rolldown_plugin_vite_load_fallback" }
rolldown_plugin_vite_manifest = { path = "./rolldown/crates/rolldown_plugin_vite_manifest" }
rolldown_plugin_vite_module_preload_polyfill = { path = "./rolldown/crates/rolldown_plugin_vite_module_preload_polyfill" }
rolldown_plugin_vite_react_refresh_wrapper = { path = "./rolldown/crates/rolldown_plugin_vite_react_refresh_wrapper" }
rolldown_plugin_vite_reporter = { path = "./rolldown/crates/rolldown_plugin_vite_reporter" }
rolldown_plugin_vite_resolve = { path = "./rolldown/crates/rolldown_plugin_vite_resolve" }
rolldown_plugin_vite_transform = { path = "./rolldown/crates/rolldown_plugin_vite_transform" }
rolldown_plugin_vite_wasm_fallback = { path = "./rolldown/crates/rolldown_plugin_vite_wasm_fallback" }
rolldown_plugin_vite_web_worker_post = { path = "./rolldown/crates/rolldown_plugin_vite_web_worker_post" }
rolldown_resolver = { path = "./rolldown/crates/rolldown_resolver" }
rolldown_sourcemap = { path = "./rolldown/crates/rolldown_sourcemap" }
rolldown_std_utils = { path = "./rolldown/crates/rolldown_std_utils" }
rolldown_testing = { path = "./rolldown/crates/rolldown_testing" }
rolldown_testing_config = { path = "./rolldown/crates/rolldown_testing_config" }
rolldown_tracing = { path = "./rolldown/crates/rolldown_tracing" }
rolldown_utils = { path = "./rolldown/crates/rolldown_utils" }
rolldown_watcher = { path = "./rolldown/crates/rolldown_watcher" }
rolldown_workspace = { path = "./rolldown/crates/rolldown_workspace" }
string_wizard = { path = "./rolldown/crates/string_wizard", features = ["serde"] }
# =============================================================================
# Local Development Patches
# =============================================================================
# This section patches vite-task crates to use local paths for simultaneous
# vite-task and vite-plus development. When making changes to vite-task that
# affect vite-plus, this allows testing without publishing or pushing commits.
#
# To use: Ensure vite-task is cloned at ../vite-task relative to vite-plus.
# Comment out this section before committing.
# =============================================================================
# [patch."https://github.com/voidzero-dev/vite-task.git"]
# fspy = { path = "../vite-task/crates/fspy" }
# vite_glob = { path = "../vite-task/crates/vite_glob" }
# vite_path = { path = "../vite-task/crates/vite_path" }
# vite_str = { path = "../vite-task/crates/vite_str" }
# vite_task = { path = "../vite-task/crates/vite_task" }
# vite_workspace = { path = "../vite-task/crates/vite_workspace" }
[profile.dev]
# Disabling debug info speeds up local and CI builds,
# and we don't rely on it for debugging that much.
debug = false
[profile.release]
# Configurations explicitly listed here for clarity.
# Using the best options for performance.
opt-level = 3
lto = "fat"
codegen-units = 1
strip = "symbols" # set to `false` for debug information
debug = false # set to `true` for debug information
panic = "abort" # Let it crash and force ourselves to write safe Rust.
# The trampoline binary is copied per shim tool (~5-10 copies), so optimize for
# size instead of speed. This reduces it from ~200KB to ~100KB on Windows.
[profile.release.package.vite_trampoline]
opt-level = "z"
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2026-present, VoidZero Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<picture>
<source media="(prefers-color-scheme: dark)" srcset="/logo-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="/logo.svg">
<img alt="Vite+" src="/logo.svg">
</picture>
**The Unified Toolchain for the Web**
_runtime and package management, create, dev, check, test, build, pack, and monorepo task caching in a single dependency_
---
Vite+ is the unified entry point for local web development. It combines [Vite](https://vite.dev/), [Vitest](https://vitest.dev/), [Oxlint](https://oxc.rs/docs/guide/usage/linter.html), [Oxfmt](https://oxc.rs/docs/guide/usage/formatter.html), [Rolldown](https://rolldown.rs/), [tsdown](https://tsdown.dev/), and [Vite Task](https://github.com/voidzero-dev/vite-task) into one zero-config toolchain that also manages runtime and package manager workflows:
- **`vp env`:** Manage Node.js globally and per project
- **`vp install`:** Install dependencies with automatic package manager detection
- **`vp dev`:** Run Vite's fast native ESM dev server with instant HMR
- **`vp check`:** Run formatting, linting, and type checks in one command
- **`vp test`:** Run tests through bundled Vitest
- **`vp build`:** Build applications for production with Vite + Rolldown
- **`vp run`:** Execute monorepo tasks with caching and dependency-aware scheduling
- **`vp pack`:** Build libraries for npm publishing or standalone app binaries
- **`vp create` / `vp migrate`:** Scaffold new projects and migrate existing ones
All of this is configured from your project root and works across Vite's framework ecosystem.
Vite+ is fully open-source under the MIT license.
## Getting Started
Install Vite+ globally as `vp`:
For Linux or macOS:
```bash
curl -fsSL https://vite.plus | bash
```
For Windows:
```bash
irm https://viteplus.dev/install.ps1 | iex
```
`vp` handles the full development lifecycle such as package management, development servers, linting, formatting, testing and building for production.
## Configuring Vite+
Vite+ can be configured using a single `vite.config.ts` at the root of your project:
```ts
import { defineConfig } from 'vite-plus';
export default defineConfig({
// Standard Vite configuration for dev/build/preview.
plugins: [],
// Vitest configuration.
test: {
include: ['src/**/*.test.ts'],
},
// Oxlint configuration.
lint: {
ignorePatterns: ['dist/**'],
},
// Oxfmt configuration.
fmt: {
semi: true,
singleQuote: true,
},
// Vite Task configuration.
run: {
tasks: {
'generate:icons': {
command: 'node scripts/generate-icons.js',
envs: ['ICON_THEME'],
},
},
},
// `vp staged` configuration.
staged: {
'*': 'vp check --fix',
},
});
```
This lets you keep the configuration for your development server, build, test, lint, format, task runner, and staged-file workflow in one place with type-safe config and shared defaults.
Use `vp migrate` to migrate to Vite+. It merges tool-specific config files such as `.oxlintrc*`, `.oxfmtrc*`, and lint-staged config into `vite.config.ts`.
### CLI Workflows (`vp help`)
#### Start
- **create** - Create a new project from a template
- **migrate** - Migrate an existing project to Vite+
- **config** - Configure hooks and agent integration
- **staged** - Run linters on staged files
- **install** (`i`) - Install dependencies
- **env** - Manage Node.js versions
#### Develop
- **dev** - Run the development server
- **check** - Run format, lint, and type checks
- **lint** - Lint code
- **fmt** - Format code
- **test** - Run tests
#### Execute
- **run** - Run monorepo tasks
- **exec** - Execute a command from local `node_modules/.bin`
- **dlx** - Execute a package binary without installing it as a dependency
- **cache** - Manage the task cache
#### Build
- **build** - Build for production
- **pack** - Build libraries
- **preview** - Preview production build
#### Manage Dependencies
Vite+ automatically wraps your package manager (pnpm, npm, or Yarn) based on `packageManager` and lockfiles:
- **add** - Add packages to dependencies
- **remove** (`rm`, `un`, `uninstall`) - Remove packages from dependencies
- **update** (`up`) - Update packages to latest versions
- **dedupe** - Deduplicate dependencies
- **outdated** - Check outdated packages
- **list** (`ls`) - List installed packages
- **why** (`explain`) - Show why a package is installed
- **info** (`view`, `show`) - View package metadata from the registry
- **link** (`ln`) / **unlink** - Manage local package links
- **pm** - Forward a command to the package manager
#### Maintain
- **upgrade** - Update `vp` itself to the latest version
- **implode** - Remove `vp` and all related data
### Scaffolding your first Vite+ project
Use `vp create` to create a new project:
```bash
vp create
```
You can run `vp create` inside of a project to add new apps or libraries to your project.
### Migrating an existing project
You can migrate an existing project to Vite+:
```bash
vp migrate
```
### GitHub Actions
Use the official [`setup-vp`](https://github.com/voidzero-dev/setup-vp) action to install Vite+ in GitHub Actions:
```yaml
- uses: voidzero-dev/setup-vp@v1
with:
node-version: '22'
cache: true
```
#### Manual Installation & Migration
If you are manually migrating a project to Vite+, install these dev dependencies first:
```bash
npm install -D vite-plus @voidzero-dev/vite-plus-core@latest
```
You need to add overrides to your package manager for `vite` and `vitest` so that other packages depending on Vite and Vitest will use the Vite+ versions:
```json
"overrides": {
"vite": "npm:@voidzero-dev/vite-plus-core@latest",
"vitest": "npm:@voidzero-dev/vite-plus-test@latest"
}
```
If you are using `pnpm`, add this to your `pnpm-workspace.yaml`:
```yaml
overrides:
vite: npm:@voidzero-dev/vite-plus-core@latest
vitest: npm:@voidzero-dev/vite-plus-test@latest
```
Or, if you are using Yarn:
```json
"resolutions": {
"vite": "npm:@voidzero-dev/vite-plus-core@latest",
"vitest": "npm:@voidzero-dev/vite-plus-test@latest"
}
```
## Sponsors
Thanks to [namespace.so](https://namespace.so) for powering our CI/CD pipelines with fast, free macOS and Linux runners.
================================================
FILE: bench/.gitignore
================================================
fixtures/monorepo
================================================
FILE: bench/Cargo.toml
================================================
[package]
name = "vite-plus-benches"
version = "0.1.0"
edition = "2024"
[dev-dependencies]
anyhow = { workspace = true }
async-trait = { workspace = true }
criterion = { workspace = true }
rustc-hash = { workspace = true }
tokio = { workspace = true, features = ["rt"] }
vite_path = { workspace = true }
vite_str = { workspace = true }
vite_task = { workspace = true }
[[bench]]
name = "workspace_load"
harness = false
================================================
FILE: bench/benches/workspace_load.rs
================================================
use std::{ffi::OsStr, hint::black_box, path::PathBuf, sync::Arc};
use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use rustc_hash::FxHashMap;
use tokio::runtime::Runtime;
use vite_path::{AbsolutePath, AbsolutePathBuf};
use vite_str::Str;
use vite_task::{
CommandHandler, HandledCommand, Session, SessionConfig, plan_request::ScriptCommand,
};
/// A no-op command handler for benchmarking purposes.
#[derive(Debug, Default)]
struct NoOpCommandHandler;
#[async_trait::async_trait(?Send)]
impl CommandHandler for NoOpCommandHandler {
async fn handle_command(
&mut self,
_command: &mut ScriptCommand,
) -> anyhow::Result<HandledCommand> {
Ok(HandledCommand::Verbatim)
}
}
/// A no-op user config loader for benchmarking.
#[derive(Debug, Default)]
struct NoOpUserConfigLoader;
#[async_trait::async_trait(?Send)]
impl vite_task::loader::UserConfigLoader for NoOpUserConfigLoader {
async fn load_user_config_file(
&self,
_package_path: &AbsolutePath,
) -> anyhow::Result<Option<vite_task::config::UserRunConfig>> {
Ok(None)
}
}
/// Owned session callbacks for benchmarking.
#[derive(Default)]
struct BenchSessionConfig {
command_handler: NoOpCommandHandler,
user_config_loader: NoOpUserConfigLoader,
}
impl BenchSessionConfig {
fn as_callbacks(&mut self) -> SessionConfig<'_> {
SessionConfig {
command_handler: &mut self.command_handler,
user_config_loader: &mut self.user_config_loader,
program_name: Str::from("vp"),
}
}
}
fn bench_workspace_load(c: &mut Criterion) {
let fixture_path = AbsolutePathBuf::new(PathBuf::from(env!("CARGO_MANIFEST_DIR")))
.unwrap()
.join("fixtures")
.join("monorepo");
let runtime = Runtime::new().unwrap();
// Session::ensure_task_graph_loaded benchmark
let mut session_group = c.benchmark_group("session_task_graph_load");
session_group.measurement_time(std::time::Duration::from_secs(10));
session_group.bench_function("ensure_task_graph_loaded", |b| {
b.iter(|| {
runtime.block_on(async {
let mut owned_callbacks = BenchSessionConfig::default();
let envs: FxHashMap<Arc<OsStr>, Arc<OsStr>> = FxHashMap::default();
let mut session = Session::init_with(
envs,
fixture_path.clone().into(),
owned_callbacks.as_callbacks(),
)
.expect("Failed to create session");
black_box(
session.ensure_task_graph_loaded().await.expect("Failed to load task graph"),
);
});
});
});
session_group.bench_with_input(BenchmarkId::new("packages", 100), &fixture_path, |b, path| {
b.iter(|| {
runtime.block_on(async {
let mut owned_callbacks = BenchSessionConfig::default();
let envs: FxHashMap<Arc<OsStr>, Arc<OsStr>> = FxHashMap::default();
let mut session =
Session::init_with(envs, path.clone().into(), owned_callbacks.as_callbacks())
.expect("Failed to create session");
black_box(
session.ensure_task_graph_loaded().await.expect("Failed to load task graph"),
);
});
});
});
session_group.finish();
}
criterion_group!(benches, bench_workspace_load);
criterion_main!(benches);
================================================
FILE: bench/fixtures/monorepo/package.json
================================================
{
"name": "monorepo-benchmark",
"version": "1.0.0",
"private": true,
"workspaces": [
"packages/*"
],
"scripts": {
"build:all": "vite-plus run build",
"test:all": "vite-plus run test",
"lint:all": "vite-plus run lint"
},
"devDependencies": {
"vite-plus": "*"
}
}
================================================
FILE: bench/fixtures/monorepo/pnpm-workspace.yaml
================================================
packages:
- 'packages/*'
================================================
FILE: bench/fixtures/monorepo/vite-plus.json
================================================
{
"tasks": {
"build": {
"cache": true,
"parallel": true
},
"test": {
"cache": true,
"parallel": true
},
"lint": {
"cache": false,
"parallel": true
}
}
}
================================================
FILE: bench/generate-monorepo.ts
================================================
import * as fs from 'node:fs';
import * as path from 'node:path';
import { fileURLToPath } from 'node:url';
interface Package {
name: string;
dependencies: string[];
scripts: Record<string, string>;
hasVitePlusConfig: boolean;
}
const __dirname = path.join(fileURLToPath(import.meta.url), '..');
class MonorepoGenerator {
private packages: Map<string, Package> = new Map();
private readonly PACKAGE_COUNT = 1000;
private readonly MAX_DEPS_PER_PACKAGE = 8;
private readonly MIN_DEPS_PER_PACKAGE = 2;
private readonly SCRIPT_NAMES = ['build', 'test', 'lint', 'dev', 'start', 'prepare', 'compile'];
private readonly CATEGORIES = ['core', 'util', 'feature', 'service', 'app'];
constructor(private rootDir: string) {}
private getRandomInt(min: number, max: number): number {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
private getRandomElement<T>(arr: T[]): T {
return arr[Math.floor(Math.random() * arr.length)];
}
private generatePackageName(index: number): string {
const category = this.getRandomElement(this.CATEGORIES);
const paddedIndex = index.toString().padStart(2, '0');
return `${category}-${paddedIndex}`;
}
private generateScriptCommand(scriptName: string, packageName: string): string {
const commands = [
`echo "Running ${scriptName} for ${packageName}"`,
`node scripts/${scriptName}.js`,
`tsc --build`,
`webpack build`,
`rollup -c`,
`esbuild src/index.js --bundle`,
`npm run pre${scriptName}`,
`node tasks/${scriptName}`,
];
// Generate command with 0-3 && concatenations
const numCommands = this.getRandomInt(1, 4);
const selectedCommands: string[] = [];
for (let i = 0; i < numCommands; i++) {
selectedCommands.push(this.getRandomElement(commands));
}
return selectedCommands.join(' && ');
}
private generateScripts(packageName: string): Record<string, string> {
const scripts: Record<string, string> = {};
// Each package has 2-3 scripts
const numScripts = this.getRandomInt(2, 3);
const selectedScripts = new Set<string>();
while (selectedScripts.size < numScripts) {
selectedScripts.add(this.getRandomElement(this.SCRIPT_NAMES));
}
for (const scriptName of selectedScripts) {
scripts[scriptName] = this.generateScriptCommand(scriptName, packageName);
}
return scripts;
}
private selectDependencies(currentIndex: number, availablePackages: string[]): string[] {
const numDeps = this.getRandomInt(this.MIN_DEPS_PER_PACKAGE, this.MAX_DEPS_PER_PACKAGE);
const dependencies = new Set<string>();
// Create a complex graph by selecting dependencies from different layers
// Prefer packages with lower indices (creates deeper dependency chains)
const eligiblePackages = availablePackages.filter((pkg) => {
const pkgIndex = parseInt(pkg.split('-')[1]);
return pkgIndex < currentIndex;
});
if (eligiblePackages.length === 0) {
return [];
}
while (dependencies.size < numDeps && dependencies.size < eligiblePackages.length) {
const dep = this.getRandomElement(eligiblePackages);
dependencies.add(dep);
}
// Add some cross-category dependencies for complexity
if (Math.random() > 0.3) {
const crossCategoryDeps = availablePackages.filter((pkg) => {
const category = pkg.split('-')[0];
return category !== currentIndex.toString().split('-')[0];
});
if (crossCategoryDeps.length > 0) {
dependencies.add(this.getRandomElement(crossCategoryDeps));
}
}
return Array.from(dependencies);
}
private generatePackages(): void {
// First, create all package names
const allPackageNames: string[] = [];
for (let i = 0; i < this.PACKAGE_COUNT; i++) {
allPackageNames.push(this.generatePackageName(i));
}
// Generate packages with dependencies
for (let i = 0; i < this.PACKAGE_COUNT; i++) {
const packageName = allPackageNames[i];
const scripts = this.generateScripts(packageName);
// 70% chance to have vite-plus.json config
const hasVitePlusConfig = Math.random() > 0.3;
// Select dependencies from packages created before this one
const dependencies = i === 0 ? [] : this.selectDependencies(i, allPackageNames.slice(0, i));
this.packages.set(packageName, {
name: packageName,
dependencies,
scripts,
hasVitePlusConfig,
});
}
// Ensure complex transitive dependencies for script resolution testing
this.addTransitiveScriptDependencies();
}
private addTransitiveScriptDependencies(): void {
// Create specific patterns for testing transitive script dependencies
const packagesArray = Array.from(this.packages.entries());
for (let i = 0; i < 50; i++) {
const [nameA, pkgA] = this.getRandomElement(packagesArray);
const [nameB, pkgB] = this.getRandomElement(packagesArray);
const [nameC, pkgC] = this.getRandomElement(packagesArray);
if (nameA !== nameB && nameB !== nameC && nameA !== nameC) {
// Setup: A depends on B, B depends on C
if (!pkgA.dependencies.includes(nameB)) {
pkgA.dependencies.push(nameB);
}
if (!pkgB.dependencies.includes(nameC)) {
pkgB.dependencies.push(nameC);
}
// Create the scenario: A has build, B doesn't, C has build
const scriptName = this.getRandomElement(this.SCRIPT_NAMES);
pkgA.scripts[scriptName] = this.generateScriptCommand(scriptName, nameA);
delete pkgB.scripts[scriptName]; // B doesn't have the script
pkgC.scripts[scriptName] = this.generateScriptCommand(scriptName, nameC);
}
}
}
private writePackage(pkg: Package): void {
const packageDir = path.join(this.rootDir, 'packages', pkg.name);
// Create directory structure
fs.mkdirSync(packageDir, { recursive: true });
fs.mkdirSync(path.join(packageDir, 'src'), { recursive: true });
// Write package.json
const packageJson = {
name: `@monorepo/${pkg.name}`,
version: '1.0.0',
main: 'src/index.js',
scripts: pkg.scripts,
dependencies: pkg.dependencies.reduce(
(deps, dep) => {
deps[`@monorepo/${dep}`] = 'workspace:*';
return deps;
},
{} as Record<string, string>,
),
};
fs.writeFileSync(path.join(packageDir, 'package.json'), JSON.stringify(packageJson, null, 2));
// Write source file
const indexContent = `// ${pkg.name} module
export function ${pkg.name.replace('-', '_')}() {
console.log('Executing ${pkg.name}');
${pkg.dependencies.map((dep) => ` require('@monorepo/${dep}');`).join('\n')}
}
module.exports = { ${pkg.name.replace('-', '_')} };
`;
fs.writeFileSync(path.join(packageDir, 'src', 'index.js'), indexContent);
// Write vite-plus.json if needed
if (pkg.hasVitePlusConfig) {
const vitePlusConfig = {
extends: '../../vite-plus.json',
tasks: {
build: {
cache: true,
env: {
NODE_ENV: 'production',
},
},
},
};
fs.writeFileSync(
path.join(packageDir, 'vite-plus.json'),
JSON.stringify(vitePlusConfig, null, 2),
);
}
}
public generate(): void {
console.log('Generating monorepo structure…');
// Clean and create root directory
if (fs.existsSync(this.rootDir)) {
fs.rmSync(this.rootDir, { recursive: true, force: true });
}
fs.mkdirSync(this.rootDir, { recursive: true });
fs.mkdirSync(path.join(this.rootDir, 'packages'), { recursive: true });
// Generate packages
this.generatePackages();
// Write all packages
let count = 0;
for (const [_, pkg] of this.packages) {
this.writePackage(pkg);
count++;
if (count % 100 === 0) {
console.log(`Generated ${count} packages…`);
}
}
// Write root package.json
const rootPackageJson = {
name: 'monorepo-benchmark',
version: '1.0.0',
private: true,
workspaces: ['packages/*'],
scripts: {
'build:all': 'vp run build',
'test:all': 'vp run test',
'lint:all': 'vp run lint',
},
devDependencies: {
'vite-plus': '*',
},
};
fs.writeFileSync(
path.join(this.rootDir, 'package.json'),
JSON.stringify(rootPackageJson, null, 2),
);
// Write pnpm-workspace.yaml for pnpm support
const pnpmWorkspace = `packages:
- 'packages/*'
`;
fs.writeFileSync(path.join(this.rootDir, 'pnpm-workspace.yaml'), pnpmWorkspace);
// Write root vite-plus.json
const rootVitePlusConfig = {
tasks: {
build: {
cache: true,
parallel: true,
},
test: {
cache: true,
parallel: true,
},
lint: {
cache: false,
parallel: true,
},
},
};
fs.writeFileSync(
path.join(this.rootDir, 'vite-plus.json'),
JSON.stringify(rootVitePlusConfig, null, 2),
);
console.log(`Successfully generated monorepo with ${this.PACKAGE_COUNT} packages!`);
console.log(`Location: ${this.rootDir}`);
// Print some statistics
this.printStatistics();
}
private printStatistics(): void {
let totalDeps = 0;
let maxDeps = 0;
let packagesWithVitePlus = 0;
const scriptCounts = new Map<string, number>();
for (const [_, pkg] of this.packages) {
totalDeps += pkg.dependencies.length;
maxDeps = Math.max(maxDeps, pkg.dependencies.length);
if (pkg.hasVitePlusConfig) {
packagesWithVitePlus++;
}
for (const script of Object.keys(pkg.scripts)) {
scriptCounts.set(script, (scriptCounts.get(script) || 0) + 1);
}
}
console.log('\nStatistics:');
console.log(`- Total packages: ${this.packages.size}`);
console.log(
`- Average dependencies per package: ${(totalDeps / this.packages.size).toFixed(2)}`,
);
console.log(`- Max dependencies in a package: ${maxDeps}`);
console.log(`- Packages with vite-plus.json: ${packagesWithVitePlus}`);
console.log('- Script distribution:');
for (const [script, count] of scriptCounts) {
console.log(` - ${script}: ${count} packages`);
}
}
}
// Main execution
const outputDir = path.join(__dirname, 'fixtures', 'monorepo');
const generator = new MonorepoGenerator(outputDir);
generator.generate();
================================================
FILE: bench/package.json
================================================
{
"type": "module"
}
================================================
FILE: bench/tsconfig.json
================================================
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "./dist",
"noEmit": true,
"erasableSyntaxOnly": false
},
"include": ["**/*.ts"]
}
================================================
FILE: crates/vite_command/Cargo.toml
================================================
[package]
name = "vite_command"
version = "0.0.0"
authors.workspace = true
edition.workspace = true
license.workspace = true
rust-version.workspace = true
[dependencies]
fspy = { workspace = true }
tokio = { workspace = true }
tracing = { workspace = true }
vite_error = { workspace = true }
vite_path = { workspace = true }
which = { workspace = true, features = ["tracing"] }
[target.'cfg(not(target_os = "windows"))'.dependencies]
nix = { workspace = true }
[dev-dependencies]
tempfile = { workspace = true }
tokio = { workspace = true, features = ["macros", "test-util"] }
[lints]
workspace = true
[lib]
doctest = false
================================================
FILE: crates/vite_command/src/lib.rs
================================================
use std::{
collections::HashMap,
ffi::OsStr,
process::{ExitStatus, Stdio},
};
use fspy::AccessMode;
use tokio::process::Command;
use vite_error::Error;
use vite_path::{AbsolutePath, AbsolutePathBuf, RelativePathBuf};
/// Result of running a command with fspy tracking.
#[derive(Debug)]
pub struct FspyCommandResult {
/// The termination status of the command.
pub status: ExitStatus,
/// The path accesses of the command.
pub path_accesses: HashMap<RelativePathBuf, AccessMode>,
}
/// Resolve a binary name to a full path using the `which` crate.
/// Handles PATHEXT (`.cmd`/`.bat`) resolution natively on Windows.
///
/// If `path_env` is `None`, searches the process's current `PATH`.
pub fn resolve_bin(
bin_name: &str,
path_env: Option<&OsStr>,
cwd: impl AsRef<AbsolutePath>,
) -> Result<AbsolutePathBuf, Error> {
let current_path;
let path_env = match path_env {
Some(p) => p,
None => {
current_path = std::env::var_os("PATH").unwrap_or_default();
¤t_path
}
};
let path = which::which_in(bin_name, Some(path_env), cwd.as_ref())
.map_err(|_| Error::CannotFindBinaryPath(bin_name.into()))?;
AbsolutePathBuf::new(path).ok_or_else(|| Error::CannotFindBinaryPath(bin_name.into()))
}
/// Build a `tokio::process::Command` for a pre-resolved binary path.
/// Sets inherited stdio and `fix_stdio_streams` (Unix pre_exec).
/// Callers can further customize (add args, envs, override stdio, etc.).
pub fn build_command(bin_path: &AbsolutePath, cwd: &AbsolutePath) -> Command {
let mut cmd = Command::new(bin_path.as_path());
cmd.current_dir(cwd).stdin(Stdio::inherit()).stdout(Stdio::inherit()).stderr(Stdio::inherit());
#[cfg(unix)]
unsafe {
cmd.pre_exec(|| {
fix_stdio_streams();
Ok(())
});
}
cmd
}
/// Build a `tokio::process::Command` for shell execution.
/// Uses `/bin/sh -c` on Unix, `cmd.exe /C` on Windows.
pub fn build_shell_command(shell_cmd: &str, cwd: &AbsolutePath) -> Command {
#[cfg(unix)]
let mut cmd = {
let mut cmd = Command::new("/bin/sh");
cmd.arg("-c").arg(shell_cmd);
cmd
};
#[cfg(windows)]
let mut cmd = {
let mut cmd = Command::new("cmd.exe");
cmd.arg("/C").arg(shell_cmd);
cmd
};
cmd.current_dir(cwd).stdin(Stdio::inherit()).stdout(Stdio::inherit()).stderr(Stdio::inherit());
#[cfg(unix)]
unsafe {
cmd.pre_exec(|| {
fix_stdio_streams();
Ok(())
});
}
cmd
}
/// Run a command with the given bin name, arguments, environment variables, and current working directory.
///
/// # Arguments
///
/// * `bin_name`: The name of the binary to run.
/// * `args`: The arguments to pass to the binary.
/// * `envs`: The custom environment variables to set for the command, will be merged with the system environment variables.
/// * `cwd`: The current working directory for the command.
///
/// # Returns
///
/// Returns the exit status of the command.
pub async fn run_command<I, S>(
bin_name: &str,
args: I,
envs: &HashMap<String, String>,
cwd: impl AsRef<AbsolutePath>,
) -> Result<ExitStatus, Error>
where
I: IntoIterator<Item = S>,
S: AsRef<OsStr>,
{
let cwd = cwd.as_ref();
let paths = envs.get("PATH");
let bin_path = resolve_bin(bin_name, paths.map(|p| OsStr::new(p.as_str())), cwd)?;
let mut cmd = build_command(&bin_path, cwd);
cmd.args(args).envs(envs);
let status = cmd.status().await?;
Ok(status)
}
/// Run a command with fspy tracking.
///
/// # Arguments
///
/// * `bin_name`: The name of the binary to run.
/// * `args`: The arguments to pass to the binary.
/// * `envs`: The custom environment variables to set for the command.
/// * `cwd`: The current working directory for the command.
///
/// # Returns
///
/// Returns a FspyCommandResult containing the exit status and path accesses.
pub async fn run_command_with_fspy<I, S>(
bin_name: &str,
args: I,
envs: &HashMap<String, String>,
cwd: impl AsRef<AbsolutePath>,
) -> Result<FspyCommandResult, Error>
where
I: IntoIterator<Item = S>,
S: AsRef<OsStr>,
{
let cwd = cwd.as_ref();
let mut cmd = fspy::Command::new(bin_name);
cmd.args(args)
// set system environment variables first
.envs(std::env::vars_os())
// then set custom environment variables
.envs(envs)
.current_dir(cwd)
.stdin(Stdio::inherit())
.stdout(Stdio::inherit())
.stderr(Stdio::inherit());
// fix stdio streams on unix
#[cfg(unix)]
unsafe {
cmd.pre_exec(|| {
fix_stdio_streams();
Ok(())
});
}
let child = cmd.spawn().await.map_err(|e| Error::Anyhow(e.into()))?;
let termination = child.wait_handle.await?;
let mut path_accesses = HashMap::<RelativePathBuf, AccessMode>::new();
for access in termination.path_accesses.iter() {
tracing::debug!("Path access: {:?}", access);
let relative_path = access
.path
.strip_path_prefix(cwd, |strip_result| {
let Ok(stripped_path) = strip_result else {
return None;
};
if stripped_path.as_os_str().is_empty() {
return None;
}
tracing::debug!("stripped_path: {:?}", stripped_path);
Some(RelativePathBuf::new(stripped_path).map_err(|err| {
Error::InvalidRelativePath { path: stripped_path.into(), reason: err }
}))
})
.transpose()?;
let Some(relative_path) = relative_path else {
continue;
};
path_accesses
.entry(relative_path)
.and_modify(|mode| *mode |= access.mode)
.or_insert(access.mode);
}
Ok(FspyCommandResult { status: termination.status, path_accesses })
}
#[cfg(unix)]
pub fn fix_stdio_streams() {
// libuv may mark stdin/stdout/stderr as close-on-exec, which interferes with Rust's subprocess spawning.
// As a workaround, we clear the FD_CLOEXEC flag on these file descriptors to prevent them from being closed when spawning child processes.
//
// For details see https://github.com/libuv/libuv/issues/2062
// Fixed by reference from https://github.com/electron/electron/pull/15555
use std::os::fd::BorrowedFd;
use nix::{
fcntl::{FcntlArg, FdFlag, fcntl},
libc::{STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO},
};
// Safe function to clear FD_CLOEXEC flag
fn clear_cloexec(fd: BorrowedFd<'_>) {
// Borrow RawFd as BorrowedFd to satisfy AsFd constraint
if let Ok(flags) = fcntl(fd, FcntlArg::F_GETFD) {
let mut fd_flags = FdFlag::from_bits_retain(flags);
if fd_flags.contains(FdFlag::FD_CLOEXEC) {
fd_flags.remove(FdFlag::FD_CLOEXEC);
// Ignore errors: some fd may be closed
let _ = fcntl(fd, FcntlArg::F_SETFD(fd_flags));
}
}
}
// Clear FD_CLOEXEC on stdin, stdout, stderr
clear_cloexec(unsafe { BorrowedFd::borrow_raw(STDIN_FILENO) });
clear_cloexec(unsafe { BorrowedFd::borrow_raw(STDOUT_FILENO) });
clear_cloexec(unsafe { BorrowedFd::borrow_raw(STDERR_FILENO) });
}
#[cfg(test)]
mod tests {
use tempfile::{TempDir, tempdir};
use vite_path::AbsolutePathBuf;
use super::*;
fn create_temp_dir() -> TempDir {
tempdir().expect("Failed to create temp directory")
}
mod run_command_tests {
use super::*;
#[tokio::test]
async fn test_run_command_and_find_binary_path() {
let temp_dir = create_temp_dir();
let temp_dir_path =
AbsolutePathBuf::new(temp_dir.path().canonicalize().unwrap().to_path_buf())
.unwrap();
let envs = HashMap::from([(
"PATH".to_string(),
std::env::var_os("PATH").unwrap_or_default().into_string().unwrap(),
gitextract_0d0lq36w/ ├── .cargo/ │ └── config.toml ├── .claude/ │ ├── agents/ │ │ ├── cargo-workspace-merger.md │ │ └── monorepo-architect.md │ └── skills/ │ ├── add-ecosystem-ci/ │ │ └── SKILL.md │ ├── bump-vite-task/ │ │ └── SKILL.md │ ├── spawn-process/ │ │ └── SKILL.md │ └── sync-tsdown-cli/ │ └── SKILL.md ├── .clippy.toml ├── .devcontainer/ │ └── devcontainer.json ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── docs.yml │ │ └── feature_request.yml │ ├── actions/ │ │ ├── build-upstream/ │ │ │ └── action.yml │ │ ├── clone/ │ │ │ └── action.yml │ │ ├── download-rolldown-binaries/ │ │ │ └── action.yml │ │ └── set-snapshot-version/ │ │ ├── action.yml │ │ ├── compute-version.mjs │ │ └── package.json │ ├── renovate.json │ ├── scripts/ │ │ └── upgrade-deps.mjs │ └── workflows/ │ ├── ci.yml │ ├── claude.yml │ ├── cleanup-cache.yml │ ├── deny.yml │ ├── e2e-test.yml │ ├── issue-close-require.yml │ ├── issue-labeled.yml │ ├── release.yml │ ├── test-standalone-install.yml │ ├── upgrade-deps.yml │ └── zizmor.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .node-version ├── .rustfmt.toml ├── .typos.toml ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── CLAUDE.md ├── CONTRIBUTING.md ├── Cargo.toml ├── LICENSE ├── README.md ├── bench/ │ ├── .gitignore │ ├── Cargo.toml │ ├── benches/ │ │ └── workspace_load.rs │ ├── fixtures/ │ │ └── monorepo/ │ │ ├── package.json │ │ ├── pnpm-workspace.yaml │ │ └── vite-plus.json │ ├── generate-monorepo.ts │ ├── package.json │ └── tsconfig.json ├── crates/ │ ├── vite_command/ │ │ ├── Cargo.toml │ │ └── src/ │ │ └── lib.rs │ ├── vite_error/ │ │ ├── Cargo.toml │ │ └── src/ │ │ └── lib.rs │ ├── vite_global_cli/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── cli.rs │ │ ├── command_picker.rs │ │ ├── commands/ │ │ │ ├── add.rs │ │ │ ├── config.rs │ │ │ ├── create.rs │ │ │ ├── dedupe.rs │ │ │ ├── delegate.rs │ │ │ ├── dlx.rs │ │ │ ├── env/ │ │ │ │ ├── bin_config.rs │ │ │ │ ├── config.rs │ │ │ │ ├── current.rs │ │ │ │ ├── default.rs │ │ │ │ ├── doctor.rs │ │ │ │ ├── exec.rs │ │ │ │ ├── global_install.rs │ │ │ │ ├── list.rs │ │ │ │ ├── list_remote.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── off.rs │ │ │ │ ├── on.rs │ │ │ │ ├── package_metadata.rs │ │ │ │ ├── packages.rs │ │ │ │ ├── pin.rs │ │ │ │ ├── setup.rs │ │ │ │ ├── unpin.rs │ │ │ │ ├── use.rs │ │ │ │ └── which.rs │ │ │ ├── implode.rs │ │ │ ├── install.rs │ │ │ ├── link.rs │ │ │ ├── migrate.rs │ │ │ ├── mod.rs │ │ │ ├── outdated.rs │ │ │ ├── pm.rs │ │ │ ├── remove.rs │ │ │ ├── run_or_delegate.rs │ │ │ ├── staged.rs │ │ │ ├── unlink.rs │ │ │ ├── update.rs │ │ │ ├── upgrade/ │ │ │ │ ├── install.rs │ │ │ │ ├── integrity.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── platform.rs │ │ │ │ └── registry.rs │ │ │ ├── version.rs │ │ │ ├── vpx.rs │ │ │ └── why.rs │ │ ├── error.rs │ │ ├── help.rs │ │ ├── js_executor.rs │ │ ├── main.rs │ │ ├── shim/ │ │ │ ├── cache.rs │ │ │ ├── dispatch.rs │ │ │ ├── exec.rs │ │ │ └── mod.rs │ │ └── tips/ │ │ ├── mod.rs │ │ ├── short_aliases.rs │ │ └── use_vpx_or_run.rs │ ├── vite_install/ │ │ ├── Cargo.toml │ │ ├── README.md │ │ └── src/ │ │ ├── commands/ │ │ │ ├── add.rs │ │ │ ├── audit.rs │ │ │ ├── cache.rs │ │ │ ├── config.rs │ │ │ ├── dedupe.rs │ │ │ ├── deprecate.rs │ │ │ ├── dist_tag.rs │ │ │ ├── dlx.rs │ │ │ ├── fund.rs │ │ │ ├── install.rs │ │ │ ├── link.rs │ │ │ ├── list.rs │ │ │ ├── login.rs │ │ │ ├── logout.rs │ │ │ ├── mod.rs │ │ │ ├── outdated.rs │ │ │ ├── owner.rs │ │ │ ├── pack.rs │ │ │ ├── ping.rs │ │ │ ├── prune.rs │ │ │ ├── publish.rs │ │ │ ├── rebuild.rs │ │ │ ├── remove.rs │ │ │ ├── run.rs │ │ │ ├── search.rs │ │ │ ├── token.rs │ │ │ ├── unlink.rs │ │ │ ├── update.rs │ │ │ ├── view.rs │ │ │ ├── whoami.rs │ │ │ └── why.rs │ │ ├── config.rs │ │ ├── lib.rs │ │ ├── main.rs │ │ ├── package_manager.rs │ │ ├── request.rs │ │ └── shim.rs │ ├── vite_js_runtime/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── cache.rs │ │ ├── dev_engines.rs │ │ ├── download.rs │ │ ├── error.rs │ │ ├── lib.rs │ │ ├── platform.rs │ │ ├── provider.rs │ │ ├── providers/ │ │ │ ├── mod.rs │ │ │ └── node.rs │ │ └── runtime.rs │ ├── vite_migration/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── ast_grep.rs │ │ ├── eslint.rs │ │ ├── file_walker.rs │ │ ├── import_rewriter.rs │ │ ├── lib.rs │ │ ├── package.rs │ │ ├── prettier.rs │ │ ├── script_rewrite.rs │ │ └── vite_config.rs │ ├── vite_shared/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── env_config.rs │ │ ├── env_vars.rs │ │ ├── header.rs │ │ ├── home.rs │ │ ├── lib.rs │ │ ├── output.rs │ │ ├── package_json.rs │ │ ├── path_env.rs │ │ ├── string_similarity.rs │ │ └── tracing.rs │ ├── vite_static_config/ │ │ ├── Cargo.toml │ │ ├── README.md │ │ └── src/ │ │ └── lib.rs │ └── vite_trampoline/ │ ├── Cargo.toml │ └── src/ │ └── main.rs ├── deny.toml ├── docs/ │ ├── .gitignore │ ├── .vitepress/ │ │ ├── config.mts │ │ ├── env.d.ts │ │ ├── theme/ │ │ │ ├── Layout.vue │ │ │ ├── assets/ │ │ │ │ └── animations/ │ │ │ │ ├── 1280_x_580_vite+_masthead.riv │ │ │ │ ├── 253_x_268_vite+_masthead_mobile.riv │ │ │ │ ├── 514_x_246_focus_on_shipping_v2.riv │ │ │ │ └── 561_x_273_stay_fast_at_scale.riv │ │ │ ├── components/ │ │ │ │ ├── Footer.vue │ │ │ │ └── home/ │ │ │ │ ├── CoreFeature3Col.vue │ │ │ │ ├── FeatureCheck.vue │ │ │ │ ├── FeatureDevBuild.vue │ │ │ │ ├── FeaturePack.vue │ │ │ │ ├── FeatureRun.vue │ │ │ │ ├── FeatureRunTerminal.vue │ │ │ │ ├── FeatureTest.vue │ │ │ │ ├── FeatureToolbar.vue │ │ │ │ ├── Fullstack2Col.vue │ │ │ │ ├── HeadingSection2.vue │ │ │ │ ├── HeadingSection3.vue │ │ │ │ ├── HeadingSection4.vue │ │ │ │ ├── Hero.vue │ │ │ │ ├── HeroRive.vue │ │ │ │ ├── InstallCommand.vue │ │ │ │ ├── PartnerLogos.vue │ │ │ │ ├── ProductivityGrid.vue │ │ │ │ ├── StackedBlock.vue │ │ │ │ ├── Terminal.vue │ │ │ │ ├── TerminalTranscript.vue │ │ │ │ └── Testimonials.vue │ │ │ ├── data/ │ │ │ │ ├── feature-run-transcripts.ts │ │ │ │ ├── performance.ts │ │ │ │ ├── terminal-transcripts.ts │ │ │ │ └── testimonials.ts │ │ │ ├── index.ts │ │ │ ├── layouts/ │ │ │ │ ├── Error404.vue │ │ │ │ └── Home.vue │ │ │ └── styles.css │ │ └── tsconfig.json │ ├── config/ │ │ ├── build.md │ │ ├── fmt.md │ │ ├── index.md │ │ ├── lint.md │ │ ├── pack.md │ │ ├── run.md │ │ ├── staged.md │ │ └── test.md │ ├── guide/ │ │ ├── build.md │ │ ├── cache.md │ │ ├── check.md │ │ ├── ci.md │ │ ├── commit-hooks.md │ │ ├── create.md │ │ ├── dev.md │ │ ├── env.md │ │ ├── fmt.md │ │ ├── ide-integration.md │ │ ├── implode.md │ │ ├── index.md │ │ ├── install.md │ │ ├── lint.md │ │ ├── migrate.md │ │ ├── pack.md │ │ ├── run.md │ │ ├── test.md │ │ ├── troubleshooting.md │ │ ├── upgrade.md │ │ ├── vpx.md │ │ └── why.md │ ├── index.md │ ├── package.json │ ├── pnpm-workspace.yaml │ └── public/ │ └── _redirects ├── ecosystem-ci/ │ ├── clone.ts │ ├── patch-project.ts │ ├── paths.ts │ ├── repo.json │ └── verify-install.ts ├── justfile ├── netlify.toml ├── package.json ├── packages/ │ ├── cli/ │ │ ├── .gitignore │ │ ├── AGENTS.md │ │ ├── BUNDLING.md │ │ ├── README.md │ │ ├── bin/ │ │ │ ├── oxfmt │ │ │ ├── oxlint │ │ │ └── vp │ │ ├── binding/ │ │ │ ├── .gitignore │ │ │ ├── Cargo.toml │ │ │ ├── build.rs │ │ │ ├── index.cjs │ │ │ ├── index.d.cts │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ └── src/ │ │ │ ├── cli.rs │ │ │ ├── exec/ │ │ │ │ ├── args.rs │ │ │ │ ├── mod.rs │ │ │ │ └── workspace.rs │ │ │ ├── lib.rs │ │ │ ├── migration.rs │ │ │ ├── package_manager.rs │ │ │ └── utils.rs │ │ ├── build.ts │ │ ├── install.ps1 │ │ ├── install.sh │ │ ├── package.json │ │ ├── publish-native-addons.ts │ │ ├── rolldown.config.ts │ │ ├── rules/ │ │ │ ├── vite-prepare.yml │ │ │ └── vite-tools.yml │ │ ├── skills/ │ │ │ └── vite-plus/ │ │ │ └── SKILL.md │ │ ├── snap-tests/ │ │ │ ├── bin-oxfmt-wrapper/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── bin-oxlint-wrapper/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── build-vite-env/ │ │ │ │ ├── index.html │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── cache-clean/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ ├── subfolder/ │ │ │ │ │ └── .gitkeep │ │ │ │ └── vite.config.ts │ │ │ ├── cache-scripts-default/ │ │ │ │ ├── hello.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── cache-scripts-enabled/ │ │ │ │ ├── hello.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── change-passthrough-env-config/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── check-all-skipped/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── check-fail-fast/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-fix/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-fix-missing-stderr/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── check-fix-paths/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-fix-reformat/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-fmt-fail/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-lint-fail/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-lint-fail-no-typecheck/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── check-lint-fail-typecheck/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── check-lint-warn/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-no-fmt/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-no-lint/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-oxlint-env/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── check-pass/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ └── steps.json │ │ │ ├── check-pass-no-typecheck/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── check-pass-typecheck/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── check-pass-typecheck-github-actions/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── cli-helper-message/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-dev-with-port/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-doc/ │ │ │ │ ├── api-examples.md │ │ │ │ ├── index.md │ │ │ │ ├── markdown-examples.md │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── command-exec/ │ │ │ │ ├── package.json │ │ │ │ ├── setup-bin.js │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-exec-cwd/ │ │ │ │ ├── package.json │ │ │ │ ├── setup.js │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-exec-monorepo/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app-a/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── app-b/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── lib-c/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-exec-monorepo-filter-v2/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app-a/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── app-b/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── lib-c/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-exec-monorepo-order/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app-mobile/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── app-web/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── cycle-a/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── cycle-b/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── cycle-c/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── cycle-d/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── cycle-e/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── lib-core/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── lib-ui/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── lib-utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-helper/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-init-inline-config/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-init-inline-config-existing/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── command-install-shortcut/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── command-pack/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ ├── hello.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── command-pack-external/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ └── steps.json │ │ │ ├── command-pack-monorepo/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── array-config/ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ ├── src/ │ │ │ │ │ │ │ └── sub/ │ │ │ │ │ │ │ ├── hello.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── vite.config.ts │ │ │ │ │ ├── default-config/ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── src/ │ │ │ │ │ │ ├── hello.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── hello/ │ │ │ │ │ ├── package.json │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── hello.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── vite.config.ts │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── command-pack-no-input/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-preview/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-run-with-vp-config/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-version/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-vp-alias/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── exit-code/ │ │ │ │ ├── failure.js │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── fingerprint-ignore-test/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── fmt-check-with-vite-config/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── valid.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── fmt-ignore-patterns/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ ├── ignored/ │ │ │ │ │ │ └── badly-formatted.js │ │ │ │ │ └── valid.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── ignore_dist/ │ │ │ │ ├── .gitignore │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── lint-ignore-patterns/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ ├── ignored/ │ │ │ │ │ │ └── has-error.js │ │ │ │ │ └── valid.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── lint-vite-config-rules/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ ├── has-console.js │ │ │ │ │ └── valid.js │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── npm-install-with-options/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── oxlint-typeaware/ │ │ │ │ ├── .gitignore │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ ├── types.ts │ │ │ │ └── vite.config.ts │ │ │ ├── pass-no-color-env/ │ │ │ │ ├── check.js │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── plain-terminal-ui/ │ │ │ │ ├── hello.mjs │ │ │ │ ├── input.txt │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ ├── subfolder/ │ │ │ │ │ └── hello.mjs │ │ │ │ └── vite.config.ts │ │ │ ├── plain-terminal-ui-nested/ │ │ │ │ ├── .gitignore │ │ │ │ ├── a.ts │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── run-task-command-conflict/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── synthetic-build-cache-disabled/ │ │ │ │ ├── index.html │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── synthetic-dev-cache-disabled/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── task-config-cwd/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ ├── subfolder/ │ │ │ │ │ └── a.js │ │ │ │ └── vite.config.ts │ │ │ ├── test-nested-tasks/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── vite-config-task/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── vite-task-path-env-include-pm/ │ │ │ │ ├── main.js │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── vitest-browser-mode/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ ├── bar.js │ │ │ │ │ ├── foo.js │ │ │ │ │ └── foo.test.js │ │ │ │ ├── steps.json │ │ │ │ ├── vite.config.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── vp-run-expansion/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── workspace-lint-subpackage/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── app-a/ │ │ │ │ │ ├── package.json │ │ │ │ │ ├── src/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── vite.config.ts │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── workspace-root-vite-config/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app-a/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── package.json │ │ │ │ │ └── app-b/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ └── yarn-install-with-options/ │ │ │ ├── package.json │ │ │ ├── snap.txt │ │ │ ├── steps.json │ │ │ └── vite.config.ts │ │ ├── snap-tests-global/ │ │ │ ├── cli-helper-message/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-npm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-npm11/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-npm11-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-pnpm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-pnpm9/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-pnpm9-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-add-yarn4-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-cache-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-cache-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-cache-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-check-help/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-custom-dir-hook-path/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-help/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-no-agent-writes/ │ │ │ │ ├── CLAUDE.md │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-npm10/ │ │ │ │ ├── .npmrc │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-prepare-auto-hooks/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-replace-husky-hookspath/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-update-agents/ │ │ │ │ ├── AGENTS.md │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-yarn1/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-config-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-create-help/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-dedupe-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-dedupe-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-dedupe-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-dlx-no-package-json/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-dlx-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-dlx-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-dlx-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-exec/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-exec-shim-mode/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-install-conflict/ │ │ │ │ ├── conflict-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-install-fail/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-install-no-arg/ │ │ │ │ ├── .node-version │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-install-no-arg-fail/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-install-node-version/ │ │ │ │ ├── command-env-install-node-version-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-install-version-alias/ │ │ │ │ ├── command-env-install-version-alias-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-use/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-env-which/ │ │ │ │ ├── .node-version │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-exec/ │ │ │ │ ├── package.json │ │ │ │ ├── setup-bin.js │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-fmt-help/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-install-auto-create-package-json/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-install-bug-31/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-link-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-link-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-link-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-lint-help/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-list-no-package-json/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-list-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-list-npm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-list-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-list-pnpm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-list-yarn1/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-list-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-outdated-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-outdated-npm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-outdated-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-outdated-pnpm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-outdated-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-owner-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-owner-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-owner-yarn1/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-owner-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-pack-exe/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── command-pack-exe-error/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── command-pack-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-pack-npm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-pack-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-pack-pnpm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-pack-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-pack-yarn4-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-pm-no-package-json/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-prune-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-prune-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-prune-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-publish-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-publish-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-publish-yarn1/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-publish-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-remove-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-remove-npm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-remove-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-remove-pnpm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-remove-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-remove-yarn4-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-run-without-vite-plus/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-staged-broken-config/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-staged-help/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-staged-no-config/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-staged-with-config/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── command-unlink-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-unlink-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-unlink-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-update-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-update-npm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-update-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-update-pnpm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-update-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-update-yarn4-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-upgrade-check/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-upgrade-rollback/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-version-no-side-effects/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-version-with-env/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-view-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-view-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-view-yarn1/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-view-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-vpx-no-package-json/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-vpx-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-why-npm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-why-npm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-why-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-why-pnpm10-with-workspace/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── command-why-yarn4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── create-from-monorepo-subdir/ │ │ │ │ ├── apps/ │ │ │ │ │ └── website/ │ │ │ │ │ └── package.json │ │ │ │ ├── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── scripts/ │ │ │ │ │ └── helper/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── create-from-nonworkspace-subdir/ │ │ │ │ ├── package.json │ │ │ │ ├── scripts/ │ │ │ │ │ └── .keep │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── create-generator-outside-monorepo/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── create-missing-typecheck/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── delegate-respects-default-node-version/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── dev-engines-runtime-pnpm10/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── env-install-binary-conflict/ │ │ │ │ ├── .node-version │ │ │ │ ├── env-binary-conflict-pkg-a/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── env-binary-conflict-pkg-b/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── fallback-all-invalid-to-user-default/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── fallback-invalid-engines-to-dev-engines/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── global-cli-fallback/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-add-git-hooks/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-agent-claude/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ └── steps.json │ │ │ ├── migration-already-vite-plus/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-already-vite-plus-with-husky-hookspath/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-already-vite-plus-with-husky-lint-staged/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-auto-create-vite-config/ │ │ │ │ ├── .oxfmtrc.json │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-baseurl-tsconfig/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── tsconfig.json │ │ │ ├── migration-chained-lint-staged-pre-commit/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-check/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-composed-husky-custom-dir/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-composed-husky-prepare/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-env-prefix-lint-staged/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint/ │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-legacy/ │ │ │ │ ├── .eslintrc │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-legacy-already-vite-plus/ │ │ │ │ ├── .eslintrc │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-lint-staged/ │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-lint-staged-mjs/ │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── lint-staged.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-lintstagedrc/ │ │ │ │ ├── .lintstagedrc.json │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-monorepo/ │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-monorepo-package-only/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── app/ │ │ │ │ │ ├── eslint.config.mjs │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-npx-wrapper/ │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-rerun/ │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-rerun-dual-config/ │ │ │ │ ├── .eslintrc │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-eslint-rerun-mjs/ │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.mjs │ │ │ ├── migration-existing-husky/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-existing-husky-lint-staged/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-existing-husky-v8-hooks/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-existing-husky-v8-multi-hooks/ │ │ │ │ ├── .husky/ │ │ │ │ │ ├── commit-msg │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-existing-lint-staged-config/ │ │ │ │ ├── .lintstagedrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-existing-pnpm-exec-lint-staged/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-existing-pre-commit/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-existing-prepare-script/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-from-tsdown/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ └── tsdown.config.ts │ │ │ ├── migration-from-tsdown-json-config/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ ├── tsdown.config.json │ │ │ │ └── vite.config.ts │ │ │ ├── migration-from-vitest-config/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vitest.config.ts │ │ │ ├── migration-from-vitest-files/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── test/ │ │ │ │ └── hello.ts │ │ │ ├── migration-hooks-skip-on-existing-hookspath/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-husky-env-skip/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-husky-or-prepare/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-husky-semicolon-prepare/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-husky-v8-preserves-lint-staged/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-lint-staged-in-scripts/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-lint-staged-merge-fail/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── migration-lint-staged-ts-config/ │ │ │ │ ├── lint-staged.config.ts │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-lintstagedrc-json/ │ │ │ │ ├── .lintstagedrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-lintstagedrc-merge-fail/ │ │ │ │ ├── .lintstagedrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── migration-lintstagedrc-not-support/ │ │ │ │ ├── .lintstagedrc │ │ │ │ ├── .lintstagedrc.yaml │ │ │ │ ├── lint-staged.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-lintstagedrc-staged-exists/ │ │ │ │ ├── .lintstagedrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── migration-merge-vite-config-js/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.js │ │ │ ├── migration-merge-vite-config-ts/ │ │ │ │ ├── .oxfmtrc.json │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── migration-monorepo-husky-v8-preserves-lint-staged/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── app/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-monorepo-pnpm/ │ │ │ │ ├── .oxfmtrc.json │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── only-oxlint/ │ │ │ │ │ │ ├── .oxlintrc.json │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── migration-monorepo-pnpm-overrides-dependency-selector/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── app/ │ │ │ │ │ └── package.json │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── migration-monorepo-skip-vite-peer-dependency/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── vite-plugin/ │ │ │ │ │ ├── package.json │ │ │ │ │ └── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-monorepo-yarn4/ │ │ │ │ ├── .oxlintrc.json │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── package.json │ │ │ │ │ └── utils/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── steps.json │ │ │ │ └── vite.config.ts │ │ │ ├── migration-no-agent/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ └── steps.json │ │ │ ├── migration-no-git-repo/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-no-hooks/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-no-hooks-with-husky/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-not-supported-npm8.2/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-not-supported-pnpm9.4/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-not-supported-vite6/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-not-supported-vitest3/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-other-hook-tool/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-partially-migrated-pre-commit/ │ │ │ │ ├── .husky/ │ │ │ │ │ └── pre-commit │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-pre-commit-env-setup/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-prettier/ │ │ │ │ ├── .prettierrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-prettier-eslint-combo/ │ │ │ │ ├── .prettierrc.json │ │ │ │ ├── eslint.config.mjs │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-prettier-ignore-unknown/ │ │ │ │ ├── .prettierrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-prettier-lint-staged/ │ │ │ │ ├── .prettierrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-prettier-pkg-json/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-prettier-rerun/ │ │ │ │ ├── .prettierrc.json │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-rewrite-declare-module/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ └── steps.json │ │ │ ├── migration-rewrite-reference-types/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── env.d.ts │ │ │ │ └── steps.json │ │ │ ├── migration-skip-vite-dependency/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ └── steps.json │ │ │ ├── migration-skip-vite-peer-dependency/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ └── steps.json │ │ │ ├── migration-standalone-npm/ │ │ │ │ ├── .gitignore │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-subpath/ │ │ │ │ ├── foo/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── migration-vite-version/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── new-check/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── new-create-vite/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── new-create-vite-directory-dot/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── new-create-vite-with-scope-name/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── new-vite-monorepo/ │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-install-already-linked/ │ │ │ │ ├── .node-version │ │ │ │ ├── npm-global-linked-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-install-custom-prefix/ │ │ │ │ ├── npm-global-custom-prefix-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-install-custom-prefix-on-path/ │ │ │ │ ├── npm-global-on-path-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-install-dot/ │ │ │ │ ├── npm-global-dot-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-install-hint/ │ │ │ │ ├── npm-global-hint-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-uninstall-link-cleanup/ │ │ │ │ ├── npm-global-uninstall-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-uninstall-preexisting-binary/ │ │ │ │ ├── npm-global-preexist-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-uninstall-prefix/ │ │ │ │ ├── npm-global-prefix-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-uninstall-shared-bin-name/ │ │ │ │ ├── pkg-a/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── pkg-b/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── npm-global-uninstall-vp-managed/ │ │ │ │ ├── npm-global-vp-managed-pkg/ │ │ │ │ │ ├── cli.js │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── shim-inherits-parent-dev-engines-runtime/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── app/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── shim-inherits-parent-engines-node/ │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── app/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── shim-inherits-parent-node-version/ │ │ │ │ ├── .node-version │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ └── app/ │ │ │ │ │ └── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── shim-pnpm-uses-project-node-version/ │ │ │ │ ├── .node-version │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── shim-recursive-npm-run/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ └── shim-recursive-package-binary/ │ │ │ ├── .node-version │ │ │ ├── recursive-cli-pkg/ │ │ │ │ ├── cli.js │ │ │ │ └── package.json │ │ │ ├── snap.txt │ │ │ └── steps.json │ │ ├── snap-tests-todo/ │ │ │ ├── command-pack-watch-restart/ │ │ │ │ ├── kill-watch.sh │ │ │ │ ├── package.json │ │ │ │ ├── run-watch.sh │ │ │ │ ├── snap.txt │ │ │ │ ├── src/ │ │ │ │ │ └── index.ts │ │ │ │ ├── steps.json │ │ │ │ ├── vite.config.ts │ │ │ │ ├── wait-for-dist.sh │ │ │ │ └── wait-for-dist2.sh │ │ │ ├── exit-non-zero-on-cmd-not-exists/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ ├── pnpm-install-with-options/ │ │ │ │ ├── package.json │ │ │ │ ├── snap.txt │ │ │ │ └── steps.json │ │ │ └── test-panicked-fix/ │ │ │ ├── package.json │ │ │ ├── snap.txt │ │ │ └── steps.json │ │ ├── src/ │ │ │ ├── __tests__/ │ │ │ │ ├── index.spec.ts │ │ │ │ ├── init-config.spec.ts │ │ │ │ ├── pack.spec.ts │ │ │ │ └── resolve-vite-config.spec.ts │ │ │ ├── bin.ts │ │ │ ├── config/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── hooks.spec.ts │ │ │ │ ├── bin.ts │ │ │ │ └── hooks.ts │ │ │ ├── create/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── utils.spec.ts.snap │ │ │ │ │ ├── discovery.spec.ts │ │ │ │ │ ├── initial-template-options.spec.ts │ │ │ │ │ ├── prompts.spec.ts │ │ │ │ │ └── utils.spec.ts │ │ │ │ ├── bin.ts │ │ │ │ ├── command.ts │ │ │ │ ├── discovery.ts │ │ │ │ ├── initial-template-options.ts │ │ │ │ ├── prompts.ts │ │ │ │ ├── random-name.ts │ │ │ │ ├── templates/ │ │ │ │ │ ├── builtin.ts │ │ │ │ │ ├── generator.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── monorepo.ts │ │ │ │ │ ├── remote.ts │ │ │ │ │ └── types.ts │ │ │ │ └── utils.ts │ │ │ ├── define-config.ts │ │ │ ├── index.cts │ │ │ ├── index.ts │ │ │ ├── init-config.ts │ │ │ ├── lint.ts │ │ │ ├── mcp/ │ │ │ │ └── bin.ts │ │ │ ├── migration/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── migrator.spec.ts.snap │ │ │ │ │ ├── compat.spec.ts │ │ │ │ │ └── migrator.spec.ts │ │ │ │ ├── bin.ts │ │ │ │ ├── compat.ts │ │ │ │ ├── detector.ts │ │ │ │ ├── migrator.ts │ │ │ │ └── report.ts │ │ │ ├── pack-bin.ts │ │ │ ├── pack.ts │ │ │ ├── resolve-doc.ts │ │ │ ├── resolve-fmt.ts │ │ │ ├── resolve-lint.ts │ │ │ ├── resolve-pack.ts │ │ │ ├── resolve-test.ts │ │ │ ├── resolve-vite-config.ts │ │ │ ├── resolve-vite.ts │ │ │ ├── run-config.ts │ │ │ ├── staged/ │ │ │ │ └── bin.ts │ │ │ ├── staged-config.ts │ │ │ ├── types/ │ │ │ │ ├── index.ts │ │ │ │ ├── package.ts │ │ │ │ └── workspace.ts │ │ │ ├── utils/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── agent.spec.ts │ │ │ │ │ ├── editor.spec.ts │ │ │ │ │ ├── help.spec.ts │ │ │ │ │ └── package.spec.ts │ │ │ │ ├── agent.ts │ │ │ │ ├── command.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── editor.ts │ │ │ │ ├── help.ts │ │ │ │ ├── json.ts │ │ │ │ ├── package.ts │ │ │ │ ├── path.ts │ │ │ │ ├── prompts.ts │ │ │ │ ├── skills.ts │ │ │ │ ├── terminal.ts │ │ │ │ ├── tsconfig.ts │ │ │ │ ├── types.ts │ │ │ │ ├── workspace.ts │ │ │ │ └── yaml.ts │ │ │ └── version.ts │ │ ├── templates/ │ │ │ ├── generator/ │ │ │ │ ├── README.md │ │ │ │ ├── bin/ │ │ │ │ │ └── index.ts │ │ │ │ ├── package.json │ │ │ │ ├── src/ │ │ │ │ │ └── template.ts │ │ │ │ └── tsconfig.json │ │ │ └── monorepo/ │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── _yarnrc.yml │ │ │ ├── package.json │ │ │ ├── pnpm-workspace.yaml │ │ │ ├── tsconfig.json │ │ │ └── vite.config.ts │ │ └── tsconfig.json │ ├── core/ │ │ ├── .gitignore │ │ ├── BUNDLING.md │ │ ├── __tests__/ │ │ │ └── build-artifacts.spec.ts │ │ ├── build-support/ │ │ │ ├── build-cjs-deps.ts │ │ │ ├── find-create-require.ts │ │ │ ├── rewrite-imports.ts │ │ │ └── rewrite-module-specifiers.ts │ │ ├── build.ts │ │ ├── package.json │ │ └── tsconfig.json │ ├── prompts/ │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ ├── __tests__/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── render.spec.ts.snap │ │ │ │ └── render.spec.ts │ │ │ ├── autocomplete.ts │ │ │ ├── box.ts │ │ │ ├── common.ts │ │ │ ├── confirm.ts │ │ │ ├── group-multi-select.ts │ │ │ ├── group.ts │ │ │ ├── index.ts │ │ │ ├── limit-options.ts │ │ │ ├── log.ts │ │ │ ├── messages.ts │ │ │ ├── multi-select.ts │ │ │ ├── note.ts │ │ │ ├── password.ts │ │ │ ├── path.ts │ │ │ ├── progress-bar.ts │ │ │ ├── select-key.ts │ │ │ ├── select.ts │ │ │ ├── spinner.ts │ │ │ ├── stream.ts │ │ │ ├── task-log.ts │ │ │ ├── task.ts │ │ │ └── text.ts │ │ └── tsdown.config.ts │ ├── test/ │ │ ├── .gitignore │ │ ├── BUNDLING.md │ │ ├── __tests__/ │ │ │ └── build-artifacts.spec.ts │ │ ├── build.ts │ │ ├── package.json │ │ └── tsconfig.json │ └── tools/ │ ├── .upstream-versions.json │ ├── README.md │ ├── package.json │ ├── snap-tests/ │ │ ├── json-sort/ │ │ │ ├── array.json │ │ │ ├── snap.txt │ │ │ └── steps.json │ │ └── replace-file-content/ │ │ ├── foo/ │ │ │ └── example.toml │ │ ├── snap.txt │ │ └── steps.json │ └── src/ │ ├── __tests__/ │ │ ├── __snapshots__/ │ │ │ └── utils.spec.ts.snap │ │ └── utils.spec.ts │ ├── bin.js │ ├── brand-vite.ts │ ├── index.ts │ ├── install-global-cli.ts │ ├── json-edit.ts │ ├── json-sort.ts │ ├── merge-peer-deps.ts │ ├── replace-file-content.ts │ ├── snap-test.ts │ ├── sync-remote-deps.ts │ └── utils.ts ├── pnpm-workspace.yaml ├── rfcs/ │ ├── add-remove-package-commands.md │ ├── check-command.md │ ├── cli-output-polish.md │ ├── cli-tips.md │ ├── code-generator.md │ ├── config-and-staged-commands.md │ ├── dedupe-package-command.md │ ├── dlx-command.md │ ├── env-command.md │ ├── exec-command.md │ ├── global-cli-rust-binary.md │ ├── implode-command.md │ ├── init-editor-configs.md │ ├── install-command.md │ ├── js-runtime.md │ ├── link-unlink-package-commands.md │ ├── merge-global-and-local-cli.md │ ├── migration-command.md │ ├── outdated-package-command.md │ ├── pack-command.md │ ├── pm-command-group.md │ ├── run-without-vite-plus-dependency.md │ ├── split-global-cli.md │ ├── trampoline-exe-for-shims.md │ ├── update-package-command.md │ ├── upgrade-command.md │ ├── vpx-command.md │ └── why-package-command.md ├── rust-toolchain.toml ├── scripts/ │ └── generate-license.ts ├── tmp/ │ └── .gitignore ├── tsconfig.json └── vite.config.ts
Showing preview only (291K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2976 symbols across 273 files)
FILE: .github/scripts/upgrade-deps.mjs
constant ROOT (line 4) | const ROOT = process.cwd();
function getLatestTagCommit (line 7) | async function getLatestTagCommit(owner, repo) {
function getLatestNpmVersion (line 29) | async function getLatestNpmVersion(packageName) {
function updateUpstreamVersions (line 44) | async function updateUpstreamVersions() {
function updatePnpmWorkspace (line 59) | async function updatePnpmWorkspace(versions) {
function updateTestPackage (line 102) | async function updateTestPackage(vitestVersion) {
function updateCorePackage (line 128) | async function updateCorePackage(devtoolsVersion) {
FILE: bench/benches/workspace_load.rs
type NoOpCommandHandler (line 14) | struct NoOpCommandHandler;
method handle_command (line 18) | async fn handle_command(
type NoOpUserConfigLoader (line 28) | struct NoOpUserConfigLoader;
method load_user_config_file (line 32) | async fn load_user_config_file(
type BenchSessionConfig (line 42) | struct BenchSessionConfig {
method as_callbacks (line 48) | fn as_callbacks(&mut self) -> SessionConfig<'_> {
function bench_workspace_load (line 57) | fn bench_workspace_load(c: &mut Criterion) {
FILE: bench/generate-monorepo.ts
type Package (line 5) | interface Package {
class MonorepoGenerator (line 14) | class MonorepoGenerator {
method constructor (line 22) | constructor(private rootDir: string) {}
method getRandomInt (line 24) | private getRandomInt(min: number, max: number): number {
method getRandomElement (line 28) | private getRandomElement<T>(arr: T[]): T {
method generatePackageName (line 32) | private generatePackageName(index: number): string {
method generateScriptCommand (line 38) | private generateScriptCommand(scriptName: string, packageName: string)...
method generateScripts (line 61) | private generateScripts(packageName: string): Record<string, string> {
method selectDependencies (line 79) | private selectDependencies(currentIndex: number, availablePackages: st...
method generatePackages (line 114) | private generatePackages(): void {
method addTransitiveScriptDependencies (line 144) | private addTransitiveScriptDependencies(): void {
method writePackage (line 171) | private writePackage(pkg: Package): void {
method generate (line 228) | public generate(): void {
method printStatistics (line 308) | private printStatistics(): void {
FILE: crates/vite_command/src/lib.rs
type FspyCommandResult (line 14) | pub struct FspyCommandResult {
function resolve_bin (line 25) | pub fn resolve_bin(
function build_command (line 46) | pub fn build_command(bin_path: &AbsolutePath, cwd: &AbsolutePath) -> Com...
function build_shell_command (line 63) | pub fn build_shell_command(shell_cmd: &str, cwd: &AbsolutePath) -> Comma...
function run_command (line 103) | pub async fn run_command<I, S>(
function run_command_with_fspy (line 134) | pub async fn run_command_with_fspy<I, S>(
function fix_stdio_streams (line 199) | pub fn fix_stdio_streams() {
function create_temp_dir (line 239) | fn create_temp_dir() -> TempDir {
function test_run_command_and_find_binary_path (line 248) | async fn test_run_command_and_find_binary_path() {
function test_run_command_and_not_find_binary_path (line 262) | async fn test_run_command_and_not_find_binary_path() {
function test_run_command_with_fspy (line 284) | async fn test_run_command_with_fspy() {
function test_run_command_with_fspy_and_capture_path_accesses_write_file (line 302) | async fn test_run_command_with_fspy_and_capture_path_accesses_write_file...
function test_run_command_with_fspy_and_capture_path_accesses_write_and_read_file (line 337) | async fn test_run_command_with_fspy_and_capture_path_accesses_write_and_...
function test_run_command_with_fspy_and_not_find_binary_path (line 371) | async fn test_run_command_with_fspy_and_not_find_binary_path() {
FILE: crates/vite_error/src/lib.rs
type Error (line 8) | pub enum Error {
FILE: crates/vite_global_cli/src/cli.rs
type RenderOptions (line 24) | pub struct RenderOptions {
method default (line 29) | fn default() -> Self {
type Args (line 44) | pub struct Args {
type Commands (line 55) | pub enum Commands {
type EnvArgs (line 722) | pub struct EnvArgs {
type EnvSubcommands (line 730) | pub enum EnvSubcommands {
type SortingMethod (line 882) | pub enum SortingMethod {
type PmCommands (line 892) | pub enum PmCommands {
type ConfigCommands (line 1245) | pub enum ConfigCommands {
type OwnerCommands (line 1317) | pub enum OwnerCommands {
type TokenCommands (line 1356) | pub enum TokenCommands {
type DistTagCommands (line 1413) | pub enum DistTagCommands {
function determine_save_dependency_type (line 1441) | fn determine_save_dependency_type(
function has_flag_before_terminator (line 1460) | fn has_flag_before_terminator(args: &[String], flag: &str) -> bool {
function should_force_global_delegate (line 1472) | fn should_force_global_delegate(command: &str, args: &[String]) -> bool {
function run_command (line 1484) | pub async fn run_command(cwd: AbsolutePathBuf, args: Args) -> Result<Exi...
function run_command_with_options (line 1489) | pub async fn run_command_with_options(
function exit_status (line 1980) | pub(crate) fn exit_status(code: i32) -> ExitStatus {
function print_runtime_header (line 1993) | fn print_runtime_header(show_header: bool) {
function command_with_help (line 2002) | pub fn command_with_help() -> clap::Command {
function command_with_help_with_options (line 2007) | pub fn command_with_help_with_options(render_options: RenderOptions) -> ...
function apply_custom_help (line 2012) | fn apply_custom_help(cmd: clap::Command, render_options: RenderOptions) ...
function try_parse_args_from (line 2027) | pub fn try_parse_args_from(
function try_parse_args_from_with_options (line 2035) | pub fn try_parse_args_from_with_options(
function detects_flag_before_option_terminator (line 2049) | fn detects_flag_before_option_terminator() {
function ignores_flag_after_option_terminator (line 2057) | fn ignores_flag_after_option_terminator() {
function lint_init_forces_global_delegate (line 2065) | fn lint_init_forces_global_delegate() {
function fmt_migrate_forces_global_delegate (line 2070) | fn fmt_migrate_forces_global_delegate() {
function non_init_does_not_force_global_delegate (line 2075) | fn non_init_does_not_force_global_delegate() {
FILE: crates/vite_global_cli/src/command_picker.rs
constant NEWLINE (line 19) | const NEWLINE: &str = "\r\n";
constant SELECTED_COLOR (line 20) | const SELECTED_COLOR: crossterm::style::Color = crossterm::style::Color:...
constant SELECTED_MARKER (line 21) | const SELECTED_MARKER: &str = "›";
constant UNSELECTED_MARKER (line 22) | const UNSELECTED_MARKER: &str = " ";
type PickedCommand (line 25) | pub struct PickedCommand {
type TopLevelCommandPick (line 31) | pub enum TopLevelCommandPick {
type CommandEntry (line 38) | struct CommandEntry {
constant COMMANDS (line 45) | const COMMANDS: &[CommandEntry] = &[
constant CI_ENV_VARS (line 117) | const CI_ENV_VARS: &[&str] = &[
function pick_top_level_command_if_interactive (line 131) | pub fn pick_top_level_command_if_interactive(
function should_enable_picker (line 146) | fn should_enable_picker() -> bool {
function is_ci_environment (line 153) | fn is_ci_environment() -> bool {
function run_picker (line 157) | fn run_picker(command_order: &[usize]) -> io::Result<Option<PickedComman...
function cleanup_picker (line 236) | fn cleanup_picker(stdout: &mut io::Stdout) -> io::Result<()> {
function handle_key_event (line 242) | fn handle_key_event(
function render_picker (line 295) | fn render_picker(
function picker_instruction (line 443) | fn picker_instruction(query: &str) -> String {
function compute_viewport_size (line 447) | fn compute_viewport_size(
function align_viewport (line 455) | fn align_viewport(current_start: usize, selected_index: usize, viewport_...
function truncate_line (line 465) | fn truncate_line(line: &str, max_chars: usize) -> String {
function selected_command_parts (line 482) | fn selected_command_parts(
function default_command_order (line 501) | fn default_command_order(prioritize_run: bool) -> Vec<usize> {
function filtered_command_indices (line 523) | fn filtered_command_indices(query: &str, command_order: &[usize]) -> Vec...
function commands_are_unique (line 563) | fn commands_are_unique() {
function commands_with_required_args_default_to_help (line 571) | fn commands_with_required_args_default_to_help() {
function viewport_aligns_to_selected_row (line 583) | fn viewport_aligns_to_selected_row() {
function viewport_size_is_clamped (line 591) | fn viewport_size_is_clamped() {
function filtering_is_case_insensitive_and_returns_matching_commands_only (line 601) | fn filtering_is_case_insensitive_and_returns_matching_commands_only() {
function filtering_with_no_matches_returns_empty (line 613) | fn filtering_with_no_matches_returns_empty() {
function filtering_prefers_prefix_matches (line 620) | fn filtering_prefers_prefix_matches() {
function default_order_puts_create_first_for_non_vite_plus_projects (line 628) | fn default_order_puts_create_first_for_non_vite_plus_projects() {
function default_order_puts_run_first_for_vite_plus_projects (line 634) | fn default_order_puts_run_first_for_vite_plus_projects() {
function default_order_hides_migrate_for_vite_plus_projects (line 640) | fn default_order_hides_migrate_for_vite_plus_projects() {
function selected_command_parts_appends_summary (line 648) | fn selected_command_parts_appends_summary() {
function selected_command_parts_truncates_summary_to_fit_width (line 655) | fn selected_command_parts_truncates_summary_to_fit_width() {
function selected_command_parts_truncates_label_when_width_is_tight (line 662) | fn selected_command_parts_truncates_label_when_width_is_tight() {
function help_entry_uses_static_inline_description (line 669) | fn help_entry_uses_static_inline_description() {
function picker_instruction_mentions_search (line 679) | fn picker_instruction_mentions_search() {
FILE: crates/vite_global_cli/src/commands/add.rs
type AddCommand (line 16) | pub struct AddCommand {
method new (line 21) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 25) | pub async fn execute(
function test_add_command_new (line 66) | fn test_add_command_new() {
FILE: crates/vite_global_cli/src/commands/config.rs
function execute (line 10) | pub async fn execute(cwd: AbsolutePathBuf, args: &[String]) -> Result<Ex...
FILE: crates/vite_global_cli/src/commands/create.rs
function execute (line 10) | pub async fn execute(cwd: AbsolutePathBuf, args: &[String]) -> Result<Ex...
function test_create_command_module_exists (line 17) | fn test_create_command_module_exists() {
FILE: crates/vite_global_cli/src/commands/dedupe.rs
type DedupeCommand (line 13) | pub struct DedupeCommand {
method new (line 18) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 22) | pub async fn execute(
function test_dedupe_command_new (line 41) | fn test_dedupe_command_new() {
FILE: crates/vite_global_cli/src/commands/delegate.rs
function execute (line 10) | pub async fn execute(
function execute_global (line 22) | pub async fn execute_global(
function test_delegate_command_module_exists (line 36) | fn test_delegate_command_module_exists() {
FILE: crates/vite_global_cli/src/commands/dlx.rs
type DlxCommand (line 23) | pub struct DlxCommand {
method new (line 28) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 32) | pub async fn execute(
function test_dlx_command_new (line 77) | fn test_dlx_command_new() {
FILE: crates/vite_global_cli/src/commands/env/bin_config.rs
type BinSource (line 19) | pub enum BinSource {
type BinConfig (line 30) | pub struct BinConfig {
method new (line 46) | pub fn new(name: String, package: String, version: String, node_versio...
method new_npm (line 51) | pub fn new_npm(name: String, package: String, node_version: String) ->...
method bins_dir (line 56) | pub fn bins_dir() -> Result<AbsolutePathBuf, Error> {
method path (line 61) | pub fn path(bin_name: &str) -> Result<AbsolutePathBuf, Error> {
method load_sync (line 66) | pub fn load_sync(bin_name: &str) -> Result<Option<Self>, Error> {
method save_sync (line 81) | pub fn save_sync(&self) -> Result<(), Error> {
method delete_sync (line 94) | pub fn delete_sync(bin_name: &str) -> Result<(), Error> {
method load (line 104) | pub async fn load(bin_name: &str) -> Result<Option<Self>, Error> {
method save (line 116) | pub async fn save(&self) -> Result<(), Error> {
method delete (line 132) | pub async fn delete(bin_name: &str) -> Result<(), Error> {
method find_by_package (line 144) | pub async fn find_by_package(package_name: &str) -> Result<Vec<String>...
function test_save_and_load (line 177) | async fn test_save_and_load() {
function test_find_by_package (line 201) | async fn test_find_by_package() {
function test_delete (line 248) | async fn test_delete() {
function test_load_nonexistent (line 278) | async fn test_load_nonexistent() {
function test_source_defaults_to_vp (line 289) | fn test_source_defaults_to_vp() {
function test_new_npm_source (line 300) | fn test_new_npm_source() {
function test_source_backward_compat_deserialize (line 314) | fn test_source_backward_compat_deserialize() {
function test_sync_save_load_delete (line 323) | fn test_sync_save_load_delete() {
FILE: crates/vite_global_cli/src/commands/env/config.rs
constant CONFIG_FILE (line 17) | const CONFIG_FILE: &str = "config.json";
type ShimMode (line 22) | pub enum ShimMode {
type Config (line 33) | pub struct Config {
function is_default_shim_mode (line 43) | fn is_default_shim_mode(mode: &ShimMode) -> bool {
type VersionResolution (line 49) | pub struct VersionResolution {
function get_vite_plus_home (line 66) | pub fn get_vite_plus_home() -> Result<AbsolutePathBuf, Error> {
function get_bin_dir (line 71) | pub fn get_bin_dir() -> Result<AbsolutePathBuf, Error> {
function get_packages_dir (line 76) | pub fn get_packages_dir() -> Result<AbsolutePathBuf, Error> {
function get_tmp_dir (line 81) | pub fn get_tmp_dir() -> Result<AbsolutePathBuf, Error> {
function get_node_modules_dir (line 93) | pub fn get_node_modules_dir(prefix: &AbsolutePath, package_name: &str) -...
function get_config_path (line 118) | pub fn get_config_path() -> Result<AbsolutePathBuf, Error> {
function load_config (line 123) | pub async fn load_config() -> Result<Config, Error> {
function save_config (line 136) | pub async fn save_config(config: &Config) -> Result<(), Error> {
constant VERSION_ENV_VAR (line 150) | pub const VERSION_ENV_VAR: &str = vite_shared::env_vars::VITE_PLUS_NODE_...
constant SESSION_VERSION_FILE (line 153) | pub const SESSION_VERSION_FILE: &str = ".session-node-version";
function get_session_version_path (line 156) | pub fn get_session_version_path() -> Result<AbsolutePathBuf, Error> {
function read_session_version (line 161) | pub async fn read_session_version() -> Option<String> {
function read_session_version_sync (line 169) | pub fn read_session_version_sync() -> Option<String> {
function write_session_version (line 177) | pub async fn write_session_version(version: &str) -> Result<(), Error> {
function delete_session_version (line 188) | pub async fn delete_session_version() -> Result<(), Error> {
function resolve_version (line 207) | pub async fn resolve_version(cwd: &AbsolutePath) -> Result<VersionResolu...
function resolve_version_from_files (line 239) | pub async fn resolve_version_from_files(cwd: &AbsolutePath) -> Result<Ve...
function resolve_version_string (line 356) | async fn resolve_version_string(version: &str, provider: &NodeProvider) ...
function resolve_version_alias (line 384) | pub async fn resolve_version_alias(
function test_get_node_modules_dir_probes_unix_layout (line 428) | fn test_get_node_modules_dir_probes_unix_layout() {
function test_get_node_modules_dir_probes_windows_layout (line 445) | fn test_get_node_modules_dir_probes_windows_layout() {
function test_get_node_modules_dir_prefers_unix_layout_when_both_exist (line 463) | fn test_get_node_modules_dir_prefers_unix_layout_when_both_exist() {
function test_get_node_modules_dir_returns_platform_default_when_neither_exists (line 483) | fn test_get_node_modules_dir_returns_platform_default_when_neither_exist...
function test_get_node_modules_dir_handles_scoped_packages (line 507) | fn test_get_node_modules_dir_handles_scoped_packages() {
function test_resolve_version_from_node_version_file (line 524) | async fn test_resolve_version_from_node_version_file() {
function test_resolve_version_walks_up_directory (line 539) | async fn test_resolve_version_walks_up_directory() {
function test_resolve_version_from_engines_node (line 557) | async fn test_resolve_version_from_engines_node() {
function test_resolve_version_from_dev_engines (line 578) | async fn test_resolve_version_from_dev_engines() {
function test_resolve_version_node_version_takes_priority (line 598) | async fn test_resolve_version_node_version_takes_priority() {
function test_resolve_version_string_strips_v_prefix (line 615) | async fn test_resolve_version_string_strips_v_prefix() {
function test_resolve_version_alias_default_no_source_path (line 624) | async fn test_resolve_version_alias_default_no_source_path() {
function test_resolve_version_exact_default_has_source_path (line 645) | async fn test_resolve_version_exact_default_has_source_path() {
function test_resolve_version_invalid_node_version_falls_through_to_lts (line 666) | async fn test_resolve_version_invalid_node_version_falls_through_to_lts() {
function test_resolve_version_invalid_node_version_falls_through_to_default (line 687) | async fn test_resolve_version_invalid_node_version_falls_through_to_defa...
function test_resolve_version_invalid_node_version_falls_through_to_engines_node (line 711) | async fn test_resolve_version_invalid_node_version_falls_through_to_engi...
function test_resolve_version_invalid_node_version_falls_through_to_dev_engines (line 739) | async fn test_resolve_version_invalid_node_version_falls_through_to_dev_...
function test_resolve_version_invalid_engines_node_falls_through_to_dev_engines (line 767) | async fn test_resolve_version_invalid_engines_node_falls_through_to_dev_...
function test_resolve_version_latest_alias_in_node_version (line 791) | async fn test_resolve_version_latest_alias_in_node_version() {
function test_resolve_version_env_var_takes_priority (line 814) | async fn test_resolve_version_env_var_takes_priority() {
function test_env_var_source_accepted_by_install_validation (line 838) | async fn test_env_var_source_accepted_by_install_validation() {
function test_write_and_read_session_version (line 865) | async fn test_write_and_read_session_version() {
function test_read_session_version_returns_none_when_missing (line 884) | async fn test_read_session_version_returns_none_when_missing() {
function test_read_session_version_returns_none_for_empty_file (line 895) | async fn test_read_session_version_returns_none_for_empty_file() {
function test_read_session_version_trims_whitespace (line 916) | async fn test_read_session_version_trims_whitespace() {
function test_delete_session_version (line 933) | async fn test_delete_session_version() {
function test_delete_session_version_ignores_missing_file (line 948) | async fn test_delete_session_version_ignores_missing_file() {
function test_resolve_version_session_file_takes_priority_over_node_version (line 960) | async fn test_resolve_version_session_file_takes_priority_over_node_vers...
function test_resolve_version_env_var_takes_priority_over_session_file (line 986) | async fn test_resolve_version_env_var_takes_priority_over_session_file() {
function test_resolve_version_falls_through_when_no_session_file (line 1009) | async fn test_resolve_version_falls_through_when_no_session_file() {
function test_session_file_source_accepted_by_install_validation (line 1030) | async fn test_session_file_source_accepted_by_install_validation() {
function test_resolve_version_empty_env_var_is_ignored (line 1065) | async fn test_resolve_version_empty_env_var_is_ignored() {
function test_resolve_version_whitespace_env_var_is_ignored (line 1084) | async fn test_resolve_version_whitespace_env_var_is_ignored() {
function test_resolve_version_from_files_ignores_env_var (line 1107) | async fn test_resolve_version_from_files_ignores_env_var() {
function test_resolve_version_from_files_ignores_session_file (line 1127) | async fn test_resolve_version_from_files_ignores_session_file() {
function test_resolve_version_still_respects_overrides (line 1152) | async fn test_resolve_version_still_respects_overrides() {
FILE: crates/vite_global_cli/src/commands/env/current.rs
type CurrentEnvInfo (line 16) | struct CurrentEnvInfo {
type ToolPaths (line 26) | struct ToolPaths {
function accent (line 32) | fn accent(text: &str) -> String {
function print_rows (line 36) | fn print_rows(title: &str, rows: &[(&str, String)]) {
function execute (line 46) | pub async fn execute(cwd: AbsolutePathBuf, json: bool) -> Result<ExitSta...
FILE: crates/vite_global_cli/src/commands/env/default.rs
function execute (line 13) | pub async fn execute(_cwd: AbsolutePathBuf, version: Option<String>) -> ...
function show_default (line 21) | async fn show_default() -> Result<ExitStatus, Error> {
function set_default (line 59) | async fn set_default(version: &str) -> Result<ExitStatus, Error> {
function resolve_alias (line 99) | async fn resolve_alias(
FILE: crates/vite_global_cli/src/commands/env/doctor.rs
constant IDE_PROFILES (line 21) | const IDE_PROFILES: &[(&str, bool)] = &[(".zshenv", false), (".profile",...
constant IDE_PROFILES (line 25) | const IDE_PROFILES: &[(&str, bool)] = &[(".profile", false), (".zshenv",...
constant IDE_PROFILES (line 29) | const IDE_PROFILES: &[(&str, bool)] = &[(".profile", false)];
constant ALL_SHELL_PROFILES (line 36) | const ALL_SHELL_PROFILES: &[(&str, bool)] = &[
type EnvSourcingStatus (line 48) | enum EnvSourcingStatus {
constant KNOWN_VERSION_MANAGERS (line 58) | const KNOWN_VERSION_MANAGERS: &[(&str, &str)] = &[
constant SHIM_TOOLS (line 68) | const SHIM_TOOLS: &[&str] = &["node", "npm", "npx", "vpx"];
constant KEY_WIDTH (line 71) | const KEY_WIDTH: usize = 18;
function print_section (line 74) | fn print_section(name: &str) {
function print_check (line 83) | fn print_check(status: &str, key: &str, value: &str) {
function print_hint (line 94) | fn print_hint(text: &str) {
function abbreviate_home (line 99) | fn abbreviate_home(path: &str) -> String {
function execute (line 109) | pub async fn execute(cwd: AbsolutePathBuf) -> Result<ExitStatus, Error> {
function check_vite_plus_home (line 167) | async fn check_vite_plus_home() -> bool {
function check_bin_dir (line 197) | async fn check_bin_dir() -> bool {
function shim_filename (line 239) | fn shim_filename(tool: &str) -> String {
function check_shim_mode (line 253) | async fn check_shim_mode() {
function check_env_sourcing (line 296) | fn check_env_sourcing() -> EnvSourcingStatus {
function find_system_node (line 345) | fn find_system_node() -> Option<std::path::PathBuf> {
function check_session_override (line 374) | fn check_session_override() {
function check_path (line 400) | async fn check_path() -> bool {
function find_in_path (line 463) | fn find_in_path(name: &str) -> Option<std::path::PathBuf> {
function print_path_fix (line 469) | fn print_path_fix(bin_dir: &vite_path::AbsolutePath) {
function check_profile_files (line 516) | fn check_profile_files(vite_plus_home: &str, profile_files: &[(&str, boo...
function print_ide_setup_guidance (line 579) | fn print_ide_setup_guidance(bin_dir: &vite_path::AbsolutePath) {
function check_current_resolution (line 629) | async fn check_current_resolution(cwd: &AbsolutePathBuf) {
function check_conflicts (line 675) | fn check_conflicts() {
function test_shim_filename_consistency (line 733) | fn test_shim_filename_consistency() {
function create_fake_executable (line 758) | fn create_fake_executable(dir: &std::path::Path, name: &str) -> std::pat...
function create_fake_executable (line 767) | fn create_fake_executable(dir: &std::path::Path, name: &str) -> std::pat...
type EnvGuard (line 774) | struct EnvGuard {
method new (line 780) | fn new() -> Self {
method drop (line 789) | fn drop(&mut self) {
function test_find_system_node_skips_bypass_paths (line 805) | fn test_find_system_node_skips_bypass_paths() {
function test_find_system_node_returns_none_when_all_paths_bypassed (line 829) | fn test_find_system_node_returns_none_when_all_paths_bypassed() {
function test_abbreviate_home (line 847) | fn test_abbreviate_home() {
type ProfileEnvGuard (line 859) | struct ProfileEnvGuard {
method new (line 867) | fn new(
method drop (line 894) | fn drop(&mut self) {
function test_check_profile_files_finds_zdotdir (line 915) | fn test_check_profile_files_finds_zdotdir() {
function test_check_profile_files_finds_xdg_fish (line 935) | fn test_check_profile_files_finds_xdg_fish() {
function test_check_profile_files_finds_posix_env_in_bashrc (line 957) | fn test_check_profile_files_finds_posix_env_in_bashrc() {
function test_check_profile_files_finds_fish_env (line 976) | fn test_check_profile_files_finds_fish_env() {
function test_check_profile_files_returns_none_when_not_found (line 995) | fn test_check_profile_files_returns_none_when_not_found() {
function test_check_profile_files_finds_absolute_path (line 1013) | fn test_check_profile_files_finds_absolute_path() {
FILE: crates/vite_global_cli/src/commands/env/exec.rs
function execute (line 25) | pub async fn execute(
function normalize_wrapper_command (line 87) | fn normalize_wrapper_command(command: &[String]) -> Vec<String> {
function normalize_wrapper_command_inner (line 102) | fn normalize_wrapper_command_inner(command: &[String], from_wrapper: boo...
function execute_with_version (line 111) | async fn execute_with_version(
function resolve_version (line 155) | async fn resolve_version(version: &str, provider: &NodeProvider) -> Resu...
function exit_status (line 181) | fn exit_status(code: i32) -> ExitStatus {
function test_execute_missing_command (line 201) | async fn test_execute_missing_command() {
function test_execute_node_version (line 210) | async fn test_execute_node_version() {
function test_resolve_version_exact (line 220) | async fn test_resolve_version_exact() {
function test_resolve_version_with_v_prefix (line 227) | async fn test_resolve_version_with_v_prefix() {
function test_resolve_version_partial (line 234) | async fn test_resolve_version_partial() {
function test_resolve_version_range (line 242) | async fn test_resolve_version_range() {
function test_resolve_version_lts (line 250) | async fn test_resolve_version_lts() {
function test_shim_mode_error_for_non_shim_command (line 262) | async fn test_shim_mode_error_for_non_shim_command() {
function test_normalize_wrapper_command_strips_only_wrapper_separator (line 273) | fn test_normalize_wrapper_command_strips_only_wrapper_separator() {
function test_normalize_wrapper_command_no_wrapper_keeps_separator (line 280) | fn test_normalize_wrapper_command_no_wrapper_keeps_separator() {
FILE: crates/vite_global_cli/src/commands/env/global_install.rs
function install (line 28) | pub async fn install(
function uninstall (line 216) | pub async fn uninstall(package_name: &str, dry_run: bool) -> Result<(), ...
function parse_package_spec (line 271) | fn parse_package_spec(spec: &str) -> (String, Option<String>) {
type BinaryInfo (line 291) | struct BinaryInfo {
function extract_binaries (line 299) | fn extract_binaries(package_json: &serde_json::Value) -> Vec<BinaryInfo> {
function is_javascript_binary (line 335) | fn is_javascript_binary(path: &AbsolutePath) -> bool {
constant CORE_SHIMS (line 366) | pub(crate) const CORE_SHIMS: &[&str] = &["node", "npm", "npx", "vp"];
function create_package_shim (line 372) | async fn create_package_shim(
function remove_package_shim (line 434) | async fn remove_package_shim(
type FakeTrampolineGuard (line 476) | struct FakeTrampolineGuard;
method new (line 480) | fn new(dir: &std::path::Path) -> Self {
method drop (line 492) | fn drop(&mut self) {
function test_create_package_shim_creates_bin_dir (line 501) | async fn test_create_package_shim_creates_bin_dir() {
function test_create_package_shim_skips_core_shims (line 539) | async fn test_create_package_shim_skips_core_shims() {
function test_remove_package_shim_removes_shim (line 559) | async fn test_remove_package_shim_removes_shim() {
function test_remove_package_shim_handles_missing_shim (line 604) | async fn test_remove_package_shim_handles_missing_shim() {
function test_uninstall_removes_shims_from_metadata (line 617) | async fn test_uninstall_removes_shims_from_metadata() {
function test_parse_package_spec_simple (line 705) | fn test_parse_package_spec_simple() {
function test_parse_package_spec_with_version (line 712) | fn test_parse_package_spec_with_version() {
function test_parse_package_spec_scoped (line 719) | fn test_parse_package_spec_scoped() {
function test_parse_package_spec_scoped_with_version (line 726) | fn test_parse_package_spec_scoped_with_version() {
function test_is_javascript_binary_with_js_extension (line 733) | fn test_is_javascript_binary_with_js_extension() {
function test_is_javascript_binary_with_mjs_extension (line 746) | fn test_is_javascript_binary_with_mjs_extension() {
function test_is_javascript_binary_with_cjs_extension (line 759) | fn test_is_javascript_binary_with_cjs_extension() {
function test_is_javascript_binary_with_node_shebang (line 772) | fn test_is_javascript_binary_with_node_shebang() {
function test_is_javascript_binary_with_direct_node_shebang (line 785) | fn test_is_javascript_binary_with_direct_node_shebang() {
function test_is_javascript_binary_native_executable (line 798) | fn test_is_javascript_binary_native_executable() {
function test_is_javascript_binary_shell_script (line 812) | fn test_is_javascript_binary_shell_script() {
function test_is_javascript_binary_python_script (line 825) | fn test_is_javascript_binary_python_script() {
function test_is_javascript_binary_empty_file (line 838) | fn test_is_javascript_binary_empty_file() {
FILE: crates/vite_global_cli/src/commands/env/list.rs
type InstalledVersionJson (line 16) | struct InstalledVersionJson {
function list_installed_versions (line 23) | fn list_installed_versions(node_dir: &std::path::Path) -> Vec<String> {
function compare_versions (line 46) | fn compare_versions(a: &str, b: &str) -> Ordering {
function execute (line 54) | pub async fn execute(cwd: AbsolutePathBuf, json_output: bool) -> Result<...
function print_json (line 88) | fn print_json(versions: &[String], current: Option<&str>, default: Optio...
function print_human (line 103) | fn print_human(versions: &[String], current: Option<&str>, default: Opti...
function test_version_cmp (line 136) | fn test_version_cmp() {
function test_list_installed_versions_nonexistent_dir (line 144) | fn test_list_installed_versions_nonexistent_dir() {
function test_list_installed_versions_empty_dir (line 150) | fn test_list_installed_versions_empty_dir() {
function test_list_installed_versions_with_versions (line 157) | fn test_list_installed_versions_with_versions() {
FILE: crates/vite_global_cli/src/commands/env/list_remote.rs
constant DEFAULT_MAJOR_VERSIONS (line 14) | const DEFAULT_MAJOR_VERSIONS: usize = 10;
type VersionListJson (line 18) | struct VersionListJson {
type VersionJson (line 24) | struct VersionJson {
function execute (line 32) | pub async fn execute(
function filter_versions (line 66) | fn filter_versions<'a>(
function extract_major (line 96) | fn extract_major(version: &str) -> Option<u64> {
function limit_to_recent_majors (line 102) | fn limit_to_recent_majors(
function print_json (line 124) | fn print_json(
function print_human (line 158) | fn print_human(versions: &[&NodeVersionEntry]) {
function make_version (line 185) | fn make_version(version: &str, lts: Option<&str>) -> NodeVersionEntry {
function test_filter_versions_lts_only (line 196) | fn test_filter_versions_lts_only() {
function test_filter_versions_by_pattern (line 209) | fn test_filter_versions_by_pattern() {
function test_limit_to_recent_majors (line 223) | fn test_limit_to_recent_majors() {
function test_filter_versions_show_all_returns_all_versions (line 242) | fn test_filter_versions_show_all_returns_all_versions() {
function test_filter_versions_show_all_with_lts_filter (line 269) | fn test_filter_versions_show_all_with_lts_filter() {
FILE: crates/vite_global_cli/src/commands/env/mod.rs
function print_env_header (line 34) | fn print_env_header() {
function should_print_env_header (line 39) | fn should_print_env_header(subcommand: &EnvSubcommands) -> bool {
function execute (line 51) | pub async fn execute(cwd: AbsolutePathBuf, args: EnvArgs) -> Result<Exit...
function print_env (line 157) | async fn print_env(cwd: AbsolutePathBuf) -> Result<ExitStatus, Error> {
function exit_status (line 178) | fn exit_status(code: i32) -> ExitStatus {
FILE: crates/vite_global_cli/src/commands/env/off.rs
function accent_command (line 13) | fn accent_command(command: &str) -> String {
function execute (line 22) | pub async fn execute() -> Result<ExitStatus, Error> {
FILE: crates/vite_global_cli/src/commands/env/on.rs
function accent_command (line 12) | fn accent_command(command: &str) -> String {
function execute (line 21) | pub async fn execute() -> Result<ExitStatus, Error> {
FILE: crates/vite_global_cli/src/commands/env/package_metadata.rs
type PackageMetadata (line 15) | pub struct PackageMetadata {
method new (line 45) | pub fn new(
method is_js_binary (line 66) | pub fn is_js_binary(&self, bin_name: &str) -> bool {
method metadata_path (line 71) | pub fn metadata_path(package_name: &str) -> Result<AbsolutePathBuf, Er...
method load (line 77) | pub async fn load(package_name: &str) -> Result<Option<Self>, Error> {
method save (line 90) | pub async fn save(&self) -> Result<(), Error> {
method delete (line 105) | pub async fn delete(package_name: &str) -> Result<(), Error> {
method list_all (line 114) | pub async fn list_all() -> Result<Vec<Self>, Error> {
method find_by_binary (line 128) | pub async fn find_by_binary(binary_name: &str) -> Result<Option<Self>,...
type Platform (line 35) | pub struct Platform {
function list_packages_recursive (line 142) | async fn list_packages_recursive(
function test_metadata_path_regular_package (line 180) | fn test_metadata_path_regular_package() {
function test_metadata_path_scoped_package (line 187) | fn test_metadata_path_scoped_package() {
function test_save_scoped_package_metadata (line 199) | async fn test_save_scoped_package_metadata() {
function test_list_all_includes_scoped_packages (line 229) | async fn test_list_all_includes_scoped_packages() {
function test_find_by_binary (line 272) | async fn test_find_by_binary() {
FILE: crates/vite_global_cli/src/commands/env/packages.rs
function execute (line 11) | pub async fn execute(json: bool, pattern: Option<&str>) -> Result<ExitSt...
FILE: crates/vite_global_cli/src/commands/env/pin.rs
constant NODE_VERSION_FILE (line 16) | const NODE_VERSION_FILE: &str = ".node-version";
function execute (line 19) | pub async fn execute(
function show_pinned (line 38) | async fn show_pinned(cwd: &AbsolutePathBuf) -> Result<ExitStatus, Error> {
function find_inherited_version (line 75) | async fn find_inherited_version(
function do_pin (line 93) | async fn do_pin(
function resolve_version_for_pin (line 174) | async fn resolve_version_for_pin(
function do_unpin (line 203) | pub async fn do_unpin(cwd: &AbsolutePathBuf) -> Result<ExitStatus, Error> {
function test_show_pinned_no_file (line 230) | async fn test_show_pinned_no_file() {
function test_show_pinned_with_file (line 240) | async fn test_show_pinned_with_file() {
function test_find_inherited_version (line 252) | async fn test_find_inherited_version() {
function test_do_unpin (line 270) | async fn test_do_unpin() {
function test_do_unpin_invalidates_cache (line 289) | async fn test_do_unpin_invalidates_cache() {
function test_do_pin_invalidates_cache (line 329) | async fn test_do_pin_invalidates_cache() {
function test_do_unpin_no_file (line 371) | async fn test_do_unpin_no_file() {
function test_resolve_version_for_pin_partial_version (line 381) | async fn test_resolve_version_for_pin_partial_version() {
function test_resolve_version_for_pin_exact_version (line 401) | async fn test_resolve_version_for_pin_exact_version() {
FILE: crates/vite_global_cli/src/commands/env/setup.rs
constant SHIM_TOOLS (line 27) | const SHIM_TOOLS: &[&str] = &["node", "npm", "npx", "vpx"];
function accent_command (line 29) | fn accent_command(command: &str) -> String {
function execute (line 38) | pub async fn execute(refresh: bool, env_only: bool) -> Result<ExitStatus...
function setup_vp_wrapper (line 121) | async fn setup_vp_wrapper(bin_dir: &vite_path::AbsolutePath, refresh: bo...
function is_symlink (line 173) | async fn is_symlink(path: &vite_path::AbsolutePath) -> bool {
function create_shim (line 183) | async fn create_shim(
function shim_filename (line 221) | fn shim_filename(tool: &str) -> String {
function create_unix_shim (line 239) | async fn create_unix_shim(
function create_windows_shim (line 260) | async fn create_windows_shim(
function generate_completion_scripts (line 282) | async fn generate_completion_scripts(
function get_trampoline_path (line 315) | pub(crate) fn get_trampoline_path() -> Result<vite_path::AbsolutePathBuf...
function rename_to_old (line 351) | async fn rename_to_old(path: &vite_path::AbsolutePath) {
function cleanup_old_files (line 371) | async fn cleanup_old_files(bin_dir: &vite_path::AbsolutePath) {
function cleanup_legacy_windows_shim (line 386) | pub(crate) async fn cleanup_legacy_windows_shim(bin_dir: &vite_path::Abs...
function create_env_files (line 416) | async fn create_env_files(vite_plus_home: &vite_path::AbsolutePath) -> R...
function print_path_instructions (line 591) | fn print_path_instructions(bin_dir: &vite_path::AbsolutePath) {
function home_guard (line 652) | fn home_guard(home: impl Into<std::path::PathBuf>) -> vite_shared::TestE...
function test_create_env_files_creates_all_files (line 660) | async fn test_create_env_files_creates_all_files() {
function test_create_env_files_replaces_placeholder_with_home_relative_path (line 676) | async fn test_create_env_files_replaces_placeholder_with_home_relative_p...
function test_create_env_files_uses_absolute_path_when_not_under_home (line 708) | async fn test_create_env_files_uses_absolute_path_when_not_under_home() {
function test_create_env_files_posix_contains_path_guard (line 736) | async fn test_create_env_files_posix_contains_path_guard() {
function test_create_env_files_fish_contains_path_guard (line 767) | async fn test_create_env_files_fish_contains_path_guard() {
function test_create_env_files_is_idempotent (line 789) | async fn test_create_env_files_is_idempotent() {
function test_create_env_files_posix_contains_vp_shell_function (line 811) | async fn test_create_env_files_posix_contains_vp_shell_function() {
function test_create_env_files_fish_contains_vp_function (line 838) | async fn test_create_env_files_fish_contains_vp_function() {
function test_create_env_files_ps1_contains_vp_function (line 864) | async fn test_create_env_files_ps1_contains_vp_function() {
function test_execute_env_only_creates_home_dir_and_env_files (line 884) | async fn test_execute_env_only_creates_home_dir_and_env_files() {
function test_generate_completion_scripts_creates_all_files (line 907) | async fn test_generate_completion_scripts_creates_all_files() {
function test_create_env_files_contains_completion (line 931) | async fn test_create_env_files_contains_completion() {
FILE: crates/vite_global_cli/src/commands/env/unpin.rs
function execute (line 12) | pub async fn execute(cwd: AbsolutePathBuf) -> Result<ExitStatus, Error> {
FILE: crates/vite_global_cli/src/commands/env/use.rs
type Shell (line 19) | enum Shell {
function detect_shell (line 31) | fn detect_shell() -> Shell {
function format_export (line 45) | fn format_export(shell: &Shell, value: &str) -> String {
function format_unset (line 55) | fn format_unset(shell: &Shell) -> String {
function has_eval_wrapper (line 69) | fn has_eval_wrapper() -> bool {
function execute (line 74) | pub async fn execute(
function test_detect_shell_posix_even_with_psmodulepath (line 175) | fn test_detect_shell_posix_even_with_psmodulepath() {
function test_detect_shell_fish (line 188) | fn test_detect_shell_fish() {
function test_detect_shell_posix_default (line 198) | fn test_detect_shell_posix_default() {
function test_format_export_posix (line 209) | fn test_format_export_posix() {
function test_format_export_fish (line 215) | fn test_format_export_fish() {
function test_format_export_powershell (line 221) | fn test_format_export_powershell() {
function test_format_export_cmd (line 227) | fn test_format_export_cmd() {
function test_format_unset_posix (line 233) | fn test_format_unset_posix() {
function test_format_unset_fish (line 239) | fn test_format_unset_fish() {
function test_format_unset_powershell (line 245) | fn test_format_unset_powershell() {
function test_format_unset_cmd (line 251) | fn test_format_unset_cmd() {
FILE: crates/vite_global_cli/src/commands/env/which.rs
constant CORE_TOOLS (line 23) | const CORE_TOOLS: &[&str] = &["node", "npm", "npx"];
constant LABEL_WIDTH (line 26) | const LABEL_WIDTH: usize = 10;
function execute (line 29) | pub async fn execute(cwd: AbsolutePathBuf, tool: &str) -> Result<ExitSta...
function execute_core_tool (line 48) | async fn execute_core_tool(cwd: AbsolutePathBuf, tool: &str) -> Result<E...
function format_source (line 91) | fn format_source(source: &str, source_path: Option<&AbsolutePath>) -> St...
function execute_package_binary (line 103) | async fn execute_package_binary(
function locate_package_binary (line 139) | fn locate_package_binary(package_name: &str, binary_name: &str) -> Resul...
function exit_status (line 191) | fn exit_status(code: i32) -> ExitStatus {
FILE: crates/vite_global_cli/src/commands/implode.rs
constant SHELL_PROFILES (line 17) | const SHELL_PROFILES: &[(&str, bool)] = &[
function abbreviate_home_path (line 27) | fn abbreviate_home_path(path: &AbsolutePath, user_home: &AbsolutePath) -...
constant VITE_PLUS_COMMENT (line 35) | const VITE_PLUS_COMMENT: &str = "# Vite+ bin";
function execute (line 37) | pub fn execute(yes: bool) -> Result<ExitStatus, Error> {
type AffectedProfile (line 86) | struct AffectedProfile {
type AffectedProfileKind (line 95) | enum AffectedProfileKind {
function collect_affected_profiles (line 106) | fn collect_affected_profiles(user_home: &AbsolutePathBuf) -> Vec<Affecte...
function confirm_implode (line 164) | fn confirm_implode(
function clean_affected_profiles (line 202) | fn clean_affected_profiles(affected_profiles: &[AffectedProfile]) {
function remove_vite_plus_dir (line 225) | fn remove_vite_plus_dir(home_dir: &AbsolutePathBuf) -> Result<(), Error> {
function build_deferred_delete_script (line 281) | fn build_deferred_delete_script(trash_path: &std::path::Path) -> Str {
function spawn_deferred_delete (line 295) | fn spawn_deferred_delete(trash_path: &std::path::Path) -> std::io::Resul...
function has_vite_plus_lines (line 306) | fn has_vite_plus_lines(content: &str) -> bool {
function remove_vite_plus_lines (line 312) | fn remove_vite_plus_lines(content: &str) -> Str {
function remove_windows_path_entry (line 354) | fn remove_windows_path_entry(bin_path: &vite_path::AbsolutePath) -> std:...
function test_remove_vite_plus_lines_posix (line 379) | fn test_remove_vite_plus_lines_posix() {
function test_remove_vite_plus_lines_no_match (line 386) | fn test_remove_vite_plus_lines_no_match() {
function test_remove_vite_plus_lines_absolute_path (line 393) | fn test_remove_vite_plus_lines_absolute_path() {
function test_remove_vite_plus_lines_preserves_surrounding (line 400) | fn test_remove_vite_plus_lines_preserves_surrounding() {
function test_clean_affected_profiles_integration (line 407) | fn test_clean_affected_profiles_integration() {
function test_remove_vite_plus_dir_success (line 427) | fn test_remove_vite_plus_dir_success() {
function test_remove_vite_plus_dir_nonexistent (line 440) | fn test_remove_vite_plus_dir_nonexistent() {
function test_build_deferred_delete_script (line 451) | fn test_build_deferred_delete_script() {
function test_abbreviate_home_path (line 462) | fn test_abbreviate_home_path() {
function test_collect_affected_profiles (line 475) | fn test_collect_affected_profiles() {
type ProfileEnvGuard (line 499) | struct ProfileEnvGuard {
method new (line 506) | fn new(zdotdir: Option<&std::path::Path>, xdg_config: Option<&std::pat...
method drop (line 527) | fn drop(&mut self) {
function test_collect_affected_profiles_zdotdir (line 544) | fn test_collect_affected_profiles_zdotdir() {
function test_collect_affected_profiles_xdg_config (line 565) | fn test_collect_affected_profiles_xdg_config() {
function test_execute_not_installed (line 585) | fn test_execute_not_installed() {
FILE: crates/vite_global_cli/src/commands/install.rs
type InstallCommand (line 10) | pub struct InstallCommand {
method new (line 15) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 19) | pub async fn execute(self, options: &InstallCommandOptions<'_>) -> Res...
function test_install_command_new (line 38) | fn test_install_command_new() {
function test_install_command_with_package_json_without_package_manager (line 52) | async fn test_install_command_with_package_json_without_package_manager() {
function test_install_command_with_package_json_with_package_manager (line 69) | async fn test_install_command_with_package_json_with_package_manager() {
function test_ensure_package_json_creates_when_missing (line 88) | async fn test_ensure_package_json_creates_when_missing() {
function test_ensure_package_json_does_not_overwrite_existing (line 106) | async fn test_ensure_package_json_does_not_overwrite_existing() {
function test_install_command_execute_with_invalid_workspace (line 124) | async fn test_install_command_execute_with_invalid_workspace() {
FILE: crates/vite_global_cli/src/commands/link.rs
type LinkCommand (line 13) | pub struct LinkCommand {
method new (line 18) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 22) | pub async fn execute(
function test_link_command_new (line 41) | fn test_link_command_new() {
FILE: crates/vite_global_cli/src/commands/migrate.rs
function execute (line 10) | pub async fn execute(cwd: AbsolutePathBuf, args: &[String]) -> Result<Ex...
function test_migrate_command_module_exists (line 17) | fn test_migrate_command_module_exists() {
FILE: crates/vite_global_cli/src/commands/mod.rs
type DepCheckPackageJson (line 36) | struct DepCheckPackageJson {
function has_vite_plus_dependency (line 48) | pub fn has_vite_plus_dependency(cwd: &AbsolutePath) -> bool {
function ensure_package_json (line 72) | pub async fn ensure_package_json(project_path: &AbsolutePath) -> Result<...
function prepend_js_runtime_to_path_env (line 89) | pub async fn prepend_js_runtime_to_path_env(project_path: &AbsolutePath)...
function build_package_manager (line 111) | pub async fn build_package_manager(cwd: &AbsolutePath) -> Result<Package...
function test_has_vite_plus_in_dev_dependencies (line 174) | fn test_has_vite_plus_in_dev_dependencies() {
function test_has_vite_plus_in_dependencies (line 186) | fn test_has_vite_plus_in_dependencies() {
function test_no_vite_plus_dependency (line 198) | fn test_no_vite_plus_dependency() {
function test_no_package_json (line 210) | fn test_no_package_json() {
function test_nested_directory_walks_up (line 217) | fn test_nested_directory_walks_up() {
function test_empty_package_json (line 232) | fn test_empty_package_json() {
function test_nested_dir_stops_at_nearest_package_json (line 240) | fn test_nested_dir_stops_at_nearest_package_json() {
FILE: crates/vite_global_cli/src/commands/outdated.rs
type OutdatedCommand (line 13) | pub struct OutdatedCommand {
method new (line 18) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 23) | pub async fn execute(
function test_outdated_command_new (line 67) | fn test_outdated_command_new() {
FILE: crates/vite_global_cli/src/commands/pm.rs
function execute_info (line 39) | pub async fn execute_info(
function execute_pm_subcommand (line 56) | pub async fn execute_pm_subcommand(
function test_save_dependency_type (line 360) | fn test_save_dependency_type() {
FILE: crates/vite_global_cli/src/commands/remove.rs
type RemoveCommand (line 13) | pub struct RemoveCommand {
method new (line 18) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 22) | pub async fn execute(
function test_remove_command_new (line 58) | fn test_remove_command_new() {
FILE: crates/vite_global_cli/src/commands/run_or_delegate.rs
function execute (line 13) | pub async fn execute(cwd: AbsolutePathBuf, args: &[String]) -> Result<Ex...
FILE: crates/vite_global_cli/src/commands/staged.rs
function execute (line 10) | pub async fn execute(cwd: AbsolutePathBuf, args: &[String]) -> Result<Ex...
FILE: crates/vite_global_cli/src/commands/unlink.rs
type UnlinkCommand (line 13) | pub struct UnlinkCommand {
method new (line 18) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 22) | pub async fn execute(
function test_unlink_command_new (line 42) | fn test_unlink_command_new() {
FILE: crates/vite_global_cli/src/commands/update.rs
type UpdateCommand (line 13) | pub struct UpdateCommand {
method new (line 18) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 23) | pub async fn execute(
function test_update_command_new (line 67) | fn test_update_command_new() {
FILE: crates/vite_global_cli/src/commands/upgrade/install.rs
function is_safe_tar_path (line 20) | fn is_safe_tar_path(path: &Path) -> bool {
function extract_platform_package (line 37) | pub async fn extract_platform_package(
function generate_wrapper_package_json (line 94) | pub async fn generate_wrapper_package_json(
function install_production_deps (line 114) | pub async fn install_production_deps(
function save_previous_version (line 160) | pub async fn save_previous_version(install_dir: &AbsolutePath) -> Result...
function swap_current_link (line 183) | pub async fn swap_current_link(install_dir: &AbsolutePath, version: &str...
function refresh_shims (line 244) | pub async fn refresh_shims(install_dir: &AbsolutePath) -> Result<(), Err...
function cleanup_old_versions (line 280) | pub async fn cleanup_old_versions(
function read_previous_version (line 326) | pub async fn read_previous_version(install_dir: &AbsolutePath) -> Result...
function test_is_safe_tar_path_normal (line 344) | fn test_is_safe_tar_path_normal() {
function test_is_safe_tar_path_traversal (line 352) | fn test_is_safe_tar_path_traversal() {
function test_is_safe_tar_path_absolute (line 359) | fn test_is_safe_tar_path_absolute() {
function test_cleanup_preserves_active_downgraded_version (line 365) | async fn test_cleanup_preserves_active_downgraded_version() {
function test_cleanup_sorts_by_creation_time_not_semver (line 392) | async fn test_cleanup_sorts_by_creation_time_not_semver() {
function test_cleanup_old_versions_with_nonexistent_dir (line 425) | async fn test_cleanup_old_versions_with_nonexistent_dir() {
FILE: crates/vite_global_cli/src/commands/upgrade/integrity.rs
function verify_integrity (line 14) | pub fn verify_integrity(data: &[u8], expected_sri: &str) -> Result<(), E...
function test_verify_integrity_valid (line 39) | fn test_verify_integrity_valid() {
function test_verify_integrity_mismatch (line 50) | fn test_verify_integrity_mismatch() {
function test_verify_integrity_unsupported_format (line 59) | fn test_verify_integrity_unsupported_format() {
function test_verify_integrity_no_prefix (line 68) | fn test_verify_integrity_no_prefix() {
FILE: crates/vite_global_cli/src/commands/upgrade/mod.rs
type UpgradeOptions (line 21) | pub struct UpgradeOptions {
constant MAX_VERSIONS_KEEP (line 39) | const MAX_VERSIONS_KEEP: usize = 5;
function execute (line 43) | pub async fn execute(options: UpgradeOptions) -> Result<ExitStatus, Erro...
function install_platform_and_main (line 144) | async fn install_platform_and_main(
function execute_rollback (line 211) | async fn execute_rollback(
FILE: crates/vite_global_cli/src/commands/upgrade/platform.rs
function detect_platform_suffix (line 11) | pub fn detect_platform_suffix() -> Result<String, Error> {
function test_detect_platform_suffix (line 49) | fn test_detect_platform_suffix() {
FILE: crates/vite_global_cli/src/commands/upgrade/registry.rs
type PackageVersionMetadata (line 13) | pub struct PackageVersionMetadata {
type DistInfo (line 20) | pub struct DistInfo {
type ResolvedVersion (line 27) | pub struct ResolvedVersion {
constant MAIN_PACKAGE_NAME (line 33) | const MAIN_PACKAGE_NAME: &str = "vite-plus";
constant PLATFORM_PACKAGE_SCOPE (line 34) | const PLATFORM_PACKAGE_SCOPE: &str = "@voidzero-dev";
constant CLI_PACKAGE_NAME_PREFIX (line 35) | const CLI_PACKAGE_NAME_PREFIX: &str = "vite-plus-cli";
function resolve_version (line 42) | pub async fn resolve_version(
function test_cli_package_name_construction (line 88) | fn test_cli_package_name_construction() {
function test_all_platform_suffixes_match_published_cli_packages (line 95) | fn test_all_platform_suffixes_match_published_cli_packages() {
FILE: crates/vite_global_cli/src/commands/version.rs
type PackageJson (line 20) | struct PackageJson {
type LocalVitePlus (line 27) | struct LocalVitePlus {
type ToolSpec (line 33) | struct ToolSpec {
constant TOOL_SPECS (line 39) | const TOOL_SPECS: [ToolSpec; 7] = [
constant NOT_FOUND (line 69) | const NOT_FOUND: &str = "Not found";
function read_package_json (line 71) | fn read_package_json(package_json_path: &Path) -> Option<PackageJson> {
function find_local_vite_plus (line 76) | fn find_local_vite_plus(start: &Path) -> Option<LocalVitePlus> {
function resolve_package_json (line 92) | fn resolve_package_json(base_dir: &Path, package_name: &str) -> Option<P...
function resolve_tool_version (line 104) | fn resolve_tool_version(local: &LocalVitePlus, tool: ToolSpec) -> Option...
function accent (line 114) | fn accent(text: &str) -> String {
function print_rows (line 118) | fn print_rows(title: &str, rows: &[(&str, String)]) {
function format_version (line 127) | fn format_version(version: Option<String>) -> String {
function get_node_version_info (line 134) | async fn get_node_version_info(cwd: &AbsolutePathBuf) -> Option<(String,...
function detect_system_node_version (line 145) | fn detect_system_node_version() -> Option<String> {
function execute (line 163) | pub async fn execute(cwd: AbsolutePathBuf) -> Result<ExitStatus, Error> {
function symlink_dir (line 224) | fn symlink_dir(src: &Path, dst: &Path) {
function format_version_values (line 229) | fn format_version_values() {
function detect_system_node_version_returns_version (line 235) | fn detect_system_node_version_returns_version() {
function resolves_tool_versions_from_pnpm_symlink_layout (line 245) | fn resolves_tool_versions_from_pnpm_symlink_layout() {
FILE: crates/vite_global_cli/src/commands/vpx.rs
type VpxFlags (line 18) | pub struct VpxFlags {
constant VPX_HELP (line 30) | const VPX_HELP: &str = "\
type GlobalBinary (line 52) | struct GlobalBinary {
function execute_vpx (line 61) | pub async fn execute_vpx(args: &[String], cwd: &AbsolutePath) -> i32 {
function find_global_binary (line 129) | async fn find_global_binary(cmd: &str) -> Option<GlobalBinary> {
function execute_global_binary (line 151) | async fn execute_global_binary(bin: GlobalBinary, args: &[String], cwd: ...
function find_on_path (line 187) | fn find_on_path(cmd: &str) -> Option<AbsolutePathBuf> {
function prepend_node_modules_bin_to_path (line 212) | fn prepend_node_modules_bin_to_path(cwd: &AbsolutePath) {
function find_local_binary (line 237) | pub fn find_local_binary(cwd: &AbsolutePath, cmd: &str) -> Option<Absolu...
function has_version_spec (line 268) | pub fn has_version_spec(spec: &str) -> bool {
function extract_command_name (line 287) | fn extract_command_name(spec: &str) -> String {
function parse_vpx_args (line 309) | pub fn parse_vpx_args(args: &[String]) -> (VpxFlags, Vec<String>) {
function test_has_version_spec_simple_package (line 370) | fn test_has_version_spec_simple_package() {
function test_has_version_spec_with_version (line 375) | fn test_has_version_spec_with_version() {
function test_has_version_spec_with_full_version (line 380) | fn test_has_version_spec_with_full_version() {
function test_has_version_spec_scoped_package_no_version (line 385) | fn test_has_version_spec_scoped_package_no_version() {
function test_has_version_spec_scoped_package_with_version (line 390) | fn test_has_version_spec_scoped_package_with_version() {
function test_has_version_spec_scoped_no_slash (line 395) | fn test_has_version_spec_scoped_no_slash() {
function test_has_version_spec_with_tag (line 400) | fn test_has_version_spec_with_tag() {
function test_extract_command_name_simple (line 409) | fn test_extract_command_name_simple() {
function test_extract_command_name_with_version (line 414) | fn test_extract_command_name_with_version() {
function test_extract_command_name_scoped (line 419) | fn test_extract_command_name_scoped() {
function test_extract_command_name_scoped_with_version (line 424) | fn test_extract_command_name_scoped_with_version() {
function test_extract_command_name_create_vue (line 429) | fn test_extract_command_name_create_vue() {
function test_parse_vpx_args_simple_command (line 438) | fn test_parse_vpx_args_simple_command() {
function test_parse_vpx_args_with_package_flag (line 449) | fn test_parse_vpx_args_with_package_flag() {
function test_parse_vpx_args_with_long_package_flag (line 459) | fn test_parse_vpx_args_with_long_package_flag() {
function test_parse_vpx_args_with_package_equals (line 467) | fn test_parse_vpx_args_with_package_equals() {
function test_parse_vpx_args_multiple_packages (line 475) | fn test_parse_vpx_args_multiple_packages() {
function test_parse_vpx_args_silent (line 491) | fn test_parse_vpx_args_silent() {
function test_parse_vpx_args_help (line 499) | fn test_parse_vpx_args_help() {
function test_parse_vpx_args_no_args (line 507) | fn test_parse_vpx_args_no_args() {
function test_parse_vpx_args_unknown_flag_becomes_positional (line 518) | fn test_parse_vpx_args_unknown_flag_becomes_positional() {
function test_find_local_binary_in_cwd (line 530) | fn test_find_local_binary_in_cwd() {
function test_find_local_binary_walks_up (line 546) | fn test_find_local_binary_walks_up() {
function test_find_local_binary_not_found (line 567) | fn test_find_local_binary_not_found() {
function test_find_local_binary_prefers_nearest (line 576) | fn test_find_local_binary_prefers_nearest() {
function test_find_global_binary_not_installed (line 604) | async fn test_find_global_binary_not_installed() {
function create_fake_executable (line 615) | fn create_fake_executable(dir: &std::path::Path, name: &str) -> std::pat...
function create_fake_executable (line 624) | fn create_fake_executable(dir: &std::path::Path, name: &str) -> std::pat...
function test_find_on_path_finds_tool (line 632) | fn test_find_on_path_finds_tool() {
function test_find_on_path_excludes_vp_bin_dir (line 657) | fn test_find_on_path_excludes_vp_bin_dir() {
function test_prepend_node_modules_bin_to_path (line 707) | fn test_prepend_node_modules_bin_to_path() {
FILE: crates/vite_global_cli/src/commands/why.rs
type WhyCommand (line 13) | pub struct WhyCommand {
method new (line 18) | pub fn new(cwd: AbsolutePathBuf) -> Self {
method execute (line 23) | pub async fn execute(
function test_why_command_new (line 71) | fn test_why_command_new() {
FILE: crates/vite_global_cli/src/error.rs
type Error (line 9) | pub enum Error {
FILE: crates/vite_global_cli/src/help.rs
type HelpDoc (line 9) | pub struct HelpDoc {
type HelpSection (line 17) | pub enum HelpSection {
type HelpRow (line 23) | pub struct HelpRow {
type OwnedHelpDoc (line 29) | struct OwnedHelpDoc {
type OwnedHelpSection (line 37) | enum OwnedHelpSection {
type OwnedHelpRow (line 43) | struct OwnedHelpRow {
function row (line 48) | fn row(label: &'static str, description: &'static str) -> HelpRow {
function section_rows (line 52) | fn section_rows(title: &'static str, rows: Vec<HelpRow>) -> HelpSection {
function section_lines (line 56) | fn section_lines(title: &'static str, lines: Vec<&'static str>) -> HelpS...
function documentation_url_for_command_path (line 60) | fn documentation_url_for_command_path(command_path: &[&str]) -> Option<&...
function render_heading (line 87) | pub fn render_heading(title: &str) -> String {
function render_usage_value (line 100) | fn render_usage_value(usage: &str) -> String {
function should_accent_heading (line 104) | fn should_accent_heading(title: &str) -> bool {
function write_documentation_footer (line 108) | fn write_documentation_footer(output: &mut String, documentation_url: &s...
function should_style_help (line 113) | pub fn should_style_help() -> bool {
function render_rows (line 120) | fn render_rows(rows: &[HelpRow]) -> Vec<String> {
function render_owned_rows (line 143) | fn render_owned_rows(rows: &[OwnedHelpRow]) -> Vec<String> {
function split_comment_suffix (line 166) | fn split_comment_suffix(line: &str) -> Option<(&str, &str)> {
function render_muted_comment_suffix (line 170) | fn render_muted_comment_suffix(line: &str) -> String {
function render_help_doc (line 182) | pub fn render_help_doc(doc: &HelpDoc) -> String {
function render_owned_help_doc (line 219) | fn render_owned_help_doc(doc: &OwnedHelpDoc) -> String {
function is_section_heading (line 256) | fn is_section_heading(line: &str) -> bool {
function split_label_and_description (line 261) | fn split_label_and_description(content: &str) -> Option<(String, String)> {
function parse_rows (line 286) | fn parse_rows(lines: &[String]) -> Vec<OwnedHelpRow> {
function strip_ansi (line 323) | fn strip_ansi(value: &str) -> String {
function parse_clap_help_to_doc (line 361) | fn parse_clap_help_to_doc(raw_help: &str) -> Option<OwnedHelpDoc> {
function top_level_help_doc (line 420) | pub fn top_level_help_doc() -> HelpDoc {
function env_help_doc (line 494) | fn env_help_doc() -> HelpDoc {
function delegated_help_doc (line 582) | fn delegated_help_doc(command: &str) -> Option<HelpDoc> {
function is_help_flag (line 913) | fn is_help_flag(arg: &str) -> bool {
function has_help_flag_before_terminator (line 917) | fn has_help_flag_before_terminator(args: &[String]) -> bool {
function skip_clap_unified_help (line 921) | fn skip_clap_unified_help(command: &str) -> bool {
function maybe_print_unified_clap_subcommand_help (line 940) | pub fn maybe_print_unified_clap_subcommand_help(argv: &[String]) -> bool {
function should_print_unified_delegate_help (line 1003) | pub fn should_print_unified_delegate_help(args: &[String]) -> bool {
function maybe_print_unified_delegate_help (line 1007) | pub fn maybe_print_unified_delegate_help(
function print_unified_clap_help_for_path (line 1028) | pub fn print_unified_clap_help_for_path(command_path: &[&str]) -> bool {
function parse_rows_supports_wrapped_option_labels (line 1068) | fn parse_rows_supports_wrapped_option_labels() {
function parse_clap_help_extracts_usage_summary_and_sections (line 1084) | fn parse_clap_help_extracts_usage_summary_and_sections() {
function help_flag_before_terminator_is_detected (line 1104) | fn help_flag_before_terminator_is_detected() {
function help_flag_after_terminator_is_ignored (line 1110) | fn help_flag_after_terminator_is_ignored() {
function strip_ansi_removes_csi_sequences (line 1116) | fn strip_ansi_removes_csi_sequences() {
function parse_clap_help_with_ansi_sequences (line 1122) | fn parse_clap_help_with_ansi_sequences() {
function split_comment_suffix_extracts_command_comment (line 1142) | fn split_comment_suffix_extracts_command_comment() {
function split_comment_suffix_returns_none_without_comment (line 1150) | fn split_comment_suffix_returns_none_without_comment() {
function docs_url_is_mapped_for_grouped_commands (line 1155) | fn docs_url_is_mapped_for_grouped_commands() {
function render_help_doc_appends_documentation_footer (line 1171) | fn render_help_doc_appends_documentation_footer() {
FILE: crates/vite_global_cli/src/js_executor.rs
type JsExecutor (line 23) | pub struct JsExecutor {
method new (line 39) | pub const fn new(scripts_dir: Option<AbsolutePathBuf>) -> Self {
method get_scripts_dir (line 49) | pub fn get_scripts_dir(&self) -> Result<AbsolutePathBuf, Error> {
method get_bin_path (line 79) | fn get_bin_path() -> Result<AbsolutePathBuf, Error> {
method create_js_command (line 89) | fn create_js_command(
method get_cli_package_dir (line 115) | fn get_cli_package_dir(&self) -> Result<AbsolutePathBuf, Error> {
method ensure_cli_runtime (line 128) | pub async fn ensure_cli_runtime(&mut self) -> Result<&JsRuntime, Error> {
method ensure_project_runtime (line 147) | pub async fn ensure_project_runtime(
method download_node (line 196) | pub async fn download_node(&self, version: &str) -> Result<JsRuntime, ...
method delegate_to_local_cli (line 212) | pub async fn delegate_to_local_cli(
method delegate_to_global_cli (line 228) | pub async fn delegate_to_global_cli(
method delegate_with_cli_runtime (line 255) | pub async fn delegate_with_cli_runtime(
method run_js_entry (line 267) | async fn run_js_entry(
method resolve_local_vite_plus (line 294) | fn resolve_local_vite_plus(project_path: &AbsolutePath) -> Option<Abso...
function has_valid_version_source (line 325) | async fn has_valid_version_source(
function test_js_executor_new (line 366) | fn test_js_executor_new() {
function test_js_executor_with_scripts_dir (line 374) | fn test_js_executor_with_scripts_dir() {
function test_create_js_command_uses_direct_binary (line 386) | fn test_create_js_command_uses_direct_binary() {
function test_delegate_to_local_cli_prints_node_version (line 411) | async fn test_delegate_to_local_cli_prints_node_version() {
FILE: crates/vite_global_cli/src/main.rs
function normalize_args (line 36) | fn normalize_args(args: Vec<String>) -> Vec<String> {
type InvalidSubcommandDetails (line 64) | struct InvalidSubcommandDetails {
function extract_invalid_subcommand_details (line 69) | fn extract_invalid_subcommand_details(error: &clap::Error) -> Option<Inv...
function print_invalid_subcommand_error (line 86) | fn print_invalid_subcommand_error(details: &InvalidSubcommandDetails) {
function is_affirmative_response (line 94) | fn is_affirmative_response(input: &str) -> bool {
function should_prompt_for_correction (line 98) | fn should_prompt_for_correction() -> bool {
function prompt_to_run_suggested_command (line 102) | fn prompt_to_run_suggested_command(suggestion: &str) -> bool {
function read_confirmation_input (line 121) | fn read_confirmation_input() -> Option<String> {
function replace_top_level_typoed_subcommand (line 127) | fn replace_top_level_typoed_subcommand(
function exit_status_to_exit_code (line 142) | fn exit_status_to_exit_code(exit_status: ExitStatus) -> ExitCode {
function run_corrected_args (line 151) | async fn run_corrected_args(cwd: &vite_path::AbsolutePathBuf, raw_args: ...
function extract_unknown_argument (line 178) | fn extract_unknown_argument(error: &clap::Error) -> Option<String> {
function has_pass_as_value_suggestion (line 185) | fn has_pass_as_value_suggestion(error: &clap::Error) -> bool {
function print_unknown_argument_error (line 203) | fn print_unknown_argument_error(error: &clap::Error) -> bool {
function main (line 226) | async fn main() -> ExitCode {
function unknown_argument_detected_without_pass_as_value_hint (line 377) | fn unknown_argument_detected_without_pass_as_value_hint() {
function unknown_argument_detected_with_pass_as_value_hint (line 386) | fn unknown_argument_detected_with_pass_as_value_hint() {
function affirmative_response_detection (line 400) | fn affirmative_response_detection() {
function replace_top_level_typoed_subcommand_preserves_trailing_args (line 410) | fn replace_top_level_typoed_subcommand_preserves_trailing_args() {
function replace_top_level_typoed_subcommand_skips_nested_subcommands (line 418) | fn replace_top_level_typoed_subcommand_skips_nested_subcommands() {
FILE: crates/vite_global_cli/src/shim/cache.rs
constant CACHE_VERSION (line 16) | const CACHE_VERSION: u32 = 2;
constant DEFAULT_MAX_ENTRIES (line 19) | const DEFAULT_MAX_ENTRIES: usize = 4096;
type ResolveCacheEntry (line 23) | pub struct ResolveCacheEntry {
type ResolveCache (line 44) | pub struct ResolveCache {
method load (line 59) | pub fn load(cache_path: &AbsolutePath) -> Self {
method save (line 80) | pub fn save(&self, cache_path: &AbsolutePath) {
method get (line 92) | pub fn get(&self, cwd: &AbsolutePath) -> Option<&ResolveCacheEntry> {
method insert (line 105) | pub fn insert(&mut self, cwd: &AbsolutePath, entry: ResolveCacheEntry) {
method is_entry_valid (line 124) | fn is_entry_valid(&self, entry: &ResolveCacheEntry) -> bool {
method evict_oldest (line 173) | fn evict_oldest(&mut self) {
method default (line 52) | fn default() -> Self {
function get_cache_path (line 186) | pub fn get_cache_path() -> Option<AbsolutePathBuf> {
function invalidate_cache (line 193) | pub fn invalidate_cache() {
function get_file_mtime (line 200) | pub fn get_file_mtime(path: &AbsolutePath) -> Option<u64> {
function now_timestamp (line 207) | pub fn now_timestamp() -> u64 {
function test_range_version_cache_should_expire_after_ttl (line 218) | fn test_range_version_cache_should_expire_after_ttl() {
function test_exact_version_cache_uses_mtime_validation (line 271) | fn test_exact_version_cache_uses_mtime_validation() {
function test_range_cache_valid_within_ttl (line 311) | fn test_range_cache_valid_within_ttl() {
function test_invalidate_cache_removes_file (line 350) | fn test_invalidate_cache_removes_file() {
FILE: crates/vite_global_cli/src/shim/dispatch.rs
constant RECURSION_ENV_VAR (line 26) | const RECURSION_ENV_VAR: &str = env_vars::VITE_PLUS_TOOL_RECURSION;
constant PACKAGE_MANAGER_TOOLS (line 30) | const PACKAGE_MANAGER_TOOLS: &[&str] = &["pnpm", "yarn"];
function is_package_manager_tool (line 32) | fn is_package_manager_tool(tool: &str) -> bool {
type NpmGlobalCommand (line 37) | struct NpmGlobalCommand {
constant NPM_VALUE_FLAGS (line 46) | const NPM_VALUE_FLAGS: &[&str] = &["--registry", "--tag", "--cache", "--...
constant NPM_INSTALL_SUBCOMMANDS (line 49) | const NPM_INSTALL_SUBCOMMANDS: &[&str] = &["install", "i", "add"];
constant NPM_UNINSTALL_SUBCOMMANDS (line 52) | const NPM_UNINSTALL_SUBCOMMANDS: &[&str] = &["uninstall", "un", "remove"...
function parse_npm_global_command (line 56) | fn parse_npm_global_command(args: &[String], subcommands: &[&str]) -> Op...
function parse_npm_global_install (line 127) | fn parse_npm_global_install(args: &[String]) -> Option<NpmGlobalCommand> {
function parse_npm_global_uninstall (line 135) | fn parse_npm_global_uninstall(args: &[String]) -> Option<NpmGlobalComman...
function is_local_path (line 145) | fn is_local_path(spec: &str) -> bool {
function resolve_package_name (line 157) | fn resolve_package_name(spec: &str) -> Option<String> {
function get_npm_global_prefix (line 187) | fn get_npm_global_prefix(npm_path: &AbsolutePath, node_dir: &AbsolutePat...
function check_npm_global_install_result (line 217) | fn check_npm_global_install_result(
function extract_bin_names (line 378) | fn extract_bin_names(package_json: &serde_json::Value) -> Vec<String> {
function extract_bin_path (line 403) | fn extract_bin_path(package_json: &serde_json::Value, bin_name: &str) ->...
function create_bin_link (line 419) | fn create_bin_link(
function dedup_missing_bins (line 486) | fn dedup_missing_bins(
function remove_npm_global_uninstall_links (line 510) | fn remove_npm_global_uninstall_links(bin_entries: &[(String, String)], n...
function read_npm_package_json (line 599) | fn read_npm_package_json(
function collect_bin_names_from_npm (line 616) | fn collect_bin_names_from_npm(
function resolve_npm_prefix (line 644) | fn resolve_npm_prefix(
function dispatch (line 661) | pub async fn dispatch(tool: &str, args: &[String]) -> i32 {
function dispatch_package_binary (line 832) | async fn dispatch_package_binary(tool: &str, args: &[String]) -> i32 {
function find_package_for_binary (line 914) | pub(crate) async fn find_package_for_binary(
function locate_package_binary (line 927) | pub(crate) fn locate_package_binary(
function bypass_to_system (line 985) | fn bypass_to_system(tool: &str, args: &[String]) -> i32 {
function passthrough_to_system (line 1000) | fn passthrough_to_system(tool: &str, args: &[String]) -> i32 {
function resolve_with_cache (line 1011) | async fn resolve_with_cache(cwd: &AbsolutePathBuf) -> Result<ResolveCach...
function ensure_installed (line 1089) | pub(crate) async fn ensure_installed(version: &str) -> Result<(), String> {
function locate_tool (line 1114) | pub(crate) fn locate_tool(version: &str, tool: &str) -> Result<AbsoluteP...
function load_shim_mode (line 1142) | async fn load_shim_mode() -> ShimMode {
function find_system_tool (line 1150) | fn find_system_tool(tool: &str) -> Option<AbsolutePathBuf> {
function create_fake_executable (line 1190) | fn create_fake_executable(dir: &std::path::Path, name: &str) -> std::pat...
function create_fake_executable (line 1199) | fn create_fake_executable(dir: &std::path::Path, name: &str) -> std::pat...
type EnvGuard (line 1206) | struct EnvGuard {
method new (line 1212) | fn new() -> Self {
method drop (line 1221) | fn drop(&mut self) {
function test_find_system_tool_works_without_bypass (line 1237) | fn test_find_system_tool_works_without_bypass() {
function test_find_system_tool_skips_single_bypass_path (line 1257) | fn test_find_system_tool_skips_single_bypass_path() {
function test_find_system_tool_filters_multiple_bypass_paths (line 1285) | fn test_find_system_tool_filters_multiple_bypass_paths() {
function test_find_system_tool_returns_none_when_all_paths_bypassed (line 1318) | fn test_find_system_tool_returns_none_when_all_paths_bypassed() {
function test_find_system_tool_cumulative_bypass_prevents_loop (line 1341) | fn test_find_system_tool_cumulative_bypass_prevents_loop() {
function test_find_system_tool_returns_none_with_no_real_system_tool (line 1386) | fn test_find_system_tool_returns_none_with_no_real_system_tool() {
function s (line 1416) | fn s(strs: &[&str]) -> Vec<String> {
function test_parse_npm_global_install_basic (line 1421) | fn test_parse_npm_global_install_basic() {
function test_parse_npm_global_install_shorthand (line 1428) | fn test_parse_npm_global_install_shorthand() {
function test_parse_npm_global_install_global_first (line 1435) | fn test_parse_npm_global_install_global_first() {
function test_parse_npm_global_install_long_global (line 1442) | fn test_parse_npm_global_install_long_global() {
function test_parse_npm_global_install_not_uninstall (line 1449) | fn test_parse_npm_global_install_not_uninstall() {
function test_parse_npm_global_install_no_global_flag (line 1455) | fn test_parse_npm_global_install_no_global_flag() {
function test_parse_npm_global_install_no_packages (line 1461) | fn test_parse_npm_global_install_no_packages() {
function test_parse_npm_global_install_local_path (line 1467) | fn test_parse_npm_global_install_local_path() {
function test_parse_npm_global_install_skip_registry (line 1475) | fn test_parse_npm_global_install_skip_registry() {
function test_parse_npm_global_install_not_run_subcommand (line 1483) | fn test_parse_npm_global_install_not_run_subcommand() {
function test_parse_npm_global_install_git_url (line 1489) | fn test_parse_npm_global_install_git_url() {
function test_parse_npm_global_install_url (line 1495) | fn test_parse_npm_global_install_url() {
function test_parse_npm_global_uninstall_basic (line 1504) | fn test_parse_npm_global_uninstall_basic() {
function test_parse_npm_global_uninstall_shorthand_un (line 1511) | fn test_parse_npm_global_uninstall_shorthand_un() {
function test_parse_npm_global_uninstall_shorthand_rm (line 1518) | fn test_parse_npm_global_uninstall_shorthand_rm() {
function test_parse_npm_global_uninstall_remove (line 1525) | fn test_parse_npm_global_uninstall_remove() {
function test_parse_npm_global_uninstall_not_install (line 1532) | fn test_parse_npm_global_uninstall_not_install() {
function test_parse_npm_global_uninstall_no_global_flag (line 1538) | fn test_parse_npm_global_uninstall_no_global_flag() {
function test_parse_npm_global_uninstall_no_packages (line 1544) | fn test_parse_npm_global_uninstall_no_packages() {
function test_parse_npm_global_install_run_subcommand_with_install_arg (line 1550) | fn test_parse_npm_global_install_run_subcommand_with_install_arg() {
function test_parse_npm_global_uninstall_run_subcommand_with_uninstall_arg (line 1557) | fn test_parse_npm_global_uninstall_run_subcommand_with_uninstall_arg() {
function test_parse_npm_global_install_flag_before_subcommand (line 1564) | fn test_parse_npm_global_install_flag_before_subcommand() {
function test_resolve_package_name_simple (line 1574) | fn test_resolve_package_name_simple() {
function test_resolve_package_name_with_version (line 1579) | fn test_resolve_package_name_with_version() {
function test_resolve_package_name_scoped (line 1584) | fn test_resolve_package_name_scoped() {
function test_resolve_package_name_scoped_with_version (line 1589) | fn test_resolve_package_name_scoped_with_version() {
function test_resolve_package_name_local_path_with_package_json (line 1594) | fn test_resolve_package_name_local_path_with_package_json() {
function test_resolve_package_name_local_path_no_package_json (line 1606) | fn test_resolve_package_name_local_path_no_package_json() {
function test_extract_bin_names_single (line 1613) | fn test_extract_bin_names_single() {
function test_extract_bin_names_scoped_single (line 1620) | fn test_extract_bin_names_scoped_single() {
function test_extract_bin_names_object (line 1627) | fn test_extract_bin_names_object() {
function test_extract_bin_names_no_bin (line 1638) | fn test_extract_bin_names_no_bin() {
function test_is_local_path_bare_dot (line 1646) | fn test_is_local_path_bare_dot() {
function test_is_local_path_bare_dotdot (line 1651) | fn test_is_local_path_bare_dotdot() {
function test_is_local_path_relative_dot (line 1656) | fn test_is_local_path_relative_dot() {
function test_is_local_path_absolute (line 1662) | fn test_is_local_path_absolute() {
function test_is_local_path_package_name (line 1667) | fn test_is_local_path_package_name() {
function test_is_local_path_windows_drive (line 1675) | fn test_is_local_path_windows_drive() {
function test_dedup_missing_bins_keeps_last_entry (line 1684) | fn test_dedup_missing_bins_keeps_last_entry() {
function test_dedup_missing_bins_preserves_unique_entries (line 1707) | fn test_dedup_missing_bins_preserves_unique_entries() {
function test_dedup_missing_bins_multiple_dupes (line 1725) | fn test_dedup_missing_bins_multiple_dupes() {
function test_parse_npm_global_install_with_prefix (line 1751) | fn test_parse_npm_global_install_with_prefix() {
function test_parse_npm_global_install_with_prefix_equals (line 1761) | fn test_parse_npm_global_install_with_prefix_equals() {
function test_parse_npm_global_install_without_prefix (line 1770) | fn test_parse_npm_global_install_without_prefix() {
function test_parse_npm_global_uninstall_with_prefix (line 1779) | fn test_parse_npm_global_uninstall_with_prefix() {
function test_resolve_npm_prefix_relative (line 1792) | fn test_resolve_npm_prefix_relative() {
function test_resolve_npm_prefix_absolute (line 1818) | fn test_resolve_npm_prefix_absolute() {
function test_resolve_npm_prefix_none_fallback (line 1837) | fn test_resolve_npm_prefix_none_fallback() {
FILE: crates/vite_global_cli/src/shim/exec.rs
function exit_code_from_status (line 11) | fn exit_code_from_status(status: std::process::ExitStatus) -> i32 {
function spawn_tool (line 26) | pub fn spawn_tool(path: &AbsolutePath, args: &[String]) -> i32 {
function exec_tool (line 39) | pub fn exec_tool(path: &AbsolutePath, args: &[String]) -> i32 {
function exec_unix (line 53) | fn exec_unix(path: &AbsolutePath, args: &[String]) -> i32 {
function exec_windows (line 67) | fn exec_windows(path: &AbsolutePath, args: &[String]) -> i32 {
function test_exit_code_from_status_normal (line 77) | fn test_exit_code_from_status_normal() {
function test_exit_code_from_status_normal (line 85) | fn test_exit_code_from_status_normal() {
function test_exit_code_from_status_signal (line 92) | fn test_exit_code_from_status_signal() {
FILE: crates/vite_global_cli/src/shim/mod.rs
constant CORE_SHIM_TOOLS (line 20) | pub const CORE_SHIM_TOOLS: &[&str] = &["node", "npm", "npx"];
function extract_tool_name (line 29) | pub fn extract_tool_name(argv0: &str) -> String {
function is_core_shim_tool (line 40) | pub fn is_core_shim_tool(tool: &str) -> bool {
function is_shim_tool (line 50) | pub fn is_shim_tool(tool: &str) -> bool {
function is_potential_package_binary (line 73) | fn is_potential_package_binary(tool: &str) -> bool {
constant SHIM_TOOL_ENV_VAR (line 102) | const SHIM_TOOL_ENV_VAR: &str = env_vars::VITE_PLUS_SHIM_TOOL;
function detect_shim_tool (line 113) | pub fn detect_shim_tool(argv0: &str) -> Option<String> {
function test_extract_tool_name (line 153) | fn test_extract_tool_name() {
function test_is_shim_tool (line 173) | fn test_is_shim_tool() {
function test_is_potential_package_binary_checks_configured_bin (line 196) | fn test_is_potential_package_binary_checks_configured_bin() {
function test_detect_shim_tool_vpx (line 208) | fn test_detect_shim_tool_vpx() {
FILE: crates/vite_global_cli/src/tips/mod.rs
type TipContext (line 14) | pub struct TipContext {
method success (line 32) | pub fn success(&self) -> bool {
method is_unknown_command_error (line 36) | pub fn is_unknown_command_error(&self) -> bool {
method positionals (line 45) | fn positionals(&self) -> impl Iterator<Item = &str> {
method subcommand (line 50) | pub fn subcommand(&self) -> Option<&str> {
method is_subcommand (line 57) | pub fn is_subcommand(&self, pattern: &str) -> bool {
method default (line 24) | fn default() -> Self {
type Tip (line 64) | pub trait Tip {
method matches (line 66) | fn matches(&self, ctx: &TipContext) -> bool;
method message (line 68) | fn message(&self) -> &'static str;
function all (line 72) | fn all() -> &'static [&'static dyn Tip] {
function get_tip (line 81) | pub fn get_tip(context: &TipContext) -> Option<&'static str> {
function tip_context_from_command (line 107) | pub fn tip_context_from_command(command: &str) -> TipContext {
FILE: crates/vite_global_cli/src/tips/short_aliases.rs
constant LONG_FORMS (line 6) | const LONG_FORMS: &[&str] = &["install", "remove", "uninstall", "update"...
type ShortAliases (line 9) | pub struct ShortAliases;
method matches (line 12) | fn matches(&self, ctx: &TipContext) -> bool {
method message (line 16) | fn message(&self) -> &'static str {
function matches_long_form_commands (line 27) | fn matches_long_form_commands() {
function does_not_match_short_form_commands (line 35) | fn does_not_match_short_form_commands() {
function does_not_match_other_commands (line 44) | fn does_not_match_other_commands() {
function install_shows_short_alias_tip (line 53) | fn install_shows_short_alias_tip() {
function short_form_does_not_show_tip (line 59) | fn short_form_does_not_show_tip() {
FILE: crates/vite_global_cli/src/tips/use_vpx_or_run.rs
type UseVpxOrRun (line 6) | pub struct UseVpxOrRun;
method matches (line 9) | fn matches(&self, ctx: &TipContext) -> bool {
method message (line 13) | fn message(&self) -> &'static str {
function matches_on_unknown_command (line 24) | fn matches_on_unknown_command() {
function does_not_match_on_known_command (line 31) | fn does_not_match_on_known_command() {
FILE: crates/vite_install/src/commands/add.rs
type SaveDependencyType (line 13) | pub enum SaveDependencyType {
type AddCommandOptions (line 26) | pub struct AddCommandOptions<'a> {
method run_add_command (line 43) | pub async fn run_add_command(
method resolve_add_command (line 55) | pub fn resolve_add_command(&self, options: &AddCommandOptions) -> Resolv...
function create_temp_dir (line 217) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 221) | fn create_mock_package_manager(pm_type: PackageManagerType) -> PackageMa...
function test_pnpm_basic_add (line 239) | fn test_pnpm_basic_add() {
function test_pnpm_add_with_filter (line 258) | fn test_pnpm_add_with_filter() {
function test_pnpm_add_with_save_catalog_name (line 277) | fn test_pnpm_add_with_save_catalog_name() {
function test_pnpm_add_with_save_catalog_name_and_empty_name (line 299) | fn test_pnpm_add_with_save_catalog_name_and_empty_name() {
function test_pnpm_add_with_filter_and_workspace_root (line 318) | fn test_pnpm_add_with_filter_and_workspace_root() {
function test_pnpm_add_workspace_root (line 337) | fn test_pnpm_add_workspace_root() {
function test_pnpm_add_workspace_only (line 356) | fn test_pnpm_add_workspace_only() {
function test_yarn_basic_add (line 375) | fn test_yarn_basic_add() {
function test_yarn_add_with_workspace (line 394) | fn test_yarn_add_with_workspace() {
function test_yarn_add_workspace_root (line 416) | fn test_yarn_add_workspace_root() {
function test_npm_basic_add (line 435) | fn test_npm_basic_add() {
function test_npm_add_with_workspace (line 454) | fn test_npm_add_with_workspace() {
function test_npm_add_workspace_root (line 473) | fn test_npm_add_workspace_root() {
function test_npm_add_multiple_workspaces (line 492) | fn test_npm_add_multiple_workspaces() {
function test_npm_add_multiple_workspaces_and_workspace_root (line 514) | fn test_npm_add_multiple_workspaces_and_workspace_root() {
function test_pnpm_add_with_allow_build (line 544) | fn test_pnpm_add_with_allow_build() {
FILE: crates/vite_install/src/commands/audit.rs
type AuditCommandOptions (line 14) | pub struct AuditCommandOptions<'a> {
method run_audit_command (line 26) | pub async fn run_audit_command(
method resolve_audit_command (line 41) | pub fn resolve_audit_command(
function create_temp_dir (line 164) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 168) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_npm_audit (line 186) | fn test_npm_audit() {
function test_npm_audit_fix (line 202) | fn test_npm_audit_fix() {
function test_pnpm_audit_fix (line 218) | fn test_pnpm_audit_fix() {
function test_yarn1_audit (line 234) | fn test_yarn1_audit() {
function test_yarn1_audit_fix_not_supported (line 250) | fn test_yarn1_audit_fix_not_supported() {
function test_yarn2_audit (line 263) | fn test_yarn2_audit() {
function test_yarn2_audit_fix_not_supported (line 279) | fn test_yarn2_audit_fix_not_supported() {
function test_audit_with_level_npm (line 292) | fn test_audit_with_level_npm() {
function test_audit_with_level_yarn1 (line 308) | fn test_audit_with_level_yarn1() {
function test_audit_with_level_yarn2 (line 324) | fn test_audit_with_level_yarn2() {
FILE: crates/vite_install/src/commands/cache.rs
type CacheCommandOptions (line 14) | pub struct CacheCommandOptions<'a> {
method run_cache_command (line 23) | pub async fn run_cache_command(
method resolve_cache_command (line 39) | pub fn resolve_cache_command(
function create_temp_dir (line 139) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 143) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_cache_dir (line 161) | fn test_pnpm_cache_dir() {
function test_npm_cache_dir (line 174) | fn test_npm_cache_dir() {
function test_yarn1_cache_dir (line 187) | fn test_yarn1_cache_dir() {
function test_yarn2_cache_dir (line 200) | fn test_yarn2_cache_dir() {
function test_pnpm_cache_clean (line 213) | fn test_pnpm_cache_clean() {
function test_npm_cache_clean (line 226) | fn test_npm_cache_clean() {
function test_yarn1_cache_clean (line 239) | fn test_yarn1_cache_clean() {
function test_yarn2_cache_clean (line 252) | fn test_yarn2_cache_clean() {
FILE: crates/vite_install/src/commands/config.rs
type ConfigCommandOptions (line 14) | pub struct ConfigCommandOptions<'a> {
method run_config_command (line 26) | pub async fn run_config_command(
method resolve_config_command (line 38) | pub fn resolve_config_command(&self, options: &ConfigCommandOptions) -> ...
function create_temp_dir (line 149) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 153) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_config_set (line 171) | fn test_pnpm_config_set() {
function test_npm_config_set (line 186) | fn test_npm_config_set() {
function test_config_set_with_json (line 201) | fn test_config_set_with_json() {
function test_config_set_with_location_global (line 219) | fn test_config_set_with_location_global() {
function test_yarn2_config_set_location_global (line 237) | fn test_yarn2_config_set_location_global() {
function test_yarn1_config_set (line 255) | fn test_yarn1_config_set() {
function test_pnpm_config_set_global (line 270) | fn test_pnpm_config_set_global() {
function test_npm_config_set_global (line 288) | fn test_npm_config_set_global() {
function test_yarn1_config_set_global (line 306) | fn test_yarn1_config_set_global() {
function test_pnpm_config_get (line 324) | fn test_pnpm_config_get() {
function test_npm_config_delete (line 339) | fn test_npm_config_delete() {
function test_yarn2_config_delete (line 354) | fn test_yarn2_config_delete() {
function test_yarn2_config_list (line 369) | fn test_yarn2_config_list() {
FILE: crates/vite_install/src/commands/dedupe.rs
type DedupeCommandOptions (line 13) | pub struct DedupeCommandOptions<'a> {
method run_dedupe_command (line 22) | pub async fn run_dedupe_command(
method resolve_dedupe_command (line 34) | pub fn resolve_dedupe_command(&self, options: &DedupeCommandOptions) -> ...
function create_temp_dir (line 85) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 89) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_dedupe_basic (line 107) | fn test_pnpm_dedupe_basic() {
function test_pnpm_dedupe_check (line 115) | fn test_pnpm_dedupe_check() {
function test_npm_dedupe_basic (line 124) | fn test_npm_dedupe_basic() {
function test_npm_dedupe_check (line 132) | fn test_npm_dedupe_check() {
function test_yarn_dedupe_basic (line 141) | fn test_yarn_dedupe_basic() {
function test_yarn_dedupe_check (line 149) | fn test_yarn_dedupe_check() {
FILE: crates/vite_install/src/commands/deprecate.rs
type DeprecateCommandOptions (line 11) | pub struct DeprecateCommandOptions<'a> {
method run_deprecate_command (line 22) | pub async fn run_deprecate_command(
method resolve_deprecate_command (line 35) | pub fn resolve_deprecate_command(
function create_temp_dir (line 75) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 79) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_deprecate_basic (line 97) | fn test_deprecate_basic() {
function test_deprecate_with_otp (line 114) | fn test_deprecate_with_otp() {
function test_deprecate_with_registry (line 131) | fn test_deprecate_with_registry() {
FILE: crates/vite_install/src/commands/dist_tag.rs
type DistTagSubcommand (line 13) | pub enum DistTagSubcommand {
type DistTagCommandOptions (line 21) | pub struct DistTagCommandOptions<'a> {
method run_dist_tag_command (line 29) | pub async fn run_dist_tag_command(
method resolve_dist_tag_command (line 42) | pub fn resolve_dist_tag_command(
function create_temp_dir (line 105) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 109) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_npm_dist_tag_list (line 127) | fn test_npm_dist_tag_list() {
function test_pnpm_dist_tag_list (line 138) | fn test_pnpm_dist_tag_list() {
function test_yarn1_dist_tag_list (line 149) | fn test_yarn1_dist_tag_list() {
function test_yarn2_dist_tag_list (line 160) | fn test_yarn2_dist_tag_list() {
function test_dist_tag_add (line 171) | fn test_dist_tag_add() {
function test_dist_tag_rm (line 185) | fn test_dist_tag_rm() {
FILE: crates/vite_install/src/commands/dlx.rs
type DlxCommandOptions (line 14) | pub struct DlxCommandOptions<'a> {
method run_dlx_command (line 29) | pub async fn run_dlx_command(
method resolve_dlx_command (line 41) | pub fn resolve_dlx_command(&self, options: &DlxCommandOptions) -> Resolv...
method resolve_pnpm_dlx (line 58) | fn resolve_pnpm_dlx(
method resolve_npm_dlx (line 92) | fn resolve_npm_dlx(
method resolve_yarn_dlx (line 148) | fn resolve_yarn_dlx(
method resolve_npx_fallback (line 180) | fn resolve_npx_fallback(
function build_npx_args (line 196) | pub fn build_npx_args(options: &DlxCommandOptions<'_>) -> Vec<String> {
function build_shell_command (line 227) | fn build_shell_command(package_spec: &str, args: &[String]) -> String {
function extract_command_from_spec (line 242) | fn extract_command_from_spec(spec: &str) -> String {
function create_temp_dir (line 272) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 276) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_extract_command_from_spec (line 294) | fn test_extract_command_from_spec() {
function test_pnpm_dlx_basic (line 305) | fn test_pnpm_dlx_basic() {
function test_pnpm_dlx_with_version (line 320) | fn test_pnpm_dlx_with_version() {
function test_pnpm_dlx_with_packages (line 335) | fn test_pnpm_dlx_with_packages() {
function test_pnpm_dlx_with_shell_mode (line 353) | fn test_pnpm_dlx_with_shell_mode() {
function test_pnpm_dlx_with_silent (line 369) | fn test_pnpm_dlx_with_silent() {
function test_npm_exec_basic (line 384) | fn test_npm_exec_basic() {
function test_npm_exec_with_version (line 400) | fn test_npm_exec_with_version() {
function test_npm_exec_with_packages (line 427) | fn test_npm_exec_with_packages() {
function test_npm_exec_with_silent (line 455) | fn test_npm_exec_with_silent() {
function test_npm_exec_shell_mode_places_command_after_flag (line 473) | fn test_npm_exec_shell_mode_places_command_after_flag() {
function test_npm_exec_shell_mode_with_additional_args (line 497) | fn test_npm_exec_shell_mode_with_additional_args() {
function test_npm_exec_scoped_package_with_version (line 514) | fn test_npm_exec_scoped_package_with_version() {
function test_npm_exec_scoped_package_without_version (line 534) | fn test_npm_exec_scoped_package_without_version() {
function test_npm_exec_version_requires_package_flag_and_extracted_command (line 555) | fn test_npm_exec_version_requires_package_flag_and_extracted_command() {
function test_yarn_v1_fallback_to_npx (line 580) | fn test_yarn_v1_fallback_to_npx() {
function test_yarn_v1_fallback_with_packages (line 596) | fn test_yarn_v1_fallback_with_packages() {
function test_yarn_v1_fallback_shell_mode_places_command_after_flag (line 612) | fn test_yarn_v1_fallback_shell_mode_places_command_after_flag() {
function test_yarn_v2_dlx_basic (line 629) | fn test_yarn_v2_dlx_basic() {
function test_yarn_v2_dlx_with_packages (line 644) | fn test_yarn_v2_dlx_with_packages() {
function test_yarn_v2_dlx_with_quiet (line 659) | fn test_yarn_v2_dlx_with_quiet() {
function test_yarn_v3_dlx (line 674) | fn test_yarn_v3_dlx() {
function test_yarn_v2_dlx_with_version (line 689) | fn test_yarn_v2_dlx_with_version() {
FILE: crates/vite_install/src/commands/fund.rs
type FundCommandOptions (line 11) | pub struct FundCommandOptions<'a> {
method run_fund_command (line 19) | pub async fn run_fund_command(
method resolve_fund_command (line 32) | pub fn resolve_fund_command(&self, options: &FundCommandOptions) -> Reso...
function create_temp_dir (line 61) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 65) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_fund_basic (line 83) | fn test_fund_basic() {
function test_fund_with_json (line 92) | fn test_fund_with_json() {
FILE: crates/vite_install/src/commands/install.rs
type InstallCommandOptions (line 14) | pub struct InstallCommandOptions<'a> {
method run_install_command (line 57) | pub async fn run_install_command(
method resolve_install_command_with_options (line 69) | pub fn resolve_install_command_with_options(
method resolve_install_command (line 301) | pub fn resolve_install_command(&self, args: &Vec<String>) -> ResolveComm...
method is_yarn_berry (line 313) | fn is_yarn_berry(&self) -> bool {
function create_temp_dir (line 326) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 330) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_basic_install (line 348) | fn test_pnpm_basic_install() {
function test_pnpm_prod_install (line 356) | fn test_pnpm_prod_install() {
function test_pnpm_frozen_lockfile (line 366) | fn test_pnpm_frozen_lockfile() {
function test_pnpm_filter (line 376) | fn test_pnpm_filter() {
function test_pnpm_fix_lockfile (line 387) | fn test_pnpm_fix_lockfile() {
function test_pnpm_resolution_only (line 397) | fn test_pnpm_resolution_only() {
function test_pnpm_shamefully_hoist (line 407) | fn test_pnpm_shamefully_hoist() {
function test_npm_basic_install (line 417) | fn test_npm_basic_install() {
function test_npm_frozen_lockfile_uses_ci (line 425) | fn test_npm_frozen_lockfile_uses_ci() {
function test_npm_prod_install (line 435) | fn test_npm_prod_install() {
function test_npm_filter (line 445) | fn test_npm_filter() {
function test_yarn_classic_basic_install (line 456) | fn test_yarn_classic_basic_install() {
function test_yarn_classic_frozen_lockfile (line 464) | fn test_yarn_classic_frozen_lockfile() {
function test_yarn_classic_prod_install (line 474) | fn test_yarn_classic_prod_install() {
function test_yarn_berry_basic_install (line 484) | fn test_yarn_berry_basic_install() {
function test_yarn_berry_frozen_lockfile (line 492) | fn test_yarn_berry_frozen_lockfile() {
function test_yarn_berry_fix_lockfile (line 502) | fn test_yarn_berry_fix_lockfile() {
function test_yarn_berry_ignore_scripts (line 512) | fn test_yarn_berry_ignore_scripts() {
function test_yarn_berry_lockfile_only_takes_priority_over_ignore_scripts (line 522) | fn test_yarn_berry_lockfile_only_takes_priority_over_ignore_scripts() {
function test_yarn_berry_filter (line 535) | fn test_yarn_berry_filter() {
function test_pnpm_all_options (line 546) | fn test_pnpm_all_options() {
function test_pnpm_silent (line 577) | fn test_pnpm_silent() {
function test_yarn_classic_silent (line 587) | fn test_yarn_classic_silent() {
function test_npm_silent (line 597) | fn test_npm_silent() {
function test_pnpm_no_frozen_lockfile (line 607) | fn test_pnpm_no_frozen_lockfile() {
function test_pnpm_no_frozen_lockfile_overrides_frozen_lockfile (line 617) | fn test_pnpm_no_frozen_lockfile_overrides_frozen_lockfile() {
function test_yarn_classic_no_frozen_lockfile (line 629) | fn test_yarn_classic_no_frozen_lockfile() {
function test_yarn_classic_no_frozen_lockfile_overrides_frozen_lockfile (line 639) | fn test_yarn_classic_no_frozen_lockfile_overrides_frozen_lockfile() {
function test_yarn_berry_no_frozen_lockfile (line 650) | fn test_yarn_berry_no_frozen_lockfile() {
function test_yarn_berry_no_frozen_lockfile_overrides_frozen_lockfile (line 660) | fn test_yarn_berry_no_frozen_lockfile_overrides_frozen_lockfile() {
function test_npm_no_frozen_lockfile_uses_install (line 671) | fn test_npm_no_frozen_lockfile_uses_install() {
function test_npm_no_frozen_lockfile_overrides_frozen_lockfile (line 682) | fn test_npm_no_frozen_lockfile_overrides_frozen_lockfile() {
FILE: crates/vite_install/src/commands/link.rs
type LinkCommandOptions (line 13) | pub struct LinkCommandOptions<'a> {
method run_link_command (line 22) | pub async fn run_link_command(
method resolve_link_command (line 34) | pub fn resolve_link_command(&self, options: &LinkCommandOptions) -> Reso...
function create_temp_dir (line 76) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 80) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_link_no_package (line 98) | fn test_pnpm_link_no_package() {
function test_pnpm_link_package (line 106) | fn test_pnpm_link_package() {
function test_pnpm_link_directory (line 117) | fn test_pnpm_link_directory() {
function test_pnpm_link_absolute_directory (line 128) | fn test_pnpm_link_absolute_directory() {
function test_yarn_link_basic (line 139) | fn test_yarn_link_basic() {
function test_yarn_link_package (line 147) | fn test_yarn_link_package() {
function test_npm_link_basic (line 158) | fn test_npm_link_basic() {
function test_npm_link_package (line 166) | fn test_npm_link_package() {
FILE: crates/vite_install/src/commands/list.rs
type ListCommandOptions (line 14) | pub struct ListCommandOptions<'a> {
method run_list_command (line 36) | pub async fn run_list_command(
method resolve_list_command (line 52) | pub fn resolve_list_command(
method format_npm_list_args (line 211) | fn format_npm_list_args(args: &mut Vec<String>, options: &ListCommandOpt...
function create_temp_dir (line 287) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 291) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_list_basic (line 309) | fn test_pnpm_list_basic() {
function test_pnpm_list_recursive (line 319) | fn test_pnpm_list_recursive() {
function test_npm_list_basic (line 330) | fn test_npm_list_basic() {
function test_npm_list_recursive (line 340) | fn test_npm_list_recursive() {
function test_yarn1_list_basic (line 351) | fn test_yarn1_list_basic() {
function test_yarn1_list_recursive_ignored (line 361) | fn test_yarn1_list_recursive_ignored() {
function test_yarn2_list_not_supported (line 372) | fn test_yarn2_list_not_supported() {
function test_pnpm_list_global_uses_npm (line 379) | fn test_pnpm_list_global_uses_npm() {
function test_npm_list_global (line 390) | fn test_npm_list_global() {
function test_yarn1_list_global_uses_npm (line 401) | fn test_yarn1_list_global_uses_npm() {
function test_global_list_with_depth (line 412) | fn test_global_list_with_depth() {
function test_pnpm_list_with_filter (line 426) | fn test_pnpm_list_with_filter() {
function test_pnpm_list_with_multiple_filters (line 440) | fn test_pnpm_list_with_multiple_filters() {
function test_npm_list_with_filter (line 454) | fn test_npm_list_with_filter() {
function test_yarn1_list_with_filter_ignored (line 468) | fn test_yarn1_list_with_filter_ignored() {
function test_pnpm_list_prod (line 482) | fn test_pnpm_list_prod() {
function test_npm_list_prod (line 493) | fn test_npm_list_prod() {
function test_yarn1_list_prod_ignored (line 504) | fn test_yarn1_list_prod_ignored() {
function test_pnpm_list_dev (line 515) | fn test_pnpm_list_dev() {
function test_npm_list_dev (line 526) | fn test_npm_list_dev() {
function test_yarn1_list_dev_ignored (line 537) | fn test_yarn1_list_dev_ignored() {
function test_pnpm_list_no_optional (line 548) | fn test_pnpm_list_no_optional() {
function test_npm_list_no_optional (line 559) | fn test_npm_list_no_optional() {
function test_yarn1_list_no_optional_ignored (line 570) | fn test_yarn1_list_no_optional_ignored() {
function test_pnpm_list_only_projects (line 581) | fn test_pnpm_list_only_projects() {
function test_npm_list_only_projects_ignored (line 594) | fn test_npm_list_only_projects_ignored() {
function test_yarn1_list_only_projects_ignored (line 607) | fn test_yarn1_list_only_projects_ignored() {
function test_pnpm_list_exclude_peers (line 620) | fn test_pnpm_list_exclude_peers() {
function test_npm_list_exclude_peers (line 633) | fn test_npm_list_exclude_peers() {
function test_yarn1_list_exclude_peers_ignored (line 646) | fn test_yarn1_list_exclude_peers_ignored() {
function test_pnpm_list_find_by (line 659) | fn test_pnpm_list_find_by() {
function test_npm_list_find_by_ignored (line 672) | fn test_npm_list_find_by_ignored() {
function test_yarn1_list_find_by_ignored (line 685) | fn test_yarn1_list_find_by_ignored() {
FILE: crates/vite_install/src/commands/login.rs
type LoginCommandOptions (line 13) | pub struct LoginCommandOptions<'a> {
method run_login_command (line 22) | pub async fn run_login_command(
method resolve_login_command (line 35) | pub fn resolve_login_command(&self, options: &LoginCommandOptions) -> Re...
function create_temp_dir (line 87) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 91) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_npm_login (line 109) | fn test_npm_login() {
function test_pnpm_login_uses_npm (line 121) | fn test_pnpm_login_uses_npm() {
function test_yarn1_login (line 133) | fn test_yarn1_login() {
function test_yarn2_login (line 145) | fn test_yarn2_login() {
function test_login_with_registry (line 157) | fn test_login_with_registry() {
function test_login_with_scope (line 169) | fn test_login_with_scope() {
FILE: crates/vite_install/src/commands/logout.rs
type LogoutCommandOptions (line 13) | pub struct LogoutCommandOptions<'a> {
method run_logout_command (line 22) | pub async fn run_logout_command(
method resolve_logout_command (line 35) | pub fn resolve_logout_command(&self, options: &LogoutCommandOptions) -> ...
function create_temp_dir (line 87) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 91) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_npm_logout (line 109) | fn test_npm_logout() {
function test_pnpm_logout_uses_npm (line 121) | fn test_pnpm_logout_uses_npm() {
function test_yarn1_logout (line 133) | fn test_yarn1_logout() {
function test_yarn2_logout (line 145) | fn test_yarn2_logout() {
function test_logout_with_registry (line 157) | fn test_logout_with_registry() {
FILE: crates/vite_install/src/commands/outdated.rs
type Format (line 14) | pub enum Format {
method as_str (line 25) | pub const fn as_str(self) -> &'static str {
method fmt (line 48) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type Err (line 35) | type Err = String;
method from_str (line 37) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type OutdatedCommandOptions (line 55) | pub struct OutdatedCommandOptions<'a> {
method run_outdated_command (line 75) | pub async fn run_outdated_command(
method resolve_outdated_command (line 87) | pub fn resolve_outdated_command(
method format_npm_outdated_args (line 233) | fn format_npm_outdated_args(args: &mut Vec<String>, options: &OutdatedCo...
function create_temp_dir (line 294) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 298) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_outdated_basic (line 316) | fn test_pnpm_outdated_basic() {
function test_pnpm_outdated_with_packages (line 324) | fn test_pnpm_outdated_with_packages() {
function test_pnpm_outdated_json (line 336) | fn test_pnpm_outdated_json() {
function test_npm_outdated_basic (line 347) | fn test_npm_outdated_basic() {
function test_npm_outdated_json (line 355) | fn test_npm_outdated_json() {
function test_yarn_outdated_basic (line 366) | fn test_yarn_outdated_basic() {
function test_pnpm_outdated_with_filter (line 374) | fn test_pnpm_outdated_with_filter() {
function test_pnpm_outdated_prod_only (line 387) | fn test_pnpm_outdated_prod_only() {
function test_npm_outdated_list_format (line 396) | fn test_npm_outdated_list_format() {
function test_npm_outdated_recursive (line 407) | fn test_npm_outdated_recursive() {
function test_npm_outdated_with_workspace (line 418) | fn test_npm_outdated_with_workspace() {
function test_global_outdated (line 430) | fn test_global_outdated() {
function test_pnpm_outdated_with_workspace_root (line 441) | fn test_pnpm_outdated_with_workspace_root() {
function test_pnpm_outdated_with_workspace_root_and_recursive (line 452) | fn test_pnpm_outdated_with_workspace_root_and_recursive() {
function test_pnpm_outdated_with_all_flags (line 464) | fn test_pnpm_outdated_with_all_flags() {
function test_npm_outdated_with_workspace_root (line 502) | fn test_npm_outdated_with_workspace_root() {
function test_npm_outdated_with_workspace_root_and_workspace (line 513) | fn test_npm_outdated_with_workspace_root_and_workspace() {
FILE: crates/vite_install/src/commands/owner.rs
type OwnerSubcommand (line 11) | pub enum OwnerSubcommand {
method run_owner_command (line 20) | pub async fn run_owner_command(
method resolve_owner_command (line 33) | pub fn resolve_owner_command(&self, subcommand: &OwnerSubcommand) -> Res...
function create_temp_dir (line 85) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 89) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_owner_list_uses_npm (line 107) | fn test_pnpm_owner_list_uses_npm() {
function test_npm_owner_add (line 118) | fn test_npm_owner_add() {
function test_yarn_owner_rm_uses_npm (line 130) | fn test_yarn_owner_rm_uses_npm() {
function test_owner_with_otp (line 142) | fn test_owner_with_otp() {
FILE: crates/vite_install/src/commands/pack.rs
type PackCommandOptions (line 15) | pub struct PackCommandOptions<'a> {
method run_pack_command (line 28) | pub async fn run_pack_command(
method resolve_pack_command (line 52) | pub fn resolve_pack_command(&self, options: &PackCommandOptions) -> Reso...
function create_temp_dir (line 195) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 199) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_pack_basic (line 217) | fn test_pnpm_pack_basic() {
function test_pnpm_pack_recursive (line 225) | fn test_pnpm_pack_recursive() {
function test_pnpm_pack_with_out (line 234) | fn test_pnpm_pack_with_out() {
function test_pnpm_pack_with_destination (line 245) | fn test_pnpm_pack_with_destination() {
function test_pnpm_pack_with_gzip_level (line 256) | fn test_pnpm_pack_with_gzip_level() {
function test_pnpm_pack_json (line 267) | fn test_pnpm_pack_json() {
function test_pnpm_pack_with_filter (line 276) | fn test_pnpm_pack_with_filter() {
function test_pnpm_pack_with_multiple_filters (line 288) | fn test_pnpm_pack_with_multiple_filters() {
function test_npm_pack_basic (line 300) | fn test_npm_pack_basic() {
function test_npm_pack_recursive (line 308) | fn test_npm_pack_recursive() {
function test_npm_pack_with_destination (line 317) | fn test_npm_pack_with_destination() {
function test_npm_pack_json (line 328) | fn test_npm_pack_json() {
function test_npm_pack_with_filter (line 337) | fn test_npm_pack_with_filter() {
function test_npm_pack_with_multiple_filters (line 349) | fn test_npm_pack_with_multiple_filters() {
function test_yarn1_pack_basic (line 361) | fn test_yarn1_pack_basic() {
function test_yarn1_pack_recursive_ignored (line 369) | fn test_yarn1_pack_recursive_ignored() {
function test_yarn1_pack_with_out (line 378) | fn test_yarn1_pack_with_out() {
function test_yarn1_pack_json (line 389) | fn test_yarn1_pack_json() {
function test_yarn1_pack_with_filter_ignored (line 398) | fn test_yarn1_pack_with_filter_ignored() {
function test_yarn2_pack_basic (line 410) | fn test_yarn2_pack_basic() {
function test_yarn2_pack_recursive (line 418) | fn test_yarn2_pack_recursive() {
function test_yarn2_pack_with_out (line 427) | fn test_yarn2_pack_with_out() {
function test_yarn2_pack_json (line 438) | fn test_yarn2_pack_json() {
function test_yarn2_pack_with_filter (line 447) | fn test_yarn2_pack_with_filter() {
function test_yarn2_pack_with_multiple_filters (line 459) | fn test_yarn2_pack_with_multiple_filters() {
function test_yarn2_pack_with_filter_and_recursive (line 474) | fn test_yarn2_pack_with_filter_and_recursive() {
function test_npm_pack_destination_creates_directory (line 488) | async fn test_npm_pack_destination_creates_directory() {
function test_pnpm_pack_destination_no_directory_creation (line 523) | async fn test_pnpm_pack_destination_no_directory_creation() {
FILE: crates/vite_install/src/commands/ping.rs
type PingCommandOptions (line 11) | pub struct PingCommandOptions<'a> {
method run_ping_command (line 19) | pub async fn run_ping_command(
method resolve_ping_command (line 32) | pub fn resolve_ping_command(&self, options: &PingCommandOptions) -> Reso...
function create_temp_dir (line 62) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 66) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_ping_basic (line 84) | fn test_ping_basic() {
function test_ping_with_registry (line 93) | fn test_ping_with_registry() {
FILE: crates/vite_install/src/commands/prune.rs
type PruneCommandOptions (line 14) | pub struct PruneCommandOptions<'a> {
method run_prune_command (line 24) | pub async fn run_prune_command(
method resolve_prune_command (line 40) | pub fn resolve_prune_command(
function create_temp_dir (line 97) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 101) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_prune (line 119) | fn test_pnpm_prune() {
function test_pnpm_prune_prod (line 129) | fn test_pnpm_prune_prod() {
function test_npm_prune (line 140) | fn test_npm_prune() {
function test_npm_prune_prod (line 150) | fn test_npm_prune_prod() {
function test_npm_prune_no_optional (line 161) | fn test_npm_prune_no_optional() {
function test_npm_prune_both_flags (line 174) | fn test_npm_prune_both_flags() {
function test_yarn1_prune_not_supported (line 188) | fn test_yarn1_prune_not_supported() {
function test_yarn2_prune_not_supported (line 195) | fn test_yarn2_prune_not_supported() {
FILE: crates/vite_install/src/commands/publish.rs
type PublishCommandOptions (line 14) | pub struct PublishCommandOptions<'a> {
method run_publish_command (line 33) | pub async fn run_publish_command(
method resolve_publish_command (line 46) | pub fn resolve_publish_command(&self, options: &PublishCommandOptions) -...
function create_temp_dir (line 190) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 194) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_publish (line 212) | fn test_pnpm_publish() {
function test_npm_publish (line 220) | fn test_npm_publish() {
function test_yarn1_publish_uses_npm (line 228) | fn test_yarn1_publish_uses_npm() {
function test_yarn2_publish_uses_npm (line 236) | fn test_yarn2_publish_uses_npm() {
function test_yarn_publish_with_tag (line 244) | fn test_yarn_publish_with_tag() {
function test_pnpm_publish_recursive (line 255) | fn test_pnpm_publish_recursive() {
function test_npm_publish_recursive (line 266) | fn test_npm_publish_recursive() {
function test_pnpm_publish_with_filter (line 277) | fn test_pnpm_publish_with_filter() {
function test_npm_publish_with_filter (line 289) | fn test_npm_publish_with_filter() {
function test_yarn_publish_with_filter (line 301) | fn test_yarn_publish_with_filter() {
function test_pnpm_publish_json (line 313) | fn test_pnpm_publish_json() {
function test_npm_publish_json_ignored (line 322) | fn test_npm_publish_json_ignored() {
function test_pnpm_publish_branch (line 331) | fn test_pnpm_publish_branch() {
function test_npm_publish_branch_ignored (line 342) | fn test_npm_publish_branch_ignored() {
function test_pnpm_publish_report_summary (line 353) | fn test_pnpm_publish_report_summary() {
function test_npm_publish_report_summary_ignored (line 364) | fn test_npm_publish_report_summary_ignored() {
function test_pnpm_publish_otp (line 375) | fn test_pnpm_publish_otp() {
function test_npm_publish_otp (line 386) | fn test_npm_publish_otp() {
function test_yarn_publish_otp (line 397) | fn test_yarn_publish_otp() {
FILE: crates/vite_install/src/commands/rebuild.rs
type RebuildCommandOptions (line 14) | pub struct RebuildCommandOptions<'a> {
method run_rebuild_command (line 22) | pub async fn run_rebuild_command(
method resolve_rebuild_command (line 37) | pub fn resolve_rebuild_command(
function create_temp_dir (line 85) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 89) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_npm_rebuild (line 107) | fn test_npm_rebuild() {
function test_pnpm_rebuild (line 117) | fn test_pnpm_rebuild() {
function test_yarn1_rebuild_not_supported (line 127) | fn test_yarn1_rebuild_not_supported() {
function test_yarn2_rebuild_not_supported (line 134) | fn test_yarn2_rebuild_not_supported() {
FILE: crates/vite_install/src/commands/remove.rs
type RemoveCommandOptions (line 13) | pub struct RemoveCommandOptions<'a> {
method run_remove_command (line 29) | pub async fn run_remove_command(
method resolve_remove_command (line 41) | pub fn resolve_remove_command(&self, options: &RemoveCommandOptions) -> ...
function create_temp_dir (line 149) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 153) | fn create_mock_package_manager(pm_type: PackageManagerType) -> PackageMa...
function test_pnpm_basic_remove (line 171) | fn test_pnpm_basic_remove() {
function test_pnpm_remove_with_filter (line 189) | fn test_pnpm_remove_with_filter() {
function test_pnpm_remove_workspace_root (line 207) | fn test_pnpm_remove_workspace_root() {
function test_pnpm_remove_recursive (line 225) | fn test_pnpm_remove_recursive() {
function test_pnpm_remove_multiple_filters (line 243) | fn test_pnpm_remove_multiple_filters() {
function test_yarn_basic_remove (line 261) | fn test_yarn_basic_remove() {
function test_yarn_remove_with_workspace (line 279) | fn test_yarn_remove_with_workspace() {
function test_yarn_remove_recursive (line 300) | fn test_yarn_remove_recursive() {
function test_npm_basic_remove (line 318) | fn test_npm_basic_remove() {
function test_npm_remove_with_workspace (line 336) | fn test_npm_remove_with_workspace() {
function test_npm_remove_workspace_root (line 354) | fn test_npm_remove_workspace_root() {
function test_npm_remove_recursive (line 372) | fn test_npm_remove_recursive() {
function test_npm_remove_multiple_workspaces (line 393) | fn test_npm_remove_multiple_workspaces() {
function test_global_remove (line 414) | fn test_global_remove() {
function test_remove_multiple_packages (line 432) | fn test_remove_multiple_packages() {
function test_remove_with_pass_through_args (line 450) | fn test_remove_with_pass_through_args() {
function test_pnpm_remove_save_dev (line 468) | fn test_pnpm_remove_save_dev() {
function test_pnpm_remove_save_optional (line 486) | fn test_pnpm_remove_save_optional() {
function test_pnpm_remove_save_prod (line 504) | fn test_pnpm_remove_save_prod() {
function test_npm_remove_save_dev (line 522) | fn test_npm_remove_save_dev() {
function test_npm_remove_save_optional (line 540) | fn test_npm_remove_save_optional() {
function test_npm_remove_save_prod (line 558) | fn test_npm_remove_save_prod() {
function test_yarn_remove_save_flags_ignored (line 576) | fn test_yarn_remove_save_flags_ignored() {
function test_yarn_remove_with_recursive (line 596) | fn test_yarn_remove_with_recursive() {
function test_yarn_remove_with_multiple_filters (line 614) | fn test_yarn_remove_with_multiple_filters() {
function test_yarn_remove_with_recursive_and_multiple_filters (line 645) | fn test_yarn_remove_with_recursive_and_multiple_filters() {
FILE: crates/vite_install/src/commands/run.rs
method run_script_command (line 13) | pub async fn run_script_command(
method resolve_run_script_command (line 25) | pub fn resolve_run_script_command(&self, args: &[String]) -> ResolveComm...
function create_temp_dir (line 48) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 52) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_run_script (line 70) | fn test_pnpm_run_script() {
function test_pnpm_run_script_with_args (line 78) | fn test_pnpm_run_script_with_args() {
function test_npm_run_script (line 86) | fn test_npm_run_script() {
function test_npm_run_script_with_args (line 94) | fn test_npm_run_script_with_args() {
function test_yarn_run_script (line 102) | fn test_yarn_run_script() {
function test_run_script_no_args (line 110) | fn test_run_script_no_args() {
FILE: crates/vite_install/src/commands/search.rs
type SearchCommandOptions (line 11) | pub struct SearchCommandOptions<'a> {
method run_search_command (line 22) | pub async fn run_search_command(
method resolve_search_command (line 35) | pub fn resolve_search_command(&self, options: &SearchCommandOptions) -> ...
function create_temp_dir (line 77) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 81) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_search_basic (line 99) | fn test_search_basic() {
function test_search_with_json (line 114) | fn test_search_with_json() {
function test_search_multiple_terms (line 129) | fn test_search_multiple_terms() {
FILE: crates/vite_install/src/commands/token.rs
type TokenSubcommand (line 11) | pub enum TokenSubcommand {
method run_token_command (line 34) | pub async fn run_token_command(
method resolve_token_command (line 47) | pub fn resolve_token_command(&self, subcommand: &TokenSubcommand) -> Res...
function create_temp_dir (line 126) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 130) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_token_list (line 148) | fn test_token_list() {
function test_token_create (line 160) | fn test_token_create() {
function test_token_create_with_flags (line 174) | fn test_token_create_with_flags() {
function test_token_revoke (line 202) | fn test_token_revoke() {
FILE: crates/vite_install/src/commands/unlink.rs
type UnlinkCommandOptions (line 14) | pub struct UnlinkCommandOptions<'a> {
method run_unlink_command (line 24) | pub async fn run_unlink_command(
method resolve_unlink_command (line 36) | pub fn resolve_unlink_command(&self, options: &UnlinkCommandOptions) -> ...
function create_temp_dir (line 90) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 94) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_unlink_no_package (line 112) | fn test_pnpm_unlink_no_package() {
function test_pnpm_unlink_package (line 120) | fn test_pnpm_unlink_package() {
function test_pnpm_unlink_recursive (line 131) | fn test_pnpm_unlink_recursive() {
function test_pnpm_unlink_package_recursive (line 142) | fn test_pnpm_unlink_package_recursive() {
function test_yarn_unlink_basic (line 154) | fn test_yarn_unlink_basic() {
function test_yarn_unlink_package (line 162) | fn test_yarn_unlink_package() {
function test_yarn_unlink_recursive (line 173) | fn test_yarn_unlink_recursive() {
function test_npm_unlink_basic (line 184) | fn test_npm_unlink_basic() {
function test_npm_unlink_package (line 192) | fn test_npm_unlink_package() {
FILE: crates/vite_install/src/commands/update.rs
type UpdateCommandOptions (line 14) | pub struct UpdateCommandOptions<'a> {
method run_update_command (line 34) | pub async fn run_update_command(
method resolve_update_command (line 46) | pub fn resolve_update_command(&self, options: &UpdateCommandOptions) -> ...
function create_temp_dir (line 201) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 205) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_basic_update (line 223) | fn test_pnpm_basic_update() {
function test_pnpm_update_latest (line 245) | fn test_pnpm_update_latest() {
function test_pnpm_update_all (line 257) | fn test_pnpm_update_all() {
function test_pnpm_update_with_filter (line 269) | fn test_pnpm_update_with_filter() {
function test_pnpm_update_recursive (line 281) | fn test_pnpm_update_recursive() {
function test_pnpm_update_interactive (line 293) | fn test_pnpm_update_interactive() {
function test_pnpm_update_dev_only (line 305) | fn test_pnpm_update_dev_only() {
function test_pnpm_update_no_optional (line 317) | fn test_pnpm_update_no_optional() {
function test_pnpm_update_no_save (line 329) | fn test_pnpm_update_no_save() {
function test_pnpm_update_workspace_only (line 341) | fn test_pnpm_update_workspace_only() {
function test_yarn_v1_basic_update (line 354) | fn test_yarn_v1_basic_update() {
function test_yarn_v1_update_latest (line 365) | fn test_yarn_v1_update_latest() {
function test_yarn_v1_update_with_workspace (line 377) | fn test_yarn_v1_update_with_workspace() {
function test_yarn_v4_basic_update (line 389) | fn test_yarn_v4_basic_update() {
function test_yarn_v4_update_interactive (line 400) | fn test_yarn_v4_update_interactive() {
function test_yarn_v4_update_with_filter (line 412) | fn test_yarn_v4_update_with_filter() {
function test_yarn_v4_update_recursive (line 427) | fn test_yarn_v4_update_recursive() {
function test_npm_basic_update (line 439) | fn test_npm_basic_update() {
function test_npm_update_all (line 450) | fn test_npm_update_all() {
function test_npm_update_with_workspace (line 459) | fn test_npm_update_with_workspace() {
function test_npm_update_recursive (line 471) | fn test_npm_update_recursive() {
function test_npm_update_dev_only (line 483) | fn test_npm_update_dev_only() {
function test_npm_update_no_optional (line 495) | fn test_npm_update_no_optional() {
function test_npm_update_no_save (line 507) | fn test_npm_update_no_save() {
function test_global_update (line 519) | fn test_global_update() {
function test_pnpm_update_multiple_packages (line 531) | fn test_pnpm_update_multiple_packages() {
function test_pnpm_update_complex (line 543) | fn test_pnpm_update_complex() {
function test_yarn_v4_update_multiple_filters (line 573) | fn test_yarn_v4_update_multiple_filters() {
FILE: crates/vite_install/src/commands/view.rs
type ViewCommandOptions (line 11) | pub struct ViewCommandOptions<'a> {
method run_view_command (line 21) | pub async fn run_view_command(
method resolve_view_command (line 34) | pub fn resolve_view_command(&self, options: &ViewCommandOptions) -> Reso...
function create_temp_dir (line 69) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 73) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_view_uses_npm (line 91) | fn test_pnpm_view_uses_npm() {
function test_npm_view (line 104) | fn test_npm_view() {
function test_yarn_view_uses_npm (line 117) | fn test_yarn_view_uses_npm() {
function test_view_with_nested_field (line 130) | fn test_view_with_nested_field() {
FILE: crates/vite_install/src/commands/whoami.rs
type WhoamiCommandOptions (line 14) | pub struct WhoamiCommandOptions<'a> {
method run_whoami_command (line 23) | pub async fn run_whoami_command(
method resolve_whoami_command (line 38) | pub fn resolve_whoami_command(
function create_temp_dir (line 89) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 93) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_npm_whoami (line 111) | fn test_npm_whoami() {
function test_pnpm_whoami_uses_npm (line 124) | fn test_pnpm_whoami_uses_npm() {
function test_yarn1_whoami_not_supported (line 137) | fn test_yarn1_whoami_not_supported() {
function test_yarn2_whoami (line 147) | fn test_yarn2_whoami() {
function test_whoami_with_registry (line 160) | fn test_whoami_with_registry() {
FILE: crates/vite_install/src/commands/why.rs
type WhyCommandOptions (line 14) | pub struct WhyCommandOptions<'a> {
method run_why_command (line 36) | pub async fn run_why_command(
method resolve_why_command (line 48) | pub fn resolve_why_command(&self, options: &WhyCommandOptions) -> Resolv...
function create_temp_dir (line 222) | fn create_temp_dir() -> TempDir {
function create_mock_package_manager (line 226) | fn create_mock_package_manager(pm_type: PackageManagerType, version: &st...
function test_pnpm_why_basic (line 244) | fn test_pnpm_why_basic() {
function test_pnpm_why_multiple_packages (line 254) | fn test_pnpm_why_multiple_packages() {
function test_pnpm_why_json (line 264) | fn test_pnpm_why_json() {
function test_npm_explain_basic (line 277) | fn test_npm_explain_basic() {
function test_npm_explain_multiple_packages (line 287) | fn test_npm_explain_multiple_packages() {
function test_npm_explain_with_workspace (line 297) | fn test_npm_explain_with_workspace() {
function test_yarn_why_basic (line 311) | fn test_yarn_why_basic() {
function test_yarn_why_with_exclude_peers (line 321) | fn test_yarn_why_with_exclude_peers() {
function test_yarn1_why_no_peers (line 334) | fn test_yarn1_why_no_peers() {
function test_pnpm_why_with_filter (line 345) | fn test_pnpm_why_with_filter() {
function test_pnpm_why_with_depth (line 359) | fn test_pnpm_why_with_depth() {
function test_pnpm_why_with_find_by (line 372) | fn test_pnpm_why_with_find_by() {
FILE: crates/vite_install/src/config.rs
function npm_registry (line 4) | pub fn npm_registry() -> String {
function get_npm_package_tgz_url (line 9) | pub fn get_npm_package_tgz_url(name: &str, version: &str) -> String {
function get_npm_package_version_url (line 16) | pub fn get_npm_package_version_url(name: &str, version_or_tag: &str) -> ...
function test_npm_registry_default (line 26) | fn test_npm_registry_default() {
function test_npm_registry_custom (line 33) | fn test_npm_registry_custom() {
function test_npm_tgz_url (line 46) | fn test_npm_tgz_url() {
FILE: crates/vite_install/src/main.rs
function main (line 6) | async fn main() -> Result<(), Error> {
FILE: crates/vite_install/src/package_manager.rs
type PackageJson (line 34) | struct PackageJson {
type PackageManagerType (line 43) | pub enum PackageManagerType {
method fmt (line 50) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type ResolveCommandResult (line 61) | pub struct ResolveCommandResult {
type PackageManager (line 71) | pub struct PackageManager {
method builder (line 155) | pub fn builder(cwd: impl AsRef<AbsolutePath>) -> PackageManagerBuilder {
method get_bin_prefix (line 160) | pub fn get_bin_prefix(&self) -> AbsolutePathBuf {
method get_fingerprint_ignores (line 165) | pub fn get_fingerprint_ignores(&self) -> Result<Vec<Str>, Error> {
type PackageManagerBuilder (line 84) | pub struct PackageManagerBuilder {
method new (line 90) | pub fn new(cwd: impl AsRef<AbsolutePath>) -> Self {
method package_manager_type (line 95) | pub const fn package_manager_type(mut self, package_manager_type: Pack...
method build (line 102) | pub async fn build(&self) -> Result<PackageManager, Error> {
method build_with_default (line 137) | pub async fn build_with_default(&self) -> Result<PackageManager, Error> {
function get_package_manager_type_and_version (line 233) | pub fn get_package_manager_type_and_version(
function open_exists_file (line 322) | fn open_exists_file(path: impl AsRef<Path>) -> Result<Option<File>, Erro...
function is_exists_file (line 332) | fn is_exists_file(path: impl AsRef<Path>) -> Result<bool, Error> {
function get_latest_version (line 340) | async fn get_latest_version(package_manager_type: PackageManagerType) ->...
function download_package_manager (line 354) | pub async fn download_package_manager(
function remove_dir_all_force (line 453) | async fn remove_dir_all_force(path: impl AsRef<Path>) -> Result<(), std:...
function create_shim_files (line 475) | async fn create_shim_files(
function set_package_manager_field (line 518) | async fn set_package_manager_field(
constant CI_ENV_VARS (line 548) | const CI_ENV_VARS: &[&str] = &[
function is_ci_environment (line 563) | fn is_ci_environment() -> bool {
function interactive_package_manager_menu (line 568) | fn interactive_package_manager_menu() -> Result<PackageManagerType, Erro...
function prompt_package_manager_selection (line 704) | fn prompt_package_manager_selection() -> Result<PackageManagerType, Erro...
function simple_text_prompt (line 731) | fn simple_text_prompt() -> Result<PackageManagerType, Error> {
function create_temp_dir (line 780) | fn create_temp_dir() -> TempDir {
function create_package_json (line 784) | fn create_package_json(dir: &AbsolutePath, content: &str) {
function create_pnpm_workspace_yaml (line 788) | fn create_pnpm_workspace_yaml(dir: &AbsolutePath, content: &str) {
function test_find_package_root (line 794) | fn test_find_package_root() {
function test_find_workspace_root_with_pnpm (line 823) | fn test_find_workspace_root_with_pnpm() {
function test_find_workspace_root_with_npm_workspaces (line 840) | fn test_find_workspace_root_with_npm_workspaces() {
function test_find_workspace_root_fallback_to_package_root (line 857) | fn test_find_workspace_root_fallback_to_package_root() {
function test_find_workspace_root_with_package_json_not_found (line 877) | fn test_find_workspace_root_with_package_json_not_found() {
function test_find_package_root_with_package_json_in_current_dir (line 890) | fn test_find_package_root_with_package_json_in_current_dir() {
function test_find_package_root_with_package_json_in_parent_dir (line 901) | fn test_find_package_root_with_package_json_in_parent_dir() {
function test_find_package_root_with_package_json_in_grandparent_dir (line 915) | fn test_find_package_root_with_package_json_in_grandparent_dir() {
function test_find_workspace_root_with_pnpm_workspace_yaml (line 929) | fn test_find_workspace_root_with_pnpm_workspace_yaml() {
function test_find_workspace_root_with_pnpm_workspace_yaml_in_parent_dir (line 940) | fn test_find_workspace_root_with_pnpm_workspace_yaml_in_parent_dir() {
function test_find_workspace_root_with_package_json_workspaces (line 954) | fn test_find_workspace_root_with_package_json_workspaces() {
function test_find_workspace_root_with_package_json_workspaces_in_parent_dir (line 966) | fn test_find_workspace_root_with_package_json_workspaces_in_parent_dir() {
function test_find_workspace_root_prioritizes_pnpm_workspace_over_package_json (line 981) | fn test_find_workspace_root_prioritizes_pnpm_workspace_over_package_json...
function test_find_workspace_root_falls_back_to_package_root_when_no_workspace_found (line 998) | fn test_find_workspace_root_falls_back_to_package_root_when_no_workspace...
function test_find_workspace_root_with_nested_structure (line 1012) | fn test_find_workspace_root_with_nested_structure() {
function test_find_workspace_root_without_workspace_files_returns_package_root (line 1026) | fn test_find_workspace_root_without_workspace_files_returns_package_root...
function test_find_workspace_root_with_invalid_package_json_handles_error (line 1037) | fn test_find_workspace_root_with_invalid_package_json_handles_error() {
function test_find_workspace_root_with_mixed_structure (line 1048) | fn test_find_workspace_root_with_mixed_structure() {
function test_detect_package_manager_with_pnpm_workspace_yaml (line 1069) | async fn test_detect_package_manager_with_pnpm_workspace_yaml() {
function test_detect_package_manager_with_pnpm_lock_yaml (line 1081) | async fn test_detect_package_manager_with_pnpm_lock_yaml() {
function test_detect_package_manager_with_yarn_lock (line 1107) | async fn test_detect_package_manager_with_yarn_lock() {
function test_detect_package_manager_with_package_lock_json (line 1140) | async fn test_detect_package_manager_with_package_lock_json() {
function test_detect_package_manager_with_package_manager_field (line 1188) | async fn test_detect_package_manager_with_package_manager_field() {
function test_parse_package_manager_with_hash (line 1226) | async fn test_parse_package_manager_with_hash() {
function test_parse_package_manager_with_sha1_hash (line 1248) | async fn test_parse_package_manager_with_sha1_hash() {
function test_parse_package_manager_with_sha224_hash (line 1267) | async fn test_parse_package_manager_with_sha224_hash() {
function test_parse_package_manager_with_sha256_hash (line 1289) | async fn test_parse_package_manager_with_sha256_hash() {
function test_parse_package_manager_without_hash (line 1311) | async fn test_parse_package_manager_without_hash() {
function test_download_success_package_manager_with_hash (line 1329) | async fn test_download_success_package_manager_with_hash() {
function test_download_failed_package_manager_with_hash (line 1372) | async fn test_download_failed_package_manager_with_hash() {
function test_download_success_package_manager_with_sha1_and_sha224 (line 1396) | async fn test_download_success_package_manager_with_sha1_and_sha224() {
function test_detect_package_manager_with_yarn_package_manager_field (line 1421) | async fn test_detect_package_manager_with_yarn_package_manager_field() {
function test_detect_package_manager_with_npm_package_manager_field (line 1471) | async fn test_detect_package_manager_with_npm_package_manager_field() {
function test_detect_package_manager_with_invalid_package_manager_field (line 1485) | async fn test_detect_package_manager_with_invalid_package_manager_field() {
function test_detect_package_manager_with_not_exists_version_in_package_manager_field (line 1502) | async fn test_detect_package_manager_with_not_exists_version_in_package_...
function test_detect_package_manager_with_invalid_semver (line 1522) | async fn test_detect_package_manager_with_invalid_semver() {
function test_detect_package_manager_with_default_fallback (line 1535) | async fn test_detect_package_manager_with_default_fallback() {
function test_detect_package_manager_without_any_indicators (line 1558) | async fn test_detect_package_manager_without_any_indicators() {
function test_detect_package_manager_prioritizes_package_manager_field_over_lock_files (line 1575) | async fn test_detect_package_manager_prioritizes_package_manager_field_o...
function test_detect_package_manager_prioritizes_pnpm_workspace_over_lock_files (line 1593) | async fn test_detect_package_manager_prioritizes_pnpm_workspace_over_loc...
function test_detect_package_manager_from_subdirectory (line 1615) | async fn test_detect_package_manager_from_subdirectory() {
function test_download_package_manager (line 1633) | async fn test_download_package_manager() {
function test_get_latest_version (line 1655) | async fn test_get_latest_version() {
function test_detect_package_manager_with_yarnrc_yml (line 1669) | async fn test_detect_package_manager_with_yarnrc_yml() {
function test_detect_package_manager_with_pnpmfile_cjs (line 1703) | async fn test_detect_package_manager_with_pnpmfile_cjs() {
function test_detect_package_manager_with_yarn_config_cjs (line 1734) | async fn test_detect_package_manager_with_yarn_config_cjs() {
function test_detect_package_manager_priority_order_lock_over_config (line 1768) | async fn test_detect_package_manager_priority_order_lock_over_config() {
function test_detect_package_manager_pnpmfile_over_yarn_config (line 1803) | async fn test_detect_package_manager_pnpmfile_over_yarn_config() {
function create_mock_package_manager (line 1835) | fn create_mock_package_manager(
function test_get_fingerprint_ignores_monorepo (line 1856) | fn test_get_fingerprint_ignores_monorepo() {
function test_pnpm_fingerprint_ignores (line 1904) | fn test_pnpm_fingerprint_ignores() {
function test_yarn_fingerprint_ignores (line 1990) | fn test_yarn_fingerprint_ignores() {
function test_npm_fingerprint_ignores (line 2064) | fn test_npm_fingerprint_ignores() {
FILE: crates/vite_install/src/request.rs
type HttpClient (line 16) | pub struct HttpClient {
method new (line 29) | pub const fn new() -> Self {
method with_config (line 39) | pub const fn with_config(max_times: usize, min_delay: u64) -> Self {
method get_bytes (line 53) | pub async fn get_bytes(&self, url: &str) -> Result<Vec<u8>, Error> {
method get (line 59) | async fn get(&self, url: &str) -> Result<Response, Error> {
method get_json (line 82) | pub async fn get_json<T: DeserializeOwned>(&self, url: &str) -> Result...
method download_file (line 101) | pub async fn download_file(
method write_response_to_file (line 118) | async fn write_response_to_file(
method default (line 22) | fn default() -> Self {
function extract_tgz (line 138) | fn extract_tgz(tgz_file: impl AsRef<Path>, target_dir: impl AsRef<Path>)...
function download_and_extract_tgz_with_hash (line 163) | pub async fn download_and_extract_tgz_with_hash(
function compute_hash (line 213) | fn compute_hash<D: Digest>(content: &[u8]) -> String {
function verify_file_hash (line 228) | pub async fn verify_file_hash(
function create_mock_package_tgz (line 272) | fn create_mock_package_tgz() -> Vec<u8> {
function test_extract_tgz_function (line 320) | async fn test_extract_tgz_function() {
function test_extract_tgz_large_file (line 361) | async fn test_extract_tgz_large_file() {
function test_extract_tgz_invalid_file (line 402) | async fn test_extract_tgz_invalid_file() {
function test_extract_tgz_empty_file (line 418) | async fn test_extract_tgz_empty_file() {
function test_http_client_get_json (line 433) | async fn test_http_client_get_json() {
function test_http_client_download_file (line 470) | async fn test_http_client_download_file() {
function test_http_client_retry_on_server_error (line 495) | async fn test_http_client_retry_on_server_error() {
function test_download_and_extract_tgz (line 516) | async fn test_download_and_extract_tgz() {
function test_verify_file_hash_sha1 (line 540) | async fn test_verify_file_hash_sha1() {
function test_verify_file_hash_sha224 (line 569) | async fn test_verify_file_hash_sha224() {
function test_http_client_download_with_404_error (line 597) | async fn test_http_client_download_with_404_error() {
function test_http_client_json_with_invalid_response (line 620) | async fn test_http_client_json_with_invalid_response() {
FILE: crates/vite_install/src/shim.rs
function write_shims (line 9) | pub async fn write_shims(
function sh_shim (line 36) | pub fn sh_shim(relative_file: &str) -> String {
function cmd_shim (line 60) | pub fn cmd_shim(relative_file: &str) -> String {
function pwsh_shim (line 77) | pub fn pwsh_shim(relative_file: &str) -> String {
function format_shim (line 120) | fn format_shim(shim: &str) -> String {
function test_sh_shim (line 125) | fn test_sh_shim() {
function test_cmd_shim (line 132) | fn test_cmd_shim() {
function test_pwsh_shim (line 157) | fn test_pwsh_shim() {
function test_write_shims_basic (line 164) | async fn test_write_shims_basic() {
function test_write_shims_relative_paths (line 198) | async fn test_write_shims_relative_paths() {
function test_write_shims_windows_path_conversion (line 227) | async fn test_write_shims_windows_path_conversion() {
function test_write_shims_overwrite_existing (line 255) | async fn test_write_shims_overwrite_existing() {
function test_write_shims_complex_relative_path (line 286) | async fn test_write_shims_complex_relative_path() {
function test_sh_shim_content_validation (line 307) | async fn test_sh_shim_content_validation() {
function test_cmd_shim_content_validation (line 324) | async fn test_cmd_shim_content_validation() {
function test_pwsh_shim_content_validation (line 340) | async fn test_pwsh_shim_content_validation() {
function test_write_shims_error_handling (line 364) | async fn test_write_shims_error_handling() {
function test_cmd_shim_path_separator_conversion (line 376) | fn test_cmd_shim_path_separator_conversion() {
function test_relative_path_formats (line 389) | fn test_relative_path_formats() {
FILE: crates/vite_js_runtime/src/cache.rs
function get_cache_dir (line 10) | pub(crate) fn get_cache_dir() -> Result<AbsolutePathBuf, Error> {
FILE: crates/vite_js_runtime/src/dev_engines.rs
function parse_node_version_content (line 31) | pub fn parse_node_version_content(content: &str) -> Option<Str> {
function read_node_version_file (line 54) | pub async fn read_node_version_file(project_path: &AbsolutePath) -> Opti...
function write_node_version_file (line 71) | pub async fn write_node_version_file(
function test_parse_node_version_content_three_part (line 88) | fn test_parse_node_version_content_three_part() {
function test_parse_node_version_content_with_v_prefix (line 95) | fn test_parse_node_version_content_with_v_prefix() {
function test_parse_node_version_content_two_part (line 102) | fn test_parse_node_version_content_two_part() {
function test_parse_node_version_content_single_part (line 108) | fn test_parse_node_version_content_single_part() {
function test_parse_node_version_content_with_whitespace (line 114) | fn test_parse_node_version_content_with_whitespace() {
function test_parse_node_version_content_empty (line 120) | fn test_parse_node_version_content_empty() {
function test_read_node_version_file (line 127) | async fn test_read_node_version_file() {
function test_write_node_version_file (line 140) | async fn test_write_node_version_file() {
function test_parse_node_version_content_lts_latest (line 158) | fn test_parse_node_version_content_lts_latest() {
function test_parse_node_version_content_lts_codename (line 166) | fn test_parse_node_version_content_lts_codename() {
function test_parse_node_version_content_lts_offset (line 177) | fn test_parse_node_version_content_lts_offset() {
FILE: crates/vite_js_runtime/src/download.rs
type CachedFetchResponse (line 19) | pub struct CachedFetchResponse {
function download_file (line 35) | pub async fn download_file(
function download_text (line 116) | pub async fn download_text(url: &str) -> Result<String, Error> {
function fetch_with_cache_headers (line 136) | pub async fn fetch_with_cache_headers(
function parse_max_age (line 191) | fn parse_max_age(cache_control: &str) -> Option<u64> {
function verify_file_hash (line 202) | pub async fn verify_file_hash(
function extract_archive (line 228) | pub async fn extract_archive(
function extract_tar_gz (line 246) | fn extract_tar_gz(archive_path: &AbsolutePath, target_dir: &AbsolutePath...
function extract_zip (line 262) | fn extract_zip(archive_path: &AbsolutePath, target_dir: &AbsolutePath) -...
function move_to_cache (line 281) | pub async fn move_to_cache(
function test_parse_max_age (line 332) | fn test_parse_max_age() {
FILE: crates/vite_js_runtime/src/error.rs
type Error (line 6) | pub enum Error {
FILE: crates/vite_js_runtime/src/platform.rs
type Platform (line 5) | pub struct Platform {
method current (line 28) | pub const fn current() -> Self {
method fmt (line 34) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type Os (line 12) | pub enum Os {
method current (line 49) | pub const fn current() -> Self {
method fmt (line 72) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type Arch (line 20) | pub enum Arch {
method current (line 90) | pub const fn current() -> Self {
method fmt (line 109) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function test_platform_detection (line 122) | fn test_platform_detection() {
function test_platform_display (line 135) | fn test_platform_display() {
function test_os_display (line 151) | fn test_os_display() {
function test_arch_display (line 158) | fn test_arch_display() {
FILE: crates/vite_js_runtime/src/provider.rs
type ArchiveFormat (line 13) | pub enum ArchiveFormat {
method extension (line 23) | pub const fn extension(self) -> &'static str {
type HashVerification (line 33) | pub enum HashVerification {
type DownloadInfo (line 46) | pub struct DownloadInfo {
type JsRuntimeProvider (line 64) | pub trait JsRuntimeProvider: Send + Sync {
method name (line 66) | fn name(&self) -> &'static str;
method platform_string (line 70) | fn platform_string(&self, platform: Platform) -> Str;
method get_download_info (line 73) | fn get_download_info(&self, version: &str, platform: Platform) -> Down...
method binary_relative_path (line 77) | fn binary_relative_path(&self, platform: Platform) -> Str;
method bin_dir_relative_path (line 81) | fn bin_dir_relative_path(&self, platform: Platform) -> Str;
method parse_shasums (line 89) | fn parse_shasums(&self, shasums_content: &str, filename: &str) -> Resu...
FILE: crates/vite_js_runtime/src/providers/node.rs
constant DEFAULT_NODE_DIST_URL (line 19) | const DEFAULT_NODE_DIST_URL: &str = "https://nodejs.org/dist";
constant DEFAULT_CACHE_TTL_SECS (line 24) | const DEFAULT_CACHE_TTL_SECS: u64 = 3600;
type NodeVersionEntry (line 28) | pub struct NodeVersionEntry {
method is_lts (line 39) | pub fn is_lts(&self) -> bool {
type LtsInfo (line 47) | pub enum LtsInfo {
type VersionIndexCache (line 59) | struct VersionIndexCache {
type NodeProvider (line 71) | pub struct NodeProvider;
method new (line 76) | pub const fn new() -> Self {
method is_exact_version (line 85) | pub fn is_exact_version(version_str: &str) -> bool {
method find_cached_version (line 106) | pub async fn find_cached_version(
method archive_format (line 164) | const fn archive_format(platform: Platform) -> ArchiveFormat {
method fetch_version_index (line 180) | pub async fn fetch_version_index(&self) -> Result<Vec<NodeVersionEntry...
method fetch_with_etag (line 223) | async fn fetch_with_etag(
method fetch_and_cache (line 263) | async fn fetch_and_cache(
method resolve_version (line 296) | pub async fn resolve_version(&self, version_req: &str) -> Result<Str, ...
method resolve_latest_version (line 306) | pub async fn resolve_latest_version(&self) -> Result<Str, Error> {
method is_lts_alias (line 318) | pub fn is_lts_alias(version: &str) -> bool {
method is_latest_alias (line 327) | pub fn is_latest_alias(version: &str) -> bool {
method is_version_alias (line 333) | pub fn is_version_alias(version: &str) -> bool {
method resolve_lts_alias (line 351) | pub async fn resolve_lts_alias(&self, alias: &str) -> Result<Str, Erro...
method resolve_lts_by_codename (line 375) | async fn resolve_lts_by_codename(&self, codename: &str) -> Result<Str,...
method resolve_lts_by_offset (line 406) | async fn resolve_lts_by_offset(&self, offset: i32) -> Result<Str, Erro...
function find_latest_lts_version (line 444) | fn find_latest_lts_version(versions: &[NodeVersionEntry]) -> Result<Str,...
function resolve_version_from_list (line 468) | fn resolve_version_from_list(
function load_cache (line 505) | async fn load_cache(cache_path: &AbsolutePathBuf) -> Option<VersionIndex...
function save_cache (line 511) | async fn save_cache(cache_path: &AbsolutePathBuf, cache: &VersionIndexCa...
function calculate_expires_at (line 524) | fn calculate_expires_at(max_age: Option<u64>) -> u64 {
function get_dist_url (line 533) | fn get_dist_url() -> Str {
method name (line 542) | fn name(&self) -> &'static str {
method platform_string (line 546) | fn platform_string(&self, platform: Platform) -> Str {
method get_download_info (line 559) | fn get_download_info(&self, version: &str, platform: Platform) -> Downlo...
method binary_relative_path (line 579) | fn binary_relative_path(&self, platform: Platform) -> Str {
method bin_dir_relative_path (line 586) | fn bin_dir_relative_path(&self, platform: Platform) -> Str {
method parse_shasums (line 593) | fn parse_shasums(&self, shasums_content: &str, filename: &str) -> Result...
function test_platform_string (line 616) | fn test_platform_string() {
function test_get_download_info (line 634) | fn test_get_download_info() {
function test_get_download_info_windows (line 656) | fn test_get_download_info_windows() {
function test_binary_relative_path (line 667) | fn test_binary_relative_path() {
function test_bin_dir_relative_path (line 685) | fn test_bin_dir_relative_path() {
function test_parse_shasums (line 699) | fn test_parse_shasums() {
function test_get_dist_url_default (line 725) | fn test_get_dist_url_default() {
function test_get_dist_url_with_mirror (line 732) | fn test_get_dist_url_with_mirror() {
function test_get_dist_url_trims_trailing_slash (line 745) | fn test_get_dist_url_trims_trailing_slash() {
function test_parse_lts_info (line 758) | fn test_parse_lts_info() {
function test_fetch_version_index (line 774) | async fn test_fetch_version_index() {
function test_resolve_version_from_list_caret (line 791) | fn test_resolve_version_from_list_caret() {
function test_resolve_version_from_list_tilde (line 809) | fn test_resolve_version_from_list_tilde() {
function test_resolve_version_from_list_exact (line 826) | fn test_resolve_version_from_list_exact() {
function test_resolve_version_from_list_range (line 841) | fn test_resolve_version_from_list_range() {
function test_resolve_version_from_list_no_match (line 861) | fn test_resolve_version_from_list_no_match() {
function test_resolve_version_from_list_empty (line 875) | fn test_resolve_version_from_list_empty() {
function test_resolve_version_from_list_invalid_range (line 884) | fn test_resolve_version_from_list_invalid_range() {
function test_resolve_version_from_list_unordered_finds_max (line 898) | fn test_resolve_version_from_list_unordered_finds_max() {
function test_find_latest_lts_version (line 916) | fn test_find_latest_lts_version() {
function test_find_latest_lts_version_unordered (line 946) | fn test_find_latest_lts_version_unordered() {
function test_find_latest_lts_version_no_lts (line 968) | fn test_find_latest_lts_version_no_lts() {
function test_find_latest_lts_version_empty (line 983) | fn test_find_latest_lts_version_empty() {
function test_is_lts (line 992) | fn test_is_lts() {
function test_is_exact_version (line 1007) | fn test_is_exact_version() {
function test_find_cached_version (line 1033) | async fn test_find_cached_version() {
function test_resolve_version_from_list_prefers_lts (line 1086) | fn test_resolve_version_from_list_prefers_lts() {
function test_resolve_version_from_list_falls_back_to_non_lts (line 1102) | fn test_resolve_version_from_list_falls_back_to_non_lts() {
function test_resolve_version_from_list_complex_range_prefers_lts (line 1116) | fn test_resolve_version_from_list_complex_range_prefers_lts() {
function test_resolve_version_from_list_only_matches_in_range_lts (line 1132) | fn test_resolve_version_from_list_only_matches_in_range_lts() {
function test_is_lts_alias (line 1151) | fn test_is_lts_alias() {
function test_is_latest_alias (line 1175) | fn test_is_latest_alias() {
function test_is_version_alias (line 1191) | fn test_is_version_alias() {
function test_resolve_lts_alias_latest (line 1207) | async fn test_resolve_lts_alias_latest() {
function test_resolve_lts_alias_codename_iron (line 1221) | async fn test_resolve_lts_alias_codename_iron() {
function test_resolve_lts_alias_codename_jod (line 1231) | async fn test_resolve_lts_alias_codename_jod() {
function test_resolve_lts_alias_codename_case_insensitive (line 1241) | async fn test_resolve_lts_alias_codename_case_insensitive() {
function test_resolve_lts_alias_offset (line 1252) | async fn test_resolve_lts_alias_offset() {
function test_resolve_lts_alias_unknown_codename (line 1263) | async fn test_resolve_lts_alias_unknown_codename() {
function test_resolve_lts_alias_invalid_offset (line 1272) | async fn test_resolve_lts_alias_invalid_offset() {
FILE: crates/vite_js_runtime/src/runtime.rs
type JsRuntimeType (line 16) | pub enum JsRuntimeType {
method fmt (line 22) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type JsRuntime (line 31) | pub struct JsRuntime {
method get_binary_path (line 44) | pub fn get_binary_path(&self) -> AbsolutePathBuf {
method get_bin_prefix (line 50) | pub fn get_bin_prefix(&self) -> AbsolutePathBuf {
method runtime_type (line 60) | pub const fn runtime_type(&self) -> JsRuntimeType {
method version (line 66) | pub fn version(&self) -> &str {
function download_runtime (line 82) | pub async fn download_runtime(
function download_runtime_with_provider (line 105) | pub async fn download_runtime_with_provider<P: JsRuntimeProvider>(
type VersionSource (line 194) | pub enum VersionSource {
method fmt (line 204) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type VersionResolution (line 215) | pub struct VersionResolution {
function resolve_node_version (line 245) | pub async fn resolve_node_version(
function download_runtime_for_project (line 342) | pub async fn download_runtime_for_project(project_path: &AbsolutePath) -...
function resolve_version_for_project (line 401) | async fn resolve_version_for_project(
function check_version_compatibility (line 444) | fn check_version_compatibility(
function check_constraint (line 471) | fn check_constraint(
function is_valid_version (line 497) | pub fn is_valid_version(version: &str) -> bool {
function normalize_version (line 521) | pub fn normalize_version(version: &Str, source: &str) -> Option<Str> {
function read_package_json (line 536) | pub async fn read_package_json(
function test_js_runtime_type_display (line 556) | fn test_js_runtime_type_display() {
function test_install_dir_path_construction (line 563) | fn test_install_dir_path_construction() {
function test_download_runtime_for_project_with_dev_engines (line 596) | async fn test_download_runtime_for_project_with_dev_engines() {
function test_download_runtime_for_project_with_multiple_runtimes (line 619) | async fn test_download_runtime_for_project_with_multiple_runtimes() {
function test_download_runtime_for_project_no_dev_engines (line 644) | async fn test_download_runtime_for_project_no_dev_engines() {
function test_download_runtime_for_project_does_not_write_back_when_no_version (line 676) | async fn test_download_runtime_for_project_does_not_write_back_when_no_v...
function test_download_runtime_for_project_does_not_write_back_when_version_specified (line 706) | async fn test_download_runtime_for_project_does_not_write_back_when_vers...
function test_download_runtime_for_project_with_v_prefix_exact_version (line 737) | async fn test_download_runtime_for_project_with_v_prefix_exact_version() {
function test_download_runtime_for_project_no_package_json (line 757) | async fn test_download_runtime_for_project_no_package_json() {
function test_download_runtime_for_project_inherits_parent_node_version (line 775) | async fn test_download_runtime_for_project_inherits_parent_node_version() {
function test_download_node_integration (line 801) | async fn test_download_node_integration() {
function test_download_node_cache_reuse (line 828) | async fn test_download_node_cache_reuse() {
function test_incomplete_installation_cleanup (line 849) | async fn test_incomplete_installation_cleanup() {
function test_concurrent_downloads (line 882) | async fn test_concurrent_downloads() {
function test_node_version_file_takes_priority (line 955) | async fn test_node_version_file_takes_priority() {
function test_engines_node_takes_priority_over_dev_engines (line 976) | async fn test_engines_node_takes_priority_over_dev_engines() {
function test_only_engines_node_source (line 995) | async fn test_only_engines_node_source() {
function test_node_version_file_partial_version (line 1013) | async fn test_node_version_file_partial_version() {
function test_node_version_file_single_part_version (line 1035) | async fn test_node_version_file_single_part_version() {
function test_version_source_display (line 1055) | fn test_version_source_display() {
function test_invalid_node_version_file_is_ignored (line 1066) | async fn test_invalid_node_version_file_is_ignored() {
function test_invalid_engines_node_is_ignored (line 1088) | async fn test_invalid_engines_node_is_ignored() {
function test_invalid_dev_engines_runtime_is_ignored (line 1107) | async fn test_invalid_dev_engines_runtime_is_ignored() {
function test_invalid_node_version_file_falls_through_to_valid_engines (line 1126) | async fn test_invalid_node_version_file_falls_through_to_valid_engines() {
function test_invalid_engines_falls_through_to_valid_dev_engines (line 1145) | async fn test_invalid_engines_falls_through_to_valid_dev_engines() {
function test_normalize_version_exact (line 1164) | fn test_normalize_version_exact() {
function test_normalize_version_with_v_prefix (line 1170) | fn test_normalize_version_with_v_prefix() {
function test_normalize_version_range (line 1176) | fn test_normalize_version_range() {
function test_normalize_version_partial (line 1182) | fn test_normalize_version_partial() {
function test_normalize_version_invalid (line 1192) | fn test_normalize_version_invalid() {
function test_normalize_version_real_world_ranges (line 1201) | fn test_normalize_version_real_world_ranges() {
function test_normalize_version_with_negation (line 1227) | fn test_normalize_version_with_negation() {
function test_normalize_version_with_whitespace (line 1238) | fn test_normalize_version_with_whitespace() {
function test_normalize_version_empty_or_whitespace_only (line 1256) | fn test_normalize_version_empty_or_whitespace_only() {
function test_normalize_version_lts_aliases (line 1265) | fn test_normalize_version_lts_aliases() {
function test_normalize_version_latest_alias (line 1275) | fn test_normalize_version_latest_alias() {
function test_download_runtime_for_project_with_lts_alias_in_node_version (line 1283) | async fn test_download_runtime_for_project_with_lts_alias_in_node_versio...
function test_download_runtime_for_project_with_lts_latest_alias (line 1305) | async fn test_download_runtime_for_project_with_lts_latest_alias() {
function test_download_runtime_for_project_with_latest_alias_in_node_version (line 1327) | async fn test_download_runtime_for_project_with_latest_alias_in_node_ver...
function test_resolve_node_version_no_walk_up (line 1354) | async fn test_resolve_node_version_no_walk_up() {
function test_resolve_node_version_with_walk_up (line 1369) | async fn test_resolve_node_version_with_walk_up() {
function test_resolve_node_version_engines_node (line 1391) | async fn test_resolve_node_version_engines_node() {
function test_resolve_node_version_dev_engines (line 1405) | async fn test_resolve_node_version_dev_engines() {
function test_resolve_node_version_priority (line 1419) | async fn test_resolve_node_version_priority() {
function test_resolve_node_version_none_when_no_sources (line 1435) | async fn test_resolve_node_version_none_when_no_sources() {
function test_resolve_node_version_child_package_json_over_parent_node_version (line 1457) | async fn test_resolve_node_version_child_package_json_over_parent_node_v...
FILE: crates/vite_migration/src/ast_grep.rs
function apply_rules (line 21) | pub(crate) fn apply_rules(content: &str, rule_yaml: &str) -> Result<(Str...
function load_rules (line 29) | pub(crate) fn load_rules(yaml: &str) -> Result<Vec<RuleConfig<SupportLan...
function apply_loaded_rules (line 48) | pub(crate) fn apply_loaded_rules(content: &str, rules: &[RuleConfig<Supp...
FILE: crates/vite_migration/src/eslint.rs
constant ESLINT_CONFIG (line 3) | const ESLINT_CONFIG: ScriptRewriteConfig = ScriptRewriteConfig {
function rewrite_eslint_script (line 27) | pub(crate) fn rewrite_eslint_script(script: &str) -> String {
function test_rewrite_eslint_script (line 36) | fn test_rewrite_eslint_script() {
function test_rewrite_eslint_compound_commands (line 113) | fn test_rewrite_eslint_compound_commands() {
function test_rewrite_eslint_cross_env (line 134) | fn test_rewrite_eslint_cross_env() {
FILE: crates/vite_migration/src/file_walker.rs
constant TS_JS_EXTENSIONS (line 8) | const TS_JS_EXTENSIONS: &[&str] = &["ts", "tsx", "mts", "js", "jsx", "mj...
type WalkResult (line 12) | pub struct WalkResult {
function find_ts_files (line 48) | pub fn find_ts_files(root: &Path) -> Result<WalkResult, Error> {
function test_find_ts_files_basic (line 88) | fn test_find_ts_files_basic() {
function test_find_ts_files_nested (line 104) | fn test_find_ts_files_nested() {
function test_find_ts_files_respects_gitignore (line 122) | fn test_find_ts_files_respects_gitignore() {
function test_find_ts_files_all_extensions (line 147) | fn test_find_ts_files_all_extensions() {
function test_find_ts_files_empty_directory (line 171) | fn test_find_ts_files_empty_directory() {
function test_find_ts_files_skips_hidden (line 180) | fn test_find_ts_files_skips_hidden() {
FILE: crates/vite_migration/src/import_rewriter.rs
constant REWRITE_VITE_RULES (line 19) | const REWRITE_VITE_RULES: &str = r#"---
constant REWRITE_VITEST_RULES (line 110) | const REWRITE_VITEST_RULES: &str = r#"---
constant REWRITE_TSDOWN_RULES (line 245) | const REWRITE_TSDOWN_RULES: &str = r#"---
function apply_regex_replace (line 327) | fn apply_regex_replace(content: &mut String, re: &Regex, replacement: &s...
function rewrite_reference_types (line 344) | fn rewrite_reference_types(content: &mut String, skip_packages: &SkipPac...
type SkipPackages (line 506) | struct SkipPackages {
method all_skipped (line 517) | fn all_skipped(&self) -> bool {
function find_nearest_package_json (line 524) | fn find_nearest_package_json(file_path: &Path, root: &Path) -> Option<Pa...
function get_skip_packages_from_package_json (line 547) | fn get_skip_packages_from_package_json(package_json_path: &Path) -> Skip...
type RewriteResult (line 578) | struct RewriteResult {
type BatchRewriteResult (line 587) | pub struct BatchRewriteResult {
function rewrite_imports_in_directory (line 625) | pub fn rewrite_imports_in_directory(root: &Path) -> Result<BatchRewriteR...
function rewrite_import (line 693) | fn rewrite_import(file_path: &Path, skip_packages: &SkipPackages) -> Res...
function rewrite_import_content (line 705) | fn rewrite_import_content(
function test_rewrite_import_content_vite (line 757) | fn test_rewrite_import_content_vite() {
function test_rewrite_import_content_vite_double_quotes (line 777) | fn test_rewrite_import_content_vite_double_quotes() {
function test_rewrite_import_content_vitest_config (line 797) | fn test_rewrite_import_content_vitest_config() {
function test_rewrite_import_content_multiple_imports (line 821) | fn test_rewrite_import_content_multiple_imports() {
function test_rewrite_import_content_already_vite_plus (line 843) | fn test_rewrite_import_content_already_vite_plus() {
function test_rewrite_import_with_file (line 856) | fn test_rewrite_import_with_file() {
function test_rewrite_import_content_vitest (line 889) | fn test_rewrite_import_content_vitest() {
function test_rewrite_import_content_vitest_double_quotes (line 913) | fn test_rewrite_import_content_vitest_double_quotes() {
function test_rewrite_import_content_vitest_browser (line 929) | fn test_rewrite_import_content_vitest_browser() {
function test_rewrite_import_content_vitest_browser_double_quotes (line 945) | fn test_rewrite_import_content_vitest_browser_double_quotes() {
function test_rewrite_import_content_vitest_browser_playwright (line 961) | fn test_rewrite_import_content_vitest_browser_playwright() {
function test_rewrite_import_content_vitest_browser_playwright_double_quotes (line 977) | fn test_rewrite_import_content_vitest_browser_playwright_double_quotes() {
function test_rewrite_import_content_vitest_browser_subpath (line 993) | fn test_rewrite_import_content_vitest_browser_subpath() {
function test_rewrite_import_content_vitest_browser_playwright_subpath (line 1009) | fn test_rewrite_import_content_vitest_browser_playwright_subpath() {
function test_rewrite_import_content_vitest_browser_preview (line 1025) | fn test_rewrite_import_content_vitest_browser_preview() {
function test_rewrite_import_content_vitest_browser_preview_subpath (line 1041) | fn test_rewrite_import_content_vitest_browser_preview_subpath() {
function test_rewrite_import_content_vitest_browser_webdriverio (line 1057) | fn test_rewrite_import_content_vitest_browser_webdriverio() {
function test_rewrite_import_content_vitest_browser_webdriverio_subpath (line 1073) | fn test_rewrite_import_content_vitest_browser_webdriverio_subpath() {
function test_rewrite_import_content_vite_subpath (line 1089) | fn test_rewrite_import_content_vite_subpath() {
function test_rewrite_import_content_vite_subpath_double_quotes (line 1105) | fn test_rewrite_import_content_vite_subpath_double_quotes() {
function test_rewrite_import_content_vitest_subpath (line 1121) | fn test_rewrite_import_content_vitest_subpath() {
function test_rewrite_import_content_vitest_subpath_double_quotes (line 1152) | fn test_rewrite_import_content_vitest_subpath_double_quotes() {
function test_rewrite_import_content_mixed_imports (line 1168) | fn test_rewrite_import_content_mixed_imports() {
function test_rewrite_imports_in_directory (line 1201) | fn test_rewrite_imports_in_directory() {
function test_rewrite_imports_in_directory_empty (line 1267) | fn test_rewrite_imports_in_directory_empty() {
function test_rewrite_imports_in_directory_nested (line 1278) | fn test_rewrite_imports_in_directory_nested() {
function test_rewrite_declare_module_vite (line 1337) | fn test_rewrite_declare_module_vite() {
function test_rewrite_declare_module_vite_double_quotes (line 1357) | fn test_rewrite_declare_module_vite_double_quotes() {
function test_rewrite_declare_module_vitest (line 1377) | fn test_rewrite_declare_module_vitest() {
function test_rewrite_declare_module_vitest_config (line 1397) | fn test_rewrite_declare_module_vitest_config() {
function test_rewrite_declare_module_vite_subpath (line 1417) | fn test_rewrite_declare_module_vite_subpath() {
function test_rewrite_declare_module_vitest_subpath (line 1437) | fn test_rewrite_declare_module_vitest_subpath() {
function test_rewrite_declare_module_vitest_browser (line 1457) | fn test_rewrite_declare_module_vitest_browser() {
function test_rewrite_declare_module_vitest_browser_subpath (line 1477) | fn test_rewrite_declare_module_vitest_browser_subpath() {
function test_rewrite_declare_module_vitest_browser_playwright (line 1497) | fn test_rewrite_declare_module_vitest_browser_playwright() {
function test_rewrite_declare_module_vitest_browser_preview (line 1517) | fn test_rewrite_declare_module_vitest_browser_preview() {
function test_rewrite_declare_module_vitest_browser_webdriverio (line 1537) | fn test_rewrite_declare_module_vitest_browser_webdriverio() {
function test_rewrite_mixed_imports_and_declare_modules (line 1557) | fn test_rewrite_mixed_imports_and_declare_modules() {
function test_rewrite_declare_module_already_vite_plus (line 1599) | fn test_rewrite_declare_module_already_vite_plus() {
function test_rewrite_multiple_declare_modules (line 1612) | fn test_rewrite_multiple_declare_modules() {
function test_rewrite_declare_module_vitest_double_quotes (line 1668) | fn test_rewrite_declare_module_vitest_double_quotes() {
function test_rewrite_declare_module_vitest_browser_playwright_subpath (line 1688) | fn test_rewrite_declare_module_vitest_browser_playwright_subpath() {
function test_rewrite_declare_module_vitest_browser_preview_subpath (line 1708) | fn test_rewrite_declare_module_vitest_browser_preview_subpath() {
function test_rewrite_declare_module_vitest_browser_webdriverio_subpath (line 1728) | fn test_rewrite_declare_module_vitest_browser_webdriverio_subpath() {
function test_rewrite_declare_module_complex_interface (line 1748) | fn test_rewrite_declare_module_complex_interface() {
function test_rewrite_import_content_tsdown (line 1792) | fn test_rewrite_import_content_tsdown() {
function test_rewrite_import_content_tsdown_double_quotes (line 1812) | fn test_rewrite_import_content_tsdown_double_quotes() {
function test_rewrite_declare_module_tsdown (line 1832) | fn test_rewrite_declare_module_tsdown() {
function test_rewrite_declare_module_tsdown_double_quotes (line 1852) | fn test_rewrite_declare_module_tsdown_double_quotes() {
function test_skip_vite_when_peer_dependency (line 1876) | fn test_skip_vite_when_peer_dependency() {
function test_skip_vitest_when_peer_dependency (line 1899) | fn test_skip_vitest_when_peer_dependency() {
function test_skip_all_when_all_peer_dependencies (line 1922) | fn test_skip_all_when_all_peer_dependencies() {
function test_skip_packages_all_skipped (line 1938) | fn test_skip_packages_all_skipped() {
function test_get_skip_packages_from_package_json_with_vite_peer_dep (line 1950) | fn test_get_skip_packages_from_package_json_with_vite_peer_dep() {
function test_get_skip_packages_from_package_json_with_all_peer_deps (line 1972) | fn test_get_skip_packages_from_package_json_with_all_peer_deps() {
function test_get_skip_packages_from_package_json_with_vite_dependency (line 1996) | fn test_get_skip_packages_from_package_json_with_vite_dependency() {
function test_get_skip_packages_from_package_json_no_file (line 2018) | fn test_get_skip_packages_from_package_json_no_file() {
function test_get_skip_packages_from_package_json_no_deps (line 2030) | fn test_get_skip_packages_from_package_json_no_deps() {
function test_get_skip_packages_mixed_peer_and_regular_deps (line 2049) | fn test_get_skip_packages_mixed_peer_and_regular_deps() {
function test_rewrite_imports_in_directory_with_vite_dependency (line 2074) | fn test_rewrite_imports_in_directory_with_vite_dependency() {
function test_rewrite_imports_in_directory_with_peer_deps (line 2117) | fn test_rewrite_imports_in_directory_with_peer_deps() {
function test_rewrite_imports_skips_file_when_all_peer_deps (line 2160) | fn test_rewrite_imports_skips_file_when_all_peer_deps() {
function test_find_nearest_package_json (line 2195) | fn test_find_nearest_package_json() {
function test_rewrite_imports_monorepo_different_peer_deps (line 2234) | fn test_rewrite_imports_monorepo_different_peer_deps() {
function test_rewrite_reference_types_vite_client (line 2306) | fn test_rewrite_reference_types_vite_client() {
function test_rewrite_reference_types_vite_client_single_quotes (line 2314) | fn test_rewrite_reference_types_vite_client_single_quotes() {
function test_rewrite_reference_types_bare_vite (line 2322) | fn test_rewrite_reference_types_bare_vite() {
function test_rewrite_reference_types_bare_vitest (line 2330) | fn test_rewrite_reference_types_bare_vitest() {
function test_rewrite_reference_types_vitest_globals (line 2338) | fn test_rewrite_reference_types_vitest_globals() {
function test_rewrite_reference_types_vitest_config (line 2346) | fn test_rewrite_reference_types_vitest_config() {
function test_rewrite_reference_types_vitest_browser (line 2354) | fn test_rewrite_reference_types_vitest_browser() {
function test_rewrite_reference_types_vitest_scoped_browser_matchers_not_rewritten (line 2362) | fn test_rewrite_reference_types_vitest_scoped_browser_matchers_not_rewri...
function test_rewrite_reference_types_vitest_scoped_browser_context (line 2371) | fn test_rewrite_reference_types_vitest_scoped_browser_context() {
function test_rewrite_reference_types_vitest_scoped_browser_playwright (line 2379) | fn test_rewrite_reference_types_vitest_scoped_browser_playwright() {
function test_rewrite_reference_types_vitest_scoped_browser_playwright_pkg (line 2390) | fn test_rewrite_reference_types_vitest_scoped_browser_playwright_pkg() {
function test_rewrite_reference_types_vitest_scoped_browser_webdriverio (line 2401) | fn test_rewrite_reference_types_vitest_scoped_browser_webdriverio() {
function test_rewrite_reference_types_tsdown_subpath_not_rewritten (line 2412) | fn test_rewrite_reference_types_tsdown_subpath_not_rewritten() {
function test_rewrite_reference_types_vitest_scoped_not_matching (line 2421) | fn test_rewrite_reference_types_vitest_scoped_not_matching() {
function test_rewrite_reference_types_inside_template_literal_not_rewritten (line 2430) | fn test_rewrite_reference_types_inside_template_literal_not_rewritten() {
function test_rewrite_reference_types_preamble_only (line 2442) | fn test_rewrite_reference_types_preamble_only() {
function test_rewrite_reference_types_after_block_comment (line 2463) | fn test_rewrite_reference_types_after_block_comment() {
function test_rewrite_reference_types_after_multiline_block_comment (line 2475) | fn test_rewrite_reference_types_after_multiline_block_comment() {
function test_rewrite_reference_types_block_comment_with_trailing_code (line 2488) | fn test_rewrite_reference_types_block_comment_with_trailing_code() {
function test_rewrite_reference_types_block_comment_with_trailing_comment (line 2497) | fn test_rewrite_reference_types_block_comment_with_trailing_comment() {
function test_rewrite_reference_types_multiline_block_comment_closes_into_code (line 2509) | fn test_rewrite_reference_types_multiline_block_comment_closes_into_code...
function test_rewrite_reference_types_multiline_block_comment_closes_into_comment (line 2518) | fn test_rewrite_reference_types_multiline_block_comment_closes_into_comm...
function test_rewrite_reference_types_block_close_into_new_block_comment (line 2530) | fn test_rewrite_reference_types_block_close_into_new_block_comment() {
function test_rewrite_reference_types_multiple_inline_block_comments_then_code (line 2542) | fn test_rewrite_reference_types_multiple_inline_block_comments_then_code...
function test_rewrite_reference_types_multiple_inline_block_comments_no_code (line 2551) | fn test_rewrite_reference_types_multiple_inline_block_comments_no_code() {
function test_rewrite_reference_types_vitest_browser_providers_playwright (line 2563) | fn test_rewrite_reference_types_vitest_browser_providers_playwright() {
function test_rewrite_reference_types_crlf (line 2575) | fn test_rewrite_reference_types_crlf() {
function test_rewrite_reference_types_crlf_with_block_comment (line 2588) | fn test_rewrite_reference_types_crlf_with_block_comment() {
function test_rewrite_reference_types_no_space_after_slashes (line 2601) | fn test_rewrite_reference_types_no_space_after_slashes() {
function test_rewrite_reference_types_tab_after_slashes (line 2610) | fn test_rewrite_reference_types_tab_after_slashes() {
function test_rewrite_reference_types_after_shebang (line 2619) | fn test_rewrite_reference_types_after_shebang() {
function test_rewrite_reference_types_after_bom (line 2631) | fn test_rewrite_reference_types_after_bom() {
function test_rewrite_reference_types_bare_tsdown (line 2640) | fn test_rewrite_reference_types_bare_tsdown() {
function test_rewrite_reference_types_already_migrated (line 2648) | fn test_rewrite_reference_types_already_migrated() {
function test_rewrite_reference_types_preserves_non_matching (line 2656) | fn test_rewrite_reference_types_preserves_non_matching() {
function test_rewrite_reference_types_with_leading_whitespace (line 2666) | fn test_rewrite_reference_types_with_leading_whitespace() {
function test_rewrite_reference_types_env_d_ts_style (line 2674) | fn test_rewrite_reference_types_env_d_ts_style() {
function test_rewrite_reference_types_mixed_with_imports (line 2694) | fn test_rewrite_reference_types_mixed_with_imports() {
function test_rewrite_reference_types_skip_vite (line 2712) | fn test_rewrite_reference_types_skip_vite() {
function test_rewrite_reference_types_skip_vitest (line 2728) | fn test_rewrite_reference_types_skip_vitest() {
function test_rewrite_reference_types_skip_tsdown (line 2746) | fn test_rewrite_reference_types_skip_tsdown() {
function test_rewrite_reference_types_skip_all (line 2762) | fn test_rewrite_reference_types_skip_all() {
FILE: crates/vite_migration/src/package.rs
constant CROSS_ENV_MARKER (line 10) | const CROSS_ENV_MARKER: &str = "__CROSS_ENV__=1 ";
constant CROSS_ENV_REPLACEMENT (line 11) | const CROSS_ENV_REPLACEMENT: &str = "cross-env ";
function rewrite_script (line 14) | fn rewrite_script(script: &str, rules: &[RuleConfig<SupportLang>]) -> St...
function transform_scripts_json (line 41) | fn transform_scripts_json(
function rewrite_eslint (line 88) | pub fn rewrite_eslint(scripts_json: &str) -> Result<Option<String>, Erro...
function rewrite_prettier (line 96) | pub fn rewrite_prettier(scripts_json: &str) -> Result<Option<String>, Er...
function rewrite_scripts (line 101) | pub fn rewrite_scripts(scripts_json: &str, rules_yaml: &str) -> Result<O...
constant RULES_YAML (line 110) | const RULES_YAML: &str = r#"
function test_rewrite_script (line 191) | fn test_rewrite_script() {
function test_rewrite_package_json_scripts_success (line 315) | fn test_rewrite_package_json_scripts_success() {
function test_rewrite_package_json_scripts_with_env_variable_success (line 336) | fn test_rewrite_package_json_scripts_with_env_variable_success() {
function test_rewrite_package_json_scripts_using_cross_env (line 359) | fn test_rewrite_package_json_scripts_using_cross_env() {
function test_rewrite_package_json_scripts_lint_staged (line 384) | fn test_rewrite_package_json_scripts_lint_staged() {
function test_rewrite_package_json_scripts_no_update (line 410) | fn test_rewrite_package_json_scripts_no_update() {
function test_rewrite_eslint_json (line 422) | fn test_rewrite_eslint_json() {
function test_rewrite_eslint_json_no_update (line 446) | fn test_rewrite_eslint_json_no_update() {
function test_rewrite_eslint_json_lint_staged_array (line 458) | fn test_rewrite_eslint_json_lint_staged_array() {
function test_rewrite_prettier_json (line 483) | fn test_rewrite_prettier_json() {
function test_rewrite_prettier_json_no_update (line 507) | fn test_rewrite_prettier_json_no_update() {
function test_rewrite_prettier_json_lint_staged_array (line 519) | fn test_rewrite_prettier_json_lint_staged_array() {
FILE: crates/vite_migration/src/prettier.rs
constant PRETTIER_CONFIG (line 3) | const PRETTIER_CONFIG: ScriptRewriteConfig = ScriptRewriteConfig {
function rewrite_prettier_script (line 63) | pub(crate) fn rewrite_prettier_script(script: &str) -> String {
function test_rewrite_prettier_script (line 72) | fn test_rewrite_prettier_script() {
function test_rewrite_prettier_compound_commands (line 147) | fn test_rewrite_prettier_compound_commands() {
function test_rewrite_prettier_cross_env (line 168) | fn test_rewrite_prettier_cross_env() {
function test_rewrite_prettier_list_different_to_check (line 195) | fn test_rewrite_prettier_list_different_to_check() {
function test_rewrite_prettier_short_flags (line 215) | fn test_rewrite_prettier_short_flags() {
function test_rewrite_prettier_ignore_unknown_stripped (line 226) | fn test_rewrite_prettier_ignore_unknown_stripped() {
function test_rewrite_prettier_value_flags (line 248) | fn test_rewrite_prettier_value_flags() {
FILE: crates/vite_migration/src/script_rewrite.rs
type FlagConversion (line 5) | pub(crate) struct FlagConversion {
type ScriptRewriteConfig (line 16) | pub(crate) struct ScriptRewriteConfig {
constant SHELL_CONTINUATION_KEYWORDS (line 30) | const SHELL_CONTINUATION_KEYWORDS: &[&str] = &["then", "do", "else", "el...
function rewrite_script (line 34) | pub(crate) fn rewrite_script(script: &str, config: &ScriptRewriteConfig)...
function rewrite_in_program (line 51) | fn rewrite_in_program(program: &mut ast::Program, config: &ScriptRewrite...
function rewrite_in_compound_list (line 59) | fn rewrite_in_compound_list(list: &mut ast::CompoundList, config: &Scrip...
function rewrite_in_and_or_list (line 67) | fn rewrite_in_and_or_list(list: &mut ast::AndOrList, config: &ScriptRewr...
function rewrite_in_pipeline (line 79) | fn rewrite_in_pipeline(pipeline: &mut ast::Pipeline, config: &ScriptRewr...
function rewrite_in_compound_command (line 95) | fn rewrite_in_compound_command(
function make_suffix_word (line 137) | fn make_suffix_word(value: &str) -> ast::CommandPrefixOrSuffixItem {
function rewrite_in_simple_command (line 141) | fn rewrite_in_simple_command(cmd: &mut ast::SimpleCommand, config: &Scri...
function rewrite_in_cross_env (line 166) | fn rewrite_in_cross_env(cmd: &mut ast::SimpleCommand, config: &ScriptRew...
function strip_flags_from_suffix (line 191) | fn strip_flags_from_suffix(
function collapse_newlines (line 268) | fn collapse_newlines(s: &str) -> String {
function needs_semicolon (line 294) | fn needs_semicolon(before: &str) -> bool {
function normalize_pipe_spacing (line 316) | fn normalize_pipe_spacing(s: &str) -> String {
function test_normalize_pipe_spacing (line 339) | fn test_normalize_pipe_spacing() {
FILE: crates/vite_migration/src/vite_config.rs
type MergeResult (line 12) | pub struct MergeResult {
function merge_json_config (line 66) | pub fn merge_json_config(
function merge_json_config_content (line 96) | fn merge_json_config_content(
function strip_schema_property (line 127) | fn strip_schema_property(config: &str) -> Cow<'_, str> {
function check_function_callback (line 132) | fn check_function_callback(vite_config_content: &str) -> Result<bool, Er...
function generate_merge_rule (line 176) | fn generate_merge_rule(ts_config: &str, config_key: &str) -> String {
function indent_multiline (line 270) | fn indent_multiline(s: &str, spaces: usize) -> String {
function merge_tsdown_config (line 301) | pub fn merge_tsdown_config(
function merge_tsdown_config_content (line 316) | fn merge_tsdown_config_content(
function test_check_function_callback (line 362) | fn test_check_function_callback() {
function test_merge_json_config_content_simple (line 386) | fn test_merge_json_config_content_simple() {
function test_merge_json_config_content_with_existing_config (line 416) | fn test_merge_json_config_content_with_existing_config() {
function test_merge_json_config_content_function_callback (line 442) | fn test_merge_json_config_content_function_callback() {
function test_merge_json_config_content_complex_function_callback (line 467) | fn test_merge_json_config_content_complex_function_callback() {
function test_generate_merge_rule (line 554) | fn test_generate_merge_rule() {
function test_merge_json_config_content_arrow_wrapper (line 582) | fn test_merge_json_config_content_arrow_wrapper() {
function test_merge_json_config_content_plain_export (line 609) | fn test_merge_json_config_content_plain_export() {
function test_merge_json_config_content_return_variable (line 652) | fn test_merge_json_config_content_return_variable() {
function test_merge_json_config_content_with_format_key (line 707) | fn test_merge_json_config_content_with_format_key() {
function test_merge_json_config_with_files (line 730) | fn test_merge_json_config_with_files() {
function test_merge_json_config_with_jsonc_file (line 785) | fn test_merge_json_config_with_jsonc_file() {
function test_merge_json_config_with_inline_comments (line 843) | fn test_merge_json_config_with_inline_comments() {
function test_strip_schema_property (line 893) | fn test_strip_schema_property() {
function test_merge_json_config_content_strips_schema (line 920) | fn test_merge_json_config_content_strips_schema() {
function test_indent_multiline (line 939) | fn test_indent_multiline() {
function test_merge_json_config_content_no_trailing_comma (line 953) | fn test_merge_json_config_content_no_trailing_comma() {
function test_merge_json_config_content_with_trailing_comma (line 983) | fn test_merge_json_config_content_with_trailing_comma() {
function test_merge_tsdown_config_content_simple (line 1016) | fn test_merge_tsdown_config_content_simple() {
function test_merge_tsdown_config_content_with_existing_imports (line 1041) | fn test_merge_tsdown_config_content_with_existing_imports() {
function test_merge_tsdown_config_content_function_callback (line 1067) | fn test_merge_tsdown_config_content_function_callback() {
function test_merge_tsdown_config_content_idempotent (line 1091) | fn test_merge_tsdown_config_content_idempotent() {
function test_merge_tsdown_config_content_no_imports (line 1134) | fn test_merge_tsdown_config_content_no_imports() {
function test_merge_tsdown_config_content_no_false_positive_stdlib (line 1155) | fn test_merge_tsdown_config_content_no_false_positive_stdlib() {
function test_merge_tsdown_config_content_mts_extension (line 1171) | fn test_merge_tsdown_config_content_mts_extension() {
function test_merge_tsdown_config_content_cts_extension (line 1183) | fn test_merge_tsdown_config_content_cts_extension() {
function test_merge_tsdown_config_content_js_extension_unchanged (line 1195) | fn test_merge_tsdown_config_content_js_extension_unchanged() {
FILE: crates/vite_shared/src/env_config.rs
type EnvConfig (line 53) | pub struct EnvConfig {
method from_env (line 131) | pub fn from_env() -> Self {
method init (line 161) | pub fn init() {
method get (line 170) | pub fn get() -> Self {
method test_scope (line 199) | pub fn test_scope<R>(config: Self, f: impl FnOnce() -> R) -> R {
method for_test (line 220) | pub fn for_test() -> Self {
method for_test_with_home (line 240) | pub fn for_test_with_home(home: impl Into<PathBuf>) -> Self {
method test_guard (line 246) | pub fn test_guard(config: Self) -> TestEnvGuard {
type TestEnvGuard (line 253) | pub struct TestEnvGuard {
method drop (line 258) | fn drop(&mut self) {
function test_for_test_returns_defaults (line 270) | fn test_for_test_returns_defaults() {
function test_for_test_with_home (line 279) | fn test_for_test_with_home() {
function test_struct_update_syntax (line 285) | fn test_struct_update_syntax() {
function test_scope_overrides_get (line 297) | fn test_scope_overrides_get() {
function test_scope_restores_previous (line 305) | fn test_scope_restores_previous() {
function test_nested_scopes (line 315) | fn test_nested_scopes() {
function test_from_env_runs_without_panic (line 336) | fn test_from_env_runs_without_panic() {
FILE: crates/vite_shared/src/env_vars.rs
constant VITE_PLUS_HOME (line 16) | pub const VITE_PLUS_HOME: &str = "VITE_PLUS_HOME";
constant VITE_LOG (line 19) | pub const VITE_LOG: &str = "VITE_LOG";
constant NPM_CONFIG_REGISTRY (line 22) | pub const NPM_CONFIG_REGISTRY: &str = "npm_config_registry";
constant NPM_CONFIG_REGISTRY_UPPER (line 25) | pub const NPM_CONFIG_REGISTRY_UPPER: &str = "NPM_CONFIG_REGISTRY";
constant VITE_NODE_DIST_MIRROR (line 28) | pub const VITE_NODE_DIST_MIRROR: &str = "VITE_NODE_DIST_MIRROR";
constant VITE_PLUS_NODE_VERSION (line 31) | pub const VITE_PLUS_NODE_VERSION: &str = "VITE_PLUS_NODE_VERSION";
constant VITE_PLUS_DEBUG_SHIM (line 34) | pub const VITE_PLUS_DEBUG_SHIM: &str = "VITE_PLUS_DEBUG_SHIM";
constant VITE_PLUS_ENV_USE_EVAL_ENABLE (line 37) | pub const VITE_PLUS_ENV_USE_EVAL_ENABLE: &str = "VITE_PLUS_ENV_USE_EVAL_...
constant VITE_UPDATE_TASK_TYPES (line 40) | pub const VITE_UPDATE_TASK_TYPES: &str = "VITE_UPDATE_TASK_TYPES";
constant VITE_GLOBAL_CLI_JS_SCRIPTS_DIR (line 43) | pub const VITE_GLOBAL_CLI_JS_SCRIPTS_DIR: &str = "VITE_GLOBAL_CLI_JS_SCR...
constant VITE_PLUS_BYPASS (line 50) | pub const VITE_PLUS_BYPASS: &str = "VITE_PLUS_BYPASS";
constant VITE_PLUS_TOOL_RECURSION (line 53) | pub const VITE_PLUS_TOOL_RECURSION: &str = "VITE_PLUS_TOOL_RECURSION";
constant VITE_PLUS_ACTIVE_NODE (line 56) | pub const VITE_PLUS_ACTIVE_NODE: &str = "VITE_PLUS_ACTIVE_NODE";
constant VITE_PLUS_RESOLVE_SOURCE (line 59) | pub const VITE_PLUS_RESOLVE_SOURCE: &str = "VITE_PLUS_RESOLVE_SOURCE";
constant VITE_PLUS_SHIM_TOOL (line 62) | pub const VITE_PLUS_SHIM_TOOL: &str = "VITE_PLUS_SHIM_TOOL";
constant VITE_PLUS_SHIM_WRAPPER (line 68) | pub const VITE_PLUS_SHIM_WRAPPER: &str = "VITE_PLUS_SHIM_WRAPPER";
constant VITE_PLUS_CLI_BIN (line 71) | pub const VITE_PLUS_CLI_BIN: &str = "VITE_PLUS_CLI_BIN";
constant VITE_PLUS_GLOBAL_VERSION (line 74) | pub const VITE_PLUS_GLOBAL_VERSION: &str = "VITE_PLUS_GLOBAL_VERSION";
constant VITE_PLUS_TRAMPOLINE_PATH (line 82) | pub const VITE_PLUS_TRAMPOLINE_PATH: &str = "VITE_PLUS_TRAMPOLINE_PATH";
FILE: crates/vite_shared/src/header.rs
constant ESC (line 24) | const ESC: &str = "\x1b";
constant CSI (line 25) | const CSI: &str = "\x1b[";
constant RESET (line 26) | const RESET: &str = "\x1b[0m";
constant HEADER_SUFFIX (line 28) | const HEADER_SUFFIX: &str = " - The Unified Toolchain for the Web";
constant RESET_FG (line 30) | const RESET_FG: &str = "\x1b[39m";
constant DEFAULT_BLUE (line 31) | const DEFAULT_BLUE: Rgb = Rgb(88, 146, 255);
constant DEFAULT_MAGENTA (line 32) | const DEFAULT_MAGENTA: Rgb = Rgb(187, 116, 247);
constant ANSI_BLUE_INDEX (line 33) | const ANSI_BLUE_INDEX: u8 = 4;
constant ANSI_MAGENTA_INDEX (line 34) | const ANSI_MAGENTA_INDEX: u8 = 5;
constant HEADER_SUFFIX_FADE_GAMMA (line 35) | const HEADER_SUFFIX_FADE_GAMMA: f64 = 1.35;
function is_warp_terminal (line 42) | pub fn is_warp_terminal() -> bool {
type Rgb (line 49) | struct Rgb(u8, u8, u8);
type HeaderColors (line 51) | struct HeaderColors {
function bold (line 56) | fn bold(text: &str, enabled: bool) -> String {
function fg_rgb (line 60) | fn fg_rgb(color: Rgb) -> String {
function should_colorize (line 64) | fn should_colorize() -> bool {
function supports_true_color (line 69) | fn supports_true_color() -> bool {
function lerp (line 74) | fn lerp(a: f64, b: f64, t: f64) -> f64 {
function gradient_eased (line 78) | fn gradient_eased(count: usize, start: Rgb, end: Rgb, gamma: f64) -> Vec...
function gradient_three_stop (line 94) | fn gradient_three_stop(count: usize, start: Rgb, middle: Rgb, end: Rgb, ...
function colorize (line 120) | fn colorize(text: &str, colors: &[Rgb]) -> String {
function to_8bit (line 140) | fn to_8bit(hex: &str) -> Option<u8> {
function parse_rgb_triplet (line 157) | fn parse_rgb_triplet(input: &str) -> Option<Rgb> {
function parse_osc10_rgb (line 168) | fn parse_osc10_rgb(buffer: &str) -> Option<Rgb> {
function parse_osc4_rgb (line 176) | fn parse_osc4_rgb(buffer: &str, index: u8) -> Option<Rgb> {
function is_osc_query_unsupported (line 190) | fn is_osc_query_unsupported() -> bool {
constant DA1 (line 255) | const DA1: &str = "\x1b[c";
function read_until_either (line 260) | fn read_until_either(
function query_terminal_colors (line 297) | fn query_terminal_colors(palette_indices: &[u8]) -> (Option<Rgb>, Vec<(u...
function query_terminal_colors (line 483) | fn query_terminal_colors(_palette_indices: &[u8]) -> (Option<Rgb>, Vec<(...
function palette_color (line 487) | fn palette_color(palette: &[(u8, Rgb)], index: u8) -> Option<Rgb> {
function get_header_colors (line 491) | fn get_header_colors() -> &'static HeaderColors {
function render_header_variant (line 517) | fn render_header_variant(
function vite_plus_header (line 530) | pub fn vite_plus_header() -> String {
function to_8bit_matches_js_rules (line 549) | fn to_8bit_matches_js_rules() {
function to_8bit_single_digit (line 558) | fn to_8bit_single_digit() {
function to_8bit_three_digit (line 565) | fn to_8bit_three_digit() {
function to_8bit_empty_returns_none (line 572) | fn to_8bit_empty_returns_none() {
function to_8bit_invalid_hex_returns_none (line 577) | fn to_8bit_invalid_hex_returns_none() {
function parse_rgb_triplet_standard (line 583) | fn parse_rgb_triplet_standard() {
function parse_rgb_triplet_four_digit_channels (line 589) | fn parse_rgb_triplet_four_digit_channels() {
function parse_rgb_triplet_mixed_digit_channels (line 596) | fn parse_rgb_triplet_mixed_digit_channels() {
function parse_rgb_triplet_trailing_junk_ignored (line 602) | fn parse_rgb_triplet_trailing_junk_ignored() {
function parse_rgb_triplet_missing_channel_returns_none (line 608) | fn parse_rgb_triplet_missing_channel_returns_none() {
function parse_osc10_response_extracts_rgb (line 614) | fn parse_osc10_response
Condensed preview — 1701 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,822K chars).
[
{
"path": ".cargo/config.toml",
"chars": 820,
"preview": "[env]\n# Required by rolldown_workspace crate - points to the rolldown subproject root\nWORKSPACE_DIR = { value = \"rolldow"
},
{
"path": ".claude/agents/cargo-workspace-merger.md",
"chars": 6614,
"preview": "---\nname: cargo-workspace-merger\ndescription: \"Use this agent when you need to merge one Cargo workspace into another, s"
},
{
"path": ".claude/agents/monorepo-architect.md",
"chars": 5760,
"preview": "---\nname: monorepo-architect\ndescription: Use this agent when you need architectural guidance for monorepo tooling, part"
},
{
"path": ".claude/skills/add-ecosystem-ci/SKILL.md",
"chars": 3825,
"preview": "---\nname: add-ecosystem-ci\ndescription: Add a new ecosystem-ci test case for testing real-world projects against vite-pl"
},
{
"path": ".claude/skills/bump-vite-task/SKILL.md",
"chars": 4567,
"preview": "---\nname: bump-vite-task\ndescription: Bump vite-task git dependency to the latest main commit. Use when you need to upda"
},
{
"path": ".claude/skills/spawn-process/SKILL.md",
"chars": 2608,
"preview": "---\nname: spawn-process\ndescription: Guide for writing subprocess execution code using the vite_command crate\nallowed-to"
},
{
"path": ".claude/skills/sync-tsdown-cli/SKILL.md",
"chars": 1310,
"preview": "---\nname: sync-tsdown-cli\ndescription: Compare tsdown CLI options with vp pack and sync any new or removed options. Use "
},
{
"path": ".clippy.toml",
"chars": 2137,
"preview": "avoid-breaking-exported-api = false\n\ndisallowed-methods = [\n { path = \"str::to_ascii_lowercase\", reason = \"To avoid mem"
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 1811,
"preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.co"
},
{
"path": ".gitattributes",
"chars": 18,
"preview": "* text=auto eol=lf"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 3006,
"preview": "name: \"\\U0001F41E Bug report\"\ndescription: Report an issue with Vite+\nlabels: [pending triage]\ntype: Bug\nbody:\n - type:"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 831,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Vite Issues\n url: https://github.com/vitejs/vite/issues/new/choo"
},
{
"path": ".github/ISSUE_TEMPLATE/docs.yml",
"chars": 1619,
"preview": "name: \"\\U0001F4DA Documentation\"\ndescription: Suggest a documentation improvement for Vite+\nlabels: [documentation]\nbody"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1980,
"preview": "name: \"\\U0001F680 New feature proposal\"\ndescription: Propose a new feature to be added to Vite+\nlabels: [pending triage]"
},
{
"path": ".github/actions/build-upstream/action.yml",
"chars": 5950,
"preview": "name: 'Build with Upstream Repositories'\ndescription: 'Builds Vite+ with the upstream repositories'\ninputs:\n target:\n "
},
{
"path": ".github/actions/clone/action.yml",
"chars": 2408,
"preview": "name: 'Clone Repositories'\ndescription: 'Clone self and upstream repositories'\n\ninputs:\n ecosystem-ci-project:\n desc"
},
{
"path": ".github/actions/download-rolldown-binaries/action.yml",
"chars": 2286,
"preview": "name: 'Download Rolldown Binaries'\ndescription: 'Download previous release rolldown binaries and upload as artifact'\n\nin"
},
{
"path": ".github/actions/set-snapshot-version/action.yml",
"chars": 750,
"preview": "name: Compute Release Version\ndescription: Get latest tag from GitHub and increment the patch version\n\ninputs:\n npm_tag"
},
{
"path": ".github/actions/set-snapshot-version/compute-version.mjs",
"chars": 1413,
"preview": "import { execSync } from 'node:child_process';\n\nimport semver from 'semver';\n\nconst npmTag = process.argv[2] || 'latest'"
},
{
"path": ".github/actions/set-snapshot-version/package.json",
"chars": 42,
"preview": "{\n \"private\": true,\n \"type\": \"module\"\n}\n"
},
{
"path": ".github/renovate.json",
"chars": 660,
"preview": "{\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n \"extends\": [\"github>Boshen/renovate\"],\n \"ignorePa"
},
{
"path": ".github/scripts/upgrade-deps.mjs",
"chars": 6109,
"preview": "import fs from 'node:fs';\nimport path from 'node:path';\n\nconst ROOT = process.cwd();\n\n// ============ GitHub API ======="
},
{
"path": ".github/workflows/ci.yml",
"chars": 22251,
"preview": "name: CI\n\npermissions:\n # Doing it explicitly because the default permission only includes metadata: read.\n contents: "
},
{
"path": ".github/workflows/claude.yml",
"chars": 1991,
"preview": "name: Claude Code\n\non:\n issues:\n types: [assigned]\n\njobs:\n analyze:\n if: github.repository == 'voidzero-dev/vite"
},
{
"path": ".github/workflows/cleanup-cache.yml",
"chars": 806,
"preview": "name: Cleanup github runner caches on closed pull requests\non:\n pull_request:\n types:\n - closed\n\njobs:\n cleanu"
},
{
"path": ".github/workflows/deny.yml",
"chars": 1398,
"preview": "name: Cargo Deny\n\npermissions: {}\n\non:\n workflow_dispatch:\n pull_request:\n types: [opened, synchronize]\n paths:\n"
},
{
"path": ".github/workflows/e2e-test.yml",
"chars": 16030,
"preview": "name: E2E Test\n\npermissions: {}\n\non:\n workflow_dispatch:\n schedule:\n # Run every day at 0:00 GMT (8:00 AM Singapore"
},
{
"path": ".github/workflows/issue-close-require.yml",
"chars": 619,
"preview": "name: Issue Close Require\n\non:\n schedule:\n - cron: '0 0 * * *'\n\njobs:\n close-issues:\n if: github.repository == '"
},
{
"path": ".github/workflows/issue-labeled.yml",
"chars": 1969,
"preview": "name: Issue Labeled\n\non:\n issues:\n types: [labeled]\n\njobs:\n reply-labeled:\n if: github.repository == 'voidzero-d"
},
{
"path": ".github/workflows/release.yml",
"chars": 12032,
"preview": "name: Release\n\non:\n workflow_dispatch:\n inputs:\n npm_tag:\n description: 'npm tag for publish'\n re"
},
{
"path": ".github/workflows/test-standalone-install.yml",
"chars": 16068,
"preview": "name: Test Standalone Install Scripts\n\npermissions: {}\n\non:\n workflow_dispatch:\n pull_request:\n paths:\n - 'pac"
},
{
"path": ".github/workflows/upgrade-deps.yml",
"chars": 6270,
"preview": "name: Upgrade Upstream Dependencies\n\non:\n schedule:\n - cron: '0 0 * * *' # Daily at midnight UTC\n workflow_dispatch"
},
{
"path": ".github/workflows/zizmor.yml",
"chars": 1023,
"preview": "name: Zizmor\n\npermissions: {}\n\non:\n workflow_dispatch:\n pull_request:\n types: [opened, synchronize]\n paths:\n "
},
{
"path": ".gitignore",
"chars": 133,
"preview": "/target\nnode_modules\ndist\n.claude/settings.local.json\n*.tsbuildinfo\n.DS_Store\nrolldown\nrolldown-vite\nvite\n/crates/vite_g"
},
{
"path": ".husky/pre-commit",
"chars": 16,
"preview": "pnpm lint-staged"
},
{
"path": ".node-version",
"chars": 8,
"preview": "22.18.0\n"
},
{
"path": ".rustfmt.toml",
"chars": 592,
"preview": "style_edition = \"2024\"\n\n# Make Rust more readable given most people have wide screens nowadays.\n# This is also the setti"
},
{
"path": ".typos.toml",
"chars": 295,
"preview": "[default.extend-words]\nratatui = \"ratatui\"\nPUNICODE = \"PUNICODE\"\nJod = \"Jod\" # Node.js v22 LTS codename\n\n[files]\nextend-"
},
{
"path": ".vscode/extensions.json",
"chars": 63,
"preview": "{\n \"recommendations\": [\"VoidZero.vite-plus-extension-pack\"]\n}\n"
},
{
"path": ".vscode/settings.json",
"chars": 610,
"preview": "{\n \"editor.formatOnSave\": true,\n \"files.insertFinalNewline\": true,\n \"files.trimFinalNewlines\": true,\n \"[javascript]\""
},
{
"path": "CLAUDE.md",
"chars": 5489,
"preview": "# Vite-Plus\n\nA monorepo task runner (like nx/turbo) with intelligent caching and dependency resolution.\n\n## Core Concept"
},
{
"path": "CONTRIBUTING.md",
"chars": 3619,
"preview": "# Contributing Guide\n\n## Initial Setup\n\n### macOS / Linux\n\nYou'll need the following tools installed on your system:\n\n``"
},
{
"path": "Cargo.toml",
"chars": 13276,
"preview": "[workspace]\nresolver = \"3\"\nmembers = [\"bench\", \"crates/*\", \"packages/cli/binding\"]\n\n[workspace.metadata.cargo-shear]\nign"
},
{
"path": "LICENSE",
"chars": 1079,
"preview": "MIT License\n\nCopyright (c) 2026-present, VoidZero Inc.\n\nPermission is hereby granted, free of charge, to any person obta"
},
{
"path": "README.md",
"chars": 6209,
"preview": "<picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"/logo-dark.svg\">\n <source media=\"(prefers-color-scheme"
},
{
"path": "bench/.gitignore",
"chars": 17,
"preview": "fixtures/monorepo"
},
{
"path": "bench/Cargo.toml",
"chars": 421,
"preview": "[package]\nname = \"vite-plus-benches\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[dev-dependencies]\nanyhow = { workspace = true "
},
{
"path": "bench/benches/workspace_load.rs",
"chars": 3546,
"preview": "use std::{ffi::OsStr, hint::black_box, path::PathBuf, sync::Arc};\n\nuse criterion::{BenchmarkId, Criterion, criterion_gro"
},
{
"path": "bench/fixtures/monorepo/package.json",
"chars": 299,
"preview": "{\n \"name\": \"monorepo-benchmark\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"workspaces\": [\n \"packages/*\"\n ],\n \"sc"
},
{
"path": "bench/fixtures/monorepo/pnpm-workspace.yaml",
"chars": 27,
"preview": "packages:\n - 'packages/*'\n"
},
{
"path": "bench/fixtures/monorepo/vite-plus.json",
"chars": 216,
"preview": "{\n \"tasks\": {\n \"build\": {\n \"cache\": true,\n \"parallel\": true\n },\n \"test\": {\n \"cache\": true,\n "
},
{
"path": "bench/generate-monorepo.ts",
"chars": 10549,
"preview": "import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\ninterface P"
},
{
"path": "bench/package.json",
"chars": 23,
"preview": "{\n \"type\": \"module\"\n}\n"
},
{
"path": "bench/tsconfig.json",
"chars": 166,
"preview": "{\n \"extends\": \"../tsconfig.json\",\n \"compilerOptions\": {\n \"outDir\": \"./dist\",\n \"noEmit\": true,\n \"erasableSynta"
},
{
"path": "crates/vite_command/Cargo.toml",
"chars": 629,
"preview": "[package]\nname = \"vite_command\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nlicense.workspace = "
},
{
"path": "crates/vite_command/src/lib.rs",
"chars": 14671,
"preview": "use std::{\n collections::HashMap,\n ffi::OsStr,\n process::{ExitStatus, Stdio},\n};\n\nuse fspy::AccessMode;\nuse tok"
},
{
"path": "crates/vite_error/Cargo.toml",
"chars": 997,
"preview": "[package]\nname = \"vite_error\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nlicense.workspace = tr"
},
{
"path": "crates/vite_error/src/lib.rs",
"chars": 3838,
"preview": "use std::{ffi::OsString, path::Path, sync::Arc};\n\nuse thiserror::Error;\nuse vite_path::{AbsolutePath, AbsolutePathBuf, r"
},
{
"path": "crates/vite_global_cli/Cargo.toml",
"chars": 1286,
"preview": "[package]\nname = \"vite_global_cli\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nlicense.workspace"
},
{
"path": "crates/vite_global_cli/src/cli.rs",
"chars": 61141,
"preview": "//! CLI argument parsing and command routing.\n//!\n//! This module defines the CLI structure using clap and routes comman"
},
{
"path": "crates/vite_global_cli/src/command_picker.rs",
"chars": 21695,
"preview": "//! Interactive top-level command picker for `vp`.\n\nuse std::{\n io::{self, IsTerminal, Write},\n ops::ControlFlow,\n"
},
{
"path": "crates/vite_global_cli/src/commands/add.rs",
"chars": 2093,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::{\n commands::add::{AddCommandOptions, SaveDependencyType},\n packa"
},
{
"path": "crates/vite_global_cli/src/commands/config.rs",
"chars": 385,
"preview": "//! In-repo configuration command (Category B: JavaScript Command).\n\nuse std::process::ExitStatus;\n\nuse vite_path::Absol"
},
{
"path": "crates/vite_global_cli/src/commands/create.rs",
"chars": 549,
"preview": "//! Project scaffolding command (Category B: JavaScript Command).\n\nuse std::process::ExitStatus;\n\nuse vite_path::Absolut"
},
{
"path": "crates/vite_global_cli/src/commands/dedupe.rs",
"chars": 1463,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::commands::dedupe::DedupeCommandOptions;\nuse vite_path::AbsolutePathBuf;"
},
{
"path": "crates/vite_global_cli/src/commands/delegate.rs",
"chars": 1164,
"preview": "//! JavaScript command delegation — resolves local vite-plus first, falls back to global.\n\nuse std::process::ExitStatus;"
},
{
"path": "crates/vite_global_cli/src/commands/dlx.rs",
"chars": 2578,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_install::{\n commands::"
},
{
"path": "crates/vite_global_cli/src/commands/env/bin_config.rs",
"chars": 11854,
"preview": "//! Per-binary configuration storage for global packages.\n//!\n//! Each binary installed via `vp install -g` gets a confi"
},
{
"path": "crates/vite_global_cli/src/commands/env/config.rs",
"chars": 48687,
"preview": "//! Configuration and version resolution for the env command.\n//!\n//! This module provides:\n//! - VITE_PLUS_HOME path re"
},
{
"path": "crates/vite_global_cli/src/commands/env/current.rs",
"chars": 3512,
"preview": "//! Current environment information command.\n//!\n//! Shows information about the current Node.js environment.\n\nuse std::"
},
{
"path": "crates/vite_global_cli/src/commands/env/default.rs",
"chars": 3897,
"preview": "//! Default version management command.\n//!\n//! Handles `vp env default [VERSION]` to set or show the global default Nod"
},
{
"path": "crates/vite_global_cli/src/commands/env/doctor.rs",
"chars": 35613,
"preview": "//! Doctor command implementation for environment diagnostics.\n\nuse std::process::ExitStatus;\n\nuse owo_colors::OwoColori"
},
{
"path": "crates/vite_global_cli/src/commands/env/exec.rs",
"chars": 11154,
"preview": "//! Exec command for executing commands with a specific Node.js version.\n//!\n//! Handles two modes:\n//! 1. Explicit vers"
},
{
"path": "crates/vite_global_cli/src/commands/env/global_install.rs",
"chars": 29879,
"preview": "//! Global package installation handling.\n\nuse std::{\n collections::HashSet,\n io::{Read, Write},\n process::Stdi"
},
{
"path": "crates/vite_global_cli/src/commands/env/list.rs",
"chars": 5679,
"preview": "//! List command for displaying locally installed Node.js versions.\n//!\n//! Handles `vp env list` to show Node.js versio"
},
{
"path": "crates/vite_global_cli/src/commands/env/list_remote.rs",
"chars": 8938,
"preview": "//! List-remote command for displaying available Node.js versions from the registry.\n//!\n//! Handles `vp env list-remote"
},
{
"path": "crates/vite_global_cli/src/commands/env/mod.rs",
"chars": 7667,
"preview": "//! Environment management commands.\n//!\n//! This module provides the `vp env` command for managing Node.js environments"
},
{
"path": "crates/vite_global_cli/src/commands/env/off.rs",
"chars": 1349,
"preview": "//! Enable system-first mode command.\n//!\n//! Handles `vp env off` to set shim mode to \"system_first\" -\n//! shims prefer"
},
{
"path": "crates/vite_global_cli/src/commands/env/on.rs",
"chars": 1172,
"preview": "//! Enable managed mode command.\n//!\n//! Handles `vp env on` to set shim mode to \"managed\" - shims always use vite-plus "
},
{
"path": "crates/vite_global_cli/src/commands/env/package_metadata.rs",
"chars": 11184,
"preview": "//! Package metadata storage for global packages.\n\nuse std::collections::HashSet;\n\nuse chrono::{DateTime, Utc};\nuse serd"
},
{
"path": "crates/vite_global_cli/src/commands/env/packages.rs",
"chars": 2368,
"preview": "//! List installed global packages.\n\nuse std::process::ExitStatus;\n\nuse owo_colors::OwoColorize;\n\nuse super::package_met"
},
{
"path": "crates/vite_global_cli/src/commands/env/pin.rs",
"chars": 14575,
"preview": "//! Pin command for per-directory Node.js version management.\n//!\n//! Handles `vp env pin [VERSION]` to pin a Node.js ve"
},
{
"path": "crates/vite_global_cli/src/commands/env/setup.rs",
"chars": 37193,
"preview": "//! Setup command implementation for creating bin directory and shims.\n//!\n//! Creates the following structure:\n//! - ~/"
},
{
"path": "crates/vite_global_cli/src/commands/env/unpin.rs",
"chars": 374,
"preview": "//! Unpin command - alias for `pin --unpin`.\n//!\n//! Handles `vp env unpin` to remove the `.node-version` file from the "
},
{
"path": "crates/vite_global_cli/src/commands/env/use.rs",
"chars": 8483,
"preview": "//! Implementation of `vp env use` command.\n//!\n//! Outputs shell-appropriate commands to stdout that set (or unset)\n//!"
},
{
"path": "crates/vite_global_cli/src/commands/env/which.rs",
"chars": 7541,
"preview": "//! Which command implementation.\n//!\n//! Shows the path to the tool binary that would be executed.\n//!\n//! For core too"
},
{
"path": "crates/vite_global_cli/src/commands/implode.rs",
"chars": 22059,
"preview": "//! `vp implode` — completely remove vp and all its data from this system.\n\nuse std::{\n io::{IsTerminal, Write},\n "
},
{
"path": "crates/vite_global_cli/src/commands/install.rs",
"chars": 4671,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::{PackageManager, commands::install::InstallCommandOptions};\nuse vite_pa"
},
{
"path": "crates/vite_global_cli/src/commands/link.rs",
"chars": 1423,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::commands::link::LinkCommandOptions;\nuse vite_path::AbsolutePathBuf;\n\nus"
},
{
"path": "crates/vite_global_cli/src/commands/migrate.rs",
"chars": 542,
"preview": "//! Migration command (Category B: JavaScript Command).\n\nuse std::process::ExitStatus;\n\nuse vite_path::AbsolutePathBuf;\n"
},
{
"path": "crates/vite_global_cli/src/commands/mod.rs",
"chars": 9065,
"preview": "//! Command implementations for the global CLI.\n//!\n//! Commands are organized by category:\n//!\n//! Category A - Package"
},
{
"path": "crates/vite_global_cli/src/commands/outdated.rs",
"chars": 2078,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::commands::outdated::{Format, OutdatedCommandOptions};\nuse vite_path::Ab"
},
{
"path": "crates/vite_global_cli/src/commands/pm.rs",
"chars": 13536,
"preview": "//! Package manager commands (Category A).\n//!\n//! This module handles the `pm` subcommand and the `info` command which "
},
{
"path": "crates/vite_global_cli/src/commands/remove.rs",
"chars": 1844,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::commands::remove::RemoveCommandOptions;\nuse vite_path::AbsolutePathBuf;"
},
{
"path": "crates/vite_global_cli/src/commands/run_or_delegate.rs",
"chars": 903,
"preview": "//! Run command with fallback to package manager when vite-plus is not a dependency.\n\nuse std::process::ExitStatus;\n\nuse"
},
{
"path": "crates/vite_global_cli/src/commands/staged.rs",
"chars": 370,
"preview": "//! Staged command (Category B: JavaScript Command).\n\nuse std::process::ExitStatus;\n\nuse vite_path::AbsolutePathBuf;\n\nus"
},
{
"path": "crates/vite_global_cli/src/commands/unlink.rs",
"chars": 1480,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::commands::unlink::UnlinkCommandOptions;\nuse vite_path::AbsolutePathBuf;"
},
{
"path": "crates/vite_global_cli/src/commands/update.rs",
"chars": 2064,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::commands::update::UpdateCommandOptions;\nuse vite_path::AbsolutePathBuf;"
},
{
"path": "crates/vite_global_cli/src/commands/upgrade/install.rs",
"chars": 16293,
"preview": "//! Installation logic for upgrade.\n//!\n//! Handles tarball extraction, dependency installation, symlink swapping,\n//! a"
},
{
"path": "crates/vite_global_cli/src/commands/upgrade/integrity.rs",
"chars": 2318,
"preview": "//! Integrity verification for downloaded tarballs.\n//!\n//! Verifies SHA-512 integrity using the Subresource Integrity ("
},
{
"path": "crates/vite_global_cli/src/commands/upgrade/mod.rs",
"chars": 8128,
"preview": "//! Upgrade command for the vp CLI.\n//!\n//! Downloads and installs a new version of the CLI from the npm registry\n//! wi"
},
{
"path": "crates/vite_global_cli/src/commands/upgrade/platform.rs",
"chars": 2421,
"preview": "//! Platform detection for upgrade.\n//!\n//! Detects the current platform and returns the npm package suffix\n//! used to "
},
{
"path": "crates/vite_global_cli/src/commands/upgrade/registry.rs",
"chars": 4743,
"preview": "//! npm registry client for version resolution.\n//!\n//! Queries the npm registry to resolve versions and get tarball URL"
},
{
"path": "crates/vite_global_cli/src/commands/version.rs",
"chars": 9131,
"preview": "//! Version command.\n\nuse std::{\n collections::BTreeMap,\n fs,\n path::{Path, PathBuf},\n process::ExitStatus,\n"
},
{
"path": "crates/vite_global_cli/src/commands/vpx.rs",
"chars": 25803,
"preview": "//! `vpx` command implementation.\n//!\n//! Executes a command from a local or remote npm package (like `npx`).\n//! Resolu"
},
{
"path": "crates/vite_global_cli/src/commands/why.rs",
"chars": 2103,
"preview": "use std::process::ExitStatus;\n\nuse vite_install::commands::why::WhyCommandOptions;\nuse vite_path::AbsolutePathBuf;\n\nuse "
},
{
"path": "crates/vite_global_cli/src/error.rs",
"chars": 1792,
"preview": "//! Error types for the global CLI.\n\nuse std::io;\n\nuse vite_str::Str;\n\n/// Error type for the global CLI.\n#[derive(Debug"
},
{
"path": "crates/vite_global_cli/src/help.rs",
"chars": 44579,
"preview": "//! Unified help rendering for the global CLI.\n\nuse std::{fmt::Write as _, io::IsTerminal};\n\nuse clap::{CommandFactory, "
},
{
"path": "crates/vite_global_cli/src/js_executor.rs",
"chars": 17879,
"preview": "//! JavaScript execution via managed Node.js runtime.\n//!\n//! This module handles downloading and caching Node.js via `v"
},
{
"path": "crates/vite_global_cli/src/main.rs",
"chars": 15422,
"preview": "//! Vite+ Global CLI\n//!\n//! A standalone Rust binary for the vite+ global CLI that can run without\n//! pre-installed No"
},
{
"path": "crates/vite_global_cli/src/shim/cache.rs",
"chars": 15084,
"preview": "//! Resolution cache for shim operations.\n//!\n//! Caches version resolution results to avoid re-resolving on every invoc"
},
{
"path": "crates/vite_global_cli/src/shim/dispatch.rs",
"chars": 70489,
"preview": "//! Main dispatch logic for shim operations.\n//!\n//! This module handles the core shim functionality:\n//! 1. Version res"
},
{
"path": "crates/vite_global_cli/src/shim/exec.rs",
"chars": 2979,
"preview": "//! Platform-specific execution for shim operations.\n//!\n//! On Unix, uses execve to replace the current process.\n//! On"
},
{
"path": "crates/vite_global_cli/src/shim/mod.rs",
"chars": 8653,
"preview": "//! Shim module for intercepting node, npm, npx, and package binary commands.\n//!\n//! This module provides the functiona"
},
{
"path": "crates/vite_global_cli/src/tips/mod.rs",
"chars": 4089,
"preview": "//! CLI tips system for providing helpful suggestions to users.\n//!\n//! Tips are shown after command execution to help u"
},
{
"path": "crates/vite_global_cli/src/tips/short_aliases.rs",
"chars": 1918,
"preview": "//! Tip suggesting short aliases for long-form commands.\n\nuse super::{Tip, TipContext};\n\n/// Long-form commands that hav"
},
{
"path": "crates/vite_global_cli/src/tips/use_vpx_or_run.rs",
"chars": 975,
"preview": "//! Tip suggesting vpx or vp run for unknown commands.\n\nuse super::{Tip, TipContext};\n\n/// Suggest `vpx <pkg>` or `vp ru"
},
{
"path": "crates/vite_install/Cargo.toml",
"chars": 1508,
"preview": "[package]\nname = \"vite_install\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nlicense.workspace = "
},
{
"path": "crates/vite_install/README.md",
"chars": 209,
"preview": "# vite_install\n\n- Auto-detects package manager type and version from package.json's `packageManager` field\n- Downloads a"
},
{
"path": "crates/vite_install/src/commands/add.rs",
"chars": 20364,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/audit.rs",
"chars": 10885,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/cache.rs",
"chars": 9127,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/config.rs",
"chars": 13200,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/dedupe.rs",
"chars": 5304,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/deprecate.rs",
"chars": 4911,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/dist_tag.rs",
"chars": 6791,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/dlx.rs",
"chars": 24291,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/fund.rs",
"chars": 3217,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/install.rs",
"chars": 26560,
"preview": "use std::{collections::HashMap, iter, process::ExitStatus};\n\nuse tracing::warn;\nuse vite_command::run_command;\nuse vite_"
},
{
"path": "crates/vite_install/src/commands/link.rs",
"chars": 5930,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/list.rs",
"chars": 24262,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/login.rs",
"chars": 5814,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/logout.rs",
"chars": 5421,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/mod.rs",
"chars": 460,
"preview": "pub mod add;\npub mod audit;\npub mod cache;\npub mod config;\npub mod dedupe;\npub mod deprecate;\npub mod dist_tag;\npub mod "
},
{
"path": "crates/vite_install/src/commands/outdated.rs",
"chars": 18484,
"preview": "use std::{collections::HashMap, process::ExitStatus, str::FromStr};\n\nuse vite_command::run_command;\nuse vite_error::Erro"
},
{
"path": "crates/vite_install/src/commands/owner.rs",
"chars": 5268,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/pack.rs",
"chars": 20679,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse tokio::fs::create_dir_all;\nuse vite_command::run_command;\nuse"
},
{
"path": "crates/vite_install/src/commands/ping.rs",
"chars": 3415,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/prune.rs",
"chars": 6863,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/publish.rs",
"chars": 14020,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/rebuild.rs",
"chars": 4674,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/remove.rs",
"chars": 23490,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/run.rs",
"chars": 4124,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/search.rs",
"chars": 4795,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/token.rs",
"chars": 6837,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/unlink.rs",
"chars": 6786,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/update.rs",
"chars": 21114,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/view.rs",
"chars": 4553,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/whoami.rs",
"chars": 5646,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/commands/why.rs",
"chars": 13569,
"preview": "use std::{collections::HashMap, process::ExitStatus};\n\nuse vite_command::run_command;\nuse vite_error::Error;\nuse vite_pa"
},
{
"path": "crates/vite_install/src/config.rs",
"chars": 1732,
"preview": "use vite_shared::EnvConfig;\n\n/// Get the configured NPM registry URL.\npub fn npm_registry() -> String {\n EnvConfig::g"
},
{
"path": "crates/vite_install/src/lib.rs",
"chars": 225,
"preview": "pub mod commands;\npub mod config;\npub mod package_manager;\npub mod request;\nmod shim;\n\npub use package_manager::{\n Pa"
},
{
"path": "crates/vite_install/src/main.rs",
"chars": 479,
"preview": "use vite_error::Error;\nuse vite_install::PackageManager;\nuse vite_path::current_dir;\n\n#[tokio::main]\nasync fn main() -> "
},
{
"path": "crates/vite_install/src/package_manager.rs",
"chars": 89200,
"preview": "use std::{\n collections::HashMap,\n env, fmt,\n fs::{self, File},\n io::{self, BufReader, IsTerminal, Write},\n "
},
{
"path": "crates/vite_install/src/request.rs",
"chars": 21793,
"preview": "use std::{path::Path, time::Duration};\n\nuse backon::{ExponentialBuilder, Retryable};\nuse flate2::read::GzDecoder;\nuse fu"
},
{
"path": "crates/vite_install/src/shim.rs",
"chars": 14894,
"preview": "use std::path::Path;\n\nuse indoc::formatdoc;\nuse pathdiff::diff_paths;\nuse tokio::fs::write;\nuse vite_error::Error;\n\n/// "
},
{
"path": "crates/vite_js_runtime/Cargo.toml",
"chars": 1170,
"preview": "[package]\nname = \"vite_js_runtime\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nlicense.workspace"
},
{
"path": "crates/vite_js_runtime/src/cache.rs",
"chars": 337,
"preview": "//! Cache directory utilities for JavaScript runtimes.\n\nuse vite_path::AbsolutePathBuf;\n\nuse crate::Error;\n\n/// Get the "
},
{
"path": "crates/vite_js_runtime/src/dev_engines.rs",
"chars": 6918,
"preview": "//! `.node-version` file reading and writing utilities.\n//!\n//! This module provides utilities for working with `.node-v"
},
{
"path": "crates/vite_js_runtime/src/download.rs",
"chars": 11591,
"preview": "//! Generic download utilities for JavaScript runtime management.\n//!\n//! This module provides platform-agnostic utiliti"
},
{
"path": "crates/vite_js_runtime/src/error.rs",
"chars": 2494,
"preview": "use thiserror::Error;\nuse vite_str::Str;\n\n/// Errors that can occur during JavaScript runtime management\n#[derive(Error,"
},
{
"path": "crates/vite_js_runtime/src/lib.rs",
"chars": 1947,
"preview": "//! JavaScript Runtime Management Library\n//!\n//! This crate provides functionality to download and cache JavaScript run"
},
{
"path": "crates/vite_js_runtime/src/platform.rs",
"chars": 4261,
"preview": "use std::fmt;\n\n/// Represents a platform (OS + architecture) combination\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npu"
},
{
"path": "crates/vite_js_runtime/src/provider.rs",
"chars": 3057,
"preview": "//! JavaScript runtime provider trait and supporting types.\n//!\n//! This module defines the trait that all runtime provi"
},
{
"path": "crates/vite_js_runtime/src/providers/mod.rs",
"chars": 239,
"preview": "//! JavaScript runtime provider implementations.\n//!\n//! This module contains implementations of the `JsRuntimeProvider`"
},
{
"path": "crates/vite_js_runtime/src/providers/node.rs",
"chars": 48931,
"preview": "//! Node.js runtime provider implementation.\n\nuse std::time::{SystemTime, UNIX_EPOCH};\n\nuse async_trait::async_trait;\nus"
},
{
"path": "crates/vite_js_runtime/src/runtime.rs",
"chars": 58332,
"preview": "use node_semver::{Range, Version};\nuse tempfile::TempDir;\nuse vite_path::{AbsolutePath, AbsolutePathBuf};\nuse vite_str::"
},
{
"path": "crates/vite_migration/Cargo.toml",
"chars": 585,
"preview": "[package]\nname = \"vite_migration\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nlicense.workspace "
},
{
"path": "crates/vite_migration/src/ast_grep.rs",
"chars": 2851,
"preview": "use ast_grep_config::{GlobalRules, RuleConfig, from_yaml_string};\nuse ast_grep_core::replacer::Replacer;\nuse ast_grep_la"
},
{
"path": "crates/vite_migration/src/eslint.rs",
"chars": 5947,
"preview": "use crate::script_rewrite::{ScriptRewriteConfig, rewrite_script};\n\nconst ESLINT_CONFIG: ScriptRewriteConfig = ScriptRewr"
},
{
"path": "crates/vite_migration/src/file_walker.rs",
"chars": 6057,
"preview": "use std::path::{Path, PathBuf};\n\nuse ignore::WalkBuilder;\nuse vite_error::Error;\n\n// TODO: only support esm files for no"
},
{
"path": "crates/vite_migration/src/import_rewriter.rs",
"chars": 89593,
"preview": "use std::{\n collections::HashMap,\n path::{Path, PathBuf},\n sync::LazyLock,\n};\n\nuse regex::Regex;\nuse vite_error"
},
{
"path": "crates/vite_migration/src/lib.rs",
"chars": 402,
"preview": "mod ast_grep;\nmod eslint;\nmod file_walker;\nmod import_rewriter;\nmod package;\nmod prettier;\nmod script_rewrite;\nmod vite_"
},
{
"path": "crates/vite_migration/src/package.rs",
"chars": 17889,
"preview": "use ast_grep_config::RuleConfig;\nuse ast_grep_language::SupportLang;\nuse serde_json::{Map, Value};\nuse vite_error::Error"
},
{
"path": "crates/vite_migration/src/prettier.rs",
"chars": 9262,
"preview": "use crate::script_rewrite::{FlagConversion, ScriptRewriteConfig, rewrite_script};\n\nconst PRETTIER_CONFIG: ScriptRewriteC"
},
{
"path": "crates/vite_migration/src/script_rewrite.rs",
"chars": 12066,
"preview": "use brush_parser::ast;\n\n/// Configuration for converting one flag (or set of aliases) into a different flag.\n/// Example"
},
{
"path": "crates/vite_migration/src/vite_config.rs",
"chars": 35853,
"preview": "use std::{borrow::Cow, path::Path, sync::LazyLock};\n\nuse ast_grep_config::{GlobalRules, RuleConfig, from_yaml_string};\nu"
},
{
"path": "crates/vite_shared/Cargo.toml",
"chars": 528,
"preview": "[package]\nname = \"vite_shared\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nlicense.workspace = t"
},
{
"path": "crates/vite_shared/src/env_config.rs",
"chars": 10827,
"preview": "//! Centralized environment variable configuration.\n//!\n//! Reads all known env vars once, provides global access via `E"
},
{
"path": "crates/vite_shared/src/env_vars.rs",
"chars": 3571,
"preview": "//! Centralized environment variable name constants.\n//!\n//! Every vite-plus-specific environment variable is defined he"
},
{
"path": "crates/vite_shared/src/header.rs",
"chars": 25959,
"preview": "//! Shared Vite+ header rendering.\n//!\n//! Header coloring behavior:\n//! - Colorization and truecolor capability gates\n/"
},
{
"path": "crates/vite_shared/src/home.rs",
"chars": 1566,
"preview": "use directories::BaseDirs;\nuse vite_path::{AbsolutePathBuf, current_dir};\n\nuse crate::EnvConfig;\n\n/// Default VITE_PLUS_"
},
{
"path": "crates/vite_shared/src/lib.rs",
"chars": 530,
"preview": "//! Shared utilities for vite-plus crates\n\nmod env_config;\npub mod env_vars;\npub mod header;\nmod home;\npub mod output;\nm"
},
{
"path": "crates/vite_shared/src/output.rs",
"chars": 1977,
"preview": "//! Shared CLI output formatting for consistent message prefixes and status symbols.\n//!\n//! All commands should use the"
},
{
"path": "crates/vite_shared/src/package_json.rs",
"chars": 6224,
"preview": "//! Package.json parsing utilities for Node.js version resolution.\n//!\n//! This module provides shared types for parsing"
},
{
"path": "crates/vite_shared/src/path_env.rs",
"chars": 5832,
"preview": "//! PATH environment variable manipulation utilities.\n//!\n//! This module provides functions for prepending directories "
},
{
"path": "crates/vite_shared/src/string_similarity.rs",
"chars": 1726,
"preview": "//! String similarity helpers shared by CLI crates.\n\n/// Compute Levenshtein distance between two strings.\n#[must_use]\np"
},
{
"path": "crates/vite_shared/src/tracing.rs",
"chars": 1192,
"preview": "//! Tracing initialization for vite-plus\n\nuse std::sync::OnceLock;\n\nuse tracing_subscriber::{\n filter::{LevelFilter, "
},
{
"path": "crates/vite_static_config/Cargo.toml",
"chars": 537,
"preview": "[package]\nname = \"vite_static_config\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nhomepage.works"
},
{
"path": "crates/vite_static_config/README.md",
"chars": 2081,
"preview": "# vite_static_config\n\nStatically extracts configuration from `vite.config.*` files without executing JavaScript.\n\n## Wha"
},
{
"path": "crates/vite_static_config/src/lib.rs",
"chars": 39321,
"preview": "//! Static config extraction from vite.config.* files.\n//!\n//! Parses vite config files statically (without executing Ja"
},
{
"path": "crates/vite_trampoline/Cargo.toml",
"chars": 974,
"preview": "[package]\nname = \"vite_trampoline\"\nversion = \"0.0.0\"\nauthors.workspace = true\nedition.workspace = true\nlicense.workspace"
},
{
"path": "crates/vite_trampoline/src/main.rs",
"chars": 4188,
"preview": "//! Minimal Windows trampoline for vite-plus shims.\n//!\n//! This binary is copied and renamed for each shim tool (node.e"
},
{
"path": "deny.toml",
"chars": 11602,
"preview": "# This template contains all of the possible sections and their default values\n\n# Note that all fields that take a lint "
},
{
"path": "docs/.gitignore",
"chars": 54,
"preview": ".vitepress/cache\npublic/install.sh\npublic/install.ps1\n"
},
{
"path": "docs/.vitepress/config.mts",
"chars": 6507,
"preview": "import { resolve } from 'node:path';\n\nimport type { VoidZeroThemeConfig } from '@voidzero-dev/vitepress-theme';\nimport {"
},
{
"path": "docs/.vitepress/env.d.ts",
"chars": 551,
"preview": "// Vue SFC module declaration\ndeclare module '*.vue' {\n import type { DefineComponent } from 'vue';\n const component: "
},
{
"path": "docs/.vitepress/theme/Layout.vue",
"chars": 2365,
"preview": "<script setup lang=\"ts\">\nimport OSSHeader from '@components/oss/Header.vue';\nimport BaseTheme from '@voidzero-dev/vitepr"
},
{
"path": "docs/.vitepress/theme/components/Footer.vue",
"chars": 4651,
"preview": "<template>\n <footer class=\"bg-primary\" data-theme=\"dark\">\n <Sponsors\n description=\"Vite+ is free and open sourc"
},
{
"path": "docs/.vitepress/theme/components/home/CoreFeature3Col.vue",
"chars": 2449,
"preview": "<script setup lang=\"ts\">\nimport nodeIcon from '@local-assets/icons/node.png';\nimport reactIcon from '@local-assets/icons"
}
]
// ... and 1501 more files (download for full content)
About this extraction
This page contains the full source code of the voidzero-dev/vite-plus GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1701 files (4.3 MB), approximately 1.2M tokens, and a symbol index with 2976 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.