Skip to content

Commit 617eeab

Browse files
authored
feat(unstable): Node CJS and ESM resolvers for compat mode (#12424)
This commit adds CJS and ESM Node resolvers to the "--compat" mode. The functionality is spread across "cli/compat" module and Node compatibility layer in "deno_std/node"; this stems from the fact that ES module resolution can only be implemented in Rust as it needs to directly integrated with "deno_core"; however "deno_std/node" already provided CJS module resolution. Currently this resolution is only active when running a files using "deno run --compat --unstable <filename>", and is not available in other subcommands, which will be changed in follow up commits.
1 parent 5a48d41 commit 617eeab

32 files changed

+1606
-139
lines changed

cli/compat.rs

Lines changed: 0 additions & 88 deletions
This file was deleted.

cli/compat/errors.rs

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
2+
3+
use deno_core::error::generic_error;
4+
use deno_core::error::type_error;
5+
use deno_core::error::AnyError;
6+
use deno_core::url::Url;
7+
8+
pub(crate) fn err_invalid_module_specifier(
9+
request: &str,
10+
reason: &str,
11+
maybe_base: Option<String>,
12+
) -> AnyError {
13+
let mut msg = format!(
14+
"[ERR_INVALID_MODULE_SPECIFIER] Invalid module \"{}\" {}",
15+
request, reason
16+
);
17+
18+
if let Some(base) = maybe_base {
19+
msg = format!("{} imported from {}", msg, base);
20+
}
21+
22+
type_error(msg)
23+
}
24+
25+
pub(crate) fn err_invalid_package_config(
26+
path: &str,
27+
maybe_base: Option<String>,
28+
maybe_message: Option<String>,
29+
) -> AnyError {
30+
let mut msg = format!(
31+
"[ERR_INVALID_PACKAGE_CONFIG] Invalid package config {}",
32+
path
33+
);
34+
35+
if let Some(base) = maybe_base {
36+
msg = format!("{} while importing {}", msg, base);
37+
}
38+
39+
if let Some(message) = maybe_message {
40+
msg = format!("{}. {}", msg, message);
41+
}
42+
43+
generic_error(msg)
44+
}
45+
46+
pub(crate) fn err_module_not_found(
47+
path: &str,
48+
base: &str,
49+
typ: &str,
50+
) -> AnyError {
51+
generic_error(format!(
52+
"[ERR_MODULE_NOT_FOUND] Cannot find {} '{}' imported from {}",
53+
typ, path, base
54+
))
55+
}
56+
57+
pub(crate) fn err_unsupported_dir_import(path: &str, base: &str) -> AnyError {
58+
generic_error(format!("[ERR_UNSUPPORTED_DIR_IMPORT] Directory import '{}' is not supported resolving ES modules imported from {}", path, base))
59+
}
60+
61+
pub(crate) fn err_unsupported_esm_url_scheme(url: &Url) -> AnyError {
62+
let mut msg =
63+
"[ERR_UNSUPPORTED_ESM_URL_SCHEME] Only file and data URLS are supported by the default ESM loader"
64+
.to_string();
65+
66+
if cfg!(window) && url.scheme().len() == 2 {
67+
msg = format!(
68+
"{}. On Windows, absolute path must be valid file:// URLs",
69+
msg
70+
);
71+
}
72+
73+
msg = format!("{}. Received protocol '{}'", msg, url.scheme());
74+
generic_error(msg)
75+
}
76+
77+
pub(crate) fn err_invalid_package_target(
78+
pkg_path: String,
79+
key: String,
80+
target: String,
81+
is_import: bool,
82+
maybe_base: Option<String>,
83+
) -> AnyError {
84+
let rel_error = !is_import && !target.is_empty() && !target.starts_with("./");
85+
let mut msg = "[ERR_INVALID_PACKAGE_TARGET]".to_string();
86+
87+
if key == "." {
88+
assert!(!is_import);
89+
msg = format!("{} Invalid \"exports\" main target {} defined in the package config {}package.json", msg, target, pkg_path)
90+
} else {
91+
let ie = if is_import { "imports" } else { "exports" };
92+
msg = format!("{} Invalid \"{}\" target {} defined for '{}' in the package config {}package.json", msg, ie, target, key, pkg_path)
93+
};
94+
95+
if let Some(base) = maybe_base {
96+
msg = format!("{} imported from {}", msg, base);
97+
};
98+
if rel_error {
99+
msg = format!("{}; target must start with \"./\"", msg);
100+
}
101+
102+
generic_error(msg)
103+
}
104+
105+
pub(crate) fn err_package_path_not_exported(
106+
pkg_path: String,
107+
subpath: String,
108+
maybe_base: Option<String>,
109+
) -> AnyError {
110+
let mut msg = "[ERR_PACKAGE_PATH_NOT_EXPORTED]".to_string();
111+
112+
if subpath == "." {
113+
msg = format!(
114+
"{} No \"exports\" main defined in {}package.json",
115+
msg, pkg_path
116+
);
117+
} else {
118+
msg = format!("{} Package subpath \'{}\' is not defined by \"exports\" in {}package.json", msg, subpath, pkg_path);
119+
};
120+
121+
if let Some(base) = maybe_base {
122+
msg = format!("{} imported from {}", msg, base);
123+
}
124+
125+
generic_error(msg)
126+
}
127+
128+
pub(crate) fn err_package_import_not_defined(
129+
specifier: &str,
130+
package_path: Option<String>,
131+
base: &str,
132+
) -> AnyError {
133+
let mut msg = format!(
134+
"[ERR_PACKAGE_IMPORT_NOT_DEFINED] Package import specifier \"{}\" is not defined in",
135+
specifier
136+
);
137+
138+
if let Some(package_path) = package_path {
139+
msg = format!("{} in package {}package.json", msg, package_path);
140+
}
141+
142+
msg = format!("{} imported from {}", msg, base);
143+
144+
type_error(msg)
145+
}

0 commit comments

Comments
 (0)