diff --git a/crates/swc/src/config/mod.rs b/crates/swc/src/config/mod.rs index 9ef2e5ca14b7..43a87f999d3a 100644 --- a/crates/swc/src/config/mod.rs +++ b/crates/swc/src/config/mod.rs @@ -1958,7 +1958,7 @@ fn build_resolver(base_url: PathBuf, paths: CompiledPaths) -> Box, } impl NodeImportResolver where R: Resolve, { + #[deprecated(note = "Use `with_base_dir`")] pub fn new(resolver: R) -> Self { - Self { resolver } + Self::with_base_dir(resolver, None) + } + + pub fn with_base_dir(resolver: R, base_dir: Option) -> Self { + #[cfg(not(target_arch = "wasm32"))] + if let Some(base_dir) = &base_dir { + assert!( + base_dir.is_absolute(), + "base_dir({}) must be absolute. Please ensure that `jsc.baseUrl` is specified \ + correctly.", + base_dir.display() + ); + } + + Self { resolver, base_dir } } } @@ -193,8 +209,8 @@ where }; if base.is_absolute() != target.is_absolute() { - base = Cow::Owned(absolute_path(&base)?); - target = absolute_path(&target)?; + base = Cow::Owned(absolute_path(self.base_dir.as_deref(), &base)?); + target = absolute_path(self.base_dir.as_deref(), &target)?; } let rel_path = diff_paths( @@ -259,11 +275,14 @@ impl_ref!(P, &'_ P); impl_ref!(P, Box

); impl_ref!(P, Arc

); -fn absolute_path(path: &Path) -> io::Result { +fn absolute_path(base_dir: Option<&Path>, path: &Path) -> io::Result { let absolute_path = if path.is_absolute() { path.to_path_buf() } else { - std::env::current_dir()?.join(path) + match base_dir { + Some(base_dir) => base_dir.join(path), + None => current_dir()?.join(path), + } } .clean(); diff --git a/crates/swc_ecma_transforms_module/tests/common_js.rs b/crates/swc_ecma_transforms_module/tests/common_js.rs index df4e99126f3a..297121d971b9 100644 --- a/crates/swc_ecma_transforms_module/tests/common_js.rs +++ b/crates/swc_ecma_transforms_module/tests/common_js.rs @@ -24,11 +24,11 @@ fn tr( let unresolved_mark = Mark::new(); let top_level_mark = Mark::new(); - let avalible_set = FeatureFlag::all(); + let available_set = FeatureFlag::all(); chain!( resolver(unresolved_mark, top_level_mark, typescript), - common_js(unresolved_mark, config, avalible_set, Some(comments)), + common_js(unresolved_mark, config, available_set, Some(comments)), ) } diff --git a/crates/swc_ecma_transforms_module/tests/path_node.rs b/crates/swc_ecma_transforms_module/tests/path_node.rs index 7f4544a909da..6ce2a4388f76 100644 --- a/crates/swc_ecma_transforms_module/tests/path_node.rs +++ b/crates/swc_ecma_transforms_module/tests/path_node.rs @@ -1,7 +1,4 @@ -use std::{ - env::current_dir, - path::{Path, PathBuf}, -}; +use std::path::{Path, PathBuf}; use indexmap::IndexMap; use serde::Deserialize; @@ -37,7 +34,9 @@ fn node_modules() { #[test] fn issue_4730() { - let dir = Path::new("tests/fixture-manual/issue-4730"); + let dir = Path::new("tests/fixture-manual/issue-4730") + .canonicalize() + .unwrap(); let input_dir = dir.join("input"); let output_dir = dir.join("output"); @@ -47,11 +46,7 @@ fn issue_4730() { let mut paths = IndexMap::new(); paths.insert( "@print/a".into(), - vec![current_dir() - .unwrap() - .join("tests") - .join("fixture-manual") - .join("issue-4730") + vec![dir .join("input") .join("packages") .join("a") @@ -62,11 +57,7 @@ fn issue_4730() { ); paths.insert( "@print/b".into(), - vec![current_dir() - .unwrap() - .join("tests") - .join("fixture-manual") - .join("issue-4730") + vec![dir .join("input") .join("packages") .join("b") @@ -97,14 +88,21 @@ fn paths_resolver( base_url: impl AsRef, rules: Vec<(String, Vec)>, ) -> JscPathsProvider { - let base_url = base_url.as_ref().to_path_buf(); + let base_url = base_url + .as_ref() + .to_path_buf() + .canonicalize() + .expect("failed to canonicalize"); dbg!(&base_url); - NodeImportResolver::new(TsConfigResolver::new( - NodeModulesResolver::new(swc_ecma_loader::TargetEnv::Node, Default::default(), true), - base_url, - rules, - )) + NodeImportResolver::with_base_dir( + TsConfigResolver::new( + NodeModulesResolver::new(swc_ecma_loader::TargetEnv::Node, Default::default(), true), + base_url.clone(), + rules, + ), + Some(base_url), + ) } #[derive(Deserialize)] diff --git a/node-swc/__tests__/transform/issue_4730_test.mjs b/node-swc/__tests__/transform/issue_4730_test.mjs index dbe62c0cd48a..f2886191d561 100644 --- a/node-swc/__tests__/transform/issue_4730_test.mjs +++ b/node-swc/__tests__/transform/issue_4730_test.mjs @@ -1,5 +1,5 @@ import swc from "../../.."; -import { dirname, join } from "path"; +import { dirname, join, resolve } from "path"; import { platform } from "os"; import { fileURLToPath } from "url"; @@ -21,6 +21,7 @@ it("should work", async () => { dynamicImport: true, }, target: "es2020", + baseUrl: resolve('.'), paths: { "@print/a": [join(dir, "./packages/a/src/index.ts")], "@print/b": [join(dir, "./packages/b/src/index.ts")], diff --git a/node-swc/src/binding.js b/node-swc/src/binding.js index ea14db72eb51..24f51fc28c1c 100644 --- a/node-swc/src/binding.js +++ b/node-swc/src/binding.js @@ -1,3 +1,9 @@ +/* tslint:disable */ +/* eslint-disable */ +/* prettier-ignore */ + +/* auto-generated by NAPI-RS */ + const { existsSync, readFileSync } = require('fs') const { join } = require('path') @@ -11,7 +17,7 @@ function isMusl() { // For Node 10 if (!process.report || typeof process.report.getReport !== 'function') { try { - const lddPath = require('child_process').execSync('which ldd').toString().trim(); + const lddPath = require('child_process').execSync('which ldd').toString().trim() return readFileSync(lddPath, 'utf8').includes('musl') } catch (e) { return true @@ -102,6 +108,15 @@ switch (platform) { } break case 'darwin': + localFileExisted = existsSync(join(__dirname, 'swc.darwin-universal.node')) + try { + if (localFileExisted) { + nativeBinding = require('./swc.darwin-universal.node') + } else { + nativeBinding = require('@swc/core-darwin-universal') + } + break + } catch {} switch (arch) { case 'x64': localFileExisted = existsSync(join(__dirname, 'swc.darwin-x64.node'))