diff options
Diffstat (limited to 'deno_typescript')
-rw-r--r-- | deno_typescript/lib.rs | 21 | ||||
-rw-r--r-- | deno_typescript/ops.rs | 30 |
2 files changed, 48 insertions, 3 deletions
diff --git a/deno_typescript/lib.rs b/deno_typescript/lib.rs index 016adcca0..ccad69a3d 100644 --- a/deno_typescript/lib.rs +++ b/deno_typescript/lib.rs @@ -16,6 +16,7 @@ use deno_core::PinnedBuf; use deno_core::StartupData; pub use ops::EmitResult; use ops::WrittenFile; +use std::collections::HashMap; use std::fs; use std::path::Path; use std::path::PathBuf; @@ -37,6 +38,7 @@ pub struct TSState { bundle: bool, exit_code: i32, emit_result: Option<EmitResult>, + custom_assets: HashMap<String, PathBuf>, /// A list of files emitted by typescript. WrittenFile is tuple of the form /// (url, corresponding_module, source_code) written_files: Vec<WrittenFile>, @@ -76,6 +78,7 @@ impl TSIsolate { let state = Arc::new(Mutex::new(TSState { bundle, + custom_assets: HashMap::new(), exit_code: 0, emit_result: None, written_files: Vec::new(), @@ -119,13 +122,24 @@ impl TSIsolate { self.isolate.execute("<anon>", source)?; Ok(self.state) } + + pub fn add_custom_assets(&mut self, custom_assets: Vec<(String, PathBuf)>) { + let mut state = self.state.lock().unwrap(); + for (name, path) in custom_assets { + state.custom_assets.insert(name, path); + } + } } pub fn compile_bundle( bundle: &Path, root_names: Vec<PathBuf>, + custom_assets: Option<Vec<(String, PathBuf)>>, ) -> Result<Arc<Mutex<TSState>>, ErrBox> { - let ts_isolate = TSIsolate::new(true); + let mut ts_isolate = TSIsolate::new(true); + if let Some(assets) = custom_assets { + ts_isolate.add_custom_assets(assets); + } let config_json = serde_json::json!({ "compilerOptions": { @@ -203,6 +217,10 @@ pub fn mksnapshot_bundle_ts( state: Arc<Mutex<TSState>>, ) -> Result<(), ErrBox> { let runtime_isolate = &mut Isolate::new(StartupData::None, true); + runtime_isolate.register_op( + "fetch_asset", + compiler_op(state.clone(), ops::json_op(ops::fetch_asset)), + ); let source_code_vec = std::fs::read(bundle)?; let source_code = std::str::from_utf8(&source_code_vec)?; @@ -255,6 +273,7 @@ pub fn get_asset(name: &str) -> Option<&'static str> { } match name { "bundle_loader.js" => Some(include_str!("bundle_loader.js")), + "bootstrap.ts" => Some("console.log(\"hello deno\");"), "typescript.d.ts" => inc!("typescript.d.ts"), "lib.esnext.d.ts" => inc!("lib.esnext.d.ts"), "lib.es2020.d.ts" => inc!("lib.es2020.d.ts"), diff --git a/deno_typescript/ops.rs b/deno_typescript/ops.rs index e45349591..0680d07b3 100644 --- a/deno_typescript/ops.rs +++ b/deno_typescript/ops.rs @@ -41,11 +41,16 @@ struct ReadFile { should_create_new_source_file: bool, } -pub fn read_file(_s: &mut TSState, v: Value) -> Result<Value, ErrBox> { +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$/", ""); - let source_code = crate::get_asset2(&asset)?.to_string(); + + let source_code = match s.custom_assets.get(&asset) { + Some(asset_path) => std::fs::read_to_string(&asset_path)?, + None => crate::get_asset2(&asset)?.to_string(), + }; + (asset, source_code) } else { assert!(!v.file_name.starts_with("$assets$"), "you meant $asset$"); @@ -112,6 +117,27 @@ pub fn resolve_module_names( #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] +struct FetchAssetArgs { + name: String, +} + +pub fn fetch_asset(s: &mut TSState, v: Value) -> Result<Value, ErrBox> { + let args: FetchAssetArgs = serde_json::from_value(v)?; + + if let Some(asset_path) = s.custom_assets.get(&args.name) { + let source_code = std::fs::read_to_string(&asset_path)?; + return Ok(json!(source_code)); + } + + if let Some(source_code) = crate::get_asset(&args.name) { + Ok(json!(source_code)) + } else { + panic!("op_fetch_asset bad asset {}", args.name) + } +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] struct Exit { code: i32, } |