mirror of
https://github.com/swc-project/swc.git
synced 2024-10-05 12:49:21 +03:00
feat(es/loader): Add more logics to tsconfig.paths handler (#1860)
This commit is contained in:
parent
7488950f90
commit
eaaf32d806
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user