Skip to content

Commit 365f0ab

Browse files
bfarias-godaddyaddaleax
authored andcommitted
esm: data URLs should ignore unknown parameters
PR-URL: #30593 Reviewed-By: Jan Krems <[email protected]> Reviewed-By: Guy Bedford <[email protected]>
1 parent d4b6170 commit 365f0ab

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

lib/internal/modules/esm/default_resolve.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ function resolve(specifier, parentURL) {
5353
try {
5454
const parsed = new URL(specifier);
5555
if (parsed.protocol === 'data:') {
56-
const [ , mime ] = /^([^/]+\/[^;,]+)(;base64)?,/.exec(parsed.pathname) || [ null, null, null ];
56+
const [ , mime ] = /^([^/]+\/[^;,]+)(?:[^,]*?)(;base64)?,/.exec(parsed.pathname) || [ null, null, null ];
5757
const format = ({
5858
'__proto__': null,
5959
'text/javascript': 'module',

lib/internal/modules/esm/translators.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const debug = debuglog('esm');
3939
const translators = new SafeMap();
4040
exports.translators = translators;
4141

42-
const DATA_URL_PATTERN = /^[^/]+\/[^,;]+(;base64)?,([\s\S]*)$/;
42+
const DATA_URL_PATTERN = /^[^/]+\/[^,;]+(?:[^,]*?)(;base64)?,([\s\S]*)$/;
4343
function getSource(url) {
4444
const parsed = new URL(url);
4545
if (parsed.protocol === 'file:') {

test/es-module/test-esm-data-urls.js

+41
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,47 @@ function createBase64URL(mime, body) {
3535
assert.deepStrictEqual(Object.keys(ns), ['default']);
3636
assert.deepStrictEqual(ns.default, plainESMURL);
3737
}
38+
{
39+
const body = 'export default import.meta.url;';
40+
const plainESMURL = createURL('text/javascript;charset=UTF-8', body);
41+
const ns = await import(plainESMURL);
42+
assert.deepStrictEqual(Object.keys(ns), ['default']);
43+
assert.deepStrictEqual(ns.default, plainESMURL);
44+
}
45+
{
46+
const body = 'export default import.meta.url;';
47+
const plainESMURL = createURL('text/javascript;charset="UTF-8"', body);
48+
const ns = await import(plainESMURL);
49+
assert.deepStrictEqual(Object.keys(ns), ['default']);
50+
assert.deepStrictEqual(ns.default, plainESMURL);
51+
}
52+
{
53+
const body = 'export default import.meta.url;';
54+
const plainESMURL = createURL('text/javascript;;a=a;b=b;;', body);
55+
const ns = await import(plainESMURL);
56+
assert.deepStrictEqual(Object.keys(ns), ['default']);
57+
assert.deepStrictEqual(ns.default, plainESMURL);
58+
}
59+
{
60+
const ns = await import('data:application/json;foo="test,"this"');
61+
assert.deepStrictEqual(Object.keys(ns), ['default']);
62+
assert.deepStrictEqual(ns.default, 'this');
63+
}
64+
{
65+
const ns = await import(`data:application/json;foo=${
66+
encodeURIComponent('test,')
67+
},0`);
68+
assert.deepStrictEqual(Object.keys(ns), ['default']);
69+
assert.deepStrictEqual(ns.default, 0);
70+
}
71+
{
72+
await assert.rejects(async () => {
73+
return import('data:application/json;foo="test,",0');
74+
}, {
75+
name: 'SyntaxError',
76+
message: /Unexpected end of JSON input/
77+
});
78+
}
3879
{
3980
const body = '{"x": 1}';
4081
const plainESMURL = createURL('application/json', body);

0 commit comments

Comments
 (0)