From 079671d3c1b4719bf5b3ab7727749e46afd83d6e Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 10 Mar 2021 23:20:38 +0100 Subject: [PATCH] module: improve error message for invalid data URL Fixes: https://github.com/nodejs/node/issues/37647 PR-URL: https://github.com/nodejs/node/pull/37701 Reviewed-By: Derek Lewis Reviewed-By: Guy Bedford --- lib/internal/modules/esm/loader.js | 11 +++++++++ test/es-module/test-esm-data-urls.js | 2 +- test/es-module/test-esm-invalid-data-urls.js | 24 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/es-module/test-esm-invalid-data-urls.js diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index 232177698c73f6..14e66dcb9fdf62 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -6,12 +6,14 @@ require('internal/modules/cjs/loader'); const { FunctionPrototypeBind, ObjectSetPrototypeOf, + RegExpPrototypeExec, SafeWeakMap, StringPrototypeStartsWith, } = primordials; const { ERR_INVALID_ARG_VALUE, + ERR_INVALID_MODULE_SPECIFIER, ERR_INVALID_RETURN_PROPERTY, ERR_INVALID_RETURN_PROPERTY_VALUE, ERR_INVALID_RETURN_VALUE, @@ -107,6 +109,15 @@ class Loader { } const { format } = getFormatResponse; + if (format === null) { + const dataUrl = RegExpPrototypeExec( + /^data:([^/]+\/[^;,]+)(?:[^,]*?)(;base64)?,/, + url, + ); + throw new ERR_INVALID_MODULE_SPECIFIER( + url, + dataUrl ? `has an unsupported MIME type "${dataUrl[1]}"` : ''); + } if (typeof format !== 'string') { throw new ERR_INVALID_RETURN_PROPERTY_VALUE( 'string', 'loader getFormat', 'format', format); diff --git a/test/es-module/test-esm-data-urls.js b/test/es-module/test-esm-data-urls.js index 61da442c9e081c..eb2b65e9fb224a 100644 --- a/test/es-module/test-esm-data-urls.js +++ b/test/es-module/test-esm-data-urls.js @@ -99,7 +99,7 @@ function createBase64URL(mime, body) { await import(plainESMURL); common.mustNotCall()(); } catch (e) { - assert.strictEqual(e.code, 'ERR_INVALID_RETURN_PROPERTY_VALUE'); + assert.strictEqual(e.code, 'ERR_INVALID_MODULE_SPECIFIER'); } } })().then(common.mustCall()); diff --git a/test/es-module/test-esm-invalid-data-urls.js b/test/es-module/test-esm-invalid-data-urls.js new file mode 100644 index 00000000000000..67f0bfe4e25588 --- /dev/null +++ b/test/es-module/test-esm-invalid-data-urls.js @@ -0,0 +1,24 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +(async () => { + await assert.rejects(import('data:text/plain,export default0'), { + code: 'ERR_INVALID_MODULE_SPECIFIER', + message: + 'Invalid module "data:text/plain,export default0" has an unsupported ' + + 'MIME type "text/plain"', + }); + await assert.rejects(import('data:text/plain;base64,'), { + code: 'ERR_INVALID_MODULE_SPECIFIER', + message: + 'Invalid module "data:text/plain;base64," has an unsupported ' + + 'MIME type "text/plain"', + }); + await assert.rejects(import('data:application/json,[]'), { + code: 'ERR_INVALID_MODULE_SPECIFIER', + message: + 'Invalid module "data:application/json,[]" has an unsupported ' + + 'MIME type "application/json"', + }); +})().then(common.mustCall());