Skip to content

Commit

Permalink
Make ship happen (#41776)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
5 people committed Oct 25, 2022
1 parent a090b5c commit b69dcb5
Show file tree
Hide file tree
Showing 48 changed files with 881 additions and 120 deletions.
@@ -1,5 +1,5 @@
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Abel","arguments":[]}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[]}';
import React from 'react';
export { firaCode };
export { inter };
@@ -1,4 +1,4 @@
import inter1 from '@next/font/google/target.css?{"arguments":[{"variant":"400"}],"import":"Inter","path":"pages/test.tsx"}';
import inter2 from '@next/font/google/target.css?{"arguments":[{"variant":"400"}],"import":"Inter","path":"pages/test.tsx"}';
import inter1 from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"400"}]}';
import inter2 from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"400"}]}';
var i = 10;
var i2 = 20;
@@ -1,7 +1,7 @@
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
import a from '@next/font/google/target.css?{"arguments":[{}],"import":"ABeeZee","path":"pages/test.tsx"}';
import a from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"ABeeZee","arguments":[{}]}';
import a from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"ABeeZee","arguments":[{}]}';
import a from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"ABeeZee","arguments":[{}]}';
import a from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"ABeeZee","arguments":[{}]}';
const a = fn({
10: 'hello'
});
Expand Down
@@ -1,2 +1,2 @@
import inter from '@next/font/google/target.css?{"arguments":[{},[]],"import":"Inter","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{},[]]}';
const a = fn(...{}, ...[]);
@@ -1 +1 @@
import font from 'cool-fonts/target.css?{"arguments":[{"prop":true}],"import":"","path":"pages/test.tsx"}';
import font from 'cool-fonts/target.css?{"path":"pages/test.tsx","import":"","arguments":[{"prop":true}]}';
@@ -1,5 +1,5 @@
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Abel","arguments":[]}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[]}';
import React from 'react';
export { firaCode };
export { inter };
@@ -1,5 +1,5 @@
import firaCode from '@next/font/google/target.css?{"arguments":[],"import":"Abel","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[],"import":"Inter","path":"pages/test.tsx"}';
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Abel","arguments":[]}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[]}';
import React from 'react';
export { firaCode };
export default inter;
@@ -1,3 +1,3 @@
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"}';
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":{}}}]}';
import React from 'react';
console.log(firaCode);
@@ -1,2 +1,2 @@
import acme1 from 'cool-fonts/target.css?{"arguments":[{"variant":"400"}],"import":"Acme","path":"pages/test.tsx"}';
import acme1 from 'cool-fonts/target.css?{"path":"pages/test.tsx","import":"Acme","arguments":[{"variant":"400"}]}';
import React from 'react';
@@ -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"}';
import geo from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Geo","arguments":["test",[1.0],{"a":2.0},3.0]}';
@@ -1,3 +1,3 @@
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900","display":"swap"}]}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900","display":"swap"}]}';
import React from 'react';
@@ -1,3 +1,3 @@
import inter from '@next/font/google/target.css?{"arguments":[{"variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import fira from 'cool-fonts/target.css?{"arguments":[{"display":"swap","variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900"}]}';
import fira from 'cool-fonts/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[{"variant":"400","display":"swap"}]}';
import React from 'react';
@@ -1,3 +1,3 @@
import firaCode from '@next/font/google/target.css?{"arguments":[{"fallback":["system-ui"],"variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import firaCode from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[{"variant":"400","fallback":["system-ui"]}]}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900","display":"swap"}]}';
import React from 'react';
@@ -1,3 +1,3 @@
import inter from '@next/font/google/target.css?{"arguments":[{"variant":"900"}],"import":"Inter","path":"pages/test.tsx"}';
import fira from '@next/font/google/target.css?{"arguments":[{"display":"swap","variant":"400"}],"import":"Fira_Code","path":"pages/test.tsx"}';
import inter from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Inter","arguments":[{"variant":"900"}]}';
import fira from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[{"variant":"400","display":"swap"}]}';
import React from 'react';
@@ -1 +1 @@
import fira from '@next/font/google/target.css?{"arguments":[],"import":"Fira_Code","path":"pages/test.tsx"}';
import fira from '@next/font/google/target.css?{"path":"pages/test.tsx","import":"Fira_Code","arguments":[]}';
10 changes: 9 additions & 1 deletion packages/next-swc/crates/napi/Cargo.toml
Expand Up @@ -24,7 +24,7 @@ sentry_rustls = ["_sentry_rustls"]
anyhow = "1.0"
backtrace = "0.3"
fxhash = "0.2.1"
napi = {version = "2", default-features = false, features = ["napi3", "serde-json"]}
napi = { version = "2", default-features = false, features = ["napi3", "serde-json", "tokio_rt", "error_anyhow"] }
napi-derive = "2"
next-swc = {version = "0.0.0", path = "../core"}
once_cell = "1.13.0"
Expand Down Expand Up @@ -55,6 +55,13 @@ tracing = { version = "0.1.32", features = ["release_max_level_info"] }
tracing-futures = "0.2.5"
tracing-subscriber = "0.3.9"
tracing-chrome = "0.5.0"
owo-colors = "3"
turbo-tasks = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
turbo-tasks-memory = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
turbopack-core = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
turbopack-dev-server = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
next-dev = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb" }
node-file-trace = { git = "https://github.com/vercel/turbo.git", rev = "56039940cdfac07b68e030da1396214962e99ceb", default-features = false, features = ["node-api"] }
# There are few build targets we can't use native-tls which default features rely on,
# allow to specify alternative (rustls) instead via features.
# Note to opt in rustls default-features should be disabled
Expand All @@ -67,6 +74,7 @@ _sentry_rustls = { package = "sentry", version = "0.27.0", default-features = fa
"rustls",
"reqwest"
], optional = true }
indexmap = "=1.6.2"

[build-dependencies]
napi-build = "2"
Expand Down
3 changes: 3 additions & 0 deletions packages/next-swc/crates/napi/src/lib.rs
Expand Up @@ -26,6 +26,7 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/

#![feature(future_join)]
#![recursion_limit = "2048"]
//#![deny(clippy::all)]

Expand All @@ -47,6 +48,8 @@ use swc_core::{
pub mod minify;
pub mod parse;
pub mod transform;
pub mod turbo_tracing;
pub mod turbopack;
pub mod util;

static COMPILER: Lazy<Arc<Compiler>> = Lazy::new(|| {
Expand Down
11 changes: 11 additions & 0 deletions packages/next-swc/crates/napi/src/turbo_tracing.rs
@@ -0,0 +1,11 @@
use std::sync::Arc;

use napi::bindgen_prelude::*;
use node_file_trace::{start, Args};

#[napi]
pub async fn run_turbo_tracing(options: Buffer) -> napi::Result<Vec<String>> {
let args: Args = serde_json::from_slice(options.as_ref())?;
let files = start(Arc::new(args)).await?;
Ok(files)
}
157 changes: 157 additions & 0 deletions packages/next-swc/crates/napi/src/turbopack.rs
@@ -0,0 +1,157 @@
use std::{
future::join,
net::{IpAddr, Ipv4Addr},
path::PathBuf,
time::{Duration, Instant},
};

use crate::util::MapErr;
use napi::bindgen_prelude::*;
use next_dev::{register, NextDevServerBuilder};
use owo_colors::OwoColorize;
use serde::Deserialize;
use turbo_tasks::{util::FormatDuration, TurboTasks};
use turbo_tasks_memory::MemoryBackend;
use turbopack_core::issue::IssueSeverity;

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
#[allow(unused)]
struct TurboDevServerOptions {
#[serde(default = "default_port")]
port: u16,

#[serde(default = "default_host")]
hostname: IpAddr,

#[serde(default)]
eager_compile: bool,

#[serde(default)]
log_level: Option<IssueSeverity>,

#[serde(default)]
show_all: bool,

#[serde(default)]
log_detail: bool,

#[serde(default = "default_dir")]
dir: PathBuf,

#[serde(default = "default_dir")]
root_dir: PathBuf,

#[serde(default)]
allow_retry: bool,

#[serde(default)]
dev: bool,

#[serde(default)]
is_next_dev_command: bool,

#[serde(default)]
server_components_external_packages: Vec<String>,
}

fn default_port() -> u16 {
3000
}

fn default_host() -> IpAddr {
IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))
}

fn default_dir() -> PathBuf {
std::env::current_dir().expect("Current dir should be accessible")
}

async fn start_server(options: TurboDevServerOptions) -> napi::Result<()> {
let start = Instant::now();

register();

let tt = TurboTasks::new(MemoryBackend::new());
let tt_clone = tt.clone();

let dir = options
.dir
.canonicalize()
.expect("Cannot canonicalize project directory")
.to_str()
.expect("project directory contains invalid characters")
.to_string();

let root_dir = options
.root_dir
.canonicalize()
.expect("Cannot canonicalize project directory")
.to_str()
.expect("project directory contains invalid characters")
.to_string();

//server_component_external

let mut server = NextDevServerBuilder::new(tt, dir, root_dir)
.entry_request("src/index".into())
.eager_compile(options.eager_compile)
.hostname(options.hostname)
.port(options.port)
.log_detail(options.log_detail)
.show_all(options.show_all)
.log_level(
options
.log_level
.map_or_else(|| IssueSeverity::Warning, |l| l),
);

for package in options.server_components_external_packages {
server = server.server_component_external(package);
}

let server = server.build().await.convert_err()?;

let index_uri = if server.addr.ip().is_loopback() || server.addr.ip().is_unspecified() {
format!("http://localhost:{}", server.addr.port())
} else {
format!("http://{}", server.addr)
};
println!(
"{} - started server on {}:{}, url: {}",
"ready".green(),
server.addr.ip(),
server.addr.port(),
index_uri
);

let stats_future = async move {
println!(
"{event_type} - initial compilation {start}",
event_type = "event".purple(),
start = FormatDuration(start.elapsed()),
);

loop {
let (elapsed, _count) = tt_clone
.get_or_wait_update_info(Duration::from_millis(100))
.await;
println!(
"{event_type} - updated in {elapsed}",
event_type = "event".purple(),
elapsed = FormatDuration(elapsed),
);
}
};

join!(stats_future, async { server.future.await.unwrap() }).await;

Ok(())
}

#[napi]
pub async fn start_turbo_dev(options: Buffer) -> napi::Result<()> {
let options: TurboDevServerOptions = serde_json::from_slice(&options)?;

start_server(options).await
}

0 comments on commit b69dcb5

Please sign in to comment.