Skip to content

Commit

Permalink
refactor: load module content an owned value
Browse files Browse the repository at this point in the history
This is a pre-requisite for WASM imports that additionally allows us to
minimize clones when doing things like BOM stripping.
  • Loading branch information
lucacasonato committed May 20, 2022
1 parent 89affe4 commit 6691015
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 74 deletions.
99 changes: 56 additions & 43 deletions src/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ pub enum ModuleGraphError {
actual_media_type: MediaType,
expected_media_type: MediaType,
},
ConflictingAssertions(ModuleSpecifier),
LoadingErr(ModuleSpecifier, Arc<anyhow::Error>),
Missing(ModuleSpecifier),
ParseErr(ModuleSpecifier, deno_ast::Diagnostic),
Expand Down Expand Up @@ -163,6 +164,9 @@ impl Clone for ModuleGraphError {
actual_media_type: *actual_media_type,
expected_media_type: *expected_media_type,
},
Self::ConflictingAssertions(specifier) => {
Self::ConflictingAssertions(specifier.clone())
}
Self::UnsupportedImportAssertionType(specifier, kind) => {
Self::UnsupportedImportAssertionType(specifier.clone(), kind.clone())
}
Expand All @@ -184,7 +188,8 @@ impl ModuleGraphError {
| Self::InvalidSource(s, _)
| Self::UnsupportedMediaType(s, _)
| Self::UnsupportedImportAssertionType(s, _)
| Self::Missing(s) => s,
| Self::Missing(s)
| Self::ConflictingAssertions(s) => s,
Self::InvalidTypeAssertion { specifier, .. } => specifier,
}
}
Expand All @@ -201,6 +206,7 @@ impl fmt::Display for ModuleGraphError {
Self::InvalidSource(specifier, Some(filename)) => write!(f, "The source code is invalid, as it does not match the expected hash in the lock file.\n Specifier: {}\n Lock file: {}", specifier, filename),
Self::InvalidSource(specifier, None) => write!(f, "The source code is invalid, as it does not match the expected hash in the lock file.\n Specifier: {}", specifier),
Self::InvalidTypeAssertion { specifier, actual_media_type, expected_media_type } => write!(f, "Expected a {} module, but identified a {} module.\n Specifier: {}", expected_media_type, actual_media_type, specifier),
Self::ConflictingAssertions(specifier) => write!(f, "Module \"{specifier}\" was imported with conflicting assertions."),
Self::UnsupportedMediaType(specifier, MediaType::Json) => write!(f, "Expected a JavaScript or TypeScript module, but identified a Json module. Consider importing Json modules with an import assertion with the type of \"json\".\n Specifier: {}", specifier),
Self::UnsupportedMediaType(specifier, media_type) => write!(f, "Expected a JavaScript or TypeScript module, but identified a {} module. Importing these types of modules is currently not supported.\n Specifier: {}", media_type, specifier),
Self::UnsupportedImportAssertionType(_, kind) => write!(f, "The import assertion type of \"{}\" is unsupported.", kind),
Expand Down Expand Up @@ -1171,7 +1177,7 @@ fn resolve(
pub(crate) fn parse_module(
specifier: &ModuleSpecifier,
maybe_headers: Option<&HashMap<String, String>>,
content: Arc<String>,
content: String,
maybe_assert_type: Option<&str>,
maybe_kind: Option<&ModuleKind>,
maybe_resolver: Option<&dyn Resolver>,
Expand All @@ -1181,6 +1187,8 @@ pub(crate) fn parse_module(
) -> ModuleSlot {
let media_type = get_media_type(specifier, maybe_headers);

let content = content.into();

// here we check any media types that should have assertions made against them
// if they aren't the root and add them to the graph, otherwise we continue
if media_type == MediaType::Json
Expand Down Expand Up @@ -1559,15 +1567,7 @@ impl<'a> Builder<'a> {
Some((specifier, kind, Ok(Some(response)))) => {
let assert_types =
self.pending_assert_types.remove(&specifier).unwrap();
for maybe_assert_type in assert_types {
self.visit(
&specifier,
&kind,
&response,
&build_kind,
maybe_assert_type,
)
}
self.visit(&specifier, &kind, response, &build_kind, assert_types);
Some(specifier)
}
Some((specifier, _, Ok(None))) => {
Expand Down Expand Up @@ -1698,50 +1698,63 @@ impl<'a> Builder<'a> {
&mut self,
requested_specifier: &ModuleSpecifier,
kind: &ModuleKind,
response: &LoadResponse,
response: LoadResponse,
build_kind: &BuildKind,
maybe_assert_type: Option<String>,
assert_types: HashSet<Option<String>>,
) {
let (specifier, module_slot) = match response {
LoadResponse::BuiltIn { specifier } => {
self.check_specifier(requested_specifier, specifier);
let module_slot = ModuleSlot::Module(Module::new_without_source(
specifier.clone(),
ModuleKind::BuiltIn,
));
self.check_specifier(requested_specifier, &specifier);
let module_slot = if assert_types.len() != 1 {
ModuleSlot::Err(ModuleGraphError::ConflictingAssertions(
specifier.clone(),
))
} else {
ModuleSlot::Module(Module::new_without_source(
specifier.clone(),
ModuleKind::BuiltIn,
))
};
(specifier, module_slot)
}
LoadResponse::External { specifier } => {
self.check_specifier(requested_specifier, specifier);
let module_slot = ModuleSlot::Module(Module::new_without_source(
specifier.clone(),
ModuleKind::External,
));
self.check_specifier(requested_specifier, &specifier);
let module_slot = if assert_types.len() != 1 {
ModuleSlot::Err(ModuleGraphError::ConflictingAssertions(
specifier.clone(),
))
} else {
ModuleSlot::Module(Module::new_without_source(
specifier.clone(),
ModuleKind::External,
))
};
(specifier, module_slot)
}
LoadResponse::Module {
specifier,
content,
maybe_headers,
} => {
self.check_specifier(requested_specifier, specifier);
(
specifier,
self.check_specifier(requested_specifier, &specifier);
let module_slot = if assert_types.len() != 1 {
ModuleSlot::Err(ModuleGraphError::ConflictingAssertions(
specifier.clone(),
))
} else {
self.visit_module(
specifier,
&specifier,
kind,
maybe_headers.as_ref(),
content.clone(),
content,
build_kind,
maybe_assert_type,
),
)
assert_types.into_iter().next().unwrap(),
)
};
(specifier, module_slot)
}
};
self
.graph
.module_slots
.insert(specifier.clone(), module_slot);
self.graph.module_slots.insert(specifier, module_slot);
}

/// Visit a module, parsing it and resolving any dependencies.
Expand All @@ -1750,7 +1763,7 @@ impl<'a> Builder<'a> {
specifier: &ModuleSpecifier,
kind: &ModuleKind,
maybe_headers: Option<&HashMap<String, String>>,
content: Arc<String>,
content: String,
build_kind: &BuildKind,
maybe_assert_type: Option<String>,
) -> ModuleSlot {
Expand Down Expand Up @@ -2041,7 +2054,7 @@ mod tests {
fn test_module_dependency_includes() {
let specifier = ModuleSpecifier::parse("file:///a.ts").unwrap();
let source_parser = ast::DefaultSourceParser::default();
let content = Arc::new(r#"import * as b from "./b.ts";"#.to_string());
let content = r#"import * as b from "./b.ts";"#.to_string();
let slot = parse_module(
&specifier,
None,
Expand Down Expand Up @@ -2130,7 +2143,7 @@ mod tests {
Ok(Some(LoadResponse::Module {
specifier: specifier.clone(),
maybe_headers: None,
content: Arc::new("await import('file:///bar.js')".to_string()),
content: "await import('file:///bar.js')".to_string(),
}))
})
}
Expand All @@ -2141,7 +2154,7 @@ mod tests {
Ok(Some(LoadResponse::Module {
specifier: specifier.clone(),
maybe_headers: None,
content: Arc::new("import 'file:///baz.js'".to_string()),
content: "import 'file:///baz.js'".to_string(),
}))
})
}
Expand All @@ -2152,7 +2165,7 @@ mod tests {
Ok(Some(LoadResponse::Module {
specifier: specifier.clone(),
maybe_headers: None,
content: Arc::new("console.log('Hello, world!')".to_string()),
content: "console.log('Hello, world!')".to_string(),
}))
})
}
Expand Down Expand Up @@ -2196,7 +2209,7 @@ mod tests {
Ok(Some(LoadResponse::Module {
specifier: specifier.clone(),
maybe_headers: None,
content: Arc::new("await import('file:///bar.js')".to_string()),
content: "await import('file:///bar.js')".to_string(),
}))
}),
"file:///bar.js" => Box::pin(async move { Ok(None) }),
Expand Down Expand Up @@ -2256,14 +2269,14 @@ mod tests {
Ok(Some(LoadResponse::Module {
specifier: Url::parse("file:///foo_actual.js").unwrap(),
maybe_headers: None,
content: Arc::new("import 'file:///bar.js'".to_string()),
content: "import 'file:///bar.js'".to_string(),
}))
}),
"file:///bar.js" => Box::pin(async move {
Ok(Some(LoadResponse::Module {
specifier: Url::parse("file:///bar_actual.js").unwrap(),
maybe_headers: None,
content: Arc::new("(".to_string()),
content: "(".to_string(),
}))
}),
_ => unreachable!(),
Expand Down
3 changes: 3 additions & 0 deletions src/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,9 @@ impl ModuleGraphError {
Self::InvalidTypeAssertion { .. } => {
fmt_error_msg(f, prefix, last, specifier, "(invalid import assertion)")
}
Self::ConflictingAssertions { .. } => {
fmt_error_msg(f, prefix, last, specifier, "(conflicting assertions)")
}
Self::LoadingErr(_, _) => {
fmt_error_msg(f, prefix, last, specifier, "(loading error)")
}
Expand Down
41 changes: 14 additions & 27 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ use source::Resolver;
use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
use std::sync::Arc;

cfg_if! {
if #[cfg(feature = "rust")] {
Expand Down Expand Up @@ -149,7 +148,7 @@ cfg_if! {
pub fn parse_module(
specifier: &ModuleSpecifier,
maybe_headers: Option<&HashMap<String, String>>,
content: Arc<String>,
content: String,
maybe_kind: Option<&ModuleKind>,
maybe_resolver: Option<&dyn Resolver>,
maybe_parser: Option<&dyn SourceParser>,
Expand Down Expand Up @@ -294,7 +293,7 @@ cfg_if! {
match graph::parse_module(
&specifier,
maybe_headers.as_ref(),
Arc::new(content),
content,
None,
maybe_kind.as_ref(),
maybe_resolver.as_ref().map(|r| r as &dyn Resolver),
Expand Down Expand Up @@ -2817,15 +2816,13 @@ export function a(a) {
let result = parse_module(
&specifier,
None,
Arc::new(
r#"
r#"
import { a } from "./a.ts";
import * as b from "./b.ts";
export { c } from "./c.ts";
const d = await import("./d.ts");
"#
.to_string(),
),
.to_string(),
None,
None,
None,
Expand All @@ -2843,13 +2840,11 @@ export function a(a) {
let result = parse_module(
&specifier,
None,
Arc::new(
r#"
r#"
import a from "./a.json" assert { type: "json" };
await import("./b.json", { assert: { type: "json" } });
"#
.to_string(),
),
.to_string(),
Some(&ModuleKind::Esm),
None,
None,
Expand Down Expand Up @@ -2910,16 +2905,14 @@ export function a(a) {
let result = parse_module(
&specifier,
None,
Arc::new(
r#"
r#"
/** @jsxImportSource https://example.com/preact */
export function A() {
return <div>Hello Deno</div>;
}
"#
.to_string(),
),
.to_string(),
Some(&ModuleKind::Esm),
None,
None,
Expand Down Expand Up @@ -2956,12 +2949,10 @@ export function a(a) {
let result = parse_module(
&specifier,
maybe_headers,
Arc::new(
r#"declare interface A {
r#"declare interface A {
a: string;
}"#
.to_string(),
),
.to_string(),
Some(&ModuleKind::Esm),
None,
None,
Expand All @@ -2975,8 +2966,7 @@ export function a(a) {
let result = parse_module(
&specifier,
None,
Arc::new(
r#"
r#"
/**
* Some js doc
*
Expand All @@ -2987,8 +2977,7 @@ export function a(a) {
return;
}
"#
.to_string(),
),
.to_string(),
Some(&ModuleKind::Esm),
None,
None,
Expand Down Expand Up @@ -3046,8 +3035,7 @@ export function a(a) {
let result = parse_module(
&specifier,
None,
Arc::new(
r#"
r#"
/**
* Some js doc
*
Expand All @@ -3058,8 +3046,7 @@ export function a(a: A): B {
return;
}
"#
.to_string(),
),
.to_string(),
Some(&ModuleKind::Esm),
None,
None,
Expand Down
Loading

0 comments on commit 6691015

Please sign in to comment.