rsnext/packages/next-swc
Donny/강동윤 42872bf423
Update swc_core to v0.90.7 and update turbopack (#61662)
# Turbopack changes

* https://github.com/vercel/turbo/pull/7342 <!-- OJ Kwon - docs(turbopack): build, deploy rustdocs -->
* https://github.com/vercel/turbo/pull/7356 <!-- OJ Kwon - ci(workflow): remove doc deploy -->
* https://github.com/vercel/turbo/pull/7272 <!-- Donny/강동윤 - build: Update `swc_core` to `v0.90.7` -->


### What?

Update swc crates

### Why?

- To apply https://github.com/swc-project/swc/pull/8532 and other bugfixes

### How?

 - Closes PACK-2389
 - Closes PACK-2446
 - Closes #61788
2024-02-13 04:20:16 +00:00
..
crates Update swc_core to v0.90.7 and update turbopack (#61662) 2024-02-13 04:20:16 +00:00
docs ci(workflow): deploy rustdocs for turbopack (#61958) 2024-02-12 15:14:36 -08:00
native Extract next-swc Rust code into its own package (#31635) 2021-11-21 12:59:56 +01:00
package.json v14.1.1-canary.51 2024-02-12 23:21:34 +00:00
README.md move custom allocator flag and add rustls-tls comment (#60128) 2024-01-11 09:07:56 +01:00

@next/swc

This package is responsible for swc compilation customized for next.js

Development

Run tests

cargo test

# Update snapshots and fixtures for tests
UPDATE=1 cargo test

Format code before submitting code

cargo fmt

Build the binary to integrate with next.js

pnpm build-native

Build wasm bindings to integrate with next.js

pnpm build-wasm

napi bindings feature matrix

Due to platform differences napi bindings selectively enables supported features. See below tables for the currently enabled features.

arch\platform Linux(gnu) Linux(musl) Darwin Win32
ia32 a,b,d,e
x64 a,b,d,e,f a,b,d,e,f a,b,d,e,f a,b,d,e,f
aarch64 a,d,e,f a,d,e,f a,b,d,e,f a,b,c,e
  • a: turbo_tasks_malloc,
  • b: turbo_tasks_malloc_custom_allocator,
  • c: native-tls,
  • d: rustls-tls,
  • e: image-extended (webp)
  • f: plugin

Package hierarchies

@next/swc consist of multiple rust packages to enable features. See below for the high level hierarchies.

flowchart TD
    C(next-custom-transforms) --> A(napi)
    C(next-custom-transforms) --> B(wasm)
    D(next-core) --> A(napi)
    E(next-build) --> A(napi)
    F(next-api) --> A(napi)
    C(next-custom-transforms) --> D
    D(next-core) --> F(next-api)
    D(next-core) --> E(next-build)
  • next-custom-transforms: provides next-swc specific SWC transform visitors. Turbopack, and the plain next-swc bidnings (transform) use these transforms. Since this is a bottom package can be imported in any place (turbopack / next-swc / wasm), it is important package do not contain specific dependencies. For example, using Turbopack's VC in this package will cause build failures to wasm bindings.
  • next-core: Implements Turbopack features for the next.js core functionality. This is also the place where Turbopack-specific transform providers (implementing CustomTransformer) lives, which wraps swc's transformer in the next-custom-transforms.
  • next-api: Binding interface to the next.js provides a proper next.js functionaility using next-core.
  • napi / wasm: The actual binding interfaces, napi for the node.js and wasm for the wasm. Note wasm bindings cannot import packages using turbopack's feature.

To add new swc transforms

  1. Implements a new visitor in next-custom-transforms. It is highly encouraged to use VisitMut instead of Fold for the performance reasons.
  2. Implements a new CustomTransformer under packages/next-swc/crates/next-core/src/next_shared/transforms to make Turbopack's ecma transform plugin, then adjust corresponding rules in packages/next-swc/crates/next-core/src/(next_client|next_server)/context.rs.