mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
fix(node): handle resolving ".//<something>" in npm packages (#26920)
The issue was this package had an import like: `".//index.js"` and we resolved that as specified, but node normalizes it to `"./index.js"` so we have to copy node.
This commit is contained in:
parent
661aa22c03
commit
186b52731c
7 changed files with 30 additions and 16 deletions
|
@ -474,21 +474,6 @@ impl<TGraphContainer: ModuleGraphContainer>
|
||||||
raw_specifier: &str,
|
raw_specifier: &str,
|
||||||
referrer: &ModuleSpecifier,
|
referrer: &ModuleSpecifier,
|
||||||
) -> Result<ModuleSpecifier, AnyError> {
|
) -> Result<ModuleSpecifier, AnyError> {
|
||||||
if self.shared.in_npm_pkg_checker.in_npm_package(referrer) {
|
|
||||||
return Ok(
|
|
||||||
self
|
|
||||||
.shared
|
|
||||||
.node_resolver
|
|
||||||
.resolve(
|
|
||||||
raw_specifier,
|
|
||||||
referrer,
|
|
||||||
self.shared.cjs_tracker.get_referrer_kind(referrer),
|
|
||||||
NodeResolutionMode::Execution,
|
|
||||||
)?
|
|
||||||
.into_url(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let graph = self.graph_container.graph();
|
let graph = self.graph_container.graph();
|
||||||
let resolution = match graph.get(referrer) {
|
let resolution = match graph.get(referrer) {
|
||||||
Some(Module::Js(module)) => module
|
Some(Module::Js(module)) => module
|
||||||
|
|
|
@ -202,7 +202,7 @@ impl<TEnv: NodeResolverEnv> NodeResolver<TEnv> {
|
||||||
mode: NodeResolutionMode,
|
mode: NodeResolutionMode,
|
||||||
) -> Result<Url, NodeResolveError> {
|
) -> Result<Url, NodeResolveError> {
|
||||||
if should_be_treated_as_relative_or_absolute_path(specifier) {
|
if should_be_treated_as_relative_or_absolute_path(specifier) {
|
||||||
Ok(referrer.join(specifier).map_err(|err| {
|
Ok(node_join_url(referrer, specifier).map_err(|err| {
|
||||||
NodeResolveRelativeJoinError {
|
NodeResolveRelativeJoinError {
|
||||||
path: specifier.to_string(),
|
path: specifier.to_string(),
|
||||||
base: referrer.clone(),
|
base: referrer.clone(),
|
||||||
|
@ -1763,6 +1763,17 @@ fn get_module_name_from_builtin_node_module_specifier(
|
||||||
Some(specifier)
|
Some(specifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Node is more lenient joining paths than the url crate is,
|
||||||
|
/// so this function handles that.
|
||||||
|
fn node_join_url(url: &Url, path: &str) -> Result<Url, url::ParseError> {
|
||||||
|
if let Some(suffix) = path.strip_prefix(".//") {
|
||||||
|
// specifier had two leading slashes
|
||||||
|
url.join(&format!("./{}", suffix))
|
||||||
|
} else {
|
||||||
|
url.join(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
// node.js will resolve this as ./other.js
|
||||||
|
export * from ".//other.js";
|
|
@ -0,0 +1,3 @@
|
||||||
|
export function add(a, b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"name": "@denotest/specifier-two-slashes",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"main": "index.js"
|
||||||
|
}
|
4
tests/specs/npm/specifier_two_slashes/__test__.jsonc
Normal file
4
tests/specs/npm/specifier_two_slashes/__test__.jsonc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"args": "run --quiet main.ts",
|
||||||
|
"output": "3\n"
|
||||||
|
}
|
3
tests/specs/npm/specifier_two_slashes/main.ts
Normal file
3
tests/specs/npm/specifier_two_slashes/main.ts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import { add } from "npm:@denotest/specifier-two-slashes";
|
||||||
|
|
||||||
|
console.log(add(1, 2));
|
Loading…
Reference in a new issue