@marimo-team/islands 0.25.1-dev26 → 0.25.1-dev28

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 (170) hide show
  1. package/dist/{ErrorBoundary-pWWhtr0s.js → ErrorBoundary-CE6-1WC1.js} +1 -1
  2. package/dist/{code-visibility-Ba_KMLhg.js → code-visibility--u2Q2Zfx.js} +1 -1
  3. package/dist/{common-Cqwp2VSj.js → common-hHL7iKzA.js} +1 -1
  4. package/dist/{data-grid-overlay-editor-CpH8-A59.js → data-grid-overlay-editor-v7VZO5up.js} +1 -1
  5. package/dist/{feedback-button-CJxD9fy8.js → feedback-button-C3Ya1IXo.js} +2 -2
  6. package/dist/{glide-data-editor-cm-NQofk.js → glide-data-editor-BKOLh2Tv.js} +3 -3
  7. package/dist/{globals-BquX8N9R.js → globals-DOJr_y24.js} +1 -1
  8. package/dist/main.js +6 -6
  9. package/dist/{number-overlay-editor-3AkAzj7F.js → number-overlay-editor-DkEFJYK7.js} +1 -1
  10. package/dist/{reveal-component-rC5k5pu3.js → reveal-component-rbEv9ppg.js} +2 -2
  11. package/dist/style.css +1 -1
  12. package/package.json +1 -1
  13. package/src/__mocks__/common.ts +3 -3
  14. package/src/__tests__/CellStatus.test.tsx +1 -1
  15. package/src/__tests__/setup.ts +7 -7
  16. package/src/components/app-config/ai-config.tsx +2 -0
  17. package/src/components/chat/chat-panel.tsx +19 -8
  18. package/src/components/data-table/column-summary/chart-spec-model.tsx +4 -4
  19. package/src/components/dependency-graph/elements.ts +2 -2
  20. package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +107 -0
  21. package/src/components/editor/actions/pair-with-agent.tsx +119 -0
  22. package/src/components/editor/actions/useNotebookActions.tsx +2 -1
  23. package/src/components/editor/ai/add-cell-with-ai.tsx +2 -0
  24. package/src/components/editor/ai/staged-cell-submission.ts +2 -2
  25. package/src/components/editor/ai/transport/chat-transport.tsx +1 -1
  26. package/src/components/editor/connections/database/as-code.ts +44 -44
  27. package/src/components/editor/connections/storage/as-code.ts +3 -3
  28. package/src/components/editor/file-tree/requesting-tree.tsx +16 -13
  29. package/src/components/editor/navigation/clipboard.ts +2 -2
  30. package/src/components/editor/output/ansi-reduce.ts +13 -13
  31. package/src/components/slides/__tests__/minimap-actions.test.tsx +7 -7
  32. package/src/components/slides/__tests__/minimap.test.ts +12 -12
  33. package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +8 -8
  34. package/src/core/ai/context/__tests__/registry.test.ts +31 -28
  35. package/src/core/ai/context/providers/cell-output.ts +8 -8
  36. package/src/core/ai/context/providers/datasource.ts +10 -7
  37. package/src/core/ai/context/providers/error.ts +7 -7
  38. package/src/core/ai/context/providers/file.ts +8 -8
  39. package/src/core/ai/context/providers/tables.ts +7 -7
  40. package/src/core/ai/context/providers/variable.ts +7 -7
  41. package/src/core/ai/context/registry.ts +18 -18
  42. package/src/core/ai/ids/ids.ts +5 -5
  43. package/src/core/ai/model-registry.ts +12 -9
  44. package/src/core/ai/staged-cells.ts +6 -6
  45. package/src/core/ai/tools/base.ts +6 -6
  46. package/src/core/ai/tools/edit-notebook-tool.ts +6 -6
  47. package/src/core/ai/tools/registry.ts +4 -4
  48. package/src/core/ai/tools/run-cells-tool.ts +7 -7
  49. package/src/core/ai/tools/sample-tool.ts +6 -6
  50. package/src/core/codemirror/cells/debugger-decorations.ts +13 -7
  51. package/src/core/codemirror/cells/line-timing-decorations.ts +9 -9
  52. package/src/core/codemirror/cells/traceback-decorations.ts +7 -4
  53. package/src/core/codemirror/code-lens/extension.ts +13 -13
  54. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +6 -6
  55. package/src/core/codemirror/copilot/__tests__/transport.test.ts +12 -12
  56. package/src/core/codemirror/copilot/language-server.ts +13 -13
  57. package/src/core/codemirror/copilot/transport.ts +1 -1
  58. package/src/core/codemirror/find-replace/search-highlight.ts +5 -5
  59. package/src/core/codemirror/go-to-definition/underline.ts +3 -3
  60. package/src/core/codemirror/keymaps/vim.ts +3 -3
  61. package/src/core/codemirror/language/languages/markdown.ts +8 -8
  62. package/src/core/codemirror/language/languages/python.ts +7 -7
  63. package/src/core/codemirror/language/languages/sql/completion-builder.ts +5 -5
  64. package/src/core/codemirror/language/languages/sql/completion-store.ts +4 -4
  65. package/src/core/codemirror/language/languages/sql/sql.ts +21 -21
  66. package/src/core/codemirror/lsp/__tests__/transports.test.ts +10 -10
  67. package/src/core/codemirror/lsp/federated-lsp.ts +29 -27
  68. package/src/core/codemirror/lsp/notebook-lsp.ts +21 -21
  69. package/src/core/codemirror/misc/__tests__/dnd.test.ts +10 -10
  70. package/src/core/codemirror/misc/__tests__/paste.test.ts +7 -4
  71. package/src/core/codemirror/reactive-references/extension.ts +3 -3
  72. package/src/core/codemirror/rtc/loro/awareness.ts +12 -12
  73. package/src/core/codemirror/rtc/loro/sync.ts +5 -5
  74. package/src/core/codemirror/vim/cursor-visibility.ts +3 -3
  75. package/src/core/dom/ui-element.ts +5 -5
  76. package/src/core/dom/uiregistry.ts +10 -10
  77. package/src/core/hotkeys/hotkeys.ts +9 -9
  78. package/src/core/islands/__tests__/bridge.test.ts +4 -4
  79. package/src/core/islands/__tests__/test-utils.tsx +4 -4
  80. package/src/core/islands/bridge.ts +85 -82
  81. package/src/core/islands/components/web-components.tsx +7 -7
  82. package/src/core/islands/worker/__tests__/controller.test.ts +1 -1
  83. package/src/core/islands/worker/controller.ts +6 -3
  84. package/src/core/islands/worker-factory.ts +2 -2
  85. package/src/core/kernel/RuntimeState.ts +4 -4
  86. package/src/core/lsp/__tests__/transport.test.ts +19 -19
  87. package/src/core/lsp/transport.ts +5 -5
  88. package/src/core/network/CachingRequestRegistry.ts +2 -2
  89. package/src/core/network/DeferredRequestRegistry.ts +4 -4
  90. package/src/core/runtime/runtime.ts +25 -20
  91. package/src/core/static/virtual-file-tracker.ts +5 -5
  92. package/src/core/wasm/__tests__/bridge.test.ts +2 -2
  93. package/src/core/wasm/bridge.ts +130 -126
  94. package/src/core/wasm/router.ts +5 -5
  95. package/src/core/wasm/store.ts +4 -4
  96. package/src/core/wasm/worker/bootstrap.ts +8 -5
  97. package/src/core/wasm/worker/message-buffer.ts +3 -3
  98. package/src/core/websocket/transports/__tests__/ws.test.ts +8 -8
  99. package/src/core/websocket/transports/basic.ts +15 -8
  100. package/src/core/websocket/transports/sse.ts +7 -7
  101. package/src/core/websocket/transports/transport.ts +3 -3
  102. package/src/core/websocket/transports/ws.ts +9 -7
  103. package/src/hooks/__tests__/useOverflowDetection.test.tsx +5 -5
  104. package/src/hooks/__tests__/useResizeObserver.test.tsx +12 -12
  105. package/src/plugins/core/registerReactComponent.tsx +5 -5
  106. package/src/plugins/core/sidebar-element.tsx +2 -2
  107. package/src/plugins/impl/ButtonPlugin.tsx +3 -3
  108. package/src/plugins/impl/CheckboxPlugin.tsx +3 -3
  109. package/src/plugins/impl/CodeEditorPlugin.tsx +3 -3
  110. package/src/plugins/impl/DatePickerPlugin.tsx +3 -3
  111. package/src/plugins/impl/DateRangePlugin.tsx +3 -3
  112. package/src/plugins/impl/DateTimePickerPlugin.tsx +3 -3
  113. package/src/plugins/impl/DictPlugin.tsx +3 -3
  114. package/src/plugins/impl/DropdownPlugin.tsx +3 -3
  115. package/src/plugins/impl/FileUploadPlugin.tsx +3 -3
  116. package/src/plugins/impl/MatrixPlugin.tsx +4 -4
  117. package/src/plugins/impl/MicrophonePlugin.tsx +3 -3
  118. package/src/plugins/impl/MultiselectPlugin.tsx +3 -3
  119. package/src/plugins/impl/NumberPlugin.tsx +3 -3
  120. package/src/plugins/impl/RadioPlugin.tsx +3 -3
  121. package/src/plugins/impl/RangeSliderPlugin.tsx +3 -3
  122. package/src/plugins/impl/RefreshPlugin.tsx +3 -3
  123. package/src/plugins/impl/SliderPlugin.tsx +3 -3
  124. package/src/plugins/impl/SwitchPlugin.tsx +3 -3
  125. package/src/plugins/impl/TabsPlugin.tsx +3 -3
  126. package/src/plugins/impl/TextAreaPlugin.tsx +3 -3
  127. package/src/plugins/impl/TextInputPlugin.tsx +3 -3
  128. package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +2 -2
  129. package/src/plugins/impl/anywidget/model.ts +10 -10
  130. package/src/plugins/impl/anywidget/registry.ts +12 -9
  131. package/src/plugins/impl/anywidget/runtime.ts +11 -9
  132. package/src/plugins/impl/anywidget/widget-binding.ts +6 -6
  133. package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +3 -3
  134. package/src/plugins/impl/matplotlib/__tests__/matplotlib-renderer.test.ts +2 -2
  135. package/src/plugins/impl/matplotlib/matplotlib-renderer.ts +2 -2
  136. package/src/plugins/impl/mpl-interactive/mpl-websocket-shim.ts +10 -10
  137. package/src/plugins/impl/panel/utils.ts +5 -5
  138. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +3 -3
  139. package/src/plugins/impl/vega/VegaPlugin.tsx +3 -3
  140. package/src/plugins/impl/vega/__tests__/use-vega-container-remeasure.test.ts +7 -7
  141. package/src/plugins/layout/AccordionPlugin.tsx +3 -3
  142. package/src/plugins/layout/CalloutPlugin.tsx +3 -3
  143. package/src/plugins/layout/ImageComparisonPlugin.tsx +5 -3
  144. package/src/plugins/layout/JsonOutputPlugin.tsx +3 -3
  145. package/src/plugins/layout/MimeRenderPlugin.tsx +3 -3
  146. package/src/plugins/layout/NavigationMenuPlugin.tsx +3 -3
  147. package/src/plugins/layout/OutlinePlugin.tsx +3 -3
  148. package/src/plugins/layout/ProgressPlugin.tsx +3 -3
  149. package/src/plugins/layout/RoutesPlugin.tsx +3 -3
  150. package/src/plugins/layout/StatPlugin.tsx +3 -3
  151. package/src/plugins/layout/TexPlugin.tsx +3 -3
  152. package/src/plugins/layout/carousel/CarouselPlugin.tsx +4 -4
  153. package/src/plugins/layout/mermaid/MermaidPlugin.tsx +3 -3
  154. package/src/utils/Deferred.ts +6 -6
  155. package/src/utils/async-capture-tracker.ts +10 -7
  156. package/src/utils/errors.ts +5 -5
  157. package/src/utils/id-tree.tsx +83 -80
  158. package/src/utils/lru.ts +1 -1
  159. package/src/utils/multi-map.ts +14 -12
  160. package/src/utils/paths.ts +6 -6
  161. package/src/utils/pluralize.ts +3 -3
  162. package/src/utils/progress.ts +6 -6
  163. package/src/utils/python-poet/poet.ts +14 -14
  164. package/src/utils/routes.ts +4 -2
  165. package/src/utils/semaphore.ts +6 -6
  166. package/src/utils/storage/storage.ts +6 -6
  167. package/src/utils/storage/typed.ts +16 -12
  168. package/src/utils/time.ts +9 -9
  169. package/src/utils/timed-cache.ts +4 -4
  170. package/src/utils/tracer.ts +9 -6
@@ -57,7 +57,7 @@ class MetaUnderlineVariablePlugin {
57
57
  private hoveredRange: { from: number; to: number; position: number } | null;
58
58
  private onClick: (view: EditorView) => void;
59
59
 
60
- constructor(view: EditorView, onClick: (view: EditorView) => void) {
60
+ public constructor(view: EditorView, onClick: (view: EditorView) => void) {
61
61
  this.view = view;
62
62
  this.commandClickMode = false;
63
63
  this.hoveredRange = null;
@@ -69,13 +69,13 @@ class MetaUnderlineVariablePlugin {
69
69
  window.addEventListener("mouseleave", this.windowBlur);
70
70
  }
71
71
 
72
- update(_update: ViewUpdate) {
72
+ public update(_update: ViewUpdate) {
73
73
  // We cannot add any transactions here (e.g. clearing underlines),
74
74
  // otherwise CM fails with
75
75
  // "Calls to EditorView.update are not allowed while an update is in progress"
76
76
  }
77
77
 
78
- destroy() {
78
+ public destroy() {
79
79
  window.removeEventListener("keydown", this.keydown);
80
80
  window.removeEventListener("keyup", this.keyup);
81
81
  window.removeEventListener("blur", this.windowBlur);
@@ -346,7 +346,7 @@ class CodeMirrorVimSync {
346
346
  // noop
347
347
  }
348
348
 
349
- addInstance(instance: EditorView) {
349
+ public addInstance(instance: EditorView) {
350
350
  this.instances.add(instance);
351
351
 
352
352
  const cm = getCM(instance);
@@ -376,11 +376,11 @@ class CodeMirrorVimSync {
376
376
  });
377
377
  }
378
378
 
379
- removeInstance(instance: EditorView) {
379
+ public removeInstance(instance: EditorView) {
380
380
  this.instances.delete(instance);
381
381
  }
382
382
 
383
- broadcastModeChange(
383
+ public broadcastModeChange(
384
384
  originInstance: EditorView,
385
385
  mode: string,
386
386
  subMode?: string,
@@ -41,23 +41,23 @@ export const MARKDOWN_INITIAL_HIDE_CODE = true;
41
41
  export class MarkdownLanguageAdapter implements LanguageAdapter<MarkdownLanguageAdapterMetadata> {
42
42
  private parser = new MarkdownParser();
43
43
 
44
- readonly type = "markdown";
45
- readonly defaultCode = this.parser.defaultCode;
46
- readonly defaultMetadata: MarkdownLanguageAdapterMetadata =
44
+ public readonly type = "markdown";
45
+ public readonly defaultCode = this.parser.defaultCode;
46
+ public readonly defaultMetadata: MarkdownLanguageAdapterMetadata =
47
47
  this.parser.defaultMetadata;
48
48
 
49
- static fromMarkdown(markdown: string) {
49
+ public static fromMarkdown(markdown: string) {
50
50
  return MarkdownParser.fromMarkdown(markdown);
51
51
  }
52
52
 
53
- transformIn(
53
+ public transformIn(
54
54
  pythonCode: string,
55
55
  ): [string, number, MarkdownLanguageAdapterMetadata] {
56
56
  const result = this.parser.transformIn(pythonCode);
57
57
  return [result.code, result.offset, result.metadata];
58
58
  }
59
59
 
60
- transformOut(
60
+ public transformOut(
61
61
  code: string,
62
62
  metadata: MarkdownLanguageAdapterMetadata,
63
63
  ): [string, number] {
@@ -65,11 +65,11 @@ export class MarkdownLanguageAdapter implements LanguageAdapter<MarkdownLanguage
65
65
  return [result.code, result.offset];
66
66
  }
67
67
 
68
- isSupported(pythonCode: string): boolean {
68
+ public isSupported(pythonCode: string): boolean {
69
69
  return this.parser.isSupported(pythonCode);
70
70
  }
71
71
 
72
- getExtension(
72
+ public getExtension(
73
73
  _cellId: CellId,
74
74
  _completionConfig: CompletionConfig,
75
75
  hotkeys: HotkeyProvider,
@@ -261,25 +261,25 @@ const pyrightClient = once((_: LSPConfig) => {
261
261
  export class PythonLanguageAdapter implements LanguageAdapter<{}> {
262
262
  private parser = new PythonParser();
263
263
 
264
- readonly type = "python";
265
- readonly defaultCode = this.parser.defaultCode;
266
- readonly defaultMetadata = this.parser.defaultMetadata;
264
+ public readonly type = "python";
265
+ public readonly defaultCode = this.parser.defaultCode;
266
+ public readonly defaultMetadata = this.parser.defaultMetadata;
267
267
 
268
- transformIn(code: string): [string, number, {}] {
268
+ public transformIn(code: string): [string, number, {}] {
269
269
  const result = this.parser.transformIn(code);
270
270
  return [result.code, result.offset, result.metadata];
271
271
  }
272
272
 
273
- transformOut(code: string, metadata: {}): [string, number] {
273
+ public transformOut(code: string, metadata: {}): [string, number] {
274
274
  const result = this.parser.transformOut(code, metadata);
275
275
  return [result.code, result.offset];
276
276
  }
277
277
 
278
- isSupported(code: string): boolean {
278
+ public isSupported(code: string): boolean {
279
279
  return this.parser.isSupported(code);
280
280
  }
281
281
 
282
- getExtension(
282
+ public getExtension(
283
283
  cellId: CellId,
284
284
  completionConfig: CompletionConfig,
285
285
  hotkeys: HotkeyProvider,
@@ -25,7 +25,7 @@ export class CompletionBuilder {
25
25
  /**
26
26
  * Add a table with its columns at the specified path
27
27
  */
28
- addTable(path: string[], table: DataTable): this {
28
+ public addTable(path: string[], table: DataTable): this {
29
29
  const tableNamespace: SQLNamespace = {
30
30
  self: tableToCompletion({
31
31
  table: table,
@@ -44,7 +44,7 @@ export class CompletionBuilder {
44
44
  /**
45
45
  * Add a schema at the specified path
46
46
  */
47
- addSchema(path: string[], schema: DatabaseSchema): this {
47
+ public addSchema(path: string[], schema: DatabaseSchema): this {
48
48
  const schemaObject: SQLNamespace = {
49
49
  self: schemaToCompletion({
50
50
  namespace: schema,
@@ -60,7 +60,7 @@ export class CompletionBuilder {
60
60
  /**
61
61
  * Add a database at the specified path
62
62
  */
63
- addDatabase(path: string[], database: Database): this {
63
+ public addDatabase(path: string[], database: Database): this {
64
64
  const databaseObject: SQLNamespace = {
65
65
  self: databaseToCompletion({
66
66
  namespace: database,
@@ -90,14 +90,14 @@ export class CompletionBuilder {
90
90
  /**
91
91
  * Build the final schema
92
92
  */
93
- build(): SQLNamespace {
93
+ public build(): SQLNamespace {
94
94
  return this.schema;
95
95
  }
96
96
 
97
97
  /**
98
98
  * Reset for reuse
99
99
  */
100
- reset(): this {
100
+ public reset(): this {
101
101
  this.schema = {};
102
102
  return this;
103
103
  }
@@ -28,7 +28,7 @@ const datasetTableCompletionsAtom = atom((get) => {
28
28
  class SQLCompletionStore {
29
29
  private cache: LRUCache<DataSourceConnection, CachedSchema>;
30
30
 
31
- constructor() {
31
+ public constructor() {
32
32
  this.cache = new LRUCache(10, {
33
33
  create: (connection) => this.getConnectionSchema(connection),
34
34
  });
@@ -121,7 +121,7 @@ class SQLCompletionStore {
121
121
  * Returns the raw dialect of the connection passed from the backend,
122
122
  * or null if the connection is not found
123
123
  */
124
- getInternalDialect(connectionName: ConnectionName): string | null {
124
+ public getInternalDialect(connectionName: ConnectionName): string | null {
125
125
  const connection = this.getConnection(connectionName);
126
126
  if (!connection) {
127
127
  return null;
@@ -133,7 +133,7 @@ class SQLCompletionStore {
133
133
  * Get the inferred SQL dialect for a connection
134
134
  * If the connection is not found, return the standard SQL dialect.
135
135
  */
136
- getDialect(connectionName: ConnectionName): SQLDialect {
136
+ public getDialect(connectionName: ConnectionName): SQLDialect {
137
137
  const connection = this.getConnection(connectionName);
138
138
  if (!connection) {
139
139
  return ModifiedStandardSQL;
@@ -141,7 +141,7 @@ class SQLCompletionStore {
141
141
  return guessDialect(connection);
142
142
  }
143
143
 
144
- getCompletionSource(connectionName: ConnectionName): SQLConfig | null {
144
+ public getCompletionSource(connectionName: ConnectionName): SQLConfig | null {
145
145
  const connection = this.getConnection(connectionName);
146
146
  if (!connection) {
147
147
  return null;
@@ -99,21 +99,21 @@ function getLatestEngine(): ConnectionName {
99
99
  */
100
100
  export class SQLLanguageAdapter implements LanguageAdapter<SQLLanguageAdapterMetadata> {
101
101
  private parser = new SQLParser();
102
- readonly type = "sql";
103
- sqlModeEnabled: boolean;
102
+ public readonly type = "sql";
103
+ public sqlModeEnabled: boolean;
104
104
 
105
- constructor() {
105
+ public constructor() {
106
106
  this.sqlModeEnabled = true;
107
107
  }
108
108
 
109
- get defaultMetadata(): SQLLanguageAdapterMetadata {
109
+ public get defaultMetadata(): SQLLanguageAdapterMetadata {
110
110
  return {
111
111
  ...this.parser.defaultMetadata,
112
112
  engine: getLatestEngine() || DUCKDB_ENGINE,
113
113
  };
114
114
  }
115
115
 
116
- get defaultCode(): string {
116
+ public get defaultCode(): string {
117
117
  const engine = getLatestEngine();
118
118
  if (engine && engine !== DUCKDB_ENGINE) {
119
119
  return `_df = mo.sql(f"""SELECT * FROM """, engine=${engine})`;
@@ -121,9 +121,9 @@ export class SQLLanguageAdapter implements LanguageAdapter<SQLLanguageAdapterMet
121
121
  return this.parser.defaultCode;
122
122
  }
123
123
 
124
- static fromQuery = (query: string) => SQLParser.fromQuery(query);
124
+ public static fromQuery = (query: string) => SQLParser.fromQuery(query);
125
125
 
126
- transformIn(
126
+ public transformIn(
127
127
  pythonCode: string,
128
128
  ): [
129
129
  sqlQuery: string,
@@ -143,7 +143,7 @@ export class SQLLanguageAdapter implements LanguageAdapter<SQLLanguageAdapterMet
143
143
  return [result.code, result.offset, metadata];
144
144
  }
145
145
 
146
- transformOut(
146
+ public transformOut(
147
147
  code: string,
148
148
  metadata: SQLLanguageAdapterMetadata,
149
149
  ): [string, number] {
@@ -151,11 +151,11 @@ export class SQLLanguageAdapter implements LanguageAdapter<SQLLanguageAdapterMet
151
151
  return [result.code, result.offset];
152
152
  }
153
153
 
154
- isSupported(pythonCode: string): boolean {
154
+ public isSupported(pythonCode: string): boolean {
155
155
  return this.parser.isSupported(pythonCode);
156
156
  }
157
157
 
158
- getExtension(
158
+ public getExtension(
159
159
  _cellId: CellId,
160
160
  _completionConfig: CompletionConfig,
161
161
  _hotkeys: HotkeyProvider,
@@ -309,19 +309,19 @@ class DialectAwareQueryContextAnalyzer extends QueryContextAnalyzer {
309
309
  private readonly analyzers = new Map<ParserDialects, QueryContextAnalyzer>();
310
310
  private readonly analysisParser: NodeSqlParser;
311
311
 
312
- constructor(analysisParser: NodeSqlParser) {
312
+ public constructor(analysisParser: NodeSqlParser) {
313
313
  super(analysisParser);
314
314
  this.analysisParser = analysisParser;
315
315
  }
316
316
 
317
- override getContext(
317
+ public override getContext(
318
318
  sql: string,
319
319
  opts: { state: EditorState },
320
320
  ): ReturnType<QueryContextAnalyzer["getContext"]> {
321
321
  return this.getAnalyzer(opts.state).getContext(sql, opts);
322
322
  }
323
323
 
324
- override clearCache(): void {
324
+ public override clearCache(): void {
325
325
  for (const analyzer of this.analyzers.values()) {
326
326
  analyzer.clearCache();
327
327
  }
@@ -342,25 +342,25 @@ class DialectAwareSqlStructureAnalyzer extends SqlStructureAnalyzer {
342
342
  private readonly analyzers = new Map<ParserDialects, SqlStructureAnalyzer>();
343
343
  private readonly analysisParser: NodeSqlParser;
344
344
 
345
- constructor(analysisParser: NodeSqlParser) {
345
+ public constructor(analysisParser: NodeSqlParser) {
346
346
  super(analysisParser);
347
347
  this.analysisParser = analysisParser;
348
348
  }
349
349
 
350
- override analyzeDocument(
350
+ public override analyzeDocument(
351
351
  state: EditorState,
352
352
  ): ReturnType<SqlStructureAnalyzer["analyzeDocument"]> {
353
353
  return this.getAnalyzer(state).analyzeDocument(state);
354
354
  }
355
355
 
356
- override getStatementAtPosition(
356
+ public override getStatementAtPosition(
357
357
  state: EditorState,
358
358
  position: number,
359
359
  ): ReturnType<SqlStructureAnalyzer["getStatementAtPosition"]> {
360
360
  return this.getAnalyzer(state).getStatementAtPosition(state, position);
361
361
  }
362
362
 
363
- override getStatementsInRange(
363
+ public override getStatementsInRange(
364
364
  state: EditorState,
365
365
  from: number,
366
366
  to: number,
@@ -368,7 +368,7 @@ class DialectAwareSqlStructureAnalyzer extends SqlStructureAnalyzer {
368
368
  return this.getAnalyzer(state).getStatementsInRange(state, from, to);
369
369
  }
370
370
 
371
- override clearCache(): void {
371
+ public override clearCache(): void {
372
372
  for (const analyzer of this.analyzers.values()) {
373
373
  analyzer.clearCache();
374
374
  }
@@ -392,7 +392,7 @@ class CustomSqlParser extends NodeSqlParser {
392
392
  private readonly VALIDATION_DELAY_MS = 300; // Wait 300ms after user stops typing
393
393
  private isFocused = false; // Only validate if the editor is focused
394
394
 
395
- setFocusState(focused: boolean) {
395
+ public setFocusState(focused: boolean) {
396
396
  this.isFocused = focused;
397
397
  }
398
398
 
@@ -446,7 +446,7 @@ class CustomSqlParser extends NodeSqlParser {
446
446
  });
447
447
  }
448
448
 
449
- override async validateSql(
449
+ public override async validateSql(
450
450
  sql: string,
451
451
  opts: { state: EditorState },
452
452
  ): Promise<SqlParseError[]> {
@@ -470,7 +470,7 @@ class CustomSqlParser extends NodeSqlParser {
470
470
  );
471
471
  }
472
472
 
473
- override async parse(
473
+ public override async parse(
474
474
  sql: string,
475
475
  opts: { state: EditorState },
476
476
  ): Promise<NodeSqlParserResult> {
@@ -17,38 +17,38 @@ vi.mock("../../../runtime/config", () => ({
17
17
 
18
18
  /** Minimal stand-in for the browser WebSocket used by `WebSocketTransport`. */
19
19
  class FakeWebSocket {
20
- static readonly instances: FakeWebSocket[] = [];
21
- static readonly OPEN = 1;
20
+ public static readonly instances: FakeWebSocket[] = [];
21
+ public static readonly OPEN = 1;
22
22
 
23
- readyState = 0;
24
- readonly url: string;
23
+ public readyState = 0;
24
+ public readonly url: string;
25
25
  private readonly listeners = new Map<string, Set<(event: unknown) => void>>();
26
26
 
27
- constructor(url: string) {
27
+ public constructor(url: string) {
28
28
  this.url = url;
29
29
  FakeWebSocket.instances.push(this);
30
30
  }
31
31
 
32
- addEventListener(type: string, listener: (event: unknown) => void) {
32
+ public addEventListener(type: string, listener: (event: unknown) => void) {
33
33
  const listeners = this.listeners.get(type) ?? new Set();
34
34
  listeners.add(listener);
35
35
  this.listeners.set(type, listeners);
36
36
  }
37
37
 
38
- send() {
38
+ public send() {
39
39
  // no-op
40
40
  }
41
41
 
42
- close() {
42
+ public close() {
43
43
  this.readyState = 3;
44
44
  }
45
45
 
46
- open() {
46
+ public open() {
47
47
  this.readyState = FakeWebSocket.OPEN;
48
48
  this.emit("open", {});
49
49
  }
50
50
 
51
- receive(message: unknown) {
51
+ public receive(message: unknown) {
52
52
  this.emit("message", { data: JSON.stringify(message) });
53
53
  }
54
54
 
@@ -18,12 +18,12 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
18
18
  private readonly clients: ILanguageServerClient[] = [];
19
19
  public readonly documentUri: string;
20
20
 
21
- constructor(clients: ILanguageServerClient[]) {
21
+ public constructor(clients: ILanguageServerClient[]) {
22
22
  this.clients = clients;
23
23
  this.documentUri = getLspDocumentUri();
24
24
  }
25
25
 
26
- onNotification(
26
+ public onNotification(
27
27
  listener: (n: {
28
28
  jsonrpc: "2.0";
29
29
  id?: null | undefined;
@@ -43,7 +43,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
43
43
  };
44
44
  }
45
45
 
46
- get clientCapabilities(): LSP.ClientCapabilities | undefined {
46
+ public get clientCapabilities(): LSP.ClientCapabilities | undefined {
47
47
  const capabilities = this.clients
48
48
  .map((client) => {
49
49
  if (client.clientCapabilities) {
@@ -59,34 +59,34 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
59
59
  return mergeDictsIgnoreFalsey<LSP.ClientCapabilities>(capabilities);
60
60
  }
61
61
 
62
- get ready(): boolean {
62
+ public get ready(): boolean {
63
63
  return this.clients.some((client) => client.ready);
64
64
  }
65
65
 
66
- set ready(value: boolean) {
66
+ public set ready(value: boolean) {
67
67
  this.clients.forEach((client) => {
68
68
  client.ready = value;
69
69
  });
70
70
  }
71
71
 
72
- get capabilities(): LSP.ServerCapabilities | null {
72
+ public get capabilities(): LSP.ServerCapabilities | null {
73
73
  const capabilities = this.clients
74
74
  .map((client) => client.capabilities)
75
75
  .filter((c): c is LSP.ServerCapabilities => c !== null);
76
76
  return mergeDictsIgnoreFalsey<LSP.ServerCapabilities>(capabilities);
77
77
  }
78
78
 
79
- set capabilities(value: LSP.ServerCapabilities) {
79
+ public set capabilities(value: LSP.ServerCapabilities) {
80
80
  this.clients.forEach((client) => {
81
81
  client.capabilities = value;
82
82
  });
83
83
  }
84
84
 
85
- get initializePromise(): Promise<void> {
85
+ public get initializePromise(): Promise<void> {
86
86
  return this.clients[0].initializePromise;
87
87
  }
88
88
 
89
- set initializePromise(value: Promise<void>) {
89
+ public set initializePromise(value: Promise<void>) {
90
90
  this.clients.forEach((client) => {
91
91
  client.initializePromise = value;
92
92
  });
@@ -104,19 +104,19 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
104
104
  return this.clients.filter((client) => client.hasCapability(method));
105
105
  }
106
106
 
107
- hasCapability(method: string): boolean {
107
+ public hasCapability(method: string): boolean {
108
108
  return this.clients.some((client) => client.hasCapability(method));
109
109
  }
110
110
 
111
- async initialize(): Promise<void> {
111
+ public async initialize(): Promise<void> {
112
112
  await Promise.all(this.clients.map((client) => client.initialize()));
113
113
  }
114
114
 
115
- async close(): Promise<void> {
115
+ public async close(): Promise<void> {
116
116
  await Promise.all(this.clients.map((client) => client.close()));
117
117
  }
118
118
 
119
- async textDocumentDidChange(
119
+ public async textDocumentDidChange(
120
120
  params: LSP.DidChangeTextDocumentParams,
121
121
  ): Promise<void> {
122
122
  await Promise.all(
@@ -124,7 +124,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
124
124
  );
125
125
  }
126
126
 
127
- async completionItemResolve(
127
+ public async completionItemResolve(
128
128
  item: LSP.CompletionItem,
129
129
  ): Promise<LSP.CompletionItem> {
130
130
  const client = this.firstWithMethod("textDocument/completion");
@@ -134,7 +134,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
134
134
  return item;
135
135
  }
136
136
 
137
- async textDocumentCodeAction(
137
+ public async textDocumentCodeAction(
138
138
  params: LSP.CodeActionParams,
139
139
  ): Promise<(LSP.Command | LSP.CodeAction)[] | null> {
140
140
  const client = this.firstWithMethod("textDocument/codeAction");
@@ -144,12 +144,14 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
144
144
  return null;
145
145
  }
146
146
 
147
- async codeActionResolve(action: LSP.CodeAction): Promise<LSP.CodeAction> {
147
+ public async codeActionResolve(
148
+ action: LSP.CodeAction,
149
+ ): Promise<LSP.CodeAction> {
148
150
  const client = this.firstWithMethod("textDocument/codeAction");
149
151
  return client ? client.codeActionResolve(action) : action;
150
152
  }
151
153
 
152
- async textDocumentRename(
154
+ public async textDocumentRename(
153
155
  params: LSP.RenameParams,
154
156
  ): Promise<LSP.WorkspaceEdit | null> {
155
157
  const client = this.firstWithMethod("textDocument/rename");
@@ -159,7 +161,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
159
161
  return null;
160
162
  }
161
163
 
162
- async textDocumentPrepareRename(
164
+ public async textDocumentPrepareRename(
163
165
  params: LSP.PrepareRenameParams,
164
166
  ): Promise<LSP.PrepareRenameResult | null> {
165
167
  const client = this.firstWithMethod("textDocument/prepareRename");
@@ -169,7 +171,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
169
171
  return null;
170
172
  }
171
173
 
172
- async textDocumentSignatureHelp(
174
+ public async textDocumentSignatureHelp(
173
175
  params: LSP.SignatureHelpParams,
174
176
  ): Promise<LSP.SignatureHelp | null> {
175
177
  const client = this.firstWithMethod("textDocument/signatureHelp");
@@ -180,7 +182,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
180
182
  }
181
183
 
182
184
  // Merge completions from all clients
183
- async textDocumentCompletion(
185
+ public async textDocumentCompletion(
184
186
  params: LSP.CompletionParams,
185
187
  ): Promise<LSP.CompletionList | LSP.CompletionItem[] | null> {
186
188
  const clients = this.clientsWithMethod("textDocument/completion");
@@ -191,7 +193,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
191
193
  return mergeCompletions(results);
192
194
  }
193
195
 
194
- async textDocumentDefinition(
196
+ public async textDocumentDefinition(
195
197
  params: LSP.DefinitionParams,
196
198
  ): Promise<LSP.Definition | LSP.LocationLink[] | null> {
197
199
  const client = this.firstWithMethod("textDocument/definition");
@@ -201,7 +203,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
201
203
  return null;
202
204
  }
203
205
 
204
- async textDocumentDidOpen(
206
+ public async textDocumentDidOpen(
205
207
  params: LSP.DidOpenTextDocumentParams,
206
208
  ): Promise<boolean> {
207
209
  const results = await Promise.all(
@@ -211,7 +213,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
211
213
  return results.some((result) => result !== false);
212
214
  }
213
215
 
214
- async textDocumentDidClose(
216
+ public async textDocumentDidClose(
215
217
  params: LSP.DidCloseTextDocumentParams,
216
218
  ): Promise<void> {
217
219
  await Promise.all(
@@ -219,7 +221,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
219
221
  );
220
222
  }
221
223
 
222
- async textDocumentWillSave(
224
+ public async textDocumentWillSave(
223
225
  params: LSP.WillSaveTextDocumentParams,
224
226
  ): Promise<void> {
225
227
  await Promise.all(
@@ -227,7 +229,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
227
229
  );
228
230
  }
229
231
 
230
- async textDocumentWillSaveWaitUntil(
232
+ public async textDocumentWillSaveWaitUntil(
231
233
  params: LSP.WillSaveTextDocumentParams,
232
234
  ): Promise<LSP.TextEdit[] | null> {
233
235
  // This blocks the save, so query concurrently rather than paying the sum of
@@ -247,7 +249,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
247
249
  return null;
248
250
  }
249
251
 
250
- async textDocumentDidSave(
252
+ public async textDocumentDidSave(
251
253
  params: LSP.DidSaveTextDocumentParams,
252
254
  ): Promise<void> {
253
255
  await Promise.all(
@@ -255,7 +257,7 @@ export class FederatedLanguageServerClient implements ILanguageServerClient {
255
257
  );
256
258
  }
257
259
 
258
- async textDocumentHover(params: LSP.HoverParams): Promise<LSP.Hover> {
260
+ public async textDocumentHover(params: LSP.HoverParams): Promise<LSP.Hover> {
259
261
  for (const client of this.clients) {
260
262
  if (!client.hasCapability("textDocument/hover")) {
261
263
  continue;