From f9007d3386bbe9f709ce413ac0cf099b86d4c4bf Mon Sep 17 00:00:00 2001 From: snek Date: Tue, 10 Sep 2024 13:12:36 -0700 Subject: feat: require(esm) (#25501) implement require(esm) using `op_import_sync` from deno_core. possible future changes: - cts and mts - replace Deno.core.evalContext to optimize esm syntax detection Fixes: https://github.com/denoland/deno/issues/25487 --- tests/integration/npm_tests.rs | 21 +++++++++------------ .../cjs-require-esm-error/1.0.0/esm/my_es_module.js | 1 - .../cjs-require-esm-error/1.0.0/esm/package.json | 3 --- .../cjs-require-esm-error/1.0.0/esm_mjs.mjs | 1 - .../@denotest/cjs-require-esm-error/1.0.0/index.js | 1 - .../cjs-require-esm-error/1.0.0/package.json | 4 ---- .../cjs-require-esm-error/1.0.0/require_mjs.js | 1 - .../cjs-require-esm/1.0.0/esm/my_es_module.js | 1 + .../cjs-require-esm/1.0.0/esm/package.json | 3 +++ .../npm/@denotest/cjs-require-esm/1.0.0/esm_mjs.mjs | 1 + .../npm/@denotest/cjs-require-esm/1.0.0/index.js | 1 + .../@denotest/cjs-require-esm/1.0.0/package.json | 4 ++++ .../@denotest/cjs-require-esm/1.0.0/require_mjs.js | 1 + tests/specs/run/require_esm/__test__.jsonc | 5 +++++ tests/specs/run/require_esm/async.js | 2 ++ tests/specs/run/require_esm/main.cjs | 5 +++++ tests/specs/run/require_esm/main.out | 13 +++++++++++++ tests/specs/run/require_esm/sync.js | 1 + tests/specs/run/require_esm/sync.mjs | 1 + tests/testdata/node/require_esm/esm.js | 1 + tests/testdata/node/require_esm/main.out | 1 + tests/testdata/node/require_esm/main.ts | 5 +++++ tests/testdata/node/require_esm_error/esm.js | 1 - tests/testdata/node/require_esm_error/main.out | 3 --- tests/testdata/node/require_esm_error/main.ts | 5 ----- tests/testdata/npm/cjs_require_esm/main.out | 4 ++++ tests/testdata/npm/cjs_require_esm/main.ts | 2 ++ tests/testdata/npm/cjs_require_esm_error/main.out | 2 -- tests/testdata/npm/cjs_require_esm_error/main.ts | 1 - tests/testdata/npm/cjs_require_esm_mjs/main.out | 4 ++++ tests/testdata/npm/cjs_require_esm_mjs/main.ts | 2 ++ .../testdata/npm/cjs_require_esm_mjs_error/main.out | 2 -- .../testdata/npm/cjs_require_esm_mjs_error/main.ts | 1 - 33 files changed, 66 insertions(+), 38 deletions(-) delete mode 100644 tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js delete mode 100644 tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm/package.json delete mode 100644 tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs delete mode 100644 tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/index.js delete mode 100644 tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/package.json delete mode 100644 tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js create mode 100644 tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm/my_es_module.js create mode 100644 tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm/package.json create mode 100644 tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm_mjs.mjs create mode 100644 tests/registry/npm/@denotest/cjs-require-esm/1.0.0/index.js create mode 100644 tests/registry/npm/@denotest/cjs-require-esm/1.0.0/package.json create mode 100644 tests/registry/npm/@denotest/cjs-require-esm/1.0.0/require_mjs.js create mode 100644 tests/specs/run/require_esm/__test__.jsonc create mode 100644 tests/specs/run/require_esm/async.js create mode 100644 tests/specs/run/require_esm/main.cjs create mode 100644 tests/specs/run/require_esm/main.out create mode 100644 tests/specs/run/require_esm/sync.js create mode 100644 tests/specs/run/require_esm/sync.mjs create mode 100644 tests/testdata/node/require_esm/esm.js create mode 100644 tests/testdata/node/require_esm/main.out create mode 100644 tests/testdata/node/require_esm/main.ts delete mode 100644 tests/testdata/node/require_esm_error/esm.js delete mode 100644 tests/testdata/node/require_esm_error/main.out delete mode 100644 tests/testdata/node/require_esm_error/main.ts create mode 100644 tests/testdata/npm/cjs_require_esm/main.out create mode 100644 tests/testdata/npm/cjs_require_esm/main.ts delete mode 100644 tests/testdata/npm/cjs_require_esm_error/main.out delete mode 100644 tests/testdata/npm/cjs_require_esm_error/main.ts create mode 100644 tests/testdata/npm/cjs_require_esm_mjs/main.out create mode 100644 tests/testdata/npm/cjs_require_esm_mjs/main.ts delete mode 100644 tests/testdata/npm/cjs_require_esm_mjs_error/main.out delete mode 100644 tests/testdata/npm/cjs_require_esm_mjs_error/main.ts (limited to 'tests') diff --git a/tests/integration/npm_tests.rs b/tests/integration/npm_tests.rs index 61ef0b22d..aaea65d14 100644 --- a/tests/integration/npm_tests.rs +++ b/tests/integration/npm_tests.rs @@ -58,26 +58,23 @@ itest!(cjs_invalid_name_exports { http_server: true, }); -itest!(cjs_require_esm_error { - args: "run --allow-read --quiet npm/cjs_require_esm_error/main.ts", - output: "npm/cjs_require_esm_error/main.out", +itest!(cjs_require_esm { + args: "run --allow-read --quiet npm/cjs_require_esm/main.ts", + output: "npm/cjs_require_esm/main.out", envs: env_vars_for_npm_tests(), http_server: true, - exit_code: 1, }); -itest!(cjs_require_esm_mjs_error { - args: "run --allow-read --quiet npm/cjs_require_esm_mjs_error/main.ts", - output: "npm/cjs_require_esm_mjs_error/main.out", +itest!(cjs_require_esm_mjs { + args: "run --allow-read --quiet npm/cjs_require_esm_mjs/main.ts", + output: "npm/cjs_require_esm_mjs/main.out", envs: env_vars_for_npm_tests(), http_server: true, - exit_code: 1, }); -itest!(require_esm_error { - args: "run --allow-read --quiet node/require_esm_error/main.ts", - output: "node/require_esm_error/main.out", - exit_code: 1, +itest!(require_esm { + args: "run --allow-read --quiet node/require_esm/main.ts", + output: "node/require_esm/main.out", }); itest!(dynamic_import_deno_ts_from_npm { diff --git a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js b/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js deleted file mode 100644 index 0613f1911..000000000 --- a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js +++ /dev/null @@ -1 +0,0 @@ -export class Test {} diff --git a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm/package.json b/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm/package.json deleted file mode 100644 index 3dbc1ca59..000000000 --- a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs b/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs deleted file mode 100644 index 0613f1911..000000000 --- a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs +++ /dev/null @@ -1 +0,0 @@ -export class Test {} diff --git a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/index.js b/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/index.js deleted file mode 100644 index ba630f93b..000000000 --- a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports.Test = require("./esm/my_es_module.js"); diff --git a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/package.json b/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/package.json deleted file mode 100644 index 08cd025f1..000000000 --- a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "@denotest/cjs-require-esm-error", - "version": "1.0.0" -} diff --git a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js b/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js deleted file mode 100644 index ba58e1a80..000000000 --- a/tests/registry/npm/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js +++ /dev/null @@ -1 +0,0 @@ -module.exports.Test = require("./esm_mjs.mjs"); diff --git a/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm/my_es_module.js b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm/my_es_module.js new file mode 100644 index 000000000..0613f1911 --- /dev/null +++ b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm/my_es_module.js @@ -0,0 +1 @@ +export class Test {} diff --git a/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm/package.json b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm_mjs.mjs b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm_mjs.mjs new file mode 100644 index 000000000..0613f1911 --- /dev/null +++ b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/esm_mjs.mjs @@ -0,0 +1 @@ +export class Test {} diff --git a/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/index.js b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/index.js new file mode 100644 index 000000000..ba630f93b --- /dev/null +++ b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/index.js @@ -0,0 +1 @@ +module.exports.Test = require("./esm/my_es_module.js"); diff --git a/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/package.json b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/package.json new file mode 100644 index 000000000..4ab7d0c4b --- /dev/null +++ b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/package.json @@ -0,0 +1,4 @@ +{ + "name": "@denotest/cjs-require-esm", + "version": "1.0.0" +} diff --git a/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/require_mjs.js b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/require_mjs.js new file mode 100644 index 000000000..ba58e1a80 --- /dev/null +++ b/tests/registry/npm/@denotest/cjs-require-esm/1.0.0/require_mjs.js @@ -0,0 +1 @@ +module.exports.Test = require("./esm_mjs.mjs"); diff --git a/tests/specs/run/require_esm/__test__.jsonc b/tests/specs/run/require_esm/__test__.jsonc new file mode 100644 index 000000000..ee7d1eee9 --- /dev/null +++ b/tests/specs/run/require_esm/__test__.jsonc @@ -0,0 +1,5 @@ +{ + "args": "run -A main.cjs", + "output": "main.out", + "exitCode": 1 +} diff --git a/tests/specs/run/require_esm/async.js b/tests/specs/run/require_esm/async.js new file mode 100644 index 000000000..b116c66ac --- /dev/null +++ b/tests/specs/run/require_esm/async.js @@ -0,0 +1,2 @@ +export const async_js = 1; +await {}; diff --git a/tests/specs/run/require_esm/main.cjs b/tests/specs/run/require_esm/main.cjs new file mode 100644 index 000000000..b3418abe1 --- /dev/null +++ b/tests/specs/run/require_esm/main.cjs @@ -0,0 +1,5 @@ +"use strict"; + +console.log(require("./sync.js")); +console.log(require("./sync.mjs")); +require("./async.js"); diff --git a/tests/specs/run/require_esm/main.out b/tests/specs/run/require_esm/main.out new file mode 100644 index 000000000..57b842b34 --- /dev/null +++ b/tests/specs/run/require_esm/main.out @@ -0,0 +1,13 @@ +[Module: null prototype] { sync_js: 1 } +[Module: null prototype] { sync_mjs: 1 } +error: Uncaught (in promise) Error: Top-level await is not allowed in synchronous evaluation + at loadESMFromCJS (node:module:[WILDCARD]) + at Module._compile (node:module:[WILDCARD]) + at Object.Module._extensions..js (node:module:[WILDCARD]) + at Module.load (node:module:[WILDCARD]) + at Function.Module._load (node:module:[WILDCARD]) + at Module.require (node:module:[WILDCARD]) + at require (node:module:[WILDCARD]) + at Object. (file:[WILDCARD]/tests/specs/run/require_esm/main.cjs:[WILDCARD]) + at Object. (file:[WILDCARD]/tests/specs/run/require_esm/main.cjs:[WILDCARD]) + at Module._compile (node:module:[WILDCARD]) diff --git a/tests/specs/run/require_esm/sync.js b/tests/specs/run/require_esm/sync.js new file mode 100644 index 000000000..ca40d4eb7 --- /dev/null +++ b/tests/specs/run/require_esm/sync.js @@ -0,0 +1 @@ +export const sync_js = 1; diff --git a/tests/specs/run/require_esm/sync.mjs b/tests/specs/run/require_esm/sync.mjs new file mode 100644 index 000000000..7a3cc3e27 --- /dev/null +++ b/tests/specs/run/require_esm/sync.mjs @@ -0,0 +1 @@ +export const sync_mjs = 1; diff --git a/tests/testdata/node/require_esm/esm.js b/tests/testdata/node/require_esm/esm.js new file mode 100644 index 000000000..0613f1911 --- /dev/null +++ b/tests/testdata/node/require_esm/esm.js @@ -0,0 +1 @@ +export class Test {} diff --git a/tests/testdata/node/require_esm/main.out b/tests/testdata/node/require_esm/main.out new file mode 100644 index 000000000..aab0d5c28 --- /dev/null +++ b/tests/testdata/node/require_esm/main.out @@ -0,0 +1 @@ +[Module: null prototype] { Test: [class Test] } diff --git a/tests/testdata/node/require_esm/main.ts b/tests/testdata/node/require_esm/main.ts new file mode 100644 index 000000000..67ac808f0 --- /dev/null +++ b/tests/testdata/node/require_esm/main.ts @@ -0,0 +1,5 @@ +import { createRequire } from "node:module"; + +const require = createRequire(import.meta.url); + +console.log(require("./esm.js")); diff --git a/tests/testdata/node/require_esm_error/esm.js b/tests/testdata/node/require_esm_error/esm.js deleted file mode 100644 index 0613f1911..000000000 --- a/tests/testdata/node/require_esm_error/esm.js +++ /dev/null @@ -1 +0,0 @@ -export class Test {} diff --git a/tests/testdata/node/require_esm_error/main.out b/tests/testdata/node/require_esm_error/main.out deleted file mode 100644 index 3db23ff24..000000000 --- a/tests/testdata/node/require_esm_error/main.out +++ /dev/null @@ -1,3 +0,0 @@ -error: Uncaught (in promise) Error: require() of ES Module [WILDCARD]esm.js from [WILDCARD]main.ts not supported. Instead change the require to a dynamic import() which is available in all CommonJS modules. - at [WILDCARD] - at file:///[WILDCARD]/require_esm_error/main.ts:5:1 diff --git a/tests/testdata/node/require_esm_error/main.ts b/tests/testdata/node/require_esm_error/main.ts deleted file mode 100644 index 612e91714..000000000 --- a/tests/testdata/node/require_esm_error/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createRequire } from "node:module"; - -const require = createRequire(import.meta.url); - -require("./esm.js"); diff --git a/tests/testdata/npm/cjs_require_esm/main.out b/tests/testdata/npm/cjs_require_esm/main.out new file mode 100644 index 000000000..4afceccc9 --- /dev/null +++ b/tests/testdata/npm/cjs_require_esm/main.out @@ -0,0 +1,4 @@ +[Module: null prototype] { + Test: [Module: null prototype] { Test: [class Test] }, + default: { Test: [Module: null prototype] { Test: [class Test] } } +} diff --git a/tests/testdata/npm/cjs_require_esm/main.ts b/tests/testdata/npm/cjs_require_esm/main.ts new file mode 100644 index 000000000..069d4b60e --- /dev/null +++ b/tests/testdata/npm/cjs_require_esm/main.ts @@ -0,0 +1,2 @@ +import * as ns from "npm:@denotest/cjs-require-esm"; +console.log(ns); diff --git a/tests/testdata/npm/cjs_require_esm_error/main.out b/tests/testdata/npm/cjs_require_esm_error/main.out deleted file mode 100644 index b6ade6904..000000000 --- a/tests/testdata/npm/cjs_require_esm_error/main.out +++ /dev/null @@ -1,2 +0,0 @@ -error: Uncaught (in promise) Error: require() of ES Module [WILDCARD]my_es_module.js from [WILDCARD]index.js not supported. Instead change the require to a dynamic import() which is available in all CommonJS modules. - [WILDCARD] diff --git a/tests/testdata/npm/cjs_require_esm_error/main.ts b/tests/testdata/npm/cjs_require_esm_error/main.ts deleted file mode 100644 index 3fbb1215a..000000000 --- a/tests/testdata/npm/cjs_require_esm_error/main.ts +++ /dev/null @@ -1 +0,0 @@ -import "npm:@denotest/cjs-require-esm-error"; diff --git a/tests/testdata/npm/cjs_require_esm_mjs/main.out b/tests/testdata/npm/cjs_require_esm_mjs/main.out new file mode 100644 index 000000000..4afceccc9 --- /dev/null +++ b/tests/testdata/npm/cjs_require_esm_mjs/main.out @@ -0,0 +1,4 @@ +[Module: null prototype] { + Test: [Module: null prototype] { Test: [class Test] }, + default: { Test: [Module: null prototype] { Test: [class Test] } } +} diff --git a/tests/testdata/npm/cjs_require_esm_mjs/main.ts b/tests/testdata/npm/cjs_require_esm_mjs/main.ts new file mode 100644 index 000000000..d753c2a83 --- /dev/null +++ b/tests/testdata/npm/cjs_require_esm_mjs/main.ts @@ -0,0 +1,2 @@ +import * as ns from "npm:@denotest/cjs-require-esm/require_mjs.js"; +console.log(ns); diff --git a/tests/testdata/npm/cjs_require_esm_mjs_error/main.out b/tests/testdata/npm/cjs_require_esm_mjs_error/main.out deleted file mode 100644 index e779cfaf8..000000000 --- a/tests/testdata/npm/cjs_require_esm_mjs_error/main.out +++ /dev/null @@ -1,2 +0,0 @@ -error: Uncaught (in promise) Error: require() of ES Module [WILDCARD]esm_mjs.mjs from [WILDCARD]require_mjs.js not supported. Instead change the require to a dynamic import() which is available in all CommonJS modules. - [WILDCARD] diff --git a/tests/testdata/npm/cjs_require_esm_mjs_error/main.ts b/tests/testdata/npm/cjs_require_esm_mjs_error/main.ts deleted file mode 100644 index 2121f1dbb..000000000 --- a/tests/testdata/npm/cjs_require_esm_mjs_error/main.ts +++ /dev/null @@ -1 +0,0 @@ -import "npm:@denotest/cjs-require-esm-error/require_mjs.js"; -- cgit v1.2.3