@aws/lsp-codewhisperer 0.0.34 → 0.0.36

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.
Files changed (103) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/out/client/token/bearer-token-service.json +91 -225
  3. package/out/language-server/agenticChat/agenticChatController.js +82 -29
  4. package/out/language-server/agenticChat/agenticChatController.js.map +1 -1
  5. package/out/language-server/agenticChat/agenticChatResultStream.js +3 -0
  6. package/out/language-server/agenticChat/agenticChatResultStream.js.map +1 -1
  7. package/out/language-server/agenticChat/constants.d.ts +3 -0
  8. package/out/language-server/agenticChat/constants.js +4 -1
  9. package/out/language-server/agenticChat/constants.js.map +1 -1
  10. package/out/language-server/agenticChat/context/agenticChatTriggerContext.d.ts +3 -8
  11. package/out/language-server/agenticChat/context/agenticChatTriggerContext.js +9 -2
  12. package/out/language-server/agenticChat/context/agenticChatTriggerContext.js.map +1 -1
  13. package/out/language-server/agenticChat/context/contextUtils.d.ts +20 -0
  14. package/out/language-server/agenticChat/context/contextUtils.js +107 -0
  15. package/out/language-server/agenticChat/context/contextUtils.js.map +1 -1
  16. package/out/language-server/agenticChat/errors.d.ts +2 -1
  17. package/out/language-server/agenticChat/errors.js +4 -1
  18. package/out/language-server/agenticChat/errors.js.map +1 -1
  19. package/out/language-server/agenticChat/tabBarController.js +1 -1
  20. package/out/language-server/agenticChat/tabBarController.js.map +1 -1
  21. package/out/language-server/agenticChat/tools/chatDb/chatDb.js +3 -2
  22. package/out/language-server/agenticChat/tools/chatDb/chatDb.js.map +1 -1
  23. package/out/language-server/agenticChat/tools/fileSearch.js +1 -1
  24. package/out/language-server/agenticChat/tools/fileSearch.js.map +1 -1
  25. package/out/language-server/agenticChat/tools/listDirectory.js +5 -5
  26. package/out/language-server/agenticChat/tools/listDirectory.js.map +1 -1
  27. package/out/language-server/chat/chatController.js +1 -1
  28. package/out/language-server/chat/chatController.js.map +1 -1
  29. package/out/language-server/chat/chatSessionService.d.ts +5 -0
  30. package/out/language-server/chat/chatSessionService.js +4 -1
  31. package/out/language-server/chat/chatSessionService.js.map +1 -1
  32. package/out/language-server/chat/constants.d.ts +3 -1
  33. package/out/language-server/chat/constants.js +15 -2
  34. package/out/language-server/chat/constants.js.map +1 -1
  35. package/out/language-server/chat/contexts/triggerContext.d.ts +3 -1
  36. package/out/language-server/chat/contexts/triggerContext.js +14 -1
  37. package/out/language-server/chat/contexts/triggerContext.js.map +1 -1
  38. package/out/language-server/configuration/qConfigurationServer.d.ts +8 -1
  39. package/out/language-server/configuration/qConfigurationServer.js +107 -8
  40. package/out/language-server/configuration/qConfigurationServer.js.map +1 -1
  41. package/out/language-server/inline-completion/codeWhispererServer.js +15 -2
  42. package/out/language-server/inline-completion/codeWhispererServer.js.map +1 -1
  43. package/out/language-server/netTransform/resources/SupportedProjects.js +1 -7
  44. package/out/language-server/netTransform/resources/SupportedProjects.js.map +1 -1
  45. package/out/language-server/workspaceContext/artifactManager.d.ts +44 -0
  46. package/out/language-server/workspaceContext/artifactManager.js +496 -0
  47. package/out/language-server/workspaceContext/artifactManager.js.map +1 -0
  48. package/out/language-server/workspaceContext/client.d.ts +23 -0
  49. package/out/language-server/workspaceContext/client.js +172 -0
  50. package/out/language-server/workspaceContext/client.js.map +1 -0
  51. package/out/language-server/workspaceContext/dependency/dependencyDiscoverer.d.ts +15 -0
  52. package/out/language-server/workspaceContext/dependency/dependencyDiscoverer.js +129 -0
  53. package/out/language-server/workspaceContext/dependency/dependencyDiscoverer.js.map +1 -0
  54. package/out/language-server/workspaceContext/dependency/dependencyHandler/JSTSDependencyHandler.d.ts +18 -0
  55. package/out/language-server/workspaceContext/dependency/dependencyHandler/JSTSDependencyHandler.js +204 -0
  56. package/out/language-server/workspaceContext/dependency/dependencyHandler/JSTSDependencyHandler.js.map +1 -0
  57. package/out/language-server/workspaceContext/dependency/dependencyHandler/JavaDependencyHandler.d.ts +16 -0
  58. package/out/language-server/workspaceContext/dependency/dependencyHandler/JavaDependencyHandler.js +160 -0
  59. package/out/language-server/workspaceContext/dependency/dependencyHandler/JavaDependencyHandler.js.map +1 -0
  60. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandler.d.ts +78 -0
  61. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandler.js +255 -0
  62. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandler.js.map +1 -0
  63. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandlerFactory.d.ts +7 -0
  64. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandlerFactory.js +23 -0
  65. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandlerFactory.js.map +1 -0
  66. package/out/language-server/workspaceContext/dependency/dependencyHandler/PythonDependencyHandler.d.ts +46 -0
  67. package/out/language-server/workspaceContext/dependency/dependencyHandler/PythonDependencyHandler.js +233 -0
  68. package/out/language-server/workspaceContext/dependency/dependencyHandler/PythonDependencyHandler.js.map +1 -0
  69. package/out/language-server/workspaceContext/javaManager.d.ts +92 -0
  70. package/out/language-server/workspaceContext/javaManager.js +710 -0
  71. package/out/language-server/workspaceContext/javaManager.js.map +1 -0
  72. package/out/language-server/workspaceContext/util.d.ts +10 -0
  73. package/out/language-server/workspaceContext/util.js +72 -0
  74. package/out/language-server/workspaceContext/util.js.map +1 -0
  75. package/out/language-server/workspaceContext/workspaceContextServer.d.ts +2 -0
  76. package/out/language-server/workspaceContext/workspaceContextServer.js +414 -0
  77. package/out/language-server/workspaceContext/workspaceContextServer.js.map +1 -0
  78. package/out/language-server/workspaceContext/workspaceFolderManager.d.ts +113 -0
  79. package/out/language-server/workspaceContext/workspaceFolderManager.js +827 -0
  80. package/out/language-server/workspaceContext/workspaceFolderManager.js.map +1 -0
  81. package/out/shared/amazonQServiceManager/qDeveloperProfiles.js.map +1 -1
  82. package/out/shared/codeWhispererService.d.ts +13 -0
  83. package/out/shared/codeWhispererService.js +24 -0
  84. package/out/shared/codeWhispererService.js.map +1 -1
  85. package/out/shared/languageDetection.d.ts +27 -0
  86. package/out/shared/languageDetection.js +44 -1
  87. package/out/shared/languageDetection.js.map +1 -1
  88. package/out/shared/localProjectContextController.d.ts +1 -0
  89. package/out/shared/localProjectContextController.js +7 -9
  90. package/out/shared/localProjectContextController.js.map +1 -1
  91. package/out/shared/proxy-server.d.ts +1 -0
  92. package/out/shared/proxy-server.js +3 -1
  93. package/out/shared/proxy-server.js.map +1 -1
  94. package/out/shared/supplementalContextUtil/crossFileContextUtil.d.ts +4 -3
  95. package/out/shared/supplementalContextUtil/crossFileContextUtil.js +16 -5
  96. package/out/shared/supplementalContextUtil/crossFileContextUtil.js.map +1 -1
  97. package/out/shared/supplementalContextUtil/supplementalContextUtil.d.ts +2 -1
  98. package/out/shared/supplementalContextUtil/supplementalContextUtil.js +2 -2
  99. package/out/shared/supplementalContextUtil/supplementalContextUtil.js.map +1 -1
  100. package/out/shared/utils.d.ts +1 -0
  101. package/out/shared/utils.js +15 -1
  102. package/out/shared/utils.js.map +1 -1
  103. package/package.json +9 -3
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebSocketClient = void 0;
4
+ const ws_1 = require("ws");
5
+ class WebSocketClient {
6
+ ws = null;
7
+ logging;
8
+ credentialsProvider;
9
+ url;
10
+ reconnectAttempts = 0;
11
+ maxReconnectAttempts = 5;
12
+ messageQueue = [];
13
+ messageThrottleDelay = 100;
14
+ constructor(url, logging, credentialsProvider) {
15
+ this.url = url;
16
+ this.logging = logging;
17
+ this.credentialsProvider = credentialsProvider;
18
+ this.connect();
19
+ }
20
+ connect() {
21
+ try {
22
+ const creds = this.credentialsProvider.getCredentials('bearer');
23
+ if (!creds?.token) {
24
+ throw new Error('Authorization failed, bearer token is not set');
25
+ }
26
+ this.ws = new ws_1.WebSocket(this.url, {
27
+ headers: { Authorization: `Bearer ${creds.token}` },
28
+ });
29
+ this.attachEventListeners();
30
+ }
31
+ catch (error) {
32
+ this.logging.error(`WebSocket connection error: ${error}`);
33
+ this.handleDisconnect();
34
+ }
35
+ }
36
+ attachEventListeners() {
37
+ if (!this.ws)
38
+ return;
39
+ this.ws.on('open', () => {
40
+ this.logging.log(`Connected to server ${this.url}`);
41
+ this.reconnectAttempts = 0;
42
+ this.flushMessageQueue();
43
+ });
44
+ this.ws.on('message', (data) => {
45
+ data = data.toString();
46
+ this.logging.log(`Received message: ${data}`);
47
+ });
48
+ this.ws.onclose = event => {
49
+ this.logging.log(`WebSocket connection closed with code: ${event.code} reason: ${event.reason}`);
50
+ if (!event.wasClean) {
51
+ this.handleDisconnect();
52
+ }
53
+ };
54
+ this.ws.on('error', error => {
55
+ this.logging.error(`WebSocket error: ${error}`);
56
+ });
57
+ this.ws.on('unexpected-response', (_req, res) => {
58
+ this.logging.warn(`Unexpected response: ${JSON.stringify({
59
+ statusCode: res.statusCode,
60
+ statusMessage: res.statusMessage,
61
+ headers: res.headers,
62
+ })}`);
63
+ });
64
+ }
65
+ handleDisconnect() {
66
+ if (this.ws) {
67
+ this.ws.close();
68
+ this.ws = null;
69
+ }
70
+ // Apply exponential backoff for both unclean closures and failed reconnection attempts
71
+ if (this.reconnectAttempts < this.maxReconnectAttempts) {
72
+ this.reconnectAttempts++;
73
+ const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30000);
74
+ this.logging.log(`WebSocket will attempt reconnection ${this.reconnectAttempts}/${this.maxReconnectAttempts} in ${delay}s`);
75
+ setTimeout(() => {
76
+ this.connect();
77
+ }, delay);
78
+ }
79
+ else {
80
+ this.logging.warn('Maximum WebSocket reconnection attempts reached');
81
+ }
82
+ }
83
+ flushMessageQueue() {
84
+ if (this.messageQueue.length <= 0) {
85
+ return;
86
+ }
87
+ this.logging.log(`Flushing ${this.messageQueue.length} queued events through WebSocket`);
88
+ while (this.messageQueue.length > 0) {
89
+ const message = this.messageQueue.shift();
90
+ if (message) {
91
+ this.send(message).catch(error => this.logging.error(`Error sending message: ${error}`));
92
+ }
93
+ }
94
+ }
95
+ queueMessage(message) {
96
+ // Make sure that didChangeWorkspaceFolders messages go to the front of the queue
97
+ if (message.includes(`workspace/didChangeWorkspaceFolders`)) {
98
+ this.messageQueue.unshift(message);
99
+ }
100
+ else {
101
+ this.messageQueue.push(message);
102
+ }
103
+ this.logging.log(`WebSocket message queued until connection is ready, queue size: ${this.messageQueue.length}`);
104
+ }
105
+ isConnected() {
106
+ return this.ws?.readyState === ws_1.WebSocket.OPEN;
107
+ }
108
+ getWebsocketReadyState() {
109
+ if (!this.ws)
110
+ return 'CLOSED';
111
+ switch (this.ws.readyState) {
112
+ case ws_1.WebSocket.CONNECTING:
113
+ return 'CONNECTING';
114
+ case ws_1.WebSocket.OPEN:
115
+ return 'OPEN';
116
+ case ws_1.WebSocket.CLOSING:
117
+ return 'CLOSING';
118
+ case ws_1.WebSocket.CLOSED:
119
+ return 'CLOSED';
120
+ default:
121
+ return 'CLOSED';
122
+ }
123
+ }
124
+ // https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications#sending_data_to_the_server
125
+ // TODO, the approach of delaying websocket messages should be investigated and validated
126
+ // The current approach could be susceptible to race conditions that might result in out of order events
127
+ // Consider this scenario
128
+ // wsClient.send("message1"); // needs throttling, will wait 100ms
129
+ // wsClient.send("message2"); // runs immediately without waiting
130
+ // What actually happens:
131
+ // - Both calls start executing simultaneously
132
+ // - Both check timeSinceLastMessage at nearly the same time
133
+ // - Both might determine they need to wait
134
+ // - They could end up sending in unpredictable order
135
+ // It might be better to keep an active queue in the client and expose enqueueMessage instead of send
136
+ async send(message) {
137
+ if (this.ws?.readyState === ws_1.WebSocket.OPEN) {
138
+ await new Promise(resolve => setTimeout(resolve, this.messageThrottleDelay));
139
+ this.ws.send(message);
140
+ }
141
+ else {
142
+ this.queueMessage(message);
143
+ }
144
+ }
145
+ disconnect() {
146
+ if (this.ws) {
147
+ this.ws.close();
148
+ this.ws = null;
149
+ }
150
+ }
151
+ destroyClient() {
152
+ // Clear the message queue
153
+ this.messageQueue = [];
154
+ // Prevent any further reconnection attempts
155
+ this.reconnectAttempts = this.maxReconnectAttempts;
156
+ if (this.ws) {
157
+ this.ws.close();
158
+ // Allow the close event to be processed before removing listeners
159
+ setTimeout(() => {
160
+ if (this.ws) {
161
+ this.ws.removeAllListeners();
162
+ }
163
+ }, 1000);
164
+ // Terminate the connection
165
+ this.ws.terminate();
166
+ this.ws = null;
167
+ }
168
+ this.logging.log('WebSocket client destroyed');
169
+ }
170
+ }
171
+ exports.WebSocketClient = WebSocketClient;
172
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/language-server/workspaceContext/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Logging, Workspace, WorkspaceFolder } from '@aws/language-server-runtimes/server-interface';
2
+ import { BaseDependencyInfo, LanguageDependencyHandler } from './dependencyHandler/LanguageDependencyHandler';
3
+ import { ArtifactManager } from '../artifactManager';
4
+ export declare class DependencyDiscoverer {
5
+ private logging;
6
+ private workspaceFolders;
7
+ dependencyHandlerRegistry: LanguageDependencyHandler<BaseDependencyInfo>[];
8
+ private initializedWorkspaceFolder;
9
+ constructor(workspace: Workspace, logging: Logging, workspaceFolders: WorkspaceFolder[], artifactManager: ArtifactManager);
10
+ private shouldExcludeDirectory;
11
+ searchDependencies(folders: WorkspaceFolder[]): Promise<void>;
12
+ handleDependencyUpdateFromLSP(language: string, paths: string[], workspaceRoot?: WorkspaceFolder): Promise<void>;
13
+ dispose(): void;
14
+ disposeWorkspaceFolder(workspaceFolder: WorkspaceFolder): void;
15
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DependencyDiscoverer = void 0;
4
+ const path = require("path");
5
+ const fs = require("fs");
6
+ const vscode_uri_1 = require("vscode-uri");
7
+ const LanguageDependencyHandlerFactory_1 = require("./dependencyHandler/LanguageDependencyHandlerFactory");
8
+ const languageDetection_1 = require("../../../shared/languageDetection");
9
+ class DependencyDiscoverer {
10
+ logging;
11
+ workspaceFolders;
12
+ dependencyHandlerRegistry = [];
13
+ initializedWorkspaceFolder = new Map();
14
+ constructor(workspace, logging, workspaceFolders, artifactManager) {
15
+ this.workspaceFolders = workspaceFolders;
16
+ this.logging = logging;
17
+ let jstsHandlerCreated = false;
18
+ languageDetection_1.supportedWorkspaceContextLanguages.forEach(language => {
19
+ const handler = LanguageDependencyHandlerFactory_1.DependencyHandlerFactory.createHandler(language, workspace, logging, workspaceFolders, artifactManager);
20
+ if (handler) {
21
+ // Share handler for javascript and typescript
22
+ if (language === 'javascript' || language === 'typescript') {
23
+ if (!jstsHandlerCreated) {
24
+ this.dependencyHandlerRegistry.push(handler);
25
+ jstsHandlerCreated = true;
26
+ }
27
+ }
28
+ else {
29
+ this.dependencyHandlerRegistry.push(handler);
30
+ }
31
+ }
32
+ });
33
+ }
34
+ shouldExcludeDirectory(dir) {
35
+ const EXCLUDE_PATTERNS = [
36
+ /^\./,
37
+ /^node_modules$/,
38
+ /^dist$/,
39
+ /^build$/,
40
+ /^test$/,
41
+ /^bin$/,
42
+ /^out$/,
43
+ /^logs$/,
44
+ /^env$/,
45
+ ];
46
+ return EXCLUDE_PATTERNS.some(pattern => pattern.test(dir));
47
+ }
48
+ async searchDependencies(folders) {
49
+ this.logging.log('Starting dependency search across workspace folders');
50
+ for (const workspaceFolder of folders) {
51
+ if (this.initializedWorkspaceFolder.has(workspaceFolder) &&
52
+ this.initializedWorkspaceFolder.get(workspaceFolder)) {
53
+ this.logging.log(`Skipping already initialized workspace folder: ${workspaceFolder.uri}`);
54
+ continue;
55
+ }
56
+ this.initializedWorkspaceFolder.set(workspaceFolder, true);
57
+ const workspaceFolderPath = vscode_uri_1.URI.parse(workspaceFolder.uri).path;
58
+ const queue = [{ dir: workspaceFolderPath, depth: 0 }];
59
+ while (queue.length > 0) {
60
+ const { dir: currentDir, depth } = queue.shift();
61
+ let foundDependencyInCurrentDir = false;
62
+ for (const dependencyHandler of this.dependencyHandlerRegistry) {
63
+ if (dependencyHandler.discover(currentDir, workspaceFolder)) {
64
+ foundDependencyInCurrentDir = true;
65
+ this.logging.log(`Found ${dependencyHandler.language} dependency in ${currentDir}`);
66
+ break;
67
+ }
68
+ }
69
+ // Skip the rest search in the current dir.
70
+ if (foundDependencyInCurrentDir) {
71
+ continue;
72
+ }
73
+ try {
74
+ // Check if currentDir is a symlink first
75
+ const dirStats = await fs.promises.lstat(currentDir);
76
+ if (dirStats.isSymbolicLink()) {
77
+ continue;
78
+ }
79
+ // Add sub directories to queue for later processing
80
+ const items = fs.readdirSync(currentDir);
81
+ for (const item of items) {
82
+ const itemPath = path.join(currentDir, item);
83
+ const stats = await fs.promises.lstat(itemPath); // Use lstat instead of stat to detect symlinks
84
+ // Skip if it's a symlink
85
+ if (stats.isSymbolicLink()) {
86
+ continue;
87
+ }
88
+ // Skip if it's not a directory or matches exclude patterns
89
+ if (!stats.isDirectory() || this.shouldExcludeDirectory(item)) {
90
+ continue;
91
+ }
92
+ queue.push({ dir: itemPath, depth: depth + 1 });
93
+ }
94
+ }
95
+ catch (error) {
96
+ this.logging.warn(`Error searching dependency under directory ${currentDir}: ${error.message}`);
97
+ }
98
+ }
99
+ }
100
+ for (const dependencyHandler of this.dependencyHandlerRegistry) {
101
+ dependencyHandler.initiateDependencyMap(folders);
102
+ dependencyHandler.setupWatchers(folders);
103
+ await dependencyHandler.zipDependencyMap(folders);
104
+ }
105
+ this.logging.log(`Dependency search completed successfully`);
106
+ }
107
+ async handleDependencyUpdateFromLSP(language, paths, workspaceRoot) {
108
+ for (const dependencyHandler of this.dependencyHandlerRegistry) {
109
+ if (dependencyHandler.language != language) {
110
+ continue;
111
+ }
112
+ await dependencyHandler.updateDependencyMapBasedOnLSP(paths, workspaceRoot);
113
+ }
114
+ }
115
+ dispose() {
116
+ this.initializedWorkspaceFolder.clear();
117
+ this.dependencyHandlerRegistry.forEach(dependencyHandler => {
118
+ dependencyHandler.dispose();
119
+ });
120
+ }
121
+ disposeWorkspaceFolder(workspaceFolder) {
122
+ this.initializedWorkspaceFolder.delete(workspaceFolder);
123
+ this.dependencyHandlerRegistry.forEach(dependencyHandler => {
124
+ dependencyHandler.disposeWorkspaceFolder(workspaceFolder);
125
+ });
126
+ }
127
+ }
128
+ exports.DependencyDiscoverer = DependencyDiscoverer;
129
+ //# sourceMappingURL=dependencyDiscoverer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyDiscoverer.js","sourceRoot":"","sources":["../../../../src/language-server/workspaceContext/dependency/dependencyDiscoverer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { BaseDependencyInfo, Dependency, LanguageDependencyHandler } from './LanguageDependencyHandler';
2
+ import { WorkspaceFolder } from '@aws/language-server-runtimes/server-interface';
3
+ interface JSTSDependencyInfo extends BaseDependencyInfo {
4
+ packageJsonPath: string;
5
+ nodeModulesPath: string;
6
+ }
7
+ export declare class JSTSDependencyHandler extends LanguageDependencyHandler<JSTSDependencyInfo> {
8
+ private jstsDependencyInfos;
9
+ discover(currentDir: string, workspaceFolder: WorkspaceFolder): boolean;
10
+ initiateDependencyMap(folders: WorkspaceFolder[]): void;
11
+ generateDependencyMap(jstsDependencyInfo: JSTSDependencyInfo): Map<string, Dependency>;
12
+ setupWatchers(folders: WorkspaceFolder[]): void;
13
+ updateDependencyMapBasedOnLSP(paths: string[], workspaceFolder?: WorkspaceFolder): Promise<void>;
14
+ transformPathToDependency(dependencyName: string, dependencyPath: string, dependencyMap: Map<string, Dependency>): void;
15
+ disposeWatchers(workspaceFolder: WorkspaceFolder): void;
16
+ disposeDependencyInfo(workspaceFolder: WorkspaceFolder): void;
17
+ }
18
+ export {};
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JSTSDependencyHandler = void 0;
4
+ const LanguageDependencyHandler_1 = require("./LanguageDependencyHandler");
5
+ const path = require("path");
6
+ const fs = require("fs");
7
+ /*
8
+ * JSTS Dependency Handler
9
+ *
10
+ * This handler depends on package.json and /node_modules to discover dependency locations
11
+ */
12
+ class JSTSDependencyHandler extends LanguageDependencyHandler_1.LanguageDependencyHandler {
13
+ jstsDependencyInfos = [];
14
+ /*
15
+ * It will return a boolean indicating whether it finds any dependency info.
16
+ * The JSTSDependencyInfo object contains the following properties:
17
+ * - pkgDir: the package directory
18
+ * - packageJsonPath: the path to the package.json file
19
+ * - nodeModulesPath: the path to /node_modules directory
20
+ */
21
+ discover(currentDir, workspaceFolder) {
22
+ let result = null;
23
+ const packageJsonPath = path.join(currentDir, 'package.json');
24
+ const nodeModulesPath = path.join(currentDir, 'node_modules');
25
+ if (fs.existsSync(packageJsonPath) &&
26
+ fs.existsSync(nodeModulesPath) &&
27
+ fs.statSync(nodeModulesPath).isDirectory()) {
28
+ this.logging.log(`Found package.json and node_modules in ${currentDir}`);
29
+ result = {
30
+ pkgDir: currentDir,
31
+ packageJsonPath: packageJsonPath,
32
+ nodeModulesPath: nodeModulesPath,
33
+ workspaceFolder: workspaceFolder,
34
+ };
35
+ this.jstsDependencyInfos.push(result);
36
+ }
37
+ return result !== null;
38
+ }
39
+ /*
40
+ * It will create a dependency map from the package.json file and node_modules
41
+ * The dependency map will contain the following properties:
42
+ * - name: the name of the dependency
43
+ * - version: the version of the dependency
44
+ * - path: the path to the dependency
45
+ */
46
+ initiateDependencyMap(folders) {
47
+ // Filter out the jstsDependencyInfos that are in the folders
48
+ const jstsDependencyInfoToBeInitiated = this.jstsDependencyInfos.filter(jstsDependencyInfo => {
49
+ return folders.includes(jstsDependencyInfo.workspaceFolder);
50
+ });
51
+ jstsDependencyInfoToBeInitiated.forEach(jstsDependencyInfo => {
52
+ // TODO, check if try catch is necessary here
53
+ try {
54
+ let generatedDependencyMap = this.generateDependencyMap(jstsDependencyInfo);
55
+ // If the dependency map doesn't exist, create a new one
56
+ if (!this.dependencyMap.has(jstsDependencyInfo.workspaceFolder)) {
57
+ this.dependencyMap.set(jstsDependencyInfo.workspaceFolder, new Map());
58
+ }
59
+ generatedDependencyMap.forEach((dep, name) => {
60
+ this.dependencyMap.get(jstsDependencyInfo.workspaceFolder)?.set(name, dep);
61
+ });
62
+ // Log found dependencies
63
+ this.logging.log(`Total Javascript/Typescript dependencies found: ${generatedDependencyMap.size} under ${jstsDependencyInfo.pkgDir}`);
64
+ }
65
+ catch (error) {
66
+ this.logging.warn(`Error parsing dependencies: ${error}`);
67
+ }
68
+ });
69
+ }
70
+ /*
71
+ * First, it will record dependencies with version under node_modules based on package.json
72
+ * Then, it will also record dependencies with version under node_modules which are not declared in package.json
73
+ */
74
+ generateDependencyMap(jstsDependencyInfo) {
75
+ const dependencyMap = new Map();
76
+ let packageJsonPath = jstsDependencyInfo.packageJsonPath;
77
+ let nodeModulesPath = jstsDependencyInfo.nodeModulesPath;
78
+ // Read and parse package.json
79
+ let packageJsonContent;
80
+ let allDependencies = {};
81
+ try {
82
+ packageJsonContent = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
83
+ // Combine all types of dependencies
84
+ allDependencies = {
85
+ ...(packageJsonContent.dependencies || {}),
86
+ ...(packageJsonContent.devDependencies || {}),
87
+ ...(packageJsonContent.peerDependencies || {}),
88
+ };
89
+ }
90
+ catch (e) {
91
+ this.logging.warn(`Can't parse package.json skipping `);
92
+ }
93
+ // process each dependency
94
+ for (const [name, declaredVersion] of Object.entries(allDependencies)) {
95
+ const dependencyPath = path.join(nodeModulesPath, name);
96
+ // Check if dependency exists in node_modules
97
+ if (fs.existsSync(dependencyPath)) {
98
+ // Read the actual version from the dependency's package.json
99
+ const depPackageJsonPath = path.join(dependencyPath, 'package.json');
100
+ let actualVersion = typeof declaredVersion === 'string' ? declaredVersion : 'unknown';
101
+ if (fs.existsSync(depPackageJsonPath)) {
102
+ try {
103
+ const depPackageJson = JSON.parse(fs.readFileSync(depPackageJsonPath, 'utf-8'));
104
+ actualVersion = depPackageJson.version;
105
+ }
106
+ catch (e) {
107
+ this.logging.warn(`Can't parse ${depPackageJsonPath}, skipping`);
108
+ }
109
+ }
110
+ dependencyMap.set(name, {
111
+ name,
112
+ version: actualVersion.toString().replace(/[\^~]/g, ''), // Remove ^ and ~ from version
113
+ path: dependencyPath,
114
+ size: this.getDirectorySize(dependencyPath),
115
+ zipped: false,
116
+ });
117
+ }
118
+ }
119
+ // Also check node_modules directory for unlisted dependencies
120
+ if (fs.existsSync(nodeModulesPath)) {
121
+ const nodeModulesContent = fs.readdirSync(nodeModulesPath);
122
+ for (const item of nodeModulesContent) {
123
+ // Skip hidden files and scope directories
124
+ if (item.startsWith('.') || item.startsWith('@'))
125
+ continue;
126
+ const itemPath = path.join(nodeModulesPath, item);
127
+ if (!fs.statSync(itemPath).isDirectory())
128
+ continue;
129
+ // If not already in dependencyMap, add it
130
+ if (!dependencyMap.has(item)) {
131
+ const depPackageJsonPath = path.join(itemPath, 'package.json');
132
+ if (fs.existsSync(depPackageJsonPath)) {
133
+ try {
134
+ const depPackageJson = JSON.parse(fs.readFileSync(depPackageJsonPath, 'utf-8'));
135
+ dependencyMap.set(item, {
136
+ name: item,
137
+ version: depPackageJson.version || 'unknown',
138
+ path: itemPath,
139
+ size: this.getDirectorySize(itemPath),
140
+ zipped: false,
141
+ });
142
+ }
143
+ catch (e) {
144
+ this.logging.warn(`Can't parse ${depPackageJsonPath}, skipping`);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ return dependencyMap;
151
+ }
152
+ /*
153
+ * It will setup watchers for the .classpath files.
154
+ * When a change is detected, it will update the dependency map.
155
+ */
156
+ setupWatchers(folders) {
157
+ // Filter out the jstsDependencyInfos that are in the folders
158
+ const jstsDependencyInfoToBeWatched = this.jstsDependencyInfos.filter(jstsDependencyInfo => {
159
+ return folders.includes(jstsDependencyInfo.workspaceFolder);
160
+ });
161
+ jstsDependencyInfoToBeWatched.forEach((jstsDependencyInfo) => {
162
+ const packageJsonPath = jstsDependencyInfo.packageJsonPath;
163
+ if (this.dependencyWatchers.has(packageJsonPath)) {
164
+ return;
165
+ }
166
+ this.logging.log(`Setting up Javascript/Typescript dependency watcher for ${packageJsonPath}`);
167
+ try {
168
+ const watcher = fs.watch(packageJsonPath, async (eventType) => {
169
+ if (eventType === 'change') {
170
+ this.logging.log(`Change detected in ${packageJsonPath}`);
171
+ const updatedDependencyMap = this.generateDependencyMap(jstsDependencyInfo);
172
+ let zips = await this.compareAndUpdateDependencyMap(jstsDependencyInfo.workspaceFolder, updatedDependencyMap, true);
173
+ this.emitDependencyChange(jstsDependencyInfo.workspaceFolder, zips);
174
+ }
175
+ });
176
+ this.dependencyWatchers.set(packageJsonPath, watcher);
177
+ }
178
+ catch (error) {
179
+ this.logging.warn(`Error setting up watcher for ${packageJsonPath}: ${error}`);
180
+ }
181
+ });
182
+ }
183
+ // JS and TS are not using LSP to sync dependencies
184
+ async updateDependencyMapBasedOnLSP(paths, workspaceFolder) { }
185
+ transformPathToDependency(dependencyName, dependencyPath, dependencyMap) { }
186
+ disposeWatchers(workspaceFolder) {
187
+ this.jstsDependencyInfos.forEach((jstsDependencyInfo) => {
188
+ if (workspaceFolder.uri === jstsDependencyInfo.workspaceFolder.uri) {
189
+ const packageJsonPath = jstsDependencyInfo.packageJsonPath;
190
+ if (this.dependencyWatchers.has(packageJsonPath)) {
191
+ this.logging.log(`Disposing dependency watcher for ${packageJsonPath}`);
192
+ this.dependencyWatchers.get(packageJsonPath)?.close();
193
+ this.dependencyWatchers.delete(packageJsonPath);
194
+ }
195
+ }
196
+ });
197
+ }
198
+ disposeDependencyInfo(workspaceFolder) {
199
+ // Remove the dependency info for the workspace folder
200
+ this.jstsDependencyInfos = this.jstsDependencyInfos.filter((jstsDependencyInfo) => jstsDependencyInfo.workspaceFolder.uri !== workspaceFolder.uri);
201
+ }
202
+ }
203
+ exports.JSTSDependencyHandler = JSTSDependencyHandler;
204
+ //# sourceMappingURL=JSTSDependencyHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSTSDependencyHandler.js","sourceRoot":"","sources":["../../../../../src/language-server/workspaceContext/dependency/dependencyHandler/JSTSDependencyHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { BaseDependencyInfo, Dependency, LanguageDependencyHandler } from './LanguageDependencyHandler';
2
+ import { WorkspaceFolder } from '@aws/language-server-runtimes/server-interface';
3
+ export interface JavaDependencyInfo extends BaseDependencyInfo {
4
+ dotClasspathPath: string;
5
+ }
6
+ export declare class JavaDependencyHandler extends LanguageDependencyHandler<JavaDependencyInfo> {
7
+ private javaDependencyInfos;
8
+ private RELATIVE_PATH;
9
+ discover(currentDir: string, workspaceFolder: WorkspaceFolder): boolean;
10
+ initiateDependencyMap(folders: WorkspaceFolder[]): void;
11
+ setupWatchers(folders: WorkspaceFolder[]): void;
12
+ generateDependencyMap(javaDependencyInfo: JavaDependencyInfo): Map<string, Dependency>;
13
+ transformPathToDependency(dependencyName: string, dependencyPath: string, dependencyMap: Map<string, Dependency>): void;
14
+ disposeWatchers(workspaceFolder: WorkspaceFolder): void;
15
+ disposeDependencyInfo(workspaceFolder: WorkspaceFolder): void;
16
+ }