提交 9712e0c3 编写于 作者: B Bartek Iwańczuk 提交者: Ry Dahl

better error messages for 'relative import path not prefixed with / or ./ or ../' (#3405)

上级 2a348144
...@@ -140,7 +140,7 @@ impl GetErrorKind for ModuleResolutionError { ...@@ -140,7 +140,7 @@ impl GetErrorKind for ModuleResolutionError {
match self { match self {
InvalidUrl(ref err) | InvalidBaseUrl(ref err) => err.kind(), InvalidUrl(ref err) | InvalidBaseUrl(ref err) => err.kind(),
InvalidPath(_) => ErrorKind::InvalidPath, InvalidPath(_) => ErrorKind::InvalidPath,
ImportPrefixMissing(_) => ErrorKind::ImportPrefixMissing, ImportPrefixMissing(_, _) => ErrorKind::ImportPrefixMissing,
} }
} }
} }
......
[WILDCARD]error: Uncaught ImportPrefixMissing: relative import path "bad-module.ts" not prefixed with / or ./ or ../ [WILDCARD]error: Uncaught ImportPrefixMissing: relative import path "bad-module.ts" not prefixed with / or ./ or ../ Imported from "[WILDCARD]/error_011_bad_module_specifier.ts"
[WILDCARD]dispatch_json.ts:[WILDCARD] [WILDCARD]dispatch_json.ts:[WILDCARD]
at DenoError ([WILDCARD]errors.ts:[WILDCARD]) at DenoError ([WILDCARD]errors.ts:[WILDCARD])
at unwrapResponse ([WILDCARD]dispatch_json.ts:[WILDCARD]) at unwrapResponse ([WILDCARD]dispatch_json.ts:[WILDCARD])
......
[WILDCARD]error: Uncaught ImportPrefixMissing: relative import path "bad-module.ts" not prefixed with / or ./ or ../ [WILDCARD]error: Uncaught ImportPrefixMissing: relative import path "bad-module.ts" not prefixed with / or ./ or ../ Imported from "[WILDCARD]/error_012_bad_dynamic_import_specifier.ts"
[WILDCARD]dispatch_json.ts:[WILDCARD] [WILDCARD]dispatch_json.ts:[WILDCARD]
at DenoError ([WILDCARD]errors.ts:[WILDCARD]) at DenoError ([WILDCARD]errors.ts:[WILDCARD])
at unwrapResponse ([WILDCARD]dispatch_json.ts:[WILDCARD]) at unwrapResponse ([WILDCARD]dispatch_json.ts:[WILDCARD])
......
Caught direct dynamic import error. Caught direct dynamic import error.
TypeError: relative import path "does not exist" not prefixed with / or ./ or ../ TypeError: relative import path "does not exist" not prefixed with / or ./ or ../ Imported from "[WILDCARD]/error_014_catch_dynamic_import_error.js"
Caught indirect direct dynamic import error. Caught indirect direct dynamic import error.
TypeError: relative import path "does not exist either" not prefixed with / or ./ or ../ TypeError: relative import path "does not exist either" not prefixed with / or ./ or ../ Imported from "[WILDCARD]/indirect_import_error.js"
Caught error thrown by dynamically imported module. Caught error thrown by dynamically imported module.
Error: An error Error: An error
......
[WILDCARD]error: Uncaught ImportPrefixMissing: relative import path "baz" not prefixed with / or ./ or ../ [WILDCARD]error: Uncaught ImportPrefixMissing: relative import path "baz" not prefixed with / or ./ or ../ Imported from "[WILDCARD]/type_definitions/bar.d.ts"
[WILDCARD]dispatch_json.ts:[WILDCARD] [WILDCARD]dispatch_json.ts:[WILDCARD]
at DenoError ([WILDCARD]errors.ts:[WILDCARD]) at DenoError ([WILDCARD]errors.ts:[WILDCARD])
at unwrapResponse ([WILDCARD]dispatch_json.ts:[WILDCARD]) at unwrapResponse ([WILDCARD]dispatch_json.ts:[WILDCARD])
......
...@@ -11,7 +11,7 @@ pub enum ModuleResolutionError { ...@@ -11,7 +11,7 @@ pub enum ModuleResolutionError {
InvalidUrl(ParseError), InvalidUrl(ParseError),
InvalidBaseUrl(ParseError), InvalidBaseUrl(ParseError),
InvalidPath(PathBuf), InvalidPath(PathBuf),
ImportPrefixMissing(String), ImportPrefixMissing(String, Option<String>),
} }
use ModuleResolutionError::*; use ModuleResolutionError::*;
...@@ -32,11 +32,19 @@ impl fmt::Display for ModuleResolutionError { ...@@ -32,11 +32,19 @@ impl fmt::Display for ModuleResolutionError {
write!(f, "invalid base URL for relative import: {}", err) write!(f, "invalid base URL for relative import: {}", err)
} }
InvalidPath(ref path) => write!(f, "invalid module path: {:?}", path), InvalidPath(ref path) => write!(f, "invalid module path: {:?}", path),
ImportPrefixMissing(ref specifier) => write!( ImportPrefixMissing(ref specifier, ref maybe_referrer) => {
f, let msg = format!(
"relative import path \"{}\" not prefixed with / or ./ or ../", "relative import path \"{}\" not prefixed with / or ./ or ../",
specifier specifier
), );
let msg = if let Some(referrer) = maybe_referrer {
format!("{} Imported from \"{}\"", msg, referrer)
} else {
msg
};
write!(f, "{}", msg)
}
} }
} }
} }
...@@ -78,7 +86,12 @@ impl ModuleSpecifier { ...@@ -78,7 +86,12 @@ impl ModuleSpecifier {
|| specifier.starts_with("./") || specifier.starts_with("./")
|| specifier.starts_with("../")) => || specifier.starts_with("../")) =>
{ {
return Err(ImportPrefixMissing(specifier.to_string())) let maybe_referrer = if base.is_empty() {
None
} else {
Some(base.to_string())
};
return Err(ImportPrefixMissing(specifier.to_string(), maybe_referrer));
} }
// 3. Return the result of applying the URL parser to specifier with base // 3. Return the result of applying the URL parser to specifier with base
...@@ -282,27 +295,42 @@ mod tests { ...@@ -282,27 +295,42 @@ mod tests {
( (
"005_more_imports.ts", "005_more_imports.ts",
"http://deno.land/core/tests/006_url_imports.ts", "http://deno.land/core/tests/006_url_imports.ts",
ImportPrefixMissing("005_more_imports.ts".to_string()), ImportPrefixMissing(
"005_more_imports.ts".to_string(),
Some("http://deno.land/core/tests/006_url_imports.ts".to_string()),
),
), ),
( (
".tomato", ".tomato",
"http://deno.land/core/tests/006_url_imports.ts", "http://deno.land/core/tests/006_url_imports.ts",
ImportPrefixMissing(".tomato".to_string()), ImportPrefixMissing(
".tomato".to_string(),
Some("http://deno.land/core/tests/006_url_imports.ts".to_string()),
),
), ),
( (
"..zucchini.mjs", "..zucchini.mjs",
"http://deno.land/core/tests/006_url_imports.ts", "http://deno.land/core/tests/006_url_imports.ts",
ImportPrefixMissing("..zucchini.mjs".to_string()), ImportPrefixMissing(
"..zucchini.mjs".to_string(),
Some("http://deno.land/core/tests/006_url_imports.ts".to_string()),
),
), ),
( (
r".\yam.es", r".\yam.es",
"http://deno.land/core/tests/006_url_imports.ts", "http://deno.land/core/tests/006_url_imports.ts",
ImportPrefixMissing(r".\yam.es".to_string()), ImportPrefixMissing(
r".\yam.es".to_string(),
Some("http://deno.land/core/tests/006_url_imports.ts".to_string()),
),
), ),
( (
r"..\yam.es", r"..\yam.es",
"http://deno.land/core/tests/006_url_imports.ts", "http://deno.land/core/tests/006_url_imports.ts",
ImportPrefixMissing(r"..\yam.es".to_string()), ImportPrefixMissing(
r"..\yam.es".to_string(),
Some("http://deno.land/core/tests/006_url_imports.ts".to_string()),
),
), ),
( (
"https://eggplant:b/c", "https://eggplant:b/c",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册