Skip to content

Commit a193be3

Browse files
aduh95richardlau
authored andcommitted
esm: use import attributes instead of import assertions
The old import assertions proposal has been renamed to "import attributes" with the follwing major changes: 1. The keyword is now `with` instead of `assert`. 2. Unknown assertions cause an error rather than being ignored, This commit updates the documentation to encourage folks to use the new syntax, and add aliases for module customization hooks. PR-URL: #50140 Backport-PR-URL: #51136Fixes: #50134 Refs: v8/v8@159c82c Reviewed-By: Geoffrey Booth <[email protected]> Reviewed-By: Jacob Smith <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent c13969e commit a193be3

18 files changed

+68
-62
lines changed

‎.eslintrc.js‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ module.exports ={
4444
parserOptions: {
4545
babelOptions: {
4646
plugins: [
47-
[
48-
Module._findPath('@babel/plugin-syntax-import-attributes'),
49-
{deprecatedAssertSyntax: true},
50-
],
47+
Module._findPath('@babel/plugin-syntax-import-attributes'),
5148
],
5249
},
5350
requireConfigFile: false,

‎doc/api/esm.md‎

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
<!-- YAML
88
added: v8.5.0
99
changes:
10+
- version: REPLACEME
11+
pr-url: https://github.com/nodejs/node/pull/50140
12+
description: Add experimental support for import attributes.
1013
- version: v18.19.0
1114
pr-url: https://github.com/nodejs/node/pull/44710
1215
description: Module customization hooks are executed off the main thread.
@@ -202,7 +205,7 @@ added: v12.10.0
202205

203206
```js
204207
import'data:text/javascript,console.log("hello!");';
205-
import_from'data:application/json,"world!"'assert{type: 'json' };
208+
import_from'data:application/json,"world!"'with{type: 'json' };
206209
```
207210

208211
`data:` URLs only resolve [bare specifiers][Terminology] for builtin modules
@@ -243,26 +246,25 @@ added:
243246
- v17.1.0
244247
- v16.14.0
245248
changes:
246-
- version: v18.19.0
249+
- version: REPLACEME
247250
pr-url: https://github.com/nodejs/node/pull/50140
248251
description: Switch from Import Assertions to Import Attributes.
249252
-->
250253

251254
> Stability: 1.1 - Active development
252255
253256
> This feature was previously named "Import assertions", and using the `assert`
254-
> keyword instead of `with`. Because the version of V8 on this release line does
255-
> not support the `with` keyword, you need to keep using `assert` to support
256-
> this version of Node.js.
257+
> keyword instead of `with`. Any uses in code of the prior `assert` keyword
258+
> should be updated to use `with` instead.
257259
258260
The [Import Attributes proposal][] adds an inline syntax for module import
259261
statements to pass on more information alongside the module specifier.
260262

261263
```js
262-
importfooDatafrom'./foo.json'assert{type: 'json' };
264+
importfooDatafrom'./foo.json'with{type: 'json' };
263265

264266
const{default:barData } =
265-
awaitimport('./bar.json',{assert:{type:'json' } });
267+
awaitimport('./bar.json',{with:{type:'json' } });
266268
```
267269

268270
Node.js supports the following `type` values, for which the attribute is
@@ -555,10 +557,10 @@ separate cache.
555557
JSON files can be referenced by `import`:
556558

557559
```js
558-
import packageConfig from './package.json' assert{type:'json' };
560+
import packageConfig from './package.json' with{type:'json' };
559561
```
560562
561-
The `assert{type:'json' }` syntax is mandatory; see [Import Attributes][].
563+
The `with{type:'json' }` syntax is mandatory; see [Import Attributes][].
562564
563565
The imported JSON only exposes a `default` export. There is no support for named
564566
exports. A cache entry is created in the CommonJS cache to avoid duplication.

‎src/node.cc‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,13 @@ int ProcessGlobalArgs(std::vector<std::string>* args,
745745
"--no-harmony-import-assertions") == v8_args.end()){
746746
v8_args.emplace_back("--harmony-import-assertions");
747747
}
748+
// TODO(aduh95): remove this when the harmony-import-attributes flag
749+
// is removed in V8.
750+
if (std::find(v8_args.begin(),
751+
v8_args.end(),
752+
"--no-harmony-import-attributes") == v8_args.end()){
753+
v8_args.emplace_back("--harmony-import-attributes");
754+
}
748755

749756
auto env_opts = per_process::cli_options->per_isolate->per_env;
750757
if (std::find(v8_args.begin(), v8_args.end(),

‎test/es-module/test-esm-assertionless-json-import.js‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ async function test(){
99
import('../fixtures/experimental.json'),
1010
import(
1111
'../fixtures/experimental.json',
12-
{assert: {type: 'json'}}
12+
{with: {type: 'json'}}
1313
),
1414
]);
1515

@@ -24,7 +24,7 @@ async function test(){
2424
import('../fixtures/experimental.json?test'),
2525
import(
2626
'../fixtures/experimental.json?test',
27-
{assert: {type: 'json'}}
27+
{with: {type: 'json'}}
2828
),
2929
]);
3030

@@ -39,7 +39,7 @@ async function test(){
3939
import('../fixtures/experimental.json#test'),
4040
import(
4141
'../fixtures/experimental.json#test',
42-
{assert: {type: 'json'}}
42+
{with: {type: 'json'}}
4343
),
4444
]);
4545

@@ -54,7 +54,7 @@ async function test(){
5454
import('../fixtures/experimental.json?test2#test'),
5555
import(
5656
'../fixtures/experimental.json?test2#test',
57-
{assert: {type: 'json'}}
57+
{with: {type: 'json'}}
5858
),
5959
]);
6060

@@ -69,7 +69,7 @@ async function test(){
6969
import('data:application/json,{"ofLife":42}'),
7070
import(
7171
'data:application/json,{"ofLife":42}',
72-
{assert: {type: 'json'}}
72+
{with: {type: 'json'}}
7373
),
7474
]);
7575

‎test/es-module/test-esm-data-urls.js‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,36 +60,36 @@ function createBase64URL(mime, body){
6060
}
6161
{
6262
constns=awaitimport('data:application/json;foo="test,"this"',
63-
{assert: {type: 'json'}});
63+
{with: {type: 'json'}});
6464
assert.deepStrictEqual(Object.keys(ns),['default']);
6565
assert.strictEqual(ns.default,'this');
6666
}
6767
{
6868
constns=awaitimport(`data:application/json;foo=${
6969
encodeURIComponent('test,')
70-
},0`,{assert: {type: 'json'}});
70+
},0`,{with: {type: 'json'}});
7171
assert.deepStrictEqual(Object.keys(ns),['default']);
7272
assert.strictEqual(ns.default,0);
7373
}
7474
{
7575
awaitassert.rejects(async()=>
7676
import('data:application/json;foo="test,",0',
77-
{assert: {type: 'json'}}),{
77+
{with: {type: 'json'}}),{
7878
name: 'SyntaxError',
7979
message: /UnexpectedendofJSONinput/
8080
});
8181
}
8282
{
8383
constbody='{"x": 1}';
8484
constplainESMURL=createURL('application/json',body);
85-
constns=awaitimport(plainESMURL,{assert: {type: 'json'}});
85+
constns=awaitimport(plainESMURL,{with: {type: 'json'}});
8686
assert.deepStrictEqual(Object.keys(ns),['default']);
8787
assert.strictEqual(ns.default.x,1);
8888
}
8989
{
9090
constbody='{"default": 2}';
9191
constplainESMURL=createURL('application/json',body);
92-
constns=awaitimport(plainESMURL,{assert: {type: 'json'}});
92+
constns=awaitimport(plainESMURL,{with: {type: 'json'}});
9393
assert.deepStrictEqual(Object.keys(ns),['default']);
9494
assert.strictEqual(ns.default.default,2);
9595
}

‎test/es-module/test-esm-dynamic-import-attribute.js‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const{strictEqual } = require('assert');
55
asyncfunctiontest(){
66
{
77
constresults=awaitPromise.allSettled([
8-
import('../fixtures/empty.js',{assert: {type: 'json'}}),
8+
import('../fixtures/empty.js',{with: {type: 'json'}}),
99
import('../fixtures/empty.js'),
1010
]);
1111

@@ -16,7 +16,7 @@ async function test(){
1616
{
1717
constresults=awaitPromise.allSettled([
1818
import('../fixtures/empty.js'),
19-
import('../fixtures/empty.js',{assert: {type: 'json'}}),
19+
import('../fixtures/empty.js',{with: {type: 'json'}}),
2020
]);
2121

2222
strictEqual(results[0].status,'fulfilled');
@@ -25,7 +25,7 @@ async function test(){
2525

2626
{
2727
constresults=awaitPromise.allSettled([
28-
import('../fixtures/empty.json',{assert: {type: 'json'}}),
28+
import('../fixtures/empty.json',{with: {type: 'json'}}),
2929
import('../fixtures/empty.json'),
3030
]);
3131

@@ -36,7 +36,7 @@ async function test(){
3636
{
3737
constresults=awaitPromise.allSettled([
3838
import('../fixtures/empty.json'),
39-
import('../fixtures/empty.json',{assert: {type: 'json'}}),
39+
import('../fixtures/empty.json',{with: {type: 'json'}}),
4040
]);
4141

4242
strictEqual(results[0].status,'rejected');

‎test/es-module/test-esm-dynamic-import-attribute.mjs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import{strictEqual } from 'assert'
33

44
{
55
constresults=awaitPromise.allSettled([
6-
import('../fixtures/empty.js',{assert: {type: 'json'}}),
6+
import('../fixtures/empty.js',{with: {type: 'json'}}),
77
import('../fixtures/empty.js'),
88
]);
99

@@ -14,7 +14,7 @@ import{strictEqual } from 'assert'
1414
{
1515
constresults=awaitPromise.allSettled([
1616
import('../fixtures/empty.js'),
17-
import('../fixtures/empty.js',{assert: {type: 'json'}}),
17+
import('../fixtures/empty.js',{with: {type: 'json'}}),
1818
]);
1919

2020
strictEqual(results[0].status,'fulfilled');
@@ -23,7 +23,7 @@ import{strictEqual } from 'assert'
2323

2424
{
2525
constresults=awaitPromise.allSettled([
26-
import('../fixtures/empty.json',{assert: {type: 'json'}}),
26+
import('../fixtures/empty.json',{with: {type: 'json'}}),
2727
import('../fixtures/empty.json'),
2828
]);
2929

@@ -34,7 +34,7 @@ import{strictEqual } from 'assert'
3434
{
3535
constresults=awaitPromise.allSettled([
3636
import('../fixtures/empty.json'),
37-
import('../fixtures/empty.json',{assert: {type: 'json'}}),
37+
import('../fixtures/empty.json',{with: {type: 'json'}}),
3838
]);
3939

4040
strictEqual(results[0].status,'rejected');
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import'../common/index.mjs';
22
import{strictEqual}from'assert';
33

4-
importsecretfrom'../fixtures/experimental.json'assert{type: 'json' };
4+
importsecretfrom'../fixtures/experimental.json'with{type: 'json'};
55

66
strictEqual(secret.ofLife,42);

‎test/es-module/test-esm-import-attributes-2.mjs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import'../common/index.mjs';
22
import{strictEqual}from'assert';
33

4-
importsecret0from'../fixtures/experimental.json'assert{type: 'json' };
4+
importsecret0from'../fixtures/experimental.json'with{type: 'json'};
55
constsecret1=awaitimport('../fixtures/experimental.json',{
6-
assert: {type: 'json'},
6+
with: {type: 'json'},
77
});
88

99
strictEqual(secret0.ofLife,42);

‎test/es-module/test-esm-import-attributes-3.mjs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import'../common/index.mjs';
22
import{strictEqual}from'assert';
33

4-
importsecret0from'../fixtures/experimental.json'assert{type: 'json' };
4+
importsecret0from'../fixtures/experimental.json'with{type: 'json'};
55
constsecret1=awaitimport('../fixtures/experimental.json',
6-
{assert: {type: 'json'}});
6+
{with: {type: 'json'}});
77

88
strictEqual(secret0.ofLife,42);
99
strictEqual(secret1.default.ofLife,42);

0 commit comments

Comments
(0)