less-loader
Advanced tools
Comparing version 0.7.8 to 2.0.0
228
index.js
@@ -0,16 +1,129 @@ | ||
"use strict"; | ||
/* | ||
MIT License http://www.opensource.org/licenses/mit-license.php | ||
Author Tobias Koppers @sokra | ||
Authors | ||
Tobias Koppers @sokra | ||
Johannes Ewald @jhnns | ||
*/ | ||
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 + ")"); | ||
module.exports = function(input) { | ||
var loaderContext = this; | ||
var query = loaderUtils.parseQuery(this.query); | ||
var cb = this.async(); | ||
var isSync = typeof cb !== "function"; | ||
var finalCb = cb || this.callback; | ||
var config = { | ||
filename: this.resource, | ||
paths: [], | ||
relativeUrls: true, | ||
compress: !!this.minimize | ||
}; | ||
var webpackPlugin = { | ||
install: function(less, pluginManager) { | ||
var WebpackFileManager = getWebpackFileManager(less, loaderContext, query, isSync); | ||
pluginManager.addFileManager(new WebpackFileManager()); | ||
}, | ||
minVersion: [2, 1, 1] | ||
}; | ||
this.cacheable && this.cacheable(); | ||
Object.keys(query).forEach(function(attr) { | ||
config[attr] = query[attr]; | ||
}); | ||
// Now we're adding the webpack plugin, because there might have | ||
// been added some before via query-options. | ||
config.plugins = config.plugins || []; | ||
config.plugins.push(webpackPlugin); | ||
less.render(input, config, function(e, result) { | ||
var cb = finalCb; | ||
// Less is giving us double callbacks sometimes :( | ||
// Thus we need to mark the callback as "has been called" | ||
if(!finalCb) return; | ||
finalCb = null; | ||
if(e) return cb(formatLessRenderError(e)); | ||
cb(null, result.css); | ||
}); | ||
}; | ||
function getWebpackFileManager(less, loaderContext, query, isSync) { | ||
function WebpackFileManager() { | ||
less.FileManager.apply(this, arguments); | ||
} | ||
WebpackFileManager.prototype = Object.create(less.FileManager.prototype); | ||
WebpackFileManager.prototype.supports = function(filename, currentDirectory, options, environment) { | ||
// Our WebpackFileManager handles all the files | ||
return true; | ||
}; | ||
WebpackFileManager.prototype.supportsSync = WebpackFileManager.prototype.supports; | ||
WebpackFileManager.prototype.loadFile = function(filename, currentDirectory, options, environment, callback) { | ||
// Unfortunately we don't have any influence on less to call `loadFile` or `loadFileSync` | ||
// thus we need to decide for ourselves. | ||
// @see https://github.com/less/less.js/issues/2325 | ||
if (isSync) { | ||
try { | ||
callback(null, this.loadFileSync(filename, currentDirectory, options, environment)); | ||
} catch (err) { | ||
callback(err); | ||
} | ||
return; | ||
} | ||
var moduleRequest = loaderUtils.urlToRequest(filename, query.root); | ||
// Less is giving us trailing slashes, but the context should have no trailing slash | ||
var context = currentDirectory.replace(trailingSlash, ""); | ||
loaderContext.resolve(context, moduleRequest, function(err, filename) { | ||
if(err) { | ||
callback(err); | ||
return; | ||
} | ||
loaderContext.dependency && loaderContext.dependency(filename); | ||
// The default (asynchronous) | ||
loaderContext.loadModule("-!" + __dirname + "/stringify.loader.js!" + filename, function(err, data) { | ||
if(err) { | ||
callback(err); | ||
return; | ||
} | ||
callback(null, { | ||
contents: JSON.parse(data), | ||
filename: filename | ||
}); | ||
}); | ||
}); | ||
}; | ||
WebpackFileManager.prototype.loadFileSync = function(filename, currentDirectory, options, environment) { | ||
var moduleRequest = loaderUtils.urlToRequest(filename, query.root); | ||
// Less is giving us trailing slashes, but the context should have no trailing slash | ||
var context = currentDirectory.replace(trailingSlash, ""); | ||
var data; | ||
filename = loaderContext.resolveSync(context, moduleRequest); | ||
loaderContext.dependency && loaderContext.dependency(filename); | ||
data = fs.readFileSync(filename, "utf8"); | ||
return { | ||
contents: data, | ||
filename: filename | ||
}; | ||
}; | ||
return WebpackFileManager; | ||
} | ||
@@ -41,104 +154,1 @@ | ||
} | ||
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) { | ||
if(!errored) | ||
loaderContext.callback(formatLessLoaderError(e, filename)); | ||
errored = true; | ||
} | ||
} | ||
} | ||
}; | ||
var resultcb = cb || this.callback; | ||
var lessOptions = [ | ||
'paths', 'optimization', 'filename', 'strictImports', 'syncImport', 'dumpLineNumbers', 'relativeUrls', | ||
'rootpath', 'compress', 'cleancss', 'cleancssOptions', 'ieCompat', 'strictMath', 'strictUnits', 'urlArgs', | ||
'sourceMap', 'sourceMapFilename', 'sourceMapURL', 'sourceMapBasepath', 'sourceMapRootpath', 'outputSourceFiles' | ||
]; | ||
var config = { | ||
filename: normalizePath(this.resource), | ||
paths: [], | ||
relativeUrls: true, | ||
compress: !!this.minimize | ||
}; | ||
Object.keys(query).forEach(function(attr) { | ||
if (lessOptions.indexOf(attr) >= 0) { | ||
config[attr] = query[attr]; | ||
} else if(attr !== "root") { | ||
throw new Error('less-loader: attr ' + attr + ' is not a valid less configuration option') | ||
} | ||
}); | ||
less.render(input, config, function(e, result) { | ||
if(errored) return; | ||
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; | ||
} |
{ | ||
"name": "less-loader", | ||
"version": "0.7.8", | ||
"version": "2.0.0", | ||
"author": "Tobias Koppers @sokra", | ||
"description": "less loader module for webpack", | ||
"scripts": { | ||
"test": "node node_modules/mocha/bin/mocha -R spec" | ||
"test": "mocha -R spec" | ||
}, | ||
"peerDependencies": { | ||
"less": "^1.5" | ||
"less": "^2.1.1" | ||
}, | ||
"devDependencies": { | ||
"should": "^3.3.1", | ||
"mocha": "^1.18.2", | ||
"webpack": "^1.1.8", | ||
"enhanced-require": "^0.5.0-beta6", | ||
"less": "^2.1.1", | ||
"mocha": "^2.0.1", | ||
"raw-loader": "^0.5.1", | ||
"enhanced-require": "^0.5.0-beta6" | ||
"should": "^4.4.1", | ||
"webpack": "^1.1.8" | ||
}, | ||
@@ -19,0 +20,0 @@ "repository": { |
@@ -86,4 +86,6 @@ # less loader for webpack | ||
[![build status](https://travis-ci.org/webpack/less-loader.svg)](https://travis-ci.org/webpack/less-loader) | ||
## License | ||
MIT (http://www.opensource.org/licenses/mit-license.php) |
@@ -8,2 +8,2 @@ /* | ||
return JSON.stringify(source); | ||
} | ||
}; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
8543
6
1
91
6
1