Skip to content

Commit 924a9a8

Browse files
bfarias-godaddyMylesBorins
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 886ef09 commit 924a9a8

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

0 commit comments

Comments
 (0)