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

Skip to content

Commit 9071d6a

Browse files
authored
feat(node/rolldown): support InputOptions#inject (#1946)
<!-- Thank you for contributing! --> ### Description <!-- Please insert your description here and provide especially info about the "what" this PR is solving -->
1 parent 9df25c2 commit 9071d6a

16 files changed

Lines changed: 301 additions & 103 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use napi::Either;
2+
use rolldown::InjectImport;
3+
use serde::Deserialize;
4+
5+
pub type BindingInjectImport = Either<BindingInjectImportNamed, BindingInjectImportNamespace>;
6+
7+
#[napi_derive::napi(object)]
8+
#[derive(Deserialize, Debug, Default)]
9+
#[serde(rename_all = "camelCase")]
10+
pub struct BindingInjectImportNamed {
11+
#[napi(ts_type = "true")]
12+
pub tag_named: bool,
13+
pub imported: String,
14+
pub alias: Option<String>,
15+
pub from: String,
16+
}
17+
18+
#[napi_derive::napi(object)]
19+
#[derive(Deserialize, Debug, Default)]
20+
#[serde(rename_all = "camelCase")]
21+
pub struct BindingInjectImportNamespace {
22+
#[napi(ts_type = "true")]
23+
pub tag_namespace: bool,
24+
pub alias: String,
25+
pub from: String,
26+
}
27+
28+
pub fn normalize_binding_inject_import(item: BindingInjectImport) -> InjectImport {
29+
match item {
30+
Either::A(named) => {
31+
InjectImport::Named { imported: named.imported, alias: named.alias, from: named.from }
32+
}
33+
Either::B(namespace) => {
34+
InjectImport::Namespace { alias: namespace.alias, from: namespace.from }
35+
}
36+
}
37+
}

crates/rolldown_binding/src/options/binding_input_options/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use std::collections::HashMap;
44

55
use crate::types::{binding_log::BindingLog, binding_log_level::BindingLogLevel};
6+
use binding_inject_import::BindingInjectImport;
67
use derivative::Derivative;
78
use napi::threadsafe_function::ThreadsafeFunction;
89
use napi_derive::napi;
@@ -12,6 +13,7 @@ use self::{binding_input_item::BindingInputItem, binding_resolve_options::Bindin
1213

1314
use super::plugin::BindingPluginOrParallelJsPluginPlaceholder;
1415

16+
pub mod binding_inject_import;
1517
mod binding_input_item;
1618
mod binding_resolve_options;
1719
mod treeshake;
@@ -75,6 +77,9 @@ pub struct BindingInputOptions {
7577

7678
pub module_types: Option<HashMap<String, String>>,
7779
pub define: Option<Vec<(/* Target to be replaced */ String, /* Replacement */ String)>>,
80+
#[serde(skip_deserializing)]
81+
#[napi(ts_type = "Array<BindingInjectImportNamed | BindingInjectImportNamespace>")]
82+
pub inject: Option<Vec<BindingInjectImport>>,
7883
}
7984

8085
pub type BindingOnLog =

crates/rolldown_binding/src/utils/normalize_binding_options.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::options::binding_inject_import::normalize_binding_inject_import;
12
#[cfg_attr(target_family = "wasm", allow(unused))]
23
use crate::{
34
options::plugin::JsPlugin,
@@ -147,7 +148,9 @@ pub fn normalize_binding_options(
147148
css_entry_filenames: None,
148149
css_chunk_filenames: None,
149150
define: input_options.define.map(FxIndexMap::from_iter),
150-
inject: None,
151+
inject: input_options
152+
.inject
153+
.map(|inner| inner.into_iter().map(normalize_binding_inject_import).collect()),
151154
};
152155

153156
#[cfg(not(target_family = "wasm"))]

packages/rolldown/src/binding.d.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,19 @@ export interface BindingHookTransformOutput {
167167
moduleType?: string
168168
}
169169

170+
export interface BindingInjectImportNamed {
171+
tagNamed: true
172+
imported: string
173+
alias?: string
174+
from: string
175+
}
176+
177+
export interface BindingInjectImportNamespace {
178+
tagNamespace: true
179+
alias: string
180+
from: string
181+
}
182+
170183
export interface BindingInputItem {
171184
name?: string
172185
import: string
@@ -185,6 +198,7 @@ export interface BindingInputOptions {
185198
treeshake?: BindingTreeshake
186199
moduleTypes?: Record<string, string>
187200
define?: Array<[string, string]>
201+
inject?: Array<BindingInjectImportNamed | BindingInjectImportNamespace>
188202
}
189203

190204
export interface BindingJsonSourcemap {

packages/rolldown/src/options/bindingify-input-options.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { BindingInputOptions, BindingLogLevel } from '../binding'
2+
import type {
3+
BindingInjectImportNamed,
4+
BindingInjectImportNamespace,
5+
} from '../binding'
26
import nodePath from 'node:path'
37
import { bindingifyPlugin } from '../plugin/bindingify-plugin'
48
import type { NormalizedInputOptions } from './normalized-input-options'
@@ -73,6 +77,48 @@ export function bindingifyInputOptions(
7377
treeshake: options.treeshake,
7478
moduleTypes: options.moduleTypes,
7579
define: options.define ? Object.entries(options.define) : undefined,
80+
inject: options.inject
81+
? Object.entries(options.inject).map(
82+
([alias, item]):
83+
| BindingInjectImportNamed
84+
| BindingInjectImportNamespace => {
85+
if (Array.isArray(item)) {
86+
// import * as fs from 'node:fs'
87+
// fs: ['node:fs', '*' ],
88+
if (item[1] === '*') {
89+
return {
90+
tagNamespace: true,
91+
alias,
92+
from: item[0],
93+
}
94+
}
95+
96+
// import { Promise } from 'es6-promise'
97+
// Promise: [ 'es6-promise', 'Promise' ],
98+
99+
// import { Promise as P } from 'es6-promise'
100+
// P: [ 'es6-promise', 'Promise' ],
101+
return {
102+
tagNamed: true,
103+
alias,
104+
from: item[0],
105+
imported: item[1],
106+
}
107+
} else {
108+
// import $ from 'jquery'
109+
// $: 'jquery',
110+
111+
// 'Object.assign': path.resolve( 'src/helpers/object-assign.js' ),
112+
return {
113+
tagNamed: true,
114+
imported: 'default',
115+
alias,
116+
from: item,
117+
}
118+
}
119+
},
120+
)
121+
: undefined,
76122
}
77123
}
78124

packages/rolldown/src/options/input-options.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ const inputOptionsSchema = z.strictObject({
9494
})
9595
.optional(),
9696
define: z.record(z.string()).optional(),
97+
inject: z.record(z.string().or(z.tuple([z.string(), z.string()]))).optional(),
9798
})
9899

99100
export type InputOption = z.infer<typeof inputOptionSchema>

packages/rolldown/src/rolldown-binding.wasi-browser.js

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -70,57 +70,59 @@ function __napi_rs_initialize_modules(__napiInstance) {
7070
__napiInstance.exports['__napi_register__transform_9']?.()
7171
__napiInstance.exports['__napi_register__Bundler_struct_0']?.()
7272
__napiInstance.exports['__napi_register__Bundler_impl_5']?.()
73-
__napiInstance.exports['__napi_register__BindingInputItem_struct_6']?.()
74-
__napiInstance.exports['__napi_register__BindingResolveOptions_struct_7']?.()
75-
__napiInstance.exports['__napi_register__BindingTreeshake_struct_8']?.()
76-
__napiInstance.exports['__napi_register__BindingInputOptions_struct_9']?.()
77-
__napiInstance.exports['__napi_register__BindingOutputOptions_struct_10']?.()
78-
__napiInstance.exports['__napi_register__BindingPluginContext_struct_11']?.()
79-
__napiInstance.exports['__napi_register__BindingPluginContext_impl_17']?.()
80-
__napiInstance.exports['__napi_register__BindingPluginContextResolvedId_struct_18']?.()
81-
__napiInstance.exports['__napi_register__BindingPluginOptions_struct_19']?.()
82-
__napiInstance.exports['__napi_register__BindingPluginWithIndex_struct_20']?.()
83-
__napiInstance.exports['__napi_register__BindingTransformPluginContext_struct_21']?.()
84-
__napiInstance.exports['__napi_register__BindingTransformPluginContext_impl_23']?.()
85-
__napiInstance.exports['__napi_register__BindingAssetSource_struct_24']?.()
86-
__napiInstance.exports['__napi_register__BindingEmittedAsset_struct_25']?.()
87-
__napiInstance.exports['__napi_register__BindingHookLoadOutput_struct_26']?.()
88-
__napiInstance.exports['__napi_register__BindingHookRenderChunkOutput_struct_27']?.()
89-
__napiInstance.exports['__napi_register__BindingHookResolveIdExtraArgs_struct_28']?.()
90-
__napiInstance.exports['__napi_register__BindingHookResolveIdOutput_struct_29']?.()
91-
__napiInstance.exports['__napi_register__BindingHookSideEffects_30']?.()
92-
__napiInstance.exports['__napi_register__BindingHookTransformOutput_struct_31']?.()
93-
__napiInstance.exports['__napi_register__BindingStringOrRegex_struct_32']?.()
94-
__napiInstance.exports['__napi_register__BindingPluginContextResolveOptions_struct_33']?.()
95-
__napiInstance.exports['__napi_register__BindingTransformHookExtraArgs_struct_34']?.()
96-
__napiInstance.exports['__napi_register__BindingBuiltinPlugin_struct_35']?.()
97-
__napiInstance.exports['__napi_register__BindingBuiltinPluginName_36']?.()
98-
__napiInstance.exports['__napi_register__BindingGlobImportPluginConfig_struct_37']?.()
99-
__napiInstance.exports['__napi_register__BindingManifestPluginConfig_struct_38']?.()
100-
__napiInstance.exports['__napi_register__BindingModulePreloadPolyfillPluginConfig_struct_39']?.()
101-
__napiInstance.exports['__napi_register__BindingTransformPluginConfig_struct_40']?.()
102-
__napiInstance.exports['__napi_register__BindingPluginOrder_41']?.()
103-
__napiInstance.exports['__napi_register__BindingPluginHookMeta_struct_42']?.()
104-
__napiInstance.exports['__napi_register__ParallelJsPluginRegistry_struct_43']?.()
105-
__napiInstance.exports['__napi_register__ParallelJsPluginRegistry_impl_45']?.()
106-
__napiInstance.exports['__napi_register__register_plugins_46']?.()
107-
__napiInstance.exports['__napi_register__BindingLog_struct_47']?.()
108-
__napiInstance.exports['__napi_register__BindingLogLevel_48']?.()
109-
__napiInstance.exports['__napi_register__BindingModuleInfo_struct_49']?.()
110-
__napiInstance.exports['__napi_register__BindingModuleInfo_impl_51']?.()
111-
__napiInstance.exports['__napi_register__BindingOutputAsset_struct_52']?.()
112-
__napiInstance.exports['__napi_register__BindingOutputAsset_impl_57']?.()
113-
__napiInstance.exports['__napi_register__BindingOutputChunk_struct_58']?.()
114-
__napiInstance.exports['__napi_register__BindingOutputChunk_impl_76']?.()
115-
__napiInstance.exports['__napi_register__BindingOutputs_struct_77']?.()
116-
__napiInstance.exports['__napi_register__BindingOutputs_impl_81']?.()
117-
__napiInstance.exports['__napi_register__FinalBindingOutputs_struct_82']?.()
118-
__napiInstance.exports['__napi_register__FinalBindingOutputs_impl_85']?.()
119-
__napiInstance.exports['__napi_register__RenderedChunk_struct_86']?.()
120-
__napiInstance.exports['__napi_register__BindingRenderedModule_struct_87']?.()
121-
__napiInstance.exports['__napi_register__AliasItem_struct_88']?.()
122-
__napiInstance.exports['__napi_register__BindingSourcemap_struct_89']?.()
123-
__napiInstance.exports['__napi_register__BindingJsonSourcemap_struct_90']?.()
73+
__napiInstance.exports['__napi_register__BindingInjectImportNamed_struct_6']?.()
74+
__napiInstance.exports['__napi_register__BindingInjectImportNamespace_struct_7']?.()
75+
__napiInstance.exports['__napi_register__BindingInputItem_struct_8']?.()
76+
__napiInstance.exports['__napi_register__BindingResolveOptions_struct_9']?.()
77+
__napiInstance.exports['__napi_register__BindingTreeshake_struct_10']?.()
78+
__napiInstance.exports['__napi_register__BindingInputOptions_struct_11']?.()
79+
__napiInstance.exports['__napi_register__BindingOutputOptions_struct_12']?.()
80+
__napiInstance.exports['__napi_register__BindingPluginContext_struct_13']?.()
81+
__napiInstance.exports['__napi_register__BindingPluginContext_impl_19']?.()
82+
__napiInstance.exports['__napi_register__BindingPluginContextResolvedId_struct_20']?.()
83+
__napiInstance.exports['__napi_register__BindingPluginOptions_struct_21']?.()
84+
__napiInstance.exports['__napi_register__BindingPluginWithIndex_struct_22']?.()
85+
__napiInstance.exports['__napi_register__BindingTransformPluginContext_struct_23']?.()
86+
__napiInstance.exports['__napi_register__BindingTransformPluginContext_impl_25']?.()
87+
__napiInstance.exports['__napi_register__BindingAssetSource_struct_26']?.()
88+
__napiInstance.exports['__napi_register__BindingEmittedAsset_struct_27']?.()
89+
__napiInstance.exports['__napi_register__BindingHookLoadOutput_struct_28']?.()
90+
__napiInstance.exports['__napi_register__BindingHookRenderChunkOutput_struct_29']?.()
91+
__napiInstance.exports['__napi_register__BindingHookResolveIdExtraArgs_struct_30']?.()
92+
__napiInstance.exports['__napi_register__BindingHookResolveIdOutput_struct_31']?.()
93+
__napiInstance.exports['__napi_register__BindingHookSideEffects_32']?.()
94+
__napiInstance.exports['__napi_register__BindingHookTransformOutput_struct_33']?.()
95+
__napiInstance.exports['__napi_register__BindingStringOrRegex_struct_34']?.()
96+
__napiInstance.exports['__napi_register__BindingPluginContextResolveOptions_struct_35']?.()
97+
__napiInstance.exports['__napi_register__BindingTransformHookExtraArgs_struct_36']?.()
98+
__napiInstance.exports['__napi_register__BindingBuiltinPlugin_struct_37']?.()
99+
__napiInstance.exports['__napi_register__BindingBuiltinPluginName_38']?.()
100+
__napiInstance.exports['__napi_register__BindingGlobImportPluginConfig_struct_39']?.()
101+
__napiInstance.exports['__napi_register__BindingManifestPluginConfig_struct_40']?.()
102+
__napiInstance.exports['__napi_register__BindingModulePreloadPolyfillPluginConfig_struct_41']?.()
103+
__napiInstance.exports['__napi_register__BindingTransformPluginConfig_struct_42']?.()
104+
__napiInstance.exports['__napi_register__BindingPluginOrder_43']?.()
105+
__napiInstance.exports['__napi_register__BindingPluginHookMeta_struct_44']?.()
106+
__napiInstance.exports['__napi_register__ParallelJsPluginRegistry_struct_45']?.()
107+
__napiInstance.exports['__napi_register__ParallelJsPluginRegistry_impl_47']?.()
108+
__napiInstance.exports['__napi_register__register_plugins_48']?.()
109+
__napiInstance.exports['__napi_register__BindingLog_struct_49']?.()
110+
__napiInstance.exports['__napi_register__BindingLogLevel_50']?.()
111+
__napiInstance.exports['__napi_register__BindingModuleInfo_struct_51']?.()
112+
__napiInstance.exports['__napi_register__BindingModuleInfo_impl_53']?.()
113+
__napiInstance.exports['__napi_register__BindingOutputAsset_struct_54']?.()
114+
__napiInstance.exports['__napi_register__BindingOutputAsset_impl_59']?.()
115+
__napiInstance.exports['__napi_register__BindingOutputChunk_struct_60']?.()
116+
__napiInstance.exports['__napi_register__BindingOutputChunk_impl_78']?.()
117+
__napiInstance.exports['__napi_register__BindingOutputs_struct_79']?.()
118+
__napiInstance.exports['__napi_register__BindingOutputs_impl_83']?.()
119+
__napiInstance.exports['__napi_register__FinalBindingOutputs_struct_84']?.()
120+
__napiInstance.exports['__napi_register__FinalBindingOutputs_impl_87']?.()
121+
__napiInstance.exports['__napi_register__RenderedChunk_struct_88']?.()
122+
__napiInstance.exports['__napi_register__BindingRenderedModule_struct_89']?.()
123+
__napiInstance.exports['__napi_register__AliasItem_struct_90']?.()
124+
__napiInstance.exports['__napi_register__BindingSourcemap_struct_91']?.()
125+
__napiInstance.exports['__napi_register__BindingJsonSourcemap_struct_92']?.()
124126
}
125127
export const BindingLog = __napiModule.exports.BindingLog
126128
export const BindingModuleInfo = __napiModule.exports.BindingModuleInfo

0 commit comments

Comments
 (0)