summaryrefslogtreecommitdiff
path: root/deno_typescript/ops.rs
diff options
context:
space:
mode:
authorAndy Finch <andyfinch7@gmail.com>2020-02-01 03:02:23 -0800
committerGitHub <noreply@github.com>2020-02-01 12:02:23 +0100
commit4f8a5c0239cd633ea3fd15a27046da3edee2b2f2 (patch)
tree80467fdd1132a44dc7fce01d73261693ee6c7fb5 /deno_typescript/ops.rs
parent2cd3994902fb6a4d4d0603c839a78503d792b96a (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.rs45
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,