From 691eb86aead3a5330869a8e28c1e765a6065c16c Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Wed, 8 Jun 2022 19:06:30 -0700 Subject: [PATCH 1/5] Allow JSON imports in NodeJS 16.15 --- dist-raw/node-internal-modules-esm-get_format.js | 1 + 1 file changed, 1 insertion(+) diff --git a/dist-raw/node-internal-modules-esm-get_format.js b/dist-raw/node-internal-modules-esm-get_format.js index 1f3586adf..e85e0ab49 100644 --- a/dist-raw/node-internal-modules-esm-get_format.js +++ b/dist-raw/node-internal-modules-esm-get_format.js @@ -12,6 +12,7 @@ const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(s => parseIn const experimentalJsonModules = nodeMajor > 17 || (nodeMajor === 17 && nodeMinor >= 5) + || (nodeMajor === 16 && nodeMinor >= 15) || getOptionValue('--experimental-json-modules'); const experimentalWasmModules = getOptionValue('--experimental-wasm-modules'); const { URL, fileURLToPath } = require('url'); From 9ceb38ab76343e4008dfada858b12dadc22615ef Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Wed, 8 Jun 2022 20:34:11 -0700 Subject: [PATCH 2/5] Update tests --- src/test/esm-loader.spec.ts | 9 +++++---- src/test/helpers.ts | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/test/esm-loader.spec.ts b/src/test/esm-loader.spec.ts index 54242abff..814499afc 100644 --- a/src/test/esm-loader.spec.ts +++ b/src/test/esm-loader.spec.ts @@ -15,6 +15,7 @@ import { EXPERIMENTAL_MODULES_FLAG, nodeSupportsEsmHooks, nodeSupportsImportAssertions, + nodeSupportsImportAssertionsTypeJson, nodeSupportsSpawningChildProcess, nodeUsesNewHooksApi, resetNodeEnvironment, @@ -270,8 +271,8 @@ test.suite('esm', (test) => { test.suite('supports import assertions', (test) => { test.runIf(nodeSupportsImportAssertions); - test.suite('node >=17.5.0', (test) => { - test.runIf(semver.gte(process.version, '17.5.0')); + test.suite('node >=16.15.0 <17.0.0 | >=17.5.0', (test) => { + test.runIf(nodeSupportsImportAssertionsTypeJson); test('Can import JSON modules with appropriate assertion', async (t) => { const { err, stdout } = await exec( @@ -287,8 +288,8 @@ test.suite('esm', (test) => { }); }); - test.suite('node <17.5.0', (test) => { - test.runIf(semver.lt(process.version, '17.5.0')); + test.suite('node <16.15.0 | 17.0.0> <17.5.0', (test) => { + test.runIf(!nodeSupportsImportAssertionsTypeJson); test('Can import JSON using the appropriate flag and assertion', async (t) => { const { err, stdout } = await exec( diff --git a/src/test/helpers.ts b/src/test/helpers.ts index 08392a29e..a1038b98d 100644 --- a/src/test/helpers.ts +++ b/src/test/helpers.ts @@ -64,10 +64,12 @@ export const nodeSupportsSpawningChildProcess = semver.gte( '12.17.0' ); export const nodeUsesNewHooksApi = semver.gte(process.version, '16.12.0'); -export const nodeSupportsImportAssertions = semver.gte( - process.version, - '17.1.0' -); +export const nodeSupportsImportAssertions = semver.gte(process.version, '16.14.0') && + semver.lt(process.version, '17.0.0') || + semver.gte(process.version, '17.1.0'); +export const nodeSupportsImportAssertionsTypeJson = semver.gte(process.version, '16.15.0') && + semver.lt(process.version, '17.0.0') || + semver.gte(process.version, '17.5.0'); // Node 14.13.0 has a bug where it tries to lex CJS files to discover named exports *before* // we transform the code. // In other words, it tries to parse raw TS as CJS and balks at `export const foo =`, expecting to see `exports.foo =` From d7b0210d02d766d7939b4f0fbadedfb2df733a60 Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Wed, 8 Jun 2022 20:37:16 -0700 Subject: [PATCH 3/5] Run formatter --- src/test/helpers.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/test/helpers.ts b/src/test/helpers.ts index a1038b98d..544b401f4 100644 --- a/src/test/helpers.ts +++ b/src/test/helpers.ts @@ -64,12 +64,14 @@ export const nodeSupportsSpawningChildProcess = semver.gte( '12.17.0' ); export const nodeUsesNewHooksApi = semver.gte(process.version, '16.12.0'); -export const nodeSupportsImportAssertions = semver.gte(process.version, '16.14.0') && - semver.lt(process.version, '17.0.0') || - semver.gte(process.version, '17.1.0'); -export const nodeSupportsImportAssertionsTypeJson = semver.gte(process.version, '16.15.0') && - semver.lt(process.version, '17.0.0') || - semver.gte(process.version, '17.5.0'); +export const nodeSupportsImportAssertions = + (semver.gte(process.version, '16.14.0') && + semver.lt(process.version, '17.0.0')) || + semver.gte(process.version, '17.1.0'); +export const nodeSupportsImportAssertionsTypeJson = + (semver.gte(process.version, '16.15.0') && + semver.lt(process.version, '17.0.0')) || + semver.gte(process.version, '17.5.0'); // Node 14.13.0 has a bug where it tries to lex CJS files to discover named exports *before* // we transform the code. // In other words, it tries to parse raw TS as CJS and balks at `export const foo =`, expecting to see `exports.foo =` From 78385f048fe7e7d143a235feec3bc3a244c33351 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 17 Jun 2022 14:35:58 -0400 Subject: [PATCH 4/5] tweak testing --- src/test/esm-loader.spec.ts | 57 +++++++++++++++++-------------------- src/test/helpers.ts | 7 ++++- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/test/esm-loader.spec.ts b/src/test/esm-loader.spec.ts index 814499afc..52a8bccd6 100644 --- a/src/test/esm-loader.spec.ts +++ b/src/test/esm-loader.spec.ts @@ -15,7 +15,7 @@ import { EXPERIMENTAL_MODULES_FLAG, nodeSupportsEsmHooks, nodeSupportsImportAssertions, - nodeSupportsImportAssertionsTypeJson, + nodeSupportsUnflaggedJsonImports, nodeSupportsSpawningChildProcess, nodeUsesNewHooksApi, resetNodeEnvironment, @@ -271,38 +271,33 @@ test.suite('esm', (test) => { test.suite('supports import assertions', (test) => { test.runIf(nodeSupportsImportAssertions); - test.suite('node >=16.15.0 <17.0.0 | >=17.5.0', (test) => { - test.runIf(nodeSupportsImportAssertionsTypeJson); - - test('Can import JSON modules with appropriate assertion', async (t) => { - const { err, stdout } = await exec( - `${CMD_ESM_LOADER_WITHOUT_PROJECT} ./importJson.ts`, - { - cwd: resolve(TEST_DIR, 'esm-import-assertions'), - } - ); - expect(err).toBe(null); - expect(stdout.trim()).toBe( - 'A fuchsia car has 2 seats and the doors are open.\nDone!' - ); - }); + const macro = test.macro((flags: string) => async (t) => { + const { err, stdout } = await exec( + `${CMD_ESM_LOADER_WITHOUT_PROJECT} ${flags} ./importJson.ts`, + { + cwd: resolve(TEST_DIR, 'esm-import-assertions'), + } + ); + expect(err).toBe(null); + expect(stdout.trim()).toBe( + 'A fuchsia car has 2 seats and the doors are open.\nDone!' + ); }); - test.suite('node <16.15.0 | 17.0.0> <17.5.0', (test) => { - test.runIf(!nodeSupportsImportAssertionsTypeJson); - - test('Can import JSON using the appropriate flag and assertion', async (t) => { - const { err, stdout } = await exec( - `${CMD_ESM_LOADER_WITHOUT_PROJECT} --experimental-json-modules ./importJson.ts`, - { - cwd: resolve(TEST_DIR, 'esm-import-assertions'), - } - ); - expect(err).toBe(null); - expect(stdout.trim()).toBe( - 'A fuchsia car has 2 seats and the doors are open.\nDone!' - ); - }); + test.suite( + 'when node does not require --experimental-json-modules', + (test) => { + test.runIf(nodeSupportsUnflaggedJsonImports); + test('Can import JSON modules with appropriate assertion', macro, ''); + } + ); + test.suite('when node requires --experimental-json-modules', (test) => { + test.runIf(!nodeSupportsUnflaggedJsonImports); + test( + 'Can import JSON using the appropriate flag and assertion', + macro, + '--experimental-json-modules' + ); }); }); diff --git a/src/test/helpers.ts b/src/test/helpers.ts index 544b401f4..01e35e039 100644 --- a/src/test/helpers.ts +++ b/src/test/helpers.ts @@ -64,11 +64,16 @@ export const nodeSupportsSpawningChildProcess = semver.gte( '12.17.0' ); export const nodeUsesNewHooksApi = semver.gte(process.version, '16.12.0'); +// 16.14.0: https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V16.md#notable-changes-4 +// 17.1.0: https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V17.md#2021-11-09-version-1710-current-targos export const nodeSupportsImportAssertions = (semver.gte(process.version, '16.14.0') && semver.lt(process.version, '17.0.0')) || semver.gte(process.version, '17.1.0'); -export const nodeSupportsImportAssertionsTypeJson = +// These versions do not require `--experimental-json-modules` +// 16.15.0: https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V16.md#2022-04-26-version-16150-gallium-lts-danielleadams +// 17.5.0: https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V17.md#2022-02-10-version-1750-current-ruyadorno +export const nodeSupportsUnflaggedJsonImports = (semver.gte(process.version, '16.15.0') && semver.lt(process.version, '17.0.0')) || semver.gte(process.version, '17.5.0'); From c98b6850ac5469ae31997e9545f543af06449066 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 17 Jun 2022 14:52:38 -0400 Subject: [PATCH 5/5] fix --- src/test/esm-loader.spec.ts | 8 +++++++- src/test/helpers.ts | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/test/esm-loader.spec.ts b/src/test/esm-loader.spec.ts index 52a8bccd6..41c421fd6 100644 --- a/src/test/esm-loader.spec.ts +++ b/src/test/esm-loader.spec.ts @@ -20,6 +20,8 @@ import { nodeUsesNewHooksApi, resetNodeEnvironment, TEST_DIR, + tsSupportsImportAssertions, + tsSupportsResolveJsonModule, } from './helpers'; import { createExec, createSpawn, ExecReturn } from './exec-helpers'; import { join, resolve } from 'path'; @@ -269,7 +271,11 @@ test.suite('esm', (test) => { }); test.suite('supports import assertions', (test) => { - test.runIf(nodeSupportsImportAssertions); + test.runIf( + nodeSupportsImportAssertions && + tsSupportsImportAssertions && + tsSupportsResolveJsonModule + ); const macro = test.macro((flags: string) => async (t) => { const { err, stdout } = await exec( diff --git a/src/test/helpers.ts b/src/test/helpers.ts index 01e35e039..c4ea9e8a4 100644 --- a/src/test/helpers.ts +++ b/src/test/helpers.ts @@ -85,6 +85,7 @@ export const nodeSupportsImportingTransformedCjsFromEsm = semver.gte( process.version, '14.13.1' ); +export const tsSupportsResolveJsonModule = semver.gte(ts.version, '2.9.0'); /** Supports tsconfig "extends" >= v3.2.0 */ export const tsSupportsTsconfigInheritanceViaNodePackages = semver.gte( ts.version, @@ -97,6 +98,7 @@ export const tsSupportsStableNodeNextNode16 = ts.version.startsWith('4.7.') || semver.gte(ts.version, '4.7.0'); // TS 4.5 is first version to understand .cts, .mts, .cjs, and .mjs extensions export const tsSupportsMtsCtsExtensions = semver.gte(ts.version, '4.5.0'); +export const tsSupportsImportAssertions = semver.gte(ts.version, '4.5.0'); //#endregion export const xfs = new NodeFS(fs);