@jinion/core 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/claude/backend.d.ts +4 -0
- package/dist/agent/claude/backend.d.ts.map +1 -1
- package/dist/agent/claude/backend.js.map +1 -1
- package/dist/agent/claude/events.js +1 -1
- package/dist/agent/claude/events.js.map +1 -1
- package/dist/agent/claude/guard.d.ts.map +1 -1
- package/dist/agent/claude/guard.js +2 -1
- package/dist/agent/claude/guard.js.map +1 -1
- package/dist/agent/claude/jinion-tools.d.ts +9 -1
- package/dist/agent/claude/jinion-tools.d.ts.map +1 -1
- package/dist/agent/claude/jinion-tools.js +14 -2
- package/dist/agent/claude/jinion-tools.js.map +1 -1
- package/dist/agent/claude/mcp.d.ts.map +1 -1
- package/dist/agent/claude/mcp.js +21 -1
- package/dist/agent/claude/mcp.js.map +1 -1
- package/dist/agent/claude/options.d.ts +9 -1
- package/dist/agent/claude/options.d.ts.map +1 -1
- package/dist/agent/claude/options.js +5 -3
- package/dist/agent/claude/options.js.map +1 -1
- package/dist/agent/claude/paths.d.ts +0 -3
- package/dist/agent/claude/paths.d.ts.map +1 -1
- package/dist/agent/claude/paths.js +1 -7
- package/dist/agent/claude/paths.js.map +1 -1
- package/dist/agent/claude/permissions.js +1 -1
- package/dist/agent/claude/permissions.js.map +1 -1
- package/dist/agent/claude/prompt.d.ts +2 -1
- package/dist/agent/claude/prompt.d.ts.map +1 -1
- package/dist/agent/claude/prompt.js +10 -5
- package/dist/agent/claude/prompt.js.map +1 -1
- package/dist/agent/claude/review.d.ts +4 -1
- package/dist/agent/claude/review.d.ts.map +1 -1
- package/dist/agent/claude/review.js +5 -2
- package/dist/agent/claude/review.js.map +1 -1
- package/dist/agent/claude/session.d.ts +7 -0
- package/dist/agent/claude/session.d.ts.map +1 -1
- package/dist/agent/claude/session.js +6 -1
- package/dist/agent/claude/session.js.map +1 -1
- package/dist/agent/claude/tool-calls.d.ts.map +1 -1
- package/dist/agent/claude/tool-calls.js +11 -2
- package/dist/agent/claude/tool-calls.js.map +1 -1
- package/dist/agent/codex/backend.d.ts +4 -0
- package/dist/agent/codex/backend.d.ts.map +1 -1
- package/dist/agent/codex/backend.js.map +1 -1
- package/dist/agent/codex/events.d.ts.map +1 -1
- package/dist/agent/codex/events.js +15 -1
- package/dist/agent/codex/events.js.map +1 -1
- package/dist/agent/codex/jinion-tools.d.ts +38 -4
- package/dist/agent/codex/jinion-tools.d.ts.map +1 -1
- package/dist/agent/codex/jinion-tools.js +57 -10
- package/dist/agent/codex/jinion-tools.js.map +1 -1
- package/dist/agent/codex/mcp.d.ts.map +1 -1
- package/dist/agent/codex/mcp.js +4 -0
- package/dist/agent/codex/mcp.js.map +1 -1
- package/dist/agent/codex/rewind.js +1 -47
- package/dist/agent/codex/rewind.js.map +1 -1
- package/dist/agent/codex/session.d.ts +9 -2
- package/dist/agent/codex/session.d.ts.map +1 -1
- package/dist/agent/codex/session.js +21 -7
- package/dist/agent/codex/session.js.map +1 -1
- package/dist/agent/demo/mcp.d.ts +2 -0
- package/dist/agent/demo/mcp.d.ts.map +1 -1
- package/dist/agent/demo/mcp.js +14 -0
- package/dist/agent/demo/mcp.js.map +1 -1
- package/dist/agent/demo/scenarios/pricing-card.d.ts +3 -0
- package/dist/agent/demo/scenarios/pricing-card.d.ts.map +1 -0
- package/dist/agent/demo/scenarios/pricing-card.js +43 -0
- package/dist/agent/demo/scenarios/pricing-card.js.map +1 -0
- package/dist/agent/demo/script.d.ts +6 -0
- package/dist/agent/demo/script.d.ts.map +1 -1
- package/dist/agent/demo/tasks.d.ts +3 -0
- package/dist/agent/demo/tasks.d.ts.map +1 -1
- package/dist/agent/events.d.ts +3 -0
- package/dist/agent/events.d.ts.map +1 -1
- package/dist/agent/events.js +2 -0
- package/dist/agent/events.js.map +1 -1
- package/dist/agent/mcp.d.ts +5 -0
- package/dist/agent/mcp.d.ts.map +1 -1
- package/dist/agent/mcp.js +2 -0
- package/dist/agent/mcp.js.map +1 -1
- package/dist/agent/patches.d.ts +5 -0
- package/dist/agent/patches.d.ts.map +1 -1
- package/dist/agent/patches.js +49 -0
- package/dist/agent/patches.js.map +1 -1
- package/dist/agent/review-tools.d.ts +15 -0
- package/dist/agent/review-tools.d.ts.map +1 -0
- package/dist/agent/review-tools.js +13 -0
- package/dist/agent/review-tools.js.map +1 -0
- package/dist/agent/review.d.ts +18 -6
- package/dist/agent/review.d.ts.map +1 -1
- package/dist/agent/review.js +52 -17
- package/dist/agent/review.js.map +1 -1
- package/dist/api/client.d.ts +15 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +14 -3
- package/dist/api/client.js.map +1 -1
- package/dist/api/connection.d.ts +5 -0
- package/dist/api/connection.d.ts.map +1 -1
- package/dist/api/connection.js +6 -0
- package/dist/api/connection.js.map +1 -1
- package/dist/api/fields.d.ts +3 -1
- package/dist/api/fields.d.ts.map +1 -1
- package/dist/api/fields.js +3 -2
- package/dist/api/fields.js.map +1 -1
- package/dist/api/json-schema.d.ts +592 -89
- package/dist/api/json-schema.d.ts.map +1 -1
- package/dist/api/json-schema.js +2 -1
- package/dist/api/json-schema.js.map +1 -1
- package/dist/api/methods/accounts.d.ts.map +1 -1
- package/dist/api/methods/accounts.js +1 -2
- package/dist/api/methods/accounts.js.map +1 -1
- package/dist/api/methods/app.d.ts.map +1 -1
- package/dist/api/methods/app.js +9 -5
- package/dist/api/methods/app.js.map +1 -1
- package/dist/api/methods/files.d.ts +3 -1
- package/dist/api/methods/files.d.ts.map +1 -1
- package/dist/api/methods/files.js +75 -2
- package/dist/api/methods/files.js.map +1 -1
- package/dist/api/methods/git.d.ts.map +1 -1
- package/dist/api/methods/git.js +54 -6
- package/dist/api/methods/git.js.map +1 -1
- package/dist/api/methods/lsp.d.ts +7 -0
- package/dist/api/methods/lsp.d.ts.map +1 -0
- package/dist/api/methods/lsp.js +68 -0
- package/dist/api/methods/lsp.js.map +1 -0
- package/dist/api/methods/preview.d.ts +4 -1
- package/dist/api/methods/preview.d.ts.map +1 -1
- package/dist/api/methods/preview.js +19 -3
- package/dist/api/methods/preview.js.map +1 -1
- package/dist/api/methods/terminals.d.ts.map +1 -1
- package/dist/api/methods/terminals.js +7 -1
- package/dist/api/methods/terminals.js.map +1 -1
- package/dist/api/protocol.d.ts +762 -7
- package/dist/api/protocol.d.ts.map +1 -1
- package/dist/api/protocol.js +126 -8
- package/dist/api/protocol.js.map +1 -1
- package/dist/api/schemas.d.ts +7 -0
- package/dist/api/schemas.d.ts.map +1 -1
- package/dist/api/schemas.js +4 -0
- package/dist/api/schemas.js.map +1 -1
- package/dist/api/screen.d.ts +2 -0
- package/dist/api/screen.d.ts.map +1 -1
- package/dist/api/screen.js +3 -0
- package/dist/api/screen.js.map +1 -1
- package/dist/api/server.d.ts +2 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +13 -0
- package/dist/api/server.js.map +1 -1
- package/dist/commands/builtin.d.ts.map +1 -1
- package/dist/commands/builtin.js +2 -0
- package/dist/commands/builtin.js.map +1 -1
- package/dist/commands/conversation.d.ts.map +1 -1
- package/dist/commands/conversation.js +2 -0
- package/dist/commands/conversation.js.map +1 -1
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +1 -0
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/notifications.d.ts.map +1 -1
- package/dist/commands/notifications.js +5 -3
- package/dist/commands/notifications.js.map +1 -1
- package/dist/commands/registry.d.ts +3 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +14 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/skill.d.ts +5 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +30 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/views.d.ts.map +1 -1
- package/dist/commands/views.js +5 -1
- package/dist/commands/views.js.map +1 -1
- package/dist/controllers/accounts.d.ts +5 -2
- package/dist/controllers/accounts.d.ts.map +1 -1
- package/dist/controllers/accounts.js +11 -8
- package/dist/controllers/accounts.js.map +1 -1
- package/dist/controllers/context.d.ts +2 -0
- package/dist/controllers/context.d.ts.map +1 -1
- package/dist/controllers/context.js.map +1 -1
- package/dist/controllers/feedback.d.ts +1 -1
- package/dist/controllers/feedback.d.ts.map +1 -1
- package/dist/controllers/feedback.js +4 -1
- package/dist/controllers/feedback.js.map +1 -1
- package/dist/controllers/input.d.ts.map +1 -1
- package/dist/controllers/input.js +2 -0
- package/dist/controllers/input.js.map +1 -1
- package/dist/controllers/jinion.d.ts +7 -0
- package/dist/controllers/jinion.d.ts.map +1 -1
- package/dist/controllers/jinion.js +7 -0
- package/dist/controllers/jinion.js.map +1 -1
- package/dist/controllers/mcp.d.ts +7 -2
- package/dist/controllers/mcp.d.ts.map +1 -1
- package/dist/controllers/mcp.js +23 -7
- package/dist/controllers/mcp.js.map +1 -1
- package/dist/controllers/session.d.ts.map +1 -1
- package/dist/controllers/session.js +4 -0
- package/dist/controllers/session.js.map +1 -1
- package/dist/conversation/activity.d.ts +5 -0
- package/dist/conversation/activity.d.ts.map +1 -0
- package/dist/conversation/activity.js +41 -0
- package/dist/conversation/activity.js.map +1 -0
- package/dist/conversation/apply-event.d.ts.map +1 -1
- package/dist/conversation/apply-event.js +2 -1
- package/dist/conversation/apply-event.js.map +1 -1
- package/dist/conversation/edits.d.ts +5 -0
- package/dist/conversation/edits.d.ts.map +1 -1
- package/dist/conversation/edits.js +10 -0
- package/dist/conversation/edits.js.map +1 -1
- package/dist/conversation/reducer.d.ts +9 -0
- package/dist/conversation/reducer.d.ts.map +1 -1
- package/dist/design/guides.d.ts +78 -5
- package/dist/design/guides.d.ts.map +1 -1
- package/dist/design/guides.js +78 -5
- package/dist/design/guides.js.map +1 -1
- package/dist/design/prompt.d.ts +1 -1
- package/dist/design/prompt.d.ts.map +1 -1
- package/dist/design/prompt.js +2 -2
- package/dist/design/prompt.js.map +1 -1
- package/dist/design/tools.d.ts +2 -0
- package/dist/design/tools.d.ts.map +1 -1
- package/dist/design/tools.js +6 -2
- package/dist/design/tools.js.map +1 -1
- package/dist/directions/directions.d.ts +42 -0
- package/dist/directions/directions.d.ts.map +1 -0
- package/dist/directions/directions.js +120 -0
- package/dist/directions/directions.js.map +1 -0
- package/dist/directions/store.d.ts +34 -0
- package/dist/directions/store.d.ts.map +1 -0
- package/dist/directions/store.js +61 -0
- package/dist/directions/store.js.map +1 -0
- package/dist/directions/tools.d.ts +29 -0
- package/dist/directions/tools.d.ts.map +1 -0
- package/dist/directions/tools.js +57 -0
- package/dist/directions/tools.js.map +1 -0
- package/dist/directions/viewer.d.ts +6 -0
- package/dist/directions/viewer.d.ts.map +1 -0
- package/dist/directions/viewer.js +266 -0
- package/dist/directions/viewer.js.map +1 -0
- package/dist/files/names.d.ts +6 -0
- package/dist/files/names.d.ts.map +1 -0
- package/dist/files/names.js +18 -0
- package/dist/files/names.js.map +1 -0
- package/dist/files/operations.d.ts +54 -0
- package/dist/files/operations.d.ts.map +1 -0
- package/dist/files/operations.js +173 -0
- package/dist/files/operations.js.map +1 -0
- package/dist/files/search.d.ts +11 -0
- package/dist/files/search.d.ts.map +1 -0
- package/dist/files/search.js +112 -0
- package/dist/files/search.js.map +1 -0
- package/dist/files/trash.d.ts +11 -0
- package/dist/files/trash.d.ts.map +1 -0
- package/dist/files/trash.js +64 -0
- package/dist/files/trash.js.map +1 -0
- package/dist/files/types.d.ts +112 -0
- package/dist/files/types.d.ts.map +1 -0
- package/dist/files/types.js +47 -0
- package/dist/files/types.js.map +1 -0
- package/dist/files/watch.d.ts +26 -0
- package/dist/files/watch.d.ts.map +1 -0
- package/dist/files/watch.js +107 -0
- package/dist/files/watch.js.map +1 -0
- package/dist/git/blame.d.ts +10 -0
- package/dist/git/blame.d.ts.map +1 -0
- package/dist/git/blame.js +91 -0
- package/dist/git/blame.js.map +1 -0
- package/dist/git/repos.d.ts +5 -0
- package/dist/git/repos.d.ts.map +1 -1
- package/dist/git/repos.js +13 -0
- package/dist/git/repos.js.map +1 -1
- package/dist/git/staging.d.ts +10 -1
- package/dist/git/staging.d.ts.map +1 -1
- package/dist/git/staging.js +21 -0
- package/dist/git/staging.js.map +1 -1
- package/dist/git/types.d.ts +48 -0
- package/dist/git/types.d.ts.map +1 -1
- package/dist/git/types.js +25 -0
- package/dist/git/types.js.map +1 -1
- package/dist/host.d.ts +2 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +8 -1
- package/dist/host.js.map +1 -1
- package/dist/lib/glob.d.ts +6 -0
- package/dist/lib/glob.d.ts.map +1 -0
- package/dist/lib/glob.js +49 -0
- package/dist/lib/glob.js.map +1 -0
- package/dist/lib/paths.d.ts +3 -0
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +9 -1
- package/dist/lib/paths.js.map +1 -1
- package/dist/look/tools.d.ts +7 -1
- package/dist/look/tools.d.ts.map +1 -1
- package/dist/look/tools.js +19 -4
- package/dist/look/tools.js.map +1 -1
- package/dist/lsp/code-intelligence.d.ts +87 -0
- package/dist/lsp/code-intelligence.d.ts.map +1 -0
- package/dist/lsp/code-intelligence.js +343 -0
- package/dist/lsp/code-intelligence.js.map +1 -0
- package/dist/lsp/edits.d.ts +4 -0
- package/dist/lsp/edits.d.ts.map +1 -0
- package/dist/lsp/edits.js +14 -0
- package/dist/lsp/edits.js.map +1 -0
- package/dist/lsp/project-check.d.ts +8 -0
- package/dist/lsp/project-check.d.ts.map +1 -0
- package/dist/lsp/project-check.js +71 -0
- package/dist/lsp/project-check.js.map +1 -0
- package/dist/lsp/results.d.ts +95 -0
- package/dist/lsp/results.d.ts.map +1 -0
- package/dist/lsp/results.js +116 -0
- package/dist/lsp/results.js.map +1 -0
- package/dist/lsp/server.d.ts +22 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +123 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/servers.d.ts +21 -0
- package/dist/lsp/servers.d.ts.map +1 -0
- package/dist/lsp/servers.js +57 -0
- package/dist/lsp/servers.js.map +1 -0
- package/dist/lsp/transport.d.ts +9 -0
- package/dist/lsp/transport.d.ts.map +1 -0
- package/dist/lsp/transport.js +64 -0
- package/dist/lsp/transport.js.map +1 -0
- package/dist/lsp/types.d.ts +262 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +64 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/map/prompt.d.ts.map +1 -1
- package/dist/map/prompt.js +2 -1
- package/dist/map/prompt.js.map +1 -1
- package/dist/map/review.d.ts +29 -9
- package/dist/map/review.d.ts.map +1 -1
- package/dist/map/review.js +105 -25
- package/dist/map/review.js.map +1 -1
- package/dist/mcp/login.d.ts +2 -0
- package/dist/mcp/login.d.ts.map +1 -1
- package/dist/mcp/login.js +5 -0
- package/dist/mcp/login.js.map +1 -1
- package/dist/preview/pages.d.ts +17 -0
- package/dist/preview/pages.d.ts.map +1 -0
- package/dist/preview/pages.js +92 -0
- package/dist/preview/pages.js.map +1 -0
- package/dist/preview/previews.d.ts +22 -0
- package/dist/preview/previews.d.ts.map +1 -0
- package/dist/preview/previews.js +28 -0
- package/dist/preview/previews.js.map +1 -0
- package/dist/preview/prompt.d.ts +3 -0
- package/dist/preview/prompt.d.ts.map +1 -0
- package/dist/preview/prompt.js +5 -0
- package/dist/preview/prompt.js.map +1 -0
- package/dist/preview/tools.d.ts +21 -0
- package/dist/preview/tools.d.ts.map +1 -0
- package/dist/preview/tools.js +34 -0
- package/dist/preview/tools.js.map +1 -0
- package/dist/preview/types.d.ts +7 -0
- package/dist/preview/types.d.ts.map +1 -1
- package/dist/preview/types.js +2 -0
- package/dist/preview/types.js.map +1 -1
- package/dist/prompt/files.d.ts +4 -1
- package/dist/prompt/files.d.ts.map +1 -1
- package/dist/prompt/files.js +23 -8
- package/dist/prompt/files.js.map +1 -1
- package/dist/skills/tools.d.ts +26 -0
- package/dist/skills/tools.d.ts.map +1 -0
- package/dist/skills/tools.js +34 -0
- package/dist/skills/tools.js.map +1 -0
- package/dist/state/session.d.ts +4 -0
- package/dist/state/session.d.ts.map +1 -1
- package/dist/state/session.js +1 -0
- package/dist/state/session.js.map +1 -1
- package/package.json +3 -1
- package/schema/api.json +3016 -45
- package/vendor/darwin-arm64/build.json +62 -0
- package/vendor/darwin-arm64/ffmpeg +0 -0
- package/vendor/darwin-arm64/ffprobe +0 -0
- package/vendor/darwin-arm64/licenses/README.md +13 -0
- package/vendor/darwin-arm64/licenses/ffmpeg-LGPL-2.1.txt +502 -0
- package/vendor/darwin-arm64/licenses/whisper.cpp-MIT.txt +21 -0
- package/vendor/darwin-arm64/voices.bin +0 -0
- package/vendor/darwin-arm64/whisper-cli +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { CompletionItem, Completions, FileDiagnostics, FileEdits, Hover, Location, Position, ServerState, SignatureHelp, TextEdit } from './types.js';
|
|
2
|
+
/** A server of a folder that started, ended or couldn't start. */
|
|
3
|
+
export interface ServerChange extends ServerState {
|
|
4
|
+
folder: string;
|
|
5
|
+
}
|
|
6
|
+
/** A change in what is known of a file's errors, for the folder it is in. */
|
|
7
|
+
export interface DiagnosticsChange extends FileDiagnostics {
|
|
8
|
+
folder: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The language servers of every folder Jinion's sessions work in, started the first time a file of theirs is opened:
|
|
12
|
+
* what clients open goes to them as they type, and what they find in it comes back. Paths are the folder's own, as the
|
|
13
|
+
* files API names them.
|
|
14
|
+
*/
|
|
15
|
+
export declare class CodeIntelligence {
|
|
16
|
+
private readonly servers;
|
|
17
|
+
private readonly documents;
|
|
18
|
+
/**
|
|
19
|
+
* What the servers found as files were typed, none included: the open files of a server that is asked, and every
|
|
20
|
+
* file a server that sends of itself spoke of. It wins over the last check of the project.
|
|
21
|
+
*/
|
|
22
|
+
private readonly live;
|
|
23
|
+
/** What the last check of the whole project found, by folder and then by file. */
|
|
24
|
+
private readonly checked;
|
|
25
|
+
/** The folders whose whole project is checked, as one used in Code mode is, and where their check stands. */
|
|
26
|
+
private readonly checks;
|
|
27
|
+
private readonly listeners;
|
|
28
|
+
/** How each server stands, by folder and name, once it was first started. */
|
|
29
|
+
private readonly states;
|
|
30
|
+
private readonly serverListeners;
|
|
31
|
+
private readonly pulls;
|
|
32
|
+
private readonly idle;
|
|
33
|
+
/** The documents each server was told are open. */
|
|
34
|
+
private readonly opened;
|
|
35
|
+
/** Whether a server shipped with Jinion reads the file, so opening it is worth anything. */
|
|
36
|
+
knows(path: string): boolean;
|
|
37
|
+
/** How the server that reads the file stands; none for a file no server shipped with Jinion reads. */
|
|
38
|
+
serverFor(folder: string, path: string): ServerState | undefined;
|
|
39
|
+
/** Starts the file's server again, as after it failed, with the documents open in it. */
|
|
40
|
+
restart(folder: string, path: string): Promise<void>;
|
|
41
|
+
onServer(listener: (change: ServerChange) => void): () => undefined;
|
|
42
|
+
open(folder: string, path: string, text: string): Promise<void>;
|
|
43
|
+
change(folder: string, path: string, text: string): Promise<void>;
|
|
44
|
+
close(folder: string, path: string): Promise<void>;
|
|
45
|
+
hover(folder: string, path: string, position: Position): Promise<Hover | null>;
|
|
46
|
+
definition(folder: string, path: string, position: Position): Promise<Location[]>;
|
|
47
|
+
references(folder: string, path: string, position: Position): Promise<Location[]>;
|
|
48
|
+
completion(folder: string, path: string, position: Position, trigger?: string): Promise<Completions>;
|
|
49
|
+
/** The item with what the server leaves out of the list until asked, such as its documentation. */
|
|
50
|
+
completionDetail(folder: string, path: string, item: CompletionItem): Promise<CompletionItem>;
|
|
51
|
+
signatureHelp(folder: string, path: string, position: Position): Promise<SignatureHelp | null>;
|
|
52
|
+
/**
|
|
53
|
+
* Renames what is at the position everywhere the server finds it. Files nobody has open are changed on disk here; the
|
|
54
|
+
* edits to the ones open come back, for the editor holding each to make, as unsaved changes there.
|
|
55
|
+
*/
|
|
56
|
+
rename(folder: string, path: string, position: Position, name: string): Promise<FileEdits[]>;
|
|
57
|
+
format(folder: string, path: string, options: {
|
|
58
|
+
tabSize: number;
|
|
59
|
+
insertSpaces: boolean;
|
|
60
|
+
}): Promise<TextEdit[]>;
|
|
61
|
+
/** Every error and warning known in the folder, by file; asking starts checking its whole project. */
|
|
62
|
+
problems(folder: string): FileDiagnostics[];
|
|
63
|
+
/** Checks the folder's whole project again soon, as after a save or a turn, when it is one being checked. */
|
|
64
|
+
recheck(folder: string, delay?: number): void;
|
|
65
|
+
onDiagnostics(listener: (change: DiagnosticsChange) => void): () => undefined;
|
|
66
|
+
closeAll(): Promise<void>;
|
|
67
|
+
private ask;
|
|
68
|
+
/** Tells the server of the document when it doesn't know it yet; true when it already did. */
|
|
69
|
+
private ensureOpen;
|
|
70
|
+
/** The document's server, started if it isn't; one that ended is started again, and given the documents open in it. */
|
|
71
|
+
private server;
|
|
72
|
+
private setState;
|
|
73
|
+
/** A server that answers `textDocument/diagnostic` sends no errors of itself, so they are asked for. */
|
|
74
|
+
private asksFor;
|
|
75
|
+
private pullLater;
|
|
76
|
+
private stopLater;
|
|
77
|
+
/** What a file shows: what a server found as it was typed, and otherwise the last check of the project. */
|
|
78
|
+
private shown;
|
|
79
|
+
/** `undefined` once nothing a server found holds for the file any more, as after it closes. */
|
|
80
|
+
private setLive;
|
|
81
|
+
private watch;
|
|
82
|
+
/** One check at a time per folder; one asked for while one runs follows it, with what changed meanwhile. */
|
|
83
|
+
private check;
|
|
84
|
+
/** Makes the change, then tells of each of the files whose errors look otherwise for it. */
|
|
85
|
+
private changing;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=code-intelligence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-intelligence.d.ts","sourceRoot":"","sources":["../../src/lsp/code-intelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, join } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { fromCompletionItem, pathOf, toCompletionItem, toCompletions, toDiagnostic, toFileEdits, toHover, toLocations, toSignatureHelp, toTextEdit, } from './results.js';
|
|
5
|
+
import { applyEdits } from './edits.js';
|
|
6
|
+
import { checkProject } from './project-check.js';
|
|
7
|
+
import { LanguageServer } from './server.js';
|
|
8
|
+
import { serverOf } from './servers.js';
|
|
9
|
+
import { errorMessage } from '../lib/errors.js';
|
|
10
|
+
// Long enough that typing doesn't ask for errors at every key, short enough that they show while one looks.
|
|
11
|
+
const DIAGNOSTICS_DELAY = 300;
|
|
12
|
+
// A server outlives its last document a while, so going back to a file doesn't start it again.
|
|
13
|
+
const IDLE = 60_000;
|
|
14
|
+
// Saves and turns that come close together are checked once, after the last.
|
|
15
|
+
const RECHECK_DELAY = 1000;
|
|
16
|
+
/**
|
|
17
|
+
* The language servers of every folder Jinion's sessions work in, started the first time a file of theirs is opened:
|
|
18
|
+
* what clients open goes to them as they type, and what they find in it comes back. Paths are the folder's own, as the
|
|
19
|
+
* files API names them.
|
|
20
|
+
*/
|
|
21
|
+
export class CodeIntelligence {
|
|
22
|
+
servers = new Map();
|
|
23
|
+
documents = new Map();
|
|
24
|
+
/**
|
|
25
|
+
* What the servers found as files were typed, none included: the open files of a server that is asked, and every
|
|
26
|
+
* file a server that sends of itself spoke of. It wins over the last check of the project.
|
|
27
|
+
*/
|
|
28
|
+
live = new Map();
|
|
29
|
+
/** What the last check of the whole project found, by folder and then by file. */
|
|
30
|
+
checked = new Map();
|
|
31
|
+
/** The folders whose whole project is checked, as one used in Code mode is, and where their check stands. */
|
|
32
|
+
checks = new Map();
|
|
33
|
+
listeners = new Set();
|
|
34
|
+
/** How each server stands, by folder and name, once it was first started. */
|
|
35
|
+
states = new Map();
|
|
36
|
+
serverListeners = new Set();
|
|
37
|
+
pulls = new Map();
|
|
38
|
+
idle = new Map();
|
|
39
|
+
/** The documents each server was told are open. */
|
|
40
|
+
opened = new WeakMap();
|
|
41
|
+
/** Whether a server shipped with Jinion reads the file, so opening it is worth anything. */
|
|
42
|
+
knows(path) {
|
|
43
|
+
return serverOf(path) !== undefined;
|
|
44
|
+
}
|
|
45
|
+
/** How the server that reads the file stands; none for a file no server shipped with Jinion reads. */
|
|
46
|
+
serverFor(folder, path) {
|
|
47
|
+
const language = serverOf(path);
|
|
48
|
+
if (!language)
|
|
49
|
+
return undefined;
|
|
50
|
+
return this.states.get(`${language.server}\n${folder}`) ?? { server: language.server, state: 'stopped' };
|
|
51
|
+
}
|
|
52
|
+
/** Starts the file's server again, as after it failed, with the documents open in it. */
|
|
53
|
+
async restart(folder, path) {
|
|
54
|
+
const document = this.documents.get(keyOf(folder, path));
|
|
55
|
+
if (!document)
|
|
56
|
+
return;
|
|
57
|
+
const server = await this.server(document);
|
|
58
|
+
this.ensureOpen(server, document);
|
|
59
|
+
}
|
|
60
|
+
onServer(listener) {
|
|
61
|
+
this.serverListeners.add(listener);
|
|
62
|
+
return () => void this.serverListeners.delete(listener);
|
|
63
|
+
}
|
|
64
|
+
async open(folder, path, text) {
|
|
65
|
+
const language = serverOf(path);
|
|
66
|
+
if (!language)
|
|
67
|
+
return;
|
|
68
|
+
this.watch(folder);
|
|
69
|
+
const key = keyOf(folder, path);
|
|
70
|
+
const known = this.documents.get(key);
|
|
71
|
+
if (known) {
|
|
72
|
+
known.holders += 1;
|
|
73
|
+
return this.change(folder, path, text);
|
|
74
|
+
}
|
|
75
|
+
const document = { folder, path, ...language, text, version: 1, holders: 1 };
|
|
76
|
+
this.documents.set(key, document);
|
|
77
|
+
clearTimeout(this.idle.get(serverKey(document)));
|
|
78
|
+
const server = await this.server(document);
|
|
79
|
+
this.ensureOpen(server, document);
|
|
80
|
+
this.pullLater(server);
|
|
81
|
+
}
|
|
82
|
+
async change(folder, path, text) {
|
|
83
|
+
const document = this.documents.get(keyOf(folder, path));
|
|
84
|
+
if (!document || document.text === text)
|
|
85
|
+
return;
|
|
86
|
+
document.text = text;
|
|
87
|
+
document.version += 1;
|
|
88
|
+
const server = await this.server(document);
|
|
89
|
+
// One that didn't know it yet, as one started again, is given the whole of it as it is now.
|
|
90
|
+
if (this.ensureOpen(server, document)) {
|
|
91
|
+
server.notify('textDocument/didChange', { textDocument: { uri: uriOf(document), version: document.version }, contentChanges: [{ text }] });
|
|
92
|
+
}
|
|
93
|
+
this.pullLater(server);
|
|
94
|
+
}
|
|
95
|
+
async close(folder, path) {
|
|
96
|
+
const key = keyOf(folder, path);
|
|
97
|
+
const document = this.documents.get(key);
|
|
98
|
+
if (!document || --document.holders > 0)
|
|
99
|
+
return;
|
|
100
|
+
this.documents.delete(key);
|
|
101
|
+
// Not started again only to be told a file closed, as after it ended.
|
|
102
|
+
const server = await this.servers.get(serverKey(document))?.catch(() => undefined);
|
|
103
|
+
if (server && this.opened.get(server)?.delete(key))
|
|
104
|
+
server.notify('textDocument/didClose', { textDocument: { uri: uriOf(document) } });
|
|
105
|
+
// A server that sends errors of itself keeps them for closed files too; those found by asking go with the file,
|
|
106
|
+
// and the last check of the project speaks for it again.
|
|
107
|
+
if (!server || this.asksFor(server))
|
|
108
|
+
this.setLive(folder, path, undefined);
|
|
109
|
+
if (![...this.documents.values()].some((each) => serverKey(each) === serverKey(document)))
|
|
110
|
+
this.stopLater(document);
|
|
111
|
+
}
|
|
112
|
+
async hover(folder, path, position) {
|
|
113
|
+
return toHover(await this.ask(folder, path, 'textDocument/hover', { position }));
|
|
114
|
+
}
|
|
115
|
+
async definition(folder, path, position) {
|
|
116
|
+
return toLocations(await this.ask(folder, path, 'textDocument/definition', { position }), folder);
|
|
117
|
+
}
|
|
118
|
+
async references(folder, path, position) {
|
|
119
|
+
return toLocations(await this.ask(folder, path, 'textDocument/references', { position, context: { includeDeclaration: true } }), folder);
|
|
120
|
+
}
|
|
121
|
+
async completion(folder, path, position, trigger) {
|
|
122
|
+
const context = trigger ? { triggerKind: 2, triggerCharacter: trigger } : { triggerKind: 1 };
|
|
123
|
+
return toCompletions(await this.ask(folder, path, 'textDocument/completion', { position, context }));
|
|
124
|
+
}
|
|
125
|
+
/** The item with what the server leaves out of the list until asked, such as its documentation. */
|
|
126
|
+
async completionDetail(folder, path, item) {
|
|
127
|
+
const document = this.documents.get(keyOf(folder, path));
|
|
128
|
+
if (!document)
|
|
129
|
+
return item;
|
|
130
|
+
const server = await this.server(document);
|
|
131
|
+
if (!server.capabilities.completionProvider?.resolveProvider)
|
|
132
|
+
return item;
|
|
133
|
+
const resolved = toCompletionItem(await server.request('completionItem/resolve', fromCompletionItem(item)));
|
|
134
|
+
return { ...item, detail: resolved.detail ?? item.detail, documentation: resolved.documentation ?? item.documentation, additionalEdits: resolved.additionalEdits ?? item.additionalEdits };
|
|
135
|
+
}
|
|
136
|
+
async signatureHelp(folder, path, position) {
|
|
137
|
+
return toSignatureHelp(await this.ask(folder, path, 'textDocument/signatureHelp', { position }));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Renames what is at the position everywhere the server finds it. Files nobody has open are changed on disk here; the
|
|
141
|
+
* edits to the ones open come back, for the editor holding each to make, as unsaved changes there.
|
|
142
|
+
*/
|
|
143
|
+
async rename(folder, path, position, name) {
|
|
144
|
+
const edits = toFileEdits(await this.ask(folder, path, 'textDocument/rename', { position, newName: name }), folder);
|
|
145
|
+
const open = edits.filter((file) => this.documents.has(keyOf(folder, file.path)));
|
|
146
|
+
await Promise.all(edits.filter((file) => !open.includes(file) && !isAbsolute(file.path)).map((file) => editOnDisk(join(folder, file.path), file.edits)));
|
|
147
|
+
return open;
|
|
148
|
+
}
|
|
149
|
+
async format(folder, path, options) {
|
|
150
|
+
const edits = await this.ask(folder, path, 'textDocument/formatting', { options });
|
|
151
|
+
return (edits ?? []).map(toTextEdit);
|
|
152
|
+
}
|
|
153
|
+
/** Every error and warning known in the folder, by file; asking starts checking its whole project. */
|
|
154
|
+
problems(folder) {
|
|
155
|
+
this.watch(folder);
|
|
156
|
+
const paths = new Set([...[...this.live.values()].filter((file) => file.folder === folder).map((file) => file.path), ...(this.checked.get(folder)?.keys() ?? [])]);
|
|
157
|
+
return [...paths].map((path) => ({ path, diagnostics: this.shown(folder, path) })).filter((file) => file.diagnostics.length > 0);
|
|
158
|
+
}
|
|
159
|
+
/** Checks the folder's whole project again soon, as after a save or a turn, when it is one being checked. */
|
|
160
|
+
recheck(folder, delay = RECHECK_DELAY) {
|
|
161
|
+
const check = this.checks.get(folder);
|
|
162
|
+
if (!check)
|
|
163
|
+
return;
|
|
164
|
+
clearTimeout(check.timer);
|
|
165
|
+
check.timer = setTimeout(() => void this.check(folder), delay);
|
|
166
|
+
}
|
|
167
|
+
onDiagnostics(listener) {
|
|
168
|
+
this.listeners.add(listener);
|
|
169
|
+
return () => void this.listeners.delete(listener);
|
|
170
|
+
}
|
|
171
|
+
async closeAll() {
|
|
172
|
+
for (const timer of [...this.pulls.values(), ...this.idle.values(), ...[...this.checks.values()].map((check) => check.timer)])
|
|
173
|
+
clearTimeout(timer);
|
|
174
|
+
this.checks.clear();
|
|
175
|
+
const servers = await Promise.all([...this.servers.values()].map((server) => server.catch(() => undefined)));
|
|
176
|
+
this.servers.clear();
|
|
177
|
+
this.documents.clear();
|
|
178
|
+
await Promise.all(servers.map((server) => server?.stop()));
|
|
179
|
+
}
|
|
180
|
+
async ask(folder, path, method, params) {
|
|
181
|
+
const document = this.documents.get(keyOf(folder, path));
|
|
182
|
+
if (!document)
|
|
183
|
+
return null;
|
|
184
|
+
const server = await this.server(document);
|
|
185
|
+
this.ensureOpen(server, document);
|
|
186
|
+
return server.request(method, { textDocument: { uri: uriOf(document) }, ...params });
|
|
187
|
+
}
|
|
188
|
+
/** Tells the server of the document when it doesn't know it yet; true when it already did. */
|
|
189
|
+
ensureOpen(server, document) {
|
|
190
|
+
const opened = this.opened.get(server) ?? new Set();
|
|
191
|
+
const key = keyOf(document.folder, document.path);
|
|
192
|
+
this.opened.set(server, opened);
|
|
193
|
+
if (opened.has(key))
|
|
194
|
+
return true;
|
|
195
|
+
opened.add(key);
|
|
196
|
+
server.notify('textDocument/didOpen', { textDocument: { uri: uriOf(document), languageId: document.language, version: document.version, text: document.text } });
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
/** The document's server, started if it isn't; one that ended is started again, and given the documents open in it. */
|
|
200
|
+
server(document) {
|
|
201
|
+
const key = serverKey(document);
|
|
202
|
+
const running = this.servers.get(key);
|
|
203
|
+
if (running)
|
|
204
|
+
return running;
|
|
205
|
+
const { server: name, folder } = document;
|
|
206
|
+
this.setState(key, folder, { server: name, state: 'starting' });
|
|
207
|
+
const starting = LanguageServer.start(name, folder).then((server) => {
|
|
208
|
+
server.on('textDocument/publishDiagnostics', ({ uri, diagnostics }) => {
|
|
209
|
+
const path = pathOf(uri, document.folder);
|
|
210
|
+
if (path)
|
|
211
|
+
this.setLive(document.folder, path, diagnostics.map(toDiagnostic));
|
|
212
|
+
});
|
|
213
|
+
server.onExit(() => {
|
|
214
|
+
if (this.servers.get(key) !== starting)
|
|
215
|
+
return;
|
|
216
|
+
this.servers.delete(key);
|
|
217
|
+
this.setState(key, folder, { server: name, state: 'stopped' });
|
|
218
|
+
});
|
|
219
|
+
// Documents opened while it started, and those of a server that ended, which it doesn't know yet.
|
|
220
|
+
for (const open of this.documents.values())
|
|
221
|
+
if (serverKey(open) === key)
|
|
222
|
+
this.ensureOpen(server, open);
|
|
223
|
+
this.setState(key, folder, { server: name, state: 'running' });
|
|
224
|
+
return server;
|
|
225
|
+
});
|
|
226
|
+
this.servers.set(key, starting);
|
|
227
|
+
starting.catch((error) => {
|
|
228
|
+
this.servers.delete(key);
|
|
229
|
+
this.setState(key, folder, { server: name, state: 'failed', error: errorMessage(error) });
|
|
230
|
+
});
|
|
231
|
+
return starting;
|
|
232
|
+
}
|
|
233
|
+
setState(key, folder, state) {
|
|
234
|
+
this.states.set(key, state);
|
|
235
|
+
for (const listener of this.serverListeners)
|
|
236
|
+
listener({ folder, ...state });
|
|
237
|
+
}
|
|
238
|
+
/** A server that answers `textDocument/diagnostic` sends no errors of itself, so they are asked for. */
|
|
239
|
+
asksFor(server) {
|
|
240
|
+
return server.capabilities.diagnosticProvider !== undefined;
|
|
241
|
+
}
|
|
242
|
+
// Every document open in the server, since an edit to one can bring errors into another that uses it.
|
|
243
|
+
pullLater(server) {
|
|
244
|
+
if (!this.asksFor(server))
|
|
245
|
+
return;
|
|
246
|
+
const key = `${server.name}\n${server.folder}`;
|
|
247
|
+
clearTimeout(this.pulls.get(key));
|
|
248
|
+
this.pulls.set(key, setTimeout(() => {
|
|
249
|
+
this.pulls.delete(key);
|
|
250
|
+
for (const document of this.documents.values()) {
|
|
251
|
+
if (serverKey(document) !== key)
|
|
252
|
+
continue;
|
|
253
|
+
const version = document.version;
|
|
254
|
+
server
|
|
255
|
+
.request('textDocument/diagnostic', { textDocument: { uri: uriOf(document) } })
|
|
256
|
+
.then((report) => {
|
|
257
|
+
if (report.kind === 'full' && document.version === version && this.documents.get(keyOf(document.folder, document.path)) === document) {
|
|
258
|
+
this.setLive(document.folder, document.path, (report.items ?? []).map(toDiagnostic));
|
|
259
|
+
}
|
|
260
|
+
})
|
|
261
|
+
.catch(() => { });
|
|
262
|
+
}
|
|
263
|
+
}, DIAGNOSTICS_DELAY));
|
|
264
|
+
}
|
|
265
|
+
stopLater(document) {
|
|
266
|
+
const key = serverKey(document);
|
|
267
|
+
clearTimeout(this.idle.get(key));
|
|
268
|
+
this.idle.set(key, setTimeout(() => {
|
|
269
|
+
this.idle.delete(key);
|
|
270
|
+
if ([...this.documents.values()].some((each) => serverKey(each) === key))
|
|
271
|
+
return;
|
|
272
|
+
const server = this.servers.get(key);
|
|
273
|
+
this.servers.delete(key);
|
|
274
|
+
if (server)
|
|
275
|
+
this.setState(key, document.folder, { server: document.server, state: 'stopped' });
|
|
276
|
+
void server?.then((running) => running.stop()).catch(() => { });
|
|
277
|
+
}, IDLE));
|
|
278
|
+
}
|
|
279
|
+
/** What a file shows: what a server found as it was typed, and otherwise the last check of the project. */
|
|
280
|
+
shown(folder, path) {
|
|
281
|
+
return this.live.get(keyOf(folder, path))?.diagnostics ?? this.checked.get(folder)?.get(path) ?? [];
|
|
282
|
+
}
|
|
283
|
+
/** `undefined` once nothing a server found holds for the file any more, as after it closes. */
|
|
284
|
+
setLive(folder, path, diagnostics) {
|
|
285
|
+
this.changing(folder, [path], () => {
|
|
286
|
+
if (diagnostics)
|
|
287
|
+
this.live.set(keyOf(folder, path), { folder, path, diagnostics });
|
|
288
|
+
else
|
|
289
|
+
this.live.delete(keyOf(folder, path));
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
watch(folder) {
|
|
293
|
+
if (this.checks.has(folder))
|
|
294
|
+
return;
|
|
295
|
+
this.checks.set(folder, {});
|
|
296
|
+
this.recheck(folder, 0);
|
|
297
|
+
}
|
|
298
|
+
/** One check at a time per folder; one asked for while one runs follows it, with what changed meanwhile. */
|
|
299
|
+
async check(folder) {
|
|
300
|
+
const check = this.checks.get(folder);
|
|
301
|
+
if (!check)
|
|
302
|
+
return;
|
|
303
|
+
if (check.running) {
|
|
304
|
+
check.again = true;
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
check.running = true;
|
|
308
|
+
const files = await checkProject(folder).catch(() => undefined);
|
|
309
|
+
check.running = false;
|
|
310
|
+
if (files && this.checks.get(folder) === check) {
|
|
311
|
+
const after = new Map(files.map((file) => [file.path, file.diagnostics]));
|
|
312
|
+
this.changing(folder, [...new Set([...(this.checked.get(folder)?.keys() ?? []), ...after.keys()])], () => this.checked.set(folder, after));
|
|
313
|
+
}
|
|
314
|
+
if (check.again) {
|
|
315
|
+
check.again = false;
|
|
316
|
+
void this.check(folder);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/** Makes the change, then tells of each of the files whose errors look otherwise for it. */
|
|
320
|
+
changing(folder, paths, change) {
|
|
321
|
+
const before = paths.map((path) => JSON.stringify(this.shown(folder, path)));
|
|
322
|
+
change();
|
|
323
|
+
paths.forEach((path, index) => {
|
|
324
|
+
const diagnostics = this.shown(folder, path);
|
|
325
|
+
if (JSON.stringify(diagnostics) !== before[index])
|
|
326
|
+
for (const listener of this.listeners)
|
|
327
|
+
listener({ folder, path, diagnostics });
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
function keyOf(folder, path) {
|
|
332
|
+
return `${folder}\n${path}`;
|
|
333
|
+
}
|
|
334
|
+
function serverKey(document) {
|
|
335
|
+
return `${document.server}\n${document.folder}`;
|
|
336
|
+
}
|
|
337
|
+
function uriOf(document) {
|
|
338
|
+
return pathToFileURL(join(document.folder, document.path)).href;
|
|
339
|
+
}
|
|
340
|
+
async function editOnDisk(file, edits) {
|
|
341
|
+
await writeFile(file, applyEdits(await readFile(file, 'utf8'), edits));
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=code-intelligence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-intelligence.js","sourceRoot":"","sources":["../../src/lsp/code-intelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TextEdit } from './types.js';
|
|
2
|
+
/** The text with the edits made, as a language server gives them: each range as the text was before any of them. */
|
|
3
|
+
export declare function applyEdits(text: string, edits: TextEdit[]): string;
|
|
4
|
+
//# sourceMappingURL=edits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edits.d.ts","sourceRoot":"","sources":["../../src/lsp/edits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,oHAAoH;AACpH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAczD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** The text with the edits made, as a language server gives them: each range as the text was before any of them. */
|
|
2
|
+
export function applyEdits(text, edits) {
|
|
3
|
+
const starts = [0];
|
|
4
|
+
for (let index = text.indexOf('\n'); index !== -1; index = text.indexOf('\n', index + 1))
|
|
5
|
+
starts.push(index + 1);
|
|
6
|
+
const offsetOf = ({ line, character }) => Math.min((starts[line] ?? text.length) + character, text.length);
|
|
7
|
+
// From the last, so the ranges of those before it still hold.
|
|
8
|
+
const sorted = [...edits].sort((a, b) => offsetOf(b.range.start) - offsetOf(a.range.start) || offsetOf(b.range.end) - offsetOf(a.range.end));
|
|
9
|
+
let result = text;
|
|
10
|
+
for (const edit of sorted)
|
|
11
|
+
result = result.slice(0, offsetOf(edit.range.start)) + edit.text + result.slice(offsetOf(edit.range.end));
|
|
12
|
+
return result;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=edits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edits.js","sourceRoot":"","sources":["../../src/lsp/edits.ts"],"names":[],"mappings":"AAEA,oHAAoH;AACpH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAiB;IACxD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnB,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAEjH,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAY,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAErH,8DAA8D;IAC9D,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7I,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,IAAI,IAAI,MAAM;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAErI,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FileDiagnostics } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Every TypeScript error in the folder, as its build would find them: TypeScript's own `tsc --noEmit` for each
|
|
4
|
+
* tsconfig in it. Where tsconfigs overlap, as a root one over its packages', a file's errors are taken from the nearest
|
|
5
|
+
* one, whose settings are the ones its package is built with, so none shows twice.
|
|
6
|
+
*/
|
|
7
|
+
export declare function checkProject(folder: string): Promise<FileDiagnostics[]>;
|
|
8
|
+
//# sourceMappingURL=project-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-check.d.ts","sourceRoot":"","sources":["../../src/lsp/project-check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,YAAY,CAAC;AAO9D;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAiC7E"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { realpath } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, normalize } from 'node:path';
|
|
4
|
+
import { listProjectFiles } from '../prompt/files.js';
|
|
5
|
+
import { commandFor } from './servers.js';
|
|
6
|
+
// Two at once: a monorepo has a tsconfig per package, and each check keeps a core busy.
|
|
7
|
+
const AT_ONCE = 2;
|
|
8
|
+
// Past this a check is taken as stuck, as on a project far too large; what it found is lost with it.
|
|
9
|
+
const TIMEOUT = 5 * 60_000;
|
|
10
|
+
/**
|
|
11
|
+
* Every TypeScript error in the folder, as its build would find them: TypeScript's own `tsc --noEmit` for each
|
|
12
|
+
* tsconfig in it. Where tsconfigs overlap, as a root one over its packages', a file's errors are taken from the nearest
|
|
13
|
+
* one, whose settings are the ones its package is built with, so none shows twice.
|
|
14
|
+
*/
|
|
15
|
+
export async function checkProject(folder) {
|
|
16
|
+
const configs = (await listProjectFiles(folder)).filter((path) => path === 'tsconfig.json' || path.endsWith('/tsconfig.json')).map(dirname);
|
|
17
|
+
if (configs.length === 0)
|
|
18
|
+
return [];
|
|
19
|
+
const { command } = await commandFor('typescript', folder);
|
|
20
|
+
// tsc names files from where it runs as the system resolves it, so a folder reached through a link, as macOS's /var
|
|
21
|
+
// is, would have them named from outside it.
|
|
22
|
+
const root = await realpath(folder);
|
|
23
|
+
const found = new Map();
|
|
24
|
+
const queue = [...configs];
|
|
25
|
+
const nearest = (path) => configs.filter((config) => config === '.' || path.startsWith(`${config}/`)).sort((a, b) => b.length - a.length)[0];
|
|
26
|
+
const next = async () => {
|
|
27
|
+
const config = queue.shift();
|
|
28
|
+
if (config === undefined)
|
|
29
|
+
return;
|
|
30
|
+
const output = await run(command, ['-p', join(root, config), '--noEmit', '--pretty', 'false'], root);
|
|
31
|
+
for (const { path, diagnostic } of parse(output)) {
|
|
32
|
+
if (path.startsWith('..') || nearest(path) !== config)
|
|
33
|
+
continue;
|
|
34
|
+
const known = found.get(path) ?? [];
|
|
35
|
+
if (!known.some((each) => each.message === diagnostic.message && each.range.start.line === diagnostic.range.start.line))
|
|
36
|
+
found.set(path, [...known, diagnostic]);
|
|
37
|
+
}
|
|
38
|
+
return next();
|
|
39
|
+
};
|
|
40
|
+
await Promise.all(Array.from({ length: Math.min(AT_ONCE, configs.length) }, next));
|
|
41
|
+
return [...found].map(([path, diagnostics]) => ({ path, diagnostics }));
|
|
42
|
+
}
|
|
43
|
+
/** What tsc prints, whether it found errors or not; it exits with 1 or 2 when it did. */
|
|
44
|
+
function run(command, args, cwd) {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
execFile(command, args, { cwd, timeout: TIMEOUT, maxBuffer: 64 * 1024 * 1024 }, (_error, stdout) => resolve(stdout ?? ''));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* `src/a.ts(3,7): error TS2322: Type …`, with a message's further lines indented under it. tsc names the place it
|
|
51
|
+
* starts, so a diagnostic here covers the character there; the language server marks the whole once the file is open.
|
|
52
|
+
*/
|
|
53
|
+
function parse(output) {
|
|
54
|
+
const found = [];
|
|
55
|
+
for (const line of output.split('\n')) {
|
|
56
|
+
const match = /^(.+?)\((\d+),(\d+)\): (error|warning) TS(\d+): (.*)$/.exec(line);
|
|
57
|
+
if (match) {
|
|
58
|
+
const [, file, row, column, severity, code, message] = match;
|
|
59
|
+
const start = { line: Number(row) - 1, character: Number(column) - 1 };
|
|
60
|
+
found.push({
|
|
61
|
+
path: normalize(file),
|
|
62
|
+
diagnostic: { range: { start, end: { ...start, character: start.character + 1 } }, severity: severity === 'error' ? 'error' : 'warning', message: message, source: 'ts', code: code },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else if (line.startsWith(' ') && found.length > 0) {
|
|
66
|
+
found.at(-1).diagnostic.message += `\n${line.trim()}`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return found;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=project-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-check.js","sourceRoot":"","sources":["../../src/lsp/project-check.ts"],"names":[],"mappings":"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"}
|