Contributing to VoidZero Projects
Dev setup for each repo. All four projects are active, responsive, and welcome contributions.
General Rules (All Projects)
- Comment on the issue first. Say you’re working on it. Avoids duplicate effort.
- Keep PRs small. One issue per PR. Maintainers review small PRs faster.
- Always include tests. PRs without tests won’t be merged.
- Join Discord. Each project has a Discord for real-time guidance.
Oxc (Rust)
# Clone
git clone https://github.com/oxc-project/oxc.git
cd oxc
# Build
cargo build
# Run linter on itself
cargo run -p oxlint
# Run tests for a specific crate
cargo test -p oxc_linter
# Run a single rule's tests
cargo test -p oxc_linter -- no_unused_vars
Workspace structure: ~30 crates. Most contributions go to crates/oxc_linter/.
Testing pattern:
use crate::{tester::Tester, RuleMeta as _};
#[test]
fn test_my_rule() {
let pass = vec!["const x = 1; console.log(x);"];
let fail = vec!["const x = 1;"];
Tester::new(NoUnusedVars::NAME, NoUnusedVars::PLUGIN, pass, fail)
.test_and_snapshot();
}
Snapshot updates: cargo test -p oxc_linter -- --update or delete the snapshot file and rerun.
Contributing guide: https://oxc.rs/docs/contribute/introduction.html
Vitest (TypeScript)
# Clone
git clone https://github.com/vitest-dev/vitest.git
cd vitest
# Install (pnpm required)
pnpm install
# Build all packages
pnpm run build
# Run tests
pnpm run test
# Run tests for a specific package
pnpm -C packages/vitest run test
# Dev mode (rebuild on changes)
pnpm run dev
Monorepo structure: ~17 packages. Key ones: packages/vitest (core), packages/runner, packages/snapshot, packages/expect.
Testing pattern: Vitest tests itself. Test files are next to source or in __tests__/ directories.
Contributing guide: https://github.com/vitest-dev/vitest/blob/main/CONTRIBUTING.md
Vite (TypeScript)
# Clone
git clone https://github.com/vitejs/vite.git
cd vite
# Install (pnpm required)
pnpm install
# Build
pnpm run build
# Run tests
pnpm run test
# Run specific test
pnpm -C packages/vite run test -- html
# Dev playground
pnpm run dev
Monorepo structure: packages/vite is the core. That’s where almost all contributions go.
Key directories in packages/vite/src/node/:
plugins/- built-in plugins (most bug fixes go here)server/- dev serveroptimizer/- dependency pre-bundlingconfig.ts- configuration resolution
Contributing guide: https://github.com/vitejs/vite/blob/main/CONTRIBUTING.md
Rolldown (Rust + TypeScript)
# Clone
git clone https://github.com/rolldown/rolldown.git
cd rolldown
# Install JS dependencies
pnpm install
# Build Rust + JS
just build # or: pnpm run build
# Run tests
just test # or: pnpm run test
# Run specific Rust tests
cargo test -p rolldown
# Run JS integration tests
pnpm -C packages/rolldown run test
Dual structure:
crates/- Rust bundler core (~50 crates)packages/- JS API, tests, debug tools
Rust -> JS bridge: crates/rolldown_binding/ uses napi-rs. Changes to the Rust API need corresponding JS binding updates.
Contributing guide: https://rolldown.rs/contribution-guide/
Which Project to Start With
| Your Situation | Start Here |
|---|---|
| Want quickest first PR | Oxc #19121 (add .with_help to a rule) |
| Want to fix something you’d use | Vitest #9718 (bench double-print) |
| Want high visibility | Vite #21149 (dep optimization progress) |
| Want to learn Rust through OSS | Oxc #15020 (maxWarnings config, has tutorial-like plan) |
PR Checklist
Before submitting:
- Tests pass locally
- New tests added for your change
- Snapshot tests updated if needed
- Commit message follows project conventions
- PR description explains what and why
- Linked to the issue (e.g., “Fixes #12345”)