From d57f15d0112ffbaa4887611672f96916edab196f Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:21:37 +0200 Subject: [PATCH] Use base64 for binary results from Webpack loaders --- Cargo.lock | 1 + turbopack/crates/turbopack-node/Cargo.toml | 1 + .../js/src/transforms/webpack-loaders.ts | 2 +- .../turbopack-node/src/transforms/webpack.rs | 17 ++++++++++++++--- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 88c0ec010bd30..8e148c7125081 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9091,6 +9091,7 @@ dependencies = [ "regex", "serde", "serde_json", + "serde_with", "tokio", "tracing", "turbo-tasks", diff --git a/turbopack/crates/turbopack-node/Cargo.toml b/turbopack/crates/turbopack-node/Cargo.toml index 9d06c0d3fc288..0b7ea08e374a3 100644 --- a/turbopack/crates/turbopack-node/Cargo.toml +++ b/turbopack/crates/turbopack-node/Cargo.toml @@ -34,6 +34,7 @@ regex = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } #serde_qs = { workspace = true } +serde_with = { workspace = true, features = ["base64"] } tokio = { workspace = true, features = ["full"] } tracing = { workspace = true } turbo-tasks = { workspace = true } diff --git a/turbopack/crates/turbopack-node/js/src/transforms/webpack-loaders.ts b/turbopack/crates/turbopack-node/js/src/transforms/webpack-loaders.ts index 049af6d7b4392..d598627cb099c 100644 --- a/turbopack/crates/turbopack-node/js/src/transforms/webpack-loaders.ts +++ b/turbopack/crates/turbopack-node/js/src/transforms/webpack-loaders.ts @@ -468,7 +468,7 @@ const transform = ( if (!result.result) return reject(new Error("No result from loaders")); const [source, map] = result.result; resolve({ - source: Buffer.isBuffer(source) ? [...source] : source, + source: Buffer.isBuffer(source) ? {binary: source.toString('base64')} : source, map: typeof map === "string" ? map diff --git a/turbopack/crates/turbopack-node/src/transforms/webpack.rs b/turbopack/crates/turbopack-node/src/transforms/webpack.rs index c4bd8596c1ea9..c486cdaec5800 100644 --- a/turbopack/crates/turbopack-node/src/transforms/webpack.rs +++ b/turbopack/crates/turbopack-node/src/transforms/webpack.rs @@ -5,6 +5,7 @@ use async_trait::async_trait; use either::Either; use serde::{Deserialize, Serialize}; use serde_json::{json, Value as JsonValue}; +use serde_with::serde_as; use turbo_tasks::{ trace::TraceRawVcs, Completion, RcStr, TaskInput, TryJoinIterExt, Value, ValueToString, Vc, }; @@ -53,13 +54,20 @@ use crate::{ AssetsForSourceMapping, }; +#[serde_as] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +struct BytesBase64 { + #[serde_as(as = "serde_with::base64::Base64")] + binary: Vec, +} + #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] #[turbo_tasks::value(serialization = "custom")] struct WebpackLoadersProcessingResult { #[serde(with = "either::serde_untagged")] - #[turbo_tasks(trace_ignore)] - source: Either>, + #[turbo_tasks(debug_ignore, trace_ignore)] + source: Either, map: Option, #[turbo_tasks(trace_ignore)] assets: Option>, @@ -253,7 +261,10 @@ impl WebpackLoadersProcessedAsset { } else { None }; - let file = either::for_both!(processed.source, source => File::from(source)); + let file = match processed.source { + Either::Left(str) => File::from(str), + Either::Right(bytes) => File::from(bytes.binary), + }; let assets = emitted_assets_to_virtual_sources(processed.assets); let content = AssetContent::File(FileContent::Content(file).cell()).cell(); Ok(ProcessWebpackLoadersResult {