From 4cb52aaab5d2b5c1dbf74339f63e5440d873addf Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Fri, 29 Sep 2023 22:01:55 -0700 Subject: [PATCH 1/5] esm: unflag extensionless javascript and wasm in module scope --- doc/api/esm.md | 8 +- lib/internal/errors.js | 8 +- lib/internal/modules/esm/get_format.js | 32 ++----- .../test-esm-extensionless-esm-and-wasm.mjs | 93 +++++++++++++++++++ ...nsion.js => test-esm-unknown-extension.js} | 13 +-- 5 files changed, 114 insertions(+), 40 deletions(-) create mode 100644 test/es-module/test-esm-extensionless-esm-and-wasm.mjs rename test/es-module/{test-esm-unknown-or-no-extension.js => test-esm-unknown-extension.js} (65%) diff --git a/doc/api/esm.md b/doc/api/esm.md index bfd40556e5fcab..fa2abac7029b3d 100644 --- a/doc/api/esm.md +++ b/doc/api/esm.md @@ -1009,8 +1009,12 @@ _isImports_, _conditions_) > 5. Let _packageURL_ be the result of **LOOKUP\_PACKAGE\_SCOPE**(_url_). > 6. Let _pjson_ be the result of **READ\_PACKAGE\_JSON**(_packageURL_). > 7. If _pjson?.type_ exists and is _"module"_, then -> 1. If _url_ ends in _".js"_, then -> 1. Return _"module"_. +> 1. If _url_ ends in _".js"_ or has no file extension, then +> 1. If `--experimental-wasm-modules` is enabled and the file at _url_ +> contains the header for a WebAssembly module, then +> 1. Return _"wasm"_. +> 2. Otherwise, +> 1. Return _"module"_. > 2. Return **undefined**. > 8. Otherwise, > 1. Return **undefined**. diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 4928ac97d51537..7111cf57f9c5d1 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -1760,12 +1760,8 @@ E('ERR_UNHANDLED_ERROR', E('ERR_UNKNOWN_BUILTIN_MODULE', 'No such built-in module: %s', Error); E('ERR_UNKNOWN_CREDENTIAL', '%s identifier does not exist: %s', Error); E('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError); -E('ERR_UNKNOWN_FILE_EXTENSION', (ext, path, suggestion) => { - let msg = `Unknown file extension "${ext}" for ${path}`; - if (suggestion) { - msg += `. ${suggestion}`; - } - return msg; +E('ERR_UNKNOWN_FILE_EXTENSION', (ext, path) => { + return `Unknown file extension "${ext}" for ${path}`; }, TypeError); E('ERR_UNKNOWN_MODULE_FORMAT', 'Unknown module format: %s for URL %s', RangeError); diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js index 59ab89f6f76377..dd5630aefed716 100644 --- a/lib/internal/modules/esm/get_format.js +++ b/lib/internal/modules/esm/get_format.js @@ -9,7 +9,6 @@ const { StringPrototypeCharCodeAt, StringPrototypeSlice, } = primordials; -const { basename, relative } = require('path'); const { getOptionValue } = require('internal/options'); const { extensionFormatMap, @@ -22,7 +21,7 @@ const experimentalNetworkImports = const defaultTypeFlag = getOptionValue('--experimental-default-type'); // The next line is where we flip the default to ES modules someday. const defaultType = defaultTypeFlag === 'module' ? 'module' : 'commonjs'; -const { getPackageType, getPackageScopeConfig } = require('internal/modules/esm/resolve'); +const { getPackageType } = require('internal/modules/esm/resolve'); const { fileURLToPath } = require('internal/url'); const { ERR_UNKNOWN_FILE_EXTENSION } = require('internal/errors').codes; @@ -112,17 +111,16 @@ function getFileProtocolModuleFormat(url, context, ignoreErrors) { if (defaultType === 'commonjs') { // Legacy behavior if (packageType === 'none' || packageType === 'commonjs') { return 'commonjs'; - } - // If package type is `module`, fall through to the error case below - } else { // Else defaultType === 'module' - if (underNodeModules(url)) { // Exception for package scopes under `node_modules` - return 'commonjs'; - } - if (packageType === 'none' || packageType === 'module') { - return getFormatOfExtensionlessFile(url); - } // Else packageType === 'commonjs' + } // Else packageType === 'module' + return getFormatOfExtensionlessFile(url); + } // Else defaultType === 'module' + if (underNodeModules(url)) { // Exception for package scopes under `node_modules` return 'commonjs'; } + if (packageType === 'none' || packageType === 'module') { + return getFormatOfExtensionlessFile(url); + } // Else packageType === 'commonjs' + return 'commonjs'; } const format = extensionFormatMap[ext]; @@ -131,17 +129,7 @@ function getFileProtocolModuleFormat(url, context, ignoreErrors) { // Explicit undefined return indicates load hook should rerun format check if (ignoreErrors) { return undefined; } const filepath = fileURLToPath(url); - let suggestion = ''; - if (getPackageType(url) === 'module' && ext === '') { - const config = getPackageScopeConfig(url); - const fileBasename = basename(filepath); - const relativePath = StringPrototypeSlice(relative(config.pjsonPath, filepath), 1); - suggestion = 'Loading extensionless files is not supported inside of "type":"module" package.json contexts ' + - `without --experimental-default-type=module. The package.json file ${config.pjsonPath} caused this "type":"module" ` + - `context. Try changing ${filepath} to have a file extension. Note the "bin" field of package.json can point ` + - `to a file with an extension, for example {"type":"module","bin":{"${fileBasename}":"${relativePath}.js"}}`; - } - throw new ERR_UNKNOWN_FILE_EXTENSION(ext, filepath, suggestion); + throw new ERR_UNKNOWN_FILE_EXTENSION(ext, filepath); } /** diff --git a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs new file mode 100644 index 00000000000000..a57529f3c0a7b4 --- /dev/null +++ b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs @@ -0,0 +1,93 @@ +// Flags: --experimental-wasm-modules +import { mustNotCall, spawnPromisified } from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { describe, it } from 'node:test'; +import { match, ok, strictEqual } from 'node:assert'; + +describe('extensionless ES modules within a "type": "module" package scope', { concurrency: true }, () => { + it('should run as the entry point', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + fixtures.path('es-modules/package-type-module/noext-esm'), + ]); + + strictEqual(stderr, ''); + strictEqual(stdout, 'executed\n'); + strictEqual(code, 0); + strictEqual(signal, null); + }); + + it('should be importable', async () => { + const { default: defaultExport } = + await import(fixtures.fileURL('es-modules/package-type-module/noext-esm')); + strictEqual(defaultExport, 'module'); + }); +}); +describe('extensionless Wasm modules within a "type": "module" package scope', { concurrency: true }, () => { + it('should run as the entry point', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + '--experimental-wasm-modules', + '--no-warnings', + fixtures.path('es-modules/package-type-module/noext-wasm'), + ]); + + strictEqual(stderr, ''); + strictEqual(stdout, 'executed\n'); + strictEqual(code, 0); + strictEqual(signal, null); + }); + + it('should be importable', async () => { + const { add } = await import(fixtures.fileURL('es-modules/package-type-module/noext-wasm')); + strictEqual(add(1, 2), 3); + }); +}); + +describe('extensionless ES modules within no package scope', { concurrency: true }, () => { + // This succeeds with `--experimental-default-type=module` + it('should error as the entry point', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + fixtures.path('es-modules/noext-esm'), + ]); + + match(stderr, /SyntaxError/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + + // This succeeds with `--experimental-default-type=module` + it('should error on import', async () => { + try { + await import(fixtures.fileURL('es-modules/noext-esm')); + mustNotCall(); + } catch (err) { + ok(err instanceof SyntaxError); + } + }); +}); + +describe('extensionless Wasm within no package scope', { concurrency: true }, () => { + // This succeeds with `--experimental-default-type=module` + it('should error as the entry point', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + '--experimental-wasm-modules', + '--no-warnings', + fixtures.path('es-modules/noext-wasm'), + ]); + + match(stderr, /SyntaxError/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + + // This succeeds with `--experimental-default-type=module` + it('should error on import', async () => { + try { + await import(fixtures.fileURL('es-modules/noext-wasm')); + mustNotCall(); + } catch (err) { + ok(err instanceof SyntaxError); + } + }); +}); diff --git a/test/es-module/test-esm-unknown-or-no-extension.js b/test/es-module/test-esm-unknown-extension.js similarity index 65% rename from test/es-module/test-esm-unknown-or-no-extension.js rename to test/es-module/test-esm-unknown-extension.js index 83ebcc6267bfc3..dae9568c523fe5 100644 --- a/test/es-module/test-esm-unknown-or-no-extension.js +++ b/test/es-module/test-esm-unknown-extension.js @@ -7,14 +7,11 @@ const { execPath } = require('node:process'); const { describe, it } = require('node:test'); -// In a "type": "module" package scope, files with unknown extensions or no -// extensions should throw; both when used as a main entry point and also when -// referenced via `import`. -describe('ESM: extensionless and unknown specifiers', { concurrency: true }, () => { +// In a "type": "module" package scope, files with unknown extensions should throw; +// both when used as a main entry point and also when referenced via `import`. +describe('ESM: unknown specifiers', { concurrency: true }, () => { for ( const fixturePath of [ - '/es-modules/package-type-module/noext-esm', - '/es-modules/package-type-module/imports-noext.mjs', '/es-modules/package-type-module/extension.unknown', '/es-modules/package-type-module/imports-unknownext.mjs', ] @@ -27,10 +24,6 @@ describe('ESM: extensionless and unknown specifiers', { concurrency: true }, () assert.strictEqual(signal, null); assert.strictEqual(stdout, ''); assert.match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); - if (fixturePath.includes('noext')) { - // Check for explanation to users - assert.match(stderr, /extensionless/); - } }); } }); From f2ae2d7e524f9e461cafdbb5c14a262fdc68d9b3 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Mon, 2 Oct 2023 14:12:22 -0700 Subject: [PATCH 2/5] Simplify error --- lib/internal/errors.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 7111cf57f9c5d1..a4abc0f49c365d 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -1760,9 +1760,7 @@ E('ERR_UNHANDLED_ERROR', E('ERR_UNKNOWN_BUILTIN_MODULE', 'No such built-in module: %s', Error); E('ERR_UNKNOWN_CREDENTIAL', '%s identifier does not exist: %s', Error); E('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError); -E('ERR_UNKNOWN_FILE_EXTENSION', (ext, path) => { - return `Unknown file extension "${ext}" for ${path}`; -}, TypeError); +E('ERR_UNKNOWN_FILE_EXTENSION', 'Unknown file extension "%s" for %s', TypeError); E('ERR_UNKNOWN_MODULE_FORMAT', 'Unknown module format: %s for URL %s', RangeError); E('ERR_UNKNOWN_SIGNAL', 'Unknown signal: %s', TypeError); From fd3537d821648831756b593f2fac0bb0ccc9e014 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Mon, 2 Oct 2023 17:56:53 -0700 Subject: [PATCH 3/5] Fix extensionless in module package under node_modules --- lib/internal/modules/esm/get_format.js | 2 +- .../test-esm-extensionless-esm-and-wasm.mjs | 6 ++++++ .../test-esm-type-flag-package-scopes.mjs | 14 ++++++++++---- .../dep-with-package-json-type-module/noext-esm | 2 ++ .../dep-with-package-json-type-module/package.json | 8 ++++++++ .../dep.js | 0 .../noext-cjs | 0 .../package.json | 2 +- .../run.js | 0 9 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm create mode 100644 test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/package.json rename test/fixtures/es-modules/package-type-module/node_modules/{dep-with-package-json => dep-with-package-json-without-type}/dep.js (100%) rename test/fixtures/es-modules/package-type-module/node_modules/{dep-with-package-json => dep-with-package-json-without-type}/noext-cjs (100%) rename test/fixtures/es-modules/package-type-module/node_modules/{dep-with-package-json => dep-with-package-json-without-type}/package.json (56%) rename test/fixtures/es-modules/package-type-module/node_modules/{dep-with-package-json => dep-with-package-json-without-type}/run.js (100%) diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js index dd5630aefed716..94435e0952c739 100644 --- a/lib/internal/modules/esm/get_format.js +++ b/lib/internal/modules/esm/get_format.js @@ -115,7 +115,7 @@ function getFileProtocolModuleFormat(url, context, ignoreErrors) { return getFormatOfExtensionlessFile(url); } // Else defaultType === 'module' if (underNodeModules(url)) { // Exception for package scopes under `node_modules` - return 'commonjs'; + return packageType === 'module' ? 'module' : 'commonjs'; } if (packageType === 'none' || packageType === 'module') { return getFormatOfExtensionlessFile(url); diff --git a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs index a57529f3c0a7b4..d5075c5397b0ff 100644 --- a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs +++ b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs @@ -21,6 +21,12 @@ describe('extensionless ES modules within a "type": "module" package scope', { c await import(fixtures.fileURL('es-modules/package-type-module/noext-esm')); strictEqual(defaultExport, 'module'); }); + + it('should be importable from a module scope under node_modules', async () => { + const { default: defaultExport } = + await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm')); + strictEqual(defaultExport, 'module'); + }); }); describe('extensionless Wasm modules within a "type": "module" package scope', { concurrency: true }, () => { it('should run as the entry point', async () => { diff --git a/test/es-module/test-esm-type-flag-package-scopes.mjs b/test/es-module/test-esm-type-flag-package-scopes.mjs index 6b16e8a3ae223b..0df286f95ad0f5 100644 --- a/test/es-module/test-esm-type-flag-package-scopes.mjs +++ b/test/es-module/test-esm-type-flag-package-scopes.mjs @@ -24,6 +24,12 @@ describe('the type flag should change the interpretation of certain files within strictEqual(defaultExport, 'module'); }); + it('should import an extensionless JavaScript file within a "type": "module" scope under node_modules', async () => { + const { default: defaultExport } = + await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm')); + strictEqual(defaultExport, 'module'); + }); + it('should run as Wasm an extensionless Wasm file within a "type": "module" scope', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ '--experimental-default-type=module', @@ -112,7 +118,7 @@ describe(`the type flag should NOT change the interpretation of certain files wi async () => { const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/node_modules/dep-with-package-json/run.js'), + fixtures.path('es-modules/package-type-module/node_modules/dep-with-package-json-without-type/run.js'), ]); strictEqual(stderr, ''); @@ -124,7 +130,7 @@ describe(`the type flag should NOT change the interpretation of certain files wi it(`should import as CommonJS a .js file within a package scope that has no defined "type" and is under node_modules`, async () => { const { default: defaultExport } = - await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json/run.js')); + await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-without-type/run.js')); strictEqual(defaultExport, 42); }); @@ -132,7 +138,7 @@ describe(`the type flag should NOT change the interpretation of certain files wi under node_modules`, async () => { const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/node_modules/dep-with-package-json/noext-cjs'), + fixtures.path('es-modules/package-type-module/node_modules/dep-with-package-json-without-type/noext-cjs'), ]); strictEqual(stderr, ''); @@ -144,7 +150,7 @@ describe(`the type flag should NOT change the interpretation of certain files wi it(`should import as CommonJS an extensionless JavaScript file within a package scope that has no defined "type" and is under node_modules`, async () => { const { default: defaultExport } = - await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json/noext-cjs')); + await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-without-type/noext-cjs')); strictEqual(defaultExport, 42); }); }); diff --git a/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm new file mode 100644 index 00000000000000..251d6e538a1fcf --- /dev/null +++ b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm @@ -0,0 +1,2 @@ +export default 'module'; +console.log('executed'); diff --git a/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/package.json b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/package.json new file mode 100644 index 00000000000000..8d155c74efe78a --- /dev/null +++ b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/package.json @@ -0,0 +1,8 @@ +{ + "name": "dep-with-package-json-type-module", + "type": "module", + "version": "1.0.0", + "exports": { + "./*": "./*" + } +} diff --git a/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/dep.js b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/dep.js similarity index 100% rename from test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/dep.js rename to test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/dep.js diff --git a/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/noext-cjs b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/noext-cjs similarity index 100% rename from test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/noext-cjs rename to test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/noext-cjs diff --git a/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/package.json b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/package.json similarity index 56% rename from test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/package.json rename to test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/package.json index 5ee78b14c414b2..1b83367ebe3f5f 100644 --- a/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/package.json +++ b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/package.json @@ -1,5 +1,5 @@ { - "name": "dep-with-package-json", + "name": "dep-with-package-json-without-type", "version": "1.0.0", "exports": { "./*": "./*" diff --git a/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/run.js b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/run.js similarity index 100% rename from test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json/run.js rename to test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-without-type/run.js From 2041ddd557367b910acb45eea2b9e178a9805182 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Mon, 2 Oct 2023 18:18:54 -0700 Subject: [PATCH 4/5] Wasm too --- lib/internal/modules/esm/get_format.js | 2 +- .../test-esm-extensionless-esm-and-wasm.mjs | 5 +++++ .../test-esm-type-flag-package-scopes.mjs | 5 +++++ .../dep-with-package-json-type-module/noext-wasm | Bin 0 -> 136 bytes .../wasm-dep.mjs | 15 +++++++++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm create mode 100644 test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/wasm-dep.mjs diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js index 94435e0952c739..56d002ca0883ad 100644 --- a/lib/internal/modules/esm/get_format.js +++ b/lib/internal/modules/esm/get_format.js @@ -115,7 +115,7 @@ function getFileProtocolModuleFormat(url, context, ignoreErrors) { return getFormatOfExtensionlessFile(url); } // Else defaultType === 'module' if (underNodeModules(url)) { // Exception for package scopes under `node_modules` - return packageType === 'module' ? 'module' : 'commonjs'; + return packageType === 'module' ? getFormatOfExtensionlessFile(url) : 'commonjs'; } if (packageType === 'none' || packageType === 'module') { return getFormatOfExtensionlessFile(url); diff --git a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs index d5075c5397b0ff..df8f8a6fe9c780 100644 --- a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs +++ b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs @@ -46,6 +46,11 @@ describe('extensionless Wasm modules within a "type": "module" package scope', { const { add } = await import(fixtures.fileURL('es-modules/package-type-module/noext-wasm')); strictEqual(add(1, 2), 3); }); + + it('should be importable from a module scope under node_modules', async () => { + const { add } = await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm')); + strictEqual(add(1, 2), 3); + }); }); describe('extensionless ES modules within no package scope', { concurrency: true }, () => { diff --git a/test/es-module/test-esm-type-flag-package-scopes.mjs b/test/es-module/test-esm-type-flag-package-scopes.mjs index 0df286f95ad0f5..bb1d52ae57ef1a 100644 --- a/test/es-module/test-esm-type-flag-package-scopes.mjs +++ b/test/es-module/test-esm-type-flag-package-scopes.mjs @@ -48,6 +48,11 @@ describe('the type flag should change the interpretation of certain files within const { add } = await import(fixtures.fileURL('es-modules/package-type-module/noext-wasm')); strictEqual(add(1, 2), 3); }); + + it('should import an extensionless Wasm file within a "type": "module" scope under node_modules', async () => { + const { add } = await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm')); + strictEqual(add(1, 2), 3); + }); }); describe(`the type flag should change the interpretation of certain files within a package scope that lacks a diff --git a/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm b/test/fixtures/es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm new file mode 100644 index 0000000000000000000000000000000000000000..9e035904b2e4d0a30ce5a63bcf05cc3a2c8449db GIT binary patch literal 136 zcmZ9COA5k35Jam#kl=s>MAx~130^|TEhaEo*f23T0he=in=IYDDqa=lk_iA^G=gdb zBG>AL9Q@$(Fn;}VPs=uBD{AGr0)Mu(GOe%O7ZMd>X|61DN|4~3^7j7hOM Date: Mon, 2 Oct 2023 18:24:37 -0700 Subject: [PATCH 5/5] Lint --- .../test-esm-extensionless-esm-and-wasm.mjs | 6 ++-- .../test-esm-type-flag-package-scopes.mjs | 28 +++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs index df8f8a6fe9c780..db20bc047feec1 100644 --- a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs +++ b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs @@ -24,7 +24,8 @@ describe('extensionless ES modules within a "type": "module" package scope', { c it('should be importable from a module scope under node_modules', async () => { const { default: defaultExport } = - await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm')); + await import(fixtures.fileURL( + 'es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm')); strictEqual(defaultExport, 'module'); }); }); @@ -48,7 +49,8 @@ describe('extensionless Wasm modules within a "type": "module" package scope', { }); it('should be importable from a module scope under node_modules', async () => { - const { add } = await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm')); + const { add } = await import(fixtures.fileURL( + 'es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm')); strictEqual(add(1, 2), 3); }); }); diff --git a/test/es-module/test-esm-type-flag-package-scopes.mjs b/test/es-module/test-esm-type-flag-package-scopes.mjs index bb1d52ae57ef1a..bf9d7d7ca4944c 100644 --- a/test/es-module/test-esm-type-flag-package-scopes.mjs +++ b/test/es-module/test-esm-type-flag-package-scopes.mjs @@ -24,11 +24,13 @@ describe('the type flag should change the interpretation of certain files within strictEqual(defaultExport, 'module'); }); - it('should import an extensionless JavaScript file within a "type": "module" scope under node_modules', async () => { - const { default: defaultExport } = - await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm')); - strictEqual(defaultExport, 'module'); - }); + it('should import an extensionless JavaScript file within a "type": "module" scope under node_modules', + async () => { + const { default: defaultExport } = + await import(fixtures.fileURL( + 'es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm')); + strictEqual(defaultExport, 'module'); + }); it('should run as Wasm an extensionless Wasm file within a "type": "module" scope', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ @@ -49,10 +51,12 @@ describe('the type flag should change the interpretation of certain files within strictEqual(add(1, 2), 3); }); - it('should import an extensionless Wasm file within a "type": "module" scope under node_modules', async () => { - const { add } = await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm')); - strictEqual(add(1, 2), 3); - }); + it('should import an extensionless Wasm file within a "type": "module" scope under node_modules', + async () => { + const { add } = await import(fixtures.fileURL( + 'es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm')); + strictEqual(add(1, 2), 3); + }); }); describe(`the type flag should change the interpretation of certain files within a package scope that lacks a @@ -135,7 +139,8 @@ describe(`the type flag should NOT change the interpretation of certain files wi it(`should import as CommonJS a .js file within a package scope that has no defined "type" and is under node_modules`, async () => { const { default: defaultExport } = - await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-without-type/run.js')); + await import(fixtures.fileURL( + 'es-modules/package-type-module/node_modules/dep-with-package-json-without-type/run.js')); strictEqual(defaultExport, 42); }); @@ -155,7 +160,8 @@ describe(`the type flag should NOT change the interpretation of certain files wi it(`should import as CommonJS an extensionless JavaScript file within a package scope that has no defined "type" and is under node_modules`, async () => { const { default: defaultExport } = - await import(fixtures.fileURL('es-modules/package-type-module/node_modules/dep-with-package-json-without-type/noext-cjs')); + await import(fixtures.fileURL( + 'es-modules/package-type-module/node_modules/dep-with-package-json-without-type/noext-cjs')); strictEqual(defaultExport, 42); }); });