node/test/es-module
Joyee Cheung 0b9249e335
module: implement the "module-sync" exports condition
This patch implements a "module-sync" exports condition
for packages to supply a sycnrhonous ES module to the
Node.js module loader, no matter it's being required
or imported. This is similar to the "module" condition
that bundlers have been using to support `require(esm)`
in Node.js, and allows dual-package authors to opt into
ESM-first only newer versions of Node.js that supports
require(esm) while avoiding the dual-package hazard.

```json
{
  "type": "module",
  "exports": {
    "node": {
      // On new version of Node.js, both require() and import get
      // the ESM version
      "module-sync": "./index.js",
      // On older version of Node.js, where "module" and
      // require(esm) are not supported, use the transpiled CJS version
      // to avoid dual-package hazard. Library authors can decide
      // to drop support for older versions of Node.js when they think
      // it's time.
      "default": "./dist/index.cjs"
    },
    // On any other environment, use the ESM version.
    "default": "./index.js"
  }
}
```

We end up implementing a condition with a different name
instead of reusing "module", because existing code in the
ecosystem using the "module" condition sometimes also expect
the module resolution for these ESM files to work in CJS
style, which is supported by bundlers, but the native
Node.js loader has intentionally made ESM resolution
different from CJS resolution (e.g. forbidding `import
'./noext'` or `import './directory'`), so it would be
semver-major to implement a `"module"` condition
without implementing the forbidden ESM resolution rules.
For now, this just implments a new condition as semver-minor
so it can be backported to older LTS.

Refs: https://webpack.js.org/guides/package-exports/#target-environment-independent-packages
PR-URL: https://github.com/nodejs/node/pull/54648
Fixes: https://github.com/nodejs/node/issues/52173
Refs: https://github.com/joyeecheung/test-module-condition
Refs: https://github.com/nodejs/node/issues/52697
Reviewed-By: Jacob Smith <jacob@frende.me>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
2024-09-25 06:35:26 +00:00
..
es-module.status Revert "test: set test-esm-loader-resolve-type as flaky" 2023-10-21 15:54:28 +00:00
test-cjs-esm-warn.js module,win: fix long path resolve 2024-08-10 14:12:53 +00:00
test-cjs-legacyMainResolve-permission.js module,win: fix long path resolve 2024-08-10 14:12:53 +00:00
test-cjs-legacyMainResolve.js lib: improve error message when index not found on cjs 2024-07-20 00:22:24 +00:00
test-cjs-prototype-pollution.js
test-dynamic-import-script-lifetime.js module: use symbol in WeakMap to manage host defined options 2023-09-14 15:42:24 +00:00
test-esm-assert-strict.mjs
test-esm-assertionless-json-import.js esm: use import attributes instead of import assertions 2023-10-14 03:52:38 +00:00
test-esm-basic-imports.mjs
test-esm-child-process-fork-main.mjs
test-esm-cjs-builtins.js
test-esm-cjs-exports.js module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-esm-cjs-load-error-note.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-cjs-main.js
test-esm-cjs-named-error.mjs test: ensure never settling promises are detected 2023-10-23 17:55:50 +00:00
test-esm-custom-exports.mjs
test-esm-cyclic-dynamic-import.mjs
test-esm-data-urls.js esm: use Undici/fetch data: URL parser 2024-09-07 10:22:03 +02:00
test-esm-default-type.mjs
test-esm-detect-ambiguous.mjs module: report unfinished TLA in ambiguous modules 2024-09-19 10:34:13 +00:00
test-esm-dns-promises.mjs
test-esm-double-encoding.mjs
test-esm-dynamic-import-attribute.js esm: use import attributes instead of import assertions 2023-10-14 03:52:38 +00:00
test-esm-dynamic-import-attribute.mjs esm: use import attributes instead of import assertions 2023-10-14 03:52:38 +00:00
test-esm-dynamic-import-commonjs.js esm: do not call getSource when format is commonjs 2023-11-29 09:21:54 +00:00
test-esm-dynamic-import-commonjs.mjs esm: do not call getSource when format is commonjs 2023-11-29 09:21:54 +00:00
test-esm-dynamic-import-mutating-fs.js test,benchmark: use tmpdir.fileURL() 2023-08-21 16:42:03 +00:00
test-esm-dynamic-import-mutating-fs.mjs test,benchmark: use tmpdir.fileURL() 2023-08-21 16:42:03 +00:00
test-esm-dynamic-import.js vm: allow dynamic import with a referrer realm 2023-11-01 06:05:13 +00:00
test-esm-encoded-path-native.js
test-esm-encoded-path.mjs
test-esm-error-cache.js
test-esm-example-loader.mjs
test-esm-experimental-warnings.mjs lib,src: drop --experimental-network-imports 2024-07-28 16:33:05 +00:00
test-esm-export-not-found.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-exports-deprecations.mjs
test-esm-exports.mjs test: replace .substr with .slice 2024-05-22 05:08:59 +00:00
test-esm-extension-lookup-deprecation.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-extensionless-esm-and-wasm.mjs test: fix invalid wasm test 2024-09-20 10:42:59 +00:00
test-esm-forbidden-globals.mjs
test-esm-fs-promises.mjs
test-esm-import-assertion-warning.mjs esm: use import attributes instead of import assertions 2023-10-14 03:52:38 +00:00
test-esm-import-attributes-1.mjs esm: use import attributes instead of import assertions 2023-10-14 03:52:38 +00:00
test-esm-import-attributes-2.mjs esm: use import attributes instead of import assertions 2023-10-14 03:52:38 +00:00
test-esm-import-attributes-3.mjs esm: use import attributes instead of import assertions 2023-10-14 03:52:38 +00:00
test-esm-import-attributes-errors.js esm: drop support for import assertions 2024-04-19 00:01:24 +00:00
test-esm-import-attributes-errors.mjs esm: drop support for import assertions 2024-04-19 00:01:24 +00:00
test-esm-import-attributes-validation.js esm: rename error code related to import attributes 2023-10-18 14:27:55 +00:00
test-esm-import-flag.mjs module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-esm-import-json-named-export.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-import-meta-resolve.mjs esm: fix support for URL instances in import.meta.resolve 2024-09-10 01:00:33 +02:00
test-esm-import-meta.mjs esm: add import.meta.dirname and import.meta.filename 2023-10-31 21:11:15 +00:00
test-esm-imports-deprecations.mjs
test-esm-imports.mjs test: replace .substr with .slice 2024-05-22 05:08:59 +00:00
test-esm-initialization.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-invalid-data-urls.js lib: fix MIME overmatch in data URLs 2023-08-13 23:24:22 +02:00
test-esm-invalid-pjson.js module,win: fix long path resolve 2024-04-08 14:37:46 +00:00
test-esm-json-cache.mjs esm: use import attributes instead of import assertions 2023-10-14 03:52:38 +00:00
test-esm-json.mjs test: use tmpdir.refresh() in test-esm-json.mjs 2023-12-20 17:47:39 +00:00
test-esm-live-binding.mjs
test-esm-loader-cache-clearing.js
test-esm-loader-chaining.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-loader-custom-condition.mjs
test-esm-loader-default-resolver.mjs esm: identify parent importing a url with invalid host 2023-09-23 05:41:26 +00:00
test-esm-loader-dependency.mjs
test-esm-loader-event-loop.mjs
test-esm-loader-hooks.mjs module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-esm-loader-http-imports.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-loader-invalid-format.mjs
test-esm-loader-invalid-url.mjs
test-esm-loader-mock.mjs Revert "module: have a single hooks thread for all workers" 2024-06-02 22:10:34 +00:00
test-esm-loader-modulemap.js module: support require()ing synchronous ESM graphs 2024-03-18 18:10:06 +08:00
test-esm-loader-not-found.mjs
test-esm-loader-programmatically.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-loader-resolve-type.mjs test: use tmpdir.refresh() in test-esm-loader-resolve-type.mjs 2023-12-20 18:17:31 +00:00
test-esm-loader-search.js
test-esm-loader-spawn-promisified.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-loader-stringify-text.mjs
test-esm-loader-thenable.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-loader-with-source.mjs esm: do not call getSource when format is commonjs 2023-11-29 09:21:54 +00:00
test-esm-loader-with-syntax-error.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-loader.mjs esm: fix hook name in error message 2023-12-05 19:54:01 +01:00
test-esm-long-path-win.js module,win: fix long path resolve 2024-08-10 14:12:53 +00:00
test-esm-main-lookup.mjs esm: protect ERR_UNSUPPORTED_DIR_IMPORT against prototype pollution 2023-08-11 06:29:14 +00:00
test-esm-module-not-found-commonjs-hint.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-named-exports.mjs Revert "module: have a single hooks thread for all workers" 2024-06-02 22:10:34 +00:00
test-esm-namespace.mjs
test-esm-no-addons.mjs
test-esm-non-js.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-nowarn-exports.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-path-posix.mjs
test-esm-path-win32.mjs
test-esm-pkgname.mjs
test-esm-preserve-symlinks-main.js test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-preserve-symlinks-not-found-plain.mjs
test-esm-preserve-symlinks-not-found.mjs
test-esm-preserve-symlinks.js
test-esm-process.mjs
test-esm-prototype-pollution.mjs
test-esm-recursive-cjs-dependencies.mjs esm: fix loading of CJS modules from ESM 2023-09-06 10:12:14 +00:00
test-esm-repl-imports.js test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-repl.js
test-esm-require-cache.mjs
test-esm-resolve-type.mjs module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-esm-scope-node-modules.mjs
test-esm-shared-loader-dep.mjs
test-esm-shebang.mjs
test-esm-snapshot.mjs
test-esm-source-map.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-symlink-main.js test: use tmpdir.resolve() 2023-08-21 16:41:53 +00:00
test-esm-symlink-type.js
test-esm-symlink.js
test-esm-syntax-error.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-throw-undefined.mjs
test-esm-tla-unfinished.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-tla.mjs
test-esm-type-field-errors.js test: refactor test-esm-type-field-errors 2024-09-06 08:29:26 +00:00
test-esm-type-field.mjs esm: --experimental-default-type flag to flip module defaults 2023-09-29 06:18:44 +00:00
test-esm-type-flag-cli-entry.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-type-flag-errors.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-type-flag-loose-files.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-type-flag-package-scopes.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-type-flag-string-input.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-type-main.mjs
test-esm-undefined-cjs-global-like-variables.js
test-esm-unknown-extension.js test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-url-extname.js esm: --experimental-default-type flag to flip module defaults 2023-09-29 06:18:44 +00:00
test-esm-util-types.mjs
test-esm-virtual-json.mjs Revert "module: have a single hooks thread for all workers" 2024-06-02 22:10:34 +00:00
test-esm-wasm.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-esm-windows.js test: use tmpdir.resolve() 2023-08-21 16:41:53 +00:00
test-import-module-conditional-exports-module.mjs module: implement the "module-sync" exports condition 2024-09-25 06:35:26 +00:00
test-loaders-hidden-from-users.js
test-loaders-unknown-builtin-module.mjs
test-loaders-workers-spawned.mjs test: do not set concurrency on parallelized runs 2024-03-23 21:11:28 +00:00
test-require-module-cached-tla.js module: support require()ing synchronous ESM graphs 2024-03-18 18:10:06 +08:00
test-require-module-conditional-exports-module.js module: implement the "module-sync" exports condition 2024-09-25 06:35:26 +00:00
test-require-module-conditional-exports.js module: support require()ing synchronous ESM graphs 2024-03-18 18:10:06 +08:00
test-require-module-cycle-cjs-esm-esm.js module: cache synchronous module jobs before linking 2024-05-09 00:25:14 +00:00
test-require-module-cycle-esm-cjs-esm-esm.js module: disallow CJS <-> ESM edges in a cycle from require(esm) 2024-04-08 14:45:55 +00:00
test-require-module-cycle-esm-cjs-esm.js module: disallow CJS <-> ESM edges in a cycle from require(esm) 2024-04-08 14:45:55 +00:00
test-require-module-cycle-esm-esm-cjs-esm-esm.js module: disallow CJS <-> ESM edges in a cycle from require(esm) 2024-04-08 14:45:55 +00:00
test-require-module-cycle-esm-esm-cjs-esm.js module: disallow CJS <-> ESM edges in a cycle from require(esm) 2024-04-08 14:45:55 +00:00
test-require-module-default-extension.js module: add __esModule to require()'d ESM 2024-07-11 18:59:31 +00:00
test-require-module-defined-esmodule.js module: add __esModule to require()'d ESM 2024-07-11 18:59:31 +00:00
test-require-module-detect-entry-point-aou.js module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-require-module-detect-entry-point.js module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-require-module-dont-detect-cjs.js module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-require-module-dynamic-import-1.js module: add __esModule to require()'d ESM 2024-07-11 18:59:31 +00:00
test-require-module-dynamic-import-2.js module: add __esModule to require()'d ESM 2024-07-11 18:59:31 +00:00
test-require-module-dynamic-import-3.js module: add __esModule to require()'d ESM 2024-07-11 18:59:31 +00:00
test-require-module-dynamic-import-4.js module: add __esModule to require()'d ESM 2024-07-11 18:59:31 +00:00
test-require-module-errors.js module: support require()ing synchronous ESM graphs 2024-03-18 18:10:06 +08:00
test-require-module-implicit.js module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-require-module-preload.js module: remove bogus assertion in CJS entrypoint handling with --import 2024-09-17 12:28:09 +02:00
test-require-module-tla.js module: support require()ing synchronous ESM graphs 2024-03-18 18:10:06 +08:00
test-require-module-transpiled.js module: add __esModule to require()'d ESM 2024-07-11 18:59:31 +00:00
test-require-module-twice.js module: support require()ing synchronous ESM graphs 2024-03-18 18:10:06 +08:00
test-require-module-with-detection.js module: unflag detect-module 2024-07-20 18:30:46 +00:00
test-require-module.js module: add __esModule to require()'d ESM 2024-07-11 18:59:31 +00:00
test-typescript-commonjs.mjs module: fix strip-types interaction with detect-module 2024-08-03 17:15:11 +00:00
test-typescript-eval.mjs module: fix strip-types interaction with detect-module 2024-08-03 17:15:11 +00:00
test-typescript-module.mjs module: fix strip-types interaction with detect-module 2024-08-03 17:15:11 +00:00
test-typescript-transform.mjs module: use amaro default transform values 2024-08-27 16:39:09 +02:00
test-typescript.mjs test_runner: support typescript module mocking 2024-09-19 13:36:52 +00:00
test-vm-compile-function-leak.js test: use checkIfCollectable in vm leak tests 2023-09-18 23:00:53 +02:00
test-vm-compile-function-lineoffset.js lib: fix compileFunction throws range error for negative numbers 2023-10-06 14:33:46 +00:00
test-vm-contextified-script-leak.js test: deflake test-vm-contextified-script-leak 2023-09-23 03:46:22 +00:00
test-vm-main-context-default-loader.js vm: support using the default loader to handle dynamic import() 2024-02-01 11:45:42 +00:00
test-vm-source-text-module-leak.js v8: implement v8.queryObjects() for memory leak regression testing 2024-03-02 22:11:30 +00:00
test-vm-synthetic-module-leak.js test: use checkIfCollectable in vm leak tests 2023-09-18 23:00:53 +02:00
test-wasm-memory-out-of-bound.js esm: --experimental-default-type flag to flip module defaults 2023-09-29 06:18:44 +00:00
test-wasm-simple.js esm: --experimental-default-type flag to flip module defaults 2023-09-29 06:18:44 +00:00
test-wasm-web-api.js esm: --experimental-default-type flag to flip module defaults 2023-09-29 06:18:44 +00:00
testcfg.py