swc 0.150.0

Speedy web compiler
docs.rs failed to build swc-0.150.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: swc-0.163.0

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_ecmascript and swc_css, which re-exports required modules.

Testing

See [testing] and swc_ecma_transform_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.

  • 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 callee.

  • 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 typescript-specific nodes.

Porting expr.evaluate() of babel

See [swc_ecma_minifier::eval::Evaluator].