jade-loader
Advanced tools
Comparing version
175
index.js
@@ -6,23 +6,172 @@ /* | ||
var path = require("path"); | ||
var dirname = path.dirname; | ||
var loaderUtils = require("loader-utils"); | ||
module.exports = function(source) { | ||
this.cacheable && this.cacheable(); | ||
var jade = require("jade"); | ||
var runtime = "var jade = require("+JSON.stringify(require.resolve("jade/lib/runtime"))+");\n\n"; | ||
var utils = require("jade/lib/utils"); | ||
var nodes = require("jade/lib/nodes"); | ||
var filters = require("jade/lib/filters"); | ||
var req = loaderUtils.getRemainingRequest(this).replace(/^!/, ""); | ||
var query = loaderUtils.parseQuery(this.query); | ||
var tmplFunc = jade.compile(source, { | ||
filename: req, | ||
client: true, | ||
self: query.self, | ||
pretty: query.pretty, | ||
locals: query.locals, | ||
compileDebug: this.debug || false | ||
}); | ||
var debugSource = ""; | ||
if(this.debug) { | ||
debugSource = "require(" + JSON.stringify(path.join(__dirname, "web_modules", "fs")) + ").setFile(" + JSON.stringify(req) + ", " + JSON.stringify(source) + ");"; | ||
var loadModule = this.loadModule; | ||
var resolve = this.resolve; | ||
var loaderContext = this; | ||
var callback; | ||
var fileContents = {}; | ||
var filePaths = {}; | ||
function MyParser(str, filename, options) { | ||
this._mustBeInlined = false; | ||
jade.Parser.call(this, str, filename, options); | ||
} | ||
return runtime + debugSource + "module.exports = " + tmplFunc.toString(); | ||
MyParser.prototype = Object.create(jade.Parser.prototype); | ||
MyParser.prototype.constructor = MyParser; | ||
var missingFileMode = false; | ||
function getFileContent(context, request) { | ||
request = /^~/.test(request) ? request.substr(1) : "./" + request; | ||
var baseRequest = request; | ||
var filePath = filePaths[context + " " + request]; | ||
if(filePath) return filePath; | ||
var isSync = true; | ||
resolve(context, request + ".jade", function(err, _request) { | ||
if(err) { | ||
resolve(context, request, function(err2, _request) { | ||
if(err2) return callback(err2); | ||
request = _request; | ||
next(); | ||
}); | ||
} | ||
request = _request; | ||
next(); | ||
function next() { | ||
loadModule("-!" + path.join(__dirname, "stringify.loader.js") + "!" + request, function(err, source) { | ||
if(err) return callback(err); | ||
filePaths[context + " " + baseRequest] = request; | ||
fileContents[request] = JSON.parse(source); | ||
if(!isSync) { | ||
run(); | ||
} else { | ||
isSync = false; | ||
} | ||
}); | ||
} | ||
}); | ||
if(isSync) { | ||
isSync = false; | ||
missingFileMode = true; | ||
throw "continue"; | ||
} else { | ||
return filePaths[context + " " + baseRequest]; | ||
} | ||
} | ||
MyParser.prototype.parseMixin = function() { | ||
this._mustBeInlined = true; | ||
return jade.Parser.prototype.parseMixin.call(this); | ||
}; | ||
MyParser.prototype.parseBlock = function() { | ||
this._mustBeInlined = true; | ||
return jade.Parser.prototype.parseBlock.call(this); | ||
}; | ||
MyParser.prototype.parseExtends = function() { | ||
if(!callback) callback = loaderContext.async(); | ||
if(!callback) return jade.Parser.prototype.parseExtends.call(this); | ||
var request = this.expect('extends').val.trim(); | ||
var context = dirname(this.filename.split("!").pop()); | ||
var path = getFileContent(context, request); | ||
var str = fileContents[path]; | ||
var parser = new this.constructor(str, path, this.options); | ||
parser.blocks = this.blocks; | ||
parser.contexts = this.contexts; | ||
this.extending = parser; | ||
return new nodes.Literal(''); | ||
}; | ||
MyParser.prototype.parseInclude = function() { | ||
if(!callback) callback = loaderContext.async(); | ||
if(!callback) return jade.Parser.prototype.parseInclude.call(this); | ||
var tok = this.expect('include'); | ||
var request = tok.val.trim(); | ||
var context = dirname(this.filename.split("!").pop()); | ||
var path = getFileContent(context, request); | ||
var str = fileContents[path]; | ||
// has-filter | ||
if (tok.filter) { | ||
var str = str.replace(/\r/g, ''); | ||
str = filters(tok.filter, str, { filename: path }); | ||
return new nodes.Literal(str); | ||
} | ||
// non-jade | ||
if ('.jade' != path.substr(-5)) { | ||
var str = str.replace(/\r/g, ''); | ||
return new nodes.Literal(str); | ||
} | ||
var parser = new this.constructor(str, path, this.options); | ||
parser.blocks = utils.merge({}, this.blocks); | ||
parser.mixins = this.mixins; | ||
this.context(parser); | ||
var ast = parser.parse(); | ||
this.context(); | ||
ast.filename = path; | ||
if ('indent' == this.peek().type) { | ||
ast.includeBlock().push(this.block()); | ||
} else if(!parser._mustBeInlined) { | ||
ast = new nodes.Code("require(" + JSON.stringify(path) + ").call(this, locals)", true, false); | ||
ast.line = this.line(); | ||
} | ||
if(parser._mustBeInlined) this._mustBeInlined = true; | ||
return ast; | ||
} | ||
run(); | ||
function run() { | ||
try { | ||
var tmplFunc = jade.compileClient(source, { | ||
parser: loadModule ? MyParser : undefined, | ||
filename: req, | ||
self: query.self, | ||
globals: ["require"].concat(query.globals || []), | ||
pretty: query.pretty, | ||
locals: query.locals, | ||
compileDebug: loaderContext.debug || false | ||
}); | ||
} catch(e) { | ||
if(missingFileMode) { | ||
// Ignore, it'll continue after async action | ||
missingFileMode = false; | ||
return; | ||
} | ||
throw e; | ||
} | ||
var runtime = "var jade = require("+JSON.stringify(require.resolve("jade/lib/runtime"))+");\n\n"; | ||
loaderContext.callback(null, runtime + "module.exports = " + tmplFunc.toString()); | ||
} | ||
} | ||
module.exports.seperable = true; |
{ | ||
"name": "jade-loader", | ||
"version": "0.5.2", | ||
"version": "0.6.0", | ||
"author": "Tobias Koppers @sokra", | ||
"description": "jade loader module for webpack", | ||
"dependencies": { | ||
"loader-utils": "0.2.x", | ||
"jade": "0.28.x" | ||
"loader-utils": "0.2.x" | ||
}, | ||
"peerDependencies": { | ||
"jade": "1.3.x" | ||
}, | ||
"devDependencies": { | ||
"mocha": "*", | ||
"should": "*" | ||
}, | ||
"scripts": { | ||
"test": "mocha -R spec" | ||
}, | ||
"licenses": [ | ||
@@ -11,0 +20,0 @@ { |
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
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
7711
326.26%11
120%202
621.43%2
Infinity%3
200%1
Infinity%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed