Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0631292

Browse files
komygunderfin
andauthored
feat: support banner hook (#1419)
<!-- Thank you for contributing! --> ### Description <!-- Please insert your description here and provide especially info about the "what" this PR is solving --> Fix: #1417 issue. --------- Co-authored-by: underfin <[email protected]>
1 parent f6a8d51 commit 0631292

16 files changed

Lines changed: 127 additions & 17 deletions

File tree

crates/rolldown/src/ecmascript/ecma_generator.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use rolldown_common::{
1515
AssetMeta, ChunkKind, EcmaAssetMeta, ExportsKind, OutputFormat, PreliminaryAsset, RenderedModule,
1616
WrapKind,
1717
};
18+
use rolldown_plugin::HookBannerArgs;
1819
use rolldown_sourcemap::{ConcatSource, RawSource};
1920
use rolldown_utils::rayon::{IntoParallelRefIterator, ParallelIterator};
2021
use rustc_hash::FxHashMap;
@@ -164,12 +165,16 @@ impl Generator for EcmaGenerator {
164165
};
165166

166167
// add banner
167-
if let Some(banner) = ctx.options.banner.as_ref() {
168-
if let Some(banner_txt) = banner.call(&rendered_chunk).await? {
169-
if !banner_txt.is_empty() {
170-
concat_source.add_prepend_source(Box::new(RawSource::new(banner_txt)));
171-
}
172-
}
168+
let banner = match ctx.options.banner.as_ref() {
169+
Some(banner) => banner.call(&rendered_chunk).await?,
170+
None => None,
171+
};
172+
if let Some(banner) = ctx
173+
.plugin_driver
174+
.banner(HookBannerArgs { chunk: &rendered_chunk }, banner.unwrap_or_default())
175+
.await?
176+
{
177+
concat_source.add_prepend_source(Box::new(RawSource::new(banner)));
173178
}
174179

175180
// Add `use strict` directive if needed. This must come before the banner, because users might use banner to add hashbang.

crates/rolldown/src/stages/generate_stage/render_chunk_to_assets.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ impl<'a> GenerateStage<'a> {
149149
options: self.options,
150150
link_output: self.link_output,
151151
chunk_graph,
152+
plugin_driver: self.plugin_driver,
152153
};
153154
EcmaGenerator::render_preliminary_assets(&ctx).await
154155
}))

crates/rolldown/src/types/generator.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use rolldown_common::{Chunk, ChunkIdx, NormalizedBundlerOptions, PreliminaryAsset};
2+
use rolldown_plugin::SharedPluginDriver;
23

34
use crate::{chunk_graph::ChunkGraph, stages::link_stage::LinkStageOutput};
45

@@ -8,6 +9,7 @@ pub struct GenerateContext<'a> {
89
pub options: &'a NormalizedBundlerOptions,
910
pub link_output: &'a LinkStageOutput,
1011
pub chunk_graph: &'a ChunkGraph,
12+
pub plugin_driver: &'a SharedPluginDriver,
1113
}
1214

1315
pub trait Generator {

crates/rolldown_binding/src/options/plugin/binding_plugin_options.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ pub struct BindingPluginOptions {
124124
ts_type = "(ctx: BindingPluginContext, bundle: BindingOutputs) => MaybePromise<VoidNullable>"
125125
)]
126126
pub write_bundle: Option<MaybeAsyncJsCallback<(BindingPluginContext, BindingOutputs), ()>>,
127+
128+
#[serde(skip_deserializing)]
129+
#[napi(ts_type = "(ctx: BindingPluginContext, chunk: RenderedChunk) => void")]
130+
pub banner: Option<MaybeAsyncJsCallback<(BindingPluginContext, RenderedChunk), Option<String>>>,
127131
}
128132

129133
impl Debug for BindingPluginOptions {

crates/rolldown_binding/src/options/plugin/js_plugin.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,23 @@ impl Plugin for JsPlugin {
162162
Ok(())
163163
}
164164

165+
async fn banner(
166+
&self,
167+
ctx: &rolldown_plugin::SharedPluginContext,
168+
args: &rolldown_plugin::HookBannerArgs,
169+
) -> rolldown_plugin::HookBannerOutputReturn {
170+
if let Some(cb) = &self.banner {
171+
Ok(
172+
cb.await_call((Arc::clone(ctx).into(), args.chunk.clone().into()))
173+
.await?
174+
.map(TryInto::try_into)
175+
.transpose()?,
176+
)
177+
} else {
178+
Ok(None)
179+
}
180+
}
181+
165182
async fn render_chunk(
166183
&self,
167184
ctx: &rolldown_plugin::SharedPluginContext,

crates/rolldown_plugin/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ pub mod inner {
1111

1212
pub use crate::{
1313
plugin::{
14-
BoxPlugin, HookAugmentChunkHashReturn, HookLoadReturn, HookNoopReturn, HookRenderChunkReturn,
15-
HookResolveIdReturn, HookTransformAstReturn, HookTransformReturn, Plugin, SharedPlugin,
14+
BoxPlugin, HookAugmentChunkHashReturn, HookBannerOutputReturn, HookLoadReturn, HookNoopReturn,
15+
HookRenderChunkReturn, HookResolveIdReturn, HookTransformAstReturn, HookTransformReturn,
16+
Plugin, SharedPlugin,
1617
},
1718
plugin_context::{PluginContext, SharedPluginContext},
1819
plugin_driver::{PluginDriver, SharedPluginDriver},
1920
transform_plugin_context::TransformPluginContext,
21+
types::hook_banner_args::HookBannerArgs,
2022
types::hook_build_end_args::HookBuildEndArgs,
2123
types::hook_load_args::HookLoadArgs,
2224
types::hook_load_output::HookLoadOutput,

crates/rolldown_plugin/src/plugin.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ use std::{any::Any, borrow::Cow, fmt::Debug, sync::Arc};
33
use super::plugin_context::SharedPluginContext;
44
use crate::{
55
transform_plugin_context::TransformPluginContext,
6+
types::hook_render_error::HookRenderErrorArgs,
67
types::{
7-
hook_render_error::HookRenderErrorArgs, hook_transform_ast_args::HookTransformAstArgs,
8-
hook_transform_output::HookTransformOutput,
8+
hook_transform_ast_args::HookTransformAstArgs, hook_transform_output::HookTransformOutput,
99
},
10-
HookBuildEndArgs, HookLoadArgs, HookLoadOutput, HookRenderChunkArgs, HookRenderChunkOutput,
11-
HookResolveDynamicImportArgs, HookResolveIdArgs, HookResolveIdOutput, HookTransformArgs,
10+
HookBannerArgs, HookBuildEndArgs, HookLoadArgs, HookLoadOutput, HookRenderChunkArgs,
11+
HookRenderChunkOutput, HookResolveDynamicImportArgs, HookResolveIdArgs, HookResolveIdOutput,
12+
HookTransformArgs,
1213
};
1314
use anyhow::Result;
1415
use rolldown_common::{ModuleInfo, Output, RollupRenderedChunk};
@@ -21,6 +22,7 @@ pub type HookLoadReturn = Result<Option<HookLoadOutput>>;
2122
pub type HookNoopReturn = Result<()>;
2223
pub type HookRenderChunkReturn = Result<Option<HookRenderChunkOutput>>;
2324
pub type HookAugmentChunkHashReturn = Result<Option<String>>;
25+
pub type HookBannerOutputReturn = Result<Option<String>>;
2426

2527
#[async_trait::async_trait]
2628
pub trait Plugin: Any + Debug + Send + Sync + 'static {
@@ -95,6 +97,14 @@ pub trait Plugin: Any + Debug + Send + Sync + 'static {
9597
Ok(())
9698
}
9799

100+
async fn banner(
101+
&self,
102+
_ctx: &SharedPluginContext,
103+
_args: &HookBannerArgs,
104+
) -> HookBannerOutputReturn {
105+
Ok(None)
106+
}
107+
98108
async fn render_chunk(
99109
&self,
100110
_ctx: &SharedPluginContext,

crates/rolldown_plugin/src/plugin_driver/output_hooks.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::types::hook_render_error::HookRenderErrorArgs;
2-
use crate::PluginDriver;
32
use crate::{HookAugmentChunkHashReturn, HookNoopReturn, HookRenderChunkArgs};
4-
use anyhow::Result;
3+
use crate::{HookBannerArgs, PluginDriver};
4+
use anyhow::{Ok, Result};
55
use rolldown_common::{Output, RollupRenderedChunk};
66
use rolldown_sourcemap::SourceMap;
77

@@ -13,6 +13,23 @@ impl PluginDriver {
1313
Ok(())
1414
}
1515

16+
pub async fn banner(
17+
&self,
18+
args: HookBannerArgs<'_>,
19+
mut banner: String,
20+
) -> Result<Option<String>> {
21+
for (plugin, ctx) in &self.plugins {
22+
if let Some(r) = plugin.banner(ctx, &args).await? {
23+
banner.push('\n');
24+
banner.push_str(r.as_str());
25+
}
26+
}
27+
if banner.is_empty() {
28+
return Ok(None);
29+
}
30+
Ok(Some(banner))
31+
}
32+
1633
pub async fn render_chunk(
1734
&self,
1835
mut args: HookRenderChunkArgs<'_>,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
use rolldown_common::RollupRenderedChunk;
2+
3+
#[derive(Debug)]
4+
pub struct HookBannerArgs<'a> {
5+
pub chunk: &'a RollupRenderedChunk,
6+
}

crates/rolldown_plugin/src/types/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod hook_banner_args;
12
pub mod hook_build_end_args;
23
pub mod hook_load_args;
34
pub mod hook_load_output;

0 commit comments

Comments
 (0)