summaryrefslogtreecommitdiff
path: root/cli/tsc2.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tsc2.rs')
-rw-r--r--cli/tsc2.rs198
1 files changed, 111 insertions, 87 deletions
diff --git a/cli/tsc2.rs b/cli/tsc2.rs
index 44754c030..25767619e 100644
--- a/cli/tsc2.rs
+++ b/cli/tsc2.rs
@@ -4,6 +4,8 @@ use crate::diagnostics::Diagnostics;
use crate::media_type::MediaType;
use crate::module_graph2::Graph2;
use crate::module_graph2::Stats;
+// TODO(@kitsonk) this needs to be refactored when we drop MG1
+use crate::op_fetch_asset::get_asset;
use crate::tsc_config::TsConfig;
use deno_core::error::anyhow;
@@ -24,6 +26,19 @@ use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
+fn get_maybe_hash(
+ maybe_source: &Option<String>,
+ hash_data: &[Vec<u8>],
+) -> Option<String> {
+ if let Some(source) = maybe_source {
+ let mut data = vec![source.as_bytes().to_owned()];
+ data.extend_from_slice(hash_data);
+ Some(crate::checksum::gen(&data))
+ } else {
+ None
+ }
+}
+
#[derive(Debug, Clone, Default, Eq, PartialEq)]
pub struct EmittedFile {
pub data: String,
@@ -177,6 +192,12 @@ fn load(state: &mut State, args: Value) -> Result<Value, AnyError> {
hash = Some("1".to_string());
media_type = MediaType::TypeScript;
Some("declare var a: any;\nexport = a;\n".to_string())
+ } else if v.specifier.starts_with("asset:///") {
+ let name = v.specifier.replace("asset:///", "");
+ let maybe_source = get_asset(&name).map(|s| s.to_string());
+ hash = get_maybe_hash(&maybe_source, &state.hash_data);
+ media_type = MediaType::from(&v.specifier);
+ maybe_source
} else {
let graph = state.graph.borrow();
let specifier =
@@ -191,11 +212,7 @@ fn load(state: &mut State, args: Value) -> Result<Value, AnyError> {
} else {
MediaType::Unknown
};
- if let Some(source) = &maybe_source {
- let mut data = vec![source.as_bytes().to_owned()];
- data.extend_from_slice(&state.hash_data);
- hash = Some(crate::checksum::gen(&data));
- }
+ hash = get_maybe_hash(&maybe_source, &state.hash_data);
maybe_source
};
@@ -396,6 +413,47 @@ mod tests {
State::new(graph, hash_data, maybe_tsbuildinfo, HashMap::new())
}
+ async fn test_exec(
+ specifier: &ModuleSpecifier,
+ ) -> Result<Response, AnyError> {
+ let hash_data = vec![b"something".to_vec()];
+ let c = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
+ let fixtures = c.join("tests/tsc2");
+ let handler = Rc::new(RefCell::new(MockSpecifierHandler {
+ fixtures,
+ ..Default::default()
+ }));
+ let mut builder = GraphBuilder2::new(handler.clone(), None, None);
+ builder.add(&specifier, false).await?;
+ let graph = Rc::new(RefCell::new(builder.get_graph()));
+ let config = TsConfig::new(json!({
+ "allowJs": true,
+ "checkJs": false,
+ "esModuleInterop": true,
+ "emitDecoratorMetadata": false,
+ "incremental": true,
+ "jsx": "react",
+ "jsxFactory": "React.createElement",
+ "jsxFragmentFactory": "React.Fragment",
+ "lib": ["deno.window"],
+ "module": "esnext",
+ "noEmit": true,
+ "outDir": "deno:///",
+ "strict": true,
+ "target": "esnext",
+ "tsBuildInfoFile": "deno:///.tsbuildinfo",
+ }));
+ let request = Request {
+ config,
+ debug: false,
+ graph,
+ hash_data,
+ maybe_tsbuildinfo: None,
+ root_names: vec![(specifier.clone(), MediaType::TypeScript)],
+ };
+ exec(js::compiler_isolate_init(), request)
+ }
+
#[tokio::test]
async fn test_create_hash() {
let mut state = setup(None, Some(vec![b"something".to_vec()]), None).await;
@@ -481,6 +539,36 @@ mod tests {
);
}
+ #[derive(Debug, Deserialize)]
+ #[serde(rename_all = "camelCase")]
+ struct LoadResponse {
+ data: String,
+ hash: Option<String>,
+ script_kind: i64,
+ }
+
+ #[tokio::test]
+ async fn test_load_asset() {
+ let mut state = setup(
+ Some(
+ ModuleSpecifier::resolve_url_or_path("https://deno.land/x/mod.ts")
+ .unwrap(),
+ ),
+ None,
+ Some("some content".to_string()),
+ )
+ .await;
+ let value =
+ load(&mut state, json!({ "specifier": "asset:///lib.dom.d.ts" }))
+ .expect("should have invoked op");
+ let actual: LoadResponse =
+ serde_json::from_value(value).expect("failed to deserialize");
+ let expected = get_asset("lib.dom.d.ts").unwrap();
+ assert_eq!(actual.data, expected);
+ assert!(actual.hash.is_some());
+ assert_eq!(actual.script_kind, 3);
+ }
+
#[tokio::test]
async fn test_load_tsbuildinfo() {
let mut state = setup(
@@ -581,7 +669,7 @@ mod tests {
assert_eq!(
state.maybe_response,
Some(RespondArgs {
- diagnostics: Diagnostics(vec![Diagnostic {
+ diagnostics: Diagnostics::new(vec![Diagnostic {
category: DiagnosticCategory::Error,
code: 5023,
start: None,
@@ -601,50 +689,13 @@ mod tests {
}
#[tokio::test]
- async fn test_exec() {
+ async fn test_exec_basic() {
let specifier =
ModuleSpecifier::resolve_url_or_path("https://deno.land/x/a.ts").unwrap();
- let hash_data = vec![b"something".to_vec()];
- let c = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
- let fixtures = c.join("tests/tsc2");
- let handler = Rc::new(RefCell::new(MockSpecifierHandler {
- fixtures,
- ..MockSpecifierHandler::default()
- }));
- let mut builder = GraphBuilder2::new(handler.clone(), None, None);
- builder
- .add(&specifier, false)
+ let actual = test_exec(&specifier)
.await
- .expect("module not inserted");
- let graph = Rc::new(RefCell::new(builder.get_graph()));
- let config = TsConfig::new(json!({
- "allowJs": true,
- "checkJs": false,
- "esModuleInterop": true,
- "emitDecoratorMetadata": false,
- "incremental": true,
- "jsx": "react",
- "jsxFactory": "React.createElement",
- "jsxFragmentFactory": "React.Fragment",
- "lib": ["deno.window"],
- "module": "esnext",
- "noEmit": true,
- "outDir": "deno:///",
- "strict": true,
- "target": "esnext",
- "tsBuildInfoFile": "deno:///.tsbuildinfo",
- }));
- let request = Request {
- config,
- debug: false,
- graph,
- hash_data,
- maybe_tsbuildinfo: None,
- root_names: vec![(specifier, MediaType::TypeScript)],
- };
- let actual = exec(js::compiler_isolate_init(), request)
- .expect("exec should have not errored");
- assert!(actual.diagnostics.0.is_empty());
+ .expect("exec should not have errored");
+ assert!(actual.diagnostics.is_empty());
assert!(actual.emitted_files.is_empty());
assert!(actual.maybe_tsbuildinfo.is_some());
assert_eq!(actual.stats.0.len(), 12);
@@ -654,49 +705,22 @@ mod tests {
async fn test_exec_reexport_dts() {
let specifier =
ModuleSpecifier::resolve_url_or_path("file:///reexports.ts").unwrap();
- let hash_data = vec![b"something".to_vec()];
- let c = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
- let fixtures = c.join("tests/tsc2");
- let handler = Rc::new(RefCell::new(MockSpecifierHandler {
- fixtures,
- ..MockSpecifierHandler::default()
- }));
- let mut builder = GraphBuilder2::new(handler.clone(), None, None);
- builder
- .add(&specifier, false)
+ let actual = test_exec(&specifier)
.await
- .expect("module not inserted");
- let graph = Rc::new(RefCell::new(builder.get_graph()));
- let config = TsConfig::new(json!({
- "allowJs": true,
- "checkJs": false,
- "esModuleInterop": true,
- "emitDecoratorMetadata": false,
- "incremental": true,
- "jsx": "react",
- "jsxFactory": "React.createElement",
- "jsxFragmentFactory": "React.Fragment",
- "lib": ["deno.window"],
- "module": "esnext",
- "noEmit": true,
- "outDir": "deno:///",
- "strict": true,
- "target": "esnext",
- "tsBuildInfoFile": "deno:///.tsbuildinfo",
- }));
- let request = Request {
- config,
- debug: false,
- graph,
- hash_data,
- maybe_tsbuildinfo: None,
- root_names: vec![(specifier, MediaType::TypeScript)],
- };
- let actual = exec(js::compiler_isolate_init(), request)
- .expect("exec should have not errored");
- assert!(actual.diagnostics.0.is_empty());
+ .expect("exec should not have errored");
+ assert!(actual.diagnostics.is_empty());
assert!(actual.emitted_files.is_empty());
assert!(actual.maybe_tsbuildinfo.is_some());
assert_eq!(actual.stats.0.len(), 12);
}
+
+ #[tokio::test]
+ async fn fix_lib_ref() {
+ let specifier =
+ ModuleSpecifier::resolve_url_or_path("file:///libref.ts").unwrap();
+ let actual = test_exec(&specifier)
+ .await
+ .expect("exec should not have errored");
+ assert!(actual.diagnostics.is_empty());
+ }
}