Port next-ssg getStaticProps/getServerSideProps tree shaking Babel transform to rust (#27552)

This commit is contained in:
강동윤 2021-08-03 21:02:23 +09:00 committed by GitHub
parent 5ded742395
commit 61586eda6a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
57 changed files with 1601 additions and 56 deletions

View file

@ -24,3 +24,4 @@ packages/next-env/**/*.d.ts
packages/create-next-app/templates/**
test/integration/eslint/**
test-timings.json
packages/next/build/swc/tests/fixture/**

View file

@ -0,0 +1,3 @@
format_strings = true
use_field_init_shorthand = true
wrap_comments = true

View file

@ -53,6 +53,24 @@ dependencies = [
"memchr",
]
[[package]]
name = "ansi_term"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
dependencies = [
"winapi",
]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]]
name = "anyhow"
version = "1.0.42"
@ -207,6 +225,16 @@ dependencies = [
"build_const",
]
[[package]]
name = "ctor"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d"
dependencies = [
"quote",
"syn",
]
[[package]]
name = "darling"
version = "0.10.2"
@ -252,6 +280,12 @@ dependencies = [
"num_cpus",
]
[[package]]
name = "difference"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
[[package]]
name = "digest"
version = "0.9.0"
@ -279,6 +313,19 @@ dependencies = [
"syn",
]
[[package]]
name = "env_logger"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
dependencies = [
"atty",
"humantime",
"log",
"regex",
"termcolor",
]
[[package]]
name = "fixedbitset"
version = "0.2.0"
@ -372,6 +419,12 @@ version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189"
[[package]]
name = "glob"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]]
name = "hashbrown"
version = "0.9.1"
@ -396,6 +449,15 @@ dependencies = [
"libc",
]
[[package]]
name = "humantime"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
dependencies = [
"quick-error",
]
[[package]]
name = "ident_case"
version = "1.0.1"
@ -625,19 +687,24 @@ version = "0.0.0"
dependencies = [
"anyhow",
"backtrace",
"fxhash",
"log",
"napi",
"napi-build",
"napi-derive",
"path-clean",
"regex",
"retain_mut",
"serde",
"serde_json",
"swc",
"swc_atoms",
"swc_common",
"swc_ecma_preset_env",
"swc_ecma_preset_env 0.31.0",
"swc_ecma_transforms_testing",
"swc_ecmascript",
"swc_node_base",
"testing",
]
[[package]]
@ -720,6 +787,15 @@ dependencies = [
"num-traits",
]
[[package]]
name = "output_vt100"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9"
dependencies = [
"winapi",
]
[[package]]
name = "owning_ref"
version = "0.4.1"
@ -847,6 +923,18 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]]
name = "pretty_assertions"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427"
dependencies = [
"ansi_term 0.11.0",
"ctor",
"difference",
"output_vt100",
]
[[package]]
name = "proc-macro-hack"
version = "0.5.19"
@ -862,6 +950,12 @@ dependencies = [
"unicode-xid",
]
[[package]]
name = "quick-error"
version = "1.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
[[package]]
name = "quote"
version = "1.0.9"
@ -910,6 +1004,18 @@ dependencies = [
"rand_pcg 0.2.1",
]
[[package]]
name = "rand"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
dependencies = [
"libc",
"rand_chacha 0.3.1",
"rand_core 0.6.3",
"rand_hc 0.3.1",
]
[[package]]
name = "rand_chacha"
version = "0.1.1"
@ -930,6 +1036,16 @@ dependencies = [
"rand_core 0.5.1",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core 0.6.3",
]
[[package]]
name = "rand_core"
version = "0.3.1"
@ -954,6 +1070,15 @@ dependencies = [
"getrandom 0.1.16",
]
[[package]]
name = "rand_core"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
dependencies = [
"getrandom 0.2.3",
]
[[package]]
name = "rand_hc"
version = "0.1.0"
@ -972,6 +1097,15 @@ dependencies = [
"rand_core 0.5.1",
]
[[package]]
name = "rand_hc"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
dependencies = [
"rand_core 0.6.3",
]
[[package]]
name = "rand_isaac"
version = "0.1.1"
@ -1043,6 +1177,15 @@ dependencies = [
"rand_core 0.3.1",
]
[[package]]
name = "redox_syscall"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee"
dependencies = [
"bitflags",
]
[[package]]
name = "regex"
version = "1.5.4"
@ -1066,6 +1209,15 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a479d53d7eed831f3c92ca79c61002d5987e21417d528296832f802bca532380"
[[package]]
name = "remove_dir_all"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
dependencies = [
"winapi",
]
[[package]]
name = "retain_mut"
version = "0.1.3"
@ -1312,13 +1464,13 @@ dependencies = [
"swc_bundler",
"swc_common",
"swc_ecma_ast",
"swc_ecma_codegen",
"swc_ecma_codegen 0.62.1",
"swc_ecma_ext_transforms",
"swc_ecma_loader",
"swc_ecma_parser",
"swc_ecma_preset_env",
"swc_ecma_transforms",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_preset_env 0.29.0",
"swc_ecma_transforms 0.59.0",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
"swc_node_base",
"swc_visit",
@ -1355,11 +1507,11 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_codegen",
"swc_ecma_codegen 0.62.1",
"swc_ecma_loader",
"swc_ecma_parser",
"swc_ecma_transforms",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_transforms 0.59.0",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
@ -1417,7 +1569,23 @@ dependencies = [
"swc_common",
"swc_ecma_ast",
"swc_ecma_codegen_macros",
"swc_ecma_parser",
"swc_ecma_parser 0.63.0",
]
[[package]]
name = "swc_ecma_codegen"
version = "0.64.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34c3c4d017728ef6eaeaba46c34ba31ef24aa03a8a6a0240cb0e0c1e75435482"
dependencies = [
"bitflags",
"num-bigint",
"sourcemap",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_codegen_macros",
"swc_ecma_parser 0.65.0",
]
[[package]]
@ -1443,8 +1611,8 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
@ -1489,6 +1657,27 @@ dependencies = [
"unicode-xid",
]
[[package]]
name = "swc_ecma_parser"
version = "0.65.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a47e935b2ff6bdb6cd7ccb20aa1a6cb94f9993e5fc44ab69692dcb87bd8b4238"
dependencies = [
"either",
"enum_kind",
"fxhash",
"lexical",
"log",
"num-bigint",
"serde",
"smallvec 1.6.1",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_visit",
"unicode-xid",
]
[[package]]
name = "swc_ecma_preset_env"
version = "0.29.0"
@ -1507,8 +1696,32 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_transforms",
"swc_ecma_utils",
"swc_ecma_transforms 0.59.0",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
"walkdir",
]
[[package]]
name = "swc_ecma_preset_env"
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "812a7b0a6d1b9eff332f01068327d7f55dc60ab3eb301ee69e591fbac063ea17"
dependencies = [
"dashmap",
"fxhash",
"indexmap",
"once_cell",
"semver",
"serde",
"serde_json",
"st-map",
"string_enum",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_transforms 0.61.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
"walkdir",
]
@ -1522,15 +1735,36 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser",
"swc_ecma_transforms_base",
"swc_ecma_transforms_compat",
"swc_ecma_parser 0.63.0",
"swc_ecma_transforms_base 0.22.2",
"swc_ecma_transforms_compat 0.25.1",
"swc_ecma_transforms_module",
"swc_ecma_transforms_optimization",
"swc_ecma_transforms_proposal",
"swc_ecma_transforms_react",
"swc_ecma_transforms_typescript",
"swc_ecma_utils",
"swc_ecma_transforms_optimization 0.29.1",
"swc_ecma_transforms_proposal 0.26.0",
"swc_ecma_transforms_react 0.27.0",
"swc_ecma_transforms_typescript 0.28.1",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
"unicode-xid",
]
[[package]]
name = "swc_ecma_transforms"
version = "0.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c52640be334b353c4c762e786dd054dae6f8ee8534418058f1184cfca057786c"
dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser 0.65.0",
"swc_ecma_transforms_base 0.24.0",
"swc_ecma_transforms_compat 0.27.0",
"swc_ecma_transforms_optimization 0.31.0",
"swc_ecma_transforms_proposal 0.28.0",
"swc_ecma_transforms_react 0.29.0",
"swc_ecma_transforms_typescript 0.30.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
"unicode-xid",
]
@ -1549,8 +1783,27 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
[[package]]
name = "swc_ecma_transforms_base"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "daf2a22f330dac0031b0dd6957fe34d6cead7e0836af012ea62c0ec6b1b40456"
dependencies = [
"fxhash",
"once_cell",
"phf",
"scoped-tls",
"smallvec 1.6.1",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser 0.65.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
]
@ -1563,8 +1816,22 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_transforms_base",
"swc_ecma_utils",
"swc_ecma_transforms_base 0.22.2",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
[[package]]
name = "swc_ecma_transforms_classes"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28f17fb4fe2ad6651f7c832970526e81a3263ab89657b844d7b63564f6a25d19"
dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_transforms_base 0.24.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
]
@ -1585,10 +1852,34 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_transforms_base",
"swc_ecma_transforms_classes",
"swc_ecma_transforms_base 0.22.2",
"swc_ecma_transforms_classes 0.8.0",
"swc_ecma_transforms_macros",
"swc_ecma_utils",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
[[package]]
name = "swc_ecma_transforms_compat"
version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b5243d08c700668f16e1fbbec6e645f302bc1dd40375f5faf15a860e41090f2"
dependencies = [
"arrayvec",
"fxhash",
"indexmap",
"is-macro",
"num-bigint",
"ordered-float",
"serde",
"smallvec 1.6.1",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_transforms_base 0.24.0",
"swc_ecma_transforms_classes 0.10.0",
"swc_ecma_transforms_macros",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
]
@ -1621,9 +1912,9 @@ dependencies = [
"swc_common",
"swc_ecma_ast",
"swc_ecma_loader",
"swc_ecma_parser",
"swc_ecma_transforms_base",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_transforms_base 0.22.2",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
@ -1643,9 +1934,31 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser",
"swc_ecma_transforms_base",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_transforms_base 0.22.2",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
[[package]]
name = "swc_ecma_transforms_optimization"
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76ddc2c8e023af9e34aaa8f295605f82e2cd7dddbdaa69ec155bde50ed2d81c"
dependencies = [
"dashmap",
"fxhash",
"indexmap",
"log",
"once_cell",
"retain_mut",
"serde_json",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser 0.65.0",
"swc_ecma_transforms_base 0.24.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
]
@ -1662,10 +1975,30 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser",
"swc_ecma_transforms_base",
"swc_ecma_transforms_classes",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_transforms_base 0.22.2",
"swc_ecma_transforms_classes 0.8.0",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
[[package]]
name = "swc_ecma_transforms_proposal"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66cf6f5f9afea77d720798604b9f755f0f4a63b9996b437c84712ce59ca7f78a"
dependencies = [
"either",
"fxhash",
"serde",
"smallvec 1.6.1",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser 0.65.0",
"swc_ecma_transforms_base 0.24.0",
"swc_ecma_transforms_classes 0.10.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
]
@ -1686,12 +2019,55 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser",
"swc_ecma_transforms_base",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_transforms_base 0.22.2",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
[[package]]
name = "swc_ecma_transforms_react"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d614204eca90380510fc6cc9a5f00e7a1dcac20939d39f883f770341ee08b670"
dependencies = [
"base64 0.13.0",
"dashmap",
"indexmap",
"once_cell",
"regex",
"serde",
"sha-1",
"string_enum",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser 0.65.0",
"swc_ecma_transforms_base 0.24.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
]
[[package]]
name = "swc_ecma_transforms_testing"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f92855b778ba45bf441335e7d95ed0ff1df8b1deea08d9b4301cf214cb78e64"
dependencies = [
"ansi_term 0.12.1",
"serde",
"serde_json",
"swc_common",
"swc_ecma_ast",
"swc_ecma_codegen 0.64.0",
"swc_ecma_parser 0.65.0",
"swc_ecma_transforms_base 0.24.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
"tempfile",
"testing",
]
[[package]]
name = "swc_ecma_transforms_typescript"
version = "0.28.1"
@ -1703,9 +2079,26 @@ dependencies = [
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser",
"swc_ecma_transforms_base",
"swc_ecma_utils",
"swc_ecma_parser 0.63.0",
"swc_ecma_transforms_base 0.22.2",
"swc_ecma_utils 0.40.0",
"swc_ecma_visit",
]
[[package]]
name = "swc_ecma_transforms_typescript"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3766bb42e21c763b68d15a43f0a13afb19be86036fd37b051821ecd846ff796"
dependencies = [
"fxhash",
"serde",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_parser 0.65.0",
"swc_ecma_transforms_base 0.24.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
]
@ -1724,6 +2117,21 @@ dependencies = [
"unicode-xid",
]
[[package]]
name = "swc_ecma_utils"
version = "0.41.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "725fb37b8f7ac49b9edd7001dba006f0aa9b9a85623337994ab89b0f2b12032b"
dependencies = [
"once_cell",
"scoped-tls",
"swc_atoms",
"swc_common",
"swc_ecma_ast",
"swc_ecma_visit",
"unicode-xid",
]
[[package]]
name = "swc_ecma_visit"
version = "0.35.0"
@ -1739,15 +2147,15 @@ dependencies = [
[[package]]
name = "swc_ecmascript"
version = "0.46.0"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61e2f57a4c2841101208f1d1738cd7739e89ff9f0d59eecaba3f7f7900aa02c7"
checksum = "9fb11d3d724142ddbe9bbb5efd44ebad9c7c8a7a283c80b48d3dd025ab90aae1"
dependencies = [
"swc_ecma_ast",
"swc_ecma_codegen",
"swc_ecma_parser",
"swc_ecma_transforms",
"swc_ecma_utils",
"swc_ecma_codegen 0.64.0",
"swc_ecma_parser 0.65.0",
"swc_ecma_transforms 0.61.0",
"swc_ecma_utils 0.41.0",
"swc_ecma_visit",
]
@ -1822,6 +2230,20 @@ dependencies = [
"unicode-xid",
]
[[package]]
name = "tempfile"
version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
dependencies = [
"cfg-if 1.0.0",
"libc",
"rand 0.8.4",
"redox_syscall",
"remove_dir_all",
"winapi",
]
[[package]]
name = "termcolor"
version = "1.1.2"
@ -1831,6 +2253,39 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "testing"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14c1ecb819cc019f96a0d1f268e080588c47eab4cc804d8dadac52e34f264430"
dependencies = [
"ansi_term 0.12.1",
"difference",
"env_logger",
"log",
"once_cell",
"pretty_assertions",
"regex",
"swc_common",
"testing_macros",
]
[[package]]
name = "testing_macros"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92c96cc628186322f8ba6c3b9368497bb0a99c07da8b3641cf2efc7eb7cb5299"
dependencies = [
"anyhow",
"glob",
"pmutil",
"proc-macro2",
"quote",
"regex",
"relative-path",
"syn",
]
[[package]]
name = "tinyvec"
version = "1.2.0"

View file

@ -19,8 +19,11 @@ swc = "0.30"
swc_atoms = "0.2.6"
swc_common = { version = "0.11.1", features = ["tty-emitter", "sourcemap"] }
swc_node_base = "0.2.0"
swc_ecmascript = { version = "0.46.0", features = ["codegen", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] }
swc_ecma_preset_env = "0.29.0"
swc_ecmascript = { version = "0.48.0", features = ["codegen", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] }
swc_ecma_preset_env = "0.31.0"
fxhash = "0.2.1"
retain_mut = "0.1.3"
log = "0.4.14"
[build-dependencies]
@ -28,3 +31,7 @@ napi-build = "1"
[profile.release]
lto = true
[dev-dependencies]
swc_ecma_transforms_testing = "0.24.0"
testing = "0.12.0"

View file

@ -46,6 +46,7 @@ use swc_common::{
};
mod hook_optimizer;
pub mod next_ssg;
mod transform;
mod util;

View file

@ -0,0 +1,623 @@
use fxhash::FxHashSet;
use std::mem::take;
use swc_common::pass::{Repeat, Repeated};
use swc_common::DUMMY_SP;
use swc_ecmascript::ast::*;
use swc_ecmascript::utils::ident::IdentLike;
use swc_ecmascript::visit::FoldWith;
use swc_ecmascript::{
utils::Id,
visit::{noop_fold_type, Fold},
};
/// Note: This paths requires runnning `resolver` **before** running this.
pub fn next_ssg() -> impl Fold {
Repeat::new(NextSsg {
state: Default::default(),
in_lhs_of_var: false,
})
}
/// State of the transforms. Shared by the anayzer and the tranform.
#[derive(Debug, Default)]
struct State {
/// Identifiers referenced by non-data function codes.
///
/// Cleared before running each pass, because we drop ast nodes between the
/// passes.
refs_from_other: FxHashSet<Id>,
/// Identifiers referenced by data functions or derivatives.
///
/// Preserved between runs, because we should remember derivatives of data
/// functions as the data function itself is already removed.
refs_from_data_fn: FxHashSet<Id>,
cur_declaring: FxHashSet<Id>,
is_prerenderer: bool,
is_server_props: bool,
done: bool,
should_run_again: bool,
}
impl State {
fn is_data_identifier(&mut self, i: &Ident) -> bool {
let ssg_exports = &[
"getStaticProps",
"getStaticPaths",
"getServerSideProps",
"unstable_getStaticProps",
"unstable_getStaticPaths",
"unstable_getServerProps",
"unstable_getServerSideProps",
];
if ssg_exports.contains(&&*i.sym) {
if &*i.sym == "" {
if self.is_prerenderer {
panic!(
"You can not use getStaticProps or getStaticPaths with \
getServerSideProps. To use SSG, please remove getServerSideProps"
)
}
self.is_server_props = true;
} else {
if self.is_server_props {
panic!(
"You can not use getStaticProps or getStaticPaths with \
getServerSideProps. To use SSG, please remove getServerSideProps"
)
}
self.is_prerenderer = true;
}
true
} else {
false
}
}
}
struct Analyzer<'a> {
state: &'a mut State,
in_lhs_of_var: bool,
in_data_fn: bool,
}
impl Analyzer<'_> {
fn add_ref(&mut self, id: Id) {
log::trace!("add_ref({}{:?}, data = {})", id.0, id.1, self.in_data_fn);
if self.in_data_fn {
self.state.refs_from_data_fn.insert(id);
} else {
if self.state.cur_declaring.contains(&id) {
return;
}
self.state.refs_from_other.insert(id);
}
}
}
impl Fold for Analyzer<'_> {
// This is important for reducing binary sizes.
noop_fold_type!();
fn fold_binding_ident(&mut self, i: BindingIdent) -> BindingIdent {
if !self.in_lhs_of_var || self.in_data_fn {
self.add_ref(i.id.to_id());
}
i
}
fn fold_export_named_specifier(&mut self, s: ExportNamedSpecifier) -> ExportNamedSpecifier {
self.add_ref(s.orig.to_id());
s
}
fn fold_expr(&mut self, e: Expr) -> Expr {
let e = e.fold_children_with(self);
match &e {
Expr::Ident(i) => {
self.add_ref(i.to_id());
}
_ => {}
}
e
}
fn fold_fn_decl(&mut self, f: FnDecl) -> FnDecl {
let old_in_data = self.in_data_fn;
self.state.cur_declaring.insert(f.ident.to_id());
self.in_data_fn |= self.state.is_data_identifier(&f.ident);
log::trace!(
"ssg: Handling `{}{:?}`; in_data_fn = {:?}",
f.ident.sym,
f.ident.span.ctxt,
self.in_data_fn
);
let f = f.fold_children_with(self);
self.state.cur_declaring.remove(&f.ident.to_id());
self.in_data_fn = old_in_data;
f
}
fn fold_fn_expr(&mut self, f: FnExpr) -> FnExpr {
let f = f.fold_children_with(self);
if let Some(id) = &f.ident {
self.add_ref(id.to_id());
}
f
}
fn fold_member_expr(&mut self, mut e: MemberExpr) -> MemberExpr {
e.obj = e.obj.fold_with(self);
if e.computed {
e.prop = e.prop.fold_with(self);
}
e
}
/// Drops [ExportDecl] if all speicifers are removed.
fn fold_module_item(&mut self, s: ModuleItem) -> ModuleItem {
match s {
ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(e)) if !e.specifiers.is_empty() => {
let e = e.fold_with(self);
if e.specifiers.is_empty() {
return ModuleItem::Stmt(Stmt::Empty(EmptyStmt { span: DUMMY_SP }));
}
return ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(e));
}
_ => {}
};
// Visit children to ensure that all references is added to the scope.
let s = s.fold_children_with(self);
match &s {
ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(e)) => match &e.decl {
Decl::Fn(f) => {
// Drop getStaticProps.
if self.state.is_data_identifier(&f.ident) {
return ModuleItem::Stmt(Stmt::Empty(EmptyStmt { span: DUMMY_SP }));
}
}
Decl::Var(d) => {
if d.decls.is_empty() {
return ModuleItem::Stmt(Stmt::Empty(EmptyStmt { span: DUMMY_SP }));
}
}
_ => {}
},
_ => {}
}
s
}
fn fold_named_export(&mut self, mut n: NamedExport) -> NamedExport {
if n.src.is_some() {
n.specifiers = n.specifiers.fold_with(self);
}
n
}
fn fold_prop(&mut self, p: Prop) -> Prop {
let p = p.fold_children_with(self);
match &p {
Prop::Shorthand(i) => {
self.add_ref(i.to_id());
}
_ => {}
}
p
}
fn fold_var_declarator(&mut self, mut v: VarDeclarator) -> VarDeclarator {
let old_in_data = self.in_data_fn;
match &v.name {
Pat::Ident(name) => {
if self.state.is_data_identifier(&name.id) {
self.in_data_fn = true;
}
}
_ => {}
}
let old_in_lhs_of_var = self.in_lhs_of_var;
self.in_lhs_of_var = true;
v.name = v.name.fold_with(self);
self.in_lhs_of_var = false;
v.init = v.init.fold_with(self);
self.in_lhs_of_var = old_in_lhs_of_var;
self.in_data_fn = old_in_data;
v
}
}
/// Actual implementation of the transform.
struct NextSsg {
state: State,
in_lhs_of_var: bool,
}
impl NextSsg {
fn should_remove(&self, id: Id) -> bool {
self.state.refs_from_data_fn.contains(&id) && !self.state.refs_from_other.contains(&id)
}
/// Mark identifiers in `n` as a candidate for removal.
fn mark_as_candidate<N>(&mut self, n: N) -> N
where
N: for<'aa> FoldWith<Analyzer<'aa>>,
{
log::debug!("mark_as_candidate");
// Analyzer never change `in_data_fn` to false, so all identifiers in `n` will
// be marked as referenced from a data function.
let mut v = Analyzer {
state: &mut self.state,
in_lhs_of_var: false,
in_data_fn: true,
};
let n = n.fold_with(&mut v);
self.state.should_run_again = true;
n
}
}
impl Repeated for NextSsg {
fn changed(&self) -> bool {
self.state.should_run_again
}
fn reset(&mut self) {
self.state.refs_from_other.clear();
self.state.cur_declaring.clear();
self.state.should_run_again = false;
}
}
/// `VisitMut` is faster than [Fold], but we use [Fold] because it's much easier
/// to read.
///
/// Note: We don't implement `fold_script` because next.js doesn't use it.
impl Fold for NextSsg {
// This is important for reducing binary sizes.
noop_fold_type!();
fn fold_import_decl(&mut self, mut i: ImportDecl) -> ImportDecl {
// Imports for side effects.
if i.specifiers.is_empty() {
return i;
}
i.specifiers.retain(|s| match s {
ImportSpecifier::Named(ImportNamedSpecifier { local, .. })
| ImportSpecifier::Default(ImportDefaultSpecifier { local, .. })
| ImportSpecifier::Namespace(ImportStarAsSpecifier { local, .. }) => {
if self.should_remove(local.to_id()) {
log::trace!(
"Dropping import `{}{:?}` because it should be removed",
local.sym,
local.span.ctxt
);
self.state.should_run_again = true;
false
} else {
true
}
}
});
i
}
fn fold_module(&mut self, mut m: Module) -> Module {
log::info!("ssg: Start");
{
// Fill the state.
let mut v = Analyzer {
state: &mut self.state,
in_lhs_of_var: false,
in_data_fn: false,
};
m = m.fold_with(&mut v);
}
// TODO: Use better detection logic
// if !self.state.is_prerenderer && !self.state.is_server_props {
// return m;
// }
m.fold_children_with(self)
}
fn fold_module_item(&mut self, i: ModuleItem) -> ModuleItem {
match i {
ModuleItem::ModuleDecl(ModuleDecl::Import(i)) => {
let is_for_side_effect = i.specifiers.is_empty();
let i = i.fold_with(self);
if !is_for_side_effect && i.specifiers.is_empty() {
return ModuleItem::Stmt(Stmt::Empty(EmptyStmt { span: DUMMY_SP }));
}
return ModuleItem::ModuleDecl(ModuleDecl::Import(i));
}
_ => {}
}
let i = i.fold_children_with(self);
match &i {
ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(e)) if e.specifiers.is_empty() => {
return ModuleItem::Stmt(Stmt::Empty(EmptyStmt { span: DUMMY_SP }))
}
_ => {}
}
i
}
fn fold_module_items(&mut self, mut items: Vec<ModuleItem>) -> Vec<ModuleItem> {
items = items.fold_children_with(self);
// Drop nodes.
items.retain(|s| match s {
ModuleItem::Stmt(Stmt::Empty(..)) => false,
_ => true,
});
if !self.state.done && !self.state.should_run_again {
self.state.done = true;
if items.iter().any(|s| s.is_module_decl()) {
let mut var = Some(VarDeclarator {
span: DUMMY_SP,
name: Pat::Ident(
Ident::new(
if self.state.is_prerenderer {
"__N_SSG".into()
} else {
"__N_SSP".into()
},
DUMMY_SP,
)
.into(),
),
init: Some(Box::new(Expr::Lit(Lit::Bool(Bool {
span: DUMMY_SP,
value: true,
})))),
definite: Default::default(),
});
let mut new = Vec::with_capacity(items.len() + 1);
for item in take(&mut items) {
match &item {
ModuleItem::ModuleDecl(
ModuleDecl::ExportNamed(..)
| ModuleDecl::ExportDecl(..)
| ModuleDecl::ExportDefaultDecl(..)
| ModuleDecl::ExportDefaultExpr(..),
) => {
if let Some(var) = var.take() {
new.push(ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(
ExportDecl {
span: DUMMY_SP,
decl: Decl::Var(VarDecl {
span: DUMMY_SP,
kind: VarDeclKind::Var,
declare: Default::default(),
decls: vec![var],
}),
},
)))
}
}
_ => {}
}
new.push(item);
}
return new;
}
}
items
}
fn fold_named_export(&mut self, mut n: NamedExport) -> NamedExport {
n.specifiers = n.specifiers.fold_with(self);
n.specifiers.retain(|s| {
let preserve = match s {
ExportSpecifier::Namespace(ExportNamespaceSpecifier { name: exported, .. })
| ExportSpecifier::Default(ExportDefaultSpecifier { exported, .. })
| ExportSpecifier::Named(ExportNamedSpecifier {
exported: Some(exported),
..
}) => !self.state.is_data_identifier(&exported),
ExportSpecifier::Named(s) => !self.state.is_data_identifier(&s.orig),
};
if !preserve {
log::trace!("Dropping a export specifier because it's a data identifier");
match s {
ExportSpecifier::Named(ExportNamedSpecifier { orig, .. }) => {
self.state.should_run_again = true;
self.state.refs_from_data_fn.insert(orig.to_id());
}
_ => {}
}
}
preserve
});
n
}
/// This methods returns [Pat::Invalid] if the pattern should be removed.
fn fold_pat(&mut self, mut p: Pat) -> Pat {
p = p.fold_children_with(self);
if self.in_lhs_of_var {
match &mut p {
Pat::Ident(name) => {
if self.should_remove(name.id.to_id()) {
self.state.should_run_again = true;
log::trace!(
"Dropping var `{}{:?}` because it should be removed",
name.id.sym,
name.id.span.ctxt
);
return Pat::Invalid(Invalid { span: DUMMY_SP });
}
}
Pat::Array(arr) => {
if !arr.elems.is_empty() {
arr.elems.retain(|e| match e {
Some(Pat::Invalid(..)) => return false,
_ => true,
});
if arr.elems.is_empty() {
return Pat::Invalid(Invalid { span: DUMMY_SP });
}
}
}
Pat::Object(obj) => {
if !obj.props.is_empty() {
obj.props = take(&mut obj.props)
.into_iter()
.filter_map(|prop| match prop {
ObjectPatProp::KeyValue(prop) => {
if prop.value.is_invalid() {
None
} else {
Some(ObjectPatProp::KeyValue(prop))
}
}
ObjectPatProp::Assign(prop) => {
if self.should_remove(prop.key.to_id()) {
self.mark_as_candidate(prop.value);
None
} else {
Some(ObjectPatProp::Assign(prop))
}
}
ObjectPatProp::Rest(prop) => {
if prop.arg.is_invalid() {
None
} else {
Some(ObjectPatProp::Rest(prop))
}
}
})
.collect();
if obj.props.is_empty() {
return Pat::Invalid(Invalid { span: DUMMY_SP });
}
}
}
Pat::Rest(rest) => {
if rest.arg.is_invalid() {
return Pat::Invalid(Invalid { span: DUMMY_SP });
}
}
_ => {}
}
}
p
}
fn fold_stmt(&mut self, mut s: Stmt) -> Stmt {
match s {
Stmt::Decl(Decl::Fn(f)) => {
if self.should_remove(f.ident.to_id()) {
self.mark_as_candidate(f.function);
return Stmt::Empty(EmptyStmt { span: DUMMY_SP });
}
s = Stmt::Decl(Decl::Fn(f));
}
_ => {}
}
let s = s.fold_children_with(self);
match s {
Stmt::Decl(Decl::Var(v)) if v.decls.is_empty() => {
return Stmt::Empty(EmptyStmt { span: DUMMY_SP });
}
_ => {}
}
s
}
/// This method make `name` of [VarDeclarator] to [Pat::Invalid] if it
/// should be removed.
fn fold_var_declarator(&mut self, mut d: VarDeclarator) -> VarDeclarator {
let old = self.in_lhs_of_var;
self.in_lhs_of_var = true;
let name = d.name.fold_with(self);
self.in_lhs_of_var = false;
if name.is_invalid() {
d.init = self.mark_as_candidate(d.init);
}
let init = d.init.fold_with(self);
self.in_lhs_of_var = old;
VarDeclarator { name, init, ..d }
}
fn fold_var_declarators(&mut self, mut decls: Vec<VarDeclarator>) -> Vec<VarDeclarator> {
decls = decls.fold_children_with(self);
decls.retain(|d| !d.name.is_invalid());
decls
}
}

View file

@ -29,6 +29,7 @@ DEALINGS IN THE SOFTWARE.
use crate::{
complete_output, get_compiler,
hook_optimizer::hook_optimizer,
next_ssg::next_ssg,
util::{CtxtExt, MapErr},
};
use anyhow::{bail, Error};
@ -172,7 +173,7 @@ fn process_js_custom(
}
};
let config = BuiltConfig {
pass: chain!(hook_optimizer(), config.pass),
pass: chain!(hook_optimizer(), next_ssg(), config.pass),
syntax: config.syntax,
target: config.target,
minify: config.minify,

View file

@ -0,0 +1,48 @@
use self::next_ssg::next_ssg;
use std::path::PathBuf;
use swc_common::{chain, comments::SingleThreadedComments};
use swc_ecma_transforms_testing::{test, test_fixture};
use swc_ecmascript::{
parser::{EsConfig, Syntax},
transforms::react::jsx,
};
use testing::fixture;
#[path = "../src/next_ssg.rs"]
mod next_ssg;
fn syntax() -> Syntax {
Syntax::Es(EsConfig {
jsx: true,
..Default::default()
})
}
#[fixture("tests/fixture/ssg/**/input.js")]
fn next_ssg_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|tr| {
let jsx = jsx::<SingleThreadedComments>(
tr.cm.clone(),
None,
swc_ecmascript::transforms::react::Options {
next: false,
runtime: None,
import_source: "".into(),
pragma: "__jsx".into(),
pragma_frag: "__jsxFrag".into(),
throw_if_namespace: false,
development: false,
use_builtins: true,
use_spread: true,
refresh: Default::default(),
},
);
chain!(next_ssg(), jsx)
},
&input,
&output,
);
}

View file

@ -0,0 +1,15 @@
import fs from 'fs'
import other from 'other'
const [a, b, ...rest] = fs.promises
const [foo, bar] = other
export async function getStaticProps() {
a
b
rest
bar
}
export default function Home() {
return <div />
}

View file

@ -0,0 +1,6 @@
import other from 'other'
const [foo] = other
export var __N_SSG = true
export default function Home() {
return __jsx('div', null)
}

View file

@ -0,0 +1,17 @@
import fs from 'fs'
import other from 'other'
const { readFile, readdir, access: foo } = fs.promises
const { a, b, cat: bar, ...rem } = other
export async function getStaticProps() {
readFile
readdir
foo
b
cat
rem
}
export default function Home() {
return <div />
}

View file

@ -0,0 +1,6 @@
import other from 'other'
const { a, cat: bar } = other
export var __N_SSG = true
export default function Home() {
return __jsx('div', null)
}

View file

@ -0,0 +1,11 @@
function getStaticPaths() {
return []
}
export { getStaticPaths }
export class MyClass {}
export default function Test() {
return <div />
}

View file

@ -0,0 +1,5 @@
export var __N_SSG = true
export class MyClass {}
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,14 @@
function Function1() {
return {
a: function bug(a) {
return 2
},
}
}
function Function2() {
var bug = 1
return { bug }
}
export { getStaticProps } from 'a'

View file

@ -0,0 +1,11 @@
function Function1() {
return {
a: function bug(a) {
return 2
},
}
}
function Function2() {
var bug = 1
return { bug }
}

View file

@ -0,0 +1,9 @@
export function getStaticProps() {
return { props: {} }
}
export function Noop() {}
export default function Test() {
return <div />
}

View file

@ -0,0 +1,5 @@
export var __N_SSG = true
export function Noop() {}
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,12 @@
export const getStaticPaths = () => {
return []
},
foo = 2
export const getStaticProps = function () {
return { props: {} }
}
export default function Test() {
return <div />
}

View file

@ -0,0 +1,5 @@
export var __N_SSG = true
export const foo = 2
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,5 @@
export { getStaticPaths, a as getStaticProps } from '.'
export default function Test() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,5 @@
export { getStaticPaths, a as getStaticProps, foo, bar as baz } from '.'
export default function Test() {
return <div />
}

View file

@ -0,0 +1,5 @@
export var __N_SSG = true
export { foo, bar as baz } from '.'
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,11 @@
export async function getStaticPaths() {
return []
}
export async function getStaticProps() {
return { props: {} }
}
export default function Test() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,11 @@
export function getStaticPaths() {
return []
}
export function getStaticProps() {
return { props: {} }
}
export default function Test() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,11 @@
export const getStaticPaths = async () => {
return []
}
export const getStaticProps = async function () {
return { props: {} }
}
export default function Test() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,11 @@
export const getStaticPaths = () => {
return []
}
export const getStaticProps = function () {
return { props: {} }
}
export default function Test() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,46 @@
import keep_me from 'hello'
import { keep_me2 } from 'hello2'
import * as keep_me3 from 'hello3'
import drop_me from 'bla'
import { drop_me2 } from 'foo'
import { drop_me3, but_not_me } from 'bar'
import * as remove_mua from 'hehe'
var leave_me_alone = 1
function dont_bug_me_either() {}
const inceptionVar = 'hahaa'
var var1 = 1
let var2 = 2
const var3 = inceptionVar + remove_mua
function inception1() {
var2
drop_me2
}
function abc() {}
const b = function () {
var3
drop_me3
}
const b2 = function apples() {}
const bla = () => {
inception1
}
function getStaticProps() {
abc()
drop_me
b
b2
bla()
return { props: { var1 } }
}
export { getStaticProps }
export default function Test() {
return <div />
}

View file

@ -0,0 +1,10 @@
import keep_me from 'hello'
import { keep_me2 } from 'hello2'
import * as keep_me3 from 'hello3'
import { but_not_me } from 'bar'
var leave_me_alone = 1
function dont_bug_me_either() {}
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,9 @@
function getStaticPaths() {
return []
}
export { getStaticPaths }
export default function Test() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,10 @@
const getStaticPaths = () => {
return []
},
a = 2
export { getStaticPaths }
export default function Test() {
return <div />
}

View file

@ -0,0 +1,5 @@
const a = 2
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,9 @@
const getStaticPaths = () => {
return []
}
export { getStaticPaths }
export default function Test() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,6 @@
export { getStaticPaths } from './input'
export { a as getStaticProps } from './input'
export default function Test() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Test() {
return __jsx('div', null)
}

View file

@ -0,0 +1,10 @@
function fn() {
fn = function () {}
return fn.apply(this, arguments)
}
export function getStaticProps() {
fn
}
export default function Home() {
return <div />
}

View file

@ -0,0 +1,4 @@
export var __N_SSG = true
export default function Home() {
return __jsx('div', null)
}

View file

@ -0,0 +1,11 @@
export function getStaticProps() {
return { props: {} }
}
class Test extends React.Component {
render() {
return <div />
}
}
export default Test

View file

@ -0,0 +1,7 @@
class Test extends React.Component {
render() {
return __jsx('div', null)
}
}
export var __N_SSG = true
export default Test

View file

@ -0,0 +1,9 @@
export function getStaticProps() {
return { props: {} }
}
export default class Test extends React.Component {
render() {
return <div />
}
}

View file

@ -0,0 +1,6 @@
export var __N_SSG = true
export default class Test extends React.Component {
render() {
return __jsx('div', null)
}
}

View file

@ -0,0 +1,13 @@
export function getStaticProps() {
return { props: {} }
}
class El extends React.Component {
render() {
return <div />
}
}
const a = 5
export { El as default, a }

View file

@ -0,0 +1,8 @@
class El extends React.Component {
render() {
return __jsx('div', null)
}
}
const a = 5
export var __N_SSG = true
export { El as default, a }

View file

@ -0,0 +1,11 @@
export function getStaticProps() {
return { props: {} }
}
function El() {
return <div />
}
const a = 5
export { El as default, a }

View file

@ -0,0 +1,6 @@
function El() {
return __jsx('div', null)
}
const a = 5
export var __N_SSG = true
export { El as default, a }

View file

@ -0,0 +1 @@
export { getStaticProps, default } from 'a'

View file

@ -0,0 +1,2 @@
export var __N_SSG = true
export { default } from 'a'

View file

@ -0,0 +1,9 @@
export function getStaticProps() {
return { props: {} }
}
function El() {
return <div />
}
export { El as default }

View file

@ -0,0 +1,5 @@
function El() {
return __jsx('div', null)
}
export var __N_SSG = true
export { El as default }

View file

@ -852,7 +852,9 @@ export async function server(task, opts) {
export async function nextbuild(task, opts) {
await task
.source(opts.src || 'build/**/*.+(js|ts|tsx)')
.source(opts.src || 'build/**/*.+(js|ts|tsx)', {
ignore: '**/fixture/**',
})
.swc('server', { dev: opts.dev })
.target('dist/build')
notify('Compiled build files')