1311 releases (273 breaking)

new 0.273.23 Mar 26, 2024
0.273.12 Feb 28, 2024
0.270.10 Dec 29, 2023
0.269.75 Nov 29, 2023
0.13.0 Mar 31, 2021

#10 in #babel

Download history 3519/week @ 2023-12-04 2813/week @ 2023-12-11 2145/week @ 2023-12-18 1392/week @ 2023-12-25 2795/week @ 2024-01-01 3205/week @ 2024-01-08 2095/week @ 2024-01-15 3271/week @ 2024-01-22 2253/week @ 2024-01-29 1643/week @ 2024-02-05 1733/week @ 2024-02-12 2589/week @ 2024-02-19 2983/week @ 2024-02-26 3358/week @ 2024-03-04 2821/week @ 2024-03-11 2269/week @ 2024-03-18

11,577 downloads per month
Used in 28 crates (21 directly)

Apache-2.0

4MB
107K SLoC

Testing

tests/exec

All files named exec.js or exec.ts will be executed, and the test system will ensure that original source code and transpiled source code print the same output to the console.

You can use ./scripts/check-issues.sh to automatically unignore fixed tests.


lib.rs:

The main crate of the swc project.

Customizing

This is documentation for building custom build tools on top of swc.

Dependency version management

swc has swc_css, which re-exports required modules.

Testing

See [testing] and swc_ecma_transforms_testing.

Custom javascript transforms

What is JsWord?

It's basically an interned string. See [swc_atoms].

Choosing between JsWord vs String

You should prefer JsWord over [String] if it's going to be stored in an AST node.

See [swc_atoms] for detailed description.

Fold vs VisitMut vs Visit

See [swc_visit] for detailed description.

Variable management (Scoping)

See swc_ecma_transforms_base::resolver::resolver_with_mark.

How identifiers work

See the doc on swc_ecma_ast::Ident or on swc_ecma_transforms_base::resolver::resolver_with_mark.

Comparing two identifiers

See swc_ecma_utils::Id. You can use swc_ecma_utils::IdentLike::to_id to extract important parts of an swc_ecma_ast::Ident.

Creating a unique identifier

See swc_ecma_utils::private_ident.

Prepending statements

If you want to prepend statements to the beginning of a file, you can use swc_ecma_utils::prepend_stmts or swc_ecma_utils::prepend if len == 1.

These methods are aware of the fact that "use strict" directive should be first in a file, and insert statements after directives.

Improving readability

Each stuffs are documented at itself.

Reducing binary size

The visitor expands to a lot of code. You can reduce it by using macros like

Note that this will make typescript-related nodes not processed, but it's typically fine as typescript::strip is invoked at the start and it removes typescript-specific nodes.

Porting expr.evaluate() of babel

See swc_ecma_minifier::eval::Evaluator.

Dependencies

~19–38MB
~643K SLoC