mirror of
https://github.com/denoland/deno.git
synced 2025-10-02 23:24:37 +00:00
cli: refactor deno_dir to use Url instead of String
This commit is contained in:
parent
9b1997b8b6
commit
72d9045528
8 changed files with 347 additions and 479 deletions
|
@ -9,6 +9,7 @@ use crate::state::*;
|
||||||
use crate::tokio_util;
|
use crate::tokio_util;
|
||||||
use crate::worker::Worker;
|
use crate::worker::Worker;
|
||||||
use deno::Buf;
|
use deno::Buf;
|
||||||
|
use deno::ModuleSpecifier;
|
||||||
use futures::Future;
|
use futures::Future;
|
||||||
use futures::Stream;
|
use futures::Stream;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
@ -17,6 +18,7 @@ use std::sync::atomic::Ordering;
|
||||||
|
|
||||||
// This corresponds to JS ModuleMetaData.
|
// This corresponds to JS ModuleMetaData.
|
||||||
// TODO Rename one or the other so they correspond.
|
// TODO Rename one or the other so they correspond.
|
||||||
|
// TODO(bartlomieju): change `*_name` to `*_url` and use Url type
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct ModuleMetaData {
|
pub struct ModuleMetaData {
|
||||||
pub module_name: String,
|
pub module_name: String,
|
||||||
|
@ -203,6 +205,8 @@ pub fn compile_async(
|
||||||
.and_then(move |maybe_msg: Option<Buf>| {
|
.and_then(move |maybe_msg: Option<Buf>| {
|
||||||
debug!("Received message from worker");
|
debug!("Received message from worker");
|
||||||
|
|
||||||
|
// TODO: here TS compiler emitted the files to disc and we should signal ModuleMetaData
|
||||||
|
// cache that source code is available
|
||||||
if let Some(msg) = maybe_msg {
|
if let Some(msg) = maybe_msg {
|
||||||
let json_str = std::str::from_utf8(&msg).unwrap();
|
let json_str = std::str::from_utf8(&msg).unwrap();
|
||||||
debug!("Message: {}", json_str);
|
debug!("Message: {}", json_str);
|
||||||
|
@ -213,8 +217,10 @@ pub fn compile_async(
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}).and_then(move |_| {
|
}).and_then(move |_| {
|
||||||
|
let module_specifier = ModuleSpecifier::resolve_url(&module_name)
|
||||||
|
.expect("Should be valid module specifier");
|
||||||
state.dir.fetch_module_meta_data_async(
|
state.dir.fetch_module_meta_data_async(
|
||||||
&module_name,
|
&module_specifier,
|
||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
).map_err(|e| {
|
).map_err(|e| {
|
||||||
|
|
687
cli/deno_dir.rs
687
cli/deno_dir.rs
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,5 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
use crate::deno_dir;
|
||||||
use crate::diagnostics;
|
use crate::diagnostics;
|
||||||
use crate::fmt_errors::JSErrorColor;
|
use crate::fmt_errors::JSErrorColor;
|
||||||
use crate::import_map;
|
use crate::import_map;
|
||||||
|
@ -34,6 +35,7 @@ enum Repr {
|
||||||
ModuleResolutionErr(ModuleResolutionError),
|
ModuleResolutionErr(ModuleResolutionError),
|
||||||
Diagnostic(diagnostics::Diagnostic),
|
Diagnostic(diagnostics::Diagnostic),
|
||||||
JSError(JSError),
|
JSError(JSError),
|
||||||
|
DenoDirErr(deno_dir::DenoDirError),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new simple DenoError.
|
/// Create a new simple DenoError.
|
||||||
|
@ -116,6 +118,7 @@ impl DenoError {
|
||||||
}
|
}
|
||||||
Repr::Diagnostic(ref _err) => ErrorKind::Diagnostic,
|
Repr::Diagnostic(ref _err) => ErrorKind::Diagnostic,
|
||||||
Repr::JSError(ref _err) => ErrorKind::JSError,
|
Repr::JSError(ref _err) => ErrorKind::JSError,
|
||||||
|
Repr::DenoDirErr(ref _err) => ErrorKind::DenoDirError,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,6 +144,7 @@ impl fmt::Display for DenoError {
|
||||||
Repr::ModuleResolutionErr(ref err) => err.fmt(f),
|
Repr::ModuleResolutionErr(ref err) => err.fmt(f),
|
||||||
Repr::Diagnostic(ref err) => err.fmt(f),
|
Repr::Diagnostic(ref err) => err.fmt(f),
|
||||||
Repr::JSError(ref err) => JSErrorColor(err).fmt(f),
|
Repr::JSError(ref err) => JSErrorColor(err).fmt(f),
|
||||||
|
Repr::DenoDirErr(ref err) => err.fmt(f),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -156,6 +160,7 @@ impl std::error::Error for DenoError {
|
||||||
Repr::ModuleResolutionErr(ref err) => err.description(),
|
Repr::ModuleResolutionErr(ref err) => err.description(),
|
||||||
Repr::Diagnostic(ref err) => &err.items[0].message,
|
Repr::Diagnostic(ref err) => &err.items[0].message,
|
||||||
Repr::JSError(ref err) => &err.description(),
|
Repr::JSError(ref err) => &err.description(),
|
||||||
|
Repr::DenoDirErr(ref err) => err.description(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,6 +174,7 @@ impl std::error::Error for DenoError {
|
||||||
Repr::ModuleResolutionErr(ref err) => err.source(),
|
Repr::ModuleResolutionErr(ref err) => err.source(),
|
||||||
Repr::Diagnostic(ref _err) => None,
|
Repr::Diagnostic(ref _err) => None,
|
||||||
Repr::JSError(ref err) => Some(err),
|
Repr::JSError(ref err) => Some(err),
|
||||||
|
Repr::DenoDirErr(ref err) => Some(err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -256,6 +262,14 @@ impl From<import_map::ImportMapError> for DenoError {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<deno_dir::DenoDirError> for DenoError {
|
||||||
|
fn from(err: deno_dir::DenoDirError) -> Self {
|
||||||
|
Self {
|
||||||
|
repr: Repr::DenoDirErr(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<ModuleResolutionError> for DenoError {
|
impl From<ModuleResolutionError> for DenoError {
|
||||||
fn from(err: ModuleResolutionError) -> Self {
|
fn from(err: ModuleResolutionError) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
@ -334,6 +348,8 @@ pub fn err_check<R>(r: Result<R, DenoError>) {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::ansi::strip_ansi_codes;
|
use crate::ansi::strip_ansi_codes;
|
||||||
|
use crate::deno_dir::DenoDirError;
|
||||||
|
use crate::deno_dir::DenoDirErrorKind;
|
||||||
use crate::diagnostics::Diagnostic;
|
use crate::diagnostics::Diagnostic;
|
||||||
use crate::diagnostics::DiagnosticCategory;
|
use crate::diagnostics::DiagnosticCategory;
|
||||||
use crate::diagnostics::DiagnosticItem;
|
use crate::diagnostics::DiagnosticItem;
|
||||||
|
@ -450,6 +466,13 @@ mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn deno_dir_error() -> DenoDirError {
|
||||||
|
DenoDirError::new(
|
||||||
|
"a deno dir error".to_string(),
|
||||||
|
DenoDirErrorKind::UnsupportedFetchScheme,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_simple_error() {
|
fn test_simple_error() {
|
||||||
let err = new(ErrorKind::NoError, "foo".to_string());
|
let err = new(ErrorKind::NoError, "foo".to_string());
|
||||||
|
@ -494,6 +517,13 @@ mod tests {
|
||||||
assert_eq!(err.to_string(), "an import map error");
|
assert_eq!(err.to_string(), "an import map error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deno_dir_error() {
|
||||||
|
let err = DenoError::from(deno_dir_error());
|
||||||
|
assert_eq!(err.kind(), ErrorKind::DenoDirError);
|
||||||
|
assert_eq!(err.to_string(), "a deno dir error\n");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_bad_resource() {
|
fn test_bad_resource() {
|
||||||
let err = bad_resource();
|
let err = bad_resource();
|
||||||
|
|
|
@ -143,6 +143,7 @@ enum ErrorKind: byte {
|
||||||
NoSyncSupport,
|
NoSyncSupport,
|
||||||
ImportMapError,
|
ImportMapError,
|
||||||
ImportPrefixMissing,
|
ImportPrefixMissing,
|
||||||
|
DenoDirError,
|
||||||
|
|
||||||
// other kinds
|
// other kinds
|
||||||
Diagnostic,
|
Diagnostic,
|
||||||
|
|
13
cli/ops.rs
13
cli/ops.rs
|
@ -481,8 +481,12 @@ fn op_cache(
|
||||||
// cache path. In the future, checksums will not be used in the cache
|
// cache path. In the future, checksums will not be used in the cache
|
||||||
// filenames and this requirement can be removed. See
|
// filenames and this requirement can be removed. See
|
||||||
// https://github.com/denoland/deno/issues/2057
|
// https://github.com/denoland/deno/issues/2057
|
||||||
|
let module_specifier = ModuleSpecifier::resolve_url(module_id)
|
||||||
|
.expect("Should be valid module specifier");
|
||||||
let module_meta_data =
|
let module_meta_data =
|
||||||
state.dir.fetch_module_meta_data(module_id, true, true)?;
|
state
|
||||||
|
.dir
|
||||||
|
.fetch_module_meta_data(&module_specifier, true, true)?;
|
||||||
|
|
||||||
let (js_cache_path, source_map_path) = state.dir.cache_path(
|
let (js_cache_path, source_map_path) = state.dir.cache_path(
|
||||||
&PathBuf::from(&module_meta_data.filename),
|
&PathBuf::from(&module_meta_data.filename),
|
||||||
|
@ -525,11 +529,8 @@ fn op_fetch_module_meta_data(
|
||||||
|
|
||||||
let fut = state
|
let fut = state
|
||||||
.dir
|
.dir
|
||||||
.fetch_module_meta_data_async(
|
.fetch_module_meta_data_async(&resolved_specifier, use_cache, no_fetch)
|
||||||
&resolved_specifier.to_string(),
|
.and_then(move |out| {
|
||||||
use_cache,
|
|
||||||
no_fetch,
|
|
||||||
).and_then(move |out| {
|
|
||||||
let builder = &mut FlatBufferBuilder::new();
|
let builder = &mut FlatBufferBuilder::new();
|
||||||
let data_off = builder.create_vector(out.source_code.as_slice());
|
let data_off = builder.create_vector(out.source_code.as_slice());
|
||||||
let msg_args = msg::FetchModuleMetaDataResArgs {
|
let msg_args = msg::FetchModuleMetaDataResArgs {
|
||||||
|
|
|
@ -126,11 +126,8 @@ pub fn fetch_module_meta_data_and_maybe_compile_async(
|
||||||
|
|
||||||
state_
|
state_
|
||||||
.dir
|
.dir
|
||||||
.fetch_module_meta_data_async(
|
.fetch_module_meta_data_async(&module_specifier, use_cache, no_fetch)
|
||||||
&module_specifier.to_string(),
|
.and_then(move |out| {
|
||||||
use_cache,
|
|
||||||
no_fetch,
|
|
||||||
).and_then(move |out| {
|
|
||||||
if out.media_type == msg::MediaType::TypeScript
|
if out.media_type == msg::MediaType::TypeScript
|
||||||
&& !out.has_output_code_and_source_map()
|
&& !out.has_output_code_and_source_map()
|
||||||
{
|
{
|
||||||
|
|
|
@ -179,6 +179,41 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_resolve_import() {
|
fn test_resolve_import() {
|
||||||
let tests = vec![
|
let tests = vec![
|
||||||
|
(
|
||||||
|
"./005_more_imports.ts",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"http://deno.land/core/tests/005_more_imports.ts",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"../005_more_imports.ts",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"http://deno.land/core/005_more_imports.ts",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"http://deno.land/core/tests/005_more_imports.ts",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"http://deno.land/core/tests/005_more_imports.ts",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"data:text/javascript,export default 'grapes';",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"data:text/javascript,export default 'grapes';",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"blob:https://whatwg.org/d0360e2f-caee-469f-9a2f-87d5b0456f6f",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"blob:https://whatwg.org/d0360e2f-caee-469f-9a2f-87d5b0456f6f",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"javascript:export default 'artichokes';",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"javascript:export default 'artichokes';",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"data:text/plain,export default 'kale';",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"data:text/plain,export default 'kale';",
|
||||||
|
),
|
||||||
(
|
(
|
||||||
"/dev/core/tests/005_more_imports.ts",
|
"/dev/core/tests/005_more_imports.ts",
|
||||||
"file:///home/yeti",
|
"file:///home/yeti",
|
||||||
|
@ -222,6 +257,31 @@ mod tests {
|
||||||
use ModuleResolutionError::*;
|
use ModuleResolutionError::*;
|
||||||
|
|
||||||
let tests = vec![
|
let tests = vec![
|
||||||
|
(
|
||||||
|
"005_more_imports.ts",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
ImportPrefixMissing,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
".tomato",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
ImportPrefixMissing,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"..zucchini.mjs",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
ImportPrefixMissing,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r".\yam.es",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
ImportPrefixMissing,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"..\yam.es",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
ImportPrefixMissing,
|
||||||
|
),
|
||||||
(
|
(
|
||||||
"https://eggplant:b/c",
|
"https://eggplant:b/c",
|
||||||
"http://deno.land/core/tests/006_url_imports.ts",
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
@ -248,7 +308,16 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_resolve_url_or_path() {
|
fn test_resolve_url_or_path() {
|
||||||
// Absolute URL.
|
// Absolute URL.
|
||||||
let mut tests: Vec<(&str, String)> = vec![];
|
let mut tests: Vec<(&str, String)> = vec![
|
||||||
|
(
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"http://deno.land/core/tests/006_url_imports.ts".to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"https://deno.land/core/tests/006_url_imports.ts",
|
||||||
|
"https://deno.land/core/tests/006_url_imports.ts".to_string(),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
// The local path tests assume that the cwd is the deno repo root.
|
// The local path tests assume that the cwd is the deno repo root.
|
||||||
let cwd = current_dir().unwrap();
|
let cwd = current_dir().unwrap();
|
||||||
|
|
|
@ -7,5 +7,6 @@
|
||||||
at fetchModuleMetaData (js/compiler.ts:[WILDCARD])
|
at fetchModuleMetaData (js/compiler.ts:[WILDCARD])
|
||||||
at _resolveModule (js/compiler.ts:[WILDCARD])
|
at _resolveModule (js/compiler.ts:[WILDCARD])
|
||||||
at js/compiler.ts:[WILDCARD]
|
at js/compiler.ts:[WILDCARD]
|
||||||
|
at resolveModuleNames (js/compiler.ts:[WILDCARD])
|
||||||
at resolveModuleNamesWorker ([WILDCARD])
|
at resolveModuleNamesWorker ([WILDCARD])
|
||||||
at resolveModuleNamesReusingOldState ([WILDCARD]typescript.js:[WILDCARD])
|
at resolveModuleNamesReusingOldState ([WILDCARD]typescript.js:[WILDCARD])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue