enhanced-resolve
Advanced tools
Comparing version 0.4.1 to 0.4.2
@@ -56,3 +56,3 @@ /* | ||
var pathname = resource.path[0] === "." ? join(split(context), split(resource.path)) : resource.path; | ||
if(type === "context") { | ||
if(type === "context" || type === "loader-context") { | ||
(sync?statSync:statAsync)(pathname, function(err, stat) { | ||
@@ -194,2 +194,269 @@ if(err) { | ||
function doComplete(context, identifier, options, type, sync, callback) { | ||
var request; | ||
try { | ||
request = parse(identifier); | ||
} catch(e) { return callback(e); } | ||
if(request.loaders) { | ||
(sync?iterateSync:iterateAsync)(request.loaders, function(loader, idx, next) { | ||
completePart(context, loader, options, "loader", sync, function(err, result) { | ||
if(err) return callback(err); | ||
if(!result) return next(); | ||
result.forEach(function(item) { | ||
request.loaders[idx] = parse.part(item.part); | ||
item.result = stringify(request); | ||
}); | ||
return callback(null, sortCompleteResults(result)); | ||
}); | ||
}, function() { | ||
continueResource(); | ||
}); | ||
} else continueResource(); | ||
function continueResource() { | ||
if(request.resource && request.resource.path) { | ||
// try it as resource and as loader | ||
completePart(context, request.resource, options, type, sync, function(err, result) { | ||
if(err) return callback(err); | ||
if(result) | ||
result.forEach(function(item) { | ||
var oldResource = request.resource; | ||
request.resource = parse.part(item.part); | ||
item.result = stringify(request); | ||
request.resource = oldResource; | ||
}); | ||
if(!result) result = []; | ||
if(request.resource.path.slice(-1) == "*" && request.resource.query === null) { | ||
completePart(context, request.resource, options, "loader", sync, function(err, resultLoader) { | ||
request.resource = null; | ||
if(err) return callback(err); | ||
if(resultLoader) { | ||
resultLoader.forEach(function(item) { | ||
if(result.filter(function(ri) { | ||
return ri.insert == item.insert; | ||
}).length > 0) return; | ||
if(!request.loaders) request.loaders = []; | ||
request.loaders.push(parse.part(item.part)); | ||
item.result = stringify(request); | ||
request.loaders.pop(); | ||
item.seqment += "!"; | ||
item.insert += "!"; | ||
result.push(item); | ||
}); | ||
} | ||
return callback(null, sortCompleteResults(result)); | ||
}); | ||
} else | ||
return callback(null, sortCompleteResults(result)); | ||
}); | ||
} else callback(null, null); | ||
} | ||
} | ||
function sortCompleteResults(results) { | ||
results.sort(function(a, b) { | ||
if(a.insert == b.insert) return 0; | ||
return a.insert < b.insert ? -1 : 1; | ||
}); | ||
for(var i = 1; i < results.length; i++) { | ||
if(results[i].insert == results[i-1].insert) { | ||
results.splice(i, 1); | ||
i--; | ||
} | ||
} | ||
return results; | ||
} | ||
function completePart(context, part, options, type, sync, callback) { | ||
if(!part.path) return callback(); | ||
var idx = part.path.indexOf("*"); | ||
if(idx < 0) return callback(); | ||
switch(part.path) { | ||
case ".*": | ||
return callback(null, [ | ||
{ | ||
insert: "/", | ||
seqment: "./", | ||
part: part.query ? "./" + part.query : "./" | ||
}, | ||
{ | ||
insert: "./", | ||
seqment: "../", | ||
part: part.query ? "../" + part.query : "../" | ||
} | ||
]); | ||
case "..*": | ||
return callback(null, [ | ||
{ | ||
insert: "/", | ||
seqment: "../", | ||
part: part.query ? "../" + part.query : "../" | ||
} | ||
]); | ||
} | ||
if(part.path.slice(-3) == "/.*") { | ||
return callback(null, [ | ||
{ | ||
insert: "./", | ||
seqment: "../", | ||
part: part.path.replace("*", "./") + (part.query ? part.query : "") | ||
} | ||
]); | ||
} | ||
if(part.path.slice(-4) == "/..*") { | ||
return callback(null, [ | ||
{ | ||
insert: "/", | ||
seqment: "../", | ||
part: part.path.replace("*", "/") + (part.query ? part.query : "") | ||
} | ||
]); | ||
} | ||
if(part.module) { | ||
var idxSlash = part.path.indexOf("/"); | ||
if(idxSlash < 0 || idx < idxSlash) { | ||
// It's a module string to compele | ||
var moduleStr = idxSlash >= 0 ? part.path.slice(0, idxSlash) : part.path; | ||
return completeModule(context, moduleStr, options, type, sync, function(err, result) { | ||
if(err) return callback(err); | ||
if(!result) return callback(null, null); | ||
result.forEach(function(item) { | ||
var oldPath = part.path; | ||
part.path = part.path.replace("*", item.insert); | ||
item.part = stringify.part(part); | ||
part.path = oldPath; | ||
}); | ||
if(part.path.slice(0, 1) == "*" && part.path.slice(1, 2) != "/") { | ||
result.unshift({ | ||
insert: "./", | ||
seqment: "./", | ||
part: part.query ? "./" + part.path.slice(1) + part.query : "./" + part.path.slice(1) | ||
}, { | ||
insert: "../", | ||
seqment: "../", | ||
part: part.query ? "../" + part.path.slice(1) + part.query : "../" + part.path.slice(1) | ||
}); | ||
} | ||
return callback(null, result); | ||
}); | ||
} | ||
} | ||
var idxStarting1 = part.path.slice(0, idx).lastIndexOf("/"); | ||
var idxStarting2 = part.path.slice(0, idx).lastIndexOf("\\"); | ||
var idxStarting = Math.max(idxStarting1, idxStarting2); | ||
if(idxStarting < 0) return callback(null, null); | ||
var starting = part.path.slice(0, idxStarting); | ||
var idxSeqmentEnd1 = part.path.slice(idx).indexOf("/"); | ||
if(idxSeqmentEnd1 < 0) | ||
idxSeqmentEnd1 = part.path.length; | ||
else | ||
idxSeqmentEnd1 = idx + idxSeqmentEnd1; | ||
var idxSeqmentEnd2 = part.path.slice(idx).indexOf("\\"); | ||
if(idxSeqmentEnd2 < 0) | ||
idxSeqmentEnd2 = part.path.length; | ||
else | ||
idxSeqmentEnd2 = idx + idxSeqmentEnd2; | ||
var idxSeqmentEnd = Math.min(idxSeqmentEnd1, idxSeqmentEnd2); | ||
var seqmentStart = part.path.slice(idxStarting+1, idx); | ||
var seqmentEnd = part.path.slice(idx+1, idxSeqmentEnd); | ||
var pathEnd = part.path.slice(idxSeqmentEnd); | ||
resolve(context, parse.part(starting), options, type === "loader" ? "loader-context" : "context", sync, function(err, resolvedStarting) { | ||
if(err) return callback(err); | ||
var dirname = resolvedStarting.path; | ||
(sync?readdirSync:readdirAsync)(dirname, function(err, files) { | ||
if(err) return callback(err); | ||
var results = []; | ||
var count = 1; | ||
var extensions = type === "loader" ? options.loaderExtensions : options.extensions; | ||
var seqments = cutExtensions(files, extensions); | ||
seqments.forEach(function(file) { | ||
if(file.indexOf(seqmentStart) !== 0) return; | ||
if(file.length < seqmentEnd.length || file.lastIndexOf(seqmentEnd) !== file.length - seqmentEnd.length) return; | ||
count++; | ||
(sync?statSync:statAsync)(path.join(dirname, findFileExtensionFromList(files, extensions, file)), function(err, stat) { | ||
if(err) return endOne(err); | ||
if(seqmentEnd === "" && pathEnd === "" && stat.isDirectory()) { | ||
results.push({ | ||
insert: file.slice(seqmentStart.length) + "/", | ||
seqment: file + "/", | ||
part: starting + "/" + file + "/" + (part.query ? part.query : "") | ||
}); | ||
} | ||
results.push({ | ||
insert: file.slice(seqmentStart.length, file.length - seqmentEnd.length), | ||
seqment: file, | ||
part: starting + "/" + file + pathEnd + (part.query ? part.query : "") | ||
}); | ||
return endOne(); | ||
}); | ||
}); | ||
endOne(); | ||
var errored = false; | ||
function endOne(err) { | ||
if(errored) return; | ||
if(err) return callback(err); | ||
if(--count == 0) | ||
return callback(null, results); | ||
} | ||
}); | ||
}); | ||
} | ||
function cutExtensions(files, extensions) { | ||
var set = {}; | ||
files.forEach(function(file) { | ||
extensions.forEach(function(ext) { | ||
if(file.length < ext.length) return; | ||
if(file.lastIndexOf(ext) != file.length - ext.length) return; | ||
set[file.slice(0, file.length - ext.length)] = true; | ||
}); | ||
}); | ||
return Object.keys(set); | ||
} | ||
function findFileExtensionFromList(files, extensions, file) { | ||
for(var i = 0; i < extensions.length; i++) { | ||
if(files.indexOf(file + extensions[i]) >= 0) | ||
return file + extensions[i]; | ||
} | ||
return file; | ||
} | ||
function completeModule(context, identifier, options, type, sync, callback) { | ||
var idx = identifier.indexOf("*"); | ||
if(idx < 0) return callback(); | ||
var starting = identifier.slice(0, idx); | ||
var ending = identifier.slice(idx+1); | ||
var results = []; | ||
var paths = modulesDirectoriesPaths(context, options); | ||
options.paths.forEach(function(path) { | ||
paths.push(path); | ||
}); | ||
var count = paths.length; | ||
paths.forEach(function(path) { | ||
(sync?statSync:statAsync)(path, function(err, stat) { | ||
if(err || !stat || !stat.isDirectory()) | ||
return endOne(); | ||
(sync?readdirSync:readdirAsync)(path, function(err, files) { | ||
files = cutExtensions(files, type === "loader" ? options.loaderPostfixes : options.postfixes); | ||
files.forEach(function(file) { | ||
if(file.indexOf(starting) != 0) return; | ||
if(file.length < ending.length || file.lastIndexOf(ending) != file.length - ending.length) return; | ||
results.push({ | ||
insert: file.slice(starting.length, file.length - ending.length), | ||
seqment: file | ||
}); | ||
}); | ||
endOne(); | ||
}); | ||
}); | ||
}); | ||
function endOne() { | ||
if(--count == 0) { | ||
return callback(null, results); | ||
} | ||
} | ||
} | ||
/** | ||
@@ -312,2 +579,31 @@ * sets not defined options to node.js defaults | ||
/** | ||
* Complete identifier at "*". | ||
* Returns an array of possibilities: (i. e. "loader!module/fi*.js?query") | ||
* [{ | ||
* insert: "le", // text to insert | ||
* seqment: "file.js", | ||
* result: "loader!module/file.js?query" | ||
* }] | ||
* returns an empty array if there are no valid possibilities "missingMod*" | ||
* returns null if there is nothing to complete "module?qu*" | ||
* throws an exception if there are multiple/no "*" | ||
*/ | ||
resolveFunction.complete = function(context, identifier, options, callback) { | ||
if(!callback) { | ||
callback = options; | ||
options = {}; | ||
} | ||
options = setupDefaultOptions(options); | ||
return doComplete(context, identifier, options, "normal", false, callback); | ||
} | ||
resolveFunction.complete.sync = function(context, identifier, options) { | ||
if(!options) options = {}; | ||
options = setupDefaultOptions(options); | ||
var callback = createSyncCallback(); | ||
doComplete(context, identifier, options, "normal", true, callback); | ||
return callback.get(); | ||
} | ||
function split(a) { | ||
@@ -371,3 +667,3 @@ return a.split(/[\/\\]/g); | ||
} | ||
var packageMains = type === "loader" ? options.loaderPackageMains : options.packageMains; | ||
var packageMains = type === "loader" || type === "loader-context" ? options.loaderPackageMains : options.packageMains; | ||
for(var i = 0; i < packageMains.length; i++) { | ||
@@ -430,3 +726,3 @@ var field = packageMains[i]; | ||
var moduleName = fileInModule.shift(); | ||
var postfixes = type === "loader" ? options.loaderPostfixes : options.postfixes; | ||
var postfixes = type === "loader" || type === "loader-context" ? options.loaderPostfixes : options.postfixes; | ||
var paths = modulesDirectoriesPaths(context, options); | ||
@@ -456,3 +752,3 @@ (sync?iterateSync:iterateAsync)(options.paths, function(path, idx, next) { | ||
var pathname = join(split(dir), fileInModule); | ||
if(type === "context") { | ||
if(type === "context" || type === "loader-context") { | ||
(sync?statSync:statAsync)(pathname, function(err, stat) { | ||
@@ -459,0 +755,0 @@ if(err && !firstError) firstError = err; |
{ | ||
"name": "enhanced-resolve", | ||
"version": "0.4.1", | ||
"version": "0.4.2", | ||
"author": "Tobias Koppers @sokra", | ||
@@ -5,0 +5,0 @@ "description": "Offers a async require.resolve function. It's highly configurable.", |
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
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
61647
37
1947