From e85ad4823429ea48d241bf4c9b385c5bb2dcd5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 4 Sep 2024 14:37:10 +0200 Subject: [PATCH 1/8] feat: Allow importing .cjs files This commit adds support for executing top-level `.cjs` files, as well as import `.cjs` files from within npm packages. Co-Authored-By: Luca Casonato --- cli/resolver.rs | 8 ++++++-- tests/specs/run/import_common_js/__test__.jsonc | 6 ++++++ tests/specs/run/import_common_js/a.js | 7 +++++++ tests/specs/run/import_common_js/index.cjs | 9 +++++++++ tests/specs/run/import_common_js/index.out | 1 + tests/specs/run/import_common_js/main.out | 5 +++++ tests/specs/run/import_common_js/main.ts | 3 +++ .../import_common_js/node_modules/foo/index.mjs | 14 ++++++++++++++ .../import_common_js/node_modules/foo/package.json | 3 +++ tests/specs/run/import_common_js/package.json | 5 +++++ 10 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 tests/specs/run/import_common_js/__test__.jsonc create mode 100644 tests/specs/run/import_common_js/a.js create mode 100644 tests/specs/run/import_common_js/index.cjs create mode 100644 tests/specs/run/import_common_js/index.out create mode 100644 tests/specs/run/import_common_js/main.out create mode 100644 tests/specs/run/import_common_js/main.ts create mode 100644 tests/specs/run/import_common_js/node_modules/foo/index.mjs create mode 100644 tests/specs/run/import_common_js/node_modules/foo/package.json create mode 100644 tests/specs/run/import_common_js/package.json diff --git a/cli/resolver.rs b/cli/resolver.rs index 3f5f79f778ac90..27f70d2e17185f 100644 --- a/cli/resolver.rs +++ b/cli/resolver.rs @@ -327,7 +327,9 @@ impl NpmModuleLoader { specifier: &ModuleSpecifier, maybe_referrer: Option<&ModuleSpecifier>, ) -> Option> { - if self.node_resolver.in_npm_package(specifier) { + if self.node_resolver.in_npm_package(specifier) + || specifier.path().ends_with(".cjs") + { Some(self.load(specifier, maybe_referrer).await) } else { None @@ -376,7 +378,9 @@ impl NpmModuleLoader { } })?; - let code = if self.cjs_resolutions.contains(specifier) { + let code = if self.cjs_resolutions.contains(specifier) + || specifier.path().ends_with(".cjs") + { // translate cjs to esm if it's cjs and inject node globals let code = match String::from_utf8_lossy(&code) { Cow::Owned(code) => code, diff --git a/tests/specs/run/import_common_js/__test__.jsonc b/tests/specs/run/import_common_js/__test__.jsonc new file mode 100644 index 00000000000000..a09929cdd08cd8 --- /dev/null +++ b/tests/specs/run/import_common_js/__test__.jsonc @@ -0,0 +1,6 @@ +{ + "steps": [ + { "args": "run -R index.cjs", "output": "index.out" }, + { "args": "run -R main.ts", "output": "main.out" } + ] +} diff --git a/tests/specs/run/import_common_js/a.js b/tests/specs/run/import_common_js/a.js new file mode 100644 index 00000000000000..c465ab588b3a6d --- /dev/null +++ b/tests/specs/run/import_common_js/a.js @@ -0,0 +1,7 @@ +function foobar() { + console.log("foobar"); +} + +module.exports = { + foobar, +}; diff --git a/tests/specs/run/import_common_js/index.cjs b/tests/specs/run/import_common_js/index.cjs new file mode 100644 index 00000000000000..18caf81e941ec7 --- /dev/null +++ b/tests/specs/run/import_common_js/index.cjs @@ -0,0 +1,9 @@ +const process = require("process"); +const a = require("./a"); + +console.log(process.cwd()); + +module.exports = { + cwd: process.cwd, + foobar: a.foobar, +}; diff --git a/tests/specs/run/import_common_js/index.out b/tests/specs/run/import_common_js/index.out new file mode 100644 index 00000000000000..494a40897899b8 --- /dev/null +++ b/tests/specs/run/import_common_js/index.out @@ -0,0 +1 @@ +[WILDCARD]/import_common_js diff --git a/tests/specs/run/import_common_js/main.out b/tests/specs/run/import_common_js/main.out new file mode 100644 index 00000000000000..03301b36209602 --- /dev/null +++ b/tests/specs/run/import_common_js/main.out @@ -0,0 +1,5 @@ +hello from foo node module +[WILDCARD]import_common_js +cjsModule.cwd() [WILDCARD]import_common_js +foobar +cjsModule.foobar() undefined diff --git a/tests/specs/run/import_common_js/main.ts b/tests/specs/run/import_common_js/main.ts new file mode 100644 index 00000000000000..65b75b7293b433 --- /dev/null +++ b/tests/specs/run/import_common_js/main.ts @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo(); diff --git a/tests/specs/run/import_common_js/node_modules/foo/index.mjs b/tests/specs/run/import_common_js/node_modules/foo/index.mjs new file mode 100644 index 00000000000000..7eebbcb01767bf --- /dev/null +++ b/tests/specs/run/import_common_js/node_modules/foo/index.mjs @@ -0,0 +1,14 @@ +import process from "node:process"; +import path from "node:path"; + + +export default async function () { + console.log("hello from foo node module"); + + const cjsFileToImport = path.join(process.cwd(), "index.cjs"); + + const cjsModule = await import(cjsFileToImport); + + console.log("cjsModule.cwd()", cjsModule.cwd()); + console.log("cjsModule.foobar()", cjsModule.foobar()); +} diff --git a/tests/specs/run/import_common_js/node_modules/foo/package.json b/tests/specs/run/import_common_js/node_modules/foo/package.json new file mode 100644 index 00000000000000..ac525b7b8663f5 --- /dev/null +++ b/tests/specs/run/import_common_js/node_modules/foo/package.json @@ -0,0 +1,3 @@ +{ + "main": "./index.mjs" +} \ No newline at end of file diff --git a/tests/specs/run/import_common_js/package.json b/tests/specs/run/import_common_js/package.json new file mode 100644 index 00000000000000..add03997e9e717 --- /dev/null +++ b/tests/specs/run/import_common_js/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "foo": "npm:foo" + } +} From e2ae4354c82277661a4eb1513d39df07042eb43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 4 Sep 2024 14:53:01 +0200 Subject: [PATCH 2/8] remove unneeded test --- tests/integration/run_tests.rs | 5 ----- tests/testdata/run/cjs_imports/commonjs.cjs | 1 - tests/testdata/run/cjs_imports/main.out | 1 - tests/testdata/run/cjs_imports/main.ts | 1 - tools/lint.js | 2 +- 5 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 tests/testdata/run/cjs_imports/commonjs.cjs delete mode 100644 tests/testdata/run/cjs_imports/main.out delete mode 100644 tests/testdata/run/cjs_imports/main.ts diff --git a/tests/integration/run_tests.rs b/tests/integration/run_tests.rs index 841ef2d182d9be..19aa8d81dd03fa 100644 --- a/tests/integration/run_tests.rs +++ b/tests/integration/run_tests.rs @@ -1931,11 +1931,6 @@ itest!(es_private_fields { output: "run/es_private_fields.js.out", }); -itest!(cjs_imports { - args: "run --quiet --reload run/cjs_imports/main.ts", - output: "run/cjs_imports/main.out", -}); - itest!(ts_import_from_js { args: "run --quiet --reload run/ts_import_from_js/main.js", output: "run/ts_import_from_js/main.out", diff --git a/tests/testdata/run/cjs_imports/commonjs.cjs b/tests/testdata/run/cjs_imports/commonjs.cjs deleted file mode 100644 index accefceba62b48..00000000000000 --- a/tests/testdata/run/cjs_imports/commonjs.cjs +++ /dev/null @@ -1 +0,0 @@ -console.log("Hello World"); diff --git a/tests/testdata/run/cjs_imports/main.out b/tests/testdata/run/cjs_imports/main.out deleted file mode 100644 index 557db03de997c8..00000000000000 --- a/tests/testdata/run/cjs_imports/main.out +++ /dev/null @@ -1 +0,0 @@ -Hello World diff --git a/tests/testdata/run/cjs_imports/main.ts b/tests/testdata/run/cjs_imports/main.ts deleted file mode 100644 index d8b77c22ebff69..00000000000000 --- a/tests/testdata/run/cjs_imports/main.ts +++ /dev/null @@ -1 +0,0 @@ -import "./commonjs.cjs"; diff --git a/tools/lint.js b/tools/lint.js index d40b1b1fd92827..08b551e984dd33 100755 --- a/tools/lint.js +++ b/tools/lint.js @@ -221,7 +221,7 @@ async function ensureNoNewITests() { "pm_tests.rs": 0, "publish_tests.rs": 0, "repl_tests.rs": 0, - "run_tests.rs": 351, + "run_tests.rs": 350, "shared_library_tests.rs": 0, "task_tests.rs": 30, "test_tests.rs": 75, From adaf644708571403a2316d7dd5dec46326d92c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 4 Sep 2024 15:08:12 +0200 Subject: [PATCH 3/8] lint --- tools/lint.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lint.js b/tools/lint.js index 08b551e984dd33..4bffead0cc34da 100755 --- a/tools/lint.js +++ b/tools/lint.js @@ -221,7 +221,7 @@ async function ensureNoNewITests() { "pm_tests.rs": 0, "publish_tests.rs": 0, "repl_tests.rs": 0, - "run_tests.rs": 350, + "run_tests.rs": 349, "shared_library_tests.rs": 0, "task_tests.rs": 30, "test_tests.rs": 75, From c6145e64e8ea46967c7aac0cd798956d4469ddab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 4 Sep 2024 15:44:20 +0200 Subject: [PATCH 4/8] fix windows --- tests/specs/run/import_common_js/index.out | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/specs/run/import_common_js/index.out b/tests/specs/run/import_common_js/index.out index 494a40897899b8..3650631b7a2320 100644 --- a/tests/specs/run/import_common_js/index.out +++ b/tests/specs/run/import_common_js/index.out @@ -1 +1 @@ -[WILDCARD]/import_common_js +[WILDCARD]import_common_js From 243e81fc70bdac3fb6fa45f526f84d98a11669d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 4 Sep 2024 16:21:25 +0200 Subject: [PATCH 5/8] cast to file url --- tests/specs/run/import_common_js/node_modules/foo/index.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/specs/run/import_common_js/node_modules/foo/index.mjs b/tests/specs/run/import_common_js/node_modules/foo/index.mjs index 7eebbcb01767bf..cc93554c73c3fd 100644 --- a/tests/specs/run/import_common_js/node_modules/foo/index.mjs +++ b/tests/specs/run/import_common_js/node_modules/foo/index.mjs @@ -1,13 +1,13 @@ import process from "node:process"; import path from "node:path"; - +import url from "node:url"; export default async function () { console.log("hello from foo node module"); const cjsFileToImport = path.join(process.cwd(), "index.cjs"); - const cjsModule = await import(cjsFileToImport); + const cjsModule = await import(url.pathToFileURL(cjsFileToImport)); console.log("cjsModule.cwd()", cjsModule.cwd()); console.log("cjsModule.foobar()", cjsModule.foobar()); From 1f7d510e880506048f5d66319c255bd6ba8fe658 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 4 Sep 2024 17:44:16 +0200 Subject: [PATCH 6/8] Update tools/lint.js Signed-off-by: David Sherret --- tools/lint.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lint.js b/tools/lint.js index 4bffead0cc34da..aa12900ad764b6 100755 --- a/tools/lint.js +++ b/tools/lint.js @@ -221,7 +221,7 @@ async function ensureNoNewITests() { "pm_tests.rs": 0, "publish_tests.rs": 0, "repl_tests.rs": 0, - "run_tests.rs": 349, + "run_tests.rs": 348, "shared_library_tests.rs": 0, "task_tests.rs": 30, "test_tests.rs": 75, From 37129e7025a49b6cb886e76374e05302d07d1af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 4 Sep 2024 17:57:24 +0200 Subject: [PATCH 7/8] fix package.json --- tests/specs/run/import_common_js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/specs/run/import_common_js/package.json b/tests/specs/run/import_common_js/package.json index add03997e9e717..03457387ac9377 100644 --- a/tests/specs/run/import_common_js/package.json +++ b/tests/specs/run/import_common_js/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "foo": "npm:foo" + "foo": "*" } } From 15717053efc430d03e755ed9b700b70ddf8e26ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 5 Sep 2024 09:24:38 +0200 Subject: [PATCH 8/8] David's review --- cli/resolver.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/resolver.rs b/cli/resolver.rs index 81fd25db952142..5b657b89533d33 100644 --- a/cli/resolver.rs +++ b/cli/resolver.rs @@ -328,7 +328,7 @@ impl NpmModuleLoader { maybe_referrer: Option<&ModuleSpecifier>, ) -> Option> { if self.node_resolver.in_npm_package(specifier) - || specifier.path().ends_with(".cjs") + || (specifier.scheme() == "file" && specifier.path().ends_with(".cjs")) { Some(self.load(specifier, maybe_referrer).await) } else { @@ -379,7 +379,7 @@ impl NpmModuleLoader { })?; let code = if self.cjs_resolutions.contains(specifier) - || specifier.path().ends_with(".cjs") + || (specifier.scheme() == "file" && specifier.path().ends_with(".cjs")) { // translate cjs to esm if it's cjs and inject node globals let code = match String::from_utf8_lossy(&code) {