Skip to content

Commit 74b86e0

Browse files
insinjoshwiens
authored andcommitted
feat(extract): return an array of loader objects (faceyspacey#343)
* Return an array of loader objects from extract() From tmair/extract-text-webpack-plugin@1414036 * Add unit tests for ExtractTextPlugin.extract() Use "options" for own loader options Also use "options" as a check for loader being specified as a loader object
1 parent c8494f3 commit 74b86e0

File tree

2 files changed

+152
-10
lines changed

2 files changed

+152
-10
lines changed

index.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,11 @@ function ExtractTextPlugin(options) {
128128
}
129129
module.exports = ExtractTextPlugin;
130130

131-
// modified from webpack/lib/LoadersList.js
132-
function getLoaderWithQuery(loader) {
133-
if(isString(loader)) return loader;
134-
if(!loader.query) return loader.loader;
135-
var query = isString(loader.query) ? loader.query : JSON.stringify(loader.query);
136-
return loader.loader + "?" + query;
131+
function getLoaderObject(loader) {
132+
if (isString(loader)) {
133+
return {loader: loader};
134+
}
135+
return loader;
137136
}
138137

139138
function mergeOptions(a, b) {
@@ -149,7 +148,7 @@ function isString(a) {
149148
}
150149

151150
ExtractTextPlugin.loader = function(options) {
152-
return { loader: require.resolve("./loader"), query: options };
151+
return { loader: require.resolve("./loader"), options: options };
153152
};
154153

155154
ExtractTextPlugin.prototype.applyAdditionalInformation = function(source, info) {
@@ -180,7 +179,7 @@ ExtractTextPlugin.prototype.extract = function(options) {
180179
" fallbackLoader: string | object | loader[]\n" +
181180
" publicPath: string\n");
182181
}
183-
if(Array.isArray(options) || isString(options) || typeof options.query === "object") {
182+
if(Array.isArray(options) || isString(options) || typeof options.options === "object" || typeof options.query === 'object') {
184183
options = { loader: options };
185184
}
186185
var loader = options.loader;
@@ -198,8 +197,7 @@ ExtractTextPlugin.prototype.extract = function(options) {
198197
delete options.fallbackLoader;
199198
return [this.loader(options)]
200199
.concat(before, loader)
201-
.map(getLoaderWithQuery)
202-
.join("!");
200+
.map(getLoaderObject);
203201
}
204202

205203
ExtractTextPlugin.extract = ExtractTextPlugin.prototype.extract.bind(ExtractTextPlugin);

test/extract.test.js

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
var should = require("should");
2+
var ExtractTextPlugin = require("../");
3+
4+
var loaderPath = require.resolve("../loader.js");
5+
6+
describe("ExtractTextPlugin.extract()", function() {
7+
it("throws if given multiple arguments", function() {
8+
should.throws(function() {
9+
ExtractTextPlugin.extract("style-loader", "css-loader");
10+
});
11+
});
12+
13+
context("specifying loader", function() {
14+
it("accepts a loader string", function() {
15+
ExtractTextPlugin.extract("css-loader").should.deepEqual([
16+
{ loader: loaderPath, options: { omit: 0, remove:true } },
17+
{ loader: "css-loader" }
18+
]);
19+
});
20+
21+
it("accepts a chained loader string", function() {
22+
ExtractTextPlugin.extract(
23+
"css-loader!postcss-loader!sass-loader"
24+
).should.deepEqual([
25+
{ loader: loaderPath, options: { omit: 0, remove:true } },
26+
{ loader: "css-loader" },
27+
{ loader: "postcss-loader" },
28+
{ loader: "sass-loader" }
29+
]);
30+
});
31+
32+
it("accepts an array of loader names", function() {
33+
ExtractTextPlugin.extract(
34+
["css-loader", "postcss-loader", "sass-loader"]
35+
).should.deepEqual([
36+
{ loader: loaderPath, options: { omit: 0, remove:true } },
37+
{ loader: "css-loader" },
38+
{ loader: "postcss-loader" },
39+
{ loader: "sass-loader" }
40+
]);
41+
});
42+
43+
it("accepts a loader object", function() {
44+
ExtractTextPlugin.extract({ loader: "css-loader" }).should.deepEqual([
45+
{ loader: loaderPath, options: { omit: 0, remove:true } },
46+
{ loader: "css-loader" }
47+
]);
48+
});
49+
50+
it("accepts a loader object with an options object", function() {
51+
ExtractTextPlugin.extract(
52+
{ loader: "css-loader", options: { modules: true } }
53+
).should.deepEqual([
54+
{ loader: loaderPath, options: { omit: 0, remove:true } },
55+
{ loader: "css-loader", options: { modules: true } }
56+
]);
57+
});
58+
59+
it("accepts a loader object with a (legacy) query object", function() {
60+
ExtractTextPlugin.extract(
61+
{ loader: "css-loader", query: { modules: true } }
62+
).should.deepEqual([
63+
{ loader: loaderPath, options: { omit: 0, remove:true } },
64+
{ loader: "css-loader", query: { modules: true } }
65+
]);
66+
});
67+
68+
it("accepts an array of loader objects", function() {
69+
ExtractTextPlugin.extract([
70+
{ loader: "css-loader" },
71+
{ loader: "postcss-loader" },
72+
{ loader: "sass-loader" }
73+
]).should.deepEqual([
74+
{ loader: loaderPath, options: { omit: 0, remove:true } },
75+
{ loader: "css-loader" },
76+
{ loader: "postcss-loader" },
77+
{ loader: "sass-loader" }
78+
]);
79+
});
80+
})
81+
82+
context("specifying fallbackLoader", function() {
83+
it("accepts a fallbackLoader string", function() {
84+
ExtractTextPlugin.extract({
85+
fallbackLoader: "style-loader",
86+
loader: "css-loader"
87+
}).should.deepEqual([
88+
{ loader: loaderPath, options: { omit: 1, remove: true } },
89+
{ loader: "style-loader" },
90+
{ loader: "css-loader" }
91+
]);
92+
});
93+
94+
it("accepts a chained fallbackLoader string", function() {
95+
ExtractTextPlugin.extract({
96+
fallbackLoader: "something-loader!style-loader",
97+
loader: "css-loader"
98+
}).should.deepEqual([
99+
{ loader: loaderPath, options: { omit: 2, remove: true } },
100+
{ loader: "something-loader" },
101+
{ loader: "style-loader" },
102+
{ loader: "css-loader" }
103+
]);
104+
});
105+
106+
it("accepts a fallbackLoader object", function() {
107+
ExtractTextPlugin.extract({
108+
fallbackLoader: { loader: "style-loader" },
109+
loader: "css-loader"
110+
}).should.deepEqual([
111+
{ loader: loaderPath, options: { omit: 1, remove: true } },
112+
{ loader: "style-loader" },
113+
{ loader: "css-loader" }
114+
]);
115+
});
116+
117+
it("accepts an array of fallbackLoader objects", function() {
118+
ExtractTextPlugin.extract({
119+
fallbackLoader: [
120+
{ loader: "something-loader" },
121+
{ loader: "style-loader" }
122+
],
123+
loader: "css-loader"
124+
}).should.deepEqual([
125+
{ loader: loaderPath, options: { omit: 2, remove: true } },
126+
{ loader: "something-loader" },
127+
{ loader: "style-loader" },
128+
{ loader: "css-loader" }
129+
]);
130+
});
131+
});
132+
133+
it("passes additional options to its own loader", function() {
134+
ExtractTextPlugin.extract({
135+
fallbackLoader: "style-loader",
136+
loader: "css-loader",
137+
publicPath: "/test"
138+
}).should.deepEqual([
139+
{ loader: loaderPath, options: { omit: 1, remove: true, publicPath: "/test" } },
140+
{ loader: "style-loader" },
141+
{ loader: "css-loader" }
142+
]);
143+
});
144+
});

0 commit comments

Comments
 (0)