mirror of
https://github.com/denoland/deno.git
synced 2025-08-04 10:59:13 +00:00
feat(unstable/npm): initial type checking of npm specifiers (#16332)
This commit is contained in:
parent
0e1a71fec6
commit
bcfe279fba
64 changed files with 2135 additions and 280 deletions
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue