Skip to content

Commit

Permalink
feat: suppport transform hook return map (#422)
Browse files Browse the repository at this point in the history
  • Loading branch information
underfin authored Feb 4, 2024
1 parent b42b32b commit 9206754
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ impl<'task, T: FileSystem + Default + 'static> NormalModuleTask<'task, T> {
.await?;

// Run plugin transform.
let source: Arc<str> = transform_source(&self.ctx.plugin_driver, source).await?.into();
let source: Arc<str> =
transform_source(&self.ctx.plugin_driver, source, &mut sourcemap_chain).await?.into();

let (ast, scope, scan_result, ast_symbol, namespace_symbol) = self.scan(&source);
tracing::trace!("scan {:?}", self.resolved_path);
Expand Down
24 changes: 18 additions & 6 deletions crates/rolldown/src/bundler/plugin_driver/mod.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
use std::sync::Arc;

use rolldown_error::BuildError;
use rolldown_sourcemap::SourceMap;
use rolldown_utils::block_on_spawn_all;

use crate::{
plugin::{
args::{HookBuildEndArgs, RenderChunkArgs},
plugin::{BoxPlugin, HookNoopReturn},
},
HookLoadArgs, HookLoadReturn, HookResolveIdArgs, HookResolveIdReturn, HookTransformArgs,
HookTransformReturn, Output, PluginContext,
HookLoadArgs, HookLoadReturn, HookResolveIdArgs, HookResolveIdReturn, HookTransformArgs, Output,
PluginContext,
};

pub type SharedPluginDriver = Arc<PluginDriver>;
Expand Down Expand Up @@ -48,13 +49,24 @@ impl PluginDriver {
Ok(None)
}

pub async fn transform(&self, args: &HookTransformArgs<'_>) -> HookTransformReturn {
pub async fn transform(
&self,
args: &HookTransformArgs<'_>,
) -> Result<(String, Vec<SourceMap>), BuildError> {
let mut sourcemap_chain = vec![];
let mut code = args.code.to_string();
for plugin in &self.plugins {
if let Some(r) = plugin.transform(&mut PluginContext::new(), args).await? {
return Ok(Some(r));
if let Some(r) = plugin
.transform(&mut PluginContext::new(), &HookTransformArgs { id: args.id, code: &code })
.await?
{
code = r.code;
if let Some(map) = r.map {
sourcemap_chain.push(map);
}
}
}
Ok(None)
Ok((code, sourcemap_chain))
}

pub async fn build_end(&self, args: Option<&HookBuildEndArgs>) -> HookNoopReturn {
Expand Down
16 changes: 9 additions & 7 deletions crates/rolldown/src/bundler/utils/transform_source.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
use rolldown_sourcemap::SourceMap;

use crate::{bundler::plugin_driver::PluginDriver, error::BatchedErrors, HookTransformArgs};

pub async fn transform_source(
plugin_driver: &PluginDriver,
mut source: String,
source: String,
sourcemap_chain: &mut Vec<SourceMap>,
) -> Result<String, BatchedErrors> {
if let Some(r) =
plugin_driver.transform(&HookTransformArgs { id: source.as_ref(), code: &source }).await?
{
source = r.code;
};
let (code, map_chain) =
plugin_driver.transform(&HookTransformArgs { id: source.as_ref(), code: &source }).await?;

sourcemap_chain.extend(map_chain);

Ok(source)
Ok(code)
}
2 changes: 1 addition & 1 deletion packages/node/src/options/create-build-plugin-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ function transform(hook: Plugin['transform']) {
return
}
// TODO other filed
return { code: value.code }
return { code: value.code, map: transformSourcemap(value.map) }
} catch (error) {
console.error(error)
throw error
Expand Down
1 change: 1 addition & 0 deletions packages/node/test/cases/plugin/transform/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const config: RollupOptions = {
expect(code).toStrictEqual('')
return {
code: `console.log('foo')`,
map: { mappings: "" }
}
}
},
Expand Down

0 comments on commit 9206754

Please sign in to comment.