fix(es/modules): Adjust absolute path while rewriting imports (#4776)

This commit is contained in:
Donny/강동윤 2022-05-24 20:00:26 +09:00 committed by GitHub
parent 555e08d4d6
commit 75bb8586cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 42 deletions

1
Cargo.lock generated
View File

@ -3639,6 +3639,7 @@ dependencies = [
"ahash",
"anyhow",
"indexmap",
"path-clean",
"pathdiff",
"serde",
"serde_json",

View File

@ -17,6 +17,7 @@ Inflector = "0.11.4"
ahash = "0.7.4"
anyhow = "1.0.41"
indexmap = "1.8.0"
path-clean = "0.1.0"
pathdiff = "0.2.0"
serde = { version = "1.0.118", features = ["derive"] }
swc_atoms = { version = "0.2", path = "../swc_atoms" }

View File

@ -1,11 +1,13 @@
use std::{
borrow::Cow,
env::current_dir,
path::{Component, PathBuf},
io,
path::{Component, Path, PathBuf},
sync::Arc,
};
use anyhow::{Context, Error};
use path_clean::PathClean;
use pathdiff::diff_paths;
use swc_atoms::JsWord;
use swc_common::{FileName, Mark, Span, DUMMY_SP};
@ -183,7 +185,7 @@ where
}
};
let target = match target {
let mut target = match target {
FileName::Real(v) => v,
FileName::Custom(s) => return Ok(to_specifier(&s, None, orig_ext)),
_ => {
@ -193,7 +195,7 @@ where
)
}
};
let base = match base {
let mut base = match base {
FileName::Real(v) => Cow::Borrowed(v),
FileName::Anon => {
if cfg!(target_arch = "wasm32") {
@ -212,6 +214,11 @@ where
let is_file = target.is_file();
if base.is_absolute() != target.is_absolute() {
base = Cow::Owned(absolute_path(&base)?);
target = absolute_path(&target)?;
}
let rel_path = diff_paths(
&target,
match base.parent() {
@ -279,3 +286,14 @@ macro_rules! impl_ref {
impl_ref!(P, &'_ P);
impl_ref!(P, Box<P>);
impl_ref!(P, Arc<P>);
fn absolute_path(path: &Path) -> io::Result<PathBuf> {
let absolute_path = if path.is_absolute() {
path.to_path_buf()
} else {
std::env::current_dir()?.join(path)
}
.clean();
Ok(absolute_path)
}

View File

@ -1,6 +1,6 @@
import { displayB } from "$DIR/tests/fixture-manual/issue-4730/input/packages/b/src/index";
import { displayB } from "../packages/b/src/index";
async function display() {
const displayA = await import("$DIR/tests/fixture-manual/issue-4730/input/packages/a/src/index").then((c)=>c.displayA);
const displayA = await import("../packages/a/src/index").then((c)=>c.displayA);
console.log(displayA());
console.log(displayB());
}

View File

@ -4,8 +4,7 @@ use std::{
};
use indexmap::IndexMap;
use swc_common::{chain, FileName};
use swc_ecma_ast::*;
use swc_common::FileName;
use swc_ecma_loader::resolvers::{node::NodeModulesResolver, tsc::TsConfigResolver};
use swc_ecma_parser::Syntax;
use swc_ecma_transforms_module::{
@ -13,7 +12,6 @@ use swc_ecma_transforms_module::{
rewriter::import_rewriter,
};
use swc_ecma_transforms_testing::test_fixture;
use swc_ecma_visit::{as_folder, VisitMut, VisitMutWith};
use testing::run_test2;
type TestProvider = NodeImportResolver<NodeModulesResolver>;
@ -36,34 +34,6 @@ fn node_modules() {
.unwrap();
}
struct Normalizer;
impl VisitMut for Normalizer {
fn visit_mut_import_decl(&mut self, i: &mut ImportDecl) {
if cfg!(target_os = "windows") {
let path = Path::new(&*i.src.value).with_extension("ts");
if path.is_file() {
let p = path.canonicalize().unwrap().with_extension("");
i.src.value = p.display().to_string().into()
}
}
}
fn visit_mut_call_expr(&mut self, i: &mut CallExpr) {
i.visit_mut_children_with(self);
if let Callee::Import(..) = i.callee {
if let Expr::Lit(Lit::Str(s)) = &mut *i.args[0].expr {
let path = Path::new(&*s.value).with_extension("ts");
if path.is_file() {
let p = path.canonicalize().unwrap().with_extension("");
s.value = p.display().to_string().into()
}
}
}
}
}
#[test]
fn issue_4730() {
let dir = Path::new("tests/fixture-manual/issue-4730");
@ -109,12 +79,9 @@ fn issue_4730() {
let resolver = paths_resolver(&input_dir, rules);
chain!(
import_rewriter(
FileName::Real(input_dir.join("src").join("index.js")),
resolver,
),
as_folder(Normalizer)
import_rewriter(
FileName::Real(input_dir.join("src").join("index.js")),
resolver,
)
},
&input_dir.join("src").join("index.js"),