@eclipse-lyra/extension-sqleditor 0.7.52 → 0.7.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/sql-editor.d.ts +1 -1
- package/dist/sql-editor.d.ts.map +1 -1
- package/dist/{sqleditor-extension-SVHoEOK_.js → sqleditor-extension-BFAaVI-7.js} +3 -20
- package/dist/sqleditor-extension-BFAaVI-7.js.map +1 -0
- package/dist/sqleditor-extension.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/sqleditor-extension-SVHoEOK_.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ extensionRegistry.registerExtension({
|
|
|
5
5
|
id: pkg.name,
|
|
6
6
|
name: "SQL Editor",
|
|
7
7
|
description: "Generic SQL editor with pluggable backends",
|
|
8
|
-
loader: () => import("./sqleditor-extension-
|
|
8
|
+
loader: () => import("./sqleditor-extension-BFAaVI-7.js"),
|
|
9
9
|
icon: "database"
|
|
10
10
|
});
|
|
11
11
|
export {
|
package/dist/sql-editor.d.ts
CHANGED
|
@@ -40,7 +40,7 @@ export declare class LyraSqlEditor extends LyraPart implements EditorContentProv
|
|
|
40
40
|
private getCurrentConnectionLabel;
|
|
41
41
|
private openExtensionManager;
|
|
42
42
|
protected renderToolbar(): import('lit-html').TemplateResult<1>;
|
|
43
|
-
|
|
43
|
+
protected renderContent(): import('lit-html').TemplateResult<1>;
|
|
44
44
|
static styles: import('lit').CSSResult;
|
|
45
45
|
}
|
|
46
46
|
declare global {
|
package/dist/sql-editor.d.ts.map
CHANGED
|
@@ -1 +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,EAA0I,MAAM,oBAAoB,CAAC;AAmBpO,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;
|
|
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,EAA0I,MAAM,oBAAoB,CAAC;AAmBpO,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;YAmBf,iBAAiB;YAmBjB,kBAAkB;YA+BlB,cAAc;YASd,kBAAkB;YAclB,sBAAsB;YAUtB,0BAA0B;YAe1B,oBAAoB;IAqBlC,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;IAsDtB,OAAO,CAAC,iBAAiB;YAMX,gBAAgB;YAchB,gBAAgB;IAoB9B,OAAO,CAAC,yBAAyB;YAQnB,oBAAoB;IAqBlC,SAAS,CAAC,aAAa;IAqIvB,SAAS,CAAC,aAAa;IAmBvB,MAAM,CAAC,MAAM,0BA+BX;CACH;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,aAAa,CAAC;KAClC;CACF"}
|
|
@@ -436,7 +436,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
436
436
|
this.availableConnections = [];
|
|
437
437
|
this.selectedConnectionId = null;
|
|
438
438
|
await this.updateComplete;
|
|
439
|
-
this.updateToolbar();
|
|
440
439
|
return;
|
|
441
440
|
}
|
|
442
441
|
if (!this.selectedEngineId) {
|
|
@@ -446,7 +445,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
446
445
|
this.requestUpdate();
|
|
447
446
|
await this.refreshConnections();
|
|
448
447
|
await this.updateComplete;
|
|
449
|
-
this.updateToolbar();
|
|
450
448
|
}
|
|
451
449
|
async getOrLoadDatabase(engineId) {
|
|
452
450
|
const cached = this.databases.get(engineId);
|
|
@@ -472,7 +470,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
472
470
|
this.availableConnections = [];
|
|
473
471
|
this.selectedConnectionId = null;
|
|
474
472
|
await this.updateComplete;
|
|
475
|
-
this.updateToolbar();
|
|
476
473
|
return;
|
|
477
474
|
}
|
|
478
475
|
const db = await this.getOrLoadDatabase(engineId);
|
|
@@ -480,7 +477,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
480
477
|
this.availableConnections = [];
|
|
481
478
|
this.selectedConnectionId = null;
|
|
482
479
|
await this.updateComplete;
|
|
483
|
-
this.updateToolbar();
|
|
484
480
|
return;
|
|
485
481
|
}
|
|
486
482
|
const infos = await db.listConnections();
|
|
@@ -489,7 +485,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
489
485
|
if (currentId !== null) {
|
|
490
486
|
this.selectedConnectionId = currentId;
|
|
491
487
|
await this.updateComplete;
|
|
492
|
-
this.updateToolbar();
|
|
493
488
|
return;
|
|
494
489
|
}
|
|
495
490
|
const preferred = infos.find((info) => info.isDefault) ?? infos[0];
|
|
@@ -498,7 +493,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
498
493
|
await db.selectConnection(preferred.id ?? null);
|
|
499
494
|
}
|
|
500
495
|
await this.updateComplete;
|
|
501
|
-
this.updateToolbar();
|
|
502
496
|
}
|
|
503
497
|
async onEngineChange(e) {
|
|
504
498
|
const select = e.target;
|
|
@@ -507,7 +501,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
507
501
|
this.selectedEngineId = value || null;
|
|
508
502
|
await this.refreshConnections();
|
|
509
503
|
this.requestUpdate();
|
|
510
|
-
this.updateToolbar();
|
|
511
504
|
}
|
|
512
505
|
async onConnectionChange(e) {
|
|
513
506
|
const select = e.target;
|
|
@@ -521,7 +514,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
521
514
|
if (!db) return;
|
|
522
515
|
await db.selectConnection(next);
|
|
523
516
|
this.requestUpdate();
|
|
524
|
-
this.updateToolbar();
|
|
525
517
|
}
|
|
526
518
|
async onEngineDropdownSelect(e) {
|
|
527
519
|
const value = e.detail?.item?.value ?? "";
|
|
@@ -529,7 +521,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
529
521
|
this.selectedEngineId = value || null;
|
|
530
522
|
await this.refreshConnections();
|
|
531
523
|
this.requestUpdate();
|
|
532
|
-
this.updateToolbar();
|
|
533
524
|
}
|
|
534
525
|
async onConnectionDropdownSelect(e) {
|
|
535
526
|
const value = e.detail?.item?.value ?? "";
|
|
@@ -542,7 +533,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
542
533
|
if (!db) return;
|
|
543
534
|
await db.selectConnection(next);
|
|
544
535
|
this.requestUpdate();
|
|
545
|
-
this.updateToolbar();
|
|
546
536
|
}
|
|
547
537
|
async deleteConnectionById(e, id) {
|
|
548
538
|
e.stopPropagation();
|
|
@@ -561,7 +551,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
561
551
|
}
|
|
562
552
|
await this.refreshConnections();
|
|
563
553
|
this.requestUpdate();
|
|
564
|
-
this.updateToolbar();
|
|
565
554
|
}
|
|
566
555
|
save() {
|
|
567
556
|
const value = this.widgetRef.value?.getContent() ?? "";
|
|
@@ -626,7 +615,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
626
615
|
this.running = true;
|
|
627
616
|
const label = truncateLabel(sql);
|
|
628
617
|
this.requestUpdate();
|
|
629
|
-
this.updateToolbar();
|
|
630
618
|
const timeoutMs = 6e4;
|
|
631
619
|
const timeoutId = window.setTimeout(() => this.clearRunningState(), timeoutMs);
|
|
632
620
|
try {
|
|
@@ -643,14 +631,12 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
643
631
|
window.clearTimeout(timeoutId);
|
|
644
632
|
this.running = false;
|
|
645
633
|
this.requestUpdate();
|
|
646
|
-
this.updateToolbar();
|
|
647
634
|
}
|
|
648
635
|
}
|
|
649
636
|
clearRunningState() {
|
|
650
637
|
if (!this.running) return;
|
|
651
638
|
this.running = false;
|
|
652
639
|
this.requestUpdate();
|
|
653
|
-
this.updateToolbar();
|
|
654
640
|
}
|
|
655
641
|
async createConnection() {
|
|
656
642
|
const engineId = this.selectedEngineId;
|
|
@@ -664,7 +650,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
664
650
|
await db.selectConnection(info.id ?? null);
|
|
665
651
|
toastInfo(`Connection "${info.label}" created`);
|
|
666
652
|
this.requestUpdate();
|
|
667
|
-
this.updateToolbar();
|
|
668
653
|
}
|
|
669
654
|
async deleteConnection() {
|
|
670
655
|
const engineId = this.selectedEngineId;
|
|
@@ -682,7 +667,6 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
682
667
|
}
|
|
683
668
|
await this.refreshConnections();
|
|
684
669
|
this.requestUpdate();
|
|
685
|
-
this.updateToolbar();
|
|
686
670
|
}
|
|
687
671
|
getCurrentConnectionLabel() {
|
|
688
672
|
const id = this.selectedConnectionId;
|
|
@@ -829,7 +813,7 @@ let LyraSqlEditor = class extends LyraPart {
|
|
|
829
813
|
</wa-button>
|
|
830
814
|
`;
|
|
831
815
|
}
|
|
832
|
-
|
|
816
|
+
renderContent() {
|
|
833
817
|
if (this.initialContent === void 0) {
|
|
834
818
|
return html`<div class="editor-placeholder"></div>`;
|
|
835
819
|
}
|
|
@@ -922,11 +906,10 @@ function activate() {
|
|
|
922
906
|
data: input,
|
|
923
907
|
key: input.getWorkspacePath(),
|
|
924
908
|
icon: "database",
|
|
925
|
-
noOverflow: false,
|
|
926
909
|
state: {},
|
|
927
910
|
component: () => null
|
|
928
911
|
};
|
|
929
|
-
editorInput.component = () => html$1`<lyra-sql-editor .input=${editorInput}></lyra-sql-editor>`;
|
|
912
|
+
editorInput.component = (id) => html$1`<lyra-sql-editor id="${id}" .input=${editorInput}></lyra-sql-editor>`;
|
|
930
913
|
return editorInput;
|
|
931
914
|
}
|
|
932
915
|
});
|
|
@@ -934,4 +917,4 @@ function activate() {
|
|
|
934
917
|
export {
|
|
935
918
|
activate as default
|
|
936
919
|
};
|
|
937
|
-
//# sourceMappingURL=sqleditor-extension-
|
|
920
|
+
//# sourceMappingURL=sqleditor-extension-BFAaVI-7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqleditor-extension-BFAaVI-7.js","sources":["../src/sql-extension-manager.ts","../src/sql-editor.ts","../src/sqleditor-extension.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { rootContext, taskService, toastError } from '@eclipse-lyra/core';\nimport type {\n SqlDatabase,\n SqlDatabaseExtensionInfo,\n} from '@eclipse-lyra/extension-sqleditor';\n\nexport interface SqlExtensionManagerOptions {\n db: SqlDatabase | null;\n databaseLabel: string;\n}\n\n@customElement('lyra-sql-extension-manager')\nexport class LyraSqlExtensionManager extends LitElement {\n @property({ type: Boolean })\n open = false;\n\n @property({ attribute: false })\n db: SqlDatabase | null = null;\n\n @property()\n databaseLabel = '';\n\n @state()\n private extensions: SqlDatabaseExtensionInfo[] = [];\n\n @state()\n private loading = false;\n\n @state()\n private updatingId: string | null = null;\n\n @state()\n private error: string | null = null;\n\n @state()\n private filterText = '';\n\n public configure(options: SqlExtensionManagerOptions): void {\n this.db = options.db;\n this.databaseLabel = options.databaseLabel;\n this.extensions = [];\n this.error = null;\n void this.refreshExtensions();\n }\n\n public show(): void {\n if (!this.db || !this.db.listDbExtensions) return;\n this.open = true;\n }\n\n public hide(): void {\n this.open = false;\n }\n\n private async refreshExtensions(): Promise<void> {\n if (!this.db || !this.db.listDbExtensions) {\n this.extensions = [];\n return;\n }\n this.loading = true;\n this.error = null;\n try {\n const result = await taskService.runAsync(\n 'Loading database extensions',\n async () => this.db!.listDbExtensions!(),\n );\n this.extensions = Array.isArray(result) ? result : [];\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.error = msg;\n toastError(msg);\n } finally {\n this.loading = false;\n }\n }\n\n private async enableExtension(ext: SqlDatabaseExtensionInfo): Promise<void> {\n if (!this.db || !this.db.enableDbExtension) return;\n this.updatingId = ext.id;\n this.error = null;\n try {\n await taskService.runAsync(\n `Enabling extension ${ext.label || ext.id}`,\n async () => this.db!.enableDbExtension!(ext.id),\n );\n await this.refreshExtensions();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.error = msg;\n toastError(msg);\n } finally {\n this.updatingId = null;\n }\n }\n\n private async disableExtension(ext: SqlDatabaseExtensionInfo): Promise<void> {\n if (!this.db || !this.db.disableDbExtension) return;\n this.updatingId = ext.id;\n this.error = null;\n try {\n await taskService.runAsync(\n `Disabling extension ${ext.label || ext.id}`,\n async () => this.db!.disableDbExtension!(ext.id),\n );\n await this.refreshExtensions();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.error = msg;\n toastError(msg);\n } finally {\n this.updatingId = null;\n }\n }\n\n private renderExtensionRow(ext: SqlDatabaseExtensionInfo) {\n const installed = Boolean(ext.installed);\n const canDisable = installed && !!this.db?.disableDbExtension;\n const isUpdating = this.updatingId === ext.id;\n\n return html`\n <div class=\"extension-item\">\n <div class=\"extension-main\">\n <div class=\"extension-name\">${ext.label || ext.id}</div>\n ${ext.description\n ? html`<div class=\"extension-desc\">${ext.description}</div>`\n : null}\n </div>\n <div class=\"extension-meta\">\n <span\n class=${installed ? 'badge badge-installed' : 'badge badge-available'}\n >\n ${installed ? 'Installed' : 'Available'}\n </span>\n <div class=\"extension-actions\">\n ${installed\n ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${!canDisable || isUpdating}\n @click=${() => void this.disableExtension(ext)}\n >\n <wa-icon\n name=\"circle-minus\"\n label=\"Disable\"\n ></wa-icon>\n </wa-button>\n `\n : html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${isUpdating}\n @click=${() => void this.enableExtension(ext)}\n >\n <wa-icon\n name=\"plug-circle-plus\"\n label=\"Enable\"\n ></wa-icon>\n </wa-button>\n `}\n </div>\n </div>\n </div>\n `;\n }\n\n render() {\n const hasDb = Boolean(this.db && this.db.listDbExtensions);\n const filter = this.filterText.trim().toLowerCase();\n const filteredExtensions = !filter\n ? this.extensions\n : this.extensions.filter((ext) => {\n const text = `${ext.label ?? ''} ${ext.id} ${\n ext.description ?? ''\n }`.toLowerCase();\n return text.includes(filter);\n });\n const hasItems = filteredExtensions.length > 0;\n\n return html`\n <wa-dialog\n label=\"Database extensions\"\n ?open=${this.open}\n @wa-after-hide=${() => {\n this.open = false;\n this.dispatchEvent(\n new CustomEvent('hide', { bubbles: true, composed: true }),\n );\n }}\n >\n <div class=\"extension-manager\">\n <p class=\"extension-manager-description\">\n Database:\n <strong>${this.databaseLabel || 'Current connection'}</strong>\n </p>\n\n ${!hasDb\n ? html`\n <wa-alert variant=\"warning\" open>\n <wa-icon slot=\"icon\" name=\"triangle-exclamation\"></wa-icon>\n The current SQL engine does not expose any extension information.\n </wa-alert>\n `\n : null}\n\n ${this.error\n ? html`\n <wa-alert\n variant=\"danger\"\n open\n closable\n @wa-after-hide=${() => {\n this.error = null;\n }}\n >\n <wa-icon slot=\"icon\" name=\"circle-exclamation\"></wa-icon>\n ${this.error}\n </wa-alert>\n `\n : null}\n\n <wa-input\n size=\"small\"\n placeholder=\"Filter extensions…\"\n .value=${this.filterText}\n @input=${(event: Event) => {\n const target = event.target as HTMLInputElement | null;\n this.filterText = target?.value ?? '';\n }}\n @wa-clear=${() => {\n this.filterText = '';\n }}\n with-clear\n >\n <wa-icon slot=\"prefix\" name=\"magnifying-glass\"></wa-icon>\n </wa-input>\n\n <div class=\"extension-list\">\n ${this.loading\n ? html`<div class=\"extension-list-empty\">Loading extensions…</div>`\n : !hasItems\n ? html`\n <div class=\"extension-list-empty\">\n No extensions available for this connection.\n </div>\n `\n : repeat(\n filteredExtensions,\n (ext) => ext.id,\n (ext) => this.renderExtensionRow(ext),\n )}\n </div>\n </div>\n <div slot=\"footer\" class=\"extension-manager-footer\">\n <wa-button variant=\"default\" @click=${() => this.hide()}>\n Close\n </wa-button>\n </div>\n </wa-dialog>\n `;\n }\n\n static styles = css`\n :host {\n display: contents;\n }\n\n .extension-manager {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n height: 420px;\n box-sizing: border-box;\n }\n\n .extension-toolbar {\n display: flex;\n justify-content: flex-end;\n }\n\n .extension-manager-description {\n margin: 0;\n font-size: 0.95rem;\n opacity: 0.9;\n }\n\n .extension-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n flex: 1;\n min-height: 0;\n max-height: 100%;\n overflow-y: auto;\n }\n\n .extension-list-empty {\n font-size: 0.9rem;\n opacity: 0.8;\n padding: 0.5rem 0;\n }\n\n .extension-item {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--wa-color-neutral-200, #e5e7eb);\n }\n\n .extension-main {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n min-width: 0;\n }\n\n .extension-name {\n font-weight: 500;\n font-size: 0.95rem;\n }\n\n .extension-desc {\n font-size: 0.85rem;\n opacity: 0.8;\n }\n\n .extension-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 0.35rem;\n }\n\n .extension-actions {\n display: flex;\n gap: 0.25rem;\n }\n\n .badge {\n display: inline-flex;\n align-items: center;\n padding: 0.15rem 0.4rem;\n border-radius: 999px;\n font-size: 0.75rem;\n border: 1px solid var(--wa-color-neutral-200, #e5e7eb);\n }\n\n .badge-installed {\n background-color: var(--wa-color-success-50, #ecfdf3);\n }\n\n .badge-available {\n background-color: var(--wa-color-neutral-50, #f9fafb);\n }\n\n .extension-manager-footer {\n display: flex;\n justify-content: flex-end;\n padding-top: 1rem;\n border-top: 1px solid var(--wa-color-neutral-200, #e5e7eb);\n }\n `;\n}\n\nclass SqlExtensionManagerService {\n private managerInstance: LyraSqlExtensionManager | null = null;\n\n public showExtensionManager(\n options: SqlExtensionManagerOptions,\n ): LyraSqlExtensionManager | null {\n if (!options.db || !options.db.listDbExtensions) {\n toastError('The current SQL engine does not support extensions.');\n return null;\n }\n if (!this.managerInstance) {\n this.managerInstance = document.createElement(\n 'lyra-sql-extension-manager',\n ) as LyraSqlExtensionManager;\n document.body.appendChild(this.managerInstance);\n }\n this.managerInstance.configure(options);\n this.managerInstance.show();\n return this.managerInstance;\n }\n\n public getManager(): LyraSqlExtensionManager | null {\n return this.managerInstance;\n }\n}\n\nexport const sqlExtensionManagerService = new SqlExtensionManagerService();\nrootContext.put('sqlExtensionManagerService', sqlExtensionManagerService);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-sql-extension-manager': LyraSqlExtensionManager;\n }\n}\n\n","import { customElement, property, state } from 'lit/decorators.js';\nimport { LyraPart, type EditorInput, type EditorContentProvider, toastError, toastInfo, confirmDialog, publish, contributionRegistry, subscribe, unsubscribe, TOPIC_CONTRIBUTEIONS_CHANGED, taskService } from '@eclipse-lyra/core';\nimport type {\n SqlAdapterContribution,\n SqlConnectionInfo,\n SqlDatabase,\n} from '@eclipse-lyra/extension-sqleditor';\nimport { sqlExtensionManagerService } from './sql-extension-manager';\nimport { css, html } from 'lit';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { LyraMonacoWidget } from '@eclipse-lyra/extension-monaco-editor/widget';\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.getWorkspacePath();\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 await this.updateComplete;\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 this.requestUpdate();\n await this.refreshConnections();\n await this.updateComplete;\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 label = adapter.label || adapter.id;\n const database = await taskService.runAsync(`Opening ${label} database`, async (progress) => {\n progress.message = `Connecting to ${label}…`;\n return adapter.loader();\n });\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 await this.updateComplete;\n return;\n }\n const db = await this.getOrLoadDatabase(engineId);\n if (!db) {\n this.availableConnections = [];\n this.selectedConnectionId = null;\n await this.updateComplete;\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 await this.updateComplete;\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 await this.updateComplete;\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 }\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 }\n\n private async onEngineDropdownSelect(\n e: CustomEvent<{ item?: { value?: string } }>,\n ): Promise<void> {\n const value = e.detail?.item?.value ?? '';\n if (this.selectedEngineId === value) return;\n this.selectedEngineId = value || null;\n await this.refreshConnections();\n this.requestUpdate();\n }\n\n private async onConnectionDropdownSelect(\n e: CustomEvent<{ item?: { value?: string } }>,\n ): Promise<void> {\n const value = e.detail?.item?.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 }\n\n private async deleteConnectionById(e: Event, id: string | null): Promise<void> {\n e.stopPropagation();\n e.preventDefault();\n const engineId = this.selectedEngineId;\n if (!engineId) return;\n const db = await this.getOrLoadDatabase(engineId);\n if (!db || !db.deleteConnection) return;\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 }\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 selection = this.getSelection()?.trim();\n const content = this.getContent()?.trim();\n const sql = useSelectionOnly ? selection : content;\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\n const timeoutMs = 60_000;\n const timeoutId = window.setTimeout(() => this.clearRunningState(), timeoutMs);\n\n try {\n const result = await db.runQuery(sql);\n const adapter = this.availableAdapters.find((c) => c.id === engineId);\n publish('dataview/publish', {\n title: label,\n data: { columns: result.columns, rows: result.rows },\n source: adapter?.label ?? 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 }\n }\n\n private clearRunningState(): void {\n if (!this.running) return;\n this.running = false;\n this.requestUpdate();\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 }\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 }\n\n private getCurrentConnectionLabel(): string | null {\n const id = this.selectedConnectionId;\n if (id === null) return 'In-memory';\n if (!id) return null;\n const info = this.availableConnections.find((c) => c.id === id);\n return info?.label ?? id;\n }\n\n private async openExtensionManager(): Promise<void> {\n const engineId = this.selectedEngineId;\n if (!engineId) return;\n const db = await this.getOrLoadDatabase(engineId);\n if (!db || !db.listDbExtensions) {\n toastInfo('Extensions are not available for the selected SQL engine.');\n return;\n }\n const adapter =\n this.availableAdapters.find((c) => c.id === engineId) ?? null;\n const engineLabel = adapter?.label ?? engineId;\n const connectionLabel = this.getCurrentConnectionLabel();\n const databaseLabel = connectionLabel\n ? `${engineLabel} – ${connectionLabel}`\n : engineLabel;\n sqlExtensionManagerService.showExtensionManager({\n db,\n databaseLabel,\n });\n }\n\n protected renderToolbar() {\n const adapters = this.availableAdapters;\n const hasEngines = adapters.length > 0;\n const hasConnections = this.availableConnections.length > 0;\n const engineId = this.selectedEngineId;\n const dbForEngine = engineId ? this.databases.get(engineId) : null;\n const supportsExtensions = Boolean(dbForEngine?.listDbExtensions);\n\n return html`\n <wa-dropdown\n class=\"engine-select\"\n placement=\"bottom-start\"\n distance=\"4\"\n size=\"small\"\n @wa-select=${(e: CustomEvent) => void this.onEngineDropdownSelect(e)}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"small\"\n with-caret\n title=\"SQL engine\"\n >\n ${this.selectedEngineId\n ? adapters.find((a) => a.id === this.selectedEngineId)?.label ??\n this.selectedEngineId\n : 'Select engine'}\n </wa-button>\n ${adapters.map(\n (adapter) => html`\n <wa-dropdown-item\n value=${adapter.id}\n type=\"checkbox\"\n ?checked=${adapter.id === this.selectedEngineId}\n >\n ${adapter.label}\n </wa-dropdown-item>\n `,\n )}\n </wa-dropdown>\n <wa-dropdown\n class=\"connection-select\"\n placement=\"bottom-start\"\n distance=\"4\"\n size=\"small\"\n @wa-select=${(e: CustomEvent) =>\n void this.onConnectionDropdownSelect(e)}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"small\"\n with-caret\n title=\"Connection\"\n ?disabled=${!hasEngines || !hasConnections}\n >\n ${this.selectedConnectionId === null\n ? 'In-memory'\n : this.availableConnections.find(\n (c) => c.id === this.selectedConnectionId,\n )?.label ?? 'Select connection'}\n </wa-button>\n ${this.availableConnections.map(\n (info) => html`\n <wa-dropdown-item\n value=${info.id ?? ''}\n type=\"checkbox\"\n ?checked=${info.id === this.selectedConnectionId}\n >\n ${info.label}\n <wa-button\n slot=\"details\"\n appearance=\"plain\"\n size=\"small\"\n title=${info.id === null\n ? 'Reset in-memory connection'\n : 'Delete connection'}\n @click=${(e: Event) => this.deleteConnectionById(e, info.id)}\n >\n <wa-icon\n name=${info.id === null ? 'rotate-right' : 'trash'}\n label=${info.id === null ? 'Reset' : 'Delete'}\n ></wa-icon>\n </wa-button>\n </wa-dropdown-item>\n `,\n )}\n </wa-dropdown>\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 ${supportsExtensions\n ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=\"Manage extensions\"\n ?disabled=${!hasEngines || !hasConnections}\n @click=${() => void this.openExtensionManager()}\n >\n <wa-icon name=\"puzzle-piece\" label=\"Extensions\"></wa-icon>\n Extensions\n </wa-button>\n `\n : null}\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 protected renderContent() {\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.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: 'database',\n state: {},\n component: () => null as any,\n };\n editorInput.component = (id: string) =>\n html`<lyra-sql-editor id=\"${id}\" .input=${editorInput}></lyra-sql-editor>`;\n return editorInput;\n },\n });\n}\n\n"],"names":["__decorateClass","html"],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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,SAsB/B"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqleditor-extension-SVHoEOK_.js","sources":["../src/sql-extension-manager.ts","../src/sql-editor.ts","../src/sqleditor-extension.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { rootContext, taskService, toastError } from '@eclipse-lyra/core';\nimport type {\n SqlDatabase,\n SqlDatabaseExtensionInfo,\n} from '@eclipse-lyra/extension-sqleditor';\n\nexport interface SqlExtensionManagerOptions {\n db: SqlDatabase | null;\n databaseLabel: string;\n}\n\n@customElement('lyra-sql-extension-manager')\nexport class LyraSqlExtensionManager extends LitElement {\n @property({ type: Boolean })\n open = false;\n\n @property({ attribute: false })\n db: SqlDatabase | null = null;\n\n @property()\n databaseLabel = '';\n\n @state()\n private extensions: SqlDatabaseExtensionInfo[] = [];\n\n @state()\n private loading = false;\n\n @state()\n private updatingId: string | null = null;\n\n @state()\n private error: string | null = null;\n\n @state()\n private filterText = '';\n\n public configure(options: SqlExtensionManagerOptions): void {\n this.db = options.db;\n this.databaseLabel = options.databaseLabel;\n this.extensions = [];\n this.error = null;\n void this.refreshExtensions();\n }\n\n public show(): void {\n if (!this.db || !this.db.listDbExtensions) return;\n this.open = true;\n }\n\n public hide(): void {\n this.open = false;\n }\n\n private async refreshExtensions(): Promise<void> {\n if (!this.db || !this.db.listDbExtensions) {\n this.extensions = [];\n return;\n }\n this.loading = true;\n this.error = null;\n try {\n const result = await taskService.runAsync(\n 'Loading database extensions',\n async () => this.db!.listDbExtensions!(),\n );\n this.extensions = Array.isArray(result) ? result : [];\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.error = msg;\n toastError(msg);\n } finally {\n this.loading = false;\n }\n }\n\n private async enableExtension(ext: SqlDatabaseExtensionInfo): Promise<void> {\n if (!this.db || !this.db.enableDbExtension) return;\n this.updatingId = ext.id;\n this.error = null;\n try {\n await taskService.runAsync(\n `Enabling extension ${ext.label || ext.id}`,\n async () => this.db!.enableDbExtension!(ext.id),\n );\n await this.refreshExtensions();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.error = msg;\n toastError(msg);\n } finally {\n this.updatingId = null;\n }\n }\n\n private async disableExtension(ext: SqlDatabaseExtensionInfo): Promise<void> {\n if (!this.db || !this.db.disableDbExtension) return;\n this.updatingId = ext.id;\n this.error = null;\n try {\n await taskService.runAsync(\n `Disabling extension ${ext.label || ext.id}`,\n async () => this.db!.disableDbExtension!(ext.id),\n );\n await this.refreshExtensions();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.error = msg;\n toastError(msg);\n } finally {\n this.updatingId = null;\n }\n }\n\n private renderExtensionRow(ext: SqlDatabaseExtensionInfo) {\n const installed = Boolean(ext.installed);\n const canDisable = installed && !!this.db?.disableDbExtension;\n const isUpdating = this.updatingId === ext.id;\n\n return html`\n <div class=\"extension-item\">\n <div class=\"extension-main\">\n <div class=\"extension-name\">${ext.label || ext.id}</div>\n ${ext.description\n ? html`<div class=\"extension-desc\">${ext.description}</div>`\n : null}\n </div>\n <div class=\"extension-meta\">\n <span\n class=${installed ? 'badge badge-installed' : 'badge badge-available'}\n >\n ${installed ? 'Installed' : 'Available'}\n </span>\n <div class=\"extension-actions\">\n ${installed\n ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${!canDisable || isUpdating}\n @click=${() => void this.disableExtension(ext)}\n >\n <wa-icon\n name=\"circle-minus\"\n label=\"Disable\"\n ></wa-icon>\n </wa-button>\n `\n : html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${isUpdating}\n @click=${() => void this.enableExtension(ext)}\n >\n <wa-icon\n name=\"plug-circle-plus\"\n label=\"Enable\"\n ></wa-icon>\n </wa-button>\n `}\n </div>\n </div>\n </div>\n `;\n }\n\n render() {\n const hasDb = Boolean(this.db && this.db.listDbExtensions);\n const filter = this.filterText.trim().toLowerCase();\n const filteredExtensions = !filter\n ? this.extensions\n : this.extensions.filter((ext) => {\n const text = `${ext.label ?? ''} ${ext.id} ${\n ext.description ?? ''\n }`.toLowerCase();\n return text.includes(filter);\n });\n const hasItems = filteredExtensions.length > 0;\n\n return html`\n <wa-dialog\n label=\"Database extensions\"\n ?open=${this.open}\n @wa-after-hide=${() => {\n this.open = false;\n this.dispatchEvent(\n new CustomEvent('hide', { bubbles: true, composed: true }),\n );\n }}\n >\n <div class=\"extension-manager\">\n <p class=\"extension-manager-description\">\n Database:\n <strong>${this.databaseLabel || 'Current connection'}</strong>\n </p>\n\n ${!hasDb\n ? html`\n <wa-alert variant=\"warning\" open>\n <wa-icon slot=\"icon\" name=\"triangle-exclamation\"></wa-icon>\n The current SQL engine does not expose any extension information.\n </wa-alert>\n `\n : null}\n\n ${this.error\n ? html`\n <wa-alert\n variant=\"danger\"\n open\n closable\n @wa-after-hide=${() => {\n this.error = null;\n }}\n >\n <wa-icon slot=\"icon\" name=\"circle-exclamation\"></wa-icon>\n ${this.error}\n </wa-alert>\n `\n : null}\n\n <wa-input\n size=\"small\"\n placeholder=\"Filter extensions…\"\n .value=${this.filterText}\n @input=${(event: Event) => {\n const target = event.target as HTMLInputElement | null;\n this.filterText = target?.value ?? '';\n }}\n @wa-clear=${() => {\n this.filterText = '';\n }}\n with-clear\n >\n <wa-icon slot=\"prefix\" name=\"magnifying-glass\"></wa-icon>\n </wa-input>\n\n <div class=\"extension-list\">\n ${this.loading\n ? html`<div class=\"extension-list-empty\">Loading extensions…</div>`\n : !hasItems\n ? html`\n <div class=\"extension-list-empty\">\n No extensions available for this connection.\n </div>\n `\n : repeat(\n filteredExtensions,\n (ext) => ext.id,\n (ext) => this.renderExtensionRow(ext),\n )}\n </div>\n </div>\n <div slot=\"footer\" class=\"extension-manager-footer\">\n <wa-button variant=\"default\" @click=${() => this.hide()}>\n Close\n </wa-button>\n </div>\n </wa-dialog>\n `;\n }\n\n static styles = css`\n :host {\n display: contents;\n }\n\n .extension-manager {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n height: 420px;\n box-sizing: border-box;\n }\n\n .extension-toolbar {\n display: flex;\n justify-content: flex-end;\n }\n\n .extension-manager-description {\n margin: 0;\n font-size: 0.95rem;\n opacity: 0.9;\n }\n\n .extension-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n flex: 1;\n min-height: 0;\n max-height: 100%;\n overflow-y: auto;\n }\n\n .extension-list-empty {\n font-size: 0.9rem;\n opacity: 0.8;\n padding: 0.5rem 0;\n }\n\n .extension-item {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--wa-color-neutral-200, #e5e7eb);\n }\n\n .extension-main {\n display: flex;\n flex-direction: column;\n gap: 0.15rem;\n min-width: 0;\n }\n\n .extension-name {\n font-weight: 500;\n font-size: 0.95rem;\n }\n\n .extension-desc {\n font-size: 0.85rem;\n opacity: 0.8;\n }\n\n .extension-meta {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 0.35rem;\n }\n\n .extension-actions {\n display: flex;\n gap: 0.25rem;\n }\n\n .badge {\n display: inline-flex;\n align-items: center;\n padding: 0.15rem 0.4rem;\n border-radius: 999px;\n font-size: 0.75rem;\n border: 1px solid var(--wa-color-neutral-200, #e5e7eb);\n }\n\n .badge-installed {\n background-color: var(--wa-color-success-50, #ecfdf3);\n }\n\n .badge-available {\n background-color: var(--wa-color-neutral-50, #f9fafb);\n }\n\n .extension-manager-footer {\n display: flex;\n justify-content: flex-end;\n padding-top: 1rem;\n border-top: 1px solid var(--wa-color-neutral-200, #e5e7eb);\n }\n `;\n}\n\nclass SqlExtensionManagerService {\n private managerInstance: LyraSqlExtensionManager | null = null;\n\n public showExtensionManager(\n options: SqlExtensionManagerOptions,\n ): LyraSqlExtensionManager | null {\n if (!options.db || !options.db.listDbExtensions) {\n toastError('The current SQL engine does not support extensions.');\n return null;\n }\n if (!this.managerInstance) {\n this.managerInstance = document.createElement(\n 'lyra-sql-extension-manager',\n ) as LyraSqlExtensionManager;\n document.body.appendChild(this.managerInstance);\n }\n this.managerInstance.configure(options);\n this.managerInstance.show();\n return this.managerInstance;\n }\n\n public getManager(): LyraSqlExtensionManager | null {\n return this.managerInstance;\n }\n}\n\nexport const sqlExtensionManagerService = new SqlExtensionManagerService();\nrootContext.put('sqlExtensionManagerService', sqlExtensionManagerService);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-sql-extension-manager': LyraSqlExtensionManager;\n }\n}\n\n","import { customElement, property, state } from 'lit/decorators.js';\nimport { LyraPart, type EditorInput, type EditorContentProvider, toastError, toastInfo, confirmDialog, publish, contributionRegistry, subscribe, unsubscribe, TOPIC_CONTRIBUTEIONS_CHANGED, taskService } from '@eclipse-lyra/core';\nimport type {\n SqlAdapterContribution,\n SqlConnectionInfo,\n SqlDatabase,\n} from '@eclipse-lyra/extension-sqleditor';\nimport { sqlExtensionManagerService } from './sql-extension-manager';\nimport { css, html } from 'lit';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { LyraMonacoWidget } from '@eclipse-lyra/extension-monaco-editor/widget';\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.getWorkspacePath();\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 await this.updateComplete;\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 this.requestUpdate();\n await this.refreshConnections();\n await this.updateComplete;\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 label = adapter.label || adapter.id;\n const database = await taskService.runAsync(`Opening ${label} database`, async (progress) => {\n progress.message = `Connecting to ${label}…`;\n return adapter.loader();\n });\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 await this.updateComplete;\n this.updateToolbar();\n return;\n }\n const db = await this.getOrLoadDatabase(engineId);\n if (!db) {\n this.availableConnections = [];\n this.selectedConnectionId = null;\n await this.updateComplete;\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 await this.updateComplete;\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 await this.updateComplete;\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 async onEngineDropdownSelect(\n e: CustomEvent<{ item?: { value?: string } }>,\n ): Promise<void> {\n const value = e.detail?.item?.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 onConnectionDropdownSelect(\n e: CustomEvent<{ item?: { value?: string } }>,\n ): Promise<void> {\n const value = e.detail?.item?.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 async deleteConnectionById(e: Event, id: string | null): Promise<void> {\n e.stopPropagation();\n e.preventDefault();\n const engineId = this.selectedEngineId;\n if (!engineId) return;\n const db = await this.getOrLoadDatabase(engineId);\n if (!db || !db.deleteConnection) return;\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 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 selection = this.getSelection()?.trim();\n const content = this.getContent()?.trim();\n const sql = useSelectionOnly ? selection : content;\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 const adapter = this.availableAdapters.find((c) => c.id === engineId);\n publish('dataview/publish', {\n title: label,\n data: { columns: result.columns, rows: result.rows },\n source: adapter?.label ?? 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 private getCurrentConnectionLabel(): string | null {\n const id = this.selectedConnectionId;\n if (id === null) return 'In-memory';\n if (!id) return null;\n const info = this.availableConnections.find((c) => c.id === id);\n return info?.label ?? id;\n }\n\n private async openExtensionManager(): Promise<void> {\n const engineId = this.selectedEngineId;\n if (!engineId) return;\n const db = await this.getOrLoadDatabase(engineId);\n if (!db || !db.listDbExtensions) {\n toastInfo('Extensions are not available for the selected SQL engine.');\n return;\n }\n const adapter =\n this.availableAdapters.find((c) => c.id === engineId) ?? null;\n const engineLabel = adapter?.label ?? engineId;\n const connectionLabel = this.getCurrentConnectionLabel();\n const databaseLabel = connectionLabel\n ? `${engineLabel} – ${connectionLabel}`\n : engineLabel;\n sqlExtensionManagerService.showExtensionManager({\n db,\n databaseLabel,\n });\n }\n\n protected renderToolbar() {\n const adapters = this.availableAdapters;\n const hasEngines = adapters.length > 0;\n const hasConnections = this.availableConnections.length > 0;\n const engineId = this.selectedEngineId;\n const dbForEngine = engineId ? this.databases.get(engineId) : null;\n const supportsExtensions = Boolean(dbForEngine?.listDbExtensions);\n\n return html`\n <wa-dropdown\n class=\"engine-select\"\n placement=\"bottom-start\"\n distance=\"4\"\n size=\"small\"\n @wa-select=${(e: CustomEvent) => void this.onEngineDropdownSelect(e)}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"small\"\n with-caret\n title=\"SQL engine\"\n >\n ${this.selectedEngineId\n ? adapters.find((a) => a.id === this.selectedEngineId)?.label ??\n this.selectedEngineId\n : 'Select engine'}\n </wa-button>\n ${adapters.map(\n (adapter) => html`\n <wa-dropdown-item\n value=${adapter.id}\n type=\"checkbox\"\n ?checked=${adapter.id === this.selectedEngineId}\n >\n ${adapter.label}\n </wa-dropdown-item>\n `,\n )}\n </wa-dropdown>\n <wa-dropdown\n class=\"connection-select\"\n placement=\"bottom-start\"\n distance=\"4\"\n size=\"small\"\n @wa-select=${(e: CustomEvent) =>\n void this.onConnectionDropdownSelect(e)}\n >\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n size=\"small\"\n with-caret\n title=\"Connection\"\n ?disabled=${!hasEngines || !hasConnections}\n >\n ${this.selectedConnectionId === null\n ? 'In-memory'\n : this.availableConnections.find(\n (c) => c.id === this.selectedConnectionId,\n )?.label ?? 'Select connection'}\n </wa-button>\n ${this.availableConnections.map(\n (info) => html`\n <wa-dropdown-item\n value=${info.id ?? ''}\n type=\"checkbox\"\n ?checked=${info.id === this.selectedConnectionId}\n >\n ${info.label}\n <wa-button\n slot=\"details\"\n appearance=\"plain\"\n size=\"small\"\n title=${info.id === null\n ? 'Reset in-memory connection'\n : 'Delete connection'}\n @click=${(e: Event) => this.deleteConnectionById(e, info.id)}\n >\n <wa-icon\n name=${info.id === null ? 'rotate-right' : 'trash'}\n label=${info.id === null ? 'Reset' : 'Delete'}\n ></wa-icon>\n </wa-button>\n </wa-dropdown-item>\n `,\n )}\n </wa-dropdown>\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 ${supportsExtensions\n ? html`\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=\"Manage extensions\"\n ?disabled=${!hasEngines || !hasConnections}\n @click=${() => void this.openExtensionManager()}\n >\n <wa-icon name=\"puzzle-piece\" label=\"Extensions\"></wa-icon>\n Extensions\n </wa-button>\n `\n : null}\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.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\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":["__decorateClass","html"],"mappings":"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"}
|