diff options
Diffstat (limited to 'deno_typescript')
-rw-r--r-- | deno_typescript/compiler_main.js | 11 | ||||
-rw-r--r-- | deno_typescript/lib.rs | 47 | ||||
-rw-r--r-- | deno_typescript/ops.rs | 10 |
3 files changed, 47 insertions, 21 deletions
diff --git a/deno_typescript/compiler_main.js b/deno_typescript/compiler_main.js index 013d6e157..0f8c5cc14 100644 --- a/deno_typescript/compiler_main.js +++ b/deno_typescript/compiler_main.js @@ -46,7 +46,7 @@ function main(configText, rootNames) { handleDiagnostics(host, emitResult.diagnostics); dispatch( - "setEmitResult", + "op_set_emit_result", Object.assign(emitResult, { tsVersion: ts.version }) ); } @@ -98,7 +98,6 @@ function encode(str) { return ui8; } -// /** **Warning!** Op ids must be acquired from Rust using `Deno.core.ops()` * before dispatching any action. * @type {Record<string, number>} @@ -184,7 +183,7 @@ class Host { fileName = moduleMap.get(fileName); } - const { sourceCode, moduleName } = dispatch("loadModule", { + const { sourceCode, moduleName } = dispatch("op_load_module", { moduleUrl: fileName, languageVersion, shouldCreateNewSourceFile @@ -228,7 +227,7 @@ class Host { return; } const moduleName = sourceFiles[sourceFiles.length - 1].moduleName; - return dispatch("writeFile", { fileName, moduleName, data }); + return dispatch("op_write_file", { fileName, moduleName, data }); } /** @@ -272,7 +271,7 @@ class Host { ? moduleMap.get(containingFile) : containingFile; /** @type {string[]} */ - const resolvedNames = dispatch("resolveModuleNames", { + const resolvedNames = dispatch("op_resolve_module_names", { moduleNames, containingFile }); @@ -332,7 +331,7 @@ function dispatch(opName, obj) { * @param {number} code */ function exit(code) { - dispatch("exit", { code }); + dispatch("op_exit2", { code }); return unreachable(); } diff --git a/deno_typescript/lib.rs b/deno_typescript/lib.rs index c825277e3..b2e2166be 100644 --- a/deno_typescript/lib.rs +++ b/deno_typescript/lib.rs @@ -85,22 +85,24 @@ impl TSIsolate { })); isolate.register_op( - "loadModule", - compiler_op(state.clone(), ops::json_op(ops::load_module)), + "op_load_module", + compiler_op(state.clone(), ops::json_op(ops::op_load_module)), ); - isolate - .register_op("exit", compiler_op(state.clone(), ops::json_op(ops::exit))); isolate.register_op( - "writeFile", - compiler_op(state.clone(), ops::json_op(ops::write_file)), + "op_exit2", + compiler_op(state.clone(), ops::json_op(ops::op_exit2)), ); isolate.register_op( - "resolveModuleNames", - compiler_op(state.clone(), ops::json_op(ops::resolve_module_names)), + "op_write_file", + compiler_op(state.clone(), ops::json_op(ops::op_write_file)), ); isolate.register_op( - "setEmitResult", - compiler_op(state.clone(), ops::json_op(ops::set_emit_result)), + "op_resolve_module_names", + compiler_op(state.clone(), ops::json_op(ops::op_resolve_module_names)), + ); + isolate.register_op( + "op_set_emit_result", + compiler_op(state.clone(), ops::json_op(ops::op_set_emit_result)), ); TSIsolate { isolate, state } @@ -317,3 +319,28 @@ pub fn trace_serializer() { ]); assert_eq!(r, vec![dummy]); } + +/// Warning: Returns a non-JSON op dispatcher. Must be manually attached to +/// Isolate. +pub fn op_fetch_asset<S: ::std::hash::BuildHasher>( + custom_assets: HashMap<String, PathBuf, S>, +) -> impl Fn(&[u8], Option<ZeroCopyBuf>) -> CoreOp { + move |control: &[u8], zero_copy_buf: Option<ZeroCopyBuf>| -> CoreOp { + assert!(zero_copy_buf.is_none()); // zero_copy_buf unused in this op. + let name = std::str::from_utf8(control).unwrap(); + + let asset_code = if let Some(source_code) = get_asset(name) { + source_code.to_string() + } else if let Some(asset_path) = custom_assets.get(name) { + let source_code_vec = + std::fs::read(&asset_path).expect("Asset not found"); + let source_code = std::str::from_utf8(&source_code_vec).unwrap(); + source_code.to_string() + } else { + panic!("fetch_asset bad asset {}", name) + }; + + let vec = asset_code.into_bytes(); + deno_core::Op::Sync(vec.into_boxed_slice()) + } +} diff --git a/deno_typescript/ops.rs b/deno_typescript/ops.rs index f9b244397..022eee00e 100644 --- a/deno_typescript/ops.rs +++ b/deno_typescript/ops.rs @@ -41,7 +41,7 @@ struct LoadModule { should_create_new_source_file: bool, } -pub fn load_module(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { +pub fn op_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$/", ""); @@ -98,7 +98,7 @@ struct WriteFile { module_name: String, } -pub fn write_file(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { +pub fn op_write_file(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { let v: WriteFile = serde_json::from_value(v)?; let module_specifier = ModuleSpecifier::resolve_url_or_path(&v.file_name)?; if s.bundle { @@ -119,7 +119,7 @@ struct ResolveModuleNames { containing_file: String, } -pub fn resolve_module_names( +pub fn op_resolve_module_names( _s: &mut TSState, v: Value, ) -> Result<Value, ErrBox> { @@ -143,7 +143,7 @@ struct Exit { code: i32, } -pub fn exit(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { +pub fn op_exit2(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { let v: Exit = serde_json::from_value(v)?; s.exit_code = v.code; std::process::exit(v.code) @@ -157,7 +157,7 @@ pub struct EmitResult { pub emitted_files: Vec<String>, } -pub fn set_emit_result(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { +pub fn op_set_emit_result(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { let v: EmitResult = serde_json::from_value(v)?; s.emit_result = Some(v); Ok(json!(true)) |