@lspeasy/core 1.0.1

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 (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +550 -0
  3. package/dist/index.d.ts +44 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +32 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/jsonrpc/framing.d.ts +32 -0
  8. package/dist/jsonrpc/framing.d.ts.map +1 -0
  9. package/dist/jsonrpc/framing.js +96 -0
  10. package/dist/jsonrpc/framing.js.map +1 -0
  11. package/dist/jsonrpc/messages.d.ts +64 -0
  12. package/dist/jsonrpc/messages.d.ts.map +1 -0
  13. package/dist/jsonrpc/messages.js +23 -0
  14. package/dist/jsonrpc/messages.js.map +1 -0
  15. package/dist/jsonrpc/reader.d.ts +44 -0
  16. package/dist/jsonrpc/reader.d.ts.map +1 -0
  17. package/dist/jsonrpc/reader.js +107 -0
  18. package/dist/jsonrpc/reader.js.map +1 -0
  19. package/dist/jsonrpc/schemas.d.ts +103 -0
  20. package/dist/jsonrpc/schemas.d.ts.map +1 -0
  21. package/dist/jsonrpc/schemas.js +66 -0
  22. package/dist/jsonrpc/schemas.js.map +1 -0
  23. package/dist/jsonrpc/writer.d.ts +43 -0
  24. package/dist/jsonrpc/writer.d.ts.map +1 -0
  25. package/dist/jsonrpc/writer.js +110 -0
  26. package/dist/jsonrpc/writer.js.map +1 -0
  27. package/dist/middleware/compose.d.ts +3 -0
  28. package/dist/middleware/compose.d.ts.map +1 -0
  29. package/dist/middleware/compose.js +16 -0
  30. package/dist/middleware/compose.js.map +1 -0
  31. package/dist/middleware/index.d.ts +6 -0
  32. package/dist/middleware/index.d.ts.map +1 -0
  33. package/dist/middleware/index.js +5 -0
  34. package/dist/middleware/index.js.map +1 -0
  35. package/dist/middleware/pipeline.d.ts +5 -0
  36. package/dist/middleware/pipeline.d.ts.map +1 -0
  37. package/dist/middleware/pipeline.js +54 -0
  38. package/dist/middleware/pipeline.js.map +1 -0
  39. package/dist/middleware/scoped.d.ts +9 -0
  40. package/dist/middleware/scoped.d.ts.map +1 -0
  41. package/dist/middleware/scoped.js +20 -0
  42. package/dist/middleware/scoped.js.map +1 -0
  43. package/dist/middleware/typed.d.ts +3 -0
  44. package/dist/middleware/typed.d.ts.map +1 -0
  45. package/dist/middleware/typed.js +18 -0
  46. package/dist/middleware/typed.js.map +1 -0
  47. package/dist/middleware/types.d.ts +45 -0
  48. package/dist/middleware/types.d.ts.map +1 -0
  49. package/dist/middleware/types.js +2 -0
  50. package/dist/middleware/types.js.map +1 -0
  51. package/dist/protocol/capabilities.d.ts +93 -0
  52. package/dist/protocol/capabilities.d.ts.map +1 -0
  53. package/dist/protocol/capabilities.js +143 -0
  54. package/dist/protocol/capabilities.js.map +1 -0
  55. package/dist/protocol/capability-methods.d.ts +270 -0
  56. package/dist/protocol/capability-methods.d.ts.map +1 -0
  57. package/dist/protocol/capability-methods.js +14 -0
  58. package/dist/protocol/capability-methods.js.map +1 -0
  59. package/dist/protocol/enums.d.ts +336 -0
  60. package/dist/protocol/enums.d.ts.map +1 -0
  61. package/dist/protocol/enums.js +417 -0
  62. package/dist/protocol/enums.js.map +1 -0
  63. package/dist/protocol/infer.d.ts +112 -0
  64. package/dist/protocol/infer.d.ts.map +1 -0
  65. package/dist/protocol/infer.js +58 -0
  66. package/dist/protocol/infer.js.map +1 -0
  67. package/dist/protocol/namespaces.d.ts +1432 -0
  68. package/dist/protocol/namespaces.d.ts.map +1 -0
  69. package/dist/protocol/namespaces.js +570 -0
  70. package/dist/protocol/namespaces.js.map +1 -0
  71. package/dist/protocol/partial.d.ts +29 -0
  72. package/dist/protocol/partial.d.ts.map +1 -0
  73. package/dist/protocol/partial.js +24 -0
  74. package/dist/protocol/partial.js.map +1 -0
  75. package/dist/protocol/progress.d.ts +32 -0
  76. package/dist/protocol/progress.d.ts.map +1 -0
  77. package/dist/protocol/progress.js +60 -0
  78. package/dist/protocol/progress.js.map +1 -0
  79. package/dist/protocol/schemas.d.ts +534 -0
  80. package/dist/protocol/schemas.d.ts.map +1 -0
  81. package/dist/protocol/schemas.js +271 -0
  82. package/dist/protocol/schemas.js.map +1 -0
  83. package/dist/protocol/types.d.ts +19 -0
  84. package/dist/protocol/types.d.ts.map +1 -0
  85. package/dist/protocol/types.js +8 -0
  86. package/dist/protocol/types.js.map +1 -0
  87. package/dist/protocol/watching.d.ts +29 -0
  88. package/dist/protocol/watching.d.ts.map +1 -0
  89. package/dist/protocol/watching.js +36 -0
  90. package/dist/protocol/watching.js.map +1 -0
  91. package/dist/protocol/workspace.d.ts +24 -0
  92. package/dist/protocol/workspace.d.ts.map +1 -0
  93. package/dist/protocol/workspace.js +26 -0
  94. package/dist/protocol/workspace.js.map +1 -0
  95. package/dist/transport/events.d.ts +27 -0
  96. package/dist/transport/events.d.ts.map +1 -0
  97. package/dist/transport/events.js +34 -0
  98. package/dist/transport/events.js.map +1 -0
  99. package/dist/transport/stdio.d.ts +55 -0
  100. package/dist/transport/stdio.d.ts.map +1 -0
  101. package/dist/transport/stdio.js +147 -0
  102. package/dist/transport/stdio.js.map +1 -0
  103. package/dist/transport/transport.d.ts +38 -0
  104. package/dist/transport/transport.d.ts.map +1 -0
  105. package/dist/transport/transport.js +5 -0
  106. package/dist/transport/transport.js.map +1 -0
  107. package/dist/transport/websocket.d.ts +142 -0
  108. package/dist/transport/websocket.d.ts.map +1 -0
  109. package/dist/transport/websocket.js +324 -0
  110. package/dist/transport/websocket.js.map +1 -0
  111. package/dist/utils/cancellation.d.ts +47 -0
  112. package/dist/utils/cancellation.d.ts.map +1 -0
  113. package/dist/utils/cancellation.js +77 -0
  114. package/dist/utils/cancellation.js.map +1 -0
  115. package/dist/utils/disposable-event-emitter.d.ts +26 -0
  116. package/dist/utils/disposable-event-emitter.d.ts.map +1 -0
  117. package/dist/utils/disposable-event-emitter.js +62 -0
  118. package/dist/utils/disposable-event-emitter.js.map +1 -0
  119. package/dist/utils/disposable.d.ts +34 -0
  120. package/dist/utils/disposable.d.ts.map +1 -0
  121. package/dist/utils/disposable.js +55 -0
  122. package/dist/utils/disposable.js.map +1 -0
  123. package/dist/utils/document.d.ts +20 -0
  124. package/dist/utils/document.d.ts.map +1 -0
  125. package/dist/utils/document.js +54 -0
  126. package/dist/utils/document.js.map +1 -0
  127. package/dist/utils/errors.d.ts +69 -0
  128. package/dist/utils/errors.d.ts.map +1 -0
  129. package/dist/utils/errors.js +104 -0
  130. package/dist/utils/errors.js.map +1 -0
  131. package/dist/utils/handler-registry.d.ts +35 -0
  132. package/dist/utils/handler-registry.d.ts.map +1 -0
  133. package/dist/utils/handler-registry.js +68 -0
  134. package/dist/utils/handler-registry.js.map +1 -0
  135. package/dist/utils/index.d.ts +5 -0
  136. package/dist/utils/index.d.ts.map +1 -0
  137. package/dist/utils/index.js +4 -0
  138. package/dist/utils/index.js.map +1 -0
  139. package/dist/utils/internal.d.ts +3 -0
  140. package/dist/utils/internal.d.ts.map +1 -0
  141. package/dist/utils/internal.js +3 -0
  142. package/dist/utils/internal.js.map +1 -0
  143. package/dist/utils/logger.d.ts +47 -0
  144. package/dist/utils/logger.d.ts.map +1 -0
  145. package/dist/utils/logger.js +61 -0
  146. package/dist/utils/logger.js.map +1 -0
  147. package/dist/utils/pending-request-tracker.d.ts +36 -0
  148. package/dist/utils/pending-request-tracker.d.ts.map +1 -0
  149. package/dist/utils/pending-request-tracker.js +93 -0
  150. package/dist/utils/pending-request-tracker.js.map +1 -0
  151. package/dist/utils/transport-attachment.d.ts +34 -0
  152. package/dist/utils/transport-attachment.d.ts.map +1 -0
  153. package/dist/utils/transport-attachment.js +48 -0
  154. package/dist/utils/transport-attachment.js.map +1 -0
  155. package/package.json +87 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * MessageWriter class for serializing JSON-RPC messages with framing
3
+ * Pattern: MCP SDK's message serialization
4
+ */
5
+ import { EventEmitter } from 'node:events';
6
+ import { serializeMessage } from './framing.js';
7
+ /**
8
+ * MessageWriter writes JSON-RPC messages to a stream
9
+ */
10
+ export class MessageWriter extends EventEmitter {
11
+ stream;
12
+ closed;
13
+ writing;
14
+ queue;
15
+ constructor(stream) {
16
+ super();
17
+ this.stream = stream;
18
+ this.closed = false;
19
+ this.writing = false;
20
+ this.queue = [];
21
+ // Set up stream event handlers
22
+ this.stream.on('error', this.onError.bind(this));
23
+ this.stream.on('close', this.onClose.bind(this));
24
+ }
25
+ /**
26
+ * Write a message to the stream
27
+ */
28
+ async write(message) {
29
+ if (this.closed) {
30
+ throw new Error('MessageWriter is closed');
31
+ }
32
+ const buffer = serializeMessage(message);
33
+ this.queue.push(buffer);
34
+ if (!this.writing) {
35
+ await this.flush();
36
+ }
37
+ }
38
+ /**
39
+ * Flush all queued messages
40
+ */
41
+ async flush() {
42
+ if (this.writing || this.queue.length === 0) {
43
+ return;
44
+ }
45
+ this.writing = true;
46
+ while (this.queue.length > 0 && !this.closed) {
47
+ const buffer = this.queue.shift();
48
+ try {
49
+ await this.writeBuffer(buffer);
50
+ }
51
+ catch (error) {
52
+ this.emit('error', error instanceof Error ? error : new Error(String(error)));
53
+ break;
54
+ }
55
+ }
56
+ this.writing = false;
57
+ }
58
+ /**
59
+ * Write a buffer to the stream
60
+ */
61
+ writeBuffer(buffer) {
62
+ return new Promise((resolve, reject) => {
63
+ this.stream.write(buffer, (error) => {
64
+ if (error) {
65
+ reject(error);
66
+ }
67
+ else {
68
+ resolve();
69
+ }
70
+ });
71
+ });
72
+ }
73
+ /**
74
+ * Handle stream error
75
+ */
76
+ onError(error) {
77
+ if (!this.closed) {
78
+ this.emit('error', error);
79
+ }
80
+ }
81
+ /**
82
+ * Handle stream close
83
+ */
84
+ onClose() {
85
+ if (!this.closed) {
86
+ this.close();
87
+ }
88
+ }
89
+ /**
90
+ * Close the writer
91
+ */
92
+ close() {
93
+ if (this.closed) {
94
+ return;
95
+ }
96
+ this.closed = true;
97
+ this.queue = [];
98
+ // Remove stream listeners
99
+ this.stream.removeAllListeners();
100
+ // Emit close event
101
+ this.emit('close');
102
+ }
103
+ /**
104
+ * Check if writer is closed
105
+ */
106
+ isClosed() {
107
+ return this.closed;
108
+ }
109
+ }
110
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/jsonrpc/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Middleware } from './types.js';
2
+ export declare function composeMiddleware(...middlewares: Middleware[]): Middleware;
3
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/middleware/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,GAAG,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,CAiB1E"}
@@ -0,0 +1,16 @@
1
+ export function composeMiddleware(...middlewares) {
2
+ return async (context, next) => {
3
+ const dispatch = async (index) => {
4
+ if (index >= middlewares.length) {
5
+ return next();
6
+ }
7
+ const middleware = middlewares[index];
8
+ if (!middleware) {
9
+ return next();
10
+ }
11
+ return middleware(context, () => dispatch(index + 1));
12
+ };
13
+ return dispatch(0);
14
+ };
15
+ }
16
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/middleware/compose.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,GAAG,WAAyB,EAAc;IAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAoC,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAoC,EAAE,CAAC;YAC1E,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBAChC,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,OAAO,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAAA,CACvD,CAAC;QAEF,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IAAA,CACpB,CAAC;AAAA,CACH"}
@@ -0,0 +1,6 @@
1
+ export type { Middleware, MiddlewareContext, MiddlewareDirection, MiddlewareMessage, MiddlewareMessageType, MiddlewareNext, MiddlewareResult, MethodFilter, ScopedMiddleware, TypedMiddleware, TypedMiddlewareContext, TypedParams, TypedResult, LSPMethod } from './types.js';
2
+ export { composeMiddleware } from './compose.js';
3
+ export { executeMiddlewarePipeline } from './pipeline.js';
4
+ export { createScopedMiddleware } from './scoped.js';
5
+ export { createTypedMiddleware } from './typed.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { composeMiddleware } from './compose.js';
2
+ export { executeMiddlewarePipeline } from './pipeline.js';
3
+ export { createScopedMiddleware } from './scoped.js';
4
+ export { createTypedMiddleware } from './typed.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Middleware, MiddlewareContext, MiddlewareResult, ScopedMiddleware } from './types.js';
2
+ type MiddlewareRegistration = Middleware | ScopedMiddleware;
3
+ export declare function executeMiddlewarePipeline(registrations: MiddlewareRegistration[] | undefined, context: MiddlewareContext, finalHandler: () => Promise<void | MiddlewareResult>): Promise<void | MiddlewareResult>;
4
+ export {};
5
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/middleware/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpG,KAAK,sBAAsB,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAsC5D,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,sBAAsB,EAAE,GAAG,SAAS,EACnD,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,GACnD,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,CA6BlC"}
@@ -0,0 +1,54 @@
1
+ import { isScopedMiddleware, matchesFilter } from './scoped.js';
2
+ function getMessageId(message) {
3
+ if ('id' in message) {
4
+ return message.id;
5
+ }
6
+ return undefined;
7
+ }
8
+ function assertMessageIdUnchanged(before, context) {
9
+ const after = getMessageId(context.message);
10
+ if (before !== after) {
11
+ throw new Error('Middleware cannot modify JSON-RPC message id');
12
+ }
13
+ }
14
+ function getMiddleware(registration) {
15
+ if (isScopedMiddleware(registration)) {
16
+ return registration.middleware;
17
+ }
18
+ return registration;
19
+ }
20
+ function shouldRun(registration, context) {
21
+ if (!isScopedMiddleware(registration)) {
22
+ return true;
23
+ }
24
+ return matchesFilter(registration.filter, {
25
+ method: context.method,
26
+ direction: context.direction,
27
+ messageType: context.messageType
28
+ });
29
+ }
30
+ export async function executeMiddlewarePipeline(registrations, context, finalHandler) {
31
+ const entries = registrations ?? [];
32
+ if (entries.length === 0) {
33
+ return finalHandler();
34
+ }
35
+ const dispatch = async (index) => {
36
+ if (index >= entries.length) {
37
+ return finalHandler();
38
+ }
39
+ const registration = entries[index];
40
+ if (!registration || !shouldRun(registration, context)) {
41
+ return dispatch(index + 1);
42
+ }
43
+ const middleware = getMiddleware(registration);
44
+ const messageIdBefore = getMessageId(context.message);
45
+ const result = await middleware(context, () => dispatch(index + 1));
46
+ assertMessageIdUnchanged(messageIdBefore, context);
47
+ if (result?.shortCircuit) {
48
+ return result;
49
+ }
50
+ return result;
51
+ };
52
+ return dispatch(0);
53
+ }
54
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/middleware/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIhE,SAAS,YAAY,CAAC,OAAqC,EAAsC;IAC/F,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CAClB;AAED,SAAS,wBAAwB,CAC/B,MAA0C,EAC1C,OAA0B,EACpB;IACN,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;AAAA,CACF;AAED,SAAS,aAAa,CAAC,YAAoC,EAAc;IACvE,IAAI,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC,UAAU,CAAC;IACjC,CAAC;IACD,OAAO,YAAY,CAAC;AAAA,CACrB;AAED,SAAS,SAAS,CAAC,YAAoC,EAAE,OAA0B,EAAW;IAC5F,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE;QACxC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;AAAA,CACJ;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,aAAmD,EACnD,OAA0B,EAC1B,YAAoD,EAClB;IAClC,MAAM,OAAO,GAAG,aAAa,IAAI,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAoC,EAAE,CAAC;QAC1E,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,YAAY,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;YACvD,OAAO,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACpE,wBAAwB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAEnD,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC;IAAA,CACf,CAAC;IAEF,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;AAAA,CACpB"}
@@ -0,0 +1,9 @@
1
+ import type { MethodFilter, Middleware, MiddlewareMessageType, ScopedMiddleware } from './types.js';
2
+ export declare function createScopedMiddleware(filter: MethodFilter, middleware: Middleware): ScopedMiddleware;
3
+ export declare function isScopedMiddleware(value: Middleware | ScopedMiddleware): value is ScopedMiddleware;
4
+ export declare function matchesFilter(filter: MethodFilter, context: {
5
+ method: string;
6
+ direction: 'clientToServer' | 'serverToClient';
7
+ messageType: MiddlewareMessageType;
8
+ }): boolean;
9
+ //# sourceMappingURL=scoped.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped.d.ts","sourceRoot":"","sources":["../../src/middleware/scoped.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpG,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,GACrB,gBAAgB,CAElB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,GAAG,gBAAgB,GACnC,KAAK,IAAI,gBAAgB,CAE3B;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAC/C,WAAW,EAAE,qBAAqB,CAAC;CACpC,GACA,OAAO,CAeT"}
@@ -0,0 +1,20 @@
1
+ export function createScopedMiddleware(filter, middleware) {
2
+ return { filter, middleware };
3
+ }
4
+ export function isScopedMiddleware(value) {
5
+ return typeof value === 'object' && value !== null && 'middleware' in value && 'filter' in value;
6
+ }
7
+ export function matchesFilter(filter, context) {
8
+ const direction = filter.direction ?? 'both';
9
+ if (direction !== 'both' && direction !== context.direction) {
10
+ return false;
11
+ }
12
+ if (filter.messageType && !filter.messageType.includes(context.messageType)) {
13
+ return false;
14
+ }
15
+ if (Array.isArray(filter.methods)) {
16
+ return filter.methods.includes(context.method);
17
+ }
18
+ return filter.methods.test(context.method);
19
+ }
20
+ //# sourceMappingURL=scoped.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped.js","sourceRoot":"","sources":["../../src/middleware/scoped.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CACpC,MAAoB,EACpB,UAAsB,EACJ;IAClB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,CAC/B;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAoC,EACT;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;AAAA,CAClG;AAED,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,OAIC,EACQ;IACT,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;IAC7C,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAAA,CAC5C"}
@@ -0,0 +1,3 @@
1
+ import type { LSPMethod, ScopedMiddleware, TypedMiddleware } from './types.js';
2
+ export declare function createTypedMiddleware<M extends LSPMethod>(method: M, middleware: TypedMiddleware<M>): ScopedMiddleware;
3
+ //# sourceMappingURL=typed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed.d.ts","sourceRoot":"","sources":["../../src/middleware/typed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAIhB,MAAM,YAAY,CAAC;AAGpB,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,SAAS,EACvD,MAAM,EAAE,CAAC,EACT,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,GAC7B,gBAAgB,CAkBlB"}
@@ -0,0 +1,18 @@
1
+ import { createScopedMiddleware } from './scoped.js';
2
+ export function createTypedMiddleware(method, middleware) {
3
+ return createScopedMiddleware({ methods: [method] }, async (context, next) => {
4
+ const typedContextBase = {
5
+ ...context,
6
+ method,
7
+ params: ('params' in context.message ? context.message.params : undefined)
8
+ };
9
+ const typedContext = 'result' in context.message
10
+ ? {
11
+ ...typedContextBase,
12
+ result: context.message.result
13
+ }
14
+ : typedContextBase;
15
+ return middleware(typedContext, next);
16
+ });
17
+ }
18
+ //# sourceMappingURL=typed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed.js","sourceRoot":"","sources":["../../src/middleware/typed.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,UAAU,qBAAqB,CACnC,MAAS,EACT,UAA8B,EACZ;IAClB,OAAO,sBAAsB,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5E,MAAM,gBAAgB,GAAG;YACvB,GAAG,OAAO;YACV,MAAM;YACN,MAAM,EAAE,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAmB;SAC7F,CAAC;QAEF,MAAM,YAAY,GAChB,QAAQ,IAAI,OAAO,CAAC,OAAO;YACzB,CAAC,CAAC;gBACE,GAAG,gBAAgB;gBACnB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAwB;aACjD;YACH,CAAC,CAAC,gBAAgB,CAAC;QAEvB,OAAO,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAAA,CACvC,CAAC,CAAC;AAAA,CACJ"}
@@ -0,0 +1,45 @@
1
+ import type { ErrorResponseMessage, Message, NotificationMessage, RequestMessage, ResponseMessage } from '../jsonrpc/messages.js';
2
+ import type { LSPNotificationMethod, LSPRequestMethod, ParamsForNotification, ParamsForRequest, ResultForRequest } from '../protocol/infer.js';
3
+ export type MiddlewareDirection = 'clientToServer' | 'serverToClient';
4
+ export type MiddlewareMessageType = 'request' | 'response' | 'notification' | 'error';
5
+ type ImmutableId<T> = T extends {
6
+ id: infer I;
7
+ } ? Omit<T, 'id'> & {
8
+ readonly id: I;
9
+ } : T;
10
+ export type MiddlewareMessage = ImmutableId<Message>;
11
+ export interface MiddlewareContext {
12
+ direction: MiddlewareDirection;
13
+ messageType: MiddlewareMessageType;
14
+ method: string;
15
+ message: MiddlewareMessage;
16
+ metadata: Record<string, unknown>;
17
+ transport: string;
18
+ }
19
+ export type LSPMethod = LSPRequestMethod | LSPNotificationMethod;
20
+ export type TypedParams<M extends LSPMethod> = M extends LSPRequestMethod ? ParamsForRequest<M> : M extends LSPNotificationMethod ? ParamsForNotification<M> : never;
21
+ export type TypedResult<M extends LSPMethod> = M extends LSPRequestMethod ? ResultForRequest<M> : void;
22
+ export interface TypedMiddlewareContext<M extends LSPMethod> extends MiddlewareContext {
23
+ method: M;
24
+ params: TypedParams<M>;
25
+ result?: TypedResult<M>;
26
+ }
27
+ export interface MiddlewareResult {
28
+ shortCircuit?: boolean;
29
+ response?: ResponseMessage | RequestMessage | NotificationMessage;
30
+ error?: ErrorResponseMessage;
31
+ }
32
+ export type MiddlewareNext = () => Promise<void | MiddlewareResult>;
33
+ export type Middleware = (context: MiddlewareContext, next: MiddlewareNext) => Promise<void | MiddlewareResult>;
34
+ export type TypedMiddleware<M extends LSPMethod> = (context: TypedMiddlewareContext<M>, next: MiddlewareNext) => Promise<void | MiddlewareResult>;
35
+ export interface MethodFilter {
36
+ methods: string[] | RegExp;
37
+ direction?: MiddlewareDirection | 'both';
38
+ messageType?: MiddlewareMessageType[];
39
+ }
40
+ export interface ScopedMiddleware {
41
+ filter: MethodFilter;
42
+ middleware: Middleware;
43
+ }
44
+ export {};
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAEtE,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,CAAC;AAEtF,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;CAAE,GAAG,CAAC,CAAC;AAEzF,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,mBAAmB,CAAC;IAC/B,WAAW,EAAE,qBAAqB,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,qBAAqB,CAAC;AAEjE,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,SAAS,gBAAgB,GACrE,gBAAgB,CAAC,CAAC,CAAC,GACnB,CAAC,SAAS,qBAAqB,GAC7B,qBAAqB,CAAC,CAAC,CAAC,GACxB,KAAK,CAAC;AAEZ,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,SAAS,gBAAgB,GACrE,gBAAgB,CAAC,CAAC,CAAC,GACnB,IAAI,CAAC;AAET,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,iBAAiB;IACpF,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,mBAAmB,CAAC;IAClE,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAEpE,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,cAAc,KACjB,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAEtC,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,SAAS,IAAI,CACjD,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAClC,IAAI,EAAE,cAAc,KACjB,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC;IACzC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Capability-aware type utilities for LSP protocol
3
+ *
4
+ * @module protocol/capabilities
5
+ */
6
+ import type { ServerCapabilities, ClientCapabilities } from 'vscode-languageserver-protocol';
7
+ import type { Paths, PickDeep } from 'type-fest';
8
+ import { type LSPNotificationMethod, type LSPRequestMethod, type ClientCapabilityForNotification, type ClientCapabilityForRequest, type ServerCapabilityForNotification, type ServerCapabilityForRequest } from './infer.js';
9
+ export type { ServerCapabilities, ClientCapabilities };
10
+ /**
11
+ * Map of LSP methods to their corresponding server capability keys
12
+ * This is derived from the namespace structure
13
+ */
14
+ /**
15
+ * Get the capability key for a given method at runtime
16
+ */
17
+ /**
18
+ * Check if a method is supported by the given server capabilities
19
+ */
20
+ export declare function serverSupportsRequest<M extends LSPRequestMethod<'clientToServer'>>(method: M, capabilities: ServerCapabilities): capabilities is ServerCapabilities & PickDeep<ServerCapabilities, ServerCapabilityForRequest<M>>;
21
+ export declare function serverSupportsNotification<M extends LSPNotificationMethod<'clientToServer'>, T extends Partial<ServerCapabilities>>(method: M, capabilities: T): capabilities is T & PickDeep<ServerCapabilities, ServerCapabilityForNotification<M>>;
22
+ /**
23
+ * Check if a method is supported by the given client capabilities
24
+ */
25
+ export declare function clientSupportsRequest<M extends LSPRequestMethod<'serverToClient'>, T extends Partial<ClientCapabilities>>(method: M, capabilities: T): capabilities is T & PickDeep<ClientCapabilities, ClientCapabilityForRequest<M>>;
26
+ export declare function clientSupportsNotification<M extends LSPNotificationMethod<'serverToClient'>, T extends Partial<ClientCapabilities>>(method: M, capabilities: T): capabilities is T & PickDeep<ClientCapabilities, ClientCapabilityForNotification<M>>;
27
+ /**
28
+ * Check if a server capability is enabled
29
+ */
30
+ export declare function hasServerCapability<K extends Paths<ServerCapabilities>, T extends Partial<ServerCapabilities>>(capabilities: T, capability: K): capabilities is T & PickDeep<ServerCapabilities, K>;
31
+ /**
32
+ * Check if a client capability is enabled
33
+ */
34
+ export declare function hasClientCapability<K extends Paths<ClientCapabilities>, T extends Partial<ClientCapabilities>>(capabilities: T, capability: K): capabilities is T & PickDeep<ClientCapabilities, K>;
35
+ /**
36
+ * Helper to check if hover is supported
37
+ */
38
+ export declare function supportsHover(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
39
+ hoverProvider: NonNullable<ServerCapabilities['hoverProvider']>;
40
+ };
41
+ /**
42
+ * Helper to check if completion is supported
43
+ */
44
+ export declare function supportsCompletion(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
45
+ completionProvider: NonNullable<ServerCapabilities['completionProvider']>;
46
+ };
47
+ /**
48
+ * Helper to check if definition is supported
49
+ */
50
+ export declare function supportsDefinition(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
51
+ definitionProvider: NonNullable<ServerCapabilities['definitionProvider']>;
52
+ };
53
+ /**
54
+ * Helper to check if references are supported
55
+ */
56
+ export declare function supportsReferences(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
57
+ referencesProvider: NonNullable<ServerCapabilities['referencesProvider']>;
58
+ };
59
+ /**
60
+ * Helper to check if document symbols are supported
61
+ */
62
+ export declare function supportsDocumentSymbol(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
63
+ documentSymbolProvider: NonNullable<ServerCapabilities['documentSymbolProvider']>;
64
+ };
65
+ /**
66
+ * Helper to check if workspace folders are supported
67
+ */
68
+ export declare function supportsWorkspaceFolders(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
69
+ workspace: {
70
+ workspaceFolders: {
71
+ supported: true;
72
+ };
73
+ };
74
+ };
75
+ /**
76
+ * Helper to check if file watching is supported
77
+ */
78
+ export declare function supportsFileWatching(capabilities: ClientCapabilities): capabilities is ClientCapabilities & {
79
+ workspace: {
80
+ didChangeWatchedFiles: {
81
+ dynamicRegistration: true;
82
+ };
83
+ };
84
+ };
85
+ /**
86
+ * Helper to check if work done progress is supported
87
+ */
88
+ export declare function supportsWorkDoneProgress(capabilities: ClientCapabilities): capabilities is ClientCapabilities & {
89
+ window: {
90
+ workDoneProgress: true;
91
+ };
92
+ };
93
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/protocol/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Capability-aware type utilities for LSP protocol
3
+ *
4
+ * @module protocol/capabilities
5
+ */
6
+ import { getClientCapabilityForNotificationMethod, getClientCapabilityForRequestMethod, getCapabilityForNotificationMethod, getCapabilityForRequestMethod } from './infer.js';
7
+ /**
8
+ * Extract all request definition types from the namespace structure
9
+ */
10
+ /**
11
+ * Filter request definitions that have a ServerCapability field
12
+ */
13
+ /**
14
+ * Map a method to its server capability provider key
15
+ */
16
+ /**
17
+ * Check if a capability value indicates the feature is enabled
18
+ */
19
+ /**
20
+ * Extract supported request methods based on server capabilities
21
+ *
22
+ * This type automatically traverses the LSP namespace structure to determine
23
+ * which methods are available based on the provided server capabilities.
24
+ */
25
+ function getProperty(obj, key) {
26
+ const keys = key.split('.');
27
+ let result = obj;
28
+ for (const k of keys) {
29
+ if (result == null) {
30
+ return undefined;
31
+ }
32
+ result = result[k];
33
+ }
34
+ return result;
35
+ }
36
+ /**
37
+ * Map of LSP methods to their corresponding server capability keys
38
+ * This is derived from the namespace structure
39
+ */
40
+ /**
41
+ * Get the capability key for a given method at runtime
42
+ */
43
+ /**
44
+ * Check if a method is supported by the given server capabilities
45
+ */
46
+ export function serverSupportsRequest(method, capabilities) {
47
+ const capabilityKey = getCapabilityForRequestMethod(method);
48
+ if (capabilityKey === 'alwaysOn' || capabilityKey === null) {
49
+ return true;
50
+ }
51
+ const value = getProperty(capabilities, capabilityKey);
52
+ return value !== null && value !== undefined && value !== false;
53
+ }
54
+ export function serverSupportsNotification(method, capabilities) {
55
+ const capabilityKey = getCapabilityForNotificationMethod(method);
56
+ if (capabilityKey === 'alwaysOn' || capabilityKey === null) {
57
+ return true;
58
+ }
59
+ const value = getProperty(capabilities, capabilityKey);
60
+ return value !== null && value !== undefined && value !== false;
61
+ }
62
+ /**
63
+ * Check if a method is supported by the given client capabilities
64
+ */
65
+ export function clientSupportsRequest(method, capabilities) {
66
+ const capabilityKey = getClientCapabilityForRequestMethod(method);
67
+ if (capabilityKey === 'alwaysOn' || capabilityKey === null) {
68
+ return true;
69
+ }
70
+ const value = getProperty(capabilities, capabilityKey);
71
+ return value !== null && value !== undefined && value !== false;
72
+ }
73
+ export function clientSupportsNotification(method, capabilities) {
74
+ const capabilityKey = getClientCapabilityForNotificationMethod(method);
75
+ if (capabilityKey === 'alwaysOn' || capabilityKey === null) {
76
+ return true;
77
+ }
78
+ const value = getProperty(capabilities, capabilityKey);
79
+ return value !== null && value !== undefined && value !== false;
80
+ }
81
+ /**
82
+ * Check if a server capability is enabled
83
+ */
84
+ export function hasServerCapability(capabilities, capability) {
85
+ const value = getProperty(capabilities, capability);
86
+ return value !== null && value !== undefined && value !== false;
87
+ }
88
+ /**
89
+ * Check if a client capability is enabled
90
+ */
91
+ export function hasClientCapability(capabilities, capability) {
92
+ const value = getProperty(capabilities, capability);
93
+ return value !== null && value !== undefined && value !== false;
94
+ }
95
+ /**
96
+ * Helper to check if hover is supported
97
+ */
98
+ export function supportsHover(capabilities) {
99
+ return serverSupportsRequest('textDocument/hover', capabilities);
100
+ }
101
+ /**
102
+ * Helper to check if completion is supported
103
+ */
104
+ export function supportsCompletion(capabilities) {
105
+ return serverSupportsRequest('textDocument/completion', capabilities);
106
+ }
107
+ /**
108
+ * Helper to check if definition is supported
109
+ */
110
+ export function supportsDefinition(capabilities) {
111
+ return serverSupportsRequest('textDocument/definition', capabilities);
112
+ }
113
+ /**
114
+ * Helper to check if references are supported
115
+ */
116
+ export function supportsReferences(capabilities) {
117
+ return serverSupportsRequest('textDocument/references', capabilities);
118
+ }
119
+ /**
120
+ * Helper to check if document symbols are supported
121
+ */
122
+ export function supportsDocumentSymbol(capabilities) {
123
+ return serverSupportsRequest('textDocument/documentSymbol', capabilities);
124
+ }
125
+ /**
126
+ * Helper to check if workspace folders are supported
127
+ */
128
+ export function supportsWorkspaceFolders(capabilities) {
129
+ return capabilities.workspace?.workspaceFolders?.supported === true;
130
+ }
131
+ /**
132
+ * Helper to check if file watching is supported
133
+ */
134
+ export function supportsFileWatching(capabilities) {
135
+ return capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration === true;
136
+ }
137
+ /**
138
+ * Helper to check if work done progress is supported
139
+ */
140
+ export function supportsWorkDoneProgress(capabilities) {
141
+ return capabilities.window?.workDoneProgress === true;
142
+ }
143
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/protocol/capabilities.ts"],"names":[],"mappings":"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"}