From 44f8b05f5bf45453496e80c69dc7850aa98c9af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 24 Jan 2024 23:44:06 +0100 Subject: feat: Expand 'imports' section of deno.json (#22087) This commit adds automatic expansion of "imports" field in "deno.json" file. If "npm:" or "jsr:" imports are encountered we automatically try to add a "directory" remapping. Previously users had to specify entries for both `foo` and `foo/` to be able to import like `import { symbol1 } from "foo";` and `import { symbol2 } from "foo/some_file.js"`: ``` { "imports": { "foo": "npm:@foo/bar", "foo/": "npm:/@foo/bar/", } ``` With this change users can only add entry for `foo`: ``` { "imports": { "foo": "npm:@foo/bar", } ``` The entry for `foo/` will be provided automatically. Similarly if user provides "directory" remapping explicitly, we will not overwrite it. --- cli/tests/integration/run_tests.rs | 61 ++++++++++++++++++++++ cli/tests/testdata/compile/npm_fs/main.ts | 2 +- .../registry/@denotest/esm-basic/1.0.0/other.mjs | 3 ++ .../testdata/package_json/basic/main.info.out | 2 +- 4 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs (limited to 'cli/tests') diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index 6c82cfeec..b8acce94d 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -5113,3 +5113,64 @@ itest!(warn_on_deprecated_api_with_env_var { http_server: true, exit_code: 0, }); + +#[test] +fn deno_json_imports_expand() { + let test_context = TestContextBuilder::for_npm().use_temp_cwd().build(); + let dir = test_context.temp_dir(); + dir.write( + "deno.json", + r#"{ + "imports": { + "basic": "npm:@denotest/esm-basic" + } +}"#, + ); + + dir.write( + "main.ts", + r#" +// import map should resolve +import { setValue, getValue } from "basic"; +// this entry should have been added automatically +import { hello } from "basic/other.mjs"; + +setValue(5); +console.log(getValue()); +console.log(hello()); +"#, + ); + let output = test_context.new_command().args("run main.ts").run(); + output.assert_matches_text("[WILDCARD]5\nhello, world!\n"); +} + +#[test] +fn deno_json_imports_expand_doesnt_overwrite_existing_entries() { + let test_context = TestContextBuilder::for_npm().use_temp_cwd().build(); + let dir = test_context.temp_dir(); + dir.write( + "deno.json", + r#"{ + "imports": { + "basic": "npm:@denotest/esm-basic", + "basic/": "npm:/@denotest/sub-folders/folder_index_js/" + } +}"#, + ); + + dir.write( + "main.ts", + r#" +// import map should resolve +import { setValue, getValue } from "basic"; +// this entry should map to explicitly specified "basic/" mapping +import { add } from "basic/index.js"; + +setValue(5); +console.log(getValue()); +console.log(add(3, 4)); +"#, + ); + let output = test_context.new_command().args("run main.ts").run(); + output.assert_matches_text("[WILDCARD]5\n7\n"); +} diff --git a/cli/tests/testdata/compile/npm_fs/main.ts b/cli/tests/testdata/compile/npm_fs/main.ts index f9951d7a4..6361610a9 100644 --- a/cli/tests/testdata/compile/npm_fs/main.ts +++ b/cli/tests/testdata/compile/npm_fs/main.ts @@ -154,7 +154,7 @@ await assert.rejects( } // read dir -const readDirNames = ["main.d.mts", "main.mjs", "package.json"]; +const readDirNames = ["main.d.mts", "main.mjs", "other.mjs", "package.json"]; { const names = Array.from(Deno.readDirSync(dirPath)) .map((e) => e.name); diff --git a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs b/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs new file mode 100644 index 000000000..00ed99da4 --- /dev/null +++ b/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs @@ -0,0 +1,3 @@ +export function hello() { + return "hello, world!"; +} \ No newline at end of file diff --git a/cli/tests/testdata/package_json/basic/main.info.out b/cli/tests/testdata/package_json/basic/main.info.out index b283a0ee0..892c0612a 100644 --- a/cli/tests/testdata/package_json/basic/main.info.out +++ b/cli/tests/testdata/package_json/basic/main.info.out @@ -5,4 +5,4 @@ size: [WILDCARD] file:///[WILDCARD]/main.ts (63B) └─┬ file:///[WILDCARD]/lib.ts (166B) - └── npm:/@denotest/esm-basic@1.0.0 (416B) + └── npm:/@denotest/esm-basic@1.0.0 (471B) -- cgit v1.2.3