# Repository: swc-project/swc # Stars: 33357 ## CLAUDE.md # AI Agent Rules When working in a specific directory, apply the rules from that directory and all parent directories up to the root. ## While working on `.` *Source: `AGENTS.md`* # Instructions ## General rule - Read the codebase - the codebase is source of truth, and you should prefer reading lots of source code over searching. - Do not search web unless explicitly asked to do so. Web search does not help in general for our project. - Write performant code. Always prefer performance over other things. - Use `gh` CLI tool for fetching data from `github.com`. ## Code style - Write comments and documentations in English. - Write documentation for your code. - Commit your work as frequent as possible using git. Do NOT use `--no-verify` flag. - Prefer multiple small files over single large file. --- - When creating Atom instances, it's better to use `Cow` or `&str` instead of `String`. Note that `&str` is better than `Cow` here. ## Testing - Write unit tests for your code. - Prefer fixture tests over inline (`#[test]`) tests. - You can do `UPDATE=1 cargo test` to get test outputs updated for fixture tests. - When instructed to fix tests, do not remove or modify existing tests. ### Fixture Test Common Guide - Add new coverage by extending existing fixture suites instead of adding ad-hoc inline tests. - Find the exact fixture harness before adding files with: `rg -n "#\[(testing::)?fixture\(" tests src --glob "*.rs"`. - Keep each suite's naming conventions (for example: input.*, output.*, exec.*, .ans). - For snapshot-style tests, update expected outputs with `UPDATE=1 cargo test -p ...` using the exact crate command documented in each crate's AGENTS.md. - Always rerun the same crate tests without `UPDATE` before finishing. ## Verification - Before finishing a task, always run this baseline locally. - `cargo fmt --all` - `cargo clippy --all --all-targets -- -D warnings` - For each touched Rust crate, run crate-level verification locally. - `cargo test -p ` - If wasm binding packages are touched, run: - `(cd bindings/binding_core_wasm && ./scripts/test.sh)` - `(cd bindings/binding_minifier_wasm && ./scripts/test.sh)` - `(cd bindings/binding_typescript_wasm && ./scripts/test.sh)` - `(cd bindings/binding_es_ast_viewer && ./scripts/test.sh)` - If node bindings or integration paths are touched, run: - `(cd packages/core && yarn build:dev && yarn test)` ## Compatibility rule - Do not use unstable, nightly only features of rustc. --- ## While working on `crates/jsdoc` *Source: `crates/jsdoc/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixtures. - Update generated fixture outputs with: UPDATE=1 cargo test -p jsdoc. - Verify without UPDATE before finishing: cargo test -p jsdoc. --- ## While working on `crates/swc` *Source: `crates/swc/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/errors, tests/exec, tests/minify, tests/typescript, tests/vercel, tests/stacktrace, tests/babel-exec. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc. - Verify without UPDATE before finishing: cargo test -p swc. --- ## While working on `crates/swc_bundler` *Source: `crates/swc_bundler/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/deno-exec. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_bundler. - Verify without UPDATE before finishing: cargo test -p swc_bundler. --- ## While working on `crates/swc_core` *Source: `crates/swc_core/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_core. - Verify without UPDATE before finishing: cargo test -p swc_core. --- ## While working on `crates/swc_css_codegen` *Source: `crates/swc_css_codegen/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/options, ../swc_css_parser/tests/fixture. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_css_codegen. - Verify without UPDATE before finishing: cargo test -p swc_css_codegen. --- ## While working on `crates/swc_css_compat` *Source: `crates/swc_css_compat/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/nesting, tests/custom-media-query, tests/media-query-ranges, tests/color-hex-alpha, tests/color-legacy, tests/selector-not, tests/color-hwb, tests/all. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_css_compat. - Verify without UPDATE before finishing: cargo test -p swc_css_compat. --- ## While working on `crates/swc_css_lints` *Source: `crates/swc_css_lints/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/rules/pass, tests/rules/fail. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_css_lints. - Verify without UPDATE before finishing: cargo test -p swc_css_lints. --- ## While working on `crates/swc_css_minifier` *Source: `crates/swc_css_minifier/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_css_minifier. - Verify without UPDATE before finishing: cargo test -p swc_css_minifier. --- ## While working on `crates/swc_css_modules` *Source: `crates/swc_css_modules/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/with-compat. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_css_modules. - Verify without UPDATE before finishing: cargo test -p swc_css_modules. --- ## While working on `crates/swc_css_parser` *Source: `crates/swc_css_parser/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/line-comment, tests/recovery, tests/recovery-cssmodules. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_css_parser. - Verify without UPDATE before finishing: cargo test -p swc_css_parser. --- ## While working on `crates/swc_css_prefixer` *Source: `crates/swc_css_prefixer/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_css_prefixer. - Verify without UPDATE before finishing: cargo test -p swc_css_prefixer. --- ## While working on `crates/swc_ecma_codegen` *Source: `crates/swc_ecma_codegen/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/str-lits, ../swc_ecma_parser/tests/test262-parser/pass. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_codegen. - Verify without UPDATE before finishing: cargo test -p swc_ecma_codegen. --- ## While working on `crates/swc_ecma_lints` *Source: `crates/swc_ecma_lints/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/pass. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_lints. - Verify without UPDATE before finishing: cargo test -p swc_ecma_lints. --- ## While working on `crates/swc_ecma_minifier` *Source: `crates/swc_ecma_minifier/AGENTS.md`* ### Instructions - You can run execution tests by doing ./scripts/exec.sh to see if your changes are working. - If an execution test fails, you are wrong. - Always run execution tests after making changes. - You can run fixture tests by doing ./scripts/test.sh, and you can do UPDATE=1 ./scripts/test.sh to update fixtures. ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/terser, tests/mangle, tests/pass-1, tests/pass-default, tests/full, tests/projects, benches/full. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_minifier. - Verify without UPDATE before finishing: cargo test -p swc_ecma_minifier. --- ## While working on `crates/swc_ecma_parser` *Source: `crates/swc_ecma_parser/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/js, tests/jsx, tests/typescript, tests/typescript-errors, tests/errors, tests/comments, tests/span, tests/shifted. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_parser. - Verify without UPDATE before finishing: cargo test -p swc_ecma_parser. --- ## While working on `crates/swc_ecma_preset_env` *Source: `crates/swc_ecma_preset_env/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixtures. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_preset_env. - Verify without UPDATE before finishing: cargo test -p swc_ecma_preset_env. --- ## While working on `crates/swc_ecma_transformer` *Source: `crates/swc_ecma_transformer/AGENTS.md`* ### Instructions - The Transformer must implement `VisitMut` and execute the `VisitMutHooks` of its subtypes. - Other types like ES20xx or transforms for specific syntax MUST NOT implement `VisitMut`. - Subtypes must implement `VisitMutHook`. - Before starting work, read `$repositoryRoot/crates/swc_ecma_hooks/src/`. --- ## While working on `crates/swc_ecma_transforms` *Source: `crates/swc_ecma_transforms/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_transforms. - Verify without UPDATE before finishing: cargo test -p swc_ecma_transforms. --- ## While working on `crates/swc_ecma_transforms_base` *Source: `crates/swc_ecma_transforms_base/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/resolver, tests/ts-resolver, ../swc_ecma_parser/tests. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_transforms_base. - Verify without UPDATE before finishing: cargo test -p swc_ecma_transforms_base. --- ## While working on `crates/swc_ecma_transforms_compat` *Source: `crates/swc_ecma_transforms_compat/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/arrow, tests/async-to-generator, tests/block-scoping, tests/class-properties, tests/class_fields_use_set, tests/classes, tests/destructuring, tests/for-of, tests/new-target, tests/object-rest-spread, tests/optional-chaining, tests/optional-chaining-loose, tests/parameters, tests/private-in-object, tests/shorthand_properties, tests/static-blocks. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_transforms_compat. - Verify without UPDATE before finishing: cargo test -p swc_ecma_transforms_compat. --- ## While working on `crates/swc_ecma_transforms_module` *Source: `crates/swc_ecma_transforms_module/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/paths. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_transforms_module. - Verify without UPDATE before finishing: cargo test -p swc_ecma_transforms_module. --- ## While working on `crates/swc_ecma_transforms_optimization` *Source: `crates/swc_ecma_transforms_optimization/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/const-modules, tests/dce, tests/dce-jsx, tests/expr-simplifier. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_transforms_optimization. - Verify without UPDATE before finishing: cargo test -p swc_ecma_transforms_optimization. --- ## While working on `crates/swc_ecma_transforms_proposal` *Source: `crates/swc_ecma_transforms_proposal/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/decorators, tests/explicit-resource-management. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_transforms_proposal. - Verify without UPDATE before finishing: cargo test -p swc_ecma_transforms_proposal. --- ## While working on `crates/swc_ecma_transforms_react` *Source: `crates/swc_ecma_transforms_react/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/jsx/fixture, tests/integration/fixture, tests/script/jsx/fixture. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_transforms_react. - Verify without UPDATE before finishing: cargo test -p swc_ecma_transforms_react. --- ## While working on `crates/swc_ecma_transforms_typescript` *Source: `crates/swc_ecma_transforms_typescript/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, ../swc_ecma_parser/tests/tsc, ../swc_ecma_parser/tests/typescript. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ecma_transforms_typescript. - Verify without UPDATE before finishing: cargo test -p swc_ecma_transforms_typescript. --- ## While working on `crates/swc_error_reporters` *Source: `crates/swc_error_reporters/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_error_reporters. - Verify without UPDATE before finishing: cargo test -p swc_error_reporters. --- ## While working on `crates/swc_estree_compat` *Source: `crates/swc_estree_compat/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixtures, tests/flavor/acorn/fixtures. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_estree_compat. - Verify without UPDATE before finishing: cargo test -p swc_estree_compat. --- ## While working on `crates/swc_html_codegen` *Source: `crates/swc_html_codegen/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/document_fragment, tests/options, ../swc_html_parser/tests/fixture. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_html_codegen. - Verify without UPDATE before finishing: cargo test -p swc_html_codegen. --- ## While working on `crates/swc_html_minifier` *Source: `crates/swc_html_minifier/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/document_fragment, tests/recovery. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_html_minifier. - Verify without UPDATE before finishing: cargo test -p swc_html_minifier. --- ## While working on `crates/swc_html_parser` *Source: `crates/swc_html_parser/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/recovery, tests/iframe_srcdoc, tests/html5lib-tests-fixture, tests/html5lib-tests. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_html_parser. - Verify without UPDATE before finishing: cargo test -p swc_html_parser. --- ## While working on `crates/swc_node_bundler` *Source: `crates/swc_node_bundler/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/pass. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_node_bundler. - Verify without UPDATE before finishing: cargo test -p swc_node_bundler. --- ## While working on `crates/swc_plugin_backend_tests` *Source: `crates/swc_plugin_backend_tests/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, ../swc_ecma_parser/tests/tsc. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_plugin_backend_tests. - Verify without UPDATE before finishing: cargo test -p swc_plugin_backend_tests. --- ## While working on `crates/swc_ts_fast_strip` *Source: `crates/swc_ts_fast_strip/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/errors, ../swc_ecma_parser/tests/tsc. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_ts_fast_strip. - Verify without UPDATE before finishing: cargo test -p swc_ts_fast_strip. --- ## While working on `crates/swc_typescript` *Source: `crates/swc_typescript/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/**/*.ts, tests/**/*.tsx. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_typescript. - Verify without UPDATE before finishing: cargo test -p swc_typescript. --- ## While working on `crates/swc_xml_codegen` *Source: `crates/swc_xml_codegen/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/options, ../swc_xml_parser/tests/fixture, ../swc_xml_parser/tests/recovery. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_xml_codegen. - Verify without UPDATE before finishing: cargo test -p swc_xml_codegen. --- ## While working on `crates/swc_xml_parser` *Source: `crates/swc_xml_parser/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/fixture, tests/recovery. - Update generated fixture outputs with: UPDATE=1 cargo test -p swc_xml_parser. - Verify without UPDATE before finishing: cargo test -p swc_xml_parser. --- ## While working on `crates/testing_macros` *Source: `crates/testing_macros/AGENTS.md`* ### Fixture Test Addition Guide - Preferred fixture roots in this crate: tests/simple, tests/ignore. - Update generated fixture outputs with: UPDATE=1 cargo test -p testing_macros. - Verify without UPDATE before finishing: cargo test -p testing_macros. ## README.md

swc

Make the web (development) faster.

downloads (@swc/core) downloads (3rd party)

undefined GitHub release (latest SemVer)

GitHub code size in bytes node-current (scoped)

Discord

SWC (stands for `Speedy Web Compiler`) is a super-fast TypeScript / JavaScript compiler written in Rust. It's a library for Rust and JavaScript at the same time. If you are using SWC from Rust, see [rustdoc](https://rustdoc.swc.rs/swc/) and for most users, your entry point for using the library will be [parser](https://rustdoc.swc.rs/swc_ecma_parser/). Also, SWC tries to ensure that > If you select the latest version of each crates, it will work for rust users. MSRV of crates is currently `1.73`. To update all SWC crates you use, you can run `curl https://raw.githubusercontent.com/swc-project/swc/main/scripts/update-all-swc-crates.sh | bash -s`. This script will update all dependencies to the latest version and run `cargo build` to ensure that everything works. Note that you need - `jq` - `cargo upgrade` command to run the script. Supported Node Versions: - Node v10+ for usage - Node v20+ for development --- If you are using SWC from JavaScript, please refer to [docs on the website](https://swc.rs/docs/installation/). # Documentation Check out the documentation [in the website](https://swc.rs/docs/installation/). # Features Please see [comparison with babel](https://swc.rs/docs/migrating-from-babel). # Performance Please see [benchmark results](https://swc.rs/docs/benchmark-transform) on the website. # Supporting development

Supporting swc

## Star History [![Star History Chart](https://api.star-history.com/svg?repos=swc-project/swc&type=Timeline)](https://www.star-history.com/#swc-project/swc&Timeline) ## Powered by [![JetBrains logo.](https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.svg)](https://jb.gg/OpenSourceSupport) ## Sponsors

Sponsors

SWC is a community-driven project, and is maintained by a group of [volunteers](https://swc.rs/docs/team). If you'd like to help support the future of the project, please consider: - Giving developer time on the project. (Message us on [Discord](https://discord.gg/GnHbXTdZz6) (preferred) or [Github discussions](https://github.com/swc-project/swc/discussions) for guidance!) - Giving funds by becoming a sponsor (see https://opencollective.com/swc)! ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md). You may also find the architecture documentation useful ([ARCHITECTURE.md](ARCHITECTURE.md)). ## License SWC is primarily distributed under the terms of the Apache License (Version 2.0). See [LICENSE](LICENSE) for details.