diff options
author | Kitson Kelly <me@kitsonkelly.com> | 2021-11-09 12:26:39 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-09 12:26:39 +1100 |
commit | f5eb177f50a0bf37bc6bd9d87b447c73a53b6ea5 (patch) | |
tree | 1990dadf311de59b45c677e234219a161f3ebf9d /cli/resolver.rs | |
parent | 45425c114610516287c8e5831c9b6f023dfc8180 (diff) |
feat(cli): support React 17 JSX transforms (#12631)
Closes #8440
Diffstat (limited to 'cli/resolver.rs')
-rw-r--r-- | cli/resolver.rs | 53 |
1 files changed, 47 insertions, 6 deletions
diff --git a/cli/resolver.rs b/cli/resolver.rs index d3427c58b..da8fafe67 100644 --- a/cli/resolver.rs +++ b/cli/resolver.rs @@ -1,27 +1,29 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. use deno_core::error::AnyError; +use deno_core::resolve_import; use deno_core::ModuleSpecifier; use deno_graph::source::Resolver; use import_map::ImportMap; +use std::sync::Arc; /// Wraps an import map to be used when building a deno_graph module graph. /// This is done to avoid having `import_map` be a direct dependency of /// `deno_graph`. -#[derive(Debug)] -pub(crate) struct ImportMapResolver<'a>(&'a ImportMap); +#[derive(Debug, Clone)] +pub(crate) struct ImportMapResolver(Arc<ImportMap>); -impl<'a> ImportMapResolver<'a> { - pub fn new(import_map: &'a ImportMap) -> Self { +impl ImportMapResolver { + pub fn new(import_map: Arc<ImportMap>) -> Self { Self(import_map) } - pub fn as_resolver(&'a self) -> &'a dyn Resolver { + pub fn as_resolver(&self) -> &dyn Resolver { self } } -impl Resolver for ImportMapResolver<'_> { +impl Resolver for ImportMapResolver { fn resolve( &self, specifier: &str, @@ -33,3 +35,42 @@ impl Resolver for ImportMapResolver<'_> { .map_err(|err| err.into()) } } + +#[derive(Debug, Default, Clone)] +pub(crate) struct JsxResolver { + jsx_import_source_module: String, + maybe_import_map_resolver: Option<ImportMapResolver>, +} + +impl JsxResolver { + pub fn new( + jsx_import_source_module: String, + maybe_import_map_resolver: Option<ImportMapResolver>, + ) -> Self { + Self { + jsx_import_source_module, + maybe_import_map_resolver, + } + } + + pub fn as_resolver(&self) -> &dyn Resolver { + self + } +} + +impl Resolver for JsxResolver { + fn jsx_import_source_module(&self) -> &str { + self.jsx_import_source_module.as_str() + } + + fn resolve( + &self, + specifier: &str, + referrer: &ModuleSpecifier, + ) -> Result<ModuleSpecifier, AnyError> { + self.maybe_import_map_resolver.as_ref().map_or_else( + || resolve_import(specifier, referrer.as_str()).map_err(|err| err.into()), + |r| r.resolve(specifier, referrer), + ) + } +} |