Skip to content

Commit d8533ce

Browse files
authored
Merge pull request #276 from webpack/feature/prefer-absolute
add preferAbsolute option to prefer absolute paths over roots
2 parents 4473b85 + 61a24e2 commit d8533ce

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ myResolver.resolve({}, lookupStartPath, request, resolveContext, (
9696
| resolver | undefined | A prepared Resolver to which the plugins are attached |
9797
| resolveToContext | false | Resolve to a context instead of a file |
9898
| preferRelative | false | Prefer to resolve module requests as relative request and fallback to resolving as module |
99+
| preferAbsolute | false | Prefer to resolve server-relative urls as absolute paths before falling back to resolve in roots |
99100
| restrictions | [] | A list of resolve restrictions |
100101
| roots | [] | A list of root paths |
101102
| symlinks | true | Whether to resolve symlinks to their symlinked location |

lib/ResolverFactory.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ const UseFilePlugin = require("./UseFilePlugin");
7575
* @property {(string|RegExp)[]=} restrictions A list of resolve restrictions
7676
* @property {boolean=} useSyncFileSystemCalls Use only the sync constiants of the file system calls
7777
* @property {boolean=} preferRelative Prefer to resolve module requests as relative requests before falling back to modules
78+
* @property {boolean=} preferAbsolute Prefer to resolve server-relative urls as absolute paths before falling back to resolve in roots
7879
*/
7980

8081
/**
@@ -104,6 +105,7 @@ const UseFilePlugin = require("./UseFilePlugin");
104105
* @property {boolean} resolveToContext
105106
* @property {Set<string|RegExp>} restrictions
106107
* @property {boolean} preferRelative
108+
* @property {boolean} preferAbsolute
107109
*/
108110

109111
/**
@@ -113,7 +115,7 @@ const UseFilePlugin = require("./UseFilePlugin");
113115
function processPnpApiOption(option) {
114116
if (
115117
option === undefined &&
116-
/** @type {NodeJS.ProcessVersions & {pnp: string}} */ (versions).pnp
118+
/** @type {NodeJS.ProcessVersions & {pnp: string}} */ versions.pnp
117119
) {
118120
// @ts-ignore
119121
return require("pnpapi"); // eslint-disable-line node/no-missing-require
@@ -222,6 +224,7 @@ function createOptions(options) {
222224
fullySpecified: options.fullySpecified || false,
223225
resolveToContext: options.resolveToContext || false,
224226
preferRelative: options.preferRelative || false,
227+
preferAbsolute: options.preferAbsolute || false,
225228
restrictions: new Set(options.restrictions)
226229
};
227230
}
@@ -254,6 +257,7 @@ exports.createResolver = function (options) {
254257
pnpApi,
255258
resolveToContext,
256259
preferRelative,
260+
preferAbsolute,
257261
symlinks,
258262
unsafeCache,
259263
resolver: customResolver,
@@ -364,10 +368,13 @@ exports.createResolver = function (options) {
364368
"internal"
365369
)
366370
);
371+
if (preferAbsolute) {
372+
plugins.push(new JoinRequestPlugin("after-normal-resolve", "relative"));
373+
}
367374
if (roots.size > 0) {
368375
plugins.push(new RootsPlugin("after-normal-resolve", roots, "relative"));
369376
}
370-
if (!preferRelative) {
377+
if (!preferRelative && !preferAbsolute) {
371378
plugins.push(new JoinRequestPlugin("after-normal-resolve", "relative"));
372379
}
373380

test/roots.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,26 @@ describe("roots", () => {
1616
fileSystem
1717
});
1818

19+
const resolverPreferAbsolute = ResolverFactory.createResolver({
20+
extensions: [".js"],
21+
alias: {
22+
foo: "/fixtures"
23+
},
24+
roots: [__dirname, fixtures],
25+
fileSystem,
26+
preferAbsolute: true,
27+
plugins: [
28+
{
29+
apply(resolver) {
30+
resolver.hooks.file.tap("Test", request => {
31+
if (/test.fixtures.*test.fixtures/.test(request.path))
32+
throw new Error("Simulate a fatal error in root path");
33+
});
34+
}
35+
}
36+
]
37+
});
38+
1939
const contextResolver = ResolverFactory.createResolver({
2040
roots: [__dirname],
2141
fileSystem,
@@ -95,4 +115,19 @@ describe("roots", () => {
95115
done();
96116
});
97117
});
118+
119+
it("should resolve an absolute path (prefer absolute)", done => {
120+
resolverPreferAbsolute.resolve(
121+
{},
122+
fixtures,
123+
path.join(fixtures, "b.js"),
124+
{},
125+
(err, result) => {
126+
if (err) return done(err);
127+
if (!result) throw new Error("No result");
128+
result.should.equal(path.resolve(fixtures, "b.js"));
129+
done();
130+
}
131+
);
132+
});
98133
});

types.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ declare interface ResolveOptions {
204204
resolveToContext: boolean;
205205
restrictions: Set<string | RegExp>;
206206
preferRelative: boolean;
207+
preferAbsolute: boolean;
207208
}
208209
declare abstract class Resolver {
209210
fileSystem: FileSystem;
@@ -428,6 +429,11 @@ declare interface UserResolveOptions {
428429
* Prefer to resolve module requests as relative requests before falling back to modules
429430
*/
430431
preferRelative?: boolean;
432+
433+
/**
434+
* Prefer to resolve server-relative urls as absolute paths before falling back to resolve in roots
435+
*/
436+
preferAbsolute?: boolean;
431437
}
432438
declare function exports(
433439
context?: any,

0 commit comments

Comments
 (0)