From 5694b80302ede375b76441b08c3f24c2fb0a7bc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 10:27:37 +0900 Subject: [PATCH 01/14] Add a test --- crates/swc/tests/fixture/issues-8xxx/8674/input/.swcrc | 6 ++++++ crates/swc/tests/fixture/issues-8xxx/8674/input/index.ts | 2 ++ crates/swc/tests/fixture/issues-8xxx/8674/input/src/foo.ts | 1 + 3 files changed, 9 insertions(+) create mode 100644 crates/swc/tests/fixture/issues-8xxx/8674/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-8xxx/8674/input/index.ts create mode 100644 crates/swc/tests/fixture/issues-8xxx/8674/input/src/foo.ts diff --git a/crates/swc/tests/fixture/issues-8xxx/8674/input/.swcrc b/crates/swc/tests/fixture/issues-8xxx/8674/input/.swcrc new file mode 100644 index 000000000000..0620ec21b573 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8674/input/.swcrc @@ -0,0 +1,6 @@ +{ + "$schema": "http://json.schemastore.org/swcrc", + "jsc": { + "baseUrl": "." + } +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8674/input/index.ts b/crates/swc/tests/fixture/issues-8xxx/8674/input/index.ts new file mode 100644 index 000000000000..87a1949d3304 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8674/input/index.ts @@ -0,0 +1,2 @@ +import { foo } from "src/foo" +console.log(foo) \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8674/input/src/foo.ts b/crates/swc/tests/fixture/issues-8xxx/8674/input/src/foo.ts new file mode 100644 index 000000000000..3deda8047e15 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8674/input/src/foo.ts @@ -0,0 +1 @@ +export { } \ No newline at end of file From e0c10266517abd2f7c2d5f9c29d6defbb8a58d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 10:28:18 +0900 Subject: [PATCH 02/14] Update test refs --- crates/swc/tests/fixture/issues-8xxx/8674/output/index.ts | 2 ++ crates/swc/tests/fixture/issues-8xxx/8674/output/src/foo.ts | 1 + 2 files changed, 3 insertions(+) create mode 100644 crates/swc/tests/fixture/issues-8xxx/8674/output/index.ts create mode 100644 crates/swc/tests/fixture/issues-8xxx/8674/output/src/foo.ts diff --git a/crates/swc/tests/fixture/issues-8xxx/8674/output/index.ts b/crates/swc/tests/fixture/issues-8xxx/8674/output/index.ts new file mode 100644 index 000000000000..ec453b47e021 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8674/output/index.ts @@ -0,0 +1,2 @@ +import { foo } from "./src/foo"; +console.log(foo); diff --git a/crates/swc/tests/fixture/issues-8xxx/8674/output/src/foo.ts b/crates/swc/tests/fixture/issues-8xxx/8674/output/src/foo.ts new file mode 100644 index 000000000000..2234b9cae16d --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8674/output/src/foo.ts @@ -0,0 +1 @@ +export { }; From d60dbac2949cf10b259f139d3d7fd824a74caeab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 11:23:10 +0900 Subject: [PATCH 03/14] Add a node test --- .../__tests__/transform/issue_8674_test.mjs | 28 +++++++++++++++++++ node-swc/tests/issue-8674/src/bar.ts | 1 + node-swc/tests/issue-8674/src/foo.ts | 1 + 3 files changed, 30 insertions(+) create mode 100644 node-swc/__tests__/transform/issue_8674_test.mjs create mode 100644 node-swc/tests/issue-8674/src/bar.ts create mode 100644 node-swc/tests/issue-8674/src/foo.ts diff --git a/node-swc/__tests__/transform/issue_8674_test.mjs b/node-swc/__tests__/transform/issue_8674_test.mjs new file mode 100644 index 000000000000..7d6bf8bad979 --- /dev/null +++ b/node-swc/__tests__/transform/issue_8674_test.mjs @@ -0,0 +1,28 @@ +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import swc from "../../.."; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +it("should transpile import path correctly", async () => { + const baseUrl = path.resolve(__dirname, "../../tests/issue-8674"); + console.log("baseUrl", baseUrl); + + const { code } = await swc.transform( + ` + import { foo } from "src/foo" + console.log(foo) + `, + { + jsc: { + baseUrl, + }, + } + ); + + expect(code).toMatchInlineSnapshot(` + "import { foo } from "./src/foo"; + console.log(foo); + " + `); +}); diff --git a/node-swc/tests/issue-8674/src/bar.ts b/node-swc/tests/issue-8674/src/bar.ts new file mode 100644 index 000000000000..4548a26ba14d --- /dev/null +++ b/node-swc/tests/issue-8674/src/bar.ts @@ -0,0 +1 @@ +export default 'bar' diff --git a/node-swc/tests/issue-8674/src/foo.ts b/node-swc/tests/issue-8674/src/foo.ts new file mode 100644 index 000000000000..7e942cf45c8a --- /dev/null +++ b/node-swc/tests/issue-8674/src/foo.ts @@ -0,0 +1 @@ +export default 'foo' From 51783cf67bc2f3d5e901e33cc87dea9aab5e318f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 11:32:21 +0900 Subject: [PATCH 04/14] Rename --- crates/swc_ecma_loader/src/resolvers/node.rs | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/crates/swc_ecma_loader/src/resolvers/node.rs b/crates/swc_ecma_loader/src/resolvers/node.rs index e08a8bd1b4b5..cb60f55df585 100644 --- a/crates/swc_ecma_loader/src/resolvers/node.rs +++ b/crates/swc_ecma_loader/src/resolvers/node.rs @@ -413,10 +413,10 @@ impl NodeModulesResolver { Ok(None) } - fn resolve_filename(&self, base: &FileName, target: &str) -> Result { + fn resolve_filename(&self, base: &FileName, module_specifier: &str) -> Result { debug!( "Resolving {} from {:#?} for {:#?}", - target, base, self.target_env + module_specifier, base, self.target_env ); let base = match base { @@ -437,10 +437,10 @@ impl NodeModulesResolver { if let Some(pkg_base) = find_package_root(base) { if let Some(item) = BROWSER_CACHE.get(&pkg_base) { let value = item.value(); - if value.module_ignores.contains(target) { - return Ok(FileName::Custom(target.into())); + if value.module_ignores.contains(module_specifier) { + return Ok(FileName::Custom(module_specifier.into())); } - if let Some(rewrite) = value.module_rewrites.get(target) { + if let Some(rewrite) = value.module_rewrites.get(module_specifier) { return self.wrap(Some(rewrite.to_path_buf())); } } @@ -449,21 +449,21 @@ impl NodeModulesResolver { // Handle builtin modules for nodejs if let TargetEnv::Node = self.target_env { - if target.starts_with("node:") { - return Ok(FileName::Custom(target.into())); + if module_specifier.starts_with("node:") { + return Ok(FileName::Custom(module_specifier.into())); } - if is_core_module(target) { - return Ok(FileName::Custom(format!("node:{}", target))); + if is_core_module(module_specifier) { + return Ok(FileName::Custom(format!("node:{}", module_specifier))); } } // Aliases allow browser shims to be renamed so we can // map `stream` to `stream-browserify` for example - let target = if let Some(alias) = self.alias.get(target) { + let target = if let Some(alias) = self.alias.get(module_specifier) { &alias[..] } else { - target + module_specifier }; let target_path = Path::new(target); From 6f311c55d1eb64024a8d66c6a8e6343ab9116831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 11:36:41 +0900 Subject: [PATCH 05/14] Fix node resolver --- crates/swc_ecma_loader/src/resolvers/node.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/crates/swc_ecma_loader/src/resolvers/node.rs b/crates/swc_ecma_loader/src/resolvers/node.rs index cb60f55df585..eb44710a4075 100644 --- a/crates/swc_ecma_loader/src/resolvers/node.rs +++ b/crates/swc_ecma_loader/src/resolvers/node.rs @@ -419,6 +419,21 @@ impl NodeModulesResolver { module_specifier, base, self.target_env ); + { + // Handle absolute path + + let path = Path::new(module_specifier); + + if let Ok(file) = self + .resolve_as_file(path) + .or_else(|_| self.resolve_as_directory(path, false)) + { + if let Ok(file) = self.wrap(file) { + return Ok(file); + } + } + } + let base = match base { FileName::Real(v) => v, _ => bail!("node-resolver supports only files"), From 497f3a1dea681fcf2367bf35fa708c4205a109bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 11:38:51 +0900 Subject: [PATCH 06/14] Update test refs --- node-swc/__tests__/transform/issue_8674_test.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/node-swc/__tests__/transform/issue_8674_test.mjs b/node-swc/__tests__/transform/issue_8674_test.mjs index 7d6bf8bad979..e823bb3f8f49 100644 --- a/node-swc/__tests__/transform/issue_8674_test.mjs +++ b/node-swc/__tests__/transform/issue_8674_test.mjs @@ -7,6 +7,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)); it("should transpile import path correctly", async () => { const baseUrl = path.resolve(__dirname, "../../tests/issue-8674"); console.log("baseUrl", baseUrl); + process.chdir(baseUrl); const { code } = await swc.transform( ` From 9d2b03c0bad0577435eca4334c8f876e4f9ff840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 17:07:55 +0900 Subject: [PATCH 07/14] fix windws --- crates/swc_ecma_loader/src/resolvers/tsc.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/crates/swc_ecma_loader/src/resolvers/tsc.rs b/crates/swc_ecma_loader/src/resolvers/tsc.rs index b7794652bd17..9905d11a87a2 100644 --- a/crates/swc_ecma_loader/src/resolvers/tsc.rs +++ b/crates/swc_ecma_loader/src/resolvers/tsc.rs @@ -311,9 +311,6 @@ where } let path = self.base_url.join(module_specifier); - #[cfg(windows)] - let path_string: String = path.to_string_lossy().replace("\\", "/"); - #[cfg(not(windows))] let path_string: String = path.to_string_lossy().to_string(); // https://www.typescriptlang.org/docs/handbook/modules/reference.html#baseurl From 8fed104b16c0283d2d0d7d669e329abf5db1537f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 17:33:04 +0900 Subject: [PATCH 08/14] fix trest --- crates/swc_ecma_loader/tests/tsc_resolver.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/swc_ecma_loader/tests/tsc_resolver.rs b/crates/swc_ecma_loader/tests/tsc_resolver.rs index 9cef9faf5ab5..4bd8e03339d6 100644 --- a/crates/swc_ecma_loader/tests/tsc_resolver.rs +++ b/crates/swc_ecma_loader/tests/tsc_resolver.rs @@ -193,8 +193,10 @@ struct TestResolver(AHashMap); impl Resolve for TestResolver { fn resolve(&self, _: &FileName, src: &str) -> Result { + let src = src.replace("\\", "/"); + self.0 - .get(src) + .get(&src) .cloned() .map(FileName::Custom) .map(|v| Resolution { From 1fcf0117bdd5f7548d34830dfd4350181b3b5396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 17:34:10 +0900 Subject: [PATCH 09/14] cancel in progress --- .github/workflows/CI.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 1047aea7d5f6..b08ed4d14b20 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -19,6 +19,10 @@ env: # https://github.com/actions/setup-node/issues/899#issuecomment-1819151595 SKIP_YARN_COREPACK_CHECK: 1 +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: "${{ github.event_name == 'pull_request' }}" + jobs: cargo-fmt: name: Cargo fmt From 0a5aff5e76d7879f344bcb49f0382014d9dd48d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 17:39:21 +0900 Subject: [PATCH 10/14] clippy --- crates/swc_ecma_loader/tests/tsc_resolver.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_ecma_loader/tests/tsc_resolver.rs b/crates/swc_ecma_loader/tests/tsc_resolver.rs index 4bd8e03339d6..a8cebfa6a926 100644 --- a/crates/swc_ecma_loader/tests/tsc_resolver.rs +++ b/crates/swc_ecma_loader/tests/tsc_resolver.rs @@ -193,7 +193,7 @@ struct TestResolver(AHashMap); impl Resolve for TestResolver { fn resolve(&self, _: &FileName, src: &str) -> Result { - let src = src.replace("\\", "/"); + let src = src.replace('\\', "/"); self.0 .get(&src) From 96d6c4d989524cbe29c88869b67e9c0cc7a157fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 17:42:14 +0900 Subject: [PATCH 11/14] Add a test --- crates/swc/tests/projects.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/crates/swc/tests/projects.rs b/crates/swc/tests/projects.rs index a8381e71bb53..f5a5260232a0 100644 --- a/crates/swc/tests/projects.rs +++ b/crates/swc/tests/projects.rs @@ -1,4 +1,5 @@ use std::{ + env::current_dir, fs::create_dir_all, path::{Path, PathBuf}, }; @@ -1123,6 +1124,37 @@ fn issue_7513_2() { ); } +#[test] +fn issue_8674_1() { + static INPUT: &str = "import { foo } from 'src/foo'"; + + let base_url = current_dir() + .unwrap() + .join("../../node-swc/tests/issue-8674") + .canonicalize() + .unwrap(); + + dbg!(&base_url); + + let output = str_with_opt( + INPUT, + Options { + config: Config { + jsc: JscConfig { + base_url, + ..Default::default() + }, + ..Default::default() + }, + ..Default::default() + }, + ) + .unwrap(); + println!("{}", output); + + assert_eq!(output.to_string(), "import { foo } from \"./src/foo\""); +} + #[testing::fixture("tests/minify/**/input.js")] fn minify(input_js: PathBuf) { let input_dir = input_js.parent().unwrap(); From f1f6b8123ef89f2aedaa03a0bf1474d978fc2f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 17:44:22 +0900 Subject: [PATCH 12/14] cleanup --- crates/swc_ecma_loader/src/resolvers/tsc.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/swc_ecma_loader/src/resolvers/tsc.rs b/crates/swc_ecma_loader/src/resolvers/tsc.rs index 9905d11a87a2..bf8985ab7872 100644 --- a/crates/swc_ecma_loader/src/resolvers/tsc.rs +++ b/crates/swc_ecma_loader/src/resolvers/tsc.rs @@ -311,10 +311,9 @@ where } let path = self.base_url.join(module_specifier); - let path_string: String = path.to_string_lossy().to_string(); // https://www.typescriptlang.org/docs/handbook/modules/reference.html#baseurl - if let Ok(v) = self.invoke_inner_resolver(base, path_string.as_str()) { + if let Ok(v) = self.invoke_inner_resolver(base, &path.to_string_lossy()) { return Ok(v); } From e9cde7bd6766ef927fe4238d72af9356db539fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 17:50:04 +0900 Subject: [PATCH 13/14] Use correct base dir --- crates/swc_ecma_transforms_module/src/path.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/crates/swc_ecma_transforms_module/src/path.rs b/crates/swc_ecma_transforms_module/src/path.rs index 3df6d962f8bb..a7a23766a851 100644 --- a/crates/swc_ecma_transforms_module/src/path.rs +++ b/crates/swc_ecma_transforms_module/src/path.rs @@ -280,13 +280,16 @@ where v.parent() .ok_or_else(|| anyhow!("failed to get parent of {:?}", v))?, ), - FileName::Anon => { - if cfg!(target_arch = "wasm32") { - panic!("Please specify `filename`") - } else { - Cow::Owned(current_dir().expect("failed to get current directory")) + FileName::Anon => match &self.config.base_dir { + Some(v) => Cow::Borrowed(&**v), + None => { + if cfg!(target_arch = "wasm32") { + panic!("Please specify `filename`") + } else { + Cow::Owned(current_dir().expect("failed to get current directory")) + } } - } + }, _ => { unreachable!( "Node path provider does not support using `{:?}` as a base file name", From 5f6b45d7357afd95818b2a1334196ba2584f159f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 4 Mar 2024 17:50:25 +0900 Subject: [PATCH 14/14] fix test --- crates/swc/tests/projects.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc/tests/projects.rs b/crates/swc/tests/projects.rs index f5a5260232a0..c95aea9c2c08 100644 --- a/crates/swc/tests/projects.rs +++ b/crates/swc/tests/projects.rs @@ -1152,7 +1152,7 @@ fn issue_8674_1() { .unwrap(); println!("{}", output); - assert_eq!(output.to_string(), "import { foo } from \"./src/foo\""); + assert_eq!(output.to_string(), "import { foo } from \"./src/foo\";\n"); } #[testing::fixture("tests/minify/**/input.js")]