Skip to content

Commit 16bbc23

Browse files
authored
fix: getResolve (#99)
1 parent 075e79e commit 16bbc23

File tree

10 files changed

+242
-21
lines changed

10 files changed

+242
-21
lines changed

src/WorkerPool.js

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -212,20 +212,35 @@ class PoolWorker {
212212
break;
213213
}
214214
case 'resolve': {
215-
const { context, request, questionId } = message;
215+
const { context, request, options, questionId } = message;
216216
const { data } = this.jobs[id];
217-
data.resolve(context, request, (error, result) => {
218-
this.writeJson({
219-
type: 'result',
220-
id: questionId,
221-
error: error ? {
222-
message: error.message,
223-
details: error.details,
224-
missing: error.missing,
225-
} : null,
226-
result,
217+
if (options) {
218+
data.getResolve(options)(context, request, (error, result) => {
219+
this.writeJson({
220+
type: 'result',
221+
id: questionId,
222+
error: error ? {
223+
message: error.message,
224+
details: error.details,
225+
missing: error.missing,
226+
} : null,
227+
result,
228+
});
227229
});
228-
});
230+
} else {
231+
data.resolve(context, request, (error, result) => {
232+
this.writeJson({
233+
type: 'result',
234+
id: questionId,
235+
error: error ? {
236+
message: error.message,
237+
details: error.details,
238+
missing: error.missing,
239+
} : null,
240+
result,
241+
});
242+
});
243+
}
229244
finalCallback();
230245
break;
231246
}

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ function pitch() {
2222
emitWarning: this.emitWarning,
2323
loadModule: this.loadModule,
2424
resolve: this.resolve,
25+
getResolve: this.getResolve,
2526
target: this.target,
2627
minimize: this.minimize,
2728
resourceQuery: this.resourceQuery,

src/worker.js

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,18 @@ function writeJson(data) {
101101

102102
const queue = asyncQueue(({ id, data }, taskCallback) => {
103103
try {
104+
const resolveWithOptions = (context, request, callback, options) => {
105+
callbackMap[nextQuestionId] = callback;
106+
writeJson({
107+
type: 'resolve',
108+
id,
109+
questionId: nextQuestionId,
110+
context,
111+
request,
112+
options,
113+
});
114+
nextQuestionId += 1;
115+
};
104116
loaderRunner.runLoaders({
105117
loaders: data.loaders,
106118
resource: data.resource,
@@ -119,15 +131,20 @@ const queue = asyncQueue(({ id, data }, taskCallback) => {
119131
nextQuestionId += 1;
120132
},
121133
resolve: (context, request, callback) => {
122-
callbackMap[nextQuestionId] = callback;
123-
writeJson({
124-
type: 'resolve',
125-
id,
126-
questionId: nextQuestionId,
127-
context,
128-
request,
129-
});
130-
nextQuestionId += 1;
134+
resolveWithOptions(context, request, callback);
135+
},
136+
// eslint-disable-next-line consistent-return
137+
getResolve: options => (context, request, callback) => {
138+
if (callback) {
139+
resolveWithOptions(context, request, callback, options);
140+
} else {
141+
return new Promise((resolve, reject) => {
142+
resolveWithOptions(context, request, (err, result) => {
143+
if (err) reject(err);
144+
else resolve(result);
145+
}, options);
146+
});
147+
}
131148
},
132149
emitWarning: (warning) => {
133150
writeJson({

test/sass-loader-example/_shared.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
body {
2+
background: red;
3+
}

test/sass-loader-example/index.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/* eslint-disable import/no-unresolved */
2+
// some file
3+
import './style.scss?00';
4+
import './style.scss?01';
5+
import './style.scss?02';
6+
import './style.scss?03';
7+
import './style.scss?04';
8+
import './style.scss?05';
9+
import './style.scss?06';
10+
import './style.scss?07';
11+
import './style.scss?08';
12+
import './style.scss?09';
13+
14+
import './style.scss?10';
15+
import './style.scss?11';
16+
import './style.scss?12';
17+
import './style.scss?13';
18+
import './style.scss?14';
19+
import './style.scss?15';
20+
import './style.scss?16';
21+
import './style.scss?17';
22+
import './style.scss?18';
23+
import './style.scss?19';
24+
25+
import './style.scss?20';
26+
import './style.scss?21';
27+
import './style.scss?22';
28+
import './style.scss?23';
29+
import './style.scss?24';
30+
import './style.scss?25';
31+
import './style.scss?26';
32+
import './style.scss?27';
33+
import './style.scss?28';
34+
import './style.scss?29';

test/sass-loader-example/package-lock.json

Lines changed: 60 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/sass-loader-example/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"dependencies": {
3+
"lodash-es": "^4.17.14",
4+
"react": "^16.6.3"
5+
}
6+
}

test/sass-loader-example/style.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@import '_shared';
2+
3+
body {
4+
background: red;
5+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
const path = require('path');
2+
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // eslint-disable-line import/no-extraneous-dependencies
3+
const threadLoader = require('../../src'); // eslint-disable-line import/no-extraneous-dependencies
4+
5+
module.exports = (env) => {
6+
const workerPool = {
7+
workers: +env.threads,
8+
poolTimeout: env.watch ? Infinity : 2000,
9+
};
10+
const workerPoolSass = {
11+
workers: +env.threads,
12+
workerParallelJobs: 2,
13+
poolTimeout: env.watch ? Infinity : 2000,
14+
};
15+
if (+env.threads > 0) {
16+
threadLoader.warmup(workerPool, ['babel-loader', 'babel-preset-env']);
17+
threadLoader.warmup(workerPoolSass, ['sass-loader', 'css-loader']);
18+
}
19+
return {
20+
mode: 'none',
21+
context: __dirname,
22+
entry: ['./index.js'],
23+
output: {
24+
path: path.resolve('dist'),
25+
filename: 'bundle.js',
26+
},
27+
module: {
28+
rules: [
29+
{
30+
test: /\.js$/,
31+
use: [
32+
env.threads !== 0 && {
33+
loader: path.resolve(__dirname, '../../dist/index.js'),
34+
options: workerPool,
35+
},
36+
'babel-loader',
37+
].filter(Boolean),
38+
},
39+
{
40+
test: /\.scss$/,
41+
use: [
42+
MiniCssExtractPlugin.loader,
43+
env.threads !== 0 && {
44+
loader: path.resolve(__dirname, '../../dist/index.js'),
45+
options: workerPoolSass,
46+
},
47+
'css-loader',
48+
'sass-loader',
49+
].filter(Boolean),
50+
},
51+
],
52+
},
53+
plugins: [
54+
new MiniCssExtractPlugin({
55+
filename: 'style.css',
56+
}),
57+
],
58+
stats: {
59+
children: false,
60+
},
61+
};
62+
};

test/webpack.test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import webpack from 'webpack';
2+
import sassLoaderConfig from './sass-loader-example/webpack.config';
3+
4+
test("Processes sass-loader's @import correctly", (done) => {
5+
const config = sassLoaderConfig({});
6+
webpack(config, (err, stats) => {
7+
// eslint-disable-next-line no-console
8+
if (err) console.error(err);
9+
expect(err).toBe(null);
10+
11+
if (stats.hasErrors()) {
12+
// eslint-disable-next-line no-console
13+
console.error(stats.toJson().errors);
14+
}
15+
expect(stats.hasErrors()).toBe(false);
16+
done();
17+
});
18+
}, 30000);

0 commit comments

Comments
 (0)