summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2020-10-02 19:13:23 +0800
committerGitHub <noreply@github.com>2020-10-02 13:13:23 +0200
commit6825d7f13d51006967c2638b4433fb582cd6ddbc (patch)
tree89a2bc7860a64b52098797698e3c159d1522088d
parent454de99680db7fdf93bcf0f41beb81d594e17271 (diff)
fix(cli/repl): use a default referrer when empty (#7794)
This makes use of a default referrer when its empty in repl mode so that dynamic imports work in the global evaluation context. Co-authored-by: Bartek Iwanczuk <biwanczuk@gmail.com>
-rw-r--r--cli/state.rs14
-rw-r--r--cli/tests/integration_tests.rs12
-rw-r--r--core/modules.rs32
-rw-r--r--core/runtime.rs14
4 files changed, 60 insertions, 12 deletions
diff --git a/cli/state.rs b/cli/state.rs
index 7a3541af7..ef63dad97 100644
--- a/cli/state.rs
+++ b/cli/state.rs
@@ -46,10 +46,23 @@ impl CliModuleLoader {
impl ModuleLoader for CliModuleLoader {
fn resolve(
&self,
+ op_state: Rc<RefCell<OpState>>,
specifier: &str,
referrer: &str,
is_main: bool,
) -> Result<ModuleSpecifier, AnyError> {
+ let global_state = {
+ let state = op_state.borrow();
+ state.borrow::<Arc<GlobalState>>().clone()
+ };
+
+ // FIXME(bartlomieju): hacky way to provide compatibility with repl
+ let referrer = if referrer.is_empty() && global_state.flags.repl {
+ "<unknown>"
+ } else {
+ referrer
+ };
+
if !is_main {
if let Some(import_map) = &self.import_map {
let result = import_map.resolve(specifier, referrer)?;
@@ -58,6 +71,7 @@ impl ModuleLoader for CliModuleLoader {
}
}
}
+
let module_specifier =
ModuleSpecifier::resolve_import(specifier, referrer)?;
diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs
index 20e43ca29..2e2f91d0a 100644
--- a/cli/tests/integration_tests.rs
+++ b/cli/tests/integration_tests.rs
@@ -1253,6 +1253,18 @@ fn repl_test_multiline() {
}
#[test]
+fn repl_test_import() {
+ let (out, _) = util::run_and_collect_output(
+ true,
+ "repl",
+ Some(vec!["import('./subdir/auto_print_hello.ts')"]),
+ Some(vec![("NO_COLOR".to_owned(), "1".to_owned())]),
+ false,
+ );
+ assert!(out.contains("hello!\n"));
+}
+
+#[test]
fn repl_test_eval_unterminated() {
let (out, err) = util::run_and_collect_output(
true,
diff --git a/core/modules.rs b/core/modules.rs
index 294bcfb05..235bfeb4e 100644
--- a/core/modules.rs
+++ b/core/modules.rs
@@ -65,6 +65,7 @@ pub trait ModuleLoader {
/// apply import map for child imports.
fn resolve(
&self,
+ op_state: Rc<RefCell<OpState>>,
specifier: &str,
referrer: &str,
_is_main: bool,
@@ -109,6 +110,7 @@ pub(crate) struct NoopModuleLoader;
impl ModuleLoader for NoopModuleLoader {
fn resolve(
&self,
+ _op_state: Rc<RefCell<OpState>>,
_specifier: &str,
_referrer: &str,
_is_main: bool,
@@ -207,14 +209,23 @@ impl RecursiveModuleLoad {
pub async fn prepare(self) -> (ModuleLoadId, Result<Self, AnyError>) {
let (module_specifier, maybe_referrer) = match self.state {
LoadState::ResolveMain(ref specifier, _) => {
- let spec = match self.loader.resolve(specifier, ".", true) {
- Ok(spec) => spec,
- Err(e) => return (self.id, Err(e)),
- };
+ let spec =
+ match self
+ .loader
+ .resolve(self.op_state.clone(), specifier, ".", true)
+ {
+ Ok(spec) => spec,
+ Err(e) => return (self.id, Err(e)),
+ };
(spec, None)
}
LoadState::ResolveImport(ref specifier, ref referrer) => {
- let spec = match self.loader.resolve(specifier, referrer, false) {
+ let spec = match self.loader.resolve(
+ self.op_state.clone(),
+ specifier,
+ referrer,
+ false,
+ ) {
Ok(spec) => spec,
Err(e) => return (self.id, Err(e)),
};
@@ -243,11 +254,13 @@ impl RecursiveModuleLoad {
fn add_root(&mut self) -> Result<(), AnyError> {
let module_specifier = match self.state {
LoadState::ResolveMain(ref specifier, _) => {
- self.loader.resolve(specifier, ".", true)?
- }
- LoadState::ResolveImport(ref specifier, ref referrer) => {
- self.loader.resolve(specifier, referrer, false)?
+ self
+ .loader
+ .resolve(self.op_state.clone(), specifier, ".", true)?
}
+ LoadState::ResolveImport(ref specifier, ref referrer) => self
+ .loader
+ .resolve(self.op_state.clone(), specifier, referrer, false)?,
_ => unreachable!(),
};
@@ -571,6 +584,7 @@ mod tests {
impl ModuleLoader for MockLoader {
fn resolve(
&self,
+ _op_state: Rc<RefCell<OpState>>,
specifier: &str,
referrer: &str,
_is_root: bool,
diff --git a/core/runtime.rs b/core/runtime.rs
index 64396c1f5..ecb9828f4 100644
--- a/core/runtime.rs
+++ b/core/runtime.rs
@@ -608,7 +608,7 @@ impl JsRuntimeState {
let referrer = self.modules.get_name(referrer_id).unwrap();
let specifier = self
.loader
- .resolve(specifier, referrer, false)
+ .resolve(self.op_state.clone(), specifier, referrer, false)
.expect("Module should have been already resolved");
self.modules.get_id(specifier.as_str()).unwrap_or(0)
}
@@ -813,8 +813,12 @@ impl JsRuntime {
let import_specifier =
module.get_module_request(i).to_rust_string_lossy(tc_scope);
let state = state_rc.borrow();
- let module_specifier =
- state.loader.resolve(&import_specifier, name, false)?;
+ let module_specifier = state.loader.resolve(
+ state.op_state.clone(),
+ &import_specifier,
+ name,
+ false,
+ )?;
import_specifiers.push(module_specifier);
}
@@ -1917,6 +1921,7 @@ pub mod tests {
impl ModuleLoader for ModsLoader {
fn resolve(
&self,
+ _op_state: Rc<RefCell<OpState>>,
specifier: &str,
referrer: &str,
_is_main: bool,
@@ -2029,6 +2034,7 @@ pub mod tests {
impl ModuleLoader for DynImportErrLoader {
fn resolve(
&self,
+ _op_state: Rc<RefCell<OpState>>,
specifier: &str,
referrer: &str,
_is_main: bool,
@@ -2091,6 +2097,7 @@ pub mod tests {
impl ModuleLoader for DynImportOkLoader {
fn resolve(
&self,
+ _op_state: Rc<RefCell<OpState>>,
specifier: &str,
referrer: &str,
_is_main: bool,
@@ -2219,6 +2226,7 @@ pub mod tests {
impl ModuleLoader for ModsLoader {
fn resolve(
&self,
+ _op_state: Rc<RefCell<OpState>>,
specifier: &str,
referrer: &str,
_is_main: bool,