fix(npm): allow resolving from package.json when an import map exists (#17905)

This commit is contained in:
David Sherret 2023-02-23 17:20:23 -05:00 committed by GitHub
parent da781280b8
commit e57b38f8b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 76 additions and 14 deletions

View file

@ -811,7 +811,6 @@ impl Inner {
fn update_config_file(&mut self) -> Result<(), AnyError> {
self.maybe_config_file = None;
self.maybe_package_json = None;
self.fmt_options = Default::default();
self.lint_options = Default::default();
@ -1205,7 +1204,7 @@ impl Inner {
.map(|f| self.url_map.normalize_url(&f.uri))
.collect();
// if the current tsconfig has changed, we need to reload it
// if the current deno.json has changed, we need to reload it
if let Some(config_file) = &self.maybe_config_file {
if changes.contains(&config_file.specifier) {
if let Err(err) = self.update_config_file() {
@ -1218,17 +1217,18 @@ impl Inner {
}
}
if let Some(package_json) = &self.maybe_package_json {
if changes.contains(&package_json.specifier()) {
// always update the package json if the deno config changes
if touched || changes.contains(&package_json.specifier()) {
if let Err(err) = self.update_package_json() {
self.client.show_message(MessageType::WARNING, err).await;
}
touched = true;
}
}
// if the current import map, or config file has changed, we need to reload
// if the current import map, or config file has changed, we need to
// reload the import map
if let Some(import_map_uri) = &self.maybe_import_map_uri {
if changes.contains(import_map_uri) || touched {
if touched || changes.contains(import_map_uri) {
if let Err(err) = self.update_import_map().await {
self.client.show_message(MessageType::WARNING, err).await;
}

View file

@ -113,22 +113,30 @@ impl Resolver for CliGraphResolver {
specifier: &str,
referrer: &ModuleSpecifier,
) -> Result<ModuleSpecifier, AnyError> {
if let Some(import_map) = &self.maybe_import_map {
return import_map
.resolve(specifier, referrer)
.map_err(|err| err.into());
}
// attempt to resolve with the import map first
let maybe_import_map_err = match self
.maybe_import_map
.as_ref()
.map(|import_map| import_map.resolve(specifier, referrer))
{
Some(Ok(value)) => return Ok(value),
Some(Err(err)) => Some(err),
None => None,
};
// then with package.json
if let Some(deps) = self.maybe_package_json_deps.as_ref() {
if let Some(specifier) = resolve_package_json_dep(specifier, deps)? {
return Ok(specifier);
}
if let Some(req) = deps.get(specifier) {
return Ok(ModuleSpecifier::parse(&format!("npm:{req}")).unwrap());
}
}
deno_graph::resolve_import(specifier, referrer).map_err(|err| err.into())
// otherwise, surface the import map error or try resolving when has no import map
if let Some(err) = maybe_import_map_err {
Err(err.into())
} else {
deno_graph::resolve_import(specifier, referrer).map_err(|err| err.into())
}
}
}

View file

@ -251,3 +251,13 @@ itest!(package_json_fail_check {
copy_temp_dir: Some("package_json/basic"),
exit_code: 1,
});
itest!(package_json_with_deno_json {
args: "check --quiet main.ts",
output: "package_json/deno_json/main.check.out",
cwd: Some("package_json/deno_json/"),
copy_temp_dir: Some("package_json/deno_json/"),
envs: env_vars_for_npm_tests_no_sync_download(),
http_server: true,
exit_code: 1,
});

View file

@ -2793,6 +2793,15 @@ itest!(package_json_auto_discovered_for_npm_binary {
http_server: true,
});
itest!(package_json_with_deno_json {
args: "run --quiet -A main.ts",
output: "package_json/deno_json/main.out",
cwd: Some("package_json/deno_json/"),
copy_temp_dir: Some("package_json/deno_json/"),
envs: env_vars_for_npm_tests_no_sync_download(),
http_server: true,
});
itest!(wasm_streaming_panic_test {
args: "run run/wasm_streaming_panic_test.js",
output: "run/wasm_streaming_panic_test.js.out",

View file

@ -0,0 +1,5 @@
{
"imports": {
"other": "./other.ts"
}
}

View file

@ -0,0 +1,11 @@
error: TS2322 [ERROR]: Type 'number' is not assignable to type 'string'.
const _strValue1: string = NUMBER_VALUE;
~~~~~~~~~~
at file:///[WILDCARD]/main.ts:8:7
TS2322 [ERROR]: Type 'number' is not assignable to type 'string'.
const _strValue2: string = test.getValue();
~~~~~~~~~~
at file:///[WILDCARD]/main.ts:9:7
Found 2 errors.

View file

@ -0,0 +1,2 @@
1
2

View file

@ -0,0 +1,9 @@
import { NUMBER_VALUE } from "other";
import * as test from "@denotest/esm-basic";
test.setValue(2);
console.log(test.getValue());
// these should cause type errors
const _strValue1: string = NUMBER_VALUE;
const _strValue2: string = test.getValue();

View file

@ -0,0 +1,3 @@
console.log(1);
export const NUMBER_VALUE = 1;

View file

@ -0,0 +1,5 @@
{
"dependencies": {
"@denotest/esm-basic": "*"
}
}