Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support loading import map from URL #9519

Merged
merged 3 commits into from
Feb 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 0 additions & 33 deletions cli/import_map.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.

use deno_core::error::AnyError;
use deno_core::serde_json;
use deno_core::serde_json::Map;
use deno_core::serde_json::Value;
Expand All @@ -10,8 +9,6 @@ use indexmap::IndexMap;
use std::cmp::Ordering;
use std::error::Error;
use std::fmt;
use std::fs;
use std::io;

#[derive(Debug)]
pub struct ImportMapError {
Expand Down Expand Up @@ -49,30 +46,6 @@ pub struct ImportMap {
}

impl ImportMap {
pub fn load(file_path: &str) -> Result<Self, AnyError> {
let file_url = ModuleSpecifier::resolve_url_or_path(file_path)?.to_string();
let resolved_path = std::env::current_dir().unwrap().join(file_path);
debug!(
"Attempt to load import map: {}",
resolved_path.to_str().unwrap()
);

// Load the contents of import map
let json_string = fs::read_to_string(&resolved_path).map_err(|err| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!(
"Error retrieving import map file at \"{}\": {}",
resolved_path.to_str().unwrap(),
err.to_string()
)
.as_str(),
)
})?;
// The URL of the import map is the base URL for its values.
ImportMap::from_json(&file_url, &json_string).map_err(AnyError::from)
}

pub fn from_json(
base_url: &str,
json_string: &str,
Expand Down Expand Up @@ -476,12 +449,6 @@ mod tests {
use super::*;
use deno_core::serde_json::json;

#[test]
fn load_nonexistent() {
let file_path = "nonexistent_import_map.json";
assert!(ImportMap::load(file_path).is_err());
}

#[test]
fn from_json_1() {
let base_url = "https://deno.land";
Expand Down
2 changes: 1 addition & 1 deletion cli/lsp/sources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub async fn cache(
specifier: &ModuleSpecifier,
maybe_import_map: &Option<ImportMap>,
) -> Result<(), AnyError> {
let program_state = Arc::new(ProgramState::new(Default::default())?);
let program_state = Arc::new(ProgramState::build(Default::default()).await?);
let handler = Arc::new(Mutex::new(FetchHandler::new(
&program_state,
Permissions::allow_all(),
Expand Down
26 changes: 13 additions & 13 deletions cli/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ async fn compile_command(
tools::standalone::compile_to_runtime_flags(flags.clone(), args)?;

let module_specifier = ModuleSpecifier::resolve_url_or_path(&source_file)?;
let program_state = ProgramState::new(flags.clone())?;
let program_state = ProgramState::build(flags.clone()).await?;
let deno_dir = &program_state.dir;

let output = output.or_else(|| {
Expand Down Expand Up @@ -367,7 +367,7 @@ async fn info_command(
if json && !flags.unstable {
exit_unstable("--json");
}
let program_state = ProgramState::new(flags)?;
let program_state = ProgramState::build(flags).await?;
if let Some(specifier) = maybe_specifier {
let specifier = ModuleSpecifier::resolve_url_or_path(&specifier)?;
let handler = Arc::new(Mutex::new(specifier_handler::FetchHandler::new(
Expand Down Expand Up @@ -409,7 +409,7 @@ async fn install_command(
preload_flags.inspect = None;
preload_flags.inspect_brk = None;
let permissions = Permissions::from_options(&preload_flags.clone().into());
let program_state = ProgramState::new(preload_flags)?;
let program_state = ProgramState::build(preload_flags).await?;
let main_module = ModuleSpecifier::resolve_url_or_path(&module_url)?;
let mut worker =
create_main_worker(&program_state, main_module.clone(), permissions);
Expand Down Expand Up @@ -450,7 +450,7 @@ async fn cache_command(
} else {
module_graph::TypeLib::DenoWindow
};
let program_state = ProgramState::new(flags)?;
let program_state = ProgramState::build(flags).await?;

for file in files {
let specifier = ModuleSpecifier::resolve_url_or_path(&file)?;
Expand Down Expand Up @@ -478,7 +478,7 @@ async fn eval_command(
let main_module =
ModuleSpecifier::resolve_url_or_path("./$deno$eval.ts").unwrap();
let permissions = Permissions::from_options(&flags.clone().into());
let program_state = ProgramState::new(flags)?;
let program_state = ProgramState::build(flags).await?;
let mut worker =
create_main_worker(&program_state, main_module.clone(), permissions);
let main_module_url = main_module.as_url().to_owned();
Expand Down Expand Up @@ -596,7 +596,7 @@ async fn bundle_command(
ModuleSpecifier::resolve_url_or_path(&source_file1)?;

debug!(">>>>> bundle START");
let program_state = ProgramState::new(flags.clone())?;
let program_state = ProgramState::build(flags.clone()).await?;

info!(
"{} {}",
Expand Down Expand Up @@ -742,7 +742,7 @@ async fn doc_command(
maybe_filter: Option<String>,
private: bool,
) -> Result<(), AnyError> {
let program_state = ProgramState::new(flags.clone())?;
let program_state = ProgramState::build(flags.clone()).await?;
let source_file = source_file.unwrap_or_else(|| "--builtin".to_string());

let loader = Box::new(DocLoader {
Expand Down Expand Up @@ -822,7 +822,7 @@ async fn run_repl(flags: Flags) -> Result<(), AnyError> {
let main_module =
ModuleSpecifier::resolve_url_or_path("./$deno$repl.ts").unwrap();
let permissions = Permissions::from_options(&flags.clone().into());
let program_state = ProgramState::new(flags)?;
let program_state = ProgramState::build(flags).await?;
let mut worker =
create_main_worker(&program_state, main_module.clone(), permissions);
worker.run_event_loop().await?;
Expand All @@ -831,7 +831,7 @@ async fn run_repl(flags: Flags) -> Result<(), AnyError> {
}

async fn run_from_stdin(flags: Flags) -> Result<(), AnyError> {
let program_state = ProgramState::new(flags.clone())?;
let program_state = ProgramState::build(flags.clone()).await?;
let permissions = Permissions::from_options(&flags.clone().into());
let main_module =
ModuleSpecifier::resolve_url_or_path("./$deno$stdin.ts").unwrap();
Expand Down Expand Up @@ -871,7 +871,7 @@ async fn run_with_watch(flags: Flags, script: String) -> Result<(), AnyError> {
let flags = flags.clone();
async move {
let main_module = ModuleSpecifier::resolve_url_or_path(&script1)?;
let program_state = ProgramState::new(flags)?;
let program_state = ProgramState::build(flags).await?;
let handler = Arc::new(Mutex::new(FetchHandler::new(
&program_state,
Permissions::allow_all(),
Expand Down Expand Up @@ -916,7 +916,7 @@ async fn run_with_watch(flags: Flags, script: String) -> Result<(), AnyError> {
let permissions = Permissions::from_options(&flags.clone().into());
async move {
let main_module = main_module.clone();
let program_state = ProgramState::new(flags)?;
let program_state = ProgramState::build(flags).await?;
let mut worker =
create_main_worker(&program_state, main_module.clone(), permissions);
debug!("main_module {}", main_module);
Expand Down Expand Up @@ -948,7 +948,7 @@ async fn run_command(flags: Flags, script: String) -> Result<(), AnyError> {
}

let main_module = ModuleSpecifier::resolve_url_or_path(&script)?;
let program_state = ProgramState::new(flags.clone())?;
let program_state = ProgramState::build(flags.clone()).await?;
let permissions = Permissions::from_options(&flags.clone().into());
let mut worker =
create_main_worker(&program_state, main_module.clone(), permissions);
Expand Down Expand Up @@ -989,7 +989,7 @@ async fn test_command(
allow_none: bool,
filter: Option<String>,
) -> Result<(), AnyError> {
let program_state = ProgramState::new(flags.clone())?;
let program_state = ProgramState::build(flags.clone()).await?;
let permissions = Permissions::from_options(&flags.clone().into());
let cwd = std::env::current_dir().expect("No current directory");
let include = include.unwrap_or_else(|| vec![".".to_string()]);
Expand Down
13 changes: 8 additions & 5 deletions cli/ops/runtime_compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,19 +75,22 @@ async fn op_emit(
is_dynamic = true;
Arc::new(Mutex::new(FetchHandler::new(
&program_state,
runtime_permissions,
runtime_permissions.clone(),
)?))
};
let maybe_import_map = if let Some(import_map_str) = args.import_map_path {
let import_map_specifier =
ModuleSpecifier::resolve_url_or_path(&import_map_str).context(
format!("Bad file path (\"{}\") for import map.", import_map_str),
)?;
ModuleSpecifier::resolve_url_or_path(&import_map_str)
.context(format!("Bad URL (\"{}\") for import map.", import_map_str))?;
let import_map_url = import_map_specifier.as_url();
let import_map = if let Some(value) = args.import_map {
ImportMap::from_json(&import_map_url.to_string(), &value.to_string())?
} else {
ImportMap::load(&import_map_str)?
let file = program_state
.file_fetcher
.fetch(&import_map_specifier, &runtime_permissions)
.await?;
ImportMap::from_json(import_map_specifier.as_str(), &file.source)?
};
Some(import_map)
} else if args.import_map.is_some() {
Expand Down
38 changes: 12 additions & 26 deletions cli/program_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ pub struct ProgramState {
}

impl ProgramState {
pub fn new(flags: flags::Flags) -> Result<Arc<Self>, AnyError> {
pub async fn build(flags: flags::Flags) -> Result<Arc<Self>, AnyError> {
let custom_root = env::var("DENO_DIR").map(String::into).ok();
let dir = deno_dir::DenoDir::new(custom_root)?;
let deps_cache_location = dir.root.join("deps");
Expand Down Expand Up @@ -94,11 +94,20 @@ impl ProgramState {
let maybe_import_map: Option<ImportMap> =
match flags.import_map_path.as_ref() {
None => None,
Some(file_path) => {
Some(import_map_url) => {
if !flags.unstable {
exit_unstable("--import-map")
}
Some(ImportMap::load(file_path)?)
let import_map_specifier =
ModuleSpecifier::resolve_url_or_path(&import_map_url).context(
format!("Bad URL (\"{}\") for import map.", import_map_url),
)?;
let file = file_fetcher
.fetch(&import_map_specifier, &Permissions::allow_all())
.await?;
let import_map =
ImportMap::from_json(import_map_specifier.as_str(), &file.source)?;
Some(import_map)
}
};

Expand Down Expand Up @@ -276,18 +285,6 @@ impl ProgramState {
None
}
}

#[cfg(test)]
pub fn mock(
argv: Vec<String>,
maybe_flags: Option<flags::Flags>,
) -> Arc<ProgramState> {
ProgramState::new(flags::Flags {
argv,
..maybe_flags.unwrap_or_default()
})
.unwrap()
}
}

// TODO(@kitsonk) this is only temporary, but should be refactored to somewhere
Expand Down Expand Up @@ -346,14 +343,3 @@ fn source_map_from_code(code: String) -> Option<Vec<u8>> {
None
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn thread_safe() {
fn f<S: Send + Sync>(_: S) {}
f(ProgramState::mock(vec![], None));
}
}
5 changes: 5 additions & 0 deletions cli/tests/033_import_map_remote.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Hello from remapped moment!
Hello from remapped moment dir!
Hello from remapped lodash!
Hello from remapped lodash dir!
Hello from remapped Vue!
9 changes: 9 additions & 0 deletions cli/tests/import_maps/import_map_remote.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"imports": {
"moment": "./moment/moment.ts",
"moment/": "./moment/",
"lodash": "./lodash/lodash.ts",
"lodash/": "./lodash/",
"https://www.unpkg.com/vue/dist/vue.runtime.esm.js": "./vue.ts"
}
}
5 changes: 5 additions & 0 deletions cli/tests/import_maps/test_remote.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import "moment";
import "moment/other_file.ts";
import "lodash";
import "lodash/other_file.ts";
import "https://www.unpkg.com/vue/dist/vue.runtime.esm.js";
7 changes: 7 additions & 0 deletions cli/tests/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2475,6 +2475,13 @@ console.log("finish");
output: "033_import_map.out",
});

itest!(_033_import_map_remote {
args:
"run --quiet --reload --import-map=http://127.0.0.1:4545/cli/tests/import_maps/import_map_remote.json --unstable import_maps/test_remote.ts",
output: "033_import_map_remote.out",
http_server: true,
});

itest!(_034_onload {
args: "run --quiet --reload 034_onload/main.ts",
output: "034_onload.out",
Expand Down