From 60c7d590a984e6d351b1891c00b66fb852eedeec Mon Sep 17 00:00:00 2001 From: Eero Tanskanen Date: Wed, 1 Dec 2021 18:16:21 +0200 Subject: [PATCH] json / wasm import assertion support. --- dist-raw/node-options.js | 4 +++- src/esm.ts | 19 ++++++++++++++++--- tests/esm-import-assertions/car.json | 5 +++++ tests/esm-import-assertions/importJson.ts | 14 ++++++++++++++ tests/esm-import-assertions/package.json | 3 +++ tests/esm-import-assertions/tsconfig.json | 10 ++++++++++ 6 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 tests/esm-import-assertions/car.json create mode 100644 tests/esm-import-assertions/importJson.ts create mode 100644 tests/esm-import-assertions/package.json create mode 100644 tests/esm-import-assertions/tsconfig.json diff --git a/dist-raw/node-options.js b/dist-raw/node-options.js index 0602a4769..22722755d 100644 --- a/dist-raw/node-options.js +++ b/dist-raw/node-options.js @@ -34,7 +34,9 @@ function parseArgv(argv) { '--es-module-specifier-resolution': '--experimental-specifier-resolution', '--experimental-policy': String, '--conditions': [String], - '--pending-deprecation': Boolean + '--pending-deprecation': Boolean, + '--experimental-json-modules': Boolean, + '--experimental-wasm-modules': Boolean, }, { argv, permissive: true diff --git a/src/esm.ts b/src/esm.ts index c83fd22c4..37bab3856 100644 --- a/src/esm.ts +++ b/src/esm.ts @@ -67,7 +67,10 @@ export namespace NodeLoaderHooksAPI2 { ) => Promise<{ url: string }>; export type LoadHook = ( url: string, - context: { format: NodeLoaderHooksFormat | null | undefined }, + context: { + format: NodeLoaderHooksFormat | null | undefined; + importAssertions?: NodeImportAssertions; + }, defaultLoad: NodeLoaderHooksAPI2['load'] ) => Promise<{ format: NodeLoaderHooksFormat; @@ -83,6 +86,10 @@ export type NodeLoaderHooksFormat = | 'module' | 'wasm'; +export type NodeImportAssertions = { + type: 'json' | 'wasm'; +}; + /** @internal */ export function registerAndCreateEsmHooks(opts?: RegisterOptions) { // Automatically performs registration just like `-r ts-node/register` @@ -159,7 +166,10 @@ export function createEsmHooks(tsNodeService: Service) { // `load` from new loader hook API (See description at the top of this file) async function load( url: string, - context: { format: NodeLoaderHooksFormat | null | undefined }, + context: { + format: NodeLoaderHooksFormat | null | undefined; + importAssertions?: NodeImportAssertions; + }, defaultLoad: typeof load ): Promise<{ format: NodeLoaderHooksFormat; @@ -176,7 +186,10 @@ export function createEsmHooks(tsNodeService: Service) { // Call the new defaultLoad() to get the source const { source: rawSource } = await defaultLoad( url, - { format }, + { + format, + importAssertions: context.importAssertions, + }, defaultLoad ); diff --git a/tests/esm-import-assertions/car.json b/tests/esm-import-assertions/car.json new file mode 100644 index 000000000..a63dfe91d --- /dev/null +++ b/tests/esm-import-assertions/car.json @@ -0,0 +1,5 @@ +{ + "color": "fuchsia", + "doors": "open", + "seats": 2 +} diff --git a/tests/esm-import-assertions/importJson.ts b/tests/esm-import-assertions/importJson.ts new file mode 100644 index 000000000..61723f2df --- /dev/null +++ b/tests/esm-import-assertions/importJson.ts @@ -0,0 +1,14 @@ +import carData from './car.json' assert { type: 'json' }; + +if (carData.color !== 'fuchsia') throw new Error('failed to import json'); + +const { default: dynamicCarData } = await import('./car.json', { + assert: { type: 'json' }, +}); + +if (dynamicCarData.doors !== 'open') + throw new Error('failed to dynamically import json'); + +console.log( + `A ${carData.color} car has ${carData.seats} seats and the doors are ${dynamicCarData.doors}.` +); diff --git a/tests/esm-import-assertions/package.json b/tests/esm-import-assertions/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/tests/esm-import-assertions/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/esm-import-assertions/tsconfig.json b/tests/esm-import-assertions/tsconfig.json new file mode 100644 index 000000000..d626b9278 --- /dev/null +++ b/tests/esm-import-assertions/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "ESNext", + "target": "ESNext", + "resolveJsonModule": true, + "allowJs": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": true + } +}