@eclipse-lyra/extension-sqleditor 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ export type { SqlConnectionInfo, SqlDatabaseExtensionInfo, SqlAdapterAction, SqlDatabase, SqlAdapterContribution, } from './sql-api';
2
+ export { TARGET_SQL_ADAPTERS } from './sql-api';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,WAAW,EACX,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ import { extensionRegistry } from "@eclipse-lyra/core";
2
+ import pkg from "../package.json";
3
+ const TARGET_SQL_ADAPTERS = "system.sqladapters";
4
+ extensionRegistry.registerExtension({
5
+ id: pkg.name,
6
+ name: "SQL Editor",
7
+ description: "Generic SQL editor with pluggable backends",
8
+ loader: () => import("./sqleditor-extension-DQrJIYDT.js"),
9
+ icon: "database"
10
+ });
11
+ export {
12
+ TARGET_SQL_ADAPTERS
13
+ };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/sql-api.ts","../src/index.ts"],"sourcesContent":["export const TARGET_SQL_ADAPTERS = 'system.sqladapters';\n\nexport interface SqlConnectionInfo {\n id: string | null;\n label: string;\n isDefault?: boolean;\n}\n\nexport interface SqlDatabaseExtensionInfo {\n id: string;\n label: string;\n description?: string;\n installed?: boolean;\n}\n\nexport interface SqlAdapterAction {\n id: string;\n label: string;\n icon?: string;\n run(): Promise<void>;\n}\n\nexport interface SqlDatabase {\n readonly engineId: string;\n readonly currentConnectionId: string | null;\n\n listConnections(): Promise<SqlConnectionInfo[]>;\n selectConnection(id: string | null): Promise<void>;\n runQuery(sql: string): Promise<{ columns: string[]; rows: unknown[][] }>;\n\n createConnection?(): Promise<SqlConnectionInfo | null>;\n deleteConnection?(id: string): Promise<void>;\n\n extraActions?: SqlAdapterAction[];\n\n listDbExtensions?(): Promise<SqlDatabaseExtensionInfo[]>;\n enableDbExtension?(id: string): Promise<void>;\n disableDbExtension?(id: string): Promise<void>;\n\n close(): Promise<void> | void;\n}\n\nexport interface SqlAdapterContribution {\n id: string;\n label: string;\n icon?: string;\n loader: () => Promise<SqlDatabase>;\n}\n\n","import { extensionRegistry } from '@eclipse-lyra/core';\nimport pkg from '../package.json';\nexport type {\n SqlConnectionInfo,\n SqlDatabaseExtensionInfo,\n SqlAdapterAction,\n SqlDatabase,\n SqlAdapterContribution,\n} from './sql-api';\nexport { TARGET_SQL_ADAPTERS } from './sql-api';\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: 'SQL Editor',\n description: 'Generic SQL editor with pluggable backends',\n loader: () => import('./sqleditor-extension'),\n icon: 'database',\n});\n\n"],"names":[],"mappings":";;AAAO,MAAM,sBAAsB;ACWnC,kBAAkB,kBAAkB;AAAA,EAClC,IAAI,IAAI;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ,MAAM,OAAO,mCAAuB;AAAA,EAC5C,MAAM;AACR,CAAC;"}
@@ -0,0 +1,42 @@
1
+ export declare const TARGET_SQL_ADAPTERS = "system.sqladapters";
2
+ export interface SqlConnectionInfo {
3
+ id: string | null;
4
+ label: string;
5
+ isDefault?: boolean;
6
+ }
7
+ export interface SqlDatabaseExtensionInfo {
8
+ id: string;
9
+ label: string;
10
+ description?: string;
11
+ installed?: boolean;
12
+ }
13
+ export interface SqlAdapterAction {
14
+ id: string;
15
+ label: string;
16
+ icon?: string;
17
+ run(): Promise<void>;
18
+ }
19
+ export interface SqlDatabase {
20
+ readonly engineId: string;
21
+ readonly currentConnectionId: string | null;
22
+ listConnections(): Promise<SqlConnectionInfo[]>;
23
+ selectConnection(id: string | null): Promise<void>;
24
+ runQuery(sql: string): Promise<{
25
+ columns: string[];
26
+ rows: unknown[][];
27
+ }>;
28
+ createConnection?(): Promise<SqlConnectionInfo | null>;
29
+ deleteConnection?(id: string): Promise<void>;
30
+ extraActions?: SqlAdapterAction[];
31
+ listDbExtensions?(): Promise<SqlDatabaseExtensionInfo[]>;
32
+ enableDbExtension?(id: string): Promise<void>;
33
+ disableDbExtension?(id: string): Promise<void>;
34
+ close(): Promise<void> | void;
35
+ }
36
+ export interface SqlAdapterContribution {
37
+ id: string;
38
+ label: string;
39
+ icon?: string;
40
+ loader: () => Promise<SqlDatabase>;
41
+ }
42
+ //# sourceMappingURL=sql-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-api.d.ts","sourceRoot":"","sources":["../src/sql-api.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5C,eAAe,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChD,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;KAAE,CAAC,CAAC;IAEzE,gBAAgB,CAAC,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IACvD,gBAAgB,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAElC,gBAAgB,CAAC,IAAI,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACzD,iBAAiB,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,kBAAkB,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;CACpC"}
@@ -0,0 +1,46 @@
1
+ import { LyraPart, EditorInput, EditorContentProvider } from '@eclipse-lyra/core';
2
+ export declare class LyraSqlEditor extends LyraPart implements EditorContentProvider {
3
+ input?: EditorInput;
4
+ readOnly: boolean;
5
+ private initialContent;
6
+ private initialUri;
7
+ private running;
8
+ private availableAdapters;
9
+ private selectedEngineId;
10
+ private availableConnections;
11
+ private selectedConnectionId;
12
+ private widgetRef;
13
+ private databases;
14
+ private unsubscribeContributionsToken?;
15
+ protected doInitUI(): Promise<void>;
16
+ private refreshAdapters;
17
+ private getOrLoadDatabase;
18
+ private refreshConnections;
19
+ private onEngineChange;
20
+ private onConnectionChange;
21
+ private _onContentChange;
22
+ save(): void;
23
+ protected doClose(): Promise<void>;
24
+ getLanguage(): string | null;
25
+ isLanguage(lang: string): boolean;
26
+ getContent(): string | null;
27
+ getSelection(): string | null;
28
+ getSnippet(lines?: number): {
29
+ snippet: string;
30
+ cursorLine: number;
31
+ } | null;
32
+ getFilePath(): string | null;
33
+ private runQuery;
34
+ private clearRunningState;
35
+ private createConnection;
36
+ private deleteConnection;
37
+ protected renderToolbar(): import('lit-html').TemplateResult<1>;
38
+ render(): import('lit-html').TemplateResult<1>;
39
+ static styles: import('lit').CSSResult;
40
+ }
41
+ declare global {
42
+ interface HTMLElementTagNameMap {
43
+ 'lyra-sql-editor': LyraSqlEditor;
44
+ }
45
+ }
46
+ //# sourceMappingURL=sql-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-editor.d.ts","sourceRoot":"","sources":["../src/sql-editor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,qBAAqB,EAA6H,MAAM,oBAAoB,CAAC;AAkBvN,qBACa,aAAc,SAAQ,QAAS,YAAW,qBAAqB;IAEnE,KAAK,CAAC,EAAE,WAAW,CAAC;IAGpB,QAAQ,UAAS;IAGxB,OAAO,CAAC,cAAc,CAAiC;IAGvD,OAAO,CAAC,UAAU,CAAiC;IAGnD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,iBAAiB,CAAgC;IAGzD,OAAO,CAAC,gBAAgB,CAAuB;IAG/C,OAAO,CAAC,oBAAoB,CAA2B;IAGvD,OAAO,CAAC,oBAAoB,CAAuB;IAEnD,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,6BAA6B,CAAC,CAAS;cAE/B,QAAQ;YAeV,eAAe;YAkBf,iBAAiB;YAejB,kBAAkB;YA+BlB,cAAc;YAUd,kBAAkB;IAehC,OAAO,CAAC,gBAAgB,CAEtB;IAEF,IAAI,IAAI,IAAI;cAMI,OAAO;IAYhB,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,UAAU,CAAC,KAAK,GAAE,MAAU,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI7E,WAAW,IAAI,MAAM,GAAG,IAAI;YAIrB,QAAQ;IAuDtB,OAAO,CAAC,iBAAiB;YAOX,gBAAgB;YAehB,gBAAgB;IAqB9B,SAAS,CAAC,aAAa;IAwEvB,MAAM;IAmBN,MAAM,CAAC,MAAM,0BA+BX;CACH;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,aAAa,CAAC;KAClC;CACF"}
@@ -0,0 +1,427 @@
1
+ import { LyraPart, subscribe, TOPIC_CONTRIBUTEIONS_CHANGED, contributionRegistry, toastError, unsubscribe, publish, toastInfo, confirmDialog, editorRegistry, File } from "@eclipse-lyra/core";
2
+ import { html as html$1 } from "@eclipse-lyra/core/externals/lit";
3
+ import { property, state, customElement } from "lit/decorators.js";
4
+ import { css, html } from "lit";
5
+ import { createRef, ref } from "lit/directives/ref.js";
6
+ var __defProp = Object.defineProperty;
7
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
+ var __decorateClass = (decorators, target, key, kind) => {
9
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
10
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
11
+ if (decorator = decorators[i])
12
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
13
+ if (kind && result) __defProp(target, key, result);
14
+ return result;
15
+ };
16
+ const MAX_TAB_LABEL = 28;
17
+ function truncateLabel(sql) {
18
+ const oneLine = sql.replace(/\s+/g, " ").trim();
19
+ if (oneLine.length <= MAX_TAB_LABEL) return oneLine;
20
+ return `${oneLine.slice(0, MAX_TAB_LABEL)}…`;
21
+ }
22
+ let LyraSqlEditor = class extends LyraPart {
23
+ constructor() {
24
+ super(...arguments);
25
+ this.readOnly = false;
26
+ this.initialContent = void 0;
27
+ this.initialUri = void 0;
28
+ this.running = false;
29
+ this.availableAdapters = [];
30
+ this.selectedEngineId = null;
31
+ this.availableConnections = [];
32
+ this.selectedConnectionId = null;
33
+ this.widgetRef = createRef();
34
+ this.databases = /* @__PURE__ */ new Map();
35
+ this._onContentChange = () => {
36
+ this.markDirty(true);
37
+ };
38
+ }
39
+ async doInitUI() {
40
+ const file = this.input.data;
41
+ const textContents = await file.getContents();
42
+ this.initialContent = textContents;
43
+ this.initialUri = file.getName();
44
+ this.unsubscribeContributionsToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event) => {
45
+ if (event?.target === "system.sqladapters") {
46
+ void this.refreshAdapters();
47
+ }
48
+ });
49
+ await this.refreshAdapters();
50
+ this.requestUpdate();
51
+ }
52
+ async refreshAdapters() {
53
+ const contributions = contributionRegistry.getContributions("system.sqladapters");
54
+ this.availableAdapters = contributions;
55
+ if (!contributions.length) {
56
+ this.selectedEngineId = null;
57
+ this.availableConnections = [];
58
+ this.selectedConnectionId = null;
59
+ this.updateToolbar();
60
+ return;
61
+ }
62
+ if (!this.selectedEngineId) {
63
+ const duckdbAdapter = contributions.find((c) => c.id === "duckdb");
64
+ this.selectedEngineId = (duckdbAdapter ?? contributions[0]).id;
65
+ }
66
+ await this.refreshConnections();
67
+ this.updateToolbar();
68
+ }
69
+ async getOrLoadDatabase(engineId) {
70
+ const cached = this.databases.get(engineId);
71
+ if (cached) return cached;
72
+ const adapter = this.availableAdapters.find((c) => c.id === engineId);
73
+ if (!adapter) return null;
74
+ try {
75
+ const database = await adapter.loader();
76
+ this.databases.set(engineId, database);
77
+ return database;
78
+ } catch (err) {
79
+ toastError(err instanceof Error ? err.message : String(err));
80
+ return null;
81
+ }
82
+ }
83
+ async refreshConnections() {
84
+ const engineId = this.selectedEngineId;
85
+ if (!engineId) {
86
+ this.availableConnections = [];
87
+ this.selectedConnectionId = null;
88
+ this.updateToolbar();
89
+ return;
90
+ }
91
+ const db = await this.getOrLoadDatabase(engineId);
92
+ if (!db) {
93
+ this.availableConnections = [];
94
+ this.selectedConnectionId = null;
95
+ this.updateToolbar();
96
+ return;
97
+ }
98
+ const infos = await db.listConnections();
99
+ this.availableConnections = infos;
100
+ const currentId = db.currentConnectionId;
101
+ if (currentId !== null) {
102
+ this.selectedConnectionId = currentId;
103
+ this.updateToolbar();
104
+ return;
105
+ }
106
+ const preferred = infos.find((info) => info.isDefault) ?? infos[0];
107
+ this.selectedConnectionId = preferred ? preferred.id : null;
108
+ if (preferred) {
109
+ await db.selectConnection(preferred.id ?? null);
110
+ }
111
+ this.updateToolbar();
112
+ }
113
+ async onEngineChange(e) {
114
+ const select = e.target;
115
+ const value = select?.value ?? "";
116
+ if (this.selectedEngineId === value) return;
117
+ this.selectedEngineId = value || null;
118
+ await this.refreshConnections();
119
+ this.requestUpdate();
120
+ this.updateToolbar();
121
+ }
122
+ async onConnectionChange(e) {
123
+ const select = e.target;
124
+ const value = select?.value ?? "";
125
+ const next = value === "" ? null : value;
126
+ if (this.selectedConnectionId === next) return;
127
+ this.selectedConnectionId = next;
128
+ const engineId = this.selectedEngineId;
129
+ if (!engineId) return;
130
+ const db = await this.getOrLoadDatabase(engineId);
131
+ if (!db) return;
132
+ await db.selectConnection(next);
133
+ this.requestUpdate();
134
+ this.updateToolbar();
135
+ }
136
+ save() {
137
+ const value = this.widgetRef.value?.getContent() ?? "";
138
+ this.input?.data.saveContents(value);
139
+ this.markDirty(false);
140
+ }
141
+ async doClose() {
142
+ if (this.unsubscribeContributionsToken) {
143
+ unsubscribe(this.unsubscribeContributionsToken);
144
+ this.unsubscribeContributionsToken = void 0;
145
+ }
146
+ this.widgetRef.value?.dispose();
147
+ for (const db of this.databases.values()) {
148
+ await db.close();
149
+ }
150
+ this.databases.clear();
151
+ }
152
+ getLanguage() {
153
+ return "sql";
154
+ }
155
+ isLanguage(lang) {
156
+ return lang.toLowerCase() === "sql";
157
+ }
158
+ getContent() {
159
+ return this.widgetRef.value?.getContent() ?? null;
160
+ }
161
+ getSelection() {
162
+ return this.widgetRef.value?.getSelection() ?? null;
163
+ }
164
+ getSnippet(lines = 5) {
165
+ return this.widgetRef.value?.getSnippet(lines) ?? null;
166
+ }
167
+ getFilePath() {
168
+ return this.input?.data?.getWorkspacePath() ?? null;
169
+ }
170
+ async runQuery(useSelectionOnly = false) {
171
+ const sql = useSelectionOnly ? this.getSelection()?.trim() : this.getSelection()?.trim() || this.getContent()?.trim();
172
+ if (!sql) {
173
+ toastError(useSelectionOnly ? "No selection to run" : "No SQL to run");
174
+ return;
175
+ }
176
+ if (this.running) return;
177
+ const engineId = this.selectedEngineId;
178
+ if (!engineId) {
179
+ toastError("No SQL engine available");
180
+ return;
181
+ }
182
+ const db = await this.getOrLoadDatabase(engineId);
183
+ if (!db) {
184
+ toastError("Could not initialize SQL engine");
185
+ return;
186
+ }
187
+ if (!this.selectedConnectionId && this.availableConnections.length) {
188
+ const preferred = this.availableConnections.find(
189
+ (info) => info.isDefault
190
+ ) ?? this.availableConnections[0];
191
+ this.selectedConnectionId = preferred.id;
192
+ await db.selectConnection(preferred.id ?? null);
193
+ }
194
+ this.running = true;
195
+ const label = truncateLabel(sql);
196
+ this.requestUpdate();
197
+ this.updateToolbar();
198
+ const timeoutMs = 6e4;
199
+ const timeoutId = window.setTimeout(() => this.clearRunningState(), timeoutMs);
200
+ try {
201
+ const result = await db.runQuery(sql);
202
+ publish("dataview/publish", {
203
+ title: label,
204
+ data: { columns: result.columns, rows: result.rows },
205
+ source: engineId
206
+ });
207
+ } catch (err) {
208
+ toastError(err instanceof Error ? err.message : String(err));
209
+ } finally {
210
+ window.clearTimeout(timeoutId);
211
+ this.running = false;
212
+ this.requestUpdate();
213
+ this.updateToolbar();
214
+ }
215
+ }
216
+ clearRunningState() {
217
+ if (!this.running) return;
218
+ this.running = false;
219
+ this.requestUpdate();
220
+ this.updateToolbar();
221
+ }
222
+ async createConnection() {
223
+ const engineId = this.selectedEngineId;
224
+ if (!engineId) return;
225
+ const db = await this.getOrLoadDatabase(engineId);
226
+ if (!db || !db.createConnection) return;
227
+ const info = await db.createConnection();
228
+ if (!info) return;
229
+ await this.refreshConnections();
230
+ this.selectedConnectionId = info.id;
231
+ await db.selectConnection(info.id ?? null);
232
+ toastInfo(`Connection "${info.label}" created`);
233
+ this.requestUpdate();
234
+ this.updateToolbar();
235
+ }
236
+ async deleteConnection() {
237
+ const engineId = this.selectedEngineId;
238
+ if (!engineId) return;
239
+ const db = await this.getOrLoadDatabase(engineId);
240
+ if (!db || !db.deleteConnection) return;
241
+ const id = this.selectedConnectionId;
242
+ const connectionLabel = this.availableConnections.find((info) => info.id === id)?.label ?? (id === null ? "In-memory" : id ?? "Current connection");
243
+ const ok = await confirmDialog(`Delete connection "${connectionLabel}"?`);
244
+ if (!ok) return;
245
+ if (id !== null) {
246
+ await db.deleteConnection(id);
247
+ } else {
248
+ await db.selectConnection(null);
249
+ }
250
+ await this.refreshConnections();
251
+ this.requestUpdate();
252
+ this.updateToolbar();
253
+ }
254
+ renderToolbar() {
255
+ const engineValue = this.selectedEngineId ?? "";
256
+ const connectionValue = this.selectedConnectionId ?? "";
257
+ const adapters = this.availableAdapters;
258
+ const hasEngines = adapters.length > 0;
259
+ const hasConnections = this.availableConnections.length > 0;
260
+ return html`
261
+ <wa-select
262
+ class="engine-select"
263
+ size="small"
264
+ .value=${engineValue}
265
+ title="SQL engine"
266
+ @change=${(e) => void this.onEngineChange(e)}
267
+ >
268
+ ${adapters.map(
269
+ (adapter) => html`<wa-option value=${adapter.id}>${adapter.label}</wa-option>`
270
+ )}
271
+ </wa-select>
272
+ <wa-select
273
+ class="connection-select"
274
+ size="small"
275
+ .value=${connectionValue}
276
+ title="Connection"
277
+ ?disabled=${!hasEngines || !hasConnections}
278
+ @change=${(e) => void this.onConnectionChange(e)}
279
+ >
280
+ ${this.availableConnections.map(
281
+ (info) => html`<wa-option value=${info.id ?? ""}>${info.label}</wa-option>`
282
+ )}
283
+ </wa-select>
284
+ <wa-button
285
+ size="small"
286
+ appearance="plain"
287
+ title="New connection"
288
+ @click=${() => void this.createConnection()}
289
+ >
290
+ <wa-icon name="plus" label="New"></wa-icon>
291
+ </wa-button>
292
+ <wa-button
293
+ size="small"
294
+ appearance="plain"
295
+ title="Delete connection"
296
+ @click=${() => void this.deleteConnection()}
297
+ >
298
+ <wa-icon name="trash" label="Delete"></wa-icon>
299
+ </wa-button>
300
+ <wa-button
301
+ size="small"
302
+ appearance="plain"
303
+ ?disabled=${this.running}
304
+ @click=${() => void this.runQuery(true)}
305
+ title="Run selection only"
306
+ >
307
+ <wa-icon name="i-cursor" label="Run selection"></wa-icon>
308
+ ${this.running ? "Running…" : "Run selection"}
309
+ </wa-button>
310
+ <wa-button
311
+ size="small"
312
+ appearance="plain"
313
+ ?disabled=${this.running}
314
+ @click=${() => void this.runQuery(false)}
315
+ title="Run all SQL"
316
+ >
317
+ <wa-icon name="play" label="Run"></wa-icon>
318
+ ${this.running ? "Running…" : "Run all"}
319
+ </wa-button>
320
+ `;
321
+ }
322
+ render() {
323
+ if (this.initialContent === void 0) {
324
+ return html`<div class="editor-placeholder"></div>`;
325
+ }
326
+ return html`
327
+ <div class="editor-area">
328
+ <lyra-monaco-widget
329
+ .value=${this.initialContent}
330
+ .uri=${this.initialUri}
331
+ .language=${"sql"}
332
+ .readOnly=${this.readOnly}
333
+ @content-change=${this._onContentChange}
334
+ ${ref(this.widgetRef)}
335
+ ></lyra-monaco-widget>
336
+ </div>
337
+ `;
338
+ }
339
+ };
340
+ LyraSqlEditor.styles = css`
341
+ :host {
342
+ display: flex;
343
+ flex-direction: column;
344
+ position: relative;
345
+ width: 100%;
346
+ height: 100%;
347
+ }
348
+ .engine-select {
349
+ max-width: 10rem;
350
+ }
351
+ .connection-select {
352
+ max-width: 12rem;
353
+ }
354
+ .editor-area {
355
+ flex: 1;
356
+ min-height: 0;
357
+ height: 100%;
358
+ display: flex;
359
+ flex-direction: column;
360
+ overflow: hidden;
361
+ }
362
+ .editor-area lyra-monaco-widget,
363
+ .editor-area monaco-widget {
364
+ flex: 1;
365
+ min-height: 0;
366
+ }
367
+ .editor-placeholder {
368
+ flex: 1;
369
+ min-height: 0;
370
+ }
371
+ `;
372
+ __decorateClass([
373
+ property({ attribute: false })
374
+ ], LyraSqlEditor.prototype, "input", 2);
375
+ __decorateClass([
376
+ property({ type: Boolean })
377
+ ], LyraSqlEditor.prototype, "readOnly", 2);
378
+ __decorateClass([
379
+ state()
380
+ ], LyraSqlEditor.prototype, "initialContent", 2);
381
+ __decorateClass([
382
+ state()
383
+ ], LyraSqlEditor.prototype, "initialUri", 2);
384
+ __decorateClass([
385
+ state()
386
+ ], LyraSqlEditor.prototype, "running", 2);
387
+ __decorateClass([
388
+ state()
389
+ ], LyraSqlEditor.prototype, "availableAdapters", 2);
390
+ __decorateClass([
391
+ state()
392
+ ], LyraSqlEditor.prototype, "selectedEngineId", 2);
393
+ __decorateClass([
394
+ state()
395
+ ], LyraSqlEditor.prototype, "availableConnections", 2);
396
+ __decorateClass([
397
+ state()
398
+ ], LyraSqlEditor.prototype, "selectedConnectionId", 2);
399
+ LyraSqlEditor = __decorateClass([
400
+ customElement("lyra-sql-editor")
401
+ ], LyraSqlEditor);
402
+ function activate() {
403
+ editorRegistry.registerEditorInputHandler({
404
+ editorId: "system.sqleditor",
405
+ label: "SQL Editor",
406
+ icon: "database",
407
+ canHandle: (input) => input instanceof File && input.getName().toLowerCase().endsWith(".sql"),
408
+ ranking: 900,
409
+ handle: async (input) => {
410
+ const editorInput = {
411
+ title: input.getName(),
412
+ data: input,
413
+ key: input.getName(),
414
+ icon: "database",
415
+ noOverflow: false,
416
+ state: {},
417
+ component: () => null
418
+ };
419
+ editorInput.component = () => html$1`<lyra-sql-editor .input=${editorInput}></lyra-sql-editor>`;
420
+ return editorInput;
421
+ }
422
+ });
423
+ }
424
+ export {
425
+ activate as default
426
+ };
427
+ //# sourceMappingURL=sqleditor-extension-DQrJIYDT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqleditor-extension-DQrJIYDT.js","sources":["../src/sql-editor.ts","../src/sqleditor-extension.ts"],"sourcesContent":["import { customElement, property, state } from 'lit/decorators.js';\nimport { LyraPart, type EditorInput, type EditorContentProvider, toastError, toastInfo, confirmDialog, publish, contributionRegistry, subscribe, unsubscribe, TOPIC_CONTRIBUTEIONS_CHANGED } from '@eclipse-lyra/core';\nimport type {\n SqlAdapterContribution,\n SqlConnectionInfo,\n SqlDatabase,\n} from '@eclipse-lyra/extension-sqleditor';\nimport { css, html } from 'lit';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { LyraMonacoWidget } from '@eclipse-lyra/extension-monaco-editor';\n\nconst MAX_TAB_LABEL = 28;\n\nfunction truncateLabel(sql: string): string {\n const oneLine = sql.replace(/\\s+/g, ' ').trim();\n if (oneLine.length <= MAX_TAB_LABEL) return oneLine;\n return `${oneLine.slice(0, MAX_TAB_LABEL)}…`;\n}\n\n@customElement('lyra-sql-editor')\nexport class LyraSqlEditor extends LyraPart implements EditorContentProvider {\n @property({ attribute: false })\n public input?: EditorInput;\n\n @property({ type: Boolean })\n public readOnly = false;\n\n @state()\n private initialContent: string | undefined = undefined;\n\n @state()\n private initialUri: string | undefined = undefined;\n\n @state()\n private running = false;\n\n @state()\n private availableAdapters: SqlAdapterContribution[] = [];\n\n @state()\n private selectedEngineId: string | null = null;\n\n @state()\n private availableConnections: SqlConnectionInfo[] = [];\n\n @state()\n private selectedConnectionId: string | null = null;\n\n private widgetRef = createRef<LyraMonacoWidget>();\n private databases = new Map<string, SqlDatabase>();\n private unsubscribeContributionsToken?: string;\n\n protected async doInitUI() {\n const file = this.input!.data;\n const textContents = await file.getContents();\n this.initialContent = textContents;\n this.initialUri = file.getName();\n this.unsubscribeContributionsToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: { target?: string } | undefined) => {\n if (event?.target === 'system.sqladapters') {\n void this.refreshAdapters();\n }\n });\n\n await this.refreshAdapters();\n this.requestUpdate();\n }\n\n private async refreshAdapters(): Promise<void> {\n const contributions = contributionRegistry.getContributions<SqlAdapterContribution>('system.sqladapters');\n this.availableAdapters = contributions;\n if (!contributions.length) {\n this.selectedEngineId = null;\n this.availableConnections = [];\n this.selectedConnectionId = null;\n this.updateToolbar();\n return;\n }\n if (!this.selectedEngineId) {\n const duckdbAdapter = contributions.find((c) => c.id === 'duckdb');\n this.selectedEngineId = (duckdbAdapter ?? contributions[0]).id;\n }\n await this.refreshConnections();\n this.updateToolbar();\n }\n\n private async getOrLoadDatabase(engineId: string): Promise<SqlDatabase | null> {\n const cached = this.databases.get(engineId);\n if (cached) return cached;\n const adapter = this.availableAdapters.find((c) => c.id === engineId);\n if (!adapter) return null;\n try {\n const database = await adapter.loader();\n this.databases.set(engineId, database);\n return database;\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n return null;\n }\n }\n\n private async refreshConnections(): Promise<void> {\n const engineId = this.selectedEngineId;\n if (!engineId) {\n this.availableConnections = [];\n this.selectedConnectionId = null;\n this.updateToolbar();\n return;\n }\n const db = await this.getOrLoadDatabase(engineId);\n if (!db) {\n this.availableConnections = [];\n this.selectedConnectionId = null;\n this.updateToolbar();\n return;\n }\n const infos = await db.listConnections();\n this.availableConnections = infos;\n const currentId = db.currentConnectionId;\n if (currentId !== null) {\n this.selectedConnectionId = currentId;\n this.updateToolbar();\n return;\n }\n const preferred = infos.find((info: SqlConnectionInfo) => info.isDefault) ?? infos[0];\n this.selectedConnectionId = preferred ? preferred.id : null;\n if (preferred) {\n await db.selectConnection(preferred.id ?? null);\n }\n this.updateToolbar();\n }\n\n private async onEngineChange(e: Event): Promise<void> {\n const select = e.target as { value?: string };\n const value = select?.value ?? '';\n if (this.selectedEngineId === value) return;\n this.selectedEngineId = value || null;\n await this.refreshConnections();\n this.requestUpdate();\n this.updateToolbar();\n }\n\n private async onConnectionChange(e: Event): Promise<void> {\n const select = e.target as { value?: string };\n const value = select?.value ?? '';\n const next = value === '' ? null : value;\n if (this.selectedConnectionId === next) return;\n this.selectedConnectionId = next;\n const engineId = this.selectedEngineId;\n if (!engineId) return;\n const db = await this.getOrLoadDatabase(engineId);\n if (!db) return;\n await db.selectConnection(next);\n this.requestUpdate();\n this.updateToolbar();\n }\n\n private _onContentChange = () => {\n this.markDirty(true);\n };\n\n save(): void {\n const value = this.widgetRef.value?.getContent() ?? '';\n this.input?.data.saveContents(value);\n this.markDirty(false);\n }\n\n protected async doClose() {\n if (this.unsubscribeContributionsToken) {\n unsubscribe(this.unsubscribeContributionsToken);\n this.unsubscribeContributionsToken = undefined;\n }\n this.widgetRef.value?.dispose();\n for (const db of this.databases.values()) {\n await db.close();\n }\n this.databases.clear();\n }\n\n public getLanguage(): string | null {\n return 'sql';\n }\n\n public isLanguage(lang: string): boolean {\n return lang.toLowerCase() === 'sql';\n }\n\n public getContent(): string | null {\n return this.widgetRef.value?.getContent() ?? null;\n }\n\n public getSelection(): string | null {\n return this.widgetRef.value?.getSelection() ?? null;\n }\n\n public getSnippet(lines: number = 5): { snippet: string; cursorLine: number } | null {\n return this.widgetRef.value?.getSnippet(lines) ?? null;\n }\n\n public getFilePath(): string | null {\n return this.input?.data?.getWorkspacePath() ?? null;\n }\n\n private async runQuery(useSelectionOnly = false): Promise<void> {\n const sql = useSelectionOnly\n ? this.getSelection()?.trim()\n : (this.getSelection()?.trim() || this.getContent()?.trim());\n if (!sql) {\n toastError(useSelectionOnly ? 'No selection to run' : 'No SQL to run');\n return;\n }\n if (this.running) return;\n\n const engineId = this.selectedEngineId;\n if (!engineId) {\n toastError('No SQL engine available');\n return;\n }\n\n const db = await this.getOrLoadDatabase(engineId);\n if (!db) {\n toastError('Could not initialize SQL engine');\n return;\n }\n\n if (!this.selectedConnectionId && this.availableConnections.length) {\n const preferred = this.availableConnections.find(\n (info: SqlConnectionInfo) => info.isDefault,\n ) ?? this.availableConnections[0];\n this.selectedConnectionId = preferred.id;\n await db.selectConnection(preferred.id ?? null);\n }\n\n this.running = true;\n const label = truncateLabel(sql);\n this.requestUpdate();\n this.updateToolbar();\n\n const timeoutMs = 60_000;\n const timeoutId = window.setTimeout(() => this.clearRunningState(), timeoutMs);\n\n try {\n const result = await db.runQuery(sql);\n publish('dataview/publish', {\n title: label,\n data: { columns: result.columns, rows: result.rows },\n source: engineId,\n });\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n } finally {\n window.clearTimeout(timeoutId);\n this.running = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private clearRunningState(): void {\n if (!this.running) return;\n this.running = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n\n private async createConnection(): Promise<void> {\n const engineId = this.selectedEngineId;\n if (!engineId) return;\n const db = await this.getOrLoadDatabase(engineId);\n if (!db || !db.createConnection) return;\n const info = await db.createConnection();\n if (!info) return;\n await this.refreshConnections();\n this.selectedConnectionId = info.id;\n await db.selectConnection(info.id ?? null);\n toastInfo(`Connection \"${info.label}\" created`);\n this.requestUpdate();\n this.updateToolbar();\n }\n\n private async deleteConnection(): Promise<void> {\n const engineId = this.selectedEngineId;\n if (!engineId) return;\n const db = await this.getOrLoadDatabase(engineId);\n if (!db || !db.deleteConnection) return;\n const id = this.selectedConnectionId;\n const connectionLabel =\n this.availableConnections.find((info) => info.id === id)?.label ??\n (id === null ? 'In-memory' : id ?? 'Current connection');\n const ok = await confirmDialog(`Delete connection \"${connectionLabel}\"?`);\n if (!ok) return;\n if (id !== null) {\n await db.deleteConnection(id);\n } else {\n await db.selectConnection(null);\n }\n await this.refreshConnections();\n this.requestUpdate();\n this.updateToolbar();\n }\n\n protected renderToolbar() {\n const engineValue = this.selectedEngineId ?? '';\n const connectionValue = this.selectedConnectionId ?? '';\n const adapters = this.availableAdapters;\n const hasEngines = adapters.length > 0;\n const hasConnections = this.availableConnections.length > 0;\n\n return html`\n <wa-select\n class=\"engine-select\"\n size=\"small\"\n .value=${engineValue}\n title=\"SQL engine\"\n @change=${(e: Event) => void this.onEngineChange(e)}\n >\n ${adapters.map(\n (adapter) =>\n html`<wa-option value=${adapter.id}>${adapter.label}</wa-option>`,\n )}\n </wa-select>\n <wa-select\n class=\"connection-select\"\n size=\"small\"\n .value=${connectionValue}\n title=\"Connection\"\n ?disabled=${!hasEngines || !hasConnections}\n @change=${(e: Event) => void this.onConnectionChange(e)}\n >\n ${this.availableConnections.map(\n (info) =>\n html`<wa-option value=${info.id ?? ''}>${info.label}</wa-option>`,\n )}\n </wa-select>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=\"New connection\"\n @click=${() => void this.createConnection()}\n >\n <wa-icon name=\"plus\" label=\"New\"></wa-icon>\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=\"Delete connection\"\n @click=${() => void this.deleteConnection()}\n >\n <wa-icon name=\"trash\" label=\"Delete\"></wa-icon>\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${this.running}\n @click=${() => void this.runQuery(true)}\n title=\"Run selection only\"\n >\n <wa-icon name=\"i-cursor\" label=\"Run selection\"></wa-icon>\n ${this.running ? 'Running…' : 'Run selection'}\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${this.running}\n @click=${() => void this.runQuery(false)}\n title=\"Run all SQL\"\n >\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n ${this.running ? 'Running…' : 'Run all'}\n </wa-button>\n `;\n }\n\n render() {\n if (this.initialContent === undefined) {\n return html`<div class=\"editor-placeholder\"></div>`;\n }\n\n return html`\n <div class=\"editor-area\">\n <lyra-monaco-widget\n .value=${this.initialContent}\n .uri=${this.initialUri}\n .language=${'sql'}\n .readOnly=${this.readOnly}\n @content-change=${this._onContentChange}\n ${ref(this.widgetRef)}\n ></lyra-monaco-widget>\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n height: 100%;\n }\n .engine-select {\n max-width: 10rem;\n }\n .connection-select {\n max-width: 12rem;\n }\n .editor-area {\n flex: 1;\n min-height: 0;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .editor-area lyra-monaco-widget,\n .editor-area monaco-widget {\n flex: 1;\n min-height: 0;\n }\n .editor-placeholder {\n flex: 1;\n min-height: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-sql-editor': LyraSqlEditor;\n }\n}\n\n","import { editorRegistry, File, type EditorInput } from '@eclipse-lyra/core';\nimport { html } from '@eclipse-lyra/core/externals/lit';\nimport './sql-editor';\n\nexport default function activate() {\n editorRegistry.registerEditorInputHandler({\n editorId: 'system.sqleditor',\n label: 'SQL Editor',\n icon: 'database',\n canHandle: (input: unknown) =>\n input instanceof File && input.getName().toLowerCase().endsWith('.sql'),\n ranking: 900,\n handle: async (input: File) => {\n const editorInput: EditorInput = {\n title: input.getName(),\n data: input,\n key: input.getName(),\n icon: 'database',\n noOverflow: false,\n state: {},\n component: () => null as any,\n };\n editorInput.component = () =>\n html`<lyra-sql-editor .input=${editorInput}></lyra-sql-editor>`;\n return editorInput;\n },\n });\n}\n\n"],"names":["html"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export default function activate(): void;
2
+ //# sourceMappingURL=sqleditor-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqleditor-extension.d.ts","sourceRoot":"","sources":["../src/sqleditor-extension.ts"],"names":[],"mappings":"AAEA,OAAO,cAAc,CAAC;AAEtB,MAAM,CAAC,OAAO,UAAU,QAAQ,SAuB/B"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@eclipse-lyra/extension-sqleditor",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "vite build"
19
+ },
20
+ "dependencies": {
21
+ "@eclipse-lyra/core": "*",
22
+ "@eclipse-lyra/extension-monaco-editor": "*"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.9.3",
26
+ "vite": "^7.1.12",
27
+ "vite-plugin-dts": "^4.5.4"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/eclipse-lyra/core"
32
+ }
33
+ }
34
+