diff --git a/src/graph.rs b/src/graph.rs index 386bfbc5..83b8e2d8 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -2694,7 +2694,7 @@ pub(crate) fn parse_js_module_from_module_info( let has_jsx_import_source_pragma = module_info.jsx_import_source.is_some(); let res = module_info.jsx_import_source.or_else(|| { maybe_resolver.and_then(|r| { - r.default_jsx_import_source() + r.default_jsx_import_source(&module.specifier) .map(|import_source| SpecifierWithRange { text: import_source, range: PositionRange { @@ -2706,7 +2706,7 @@ pub(crate) fn parse_js_module_from_module_info( }); if let Some(import_source) = res { let jsx_import_source_module = maybe_resolver - .map(|r| r.jsx_import_source_module()) + .map(|r| r.jsx_import_source_module(&module.specifier)) .unwrap_or(DEFAULT_JSX_IMPORT_SOURCE_MODULE); let specifier_text = format!("{}/{}", import_source.text, jsx_import_source_module); @@ -2733,15 +2733,15 @@ pub(crate) fn parse_js_module_from_module_info( let mut types_res = module_info.jsx_import_source_types; if types_res.is_none() && !has_jsx_import_source_pragma { types_res = maybe_resolver.and_then(|r| { - r.default_jsx_import_source_types().map(|import_source| { - SpecifierWithRange { + r.default_jsx_import_source_types(&module.specifier).map( + |import_source| SpecifierWithRange { text: import_source, range: PositionRange { start: Position::zeroed(), end: Position::zeroed(), }, - } - }) + }, + ) }); } if let Some(import_source_types) = types_res { diff --git a/src/lib.rs b/src/lib.rs index 21647ca3..b8fedf05 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -204,6 +204,7 @@ mod tests { use source::NpmResolvePkgReqsResult; use source::ResolutionMode; use source::Source; + use source::DEFAULT_JSX_IMPORT_SOURCE_MODULE; use std::cell::RefCell; use std::collections::BTreeMap; @@ -1313,11 +1314,14 @@ console.log(a); struct MockImportMapResolver {} impl Resolver for MockImportMapResolver { - fn default_jsx_import_source(&self) -> Option { + fn default_jsx_import_source( + &self, + _referrer: &ModuleSpecifier, + ) -> Option { None } - fn jsx_import_source_module(&self) -> &str { + fn jsx_import_source_module(&self, _referrer: &ModuleSpecifier) -> &str { source::DEFAULT_JSX_IMPORT_SOURCE_MODULE } @@ -3536,7 +3540,10 @@ export const foo = 'bar';"#, #[derive(Debug)] struct R; impl Resolver for R { - fn default_jsx_import_source(&self) -> Option { + fn default_jsx_import_source( + &self, + _referrer: &ModuleSpecifier, + ) -> Option { Some("https://example.com/preact".into()) } } @@ -3587,7 +3594,10 @@ export const foo = 'bar';"#, #[derive(Debug)] struct R; impl Resolver for R { - fn default_jsx_import_source_types(&self) -> Option { + fn default_jsx_import_source_types( + &self, + _referrer: &ModuleSpecifier, + ) -> Option { Some("https://example.com/preact-types".into()) } } @@ -3634,7 +3644,14 @@ export const foo = 'bar';"#, #[derive(Debug)] struct R; impl Resolver for R { - fn default_jsx_import_source(&self) -> Option { + fn default_jsx_import_source( + &self, + referrer: &ModuleSpecifier, + ) -> Option { + assert_eq!( + referrer, + &ModuleSpecifier::parse("file:///a/test01.tsx").unwrap() + ); Some("https://example.com/preact".into()) } } @@ -3679,13 +3696,35 @@ export const foo = 'bar';"#, #[derive(Debug)] struct R; impl Resolver for R { - fn default_jsx_import_source(&self) -> Option { + fn default_jsx_import_source( + &self, + referrer: &ModuleSpecifier, + ) -> Option { + assert_eq!( + referrer, + &ModuleSpecifier::parse("file:///a/test01.tsx").unwrap() + ); Some("https://example.com/preact".into()) } - fn default_jsx_import_source_types(&self) -> Option { + fn default_jsx_import_source_types( + &self, + referrer: &ModuleSpecifier, + ) -> Option { + assert_eq!( + referrer, + &ModuleSpecifier::parse("file:///a/test01.tsx").unwrap() + ); Some("https://example.com/preact-types".into()) } + + fn jsx_import_source_module(&self, referrer: &ModuleSpecifier) -> &str { + assert_eq!( + referrer, + &ModuleSpecifier::parse("file:///a/test01.tsx").unwrap() + ); + DEFAULT_JSX_IMPORT_SOURCE_MODULE + } } let specifier = ModuleSpecifier::parse("file:///a/test01.tsx").unwrap(); diff --git a/src/source/mod.rs b/src/source/mod.rs index 05c1e850..7073b177 100644 --- a/src/source/mod.rs +++ b/src/source/mod.rs @@ -441,7 +441,10 @@ pub trait Resolver: fmt::Debug { /// configured. If this method returns `Some` and a JSX file is encountered /// that does not have an import source specified as a pragma, this import /// source will be used instead. - fn default_jsx_import_source(&self) -> Option { + fn default_jsx_import_source( + &self, + _referrer: &ModuleSpecifier, + ) -> Option { None } @@ -449,13 +452,16 @@ pub trait Resolver: fmt::Debug { /// is configured. If this method returns `Some` and a JSX file is encountered /// that does not have an types import source specified as a pragma, this /// types import source will be used instead. - fn default_jsx_import_source_types(&self) -> Option { + fn default_jsx_import_source_types( + &self, + _referrer: &ModuleSpecifier, + ) -> Option { None } /// An optional method which returns the JSX import source module which will /// be appended to any JSX import source pragmas identified. - fn jsx_import_source_module(&self) -> &str { + fn jsx_import_source_module(&self, _referrer: &ModuleSpecifier) -> &str { DEFAULT_JSX_IMPORT_SOURCE_MODULE }