diff --git a/lib/internal/modules/esm/get_source.js b/lib/internal/modules/esm/get_source.js index 5e2cc3e09e7687..2f7b74fb74406c 100644 --- a/lib/internal/modules/esm/get_source.js +++ b/lib/internal/modules/esm/get_source.js @@ -1,5 +1,8 @@ 'use strict'; +const { + decodeURIComponent, +} = primordials; const { getOptionValue } = require('internal/options'); const manifest = getOptionValue('--experimental-policy') ? require('internal/process/policy').manifest : @@ -28,8 +31,8 @@ async function defaultGetSource(url, { format } = {}, defaultGetSource) { if (!match) { throw new ERR_INVALID_URL(url); } - const [ , base64, body ] = match; - source = Buffer.from(body, base64 ? 'base64' : 'utf8'); + const { 1: base64, 2: body } = match; + source = Buffer.from(decodeURIComponent(body), base64 ? 'base64' : 'utf8'); } else { throw new ERR_INVALID_URL_SCHEME(['file', 'data']); } diff --git a/test/es-module/test-esm-data-urls.js b/test/es-module/test-esm-data-urls.js index 61da442c9e081c..282aaf1857a0df 100644 --- a/test/es-module/test-esm-data-urls.js +++ b/test/es-module/test-esm-data-urls.js @@ -102,4 +102,9 @@ function createBase64URL(mime, body) { assert.strictEqual(e.code, 'ERR_INVALID_RETURN_PROPERTY_VALUE'); } } + { + const plainESMURL = 'data:text/javascript,export%20default%202'; + const module = await import(plainESMURL); + assert.strictEqual(module.default, 2); + } })().then(common.mustCall());