forked from webpack/less-loader
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
124 lines (114 loc) · 3.41 KB
/
Copy pathindex.js
File metadata and controls
124 lines (114 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var less = require("less");
var path = require("path");
var fs = require("fs");
var loaderUtils = require("loader-utils");
var backslash = /\\/g;
var trailingSlash = /[\\\/]$/;
function formatLessLoaderError(e, filename) {
return new Error(e.message + "\n @ " + filename +
" (line " + e.line + ", column " + e.column + ")");
}
function formatLessRenderError(e) {
// Example ``e``:
// { type: 'Name',
// message: '.undefined-mixin is undefined',
// filename: '/path/to/style.less',
// index: 352,
// line: 31,
// callLine: NaN,
// callExtract: undefined,
// column: 6,
// extract:
// [ ' .my-style {',
// ' .undefined-mixin;',
// ' display: block;' ] }
var extract = e.extract? "\n near lines:\n " + e.extract.join("\n ") : "";
var err = new Error(
e.message + "\n @ " + e.filename +
" (line " + e.line + ", column " + e.column + ")" +
extract
);
err.hideStack = true;
return err;
}
module.exports = function(input) {
this.cacheable && this.cacheable();
var loaderContext = this;
var query = loaderUtils.parseQuery(this.query);
var cb = this.async();
var errored = false;
var rootContext = this.context;
less.Parser.fileLoader = function (url, currentFileInfo, callback) {
var context = currentFileInfo.currentDirectory.replace(trailingSlash, "");
var newFileInfo = {
relativeUrls: true,
entryPath: currentFileInfo.entryPath,
rootFilename: currentFileInfo.rootFilename
};
var moduleRequest = loaderUtils.urlToRequest(url, query.root);
if(cb) {
loaderContext.resolve(context, moduleRequest, function(err, filename) {
if(err) {
if(!errored)
loaderContext.callback(err);
errored = true;
return;
}
loaderContext.dependency && loaderContext.dependency(filename);
filename = normalizePath(filename);
updateFileInfo(newFileInfo, rootContext, filename);
// The default (asynchronous)
loaderContext.loadModule("-!" + __dirname + "/stringify.loader.js!" + filename, function(err, data) {
if(err) {
if(!errored)
loaderContext.callback(err);
errored = true;
return;
}
callback(null, JSON.parse(data), filename, newFileInfo);
});
});
} else {
// Make it synchronous
try {
var filename = loaderContext.resolveSync(context, moduleRequest);
loaderContext.dependency && loaderContext.dependency(filename);
filename = normalizePath(filename);
updateFileInfo(newFileInfo, rootContext, filename);
var data = fs.readFileSync(filename, 'utf-8');
callback(null, data, filename, newFileInfo);
} catch(e) {
try {
callback(e);
} catch(e) {
loaderContext.callback(formatLessLoaderError(e, filename));
}
}
}
};
var resultcb = cb || this.callback;
less.render(input, {
filename: normalizePath(this.resource),
paths: [],
relativeUrls: true,
compress: !!this.minimize
}, function(e, result) {
if(e) return resultcb(formatLessRenderError(e));
resultcb(null, result);
});
};
function updateFileInfo(fileInfo, rootContext, filename) {
fileInfo.filename = filename;
fileInfo.currentDirectory = path.dirname(filename);
fileInfo.rootpath = (path.relative(rootContext, fileInfo.currentDirectory).replace(/\\/g, "/") || ".") + "/";
}
function normalizePath(path) {
if(path.sep === "\\") {
path = path.replace(backslash, "/");
}
return path;
}