Skip to content

Commit c9f6f94

Browse files
authored
Merge pull request #152 from webpack-contrib/update/webpack-2
Update to webpack 2
2 parents 79445fa + 40aa340 commit c9f6f94

File tree

7 files changed

+75
-155
lines changed

7 files changed

+75
-155
lines changed

.editorconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ charset = utf-8
99
end_of_line = lf
1010
insert_final_newline = true
1111
indent_style = tab
12-
indent_size = 2
12+
indent_size = 4
1313

1414
# Matches the exact files either package.json or .travis.yml
1515
[{package.json,.travis.yml}]

index.js

Lines changed: 20 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -6,60 +6,48 @@
66
Johannes Ewald @jhnns
77
*/
88
var less = require("less");
9-
var fs = require("fs");
109
var loaderUtils = require("loader-utils");
11-
var path = require("path");
12-
var util = require("util");
10+
var cloneDeep = require("clone-deep");
1311

1412
var trailingSlash = /[\\\/]$/;
1513

1614
module.exports = function(source) {
1715
var loaderContext = this;
18-
var query = loaderUtils.getOptions(this) || {};
16+
var options = Object.assign(
17+
{
18+
filename: this.resource,
19+
paths: [],
20+
plugins: [],
21+
relativeUrls: true,
22+
compress: Boolean(this.minimize)
23+
},
24+
cloneDeep(loaderUtils.getOptions(this))
25+
);
1926
var cb = this.async();
2027
var isSync = typeof cb !== "function";
2128
var finalCb = cb || this.callback;
22-
var configKey = query.config || "lessLoader";
23-
var config = {
24-
filename: this.resource,
25-
paths: [],
26-
relativeUrls: true,
27-
compress: !!this.minimize
28-
};
2929
var webpackPlugin = {
3030
install: function(less, pluginManager) {
31-
var WebpackFileManager = getWebpackFileManager(less, loaderContext, query, isSync);
31+
var WebpackFileManager = getWebpackFileManager(less, loaderContext, options);
3232

3333
pluginManager.addFileManager(new WebpackFileManager());
3434
},
3535
minVersion: [2, 1, 1]
3636
};
3737

38-
this.cacheable && this.cacheable();
39-
40-
Object.keys(query).forEach(function(attr) {
41-
config[attr] = query[attr];
42-
});
43-
44-
// Now we're adding the webpack plugin, because there might have
45-
// been added some before via query-options.
46-
config.plugins = config.plugins || [];
47-
config.plugins.push(webpackPlugin);
48-
49-
// If present, add custom LESS plugins.
50-
if (this.options[configKey]) {
51-
config.plugins = config.plugins.concat(this.options[configKey].lessPlugins || []);
38+
if (isSync) {
39+
throw new Error("Synchronous compilation is not supported anymore. See https://github.com/webpack-contrib/less-loader/issues/84");
5240
}
5341

54-
// not using the `this.sourceMap` flag because css source maps are different
55-
// @see https://github.com/webpack/css-loader/pull/40
56-
if (query.sourceMap) {
57-
config.sourceMap = {
42+
options.plugins.push(webpackPlugin);
43+
44+
if (options.sourceMap) {
45+
options.sourceMap = {
5846
outputSourceFiles: true
5947
};
6048
}
6149

62-
less.render(source, config, function(e, result) {
50+
less.render(source, options, function(e, result) {
6351
var cb = finalCb;
6452
// Less is giving us double callbacks sometimes :(
6553
// Thus we need to mark the callback as "has been called"
@@ -85,23 +73,10 @@ function getWebpackFileManager(less, loaderContext, query, isSync) {
8573
};
8674

8775
WebpackFileManager.prototype.supportsSync = function(filename, currentDirectory, options, environment) {
88-
return isSync;
76+
return false;
8977
};
9078

9179
WebpackFileManager.prototype.loadFile = function(filename, currentDirectory, options, environment, callback) {
92-
// Unfortunately we don't have any influence on less to call `loadFile` or `loadFileSync`
93-
// thus we need to decide for ourselves.
94-
// @see https://github.com/less/less.js/issues/2325
95-
if (isSync) {
96-
try {
97-
callback(null, this.loadFileSync(filename, currentDirectory, options, environment));
98-
} catch (err) {
99-
callback(err);
100-
}
101-
102-
return;
103-
}
104-
10580
var moduleRequest = loaderUtils.urlToRequest(filename, query.root);
10681
// Less is giving us trailing slashes, but the context should have no trailing slash
10782
var context = currentDirectory.replace(trailingSlash, "");
@@ -128,22 +103,6 @@ function getWebpackFileManager(less, loaderContext, query, isSync) {
128103
});
129104
};
130105

131-
WebpackFileManager.prototype.loadFileSync = util.deprecate(function(filename, currentDirectory, options, environment) {
132-
var moduleRequest = loaderUtils.urlToRequest(filename, query.root);
133-
// Less is giving us trailing slashes, but the context should have no trailing slash
134-
var context = currentDirectory.replace(trailingSlash, "");
135-
var data;
136-
137-
filename = loaderContext.resolveSync(context, moduleRequest);
138-
loaderContext.dependency && loaderContext.dependency(filename);
139-
data = fs.readFileSync(filename, "utf8");
140-
141-
return {
142-
contents: data,
143-
filename: filename
144-
};
145-
}, "We are planing to remove enhanced-require support with the next major release of the less-loader: https://github.com/webpack/less-loader/issues/84");
146-
147106
return WebpackFileManager;
148107
}
149108

package.json

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,22 @@
55
"description": "less loader module for webpack",
66
"scripts": {
77
"test": "npm run travis:test",
8-
"travis:test": "node --no-deprecation node_modules/.bin/_mocha -R spec",
9-
"test-source-map": "webpack --config test/sourceMap/webpack.config.js && open ./test/sourceMap/index.html"
8+
"travis:test": "mocha -R spec"
9+
},
10+
"engines": {
11+
"node": ">=4.0.0"
1012
},
1113
"peerDependencies": {
1214
"less": "^2.3.1"
1315
},
1416
"devDependencies": {
15-
"css-loader": "^0.23.1",
16-
"enhanced-require": "^0.5.0-beta6",
17-
"extract-text-webpack-plugin": "^1.0.1",
17+
"css-loader": "^0.26.2",
18+
"extract-text-webpack-plugin": "^2.1.0",
1819
"less": "^2.6.1",
19-
"mocha": "^2.4.5",
20+
"mocha": "^3.2.0",
2021
"raw-loader": "^0.5.1",
21-
"should": "^8.3.0",
22-
"webpack": "^1.12.14"
22+
"should": "^11.2.0",
23+
"webpack": "^2.2.1"
2324
},
2425
"repository": {
2526
"type": "git",
@@ -32,6 +33,7 @@
3233
}
3334
],
3435
"dependencies": {
36+
"clone-deep": "^0.2.4",
3537
"loader-utils": "^1.0.2"
3638
}
3739
}

test/index.test.js

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
var should = require("should");
44
var path = require("path");
55
var webpack = require("webpack");
6-
var enhancedReqFactory = require("enhanced-require");
76
var fs = require("fs");
87
var moveModulesDir = require("./helpers/moveModulesDir.js");
98

@@ -17,7 +16,7 @@ describe("less-loader", function() {
1716
test("should resolve all imports", "imports");
1817
test("should resolve all imports from bower_components", "imports-bower", {
1918
before: function(config) {
20-
config.resolve.root.push(bowerComponents);
19+
config.resolve.modules.push(bowerComponents);
2120
}
2221
});
2322
test("should resolve all imports from node_modules", "imports-node", {
@@ -34,24 +33,37 @@ describe("less-loader", function() {
3433
test("should transform urls to files above the current directory", "folder/url-path");
3534
test("should transform urls to files above the sibling directory", "folder2/url-path");
3635
test("should generate source-map", "source-map", {
37-
query: "?sourceMap",
36+
options: {
37+
sourceMap: true
38+
},
3839
devtool: "source-map"
3940
});
4041
test("should install plugins", "url-path", {
41-
query: "?config=lessLoaderTest",
42-
lessPlugins: [
43-
{ wasCalled: false, install: function() {this.wasCalled = true;} }
44-
],
42+
options: {
43+
lessPlugins: [
44+
{ wasCalled: false, install: function() {this.wasCalled = true;} }
45+
]
46+
},
4547
after: function(testVariables) {
46-
this.lessPlugins[0].wasCalled.should.be.true;
48+
this.options.lessPlugins[0].wasCalled.should.be.true;
49+
}
50+
});
51+
// See https://github.com/webpack/loader-utils/issues/56
52+
test("should not alter the original options object", "basic", {
53+
options: {
54+
lessPlugins: []
55+
},
56+
after: function() {
57+
// We know that the loader will add its own plugin, but it should not alter the original array
58+
this.options.lessPlugins.should.have.length(0);
4759
}
4860
});
4961
it("should report error correctly", function(done) {
5062
webpack({
5163
entry: path.resolve(__dirname, "../index.js") + "!" +
5264
path.resolve(__dirname, "./less/error.less"),
5365
output: {
54-
path: __dirname + "/output",
66+
path: path.resolve(__dirname, "output"),
5567
filename: "bundle.js"
5668
}
5769
}, function(err, stats) {
@@ -70,58 +82,48 @@ function readCss(id) {
7082
return fs.readFileSync(path.resolve(__dirname, "./css/" + id + ".css") ,"utf8").replace(CR, "");
7183
}
7284

73-
function tryMkdirSync(dirname) {
74-
try {
75-
fs.mkdirSync(dirname);
76-
} catch(e) {
77-
if (!e || e.code !== "EEXIST")
78-
throw e;
79-
}
80-
}
81-
8285
function test(name, id, testOptions) {
8386
testOptions = testOptions || {};
84-
testOptions.query = testOptions.query || "";
87+
testOptions.options = testOptions.options || "";
8588

8689
it(name, function (done) {
8790
var expectedCss = readCss(id);
88-
var lessFile = "raw!" +
89-
pathToLessLoader + testOptions.query + "!" +
90-
path.resolve(__dirname, "./less/" + id + ".less");
91+
var lessFile = path.resolve(__dirname, "./less/" + id + ".less");
9192
var actualCss;
9293
var config = {
9394
resolve: {
94-
root: [
95-
__dirname
95+
modules: [
96+
"node_modules"
9697
]
9798
}
9899
};
99-
var enhancedReq;
100100

101101
testOptions.before && testOptions.before(config);
102102

103-
enhancedReq = enhancedReqFactory(module, config);
104-
105-
// run synchronously
106-
actualCss = enhancedReq(lessFile);
107-
// writing the actual css to output-dir for better debugging
108-
tryMkdirSync(__dirname + "/output/");
109-
fs.writeFileSync(__dirname + "/output/" + name + ".sync.css", actualCss, "utf8");
110-
111-
actualCss.should.eql(expectedCss);
112-
113103
// run asynchronously
114104
webpack({
115105
entry: lessFile,
106+
context: __dirname,
116107
devtool: testOptions.devtool,
117108
resolve: config.resolve,
118109
output: {
119-
path: __dirname + "/output",
110+
path: path.resolve(__dirname, "output"),
120111
filename: "bundle.js",
121112
libraryTarget: "commonjs2"
122113
},
123-
lessLoaderTest: {
124-
lessPlugins: testOptions.lessPlugins || []
114+
module: {
115+
rules: [
116+
{
117+
test: /\.less$/,
118+
use: [
119+
"raw-loader",
120+
{
121+
loader: pathToLessLoader,
122+
options: testOptions.options
123+
}
124+
]
125+
}
126+
]
125127
}
126128
}, function onCompilationFinished(err, stats) {
127129
var actualMap;
@@ -139,16 +141,16 @@ function test(name, id, testOptions) {
139141

140142
actualCss = require("./output/bundle.js");
141143
// writing the actual css to output-dir for better debugging
142-
fs.writeFileSync(__dirname + "/output/" + name + ".async.css", actualCss, "utf8");
144+
fs.writeFileSync(path.resolve(__dirname, "output", name + ".async.css"), actualCss, "utf8");
143145
actualCss.should.eql(expectedCss);
144146

145147
testOptions.after && testOptions.after();
146148

147149
if (testOptions.devtool === "source-map") {
148-
actualMap = fs.readFileSync(__dirname + "/output/bundle.js.map", "utf8");
149-
fs.writeFileSync(__dirname + "/output/" + name + ".sync.css.map", actualMap, "utf8");
150+
actualMap = fs.readFileSync(path.resolve(__dirname, "output", "bundle.js.map"), "utf8");
151+
fs.writeFileSync(path.resolve(__dirname, "output", name + ".sync.css.map"), actualMap, "utf8");
150152
actualMap = JSON.parse(actualMap);
151-
actualMap.sources.should.containEql("webpack:///./test/less/" + id + ".less");
153+
actualMap.sources.should.containEql("webpack:///./less/" + id + ".less");
152154
}
153155

154156
done();

test/sourceMap/entry.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

test/sourceMap/index.html

Lines changed: 0 additions & 11 deletions
This file was deleted.

test/sourceMap/webpack.config.js

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)