Skip to content

Commit afbf602

Browse files
authored
Merge pull request #15293 from webpack/fix/resource-name-from-data-urI
fix resource name when filename is data uri
2 parents f2d99d8 + c872a68 commit afbf602

3 files changed

Lines changed: 69 additions & 23 deletions

File tree

lib/TemplatedPathPlugin.js

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
"use strict";
77

8+
const mime = require("mime-types");
89
const { basename, extname } = require("path");
910
const util = require("util");
1011
const Chunk = require("./Chunk");
@@ -117,29 +118,53 @@ const replacePathVariables = (path, data, assetInfo) => {
117118
// [name] - file
118119
// [ext] - .js
119120
if (typeof data.filename === "string") {
120-
const { path: file, query, fragment } = parseResource(data.filename);
121-
122-
const ext = extname(file);
123-
const base = basename(file);
124-
const name = base.slice(0, base.length - ext.length);
125-
const path = file.slice(0, file.length - base.length);
126-
127-
replacements.set("file", replacer(file));
128-
replacements.set("query", replacer(query, true));
129-
replacements.set("fragment", replacer(fragment, true));
130-
replacements.set("path", replacer(path, true));
131-
replacements.set("base", replacer(base));
132-
replacements.set("name", replacer(name));
133-
replacements.set("ext", replacer(ext, true));
134-
// Legacy
135-
replacements.set(
136-
"filebase",
137-
deprecated(
138-
replacer(base),
139-
"[filebase] is now [base]",
140-
"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
141-
)
142-
);
121+
// check that filename is data uri
122+
let match = data.filename.match(/^data:([^;,]+)/);
123+
if (match) {
124+
const ext = mime.extension(match[1]);
125+
const emptyReplacer = replacer("", true);
126+
127+
replacements.set("file", emptyReplacer);
128+
replacements.set("query", emptyReplacer);
129+
replacements.set("fragment", emptyReplacer);
130+
replacements.set("path", emptyReplacer);
131+
replacements.set("base", emptyReplacer);
132+
replacements.set("name", emptyReplacer);
133+
replacements.set("ext", replacer(ext ? `.${ext}` : "", true));
134+
// Legacy
135+
replacements.set(
136+
"filebase",
137+
deprecated(
138+
emptyReplacer,
139+
"[filebase] is now [base]",
140+
"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
141+
)
142+
);
143+
} else {
144+
const { path: file, query, fragment } = parseResource(data.filename);
145+
146+
const ext = extname(file);
147+
const base = basename(file);
148+
const name = base.slice(0, base.length - ext.length);
149+
const path = file.slice(0, file.length - base.length);
150+
151+
replacements.set("file", replacer(file));
152+
replacements.set("query", replacer(query, true));
153+
replacements.set("fragment", replacer(fragment, true));
154+
replacements.set("path", replacer(path, true));
155+
replacements.set("base", replacer(base));
156+
replacements.set("name", replacer(name));
157+
replacements.set("ext", replacer(ext, true));
158+
// Legacy
159+
replacements.set(
160+
"filebase",
161+
deprecated(
162+
replacer(base),
163+
"[filebase] is now [base]",
164+
"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
165+
)
166+
);
167+
}
143168
}
144169

145170
// Compilation context
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import asset from "data:image/svg+xml;utf8,<svg><title>icon-square-small</title></svg>"
2+
3+
it("should compile with correct filename", () => {
4+
expect(asset).toMatch(/public\/media\/\.[0-9a-zA-Z]{8}\.svg/);
5+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/** @type {import("../../../../").Configuration} */
2+
module.exports = {
3+
output: {
4+
assetModuleFilename: "media/[name].[contenthash:8][ext]",
5+
publicPath: "public/"
6+
},
7+
module: {
8+
rules: [
9+
{
10+
mimetype: "image/svg+xml",
11+
type: "asset/resource"
12+
}
13+
]
14+
},
15+
target: "web"
16+
};

0 commit comments

Comments
 (0)