Skip to content

Commit 983904c

Browse files
committed
Provide context to resolve again
Brings the old behaviour back that was removed in da29d21
1 parent 06b6cbb commit 983904c

File tree

16 files changed

+139
-6
lines changed

16 files changed

+139
-6
lines changed

lib/NormalModuleFactory.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ function NormalModuleFactory(context, resolvers, options) {
101101
var contextInfo = data.contextInfo;
102102
var context = data.context;
103103
var request = data.request;
104-
var resolveContextInfo = {};
105104

106105
var noAutoLoaders = /^-?!/.test(request);
107106
var noPrePostAutoLoaders = /^!!/.test(request);
@@ -112,15 +111,15 @@ function NormalModuleFactory(context, resolvers, options) {
112111

113112
async.parallel([
114113
function(callback) {
115-
_this.resolveRequestArray(resolveContextInfo, context, elements, _this.resolvers.loader, callback);
114+
_this.resolveRequestArray(contextInfo, context, elements, _this.resolvers.loader, callback);
116115
},
117116
function(callback) {
118117
if(resource === "" || resource[0] === "?")
119118
return callback(null, {
120119
resource: resource
121120
});
122121

123-
_this.resolvers.normal.resolve(resolveContextInfo, context, resource, function(err, resource, resourceResolveData) {
122+
_this.resolvers.normal.resolve(contextInfo, context, resource, function(err, resource, resourceResolveData) {
124123
if(err) return callback(err);
125124
callback(null, {
126125
resourceResolveData: resourceResolveData,
@@ -184,9 +183,9 @@ function NormalModuleFactory(context, resolvers, options) {
184183
}
185184
});
186185
async.parallel([
187-
_this.resolveRequestArray.bind(_this, resolveContextInfo, _this.context, useLoadersPost, _this.resolvers.loader),
188-
_this.resolveRequestArray.bind(_this, resolveContextInfo, _this.context, useLoaders, _this.resolvers.loader),
189-
_this.resolveRequestArray.bind(_this, resolveContextInfo, _this.context, useLoadersPre, _this.resolvers.loader)
186+
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoadersPost, _this.resolvers.loader),
187+
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoaders, _this.resolvers.loader),
188+
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoadersPre, _this.resolvers.loader)
190189
], function(err, results) {
191190
if(err) return callback(err);
192191
loaders = results[0].concat(loaders).concat(results[1]).concat(results[2]);
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"use strict";
2+
3+
const nestedNodeModuleRegex = /node_modules.*node_modules/;
4+
const replaceNodeModuleRegex = /^.*node_modules(\/|\\)/;
5+
6+
/**
7+
* Tries to resolve node_modules from root before using the nested version when the version matches.
8+
*
9+
* Use cases:
10+
* - nested node_module structure like prior to npm@3
11+
* - symlinked node_modules
12+
*
13+
* Note: this plugin has a very stupid algorithm to check semver constraints and works only with fixed versions.
14+
*/
15+
module.exports = class ResolvePackageFromRootPlugin {
16+
17+
constructor(context) {
18+
this.rootPath = context;
19+
}
20+
21+
apply(resolver) {
22+
resolver.plugin("resolved", (originalResolved, callback) => {
23+
24+
if (!nestedNodeModuleRegex.test(originalResolved.path) || !originalResolved.context || !originalResolved.context.issuer) {
25+
return callback(null, originalResolved)
26+
}
27+
28+
resolver.doResolve("resolve", {
29+
context: {},
30+
path: originalResolved.context.issuer,
31+
request: originalResolved.context.issuer
32+
}, `resolve issuer of ${originalResolved.path}`, (err, issuer) => {
33+
if (err) {
34+
return callback(null, originalResolved);
35+
}
36+
37+
const moduleRequestPath = originalResolved.path.replace(replaceNodeModuleRegex, "");
38+
39+
resolver.doResolve("resolve", {
40+
context: {},
41+
path: this.rootPath,
42+
request: moduleRequestPath
43+
}, `resolve ${moduleRequestPath} in ${this.rootPath}`, (err, resolvedInParentContext) => {
44+
if (err) {
45+
return callback(null, originalResolved);
46+
}
47+
48+
const packageName = resolvedInParentContext.descriptionFileData.name;
49+
const resolvedVersion = resolvedInParentContext.descriptionFileData.version;
50+
const wantedVersion = issuer.descriptionFileData.dependencies[packageName];
51+
52+
if (resolvedVersion !== wantedVersion) {
53+
return callback(null, originalResolved);
54+
}
55+
56+
return callback(null, resolvedInParentContext);
57+
});
58+
});
59+
})
60+
}
61+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Hash: 94e1d97f3e1cf37e753f
2+
Time: Xms
3+
Asset Size Chunks Chunk Names
4+
bundle.js 3.04 kB 0 [emitted] main
5+
chunk {0} bundle.js (main) 80 bytes [entry] [rendered]
6+
[0] (webpack)/test/statsCases/resolve-plugin-context/~/xyz/index.js 0 bytes {0} [built]
7+
[1] (webpack)/test/statsCases/resolve-plugin-context/index.js 48 bytes {0} [built]
8+
[2] (webpack)/test/statsCases/resolve-plugin-context/~/abc/index.js 16 bytes {0} [built]
9+
[3] (webpack)/test/statsCases/resolve-plugin-context/~/def/index.js 16 bytes {0} [built]
10+
[4] (webpack)/test/statsCases/resolve-plugin-context/~/def/~/xyz/index.js 0 bytes {0} [built]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
require("abc");
2+
require("def");
3+
require("xyz");

test/statsCases/resolve-plugin-context/node_modules/abc/index.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/statsCases/resolve-plugin-context/node_modules/abc/node_modules/xyz/index.js

Whitespace-only changes.

test/statsCases/resolve-plugin-context/node_modules/abc/node_modules/xyz/package.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/statsCases/resolve-plugin-context/node_modules/abc/package.json

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/statsCases/resolve-plugin-context/node_modules/def/index.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/statsCases/resolve-plugin-context/node_modules/def/node_modules/xyz/index.js

Whitespace-only changes.

0 commit comments

Comments
 (0)