Skip to content

Commit b69dcb5

Browse files
sokrakwonojBrooooooklynijjkjaredpalmer
authored
Make ship happen (#41776)
The Snozzberries taste like Snozzberries...! Co-authored-by: OJ Kwon <kwon.ohjoong@gmail.com> Co-authored-by: LongYinan <lynweklm@gmail.com> Co-authored-by: JJ Kasper <jj@jjsweb.site> Co-authored-by: Jared Palmer <jared@jaredpalmer.com>
1 parent a090b5c commit b69dcb5

File tree

48 files changed

+881
-120
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+881
-120
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
2-
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
1+
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Abel","arguments":[]}';
2+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[]}';
33
import React from 'react';
44
export { firaCode };
55
export { inter };
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import inter1 from '@next/font/google/target.css?{"arguments":[{"variant":"400"}],"import":"Inter","path":"pages/test.tsx"}';
2-
import inter2 from '@next/font/google/target.css?{"arguments":[{"variant":"400"}],"import":"Inter","path":"pages/test.tsx"}';
1+
import inter1 from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"400"}]}';
2+
import inter2 from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"400"}]}';
33
var i = 10;
44
var i2 = 20;

packages/next-swc/crates/core/tests/errors/next-font-loaders/options-object/output.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
2-
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
3-
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
4-
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
1+
import a from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"ABeeZee","arguments":[{}]}';
2+
import a from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"ABeeZee","arguments":[{}]}';
3+
import a from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"ABeeZee","arguments":[{}]}';
4+
import a from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"ABeeZee","arguments":[{}]}';
55
const a = fn({
66
10: 'hello'
77
});
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
import inter from '@next/font/google/target.css?{"arguments":[{},[]],"import":"Inter","path":"pages/test.tsx"}';
1+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{},[]]}';
22
const a = fn(...{}, ...[]);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
import font from 'cool-fonts/target.css?{"arguments":[{"prop":true}],"import":"","path":"pages/test.tsx"}';
1+
import font from 'cool-fonts/target.css?{"path":"pages/test.tsx","import":"","arguments":[{"prop":true}]}';
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
2-
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
1+
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Abel","arguments":[]}';
2+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[]}';
33
import React from 'react';
44
export { firaCode };
55
export { inter };
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
2-
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
1+
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Abel","arguments":[]}';
2+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[]}';
33
import React from 'react';
44
export { firaCode };
55
export default inter;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import firaCode from '@next/font/google/target.css?{"arguments":[{"fallback":["system-ui",{"key":false},[]],"key":{"key2":{}},"preload":true,"variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
1+
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[{"variant":"400","fallback":["system-ui",{"key":false},[]],"preload":true,"key":{"key2":{}}}]}';
22
import React from 'react';
33
console.log(firaCode);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
import acme1 from 'cool-fonts/target.css?{"arguments":[{"variant":"400"}],"import":"Acme","path":"pages/test.tsx"}';
1+
import acme1 from 'cool-fonts/target.css?{"path":"pages/test.tsx","import":"Acme","arguments":[{"variant":"400"}]}';
22
import React from 'react';
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
import geo from '@next/font/google/target.css?{"arguments":["test",[1.0],{"a":2.0},3.0],"import":"Geo","path":"pages/test.tsx"}';
1+
import geo from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Geo","arguments":["test",[1.0],{"a":2.0},3.0]}';
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
2-
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
1+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900","display":"swap"}]}';
2+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900","display":"swap"}]}';
33
import React from 'react';
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import inter from '@next/font/google/target.css?{"arguments":[{"variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
2-
import fira from 'cool-fonts/target.css?{"arguments":[{"display":"swap","variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
1+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900"}]}';
2+
import fira from 'cool-fonts/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[{"variant":"400","display":"swap"}]}';
33
import React from 'react';
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import firaCode from '@next/font/google/target.css?{"arguments":[{"fallback":["system-ui"],"variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
2-
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
1+
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[{"variant":"400","fallback":["system-ui"]}]}';
2+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900","display":"swap"}]}';
33
import React from 'react';
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import inter from '@next/font/google/target.css?{"arguments":[{"variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
2-
import fira from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
1+
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900"}]}';
2+
import fira from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[{"variant":"400","display":"swap"}]}';
33
import React from 'react';
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
import fira from '@next/font/google/target.css?{"arguments":[],"import":"Fira_Code","path":"pages/test.tsx"}';
1+
import fira from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[]}';

packages/next-swc/crates/napi/Cargo.toml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ sentry_rustls = ["_sentry_rustls"]
2424
anyhow = "1.0"
2525
backtrace = "0.3"
2626
fxhash = "0.2.1"
27-
napi = {version = "2", default-features = false, features = ["napi3", "serde-json"]}
27+
napi = { version = "2", default-features = false, features = ["napi3", "serde-json", "tokio_rt", "error_anyhow"] }
2828
napi-derive = "2"
2929
next-swc = {version = "0.0.0", path = "../core"}
3030
once_cell = "1.13.0"
@@ -55,6 +55,13 @@ tracing = { version = "0.1.32", features = ["release_max_level_info"] }
5555
tracing-futures = "0.2.5"
5656
tracing-subscriber = "0.3.9"
5757
tracing-chrome = "0.5.0"
58+
owo-colors = "3"
59+
turbo-tasks = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
60+
turbo-tasks-memory = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
61+
turbopack-core = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
62+
turbopack-dev-server = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
63+
next-dev = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
64+
node-file-trace = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb", default-features = false, features = ["node-api"] }
5865
# There are few build targets we can't use native-tls which default features rely on,
5966
# allow to specify alternative (rustls) instead via features.
6067
# Note to opt in rustls default-features should be disabled
@@ -67,6 +74,7 @@ _sentry_rustls = { package = "sentry", version = "0.27.0", default-features = fa
6774
"rustls",
6875
"reqwest"
6976
], optional = true }
77+
indexmap = "=1.6.2"
7078

7179
[build-dependencies]
7280
napi-build = "2"

packages/next-swc/crates/napi/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2626
DEALINGS IN THE SOFTWARE.
2727
*/
2828

29+
#![feature(future_join)]
2930
#![recursion_limit = "2048"]
3031
//#![deny(clippy::all)]
3132

@@ -47,6 +48,8 @@ use swc_core::{
4748
pub mod minify;
4849
pub mod parse;
4950
pub mod transform;
51+
pub mod turbo_tracing;
52+
pub mod turbopack;
5053
pub mod util;
5154

5255
static COMPILER: Lazy<Arc<Compiler>> = Lazy::new(|| {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use std::sync::Arc;
2+
3+
use napi::bindgen_prelude::*;
4+
use node_file_trace::{start, Args};
5+
6+
#[napi]
7+
pub async fn run_turbo_tracing(options: Buffer) -> napi::Result<Vec<String>> {
8+
let args: Args = serde_json::from_slice(options.as_ref())?;
9+
let files = start(Arc::new(args)).await?;
10+
Ok(files)
11+
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
use std::{
2+
future::join,
3+
net::{IpAddr, Ipv4Addr},
4+
path::PathBuf,
5+
time::{Duration, Instant},
6+
};
7+
8+
use crate::util::MapErr;
9+
use napi::bindgen_prelude::*;
10+
use next_dev::{register, NextDevServerBuilder};
11+
use owo_colors::OwoColorize;
12+
use serde::Deserialize;
13+
use turbo_tasks::{util::FormatDuration, TurboTasks};
14+
use turbo_tasks_memory::MemoryBackend;
15+
use turbopack_core::issue::IssueSeverity;
16+
17+
#[derive(Clone, Debug, Deserialize)]
18+
#[serde(rename_all = "camelCase")]
19+
#[allow(unused)]
20+
struct TurboDevServerOptions {
21+
#[serde(default = "default_port")]
22+
port: u16,
23+
24+
#[serde(default = "default_host")]
25+
hostname: IpAddr,
26+
27+
#[serde(default)]
28+
eager_compile: bool,
29+
30+
#[serde(default)]
31+
log_level: Option<IssueSeverity>,
32+
33+
#[serde(default)]
34+
show_all: bool,
35+
36+
#[serde(default)]
37+
log_detail: bool,
38+
39+
#[serde(default = "default_dir")]
40+
dir: PathBuf,
41+
42+
#[serde(default = "default_dir")]
43+
root_dir: PathBuf,
44+
45+
#[serde(default)]
46+
allow_retry: bool,
47+
48+
#[serde(default)]
49+
dev: bool,
50+
51+
#[serde(default)]
52+
is_next_dev_command: bool,
53+
54+
#[serde(default)]
55+
server_components_external_packages: Vec<String>,
56+
}
57+
58+
fn default_port() -> u16 {
59+
3000
60+
}
61+
62+
fn default_host() -> IpAddr {
63+
IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))
64+
}
65+
66+
fn default_dir() -> PathBuf {
67+
std::env::current_dir().expect("Current dir should be accessible")
68+
}
69+
70+
async fn start_server(options: TurboDevServerOptions) -> napi::Result<()> {
71+
let start = Instant::now();
72+
73+
register();
74+
75+
let tt = TurboTasks::new(MemoryBackend::new());
76+
let tt_clone = tt.clone();
77+
78+
let dir = options
79+
.dir
80+
.canonicalize()
81+
.expect("Cannot canonicalize project directory")
82+
.to_str()
83+
.expect("project directory contains invalid characters")
84+
.to_string();
85+
86+
let root_dir = options
87+
.root_dir
88+
.canonicalize()
89+
.expect("Cannot canonicalize project directory")
90+
.to_str()
91+
.expect("project directory contains invalid characters")
92+
.to_string();
93+
94+
//server_component_external
95+
96+
let mut server = NextDevServerBuilder::new(tt, dir, root_dir)
97+
.entry_request("src/index".into())
98+
.eager_compile(options.eager_compile)
99+
.hostname(options.hostname)
100+
.port(options.port)
101+
.log_detail(options.log_detail)
102+
.show_all(options.show_all)
103+
.log_level(
104+
options
105+
.log_level
106+
.map_or_else(|| IssueSeverity::Warning, |l| l),
107+
);
108+
109+
for package in options.server_components_external_packages {
110+
server = server.server_component_external(package);
111+
}
112+
113+
let server = server.build().await.convert_err()?;
114+
115+
let index_uri = if server.addr.ip().is_loopback() || server.addr.ip().is_unspecified() {
116+
format!("http://localhost:{}", server.addr.port())
117+
} else {
118+
format!("http://{}", server.addr)
119+
};
120+
println!(
121+
"{} - started server on {}:{}, url: {}",
122+
"ready".green(),
123+
server.addr.ip(),
124+
server.addr.port(),
125+
index_uri
126+
);
127+
128+
let stats_future = async move {
129+
println!(
130+
"{event_type} - initial compilation {start}",
131+
event_type = "event".purple(),
132+
start = FormatDuration(start.elapsed()),
133+
);
134+
135+
loop {
136+
let (elapsed, _count) = tt_clone
137+
.get_or_wait_update_info(Duration::from_millis(100))
138+
.await;
139+
println!(
140+
"{event_type} - updated in {elapsed}",
141+
event_type = "event".purple(),
142+
elapsed = FormatDuration(elapsed),
143+
);
144+
}
145+
};
146+
147+
join!(stats_future, async { server.future.await.unwrap() }).await;
148+
149+
Ok(())
150+
}
151+
152+
#[napi]
153+
pub async fn start_turbo_dev(options: Buffer) -> napi::Result<()> {
154+
let options: TurboDevServerOptions = serde_json::from_slice(&options)?;
155+
156+
start_server(options).await
157+
}

0 commit comments

Comments
 (0)