Skip to content

Commit

Permalink
esm: mark import attributes and JSON module as stable
Browse files Browse the repository at this point in the history
The two proposals reached stage 4 at the October 2024 meeting.

PR-URL: #55333
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
  • Loading branch information
nicolo-ribaudo authored and aduh95 committed Nov 2, 2024
1 parent fce3ab6 commit ac37e55
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 15 deletions.
20 changes: 9 additions & 11 deletions doc/api/esm.md
Original file line number Diff line number Diff line change
Expand Up @@ -251,14 +251,10 @@ changes:
description: Switch from Import Assertions to Import Attributes.
-->

> Stability: 1.1 - Active development
> This feature was previously named "Import assertions", and using the `assert`
> keyword instead of `with`. Any uses in code of the prior `assert` keyword
> should be updated to use `with` instead.
> Stability: 2 - Stable
The [Import Attributes proposal][] adds an inline syntax for module import
statements to pass on more information alongside the module specifier.
[Import attributes][Import Attributes MDN] are an inline syntax for module
import statements to pass on more information alongside the module specifier.

```js
import fooData from './foo.json' with { type: 'json' };
Expand All @@ -267,13 +263,15 @@ const { default: barData } =
await import('./bar.json', { with: { type: 'json' } });
```

Node.js supports the following `type` values, for which the attribute is
mandatory:
Node.js only supports the `type` attribute, for which it supports the following
values:

| Attribute `type` | Needed for |
| ---------------- | ---------------- |
| `'json'` | [JSON modules][] |

The `type: 'json'` attribute is mandatory when importing JSON modules.

## Builtin modules

[Core modules][] provide named exports of their public API. A
Expand Down Expand Up @@ -552,7 +550,7 @@ separate cache.

## JSON modules

> Stability: 1 - Experimental
> Stability: 2 - Stable

JSON files can be referenced by `import`:

Expand Down Expand Up @@ -1090,7 +1088,7 @@ success!
[Dynamic `import()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import
[ES Module Integration Proposal for WebAssembly]: https://github.com/webassembly/esm-integration
[Import Attributes]: #import-attributes
[Import Attributes proposal]: https://github.com/tc39/proposal-import-attributes
[Import Attributes MDN]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with
[JSON modules]: #json-modules
[Module customization hooks]: module.md#customization-hooks
[Node.js Module Resolution And Loading Algorithm]: #resolution-algorithm-specification
Expand Down
3 changes: 1 addition & 2 deletions lib/internal/modules/esm/translators.js
Original file line number Diff line number Diff line change
Expand Up @@ -304,8 +304,7 @@ translators.set('builtin', async function builtinStrategy(url) {
});

// Strategy for loading a JSON file
translators.set('json', async function jsonStrategy(url, source) {
emitExperimentalWarning('Importing JSON modules');
translators.set('json', function jsonStrategy(url, source) {
assertBufferSource(source, true, 'load');
debug(`Loading JSONModule ${url}`);
const pathname = StringPrototypeStartsWith(url, 'file:') ?
Expand Down
4 changes: 2 additions & 2 deletions test/es-module/test-esm-json.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ describe('ESM: importing JSON', () => {
assert.strictEqual(secret.ofLife, 42);
});

it('should print an experimental warning', async () => {
it('should not print an experimental warning', async () => {
const { code, signal, stderr } = await spawnPromisified(execPath, [
fixtures.path('/es-modules/json-modules.mjs'),
]);

assert.match(stderr, /ExperimentalWarning: Importing JSON modules/);
assert.strictEqual(stderr, '');
assert.strictEqual(code, 0);
assert.strictEqual(signal, null);
});
Expand Down

0 comments on commit ac37e55

Please sign in to comment.