Contributing to VoidZero Projects

Dev setup for each repo. All four projects are active, responsive, and welcome contributions.

General Rules (All Projects)

  1. Comment on the issue first. Say you’re working on it. Avoids duplicate effort.
  2. Keep PRs small. One issue per PR. Maintainers review small PRs faster.
  3. Always include tests. PRs without tests won’t be merged.
  4. 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 server
  • optimizer/ - dependency pre-bundling
  • config.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 SituationStart Here
Want quickest first PROxc #19121 (add .with_help to a rule)
Want to fix something you’d useVitest #9718 (bench double-print)
Want high visibilityVite #21149 (dep optimization progress)
Want to learn Rust through OSSOxc #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”)