793 releases (245 breaking)
|new 0.245.12||Feb 1, 2023|
|0.244.4||Jan 24, 2023|
|0.238.1||Dec 27, 2022|
|0.233.1||Nov 30, 2022|
|0.13.0||Mar 31, 2021|
#791 in Web programming
19,086 downloads per month
Used in 19 crates (13 directly)
All files named
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.
The main crate of the swc project.
This is documentation for building custom build tools on top of swc.
Dependency version management
swc has swc_css, which re-exports required modules.
See [testing] and swc_ecma_transform_testing.
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)
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
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.
Each stuffs are documented at itself.
If you are creating or binding an [swc_ecma_ast::Expr] with operator, you can use [swc_ecma_ast::op].
If you want to create [swc_ecma_ast::CallExpr], you can use [swc_ecma_utils::ExprFactory::as_callee] to create
If you want to create [swc_ecma_ast::CallExpr] or [swc_ecma_ast::NewExpr], you can use [swc_ecma_utils::ExprFactory::as_arg] to create arguments.
If you want to create [swc_ecma_ast::MemberExpr] where all identifiers are static (e.g.
Object.prototype.hasOwnProperty), you can use [swc_ecma_utils::member_expr].
If you want to create [swc_ecma_ast::MemberExpr], you can use [swc_ecma_utils::ExprFactory::as_obj] to create object field.
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
expr.evaluate() of babel