Skip to content

Commit 9d26d04

Browse files
authored
feat: provide referrer when requesting jsx config (#565)
1 parent 867b61c commit 9d26d04

File tree

5 files changed

+72
-21
lines changed

5 files changed

+72
-21
lines changed

lib/lib.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,21 @@ struct JsResolveTypesResponse {
164164
}
165165

166166
impl Resolver for JsResolver {
167-
fn default_jsx_import_source(&self) -> Option<String> {
167+
fn default_jsx_import_source(
168+
&self,
169+
_referrer: &ModuleSpecifier,
170+
) -> Option<String> {
168171
self.maybe_default_jsx_import_source.clone()
169172
}
170173

171-
fn default_jsx_import_source_types(&self) -> Option<String> {
174+
fn default_jsx_import_source_types(
175+
&self,
176+
_referrer: &ModuleSpecifier,
177+
) -> Option<String> {
172178
self.maybe_default_jsx_import_source_types.clone()
173179
}
174180

175-
fn jsx_import_source_module(&self) -> &str {
181+
fn jsx_import_source_module(&self, _referrer: &ModuleSpecifier) -> &str {
176182
self
177183
.maybe_jsx_import_source_module
178184
.as_deref()

src/graph.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -2694,7 +2694,7 @@ pub(crate) fn parse_js_module_from_module_info(
26942694
let has_jsx_import_source_pragma = module_info.jsx_import_source.is_some();
26952695
let res = module_info.jsx_import_source.or_else(|| {
26962696
maybe_resolver.and_then(|r| {
2697-
r.default_jsx_import_source()
2697+
r.default_jsx_import_source(&module.specifier)
26982698
.map(|import_source| SpecifierWithRange {
26992699
text: import_source,
27002700
range: PositionRange {
@@ -2706,7 +2706,7 @@ pub(crate) fn parse_js_module_from_module_info(
27062706
});
27072707
if let Some(import_source) = res {
27082708
let jsx_import_source_module = maybe_resolver
2709-
.map(|r| r.jsx_import_source_module())
2709+
.map(|r| r.jsx_import_source_module(&module.specifier))
27102710
.unwrap_or(DEFAULT_JSX_IMPORT_SOURCE_MODULE);
27112711
let specifier_text =
27122712
format!("{}/{}", import_source.text, jsx_import_source_module);
@@ -2733,15 +2733,15 @@ pub(crate) fn parse_js_module_from_module_info(
27332733
let mut types_res = module_info.jsx_import_source_types;
27342734
if types_res.is_none() && !has_jsx_import_source_pragma {
27352735
types_res = maybe_resolver.and_then(|r| {
2736-
r.default_jsx_import_source_types().map(|import_source| {
2737-
SpecifierWithRange {
2736+
r.default_jsx_import_source_types(&module.specifier).map(
2737+
|import_source| SpecifierWithRange {
27382738
text: import_source,
27392739
range: PositionRange {
27402740
start: Position::zeroed(),
27412741
end: Position::zeroed(),
27422742
},
2743-
}
2744-
})
2743+
},
2744+
)
27452745
});
27462746
}
27472747
if let Some(import_source_types) = types_res {

src/lib.rs

+46-7
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ mod tests {
204204
use source::NpmResolvePkgReqsResult;
205205
use source::ResolutionMode;
206206
use source::Source;
207+
use source::DEFAULT_JSX_IMPORT_SOURCE_MODULE;
207208
use std::cell::RefCell;
208209
use std::collections::BTreeMap;
209210

@@ -1313,11 +1314,14 @@ console.log(a);
13131314
struct MockImportMapResolver {}
13141315

13151316
impl Resolver for MockImportMapResolver {
1316-
fn default_jsx_import_source(&self) -> Option<String> {
1317+
fn default_jsx_import_source(
1318+
&self,
1319+
_referrer: &ModuleSpecifier,
1320+
) -> Option<String> {
13171321
None
13181322
}
13191323

1320-
fn jsx_import_source_module(&self) -> &str {
1324+
fn jsx_import_source_module(&self, _referrer: &ModuleSpecifier) -> &str {
13211325
source::DEFAULT_JSX_IMPORT_SOURCE_MODULE
13221326
}
13231327

@@ -3536,7 +3540,10 @@ export const foo = 'bar';"#,
35363540
#[derive(Debug)]
35373541
struct R;
35383542
impl Resolver for R {
3539-
fn default_jsx_import_source(&self) -> Option<String> {
3543+
fn default_jsx_import_source(
3544+
&self,
3545+
_referrer: &ModuleSpecifier,
3546+
) -> Option<String> {
35403547
Some("https://example.com/preact".into())
35413548
}
35423549
}
@@ -3587,7 +3594,10 @@ export const foo = 'bar';"#,
35873594
#[derive(Debug)]
35883595
struct R;
35893596
impl Resolver for R {
3590-
fn default_jsx_import_source_types(&self) -> Option<String> {
3597+
fn default_jsx_import_source_types(
3598+
&self,
3599+
_referrer: &ModuleSpecifier,
3600+
) -> Option<String> {
35913601
Some("https://example.com/preact-types".into())
35923602
}
35933603
}
@@ -3634,7 +3644,14 @@ export const foo = 'bar';"#,
36343644
#[derive(Debug)]
36353645
struct R;
36363646
impl Resolver for R {
3637-
fn default_jsx_import_source(&self) -> Option<String> {
3647+
fn default_jsx_import_source(
3648+
&self,
3649+
referrer: &ModuleSpecifier,
3650+
) -> Option<String> {
3651+
assert_eq!(
3652+
referrer,
3653+
&ModuleSpecifier::parse("file:///a/test01.tsx").unwrap()
3654+
);
36383655
Some("https://example.com/preact".into())
36393656
}
36403657
}
@@ -3679,13 +3696,35 @@ export const foo = 'bar';"#,
36793696
#[derive(Debug)]
36803697
struct R;
36813698
impl Resolver for R {
3682-
fn default_jsx_import_source(&self) -> Option<String> {
3699+
fn default_jsx_import_source(
3700+
&self,
3701+
referrer: &ModuleSpecifier,
3702+
) -> Option<String> {
3703+
assert_eq!(
3704+
referrer,
3705+
&ModuleSpecifier::parse("file:///a/test01.tsx").unwrap()
3706+
);
36833707
Some("https://example.com/preact".into())
36843708
}
36853709

3686-
fn default_jsx_import_source_types(&self) -> Option<String> {
3710+
fn default_jsx_import_source_types(
3711+
&self,
3712+
referrer: &ModuleSpecifier,
3713+
) -> Option<String> {
3714+
assert_eq!(
3715+
referrer,
3716+
&ModuleSpecifier::parse("file:///a/test01.tsx").unwrap()
3717+
);
36873718
Some("https://example.com/preact-types".into())
36883719
}
3720+
3721+
fn jsx_import_source_module(&self, referrer: &ModuleSpecifier) -> &str {
3722+
assert_eq!(
3723+
referrer,
3724+
&ModuleSpecifier::parse("file:///a/test01.tsx").unwrap()
3725+
);
3726+
DEFAULT_JSX_IMPORT_SOURCE_MODULE
3727+
}
36893728
}
36903729

36913730
let specifier = ModuleSpecifier::parse("file:///a/test01.tsx").unwrap();

src/source/mod.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -441,21 +441,27 @@ pub trait Resolver: fmt::Debug {
441441
/// configured. If this method returns `Some` and a JSX file is encountered
442442
/// that does not have an import source specified as a pragma, this import
443443
/// source will be used instead.
444-
fn default_jsx_import_source(&self) -> Option<String> {
444+
fn default_jsx_import_source(
445+
&self,
446+
_referrer: &ModuleSpecifier,
447+
) -> Option<String> {
445448
None
446449
}
447450

448451
/// An optional method that returns the default JSX types import source if one
449452
/// is configured. If this method returns `Some` and a JSX file is encountered
450453
/// that does not have an types import source specified as a pragma, this
451454
/// types import source will be used instead.
452-
fn default_jsx_import_source_types(&self) -> Option<String> {
455+
fn default_jsx_import_source_types(
456+
&self,
457+
_referrer: &ModuleSpecifier,
458+
) -> Option<String> {
453459
None
454460
}
455461

456462
/// An optional method which returns the JSX import source module which will
457463
/// be appended to any JSX import source pragmas identified.
458-
fn jsx_import_source_module(&self) -> &str {
464+
fn jsx_import_source_module(&self, _referrer: &ModuleSpecifier) -> &str {
459465
DEFAULT_JSX_IMPORT_SOURCE_MODULE
460466
}
461467

tests/specs/ecosystem/mrii/rocket_io/0_1_3.test

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ mrii/rocket-io/0.1.3
7272
-- stdout --
7373

7474
-- stderr --
75-
error: Uncaught Error: [ERR_PACKAGE_PATH_NOT_EXPORTED] Package subpath './build/esm/socket' is not defined for types by "exports" in '<global_npm_dir>/socket.io-client/4.7.5/package.json' imported from 'file://<tmpdir>/src/types/socket-reserved-events.ts'
76-
at Object.resolveModuleNameLiterals (ext:deno_tsc/99_main_compiler.js:789:28)
75+
error: Error: [ERR_PACKAGE_PATH_NOT_EXPORTED] Package subpath './build/esm/socket' is not defined for types by "exports" in '<global_npm_dir>/socket.io-client/4.7.5/package.json' imported from 'file://<tmpdir>/src/types/socket-reserved-events.ts'
76+
at Object.resolveModuleNameLiterals (ext:deno_tsc/99_main_compiler.js:794:28)
7777
at resolveModuleNamesWorker (ext:deno_tsc/00_typescript.js:125466:20)
7878
at resolveNamesReusingOldState (ext:deno_tsc/00_typescript.js:125608:14)
7979
at resolveModuleNamesReusingOldState (ext:deno_tsc/00_typescript.js:125564:12)

0 commit comments

Comments
 (0)