Skip to content

Commit

Permalink
add basic webpack loader support (vercel/turborepo#3284)
Browse files Browse the repository at this point in the history
add the minimum to run a simple raw-loader (see test case)

* add `experimental.turbopackWebpackLoaders` to next.config.js
* key is extension like `".mdx"`, value is an array of loaders like
`["mdx-loader"]`
  • Loading branch information
sokra authored Jan 12, 2023
1 parent 2df0f48 commit ccce2d4
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ pub async fn get_client_module_options_context(
postcss_package: Some(get_postcss_package_mapping(project_path)),
..Default::default()
}),
enable_webpack_loaders: next_config.webpack_loaders_options().await?.clone_if(),
enable_typescript_transform: true,
rules: vec![(
foreign_code_context_condition(next_config).await?,
Expand Down
26 changes: 24 additions & 2 deletions packages/next-swc/crates/next-core/src/next_config.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
use std::collections::HashMap;

use anyhow::Result;
use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use turbo_tasks::{
primitives::{BoolVc, StringsVc},
trace::TraceRawVcs,
Value,
};
use turbopack::evaluate_context::node_evaluate_asset_context;
use turbopack::{
evaluate_context::node_evaluate_asset_context,
module_options::{WebpackLoadersOptions, WebpackLoadersOptionsVc},
};
use turbopack_core::{
asset::Asset,
reference_type::{EntryReferenceSubType, ReferenceType},
Expand Down Expand Up @@ -127,11 +131,12 @@ pub enum RemotePatternProtocal {
Https,
}

#[derive(Clone, Debug, Ord, PartialOrd, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs)]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs)]
#[serde(rename_all = "camelCase")]
pub struct ExperimentalConfig {
pub server_components_external_packages: Option<Vec<String>>,
pub app_dir: Option<bool>,
pub turbopack_webpack_loaders: Option<IndexMap<String, Vec<String>>>,
}

#[derive(Clone, Debug, Ord, PartialOrd, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs)]
Expand Down Expand Up @@ -209,6 +214,23 @@ impl NextConfigVc {
self.await?.transpile_packages.clone().unwrap_or_default(),
))
}

#[turbo_tasks::function]
pub async fn webpack_loaders_options(self) -> Result<WebpackLoadersOptionsVc> {
let this = self.await?;
let Some(turbopack_webpack_loaders) = this.experimental.as_ref().and_then(|experimental| experimental.turbopack_webpack_loaders.as_ref()) else {
return Ok(WebpackLoadersOptionsVc::cell(WebpackLoadersOptions::default()));
};
let mut extension_to_loaders = IndexMap::new();
for (ext, loaders) in turbopack_webpack_loaders {
extension_to_loaders.insert(ext.clone(), StringsVc::cell(loaders.clone()));
}
Ok(WebpackLoadersOptions {
extension_to_loaders,
..Default::default()
}
.cell())
}
}

fn next_configs() -> StringsVc {
Expand Down
3 changes: 3 additions & 0 deletions packages/next-swc/crates/next-core/src/next_server/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ pub async fn get_server_module_options_context(
postcss_package: Some(get_postcss_package_mapping(project_path)),
..Default::default()
}),
enable_webpack_loaders: next_config.webpack_loaders_options().await?.clone_if(),
enable_typescript_transform: true,
rules: vec![(
foreign_code_context_condition(next_config).await?,
Expand All @@ -138,6 +139,7 @@ pub async fn get_server_module_options_context(
postcss_package: Some(get_postcss_package_mapping(project_path)),
..Default::default()
}),
enable_webpack_loaders: next_config.webpack_loaders_options().await?.clone_if(),
enable_typescript_transform: true,
rules: vec![(
foreign_code_context_condition(next_config).await?,
Expand All @@ -160,6 +162,7 @@ pub async fn get_server_module_options_context(
postcss_package: Some(get_postcss_package_mapping(project_path)),
..Default::default()
}),
enable_webpack_loaders: next_config.webpack_loaders_options().await?.clone_if(),
enable_typescript_transform: true,
rules: vec![(
foreign_code_context_condition(next_config).await?,
Expand Down
4 changes: 2 additions & 2 deletions packages/next-swc/crates/next-dev/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ use turbopack_core::{
environment::ServerAddr,
issue::IssueSeverity,
resolve::{parse::RequestVc, pattern::QueryMapVc},
server_fs::ServerFileSystemVc,
};
use turbopack_dev_server::{
fs::DevServerFileSystemVc,
introspect::IntrospectionSource,
source::{
combined::CombinedContentSourceVc, router::RouterContentSource,
Expand Down Expand Up @@ -279,7 +279,7 @@ async fn source(
let output_root = output_fs.root().join(".next/server");
let server_addr = ServerAddr::new(*server_addr).cell();

let dev_server_fs = DevServerFileSystemVc::new().as_file_system();
let dev_server_fs = ServerFileSystemVc::new().as_file_system();
let dev_server_root = dev_server_fs.root();
let entry_requests = entry_requests
.iter()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello World
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import source from "./hello.raw";

it("runs a simple loader", () => {
expect(source).toBe("Hello World");
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module.exports = {
experimental: {
turbopackWebpackLoaders: {
".raw": ["raw-loader"],
},
},
};

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion packages/next-swc/crates/next-dev/tests/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
"devDependencies": {
"@turbo/pack-test-harness": "*",
"autoprefixer": "^10.4.13",
"loader-runner": "^4.3.0",
"next": "13.0.8-canary.2",
"postcss": "^8.4.20",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-test-renderer": "^18.2.0",
"react": "^18.2.0",
"styled-jsx": "^5.1.0",
"tailwindcss": "^3.2.4"
}
Expand Down

0 comments on commit ccce2d4

Please sign in to comment.