summaryrefslogtreecommitdiff
path: root/cli/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/build.rs')
-rw-r--r--cli/build.rs93
1 files changed, 72 insertions, 21 deletions
diff --git a/cli/build.rs b/cli/build.rs
index ce4027d77..7fc4b718d 100644
--- a/cli/build.rs
+++ b/cli/build.rs
@@ -1,7 +1,38 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+use deno_core::CoreOp;
+use deno_core::Isolate;
+use deno_core::Op;
+use deno_core::PinnedBuf;
+use deno_core::StartupData;
+use std::collections::HashMap;
use std::env;
use std::path::PathBuf;
+fn op_fetch_asset(
+ custom_assets: HashMap<String, PathBuf>,
+) -> impl Fn(&[u8], Option<PinnedBuf>) -> CoreOp {
+ move |control: &[u8], zero_copy_buf: Option<PinnedBuf>| -> CoreOp {
+ assert!(zero_copy_buf.is_none()); // zero_copy_buf unused in this op.
+ let custom_assets = custom_assets.clone();
+ let name = std::str::from_utf8(control).unwrap();
+
+ let asset_code = if let Some(source_code) = deno_typescript::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!("op_fetch_asset bad asset {}", name)
+ };
+
+ let vec = asset_code.into_bytes();
+ Op::Sync(vec.into_boxed_slice())
+ }
+}
+
fn main() {
// To debug snapshot issues uncomment:
// deno_typescript::trace_serializer();
@@ -14,29 +45,49 @@ fn main() {
let c = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
let o = PathBuf::from(env::var_os("OUT_DIR").unwrap());
- let custom_libs = vec![(
- "lib.deno_runtime.d.ts".to_string(),
- c.join("js/lib.deno_runtime.d.ts"),
- )];
-
+ // Main snapshot
let root_names = vec![c.join("js/main.ts")];
- let bundle = o.join("CLI_SNAPSHOT.js");
- let state =
- deno_typescript::compile_bundle(&bundle, root_names, Some(custom_libs))
- .unwrap();
- assert!(bundle.exists());
- deno_typescript::mksnapshot_bundle(&bundle, state).unwrap();
-
- let custom_libs = vec![(
+ let bundle_path = o.join("CLI_SNAPSHOT.js");
+ let snapshot_path = o.join("CLI_SNAPSHOT.bin");
+
+ let main_module_name =
+ deno_typescript::compile_bundle(&bundle_path, root_names)
+ .expect("Bundle compilation failed");
+ assert!(bundle_path.exists());
+
+ let runtime_isolate = &mut Isolate::new(StartupData::None, true);
+
+ deno_typescript::mksnapshot_bundle(
+ runtime_isolate,
+ &snapshot_path,
+ &bundle_path,
+ &main_module_name,
+ )
+ .expect("Failed to create snapshot");
+
+ // Compiler snapshot
+ let root_names = vec![c.join("js/compiler.ts")];
+ let bundle_path = o.join("COMPILER_SNAPSHOT.js");
+ let snapshot_path = o.join("COMPILER_SNAPSHOT.bin");
+ let mut custom_libs: HashMap<String, PathBuf> = HashMap::new();
+ custom_libs.insert(
"lib.deno_runtime.d.ts".to_string(),
c.join("js/lib.deno_runtime.d.ts"),
- )];
+ );
- let root_names = vec![c.join("js/compiler.ts")];
- let bundle = o.join("COMPILER_SNAPSHOT.js");
- let state =
- deno_typescript::compile_bundle(&bundle, root_names, Some(custom_libs))
- .unwrap();
- assert!(bundle.exists());
- deno_typescript::mksnapshot_bundle_ts(&bundle, state).unwrap();
+ let main_module_name =
+ deno_typescript::compile_bundle(&bundle_path, root_names)
+ .expect("Bundle compilation failed");
+ assert!(bundle_path.exists());
+
+ let runtime_isolate = &mut Isolate::new(StartupData::None, true);
+ runtime_isolate.register_op("fetch_asset", op_fetch_asset(custom_libs));
+
+ deno_typescript::mksnapshot_bundle_ts(
+ runtime_isolate,
+ &snapshot_path,
+ &bundle_path,
+ &main_module_name,
+ )
+ .expect("Failed to create snapshot");
}