◐ Shell
clean mode source ↗

esm: use import attributes instead of import assertions · nodejs/node@a193be3

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,

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-

import fooData from './foo.json' assert { type: 'json' };

264+

import fooData from './foo.json' with { type: 'json' };

263265
264266

const { default: barData } =

265-

await import('./bar.json', { assert: { type: 'json' } });

267+

await import('./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.

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(),

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
Original file line numberDiff line numberDiff line change

@@ -60,36 +60,36 @@ function createBase64URL(mime, body) {

6060

}

6161

{

6262

const ns = await import('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

const ns = await import(`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

await assert.rejects(async () =>

7676

import('data:application/json;foo="test,",0',

77-

{ assert: { type: 'json' } }), {

77+

{ with: { type: 'json' } }), {

7878

name: 'SyntaxError',

7979

message: /Unexpected end of JSON input/

8080

});

8181

}

8282

{

8383

const body = '{"x": 1}';

8484

const plainESMURL = createURL('application/json', body);

85-

const ns = await import(plainESMURL, { assert: { type: 'json' } });

85+

const ns = await import(plainESMURL, { with: { type: 'json' } });

8686

assert.deepStrictEqual(Object.keys(ns), ['default']);

8787

assert.strictEqual(ns.default.x, 1);

8888

}

8989

{

9090

const body = '{"default": 2}';

9191

const plainESMURL = createURL('application/json', body);

92-

const ns = await import(plainESMURL, { assert: { type: 'json' } });

92+

const ns = await import(plainESMURL, { with: { type: 'json' } });

9393

assert.deepStrictEqual(Object.keys(ns), ['default']);

9494

assert.strictEqual(ns.default.default, 2);

9595

}

Original file line numberDiff line numberDiff line change

@@ -5,7 +5,7 @@ const { strictEqual } = require('assert');

55

async function test() {

66

{

77

const results = await Promise.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

const results = await Promise.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

const results = await Promise.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

const results = await Promise.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');

Original file line numberDiff line numberDiff line change

@@ -3,7 +3,7 @@ import { strictEqual } from 'assert';

33
44

{

55

const results = await Promise.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

const results = await Promise.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

const results = await Promise.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

const results = await Promise.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');

Original file line numberDiff line numberDiff line change

@@ -1,6 +1,6 @@

11

import '../common/index.mjs';

22

import { strictEqual } from 'assert';

33
4-

import secret from '../fixtures/experimental.json' assert { type: 'json' };

4+

import secret from '../fixtures/experimental.json' with { type: 'json' };

55
66

strictEqual(secret.ofLife, 42);

Original file line numberDiff line numberDiff line change

@@ -1,9 +1,9 @@

11

import '../common/index.mjs';

22

import { strictEqual } from 'assert';

33
4-

import secret0 from '../fixtures/experimental.json' assert { type: 'json' };

4+

import secret0 from '../fixtures/experimental.json' with { type: 'json' };

55

const secret1 = await import('../fixtures/experimental.json', {

6-

assert: { type: 'json' },

6+

with: { type: 'json' },

77

});

88
99

strictEqual(secret0.ofLife, 42);

Original file line numberDiff line numberDiff line change

@@ -1,9 +1,9 @@

11

import '../common/index.mjs';

22

import { strictEqual } from 'assert';

33
4-

import secret0 from '../fixtures/experimental.json' assert { type: 'json' };

4+

import secret0 from '../fixtures/experimental.json' with { type: 'json' };

55

const secret1 = await import('../fixtures/experimental.json',

6-

{ assert: { type: 'json' } });

6+

{ with: { type: 'json' } });

77
88

strictEqual(secret0.ofLife, 42);

99

strictEqual(secret1.default.ofLife, 42);