diff --git a/.changeset/brave-snails-whisper.md b/.changeset/brave-snails-whisper.md new file mode 100644 index 000000000000..29437c2cda18 --- /dev/null +++ b/.changeset/brave-snails-whisper.md @@ -0,0 +1,6 @@ +--- +"@rspack/binding": patch +"@rspack/core": patch +--- + +fix: amd should return with iife diff --git a/crates/node_binding/binding.d.ts b/crates/node_binding/binding.d.ts index af345e7b64a1..cc24f749b997 100644 --- a/crates/node_binding/binding.d.ts +++ b/crates/node_binding/binding.d.ts @@ -308,6 +308,8 @@ export interface RawOutputOptions { enabledLibraryTypes?: Array globalObject: string importFunctionName: string + iife: boolean + module: boolean } export interface RawResolveOptions { preferRelative?: boolean diff --git a/crates/rspack_binding_options/src/options/raw_output.rs b/crates/rspack_binding_options/src/options/raw_output.rs index e161da298805..bb9985352878 100644 --- a/crates/rspack_binding_options/src/options/raw_output.rs +++ b/crates/rspack_binding_options/src/options/raw_output.rs @@ -87,6 +87,8 @@ pub struct RawOutputOptions { pub enabled_library_types: Option>, pub global_object: String, pub import_function_name: String, + pub iife: bool, + pub module: bool, /* pub entry_filename: Option, * pub source_map: Option, */ } @@ -109,6 +111,8 @@ impl RawOptionsApply for RawOutputOptions { enabled_library_types: self.enabled_library_types, global_object: self.global_object, import_function_name: self.import_function_name, + iife: self.iife, + module: self.module, }) } } diff --git a/crates/rspack_core/src/options/output.rs b/crates/rspack_core/src/options/output.rs index 73a2e27543f1..3a53d8d1f6ea 100644 --- a/crates/rspack_core/src/options/output.rs +++ b/crates/rspack_core/src/options/output.rs @@ -26,6 +26,8 @@ pub struct OutputOptions { pub strict_module_error_handling: bool, pub global_object: String, pub import_function_name: String, + pub iife: bool, + pub module: bool, } pub const NAME_PLACEHOLDER: &str = "[name]"; diff --git a/crates/rspack_loader_sass/tests/fixtures.rs b/crates/rspack_loader_sass/tests/fixtures.rs index 4c3a45a16ade..0b43682b42a1 100644 --- a/crates/rspack_loader_sass/tests/fixtures.rs +++ b/crates/rspack_loader_sass/tests/fixtures.rs @@ -54,6 +54,8 @@ async fn loader_test(actual: impl AsRef, expected: impl AsRef) { strict_module_error_handling: false, global_object: "self".to_string(), import_function_name: "import".to_string(), + iife: true, + module: false, }, target: rspack_core::Target::new(&vec![String::from("web")]).expect("TODO:"), resolve: rspack_core::Resolve::default(), diff --git a/crates/rspack_plugin_javascript/src/plugin.rs b/crates/rspack_plugin_javascript/src/plugin.rs index 68283196482a..2ea3923a84dd 100644 --- a/crates/rspack_plugin_javascript/src/plugin.rs +++ b/crates/rspack_plugin_javascript/src/plugin.rs @@ -188,7 +188,11 @@ impl JsPlugin { sources.add(source); } } - let final_source = self.render_iife(sources.boxed()); + let final_source = if compilation.options.output.iife { + self.render_iife(sources.boxed()) + } else { + sources.boxed() + }; if let Some(source) = compilation.plugin_driver.read().await.render(RenderArgs { compilation, chunk: &args.chunk_ukey, diff --git a/crates/rspack_plugin_library/src/amd_library_plugin.rs b/crates/rspack_plugin_library/src/amd_library_plugin.rs index 0b6dd10ea90a..1988743de21e 100644 --- a/crates/rspack_plugin_library/src/amd_library_plugin.rs +++ b/crates/rspack_plugin_library/src/amd_library_plugin.rs @@ -68,7 +68,7 @@ impl Plugin for AmdLibraryPlugin { let external_deps_array = external_dep_array(&modules); let external_arguments = external_arguments(&modules, compilation); let mut fn_start = format!("function({external_arguments}){{\n"); - if !chunk.has_runtime(&compilation.chunk_group_by_ukey) { + if compilation.options.output.iife && !chunk.has_runtime(&compilation.chunk_group_by_ukey) { fn_start.push_str(" return "); } let name = self.normalize_name(&compilation.options.output.library)?; diff --git a/crates/rspack_testing/src/test_config.rs b/crates/rspack_testing/src/test_config.rs index de532dee0e72..b15bc836fbc1 100644 --- a/crates/rspack_testing/src/test_config.rs +++ b/crates/rspack_testing/src/test_config.rs @@ -368,6 +368,8 @@ impl TestConfig { strict_module_error_handling: false, global_object: "self".to_string(), import_function_name: "import".to_string(), + iife: true, + module: false, }, mode: c::Mode::from(self.mode), target: c::Target::new(&self.target).expect("Can't construct target"), diff --git a/packages/rspack/src/config/adapter.ts b/packages/rspack/src/config/adapter.ts index 50a44026df6d..591841270507 100644 --- a/packages/rspack/src/config/adapter.ts +++ b/packages/rspack/src/config/adapter.ts @@ -145,7 +145,9 @@ function getRawOutput(output: OutputNormalized): RawOptions["output"] { !isNil(output.enabledLibraryTypes) && !isNil(output.strictModuleErrorHandling) && !isNil(output.globalObject) && - !isNil(output.importFunctionName), + !isNil(output.importFunctionName) && + !isNil(output.module) && + !isNil(output.iife), "fields should not be nil after defaults" ); return { @@ -161,7 +163,9 @@ function getRawOutput(output: OutputNormalized): RawOptions["output"] { library: output.library && getRawLibrary(output.library), strictModuleErrorHandling: output.strictModuleErrorHandling, globalObject: output.globalObject, - importFunctionName: output.importFunctionName + importFunctionName: output.importFunctionName, + iife: output.iife, + module: output.module }; } diff --git a/packages/rspack/src/config/defaults.ts b/packages/rspack/src/config/defaults.ts index 7246a54a35a2..3d89ac3ca7c9 100644 --- a/packages/rspack/src/config/defaults.ts +++ b/packages/rspack/src/config/defaults.ts @@ -306,6 +306,8 @@ const applyOutputDefaults = ( return "self"; }); D(output, "importFunctionName", "import"); + F(output, "iife", () => !output.module); + F(output, "module", () => false); // TODO experiments.outputModule }; const applyExternalsPresetsDefaults = ( diff --git a/packages/rspack/src/config/normalization.ts b/packages/rspack/src/config/normalization.ts index 366cd380dc4b..3d6b61d673fb 100644 --- a/packages/rspack/src/config/normalization.ts +++ b/packages/rspack/src/config/normalization.ts @@ -58,6 +58,8 @@ export const getNormalizedRspackOptions = ( : ["..."], globalObject: output.globalObject, importFunctionName: output.importFunctionName, + iife: output.iife, + module: output.module, library: libraryBase && { type: output.libraryTarget !== undefined diff --git a/packages/rspack/src/config/schema.js b/packages/rspack/src/config/schema.js index a5d6862cf5bb..3ae43bf7413f 100644 --- a/packages/rspack/src/config/schema.js +++ b/packages/rspack/src/config/schema.js @@ -911,12 +911,20 @@ module.exports = { } ] }, + Iife: { + description: + "Wrap javascript code into IIFE's to avoid leaking into global scope.", + type: "boolean" + }, Output: { description: "Options affecting the output of the compilation. `output` options tell rspack how to write the compiled files to disk.", type: "object", additionalProperties: false, properties: { + iife: { + $ref: "#/definitions/Iife" + }, assetModuleFilename: { $ref: "#/definitions/AssetModuleFilename" }, diff --git a/packages/rspack/src/config/types.ts b/packages/rspack/src/config/types.ts index 100167d509dd..4aaad3be3783 100644 --- a/packages/rspack/src/config/types.ts +++ b/packages/rspack/src/config/types.ts @@ -128,6 +128,7 @@ export interface Output { strictModuleErrorHandling?: StrictModuleErrorHandling; globalObject?: GlobalObject; importFunctionName?: ImportFunctionName; + iife?: Iife; } export type Path = string; export type PublicPath = "auto" | RawPublicPath; @@ -142,6 +143,7 @@ export type UniqueName = string; export type Library = LibraryName | LibraryOptions; export type StrictModuleErrorHandling = boolean; export type OutputModule = boolean; +export type Iife = boolean; export interface LibraryCustomUmdCommentObject { amd?: string; commonjs?: string; @@ -204,6 +206,7 @@ export interface OutputNormalized { strictModuleErrorHandling?: StrictModuleErrorHandling; globalObject?: GlobalObject; importFunctionName?: ImportFunctionName; + iife?: Iife; } ///// Resolve ///// diff --git a/packages/rspack/tests/Defaults.unittest.ts b/packages/rspack/tests/Defaults.unittest.ts index 7a52d0f7968a..6fcae42dd605 100644 --- a/packages/rspack/tests/Defaults.unittest.ts +++ b/packages/rspack/tests/Defaults.unittest.ts @@ -222,8 +222,10 @@ describe("snapshots", () => { "enabledLibraryTypes": [], "filename": "[name].js", "globalObject": "self", + "iife": true, "importFunctionName": "import", "library": undefined, + "module": false, "path": "/dist", "publicPath": "auto", "strictModuleErrorHandling": false, diff --git a/packages/rspack/tests/configCases/library/amd-named/index.js b/packages/rspack/tests/configCases/library/amd-named/index.js index e85dd21895c9..5584d80f542f 100644 --- a/packages/rspack/tests/configCases/library/amd-named/index.js +++ b/packages/rspack/tests/configCases/library/amd-named/index.js @@ -5,4 +5,5 @@ it("should name define", function () { var source = fs.readFileSync(__filename, "utf-8"); expect(source).toMatch('define("NamedLibrary",'); + expect(source.includes("return __webpack_exports__")).toBe(true); });