diff options
author | Andy Finch <andyfinch7@gmail.com> | 2020-02-01 03:02:23 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-01 12:02:23 +0100 |
commit | 4f8a5c0239cd633ea3fd15a27046da3edee2b2f2 (patch) | |
tree | 80467fdd1132a44dc7fce01d73261693ee6c7fb5 /deno_typescript/ops.rs | |
parent | 2cd3994902fb6a4d4d0603c839a78503d792b96a (diff) |
feat: support crate imports in deno_typescript (#3814)
Co-authored-by: Ryan Dahl <ry@tinyclouds.org>
Diffstat (limited to 'deno_typescript/ops.rs')
-rw-r--r-- | deno_typescript/ops.rs | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/deno_typescript/ops.rs b/deno_typescript/ops.rs index f76662620..f9b244397 100644 --- a/deno_typescript/ops.rs +++ b/deno_typescript/ops.rs @@ -35,16 +35,16 @@ pub fn json_op(d: Dispatcher) -> impl Fn(&mut TSState, &[u8]) -> CoreOp { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] -struct ReadFile { - file_name: String, +struct LoadModule { + module_url: String, language_version: Option<i32>, should_create_new_source_file: bool, } -pub fn read_file(_s: &mut TSState, v: Value) -> Result<Value, ErrBox> { - let v: ReadFile = serde_json::from_value(v)?; - let (module_name, source_code) = if v.file_name.starts_with("$asset$/") { - let asset = v.file_name.replace("$asset$/", ""); +pub fn load_module(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { + let v: LoadModule = serde_json::from_value(v)?; + let (module_name, source_code) = if v.module_url.starts_with("$asset$/") { + let asset = v.module_url.replace("$asset$/", ""); let source_code = match crate::get_asset(&asset) { Some(code) => code.to_string(), @@ -58,14 +58,31 @@ pub fn read_file(_s: &mut TSState, v: Value) -> Result<Value, ErrBox> { (asset, source_code) } else { - assert!(!v.file_name.starts_with("$assets$"), "you meant $asset$"); - let module_specifier = ModuleSpecifier::resolve_url_or_path(&v.file_name)?; - let path = module_specifier.as_url().to_file_path().unwrap(); - println!("cargo:rerun-if-changed={}", path.display()); - ( - module_specifier.as_str().to_string(), - std::fs::read_to_string(&path)?, - ) + assert!(!v.module_url.starts_with("$assets$"), "you meant $asset$"); + let module_specifier = ModuleSpecifier::resolve_url_or_path(&v.module_url)?; + let module_url = module_specifier.as_url(); + match module_url.scheme() { + "file" => { + let path = module_url.to_file_path().unwrap(); + println!("cargo:rerun-if-changed={}", path.display()); + ( + module_specifier.as_str().to_string(), + std::fs::read_to_string(&path)?, + ) + } + "crate" => { + let crate_name = module_url.host_str().unwrap(); + // TODO(afinch7) turn failures here into real error messages. + let path_prefix = s.extern_crate_modules.get(crate_name).unwrap(); + let path = + std::path::Path::new(path_prefix).join(&module_url.path()[1..]); + ( + module_specifier.as_str().to_string(), + std::fs::read_to_string(&path)?, + ) + } + _ => unimplemented!(), + } }; Ok(json!({ "moduleName": module_name, |