Socket
Socket
Sign inDemoInstall

enhanced-resolve

Package Overview
Dependencies
Maintainers
1
Versions
130
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

enhanced-resolve - npm Package Compare versions

Comparing version 0.4.1 to 0.4.2

test/complete.js

304

lib/resolve.js

@@ -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;

2

package.json
{
"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.",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc