diff --git a/lib/internal/modules/esm/default_resolve.js b/lib/internal/modules/esm/default_resolve.js index fea151a0ff..b0304ed88f 100644 --- a/lib/internal/modules/esm/default_resolve.js +++ b/lib/internal/modules/esm/default_resolve.js @@ -7,6 +7,7 @@ const { realpathSync } = require('fs'); const { getOptionValue } = require('internal/options'); const preserveSymlinks = getOptionValue('--preserve-symlinks'); const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); +const experimentalJsonModules = getOptionValue('--experimental-json-modules'); const { ERR_UNKNOWN_FILE_EXTENSION } = require('internal/errors').codes; const { resolve: moduleWrapResolve } = internalBinding('module_wrap'); const { pathToFileURL, fileURLToPath } = require('internal/url'); @@ -25,11 +26,20 @@ const legacyExtensionFormatMap = { '__proto__': null, '.cjs': 'cjs', '.js': 'cjs', - '.json': 'cjs', '.mjs': 'esm', '.node': 'cjs' }; +if (experimentalJsonModules) { + // This is a total hack + Object.assign(extensionFormatMap, { + '.json': 'cjs' + }); + Object.assign(legacyExtensionFormatMap, { + '.json': 'cjs' + }); +} + function resolve(specifier, parentURL) { if (NativeModule.canBeRequiredByUsers(specifier)) { return { diff --git a/src/node_options.cc b/src/node_options.cc index 97ec093b21..9de06c93b4 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -160,6 +160,10 @@ DebugOptionsParser::DebugOptionsParser() { } EnvironmentOptionsParser::EnvironmentOptionsParser() { + AddOption("--experimental-json-modules", + "experimental JSON interop support for the ES Module loader", + &EnvironmentOptions::experimental_json_modules, + kAllowedInEnvironment); AddOption("--experimental-modules", "experimental ES Module support and caching modules", &EnvironmentOptions::experimental_modules, diff --git a/src/node_options.h b/src/node_options.h index f52f79c895..df7ecaf117 100644 --- a/src/node_options.h +++ b/src/node_options.h @@ -85,6 +85,7 @@ class DebugOptions : public Options { class EnvironmentOptions : public Options { public: bool abort_on_uncaught_exception = false; + bool experimental_json_modules = false; bool experimental_modules = false; std::string module_type; std::string experimental_policy; diff --git a/test/es-module/test-esm-json.mjs b/test/es-module/test-esm-json.mjs new file mode 100644 index 0000000000..4c2cc4980e --- /dev/null +++ b/test/es-module/test-esm-json.mjs @@ -0,0 +1,9 @@ +// Flags: --experimental-modules --experimental-json-modules +/* eslint-disable node-core/required-modules */ + +import '../common/index.mjs'; +import { strictEqual } from 'assert'; + +import secret from '../fixtures/utf8-bom.json'; + +strictEqual(secret, 42);