feat(es/loader): Add more logics to tsconfig.paths handler (#1860)

This commit is contained in:
강동윤 2021-06-27 16:19:05 +09:00 committed by GitHub
parent 7488950f90
commit eaaf32d806
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 10 deletions

View File

@ -6,7 +6,7 @@ edition = "2018"
license = "Apache-2.0/MIT"
name = "swc_ecma_loader"
repository = "https://github.com/swc-project/swc.git"
version = "0.9.0"
version = "0.9.1"
[package.metadata.docs.rs]
all-features = true

View File

@ -3,7 +3,7 @@ use anyhow::{bail, Context, Error};
use dashmap::DashMap;
use once_cell::sync::Lazy;
use regex::Regex;
use std::path::PathBuf;
use std::path::{Component, PathBuf};
use swc_common::FileName;
#[derive(Debug)]
@ -94,6 +94,29 @@ where
R: Resolve,
{
fn resolve(&self, base: &FileName, src: &str) -> Result<FileName, Error> {
if src.starts_with(".") {
if src == ".." || src.starts_with("./") || src.starts_with("../") {
return self
.inner
.resolve(base, src)
.context("not processed by tsc resolver because it's relative import");
}
}
match base {
FileName::Real(v) => {
if v.components().any(|c| match c {
Component::Normal(v) => v == "node_modules",
_ => false,
}) {
return self.inner.resolve(base, src).context(
"not processed by tsc resolver because base module is in node_modules",
);
}
}
_ => {}
}
// https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping
for (from, to) in &self.paths {
match from {

View File

@ -129,6 +129,7 @@ impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> {
/// - fixer if enabled
pub fn finalize<'cmt>(
self,
base_url: String,
paths: CompiledPaths,
base: &FileName,
syntax: Syntax,
@ -198,6 +199,7 @@ impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> {
Optional::new(helpers::inject_helpers(), self.inject_helpers),
ModuleConfig::build(
self.cm.clone(),
base_url,
paths,
base,
self.global_mark,

View File

@ -191,6 +191,7 @@ impl Options {
target,
loose,
keep_class_names,
base_url,
paths,
} = config.jsc;
let target = target.unwrap_or_default();
@ -269,6 +270,7 @@ impl Options {
.fixer(!self.disable_fixer)
.preset_env(config.env)
.finalize(
base_url,
paths.into_iter().collect(),
base,
syntax,
@ -603,6 +605,9 @@ pub struct JscConfig {
#[serde(default)]
pub keep_class_names: bool,
#[serde(default)]
pub base_url: String,
#[serde(default)]
pub paths: Paths,
}
@ -628,6 +633,7 @@ pub enum ModuleConfig {
impl ModuleConfig {
pub fn build(
cm: Arc<SourceMap>,
base_url: String,
paths: CompiledPaths,
base: &FileName,
root_mark: Mark,
@ -651,7 +657,7 @@ impl ModuleConfig {
Some(scope),
))
} else {
let resolver = build_resolver(paths);
let resolver = build_resolver(base_url, paths);
Box::new(modules::common_js::common_js_with_resolver(
resolver,
@ -666,7 +672,7 @@ impl ModuleConfig {
if paths.is_empty() {
Box::new(modules::umd::umd(cm, root_mark, config))
} else {
let resolver = build_resolver(paths);
let resolver = build_resolver(base_url, paths);
Box::new(modules::umd::umd_with_resolver(
resolver, base, cm, root_mark, config,
@ -677,7 +683,7 @@ impl ModuleConfig {
if paths.is_empty() {
Box::new(modules::amd::amd(config))
} else {
let resolver = build_resolver(paths);
let resolver = build_resolver(base_url, paths);
Box::new(modules::amd::amd_with_resolver(resolver, base, config))
}
@ -961,23 +967,27 @@ impl Merge for ConstModulesConfig {
}
}
fn build_resolver(paths: CompiledPaths) -> SwcImportResolver {
static CACHE: Lazy<DashMap<CompiledPaths, SwcImportResolver>> =
fn build_resolver(base_url: String, paths: CompiledPaths) -> SwcImportResolver {
static CACHE: Lazy<DashMap<(String, CompiledPaths), SwcImportResolver>> =
Lazy::new(|| Default::default());
if let Some(cached) = CACHE.get(&paths) {
if let Some(cached) = CACHE.get(&(base_url.clone(), paths.clone())) {
return (*cached).clone();
}
let r = {
let r = TsConfigResolver::new(NodeResolver::default(), ".".into(), paths.clone());
let r = TsConfigResolver::new(
NodeResolver::default(),
base_url.clone().into(),
paths.clone(),
);
let r = CachingResolver::new(40, r);
let r = NodeImportResolver::new(r);
Arc::new(r)
};
CACHE.insert(paths, r.clone());
CACHE.insert((base_url, paths), r.clone());
r
}