From 688aa46d46a57fb93a783c9ab9882e45f678079c Mon Sep 17 00:00:00 2001 From: ahabhgk Date: Tue, 24 Dec 2024 17:03:07 +0800 Subject: [PATCH] feat: add context info issuer layer for external fn --- crates/node_binding/binding.d.ts | 1 + .../src/raw_options/raw_external.rs | 2 ++ crates/rspack_core/src/options/externals.rs | 1 + crates/rspack_plugin_externals/src/plugin.rs | 4 ++- .../externals/context-info/index.js | 7 +++++ .../externals/context-info/other-layer.js | 3 +++ .../externals/context-info/rspack.config.js | 26 +++++++++++++++++++ packages/rspack/etc/core.api.md | 1 + packages/rspack/src/Module.ts | 1 + .../src/builtin-plugin/ExternalsPlugin.ts | 3 ++- 10 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 packages/rspack-test-tools/tests/configCases/externals/context-info/index.js create mode 100644 packages/rspack-test-tools/tests/configCases/externals/context-info/other-layer.js create mode 100644 packages/rspack-test-tools/tests/configCases/externals/context-info/rspack.config.js diff --git a/crates/node_binding/binding.d.ts b/crates/node_binding/binding.d.ts index 5156de84c696..934677828e38 100644 --- a/crates/node_binding/binding.d.ts +++ b/crates/node_binding/binding.d.ts @@ -371,6 +371,7 @@ export declare function cleanupGlobalTrace(): void export interface ContextInfo { issuer: string + issuerLayer?: string } export declare function formatDiagnostic(diagnostic: JsDiagnostic): ExternalObject<'Diagnostic'> diff --git a/crates/rspack_binding_values/src/raw_options/raw_external.rs b/crates/rspack_binding_values/src/raw_options/raw_external.rs index bb35d530c0c0..dd2e0a3b40f9 100644 --- a/crates/rspack_binding_values/src/raw_options/raw_external.rs +++ b/crates/rspack_binding_values/src/raw_options/raw_external.rs @@ -69,6 +69,7 @@ impl From for ExternalItemFnResult { #[napi(object)] pub struct ContextInfo { pub issuer: String, + pub issuer_layer: Option, } #[derive(Debug)] @@ -120,6 +121,7 @@ impl From for RawExternalItemFnCtx { context: value.context, context_info: ContextInfo { issuer: value.context_info.issuer, + issuer_layer: value.context_info.issuer_layer, }, resolve_options_with_dependency_type: value.resolve_options_with_dependency_type, resolver_factory: value.resolver_factory, diff --git a/crates/rspack_core/src/options/externals.rs b/crates/rspack_core/src/options/externals.rs index 480234eece8c..7021ef10b5b0 100644 --- a/crates/rspack_core/src/options/externals.rs +++ b/crates/rspack_core/src/options/externals.rs @@ -21,6 +21,7 @@ pub type ExternalItemObject = HashMap; pub struct ContextInfo { pub issuer: String, + pub issuer_layer: Option, } pub struct ExternalItemFnCtx { diff --git a/crates/rspack_plugin_externals/src/plugin.rs b/crates/rspack_plugin_externals/src/plugin.rs index 6efa2f352c0c..55a911567750 100644 --- a/crates/rspack_plugin_externals/src/plugin.rs +++ b/crates/rspack_plugin_externals/src/plugin.rs @@ -180,7 +180,9 @@ async fn factorize(&self, data: &mut ModuleFactoryCreateData) -> Result { + expect(e1).toBe(1); + expect(e2).toBe(2); +}); diff --git a/packages/rspack-test-tools/tests/configCases/externals/context-info/other-layer.js b/packages/rspack-test-tools/tests/configCases/externals/context-info/other-layer.js new file mode 100644 index 000000000000..9784b01b83b7 --- /dev/null +++ b/packages/rspack-test-tools/tests/configCases/externals/context-info/other-layer.js @@ -0,0 +1,3 @@ +import e2 from "external-pkg"; + +export default e2; diff --git a/packages/rspack-test-tools/tests/configCases/externals/context-info/rspack.config.js b/packages/rspack-test-tools/tests/configCases/externals/context-info/rspack.config.js new file mode 100644 index 000000000000..67aff7cbbb37 --- /dev/null +++ b/packages/rspack-test-tools/tests/configCases/externals/context-info/rspack.config.js @@ -0,0 +1,26 @@ +/** @type {import("@rspack/core").Configuration} */ +module.exports = { + entry: "./index.js", + module: { + rules: [ + { + test: /other-layer\.js$/, + layer: "other-layer", + } + ] + }, + externals: [ + function ({ context, request, contextInfo }, callback) { + if (request === "external-pkg") { + if (contextInfo.issuerLayer === "other-layer") { + return callback(null, "var 2"); + } + return callback(null, "var 1"); + } + return callback() + } + ], + experiments: { + layers: true, + } +}; diff --git a/packages/rspack/etc/core.api.md b/packages/rspack/etc/core.api.md index e7fd87611822..e29c5eb16d26 100644 --- a/packages/rspack/etc/core.api.md +++ b/packages/rspack/etc/core.api.md @@ -1113,6 +1113,7 @@ export type Context = string; // @public (undocumented) type ContextInfo = { issuer: string; + issuerLayer?: string; }; // @public (undocumented) diff --git a/packages/rspack/src/Module.ts b/packages/rspack/src/Module.ts index a36cb2d82050..512946279a82 100644 --- a/packages/rspack/src/Module.ts +++ b/packages/rspack/src/Module.ts @@ -25,6 +25,7 @@ export type ResourceDataWithData = ResourceData & { export type CreateData = Partial; export type ContextInfo = { issuer: string; + issuerLayer?: string; }; export type ResolveData = { contextInfo: ContextInfo; diff --git a/packages/rspack/src/builtin-plugin/ExternalsPlugin.ts b/packages/rspack/src/builtin-plugin/ExternalsPlugin.ts index de50c04a286f..cce105d91d93 100644 --- a/packages/rspack/src/builtin-plugin/ExternalsPlugin.ts +++ b/packages/rspack/src/builtin-plugin/ExternalsPlugin.ts @@ -1,6 +1,7 @@ import { type BuiltinPlugin, BuiltinPluginName, + type RawExternalItemFnCtx, type RawExternalsPluginOptions } from "@rspack/binding"; @@ -44,7 +45,7 @@ function getRawExternalItem( } if (typeof item === "function") { - return async ctx => { + return async (ctx: RawExternalItemFnCtx) => { return await new Promise((resolve, reject) => { const data = ctx.data(); const promise = item(