Skip to content

Commit 112e70e

Browse files
authored
Turbopack: remove OptionStringifiedSourceMap (#86547)
- `OptionStringifiedSourceMap` was always a strange type - We can now use the `FileContent` to not clone the Rope in the `SourceMapAsset::content`, which would end up duplicating sourcemaps in the cache.
1 parent 1754f90 commit 112e70e

File tree

30 files changed

+172
-149
lines changed

30 files changed

+172
-149
lines changed

crates/napi/src/next_api/project.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ use turbopack_core::{
5151
error::PrettyPrintError,
5252
issue::PlainIssue,
5353
output::{OutputAsset, OutputAssets},
54-
source_map::{OptionStringifiedSourceMap, SourceMap, Token},
54+
source_map::{SourceMap, Token},
5555
version::{PartialUpdate, TotalUpdate, Update, VersionState},
5656
};
5757
use turbopack_ecmascript_hmr_protocol::{ClientUpdateInstruction, Issue, ResourceIdentifier};
@@ -1550,7 +1550,7 @@ pub struct OptionStackFrame(Option<StackFrame>);
15501550
pub async fn get_source_map_rope(
15511551
container: Vc<ProjectContainer>,
15521552
source_url: RcStr,
1553-
) -> Result<Vc<OptionStringifiedSourceMap>> {
1553+
) -> Result<Vc<FileContent>> {
15541554
let (file_path_sys, module) = match Url::parse(&source_url) {
15551555
Ok(url) => match url.scheme() {
15561556
"file" => {
@@ -1579,7 +1579,7 @@ pub async fn get_source_map_rope(
15791579
Some(relative_path) => sys_to_unix(relative_path),
15801580
None => {
15811581
// File doesn't exist within the dist dir
1582-
return Ok(OptionStringifiedSourceMap::none());
1582+
return Ok(FileContent::NotFound.cell());
15831583
}
15841584
};
15851585

@@ -1597,13 +1597,13 @@ pub async fn get_source_map_rope(
15971597

15981598
let mut map = container.get_source_map(server_path, module.clone());
15991599

1600-
if map.await?.is_none() {
1600+
if !map.await?.is_content() {
16011601
// If the chunk doesn't exist as a server chunk, try a client chunk.
16021602
// TODO: Properly tag all server chunks and use the `isServer` query param.
16031603
// Currently, this is inaccurate as it does not cover RSC server
16041604
// chunks.
16051605
map = container.get_source_map(client_path, module);
1606-
if map.await?.is_none() {
1606+
if !map.await?.is_content() {
16071607
bail!("chunk/module '{}' is missing a sourcemap", source_url);
16081608
}
16091609
}
@@ -1615,7 +1615,7 @@ pub async fn get_source_map_rope(
16151615
pub fn get_source_map_rope_operation(
16161616
container: ResolvedVc<ProjectContainer>,
16171617
file_path: RcStr,
1618-
) -> Vc<OptionStringifiedSourceMap> {
1618+
) -> Vc<FileContent> {
16191619
get_source_map_rope(*container, file_path)
16201620
}
16211621

@@ -1782,13 +1782,13 @@ pub async fn project_get_source_map(
17821782
let ctx = &project.turbopack_ctx;
17831783
ctx.turbo_tasks()
17841784
.run(async move {
1785-
let Some(map) = &*get_source_map_rope_operation(container, file_path)
1785+
let source_map = get_source_map_rope_operation(container, file_path)
17861786
.read_strongly_consistent()
1787-
.await?
1788-
else {
1787+
.await?;
1788+
let Some(map) = source_map.as_content() else {
17891789
return Ok(None);
17901790
};
1791-
Ok(Some(map.to_str()?.to_string()))
1791+
Ok(Some(map.content().to_str()?.to_string()))
17921792
})
17931793
// HACK: Don't use `TurbopackInternalError`, this function is race-condition prone (the
17941794
// source files may have changed or been deleted), so these probably aren't internal errors?

crates/next-api/src/project.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ use turbo_tasks::{
3333
debug::ValueDebugFormat, fxindexmap, mark_root, trace::TraceRawVcs,
3434
};
3535
use turbo_tasks_env::{EnvMap, ProcessEnv};
36-
use turbo_tasks_fs::{DiskFileSystem, FileSystem, FileSystemPath, VirtualFileSystem, invalidation};
36+
use turbo_tasks_fs::{
37+
DiskFileSystem, FileContent, FileSystem, FileSystemPath, VirtualFileSystem, invalidation,
38+
};
3739
use turbo_unix_path::{join_path, unix_to_sys};
3840
use turbopack::{
3941
ModuleAssetContext, evaluate_context::node_build_environment,
@@ -70,7 +72,6 @@ use turbopack_core::{
7072
},
7173
reference::all_assets_from_entries,
7274
resolve::{FindContextFileResult, find_context_file},
73-
source_map::OptionStringifiedSourceMap,
7475
version::{
7576
NotFoundVersion, OptionVersionedContent, Update, Version, VersionState, VersionedContent,
7677
},
@@ -552,17 +553,17 @@ impl ProjectContainer {
552553
}
553554

554555
/// Gets a source map for a particular `file_path`. If `dev` mode is disabled, this will always
555-
/// return [`OptionStringifiedSourceMap::none`].
556+
/// return [`FileContent::NotFound`].
556557
#[turbo_tasks::function]
557558
pub fn get_source_map(
558559
&self,
559560
file_path: FileSystemPath,
560561
section: Option<RcStr>,
561-
) -> Vc<OptionStringifiedSourceMap> {
562+
) -> Vc<FileContent> {
562563
if let Some(map) = self.versioned_content_map {
563564
map.get_source_map(file_path, section)
564565
} else {
565-
OptionStringifiedSourceMap::none()
566+
FileContent::NotFound.cell()
566567
}
567568
}
568569
}

crates/next-api/src/versioned_content_map.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ use turbo_tasks::{
77
FxIndexSet, NonLocalValue, OperationValue, OperationVc, ResolvedVc, State, TryFlatJoinIterExt,
88
TryJoinIterExt, ValueDefault, Vc, debug::ValueDebugFormat, trace::TraceRawVcs,
99
};
10-
use turbo_tasks_fs::FileSystemPath;
10+
use turbo_tasks_fs::{FileContent, FileSystemPath};
1111
use turbopack_core::{
1212
asset::Asset,
1313
output::{ExpandedOutputAssets, OptionOutputAsset, OutputAsset},
14-
source_map::{GenerateSourceMap, OptionStringifiedSourceMap},
14+
source_map::GenerateSourceMap,
1515
version::OptionVersionedContent,
1616
};
1717

@@ -180,9 +180,9 @@ impl VersionedContentMap {
180180
self: Vc<Self>,
181181
path: FileSystemPath,
182182
section: Option<RcStr>,
183-
) -> Result<Vc<OptionStringifiedSourceMap>> {
183+
) -> Result<Vc<FileContent>> {
184184
let Some(asset) = &*self.get_asset(path.clone()).await? else {
185-
return Ok(Vc::cell(None));
185+
return Ok(FileContent::NotFound.cell());
186186
};
187187

188188
if let Some(generate_source_map) =

crates/next-core/src/raw_ecmascript_module.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,8 @@ impl EcmascriptChunkItem for RawEcmascriptChunkItem {
272272
)
273273
.await?
274274
{
275-
source_map.generate_source_map().owned().await?
275+
let source_map = source_map.generate_source_map().await?;
276+
source_map.as_content().map(|f| f.content().clone())
276277
} else {
277278
None
278279
};

turbopack/crates/turbo-tasks-fs/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,6 +1766,7 @@ impl From<File> for FileContent {
17661766
}
17671767
}
17681768

1769+
// TODO remove this, it hides cell creation
17691770
impl From<File> for Vc<FileContent> {
17701771
fn from(file: File) -> Self {
17711772
FileContent::Content(file).cell()

turbopack/crates/turbopack-analyze/src/split_chunk.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ pub async fn split_output_asset_into_parts(
4747
else {
4848
return self_mapped(asset, content).await;
4949
};
50-
let Some(source_map) = &*generate_source_map.generate_source_map().await? else {
50+
let source_map = generate_source_map.generate_source_map().await?;
51+
let Some(source_map) = source_map.as_content() else {
5152
return self_mapped(asset, content).await;
5253
};
53-
let Some(source_map) = SourceMap::new_from_rope(source_map)? else {
54+
let Some(source_map) = SourceMap::new_from_rope(source_map.content())? else {
5455
return unaccounted(asset, content).await;
5556
};
5657

turbopack/crates/turbopack-analyze/tests/split_chunk.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ use anyhow::Result;
66
use serde_json::json;
77
use turbo_rcstr::rcstr;
88
use turbo_tasks::{ResolvedVc, Vc};
9-
use turbo_tasks_fs::{File, FileSystem, FileSystemPath, VirtualFileSystem, rope::Rope};
9+
use turbo_tasks_fs::{
10+
File, FileContent, FileSystem, FileSystemPath, VirtualFileSystem, rope::Rope,
11+
};
1012
use turbo_tasks_testing::{Registration, register, run_once};
1113
use turbopack_analyze::split_chunk::{ChunkPart, ChunkPartRange, split_output_asset_into_parts};
1214
use turbopack_core::{
1315
asset::{Asset, AssetContent},
1416
code_builder::{Code, CodeBuilder},
1517
output::{OutputAsset, OutputAssetsReference},
16-
source_map::{GenerateSourceMap, OptionStringifiedSourceMap},
18+
source_map::GenerateSourceMap,
1719
};
1820

1921
static REGISTRATION: Registration = register!(turbo_tasks_fetch::register);
@@ -130,7 +132,7 @@ impl Asset for TestAsset {
130132
#[turbo_tasks::value_impl]
131133
impl GenerateSourceMap for TestAsset {
132134
#[turbo_tasks::function]
133-
pub fn generate_source_map(&self) -> Vc<OptionStringifiedSourceMap> {
135+
pub fn generate_source_map(&self) -> Vc<FileContent> {
134136
self.code.generate_source_map()
135137
}
136138
}

turbopack/crates/turbopack-browser/src/ecmascript/chunk.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use anyhow::Result;
22
use turbo_rcstr::{RcStr, rcstr};
33
use turbo_tasks::{FxIndexSet, ResolvedVc, ValueToString, Vc};
4-
use turbo_tasks_fs::FileSystemPath;
4+
use turbo_tasks_fs::{FileContent, FileSystemPath};
55
use turbopack_core::{
66
asset::{Asset, AssetContent},
77
chunk::{Chunk, ChunkingContext, OutputChunk, OutputChunkRuntimeInfo},
88
ident::AssetIdent,
99
introspect::{Introspectable, IntrospectableChildren},
1010
output::{OutputAsset, OutputAssetsReference, OutputAssetsWithReferenced},
11-
source_map::{GenerateSourceMap, OptionStringifiedSourceMap, SourceMapAsset},
11+
source_map::{GenerateSourceMap, SourceMapAsset},
1212
version::VersionedContent,
1313
};
1414
use turbopack_ecmascript::chunk::EcmascriptChunk;
@@ -157,12 +157,12 @@ impl Asset for EcmascriptBrowserChunk {
157157
#[turbo_tasks::value_impl]
158158
impl GenerateSourceMap for EcmascriptBrowserChunk {
159159
#[turbo_tasks::function]
160-
fn generate_source_map(self: Vc<Self>) -> Vc<OptionStringifiedSourceMap> {
160+
fn generate_source_map(self: Vc<Self>) -> Vc<FileContent> {
161161
self.own_content().generate_source_map()
162162
}
163163

164164
#[turbo_tasks::function]
165-
fn by_section(self: Vc<Self>, section: RcStr) -> Vc<OptionStringifiedSourceMap> {
165+
fn by_section(self: Vc<Self>, section: RcStr) -> Vc<FileContent> {
166166
self.own_content().by_section(section)
167167
}
168168
}

turbopack/crates/turbopack-browser/src/ecmascript/content.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ use anyhow::{Result, bail};
44
use either::Either;
55
use turbo_rcstr::RcStr;
66
use turbo_tasks::{ResolvedVc, Vc};
7-
use turbo_tasks_fs::File;
7+
use turbo_tasks_fs::{File, FileContent};
88
use turbopack_core::{
99
asset::AssetContent,
1010
chunk::{ChunkingContext, MinifyType, ModuleId},
1111
code_builder::{Code, CodeBuilder},
1212
output::OutputAsset,
13-
source_map::{GenerateSourceMap, OptionStringifiedSourceMap, SourceMapAsset},
13+
source_map::{GenerateSourceMap, SourceMapAsset},
1414
version::{MergeableVersionedContent, Version, VersionedContent, VersionedContentMerger},
1515
};
1616
use turbopack_ecmascript::{chunk::EcmascriptChunkContent, minify::minify, utils::StringifyJs};
@@ -166,12 +166,12 @@ impl MergeableVersionedContent for EcmascriptBrowserChunkContent {
166166
#[turbo_tasks::value_impl]
167167
impl GenerateSourceMap for EcmascriptBrowserChunkContent {
168168
#[turbo_tasks::function]
169-
fn generate_source_map(self: Vc<Self>) -> Vc<OptionStringifiedSourceMap> {
169+
fn generate_source_map(self: Vc<Self>) -> Vc<FileContent> {
170170
self.code().generate_source_map()
171171
}
172172

173173
#[turbo_tasks::function]
174-
async fn by_section(self: Vc<Self>, section: RcStr) -> Result<Vc<OptionStringifiedSourceMap>> {
174+
async fn by_section(self: Vc<Self>, section: RcStr) -> Result<Vc<FileContent>> {
175175
// Weirdly, the ContentSource will have already URL decoded the ModuleId, and we
176176
// can't reparse that via serde.
177177
if let Ok(id) = ModuleId::parse(&section) {
@@ -184,6 +184,6 @@ impl GenerateSourceMap for EcmascriptBrowserChunkContent {
184184
}
185185
}
186186

187-
Ok(Vc::cell(None))
187+
Ok(FileContent::NotFound.cell())
188188
}
189189
}

turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use indoc::writedoc;
66
use serde::Serialize;
77
use turbo_rcstr::{RcStr, rcstr};
88
use turbo_tasks::{ReadRef, ResolvedVc, TryJoinIterExt, ValueToString, Vc};
9-
use turbo_tasks_fs::{File, FileSystemPath};
9+
use turbo_tasks_fs::{File, FileContent, FileSystemPath};
1010
use turbopack_core::{
1111
asset::{Asset, AssetContent},
1212
chunk::{
@@ -18,7 +18,7 @@ use turbopack_core::{
1818
module::Module,
1919
module_graph::ModuleGraph,
2020
output::{OutputAsset, OutputAssets, OutputAssetsReference, OutputAssetsWithReferenced},
21-
source_map::{GenerateSourceMap, OptionStringifiedSourceMap, SourceMapAsset},
21+
source_map::{GenerateSourceMap, SourceMapAsset},
2222
};
2323
use turbopack_ecmascript::{
2424
chunk::{EcmascriptChunkData, EcmascriptChunkPlaceable},
@@ -299,7 +299,7 @@ impl Asset for EcmascriptBrowserEvaluateChunk {
299299
#[turbo_tasks::value_impl]
300300
impl GenerateSourceMap for EcmascriptBrowserEvaluateChunk {
301301
#[turbo_tasks::function]
302-
fn generate_source_map(self: Vc<Self>) -> Vc<OptionStringifiedSourceMap> {
302+
fn generate_source_map(self: Vc<Self>) -> Vc<FileContent> {
303303
self.code().generate_source_map()
304304
}
305305
}

0 commit comments

Comments
 (0)