Skip to content

Commit

Permalink
Merge pull request #14031 from webpack/bugfix/concatenated-contextify
Browse files Browse the repository at this point in the history
  • Loading branch information
sokra committed Aug 19, 2021
2 parents 5239f26 + c76be4d commit e73864c
Show file tree
Hide file tree
Showing 10 changed files with 157 additions and 49 deletions.
4 changes: 2 additions & 2 deletions lib/EvalSourceMapDevToolPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const NormalModule = require("./NormalModule");
const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin");
const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
const ConcatenatedModule = require("./optimize/ConcatenatedModule");
const { absolutify } = require("./util/identifier");
const { makePathsAbsolute } = require("./util/identifier");

/** @typedef {import("webpack-sources").Source} Source */
/** @typedef {import("../declarations/WebpackOptions").DevTool} DevToolOptions */
Expand Down Expand Up @@ -125,7 +125,7 @@ class EvalSourceMapDevToolPlugin {
const root = compiler.root;
const modules = sourceMap.sources.map(source => {
if (!source.startsWith("webpack://")) return source;
source = absolutify(context, source.slice(10), root);
source = makePathsAbsolute(context, source.slice(10), root);
const module = compilation.findModule(source);
return module || source;
});
Expand Down
12 changes: 10 additions & 2 deletions lib/NormalModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,11 @@ const {
} = require("./util/comparators");
const createHash = require("./util/createHash");
const { join } = require("./util/fs");
const { contextify, absolutify } = require("./util/identifier");
const {
contextify,
absolutify,
makePathsRelative
} = require("./util/identifier");
const makeSerializable = require("./util/makeSerializable");
const memoize = require("./util/memoize");

Expand Down Expand Up @@ -102,7 +106,11 @@ const ABSOLUTE_PATH_REGEX = /^([a-zA-Z]:\\|\\\\|\/)/;
*/
const contextifySourceUrl = (context, source, associatedObjectForCache) => {
if (source.startsWith("webpack://")) return source;
return `webpack://${contextify(context, source, associatedObjectForCache)}`;
return `webpack://${makePathsRelative(
context,
source,
associatedObjectForCache
)}`;
};

/**
Expand Down
4 changes: 2 additions & 2 deletions lib/SourceMapDevToolPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOpt
const createSchemaValidation = require("./util/create-schema-validation");
const createHash = require("./util/createHash");
const { relative, dirname } = require("./util/fs");
const { absolutify } = require("./util/identifier");
const { makePathsAbsolute } = require("./util/identifier");

/** @typedef {import("webpack-sources").MapOptions} MapOptions */
/** @typedef {import("webpack-sources").Source} Source */
Expand Down Expand Up @@ -91,7 +91,7 @@ const getTaskForFile = (
if (!sourceMap || typeof source !== "string") return;
const context = compilation.options.context;
const root = compilation.compiler.root;
const cachedAbsolutify = absolutify.bindContextCache(context, root);
const cachedAbsolutify = makePathsAbsolute.bindContextCache(context, root);
const modules = sourceMap.sources.map(source => {
if (!source.startsWith("webpack://")) return source;
source = cachedAbsolutify(source.slice(10));
Expand Down
6 changes: 3 additions & 3 deletions lib/optimize/ConcatenatedModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const { equals } = require("../util/ArrayHelpers");
const LazySet = require("../util/LazySet");
const { concatComparators, keepOriginalOrder } = require("../util/comparators");
const createHash = require("../util/createHash");
const contextify = require("../util/identifier").contextify;
const { makePathsRelative } = require("../util/identifier");
const makeSerializable = require("../util/makeSerializable");
const propertyAccess = require("../util/propertyAccess");
const {
Expand Down Expand Up @@ -1011,13 +1011,13 @@ class ConcatenatedModule extends Module {
}

static _createIdentifier(rootModule, modules, associatedObjectForCache) {
const cachedContextify = contextify.bindContextCache(
const cachedMakePathsRelative = makePathsRelative.bindContextCache(
rootModule.context,
associatedObjectForCache
);
let identifiers = [];
for (const module of modules) {
identifiers.push(cachedContextify(module.identifier()));
identifiers.push(cachedMakePathsRelative(module.identifier()));
}
identifiers.sort();
const hash = createHash("md4");
Expand Down
34 changes: 26 additions & 8 deletions lib/util/identifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ const WINDOWS_PATH_SEPARATOR_REGEXP = /\\/g;
* @property {Map<string, Map<string, string>>=} relativePaths
*/

const relativePathToRequest = relativePath => {
if (relativePath === "") return "./.";
if (relativePath === "..") return "../.";
if (relativePath.startsWith("../")) return relativePath;
return `./${relativePath}`;
};

/**
* @param {string} context context for relative path
* @param {string} maybeAbsolutePath path to make relative
Expand All @@ -36,10 +43,7 @@ const absoluteToRequest = (context, maybeAbsolutePath) => {
querySplitPos === -1
? maybeAbsolutePath
: maybeAbsolutePath.slice(0, querySplitPos);
resource = path.posix.relative(context, resource);
if (!resource.startsWith("../")) {
resource = "./" + resource;
}
resource = relativePathToRequest(path.posix.relative(context, resource));
return querySplitPos === -1
? resource
: resource + maybeAbsolutePath.slice(querySplitPos);
Expand All @@ -53,10 +57,9 @@ const absoluteToRequest = (context, maybeAbsolutePath) => {
: maybeAbsolutePath.slice(0, querySplitPos);
resource = path.win32.relative(context, resource);
if (!WINDOWS_ABS_PATH_REGEXP.test(resource)) {
resource = resource.replace(WINDOWS_PATH_SEPARATOR_REGEXP, "/");
if (!resource.startsWith("../")) {
resource = "./" + resource;
}
resource = relativePathToRequest(
resource.replace(WINDOWS_PATH_SEPARATOR_REGEXP, "/")
);
}
return querySplitPos === -1
? resource
Expand Down Expand Up @@ -214,6 +217,21 @@ const _makePathsRelative = (context, identifier) => {

exports.makePathsRelative = makeCacheable(_makePathsRelative);

/**
*
* @param {string} context context for relative path
* @param {string} identifier identifier for path
* @returns {string} a converted relative path
*/
const _makePathsAbsolute = (context, identifier) => {
return identifier
.split(SEGMENTS_SPLIT_REGEXP)
.map(str => requestToAbsolute(context, str))
.join("");
};

exports.makePathsAbsolute = makeCacheable(_makePathsAbsolute);

/**
* @param {string} context absolute context path
* @param {string} request any request string may containing absolute paths, query string, etc.
Expand Down
4 changes: 2 additions & 2 deletions test/__snapshots__/ConfigCacheTestCases.longtest.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ exports[`ConfigCacheTestCases records issue-2991 exported tests should write rel
\\"./test.js\\": 393,
\\"external \\\\\\"fs\\\\\\"\\": 747,
\\"external \\\\\\"path\\\\\\"\\": 622,
\\"ignored|./|pkgs/somepackage/foo\\": 907
\\"ignored|./.|pkgs/somepackage/foo\\": 802
},
\\"usedIds\\": [
393,
622,
747,
907
802
]
}
}"
Expand Down
4 changes: 2 additions & 2 deletions test/__snapshots__/ConfigTestCases.basictest.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ exports[`ConfigTestCases records issue-2991 exported tests should write relative
\\"./test.js\\": 393,
\\"external \\\\\\"fs\\\\\\"\\": 747,
\\"external \\\\\\"path\\\\\\"\\": 622,
\\"ignored|./|pkgs/somepackage/foo\\": 907
\\"ignored|./.|pkgs/somepackage/foo\\": 802
},
\\"usedIds\\": [
393,
622,
747,
907
802
]
}
}"
Expand Down
58 changes: 38 additions & 20 deletions test/__snapshots__/StatsTestCases.basictest.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -700,44 +700,62 @@ exports[`StatsTestCases should print correct stats for concat-and-sideeffects 1`
`;

exports[`StatsTestCases should print correct stats for context-independence 1`] = `
"asset main-1ec6b8258a61da735540.js 10.4 KiB [emitted] [immutable] (name: main)
sourceMap main-1ec6b8258a61da735540.js.map 9.27 KiB [emitted] [dev] (auxiliary name: main)
asset 664-bca314bd02016092cab9.js 455 bytes [emitted] [immutable]
sourceMap 664-bca314bd02016092cab9.js.map 342 bytes [emitted] [dev]
"asset main-0bba425408895d66edc2.js 10.4 KiB [emitted] [immutable] (name: main)
sourceMap main-0bba425408895d66edc2.js.map 9.27 KiB [emitted] [dev] (auxiliary name: main)
asset 695-996cbcc94c36e62bcba0.js 455 bytes [emitted] [immutable]
sourceMap 695-996cbcc94c36e62bcba0.js.map 342 bytes [emitted] [dev]
runtime modules 6.3 KiB 8 modules
orphan modules 19 bytes [orphan] 1 module
cacheable modules 106 bytes
./a/index.js 40 bytes [built] [code generated]
./a/chunk.js + 1 modules 66 bytes [built] [code generated]
./a/index.js (in Xdir/context-independence/a) 40 bytes [built] [code generated]
./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-1ec6b8258a61da735540.js 10.4 KiB [emitted] [immutable] (name: main)
sourceMap main-1ec6b8258a61da735540.js.map 9.27 KiB [emitted] [dev] (auxiliary name: main)
asset 664-bca314bd02016092cab9.js 455 bytes [emitted] [immutable]
sourceMap 664-bca314bd02016092cab9.js.map 342 bytes [emitted] [dev]
asset main-0bba425408895d66edc2.js 10.4 KiB [emitted] [immutable] (name: main)
sourceMap main-0bba425408895d66edc2.js.map 9.27 KiB [emitted] [dev] (auxiliary name: main)
asset 695-996cbcc94c36e62bcba0.js 455 bytes [emitted] [immutable]
sourceMap 695-996cbcc94c36e62bcba0.js.map 342 bytes [emitted] [dev]
runtime modules 6.3 KiB 8 modules
orphan modules 19 bytes [orphan] 1 module
cacheable modules 106 bytes
./b/index.js 40 bytes [built] [code generated]
./b/chunk.js + 1 modules 66 bytes [built] [code generated]
./b/index.js (in Xdir/context-independence/b) 40 bytes [built] [code generated]
./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-c808a26a7472a643b6de.js 11.6 KiB [emitted] [immutable] (name: main)
asset 664-8b8452d1081ed5563bde.js 1.5 KiB [emitted] [immutable]
asset main-feace509aa3ce367cc19.js 11.6 KiB [emitted] [immutable] (name: main)
asset 695-dd77aceb318649b4e959.js 1.5 KiB [emitted] [immutable]
runtime modules 6.3 KiB 8 modules
orphan modules 19 bytes [orphan] 1 module
cacheable modules 106 bytes
./a/index.js 40 bytes [built] [code generated]
./a/chunk.js + 1 modules 66 bytes [built] [code generated]
./a/index.js (in Xdir/context-independence/a) 40 bytes [built] [code generated]
./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-c808a26a7472a643b6de.js 11.6 KiB [emitted] [immutable] (name: main)
asset 664-8b8452d1081ed5563bde.js 1.5 KiB [emitted] [immutable]
asset main-feace509aa3ce367cc19.js 11.6 KiB [emitted] [immutable] (name: main)
asset 695-dd77aceb318649b4e959.js 1.5 KiB [emitted] [immutable]
runtime modules 6.3 KiB 8 modules
orphan modules 19 bytes [orphan] 1 module
cacheable modules 106 bytes
./b/index.js 40 bytes [built] [code generated]
./b/chunk.js + 1 modules 66 bytes [built] [code generated]
./b/index.js (in Xdir/context-independence/b) 40 bytes [built] [code generated]
./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-ff2341c939081a4317cb.js 11.3 KiB [emitted] [immutable] (name: main)
asset 695-bd48ae52e02841adf5e6.js 1.01 KiB [emitted] [immutable]
runtime modules 6.3 KiB 8 modules
orphan modules 19 bytes [orphan] 1 module
cacheable modules 106 bytes
./a/index.js (in Xdir/context-independence/a) 40 bytes [built] [code generated]
./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms
asset main-ff2341c939081a4317cb.js 11.3 KiB [emitted] [immutable] (name: main)
asset 695-bd48ae52e02841adf5e6.js 1.01 KiB [emitted] [immutable]
runtime modules 6.3 KiB 8 modules
orphan modules 19 bytes [orphan] 1 module
cacheable modules 106 bytes
./b/index.js (in Xdir/context-independence/b) 40 bytes [built] [code generated]
./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated]
webpack x.x.x compiled successfully in X ms"
`;

Expand Down
11 changes: 5 additions & 6 deletions test/statsCases/context-independence/test.config.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
module.exports = {
validate(stats) {
const a = stats.stats[0].compilation.hash;
const b = stats.stats[1].compilation.hash;
expect(a).toBe(b);
const c = stats.stats[2].compilation.hash;
const d = stats.stats[3].compilation.hash;
expect(c).toBe(d);
for (let i = 0; i < stats.stats.length; i += 2) {
const a = stats.stats[i].compilation.hash;
const b = stats.stats[i + 1].compilation.hash;
expect(a).toBe(b);
}
}
};
69 changes: 67 additions & 2 deletions test/statsCases/context-independence/webpack.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ const path = require("path");
const base = {
mode: "production",
devtool: "source-map",
entry: "./index",
module: {
rules: [
{
Expand All @@ -15,6 +14,9 @@ const base = {
},
stats: {
relatedAssets: true
},
experiments: {
layers: true
}
};

Expand All @@ -23,10 +25,21 @@ const base2 = {
devtool: "eval-source-map"
};

const base3 = {
...base,
devtool: "eval"
};

/** @type {import("../../../").Configuration[]} */
module.exports = [
{
...base,
entry: {
main: {
import: "./index",
layer: path.resolve(__dirname, "a")
}
},
context: path.resolve(__dirname, "a"),
output: {
path: path.resolve(__dirname, "../../js/stats/context-independence/a"),
Expand All @@ -35,6 +48,12 @@ module.exports = [
},
{
...base,
entry: {
main: {
import: "./index",
layer: path.resolve(__dirname, "b")
}
},
context: path.resolve(__dirname, "b"),
output: {
path: path.resolve(__dirname, "../../js/stats/context-independence/b"),
Expand All @@ -43,17 +62,63 @@ module.exports = [
},
{
...base2,
entry: {
main: {
import: "./index",
layer: path.resolve(__dirname, "a")
}
},
context: path.resolve(__dirname, "a"),
output: {
path: path.resolve(
__dirname,
"../../js/stats/context-independence/eval-a"
"../../js/stats/context-independence/eval-source-map-a"
),
filename: "[name]-[chunkhash].js"
}
},
{
...base2,
entry: {
main: {
import: "./index",
layer: path.resolve(__dirname, "b")
}
},
context: path.resolve(__dirname, "b"),
output: {
path: path.resolve(
__dirname,
"../../js/stats/context-independence/eval-source-map-b"
),
filename: "[name]-[chunkhash].js"
}
},
{
...base3,
entry: {
main: {
import: "./index",
layer: path.resolve(__dirname, "a")
}
},
context: path.resolve(__dirname, "a"),
output: {
path: path.resolve(
__dirname,
"../../js/stats/context-independence/eval-a"
),
filename: "[name]-[chunkhash].js"
}
},
{
...base3,
entry: {
main: {
import: "./index",
layer: path.resolve(__dirname, "b")
}
},
context: path.resolve(__dirname, "b"),
output: {
path: path.resolve(
Expand Down

0 comments on commit e73864c

Please sign in to comment.