feat(unstable/npm): initial type checking of npm specifiers (#16332)

This commit is contained in:
David Sherret 2022-10-21 11:20:18 -04:00 committed by GitHub
parent 0e1a71fec6
commit bcfe279fba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
64 changed files with 2135 additions and 280 deletions

View file

@ -3346,6 +3346,37 @@ fn lsp_code_actions_deno_cache() {
session.shutdown_and_exit();
}
#[test]
fn lsp_code_actions_deno_cache_npm() {
let mut session = TestSession::from_file("initialize_params.json");
let diagnostics = session.did_open(json!({
"textDocument": {
"uri": "file:///a/file.ts",
"languageId": "typescript",
"version": 1,
"text": "import chalk from \"npm:chalk\";\n\nconsole.log(chalk.green);\n"
}
}));
assert_eq!(
diagnostics.with_source("deno"),
load_fixture_as("code_actions/cache_npm/diagnostics.json")
);
let (maybe_res, maybe_err) = session
.client
.write_request(
"textDocument/codeAction",
load_fixture("code_actions/cache_npm/cache_action.json"),
)
.unwrap();
assert!(maybe_err.is_none());
assert_eq!(
maybe_res,
Some(load_fixture("code_actions/cache_npm/cache_response.json"))
);
session.shutdown_and_exit();
}
#[test]
fn lsp_code_actions_imports() {
let mut session = TestSession::from_file("initialize_params.json");
@ -4046,6 +4077,169 @@ fn lsp_completions_no_snippet() {
}
}
#[test]
fn lsp_completions_npm() {
let _g = http_server();
let mut client = init("initialize_params.json");
did_open(
&mut client,
json!({
"textDocument": {
"uri": "file:///a/file.ts",
"languageId": "typescript",
"version": 1,
"text": "import cjsDefault from 'npm:@denotest/cjs-default-export';import chalk from 'npm:chalk';\n\n",
}
}),
);
let (maybe_res, maybe_err) = client
.write_request::<_, _, Value>(
"deno/cache",
json!({
"referrer": {
"uri": "file:///a/file.ts",
},
"uris": [
{
"uri": "npm:@denotest/cjs-default-export",
},
{
"uri": "npm:chalk",
}
]
}),
)
.unwrap();
assert!(maybe_err.is_none());
assert!(maybe_res.is_some());
// check importing a cjs default import
client
.write_notification(
"textDocument/didChange",
json!({
"textDocument": {
"uri": "file:///a/file.ts",
"version": 2
},
"contentChanges": [
{
"range": {
"start": {
"line": 2,
"character": 0
},
"end": {
"line": 2,
"character": 0
}
},
"text": "cjsDefault."
}
]
}),
)
.unwrap();
read_diagnostics(&mut client);
let (maybe_res, maybe_err) = client
.write_request(
"textDocument/completion",
json!({
"textDocument": {
"uri": "file:///a/file.ts"
},
"position": {
"line": 2,
"character": 11
},
"context": {
"triggerKind": 2,
"triggerCharacter": "."
}
}),
)
.unwrap();
assert!(maybe_err.is_none());
if let Some(lsp::CompletionResponse::List(list)) = maybe_res {
assert!(!list.is_incomplete);
assert_eq!(list.items.len(), 3);
assert!(list.items.iter().any(|i| i.label == "default"));
assert!(list.items.iter().any(|i| i.label == "MyClass"));
} else {
panic!("unexpected response");
}
let (maybe_res, maybe_err) = client
.write_request(
"completionItem/resolve",
load_fixture("completions/npm/resolve_params.json"),
)
.unwrap();
assert!(maybe_err.is_none());
assert_eq!(
maybe_res,
Some(load_fixture("completions/npm/resolve_response.json"))
);
// now check chalk, which is esm
client
.write_notification(
"textDocument/didChange",
json!({
"textDocument": {
"uri": "file:///a/file.ts",
"version": 3
},
"contentChanges": [
{
"range": {
"start": {
"line": 2,
"character": 0
},
"end": {
"line": 2,
"character": 11
}
},
"text": "chalk."
}
]
}),
)
.unwrap();
read_diagnostics(&mut client);
let (maybe_res, maybe_err) = client
.write_request(
"textDocument/completion",
json!({
"textDocument": {
"uri": "file:///a/file.ts"
},
"position": {
"line": 2,
"character": 6
},
"context": {
"triggerKind": 2,
"triggerCharacter": "."
}
}),
)
.unwrap();
assert!(maybe_err.is_none());
if let Some(lsp::CompletionResponse::List(list)) = maybe_res {
assert!(!list.is_incomplete);
assert!(list.items.iter().any(|i| i.label == "green"));
assert!(list.items.iter().any(|i| i.label == "red"));
} else {
panic!("unexpected response");
}
shutdown(&mut client);
}
#[test]
fn lsp_completions_registry() {
let _g = http_server();