|
1 |
| -import { |
2 |
| - ConfigurationRequest, |
3 |
| - DidCloseTextDocumentNotification, |
4 |
| - DidOpenTextDocumentNotification, |
5 |
| - InitializeRequest, |
6 |
| - InitializedNotification, |
7 |
| - RegistrationRequest, |
8 |
| - SemanticTokensRefreshRequest, |
9 |
| - WorkDoneProgressCreateRequest |
10 |
| -} from "vscode-languageserver"; |
11 |
| -import { createConnection } from "vscode-languageserver/node.js"; |
12 |
| -import { randomUUID } from "node:crypto"; |
13 |
| -import { Duplex } from "node:stream"; |
14 |
| -import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; |
| 1 | +import { mkdtemp, rm, writeFile } from "node:fs/promises"; |
15 | 2 | import { tmpdir } from "node:os";
|
16 | 3 | import { fileURLToPath, pathToFileURL } from "node:url";
|
17 | 4 | import { join } from "node:path";
|
18 |
| -import { resolveIri } from "@hyperjump/uri"; |
19 |
| -import { merge } from "merge-anything"; |
20 |
| -import { buildServer } from "./build-server.js"; |
21 | 5 |
|
22 |
| -import type { Connection, InitializeParams } from "vscode-languageserver"; |
23 |
| -import type { Feature } from "./build-server.js"; |
24 |
| -import type { DocumentSettings } from "./features/document-settings.js"; |
25 |
| - |
26 |
| - |
27 |
| -export class TestStream extends Duplex { |
28 |
| - _write(chunk: string, _encoding: string, done: () => void) { |
29 |
| - this.emit("data", chunk); |
30 |
| - done(); |
31 |
| - } |
32 |
| - |
33 |
| - _read(_size: number) { |
34 |
| - } |
35 |
| -} |
36 |
| - |
37 |
| -export const getTestClient = (features: Feature[]) => { |
38 |
| - const up = new TestStream(); |
39 |
| - const down = new TestStream(); |
40 |
| - |
41 |
| - const server = createConnection(up, down); |
42 |
| - buildServer(server, features); |
43 |
| - |
44 |
| - const client = createConnection(down, up); |
45 |
| - client.listen(); |
46 |
| - |
47 |
| - return client; |
48 |
| -}; |
49 |
| - |
50 |
| -export const initializeServer = async (client: Connection, initParams: Partial<InitializeParams> = {}, settings: Partial<DocumentSettings> | null = null) => { |
51 |
| - client.onRequest(RegistrationRequest.type, () => { |
52 |
| - // Ignore client/registerCapability request for now |
53 |
| - }); |
54 |
| - |
55 |
| - client.onRequest(SemanticTokensRefreshRequest.type, () => { |
56 |
| - // Ignore workspace/semanticTokens/refresh request for now |
57 |
| - }); |
58 |
| - |
59 |
| - client.onRequest(WorkDoneProgressCreateRequest.type, () => { |
60 |
| - // Ignore window/workDoneProgress/create for now |
61 |
| - }); |
62 |
| - |
63 |
| - client.onRequest(ConfigurationRequest.type, () => { |
64 |
| - return [settings]; |
65 |
| - }); |
66 |
| - |
67 |
| - const defaultInitParams: InitializeParams = { |
68 |
| - processId: null, |
69 |
| - rootUri: null, |
70 |
| - capabilities: { |
71 |
| - workspace: { |
72 |
| - workspaceFolders: true, |
73 |
| - didChangeWatchedFiles: { |
74 |
| - dynamicRegistration: true |
75 |
| - }, |
76 |
| - configuration: true, |
77 |
| - didChangeConfiguration: { |
78 |
| - dynamicRegistration: true |
79 |
| - } |
80 |
| - }, |
81 |
| - window: { |
82 |
| - workDoneProgress: true |
83 |
| - } |
84 |
| - } |
85 |
| - }; |
86 |
| - const response = await client.sendRequest(InitializeRequest.type, merge(defaultInitParams, initParams)); |
87 |
| - |
88 |
| - await client.sendNotification(InitializedNotification.type, {}); |
89 |
| - |
90 |
| - return response.capabilities; |
91 |
| -}; |
92 |
| - |
93 |
| -export const openDocument = async (client: Connection, uri: string, text?: string) => { |
94 |
| - const baseUri = pathToFileURL(`/${randomUUID()}/`).toString(); |
95 |
| - const documentUri = resolveIri(uri, baseUri); |
96 |
| - |
97 |
| - await client.sendNotification(DidOpenTextDocumentNotification.type, { |
98 |
| - textDocument: { |
99 |
| - uri: documentUri, |
100 |
| - languageId: "json", |
101 |
| - version: 0, |
102 |
| - text: text ?? await readFile(fileURLToPath(uri), "utf-8") |
103 |
| - } |
104 |
| - }); |
105 |
| - |
106 |
| - return documentUri; |
107 |
| -}; |
108 |
| - |
109 |
| -export const closeDocument = async (client: Connection, uri: string) => { |
110 |
| - await client.sendNotification(DidCloseTextDocumentNotification.type, { |
111 |
| - textDocument: { |
112 |
| - uri: uri |
113 |
| - } |
114 |
| - }); |
115 |
| -}; |
116 | 6 |
|
117 | 7 | export const setupWorkspace = async (files: Record<string, string>) => {
|
118 | 8 | const workspaceFolder = await mkdtemp(join(tmpdir(), "test-workspace-"));
|
|
0 commit comments