esm: remove experimental status from JSON modules

The HTML spec has officially landed JSON Modules and as such I think
we can move them out of the "experimental" status. They will still
be behind the `--experimental-modules` flag until the entire esm
implementation moves out of experimental.

Refs: https://html.spec.whatwg.org/#creating-a-json-module-script

PR-URL: https://github.com/nodejs/node/pull/27752
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Bradley Farias <bradley.meck@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Guy Bedford <guybedford@gmail.com>
Reviewed-By: Yuta Hiroto <hello@hiroppy.me>
Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
Myles Borins 2019-05-17 15:23:59 -04:00 committed by Myles Borins
parent 47c5c3da86
commit c3f72510c8
No known key found for this signature in database
GPG Key ID: 933B01F40B5CA946
8 changed files with 9 additions and 46 deletions

View File

@ -148,13 +148,6 @@ the ability to import a directory that has an index file.
Please see [customizing esm specifier resolution][] for example usage. Please see [customizing esm specifier resolution][] for example usage.
### `--experimental-json-modules`
<!-- YAML
added: v12.0.0
-->
Enable experimental JSON support for the ES Module loader.
### `--experimental-modules` ### `--experimental-modules`
<!-- YAML <!-- YAML
added: v8.5.0 added: v8.5.0

View File

@ -409,18 +409,11 @@ fs.readFileSync = () => Buffer.from('Hello, ESM');
fs.readFileSync === readFileSync; fs.readFileSync === readFileSync;
``` ```
## Experimental JSON Modules ## JSON Modules
**Note: This API is still being designed and is subject to change.** JSON modules follow the [WHATWG JSON modules specification][].
Currently importing JSON modules are only supported in the `commonjs` mode The imported JSON only exposes a `default`. There is no
and are loaded using the CJS loader. [WHATWG JSON modules][] are currently
being standardized, and are experimentally supported by including the
additional flag `--experimental-json-modules` when running Node.js.
When the `--experimental-json-modules` flag is included both the
`commonjs` and `module` mode will use the new experimental JSON
loader. The imported JSON only exposes a `default`, there is no
support for named exports. A cache entry is created in the CommonJS support for named exports. A cache entry is created in the CommonJS
cache, to avoid duplication. The same object will be returned in cache, to avoid duplication. The same object will be returned in
CommonJS if the JSON module has already been imported from the CommonJS if the JSON module has already been imported from the
@ -433,14 +426,6 @@ Assuming an `index.mjs` with
import packageConfig from './package.json'; import packageConfig from './package.json';
``` ```
The `--experimental-json-modules` flag is needed for the module
to work.
```bash
node --experimental-modules index.mjs # fails
node --experimental-modules --experimental-json-modules index.mjs # works
```
## Experimental Wasm Modules ## Experimental Wasm Modules
Importing Web Assembly modules is supported under the Importing Web Assembly modules is supported under the
@ -763,7 +748,7 @@ success!
[CommonJS]: modules.html [CommonJS]: modules.html
[ECMAScript-modules implementation]: https://github.com/nodejs/modules/blob/master/doc/plan-for-new-modules-implementation.md [ECMAScript-modules implementation]: https://github.com/nodejs/modules/blob/master/doc/plan-for-new-modules-implementation.md
[Node.js EP for ES Modules]: https://github.com/nodejs/node-eps/blob/master/002-es-modules.md [Node.js EP for ES Modules]: https://github.com/nodejs/node-eps/blob/master/002-es-modules.md
[WHATWG JSON modules]: https://github.com/whatwg/html/issues/4315 [WHATWG JSON modules specification]: https://html.spec.whatwg.org/#creating-a-json-module-script
[ES Module Integration Proposal for Web Assembly]: https://github.com/webassembly/esm-integration [ES Module Integration Proposal for Web Assembly]: https://github.com/webassembly/esm-integration
[dynamic instantiate hook]: #esm_dynamic_instantiate_hook [dynamic instantiate hook]: #esm_dynamic_instantiate_hook
[the official standard format]: https://tc39.github.io/ecma262/#sec-modules [the official standard format]: https://tc39.github.io/ecma262/#sec-modules

View File

@ -108,9 +108,6 @@ Requires Node.js to be built with
.It Fl -es-module-specifier-resolution .It Fl -es-module-specifier-resolution
Select extension resolution algorithm for ES Modules; either 'explicit' (default) or 'node' Select extension resolution algorithm for ES Modules; either 'explicit' (default) or 'node'
. .
.It Fl -experimental-json-modules
Enable experimental JSON interop support for the ES Module loader.
.
.It Fl -experimental-modules .It Fl -experimental-modules
Enable experimental ES module support and caching modules. Enable experimental ES module support and caching modules.
. .

View File

@ -8,7 +8,6 @@ const { getOptionValue } = require('internal/options');
const preserveSymlinks = getOptionValue('--preserve-symlinks'); const preserveSymlinks = getOptionValue('--preserve-symlinks');
const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main');
const experimentalJsonModules = getOptionValue('--experimental-json-modules');
const typeFlag = getOptionValue('--input-type'); const typeFlag = getOptionValue('--input-type');
const experimentalWasmModules = getOptionValue('--experimental-wasm-modules'); const experimentalWasmModules = getOptionValue('--experimental-wasm-modules');
const { resolve: moduleWrapResolve, const { resolve: moduleWrapResolve,
@ -29,6 +28,7 @@ const extensionFormatMap = {
'__proto__': null, '__proto__': null,
'.cjs': 'commonjs', '.cjs': 'commonjs',
'.js': 'module', '.js': 'module',
'.json': 'json',
'.mjs': 'module' '.mjs': 'module'
}; };
@ -36,7 +36,7 @@ const legacyExtensionFormatMap = {
'__proto__': null, '__proto__': null,
'.cjs': 'commonjs', '.cjs': 'commonjs',
'.js': 'commonjs', '.js': 'commonjs',
'.json': 'commonjs', '.json': 'json',
'.mjs': 'module', '.mjs': 'module',
'.node': 'commonjs' '.node': 'commonjs'
}; };
@ -44,9 +44,6 @@ const legacyExtensionFormatMap = {
if (experimentalWasmModules) if (experimentalWasmModules)
extensionFormatMap['.wasm'] = legacyExtensionFormatMap['.wasm'] = 'wasm'; extensionFormatMap['.wasm'] = legacyExtensionFormatMap['.wasm'] = 'wasm';
if (experimentalJsonModules)
extensionFormatMap['.json'] = legacyExtensionFormatMap['.json'] = 'json';
function resolve(specifier, parentURL) { function resolve(specifier, parentURL) {
if (NativeModule.canBeRequiredByUsers(specifier)) { if (NativeModule.canBeRequiredByUsers(specifier)) {
return { return {

View File

@ -117,11 +117,6 @@ void EnvironmentOptions::CheckOptions(std::vector<std::string>* errors) {
} }
} }
if (experimental_json_modules && !experimental_modules) {
errors->push_back("--experimental-json-modules requires "
"--experimental-modules be enabled");
}
if (experimental_wasm_modules && !experimental_modules) { if (experimental_wasm_modules && !experimental_modules) {
errors->push_back("--experimental-wasm-modules requires " errors->push_back("--experimental-wasm-modules requires "
"--experimental-modules be enabled"); "--experimental-modules be enabled");
@ -271,10 +266,6 @@ DebugOptionsParser::DebugOptionsParser() {
} }
EnvironmentOptionsParser::EnvironmentOptionsParser() { EnvironmentOptionsParser::EnvironmentOptionsParser() {
AddOption("--experimental-json-modules",
"experimental JSON interop support for the ES Module loader",
&EnvironmentOptions::experimental_json_modules,
kAllowedInEnvironment);
AddOption("--experimental-modules", AddOption("--experimental-modules",
"experimental ES Module support and caching modules", "experimental ES Module support and caching modules",
&EnvironmentOptions::experimental_modules, &EnvironmentOptions::experimental_modules,

View File

@ -91,7 +91,6 @@ class DebugOptions : public Options {
class EnvironmentOptions : public Options { class EnvironmentOptions : public Options {
public: public:
bool abort_on_uncaught_exception = false; bool abort_on_uncaught_exception = false;
bool experimental_json_modules = false;
bool experimental_modules = false; bool experimental_modules = false;
std::string es_module_specifier_resolution; std::string es_module_specifier_resolution;
bool experimental_wasm_modules = false; bool experimental_wasm_modules = false;

View File

@ -1,4 +1,4 @@
// Flags: --experimental-modules --experimental-json-modules // Flags: --experimental-modules
import '../common/index.mjs'; import '../common/index.mjs';
import { strictEqual, deepStrictEqual } from 'assert'; import { strictEqual, deepStrictEqual } from 'assert';

View File

@ -1,4 +1,5 @@
// Flags: --experimental-modules --experimental-json-modules // Flags: --experimental-modules
import '../common/index.mjs'; import '../common/index.mjs';
import { strictEqual } from 'assert'; import { strictEqual } from 'assert';