Skip to content

Commit b146549

Browse files
authored
fix: enforce esm (#546)
1 parent 6efb133 commit b146549

File tree

6 files changed

+69
-6
lines changed

6 files changed

+69
-6
lines changed

src/loader.js

+2
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ export function pitch(request) {
209209
? `\n${esModule ? 'export default' : 'module.exports ='} ${JSON.stringify(
210210
locals
211211
)};`
212+
: esModule
213+
? `\nexport {};`
212214
: '';
213215

214216
let resultSource = `// extracted by ${pluginName}`;

test/enforce-esm.test.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { getCompiler, source, compile } from './helpers';
2+
3+
it('should enforce esm for empty module with options.esModule', async (done) => {
4+
const compiler = getCompiler(
5+
'./esm.js',
6+
{ esModule: true },
7+
{
8+
mode: 'production',
9+
optimization: { minimize: false },
10+
}
11+
);
12+
const stats = await compile(compiler);
13+
expect(stats.hasErrors()).toBe(false);
14+
expect(source('./simple.css', stats)).toMatchInlineSnapshot(`
15+
"// extracted by mini-css-extract-plugin
16+
export {};"
17+
`);
18+
done();
19+
});
20+
21+
it('should keep empty module without options.esModule', async (done) => {
22+
const compiler = getCompiler(
23+
'./esm.js',
24+
{},
25+
{
26+
mode: 'production',
27+
optimization: { minimize: false },
28+
}
29+
);
30+
const stats = await compile(compiler);
31+
expect(stats.hasErrors()).toBe(false);
32+
expect(source('./simple.css', stats)).toMatchInlineSnapshot(
33+
`"// extracted by mini-css-extract-plugin"`
34+
);
35+
done();
36+
});

test/fixtures/esm.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import "./simple.css";

test/helpers/getCompiler.js

+9-5
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import { createFsFromVolume, Volume } from 'memfs';
66
import MiniCssExtractPlugin from '../../src';
77

88
export default (fixture, loaderOptions = {}, config = {}) => {
9+
const { outputFileSystem, ...cnfg } = config;
10+
911
const fullConfig = {
1012
mode: 'development',
11-
devtool: config.devtool || false,
13+
devtool: cnfg.devtool || false,
1214
context: path.resolve(__dirname, '../fixtures'),
1315
entry: path.resolve(__dirname, '../fixtures', fixture),
1416
output: {
@@ -40,16 +42,18 @@ export default (fixture, loaderOptions = {}, config = {}) => {
4042
chunkFilename: '[id].css',
4143
}),
4244
],
43-
...config,
45+
...cnfg,
4446
};
4547

4648
const compiler = webpack(fullConfig);
4749

48-
if (!config.outputFileSystem) {
49-
const outputFileSystem = createFsFromVolume(new Volume());
50+
if (!outputFileSystem) {
51+
const outputFS = createFsFromVolume(new Volume());
5052
// Todo remove when we drop webpack@4 support
51-
outputFileSystem.join = path.join.bind(path);
53+
outputFS.join = path.join.bind(path);
5254

55+
compiler.outputFileSystem = outputFS;
56+
} else {
5357
compiler.outputFileSystem = outputFileSystem;
5458
}
5559

test/helpers/index.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import compile from './compile';
22
import getCompiler from './getCompiler';
3+
import source from './source';
34

4-
export { compile, getCompiler };
5+
export { source, compile, getCompiler };

test/helpers/source.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export default function getSource(name, stats) {
2+
const { modules } = stats.toJson({ source: true });
3+
4+
for (let i = 0; i < modules.length; i++) {
5+
const module = modules[i];
6+
7+
if (module.modules && module.modules.length > 0) {
8+
for (let j = 0; j < module.modules.length; j++) {
9+
if (module.modules[j].name === name) {
10+
return module.modules[j].source;
11+
}
12+
}
13+
} else if (module.name === name) {
14+
return module.source;
15+
}
16+
}
17+
18+
return undefined;
19+
}

0 commit comments

Comments
 (0)