Skip to content

Commit cbd5f6d

Browse files
committed
fix(commonjs-static): export unprovided variables
1 parent aabc042 commit cbd5f6d

File tree

9 files changed

+217
-37
lines changed

9 files changed

+217
-37
lines changed

crates/rspack_plugin_library/src/assign_library_plugin.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ fn render_startup(
261261
let export_target = access_with_init(&full_name_resolved, self.options.prefix.len(), true);
262262
let module_graph = compilation.get_module_graph();
263263
let exports_info = module_graph.get_exports_info(module);
264+
let mut provided = vec![];
264265
for export_info in exports_info.ordered_exports(&module_graph) {
265266
if matches!(
266267
export_info.provided(&module_graph),
@@ -272,11 +273,44 @@ fn render_startup(
272273
.name(&module_graph)
273274
.expect("should have name")
274275
.to_string();
276+
provided.push(export_info_name.clone());
275277
let name_access = property_access([export_info_name], 0);
276278
source.add(RawStringSource::from(format!(
277279
"{export_target}{name_access} = __webpack_exports__{export_access}{name_access};\n"
278280
)));
279281
}
282+
283+
let mut exports = "__webpack_exports__";
284+
if !export_access.is_empty() {
285+
source.add(RawStringSource::from(format!(
286+
"var __webpack_exports_export__ = __webpack_exports__{export_access};\n"
287+
)));
288+
exports = "__webpack_exports_export__";
289+
}
290+
source.add(RawStringSource::from(format!(
291+
"for(var __webpack_i__ in {exports}) {{\n"
292+
)));
293+
let has_provided = !provided.is_empty();
294+
if has_provided {
295+
source.add(RawStringSource::from(format!(
296+
" if({}.indexOf(__webpack_i__) === -1) {{\n",
297+
serde_json::to_string(&provided).map_err(|e| error!(e.to_string()))?
298+
)));
299+
}
300+
source.add(RawStringSource::from(format!(
301+
"{} {export_target}[__webpack_i__] = {exports}[__webpack_i__];\n",
302+
match has_provided {
303+
true => " ",
304+
false => "",
305+
}
306+
)));
307+
308+
source.add(RawStringSource::from(if has_provided {
309+
" }\n}\n"
310+
} else {
311+
"}\n"
312+
}));
313+
280314
source.add(RawStringSource::from(format!(
281315
"Object.defineProperty({export_target}, '__esModule', {{ value: true }});\n",
282316
)));

tests/webpack-test/configCases/library/0-create-library/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export * from "./a";
22
export default "default-value";
33
export var b = "b";
44
export { default as external } from "external";
5+
export * from "external-named";
56

67
var module = "should not conflict",
78
define = "should not conflict",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const nonExternalA = "non-external-a";

tests/webpack-test/configCases/library/0-create-library/webpack.config.js

Lines changed: 102 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ module.exports = (env, { testPath }) => [
1111
target: "node14",
1212
resolve: {
1313
alias: {
14-
external: "./non-external"
14+
external: "./non-external",
15+
"external-named": "./non-external-named"
1516
}
1617
},
1718
experiments: {
@@ -27,7 +28,8 @@ module.exports = (env, { testPath }) => [
2728
target: "node14",
2829
resolve: {
2930
alias: {
30-
external: "./non-external"
31+
external: "./non-external",
32+
"external-named": "./non-external-named"
3133
}
3234
},
3335
experiments: {
@@ -46,7 +48,8 @@ module.exports = (env, { testPath }) => [
4648
target: "node14",
4749
resolve: {
4850
alias: {
49-
external: "./non-external"
51+
external: "./non-external",
52+
"external-named": "./non-external-named"
5053
}
5154
},
5255
optimization: {
@@ -65,7 +68,8 @@ module.exports = (env, { testPath }) => [
6568
},
6669
resolve: {
6770
alias: {
68-
external: "./non-external"
71+
external: "./non-external",
72+
"external-named": "./non-external-named"
6973
}
7074
}
7175
},
@@ -78,7 +82,8 @@ module.exports = (env, { testPath }) => [
7882
},
7983
resolve: {
8084
alias: {
81-
external: "./non-external"
85+
external: "./non-external",
86+
"external-named": "./non-external-named"
8287
}
8388
}
8489
},
@@ -91,7 +96,8 @@ module.exports = (env, { testPath }) => [
9196
},
9297
resolve: {
9398
alias: {
94-
external: "./non-external"
99+
external: "./non-external",
100+
"external-named": "./non-external-named"
95101
}
96102
}
97103
},
@@ -104,7 +110,8 @@ module.exports = (env, { testPath }) => [
104110
},
105111
resolve: {
106112
alias: {
107-
external: "./non-external"
113+
external: "./non-external",
114+
"external-named": "./non-external-named"
108115
}
109116
}
110117
},
@@ -119,7 +126,8 @@ module.exports = (env, { testPath }) => [
119126
target: "web",
120127
resolve: {
121128
alias: {
122-
external: "./non-external"
129+
external: "./non-external",
130+
"external-named": "./non-external-named"
123131
}
124132
},
125133
optimization: {
@@ -137,7 +145,8 @@ module.exports = (env, { testPath }) => [
137145
target: "web",
138146
resolve: {
139147
alias: {
140-
external: "./non-external"
148+
external: "./non-external",
149+
"external-named": "./non-external-named"
141150
}
142151
},
143152
optimization: {
@@ -152,10 +161,61 @@ module.exports = (env, { testPath }) => [
152161
},
153162
resolve: {
154163
alias: {
155-
external: "./non-external"
164+
external: "./non-external",
165+
"external-named": "./non-external-named"
156166
}
157167
}
158168
},
169+
{
170+
output: {
171+
uniqueName: "true-iife-umd",
172+
filename: "true-iife-umd.js",
173+
library: {
174+
type: "umd"
175+
},
176+
iife: true
177+
},
178+
resolve: {
179+
alias: {
180+
external: "./non-external",
181+
"external-named": "./non-external-named"
182+
}
183+
}
184+
},
185+
{
186+
output: {
187+
uniqueName: "false-iife-umd",
188+
filename: "false-iife-umd.js",
189+
library: {
190+
type: "umd"
191+
},
192+
iife: false
193+
},
194+
resolve: {
195+
alias: {
196+
external: "./non-external",
197+
"external-named": "./non-external-named"
198+
}
199+
},
200+
ignoreWarnings: [error => error.name === "FalseIIFEUmdWarning"]
201+
},
202+
{
203+
output: {
204+
uniqueName: "false-iife-umd2",
205+
filename: "false-iife-umd2.js",
206+
library: {
207+
type: "umd2"
208+
},
209+
iife: false
210+
},
211+
resolve: {
212+
alias: {
213+
external: "./non-external",
214+
"external-named": "./non-external-named"
215+
}
216+
},
217+
ignoreWarnings: [error => error.name === "FalseIIFEUmdWarning"]
218+
},
159219
{
160220
output: {
161221
uniqueName: "umd-default",
@@ -165,7 +225,8 @@ module.exports = (env, { testPath }) => [
165225
},
166226
resolve: {
167227
alias: {
168-
external: "./non-external"
228+
external: "./non-external",
229+
"external-named": "./non-external-named"
169230
}
170231
}
171232
},
@@ -178,7 +239,8 @@ module.exports = (env, { testPath }) => [
178239
},
179240
resolve: {
180241
alias: {
181-
external: "./non-external"
242+
external: "./non-external",
243+
"external-named": "./non-external-named"
182244
}
183245
}
184246
},
@@ -191,7 +253,8 @@ module.exports = (env, { testPath }) => [
191253
},
192254
resolve: {
193255
alias: {
194-
external: "./non-external"
256+
external: "./non-external",
257+
"external-named": "./non-external-named"
195258
}
196259
}
197260
},
@@ -204,7 +267,8 @@ module.exports = (env, { testPath }) => [
204267
},
205268
resolve: {
206269
alias: {
207-
external: "./non-external"
270+
external: "./non-external",
271+
"external-named": "./non-external-named"
208272
}
209273
},
210274
plugins: [
@@ -223,7 +287,8 @@ module.exports = (env, { testPath }) => [
223287
},
224288
resolve: {
225289
alias: {
226-
external: "./non-external"
290+
external: "./non-external",
291+
"external-named": "./non-external-named"
227292
}
228293
},
229294
plugins: [
@@ -244,7 +309,8 @@ module.exports = (env, { testPath }) => [
244309
},
245310
resolve: {
246311
alias: {
247-
external: "./non-external"
312+
external: "./non-external",
313+
"external-named": "./non-external-named"
248314
}
249315
}
250316
},
@@ -259,7 +325,8 @@ module.exports = (env, { testPath }) => [
259325
},
260326
resolve: {
261327
alias: {
262-
external: "./non-external"
328+
external: "./non-external",
329+
"external-named": "./non-external-named"
263330
}
264331
}
265332
},
@@ -270,7 +337,7 @@ module.exports = (env, { testPath }) => [
270337
libraryTarget: "commonjs2",
271338
iife: false
272339
},
273-
externals: ["external"]
340+
externals: ["external", "external-named"]
274341
},
275342
{
276343
output: {
@@ -282,7 +349,7 @@ module.exports = (env, { testPath }) => [
282349
optimization: {
283350
concatenateModules: false
284351
},
285-
externals: ["external"]
352+
externals: ["external", "external-named"]
286353
},
287354
{
288355
output: {
@@ -291,7 +358,7 @@ module.exports = (env, { testPath }) => [
291358
libraryTarget: "commonjs2",
292359
iife: true
293360
},
294-
externals: ["external"]
361+
externals: ["external", "external-named"]
295362
},
296363
{
297364
mode: "development",
@@ -300,7 +367,7 @@ module.exports = (env, { testPath }) => [
300367
filename: "commonjs2-external-eval.js",
301368
libraryTarget: "commonjs2"
302369
},
303-
externals: ["external"]
370+
externals: ["external", "external-named"]
304371
},
305372
{
306373
mode: "development",
@@ -310,7 +377,7 @@ module.exports = (env, { testPath }) => [
310377
libraryTarget: "commonjs2"
311378
},
312379
devtool: "eval-source-map",
313-
externals: ["external"]
380+
externals: ["external", "external-named"]
314381
},
315382
{
316383
output: {
@@ -319,7 +386,7 @@ module.exports = (env, { testPath }) => [
319386
libraryTarget: "commonjs-static",
320387
iife: false
321388
},
322-
externals: ["external"]
389+
externals: ["external", "external-named"]
323390
},
324391
{
325392
output: {
@@ -343,7 +410,8 @@ module.exports = (env, { testPath }) => [
343410
},
344411
resolve: {
345412
alias: {
346-
external: "./non-external"
413+
external: "./non-external",
414+
"external-named": "./non-external-named"
347415
}
348416
}
349417
},
@@ -356,7 +424,8 @@ module.exports = (env, { testPath }) => [
356424
},
357425
resolve: {
358426
alias: {
359-
external: "./non-external"
427+
external: "./non-external",
428+
"external-named": "./non-external-named"
360429
}
361430
},
362431
optimization: {
@@ -372,7 +441,8 @@ module.exports = (env, { testPath }) => [
372441
},
373442
resolve: {
374443
alias: {
375-
external: "./non-external"
444+
external: "./non-external",
445+
"external-named": "./non-external-named"
376446
}
377447
},
378448
optimization: {
@@ -390,7 +460,8 @@ module.exports = (env, { testPath }) => [
390460
target: "web",
391461
resolve: {
392462
alias: {
393-
external: "./non-external"
463+
external: "./non-external",
464+
"external-named": "./non-external-named"
394465
}
395466
},
396467
optimization: {
@@ -408,7 +479,8 @@ module.exports = (env, { testPath }) => [
408479
target: "web",
409480
resolve: {
410481
alias: {
411-
external: "./non-external"
482+
external: "./non-external",
483+
"external-named": "./non-external-named"
412484
}
413485
},
414486
optimization: {
@@ -443,7 +515,8 @@ module.exports = (env, { testPath }) => [
443515
},
444516
resolve: {
445517
alias: {
446-
external: "./non-external"
518+
external: "./non-external",
519+
"external-named": "./non-external-named"
447520
}
448521
}
449522
}

0 commit comments

Comments
 (0)