@eclipse-lyra/extension-duckdb 0.7.5 → 0.7.7
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.
|
@@ -521,9 +521,9 @@ function duckdbExtension() {
|
|
|
521
521
|
icon: "database",
|
|
522
522
|
noOverflow: false,
|
|
523
523
|
state: {},
|
|
524
|
-
|
|
524
|
+
component: () => null
|
|
525
525
|
};
|
|
526
|
-
editorInput.
|
|
526
|
+
editorInput.component = () => html`<lyra-duckdb-editor .input=${editorInput}></lyra-duckdb-editor>`;
|
|
527
527
|
return editorInput;
|
|
528
528
|
}
|
|
529
529
|
});
|
|
@@ -531,4 +531,4 @@ function duckdbExtension() {
|
|
|
531
531
|
export {
|
|
532
532
|
duckdbExtension as default
|
|
533
533
|
};
|
|
534
|
-
//# sourceMappingURL=duckdb-extension-
|
|
534
|
+
//# sourceMappingURL=duckdb-extension-BGjVlN0o.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb-extension-CPLOX7pf.js","sources":["../src/duckdb-editor.ts","../src/duckdb-extension.ts"],"sourcesContent":["import { customElement, property, state } from \"lit/decorators.js\";\nimport { LyraPart } from \"@eclipse-lyra/core\";\nimport { css, html } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EditorInput, EditorContentProvider, toastError, toastInfo, promptDialog, confirmDialog, activePartSignal } from \"@eclipse-lyra/core\";\nimport { LyraMonacoWidget } from \"@eclipse-lyra/extension-monaco-editor\";\nimport { duckdbService, duckdbExtensionManagerService, type DuckDBDatabase, type DuckDBQueryResult } from \"./api\";\n\nconst MAX_TAB_LABEL = 28;\nconst DB_NAME_REGEX = /^[a-zA-Z0-9_.-]+$/;\n\ninterface ResultTab {\n id: string;\n label: string;\n sql: string;\n result: DuckDBQueryResult | { error: string };\n}\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-duckdb-editor\")\nexport class LyraDuckDBEditor 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 resultTabs: ResultTab[] = [];\n\n @state()\n private activeResultId: string | null = null;\n\n @state()\n private running = false;\n\n @state()\n private availableDatabases: string[] = [];\n\n @state()\n private selectedDbName: string | null = null;\n\n private widgetRef = createRef<LyraMonacoWidget>();\n private tabGroupRef = createRef<HTMLElement & { active: string }>();\n private tabIdCounter = 0;\n private db: DuckDBDatabase | null = null;\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.watch(activePartSignal, () => {\n if (activePartSignal.get() === this) this.refreshDatabaseList();\n });\n await this.refreshDatabaseList();\n this.requestUpdate();\n }\n\n private async refreshDatabaseList(): Promise<void> {\n try {\n this.availableDatabases = await duckdbService.listDatabases();\n } catch {\n this.availableDatabases = [];\n }\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 doClose() {\n this.widgetRef.value?.dispose();\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\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 this.running = true;\n const id = `result-${++this.tabIdCounter}`;\n const label = truncateLabel(sql);\n this.resultTabs = [...this.resultTabs, { id, label, sql, result: { columns: [], rows: [] } }];\n this.activeResultId = id;\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 dbName = this.selectedDbName ?? undefined;\n if (!this.db || this.db.name !== (dbName ?? null)) {\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n this.db = await duckdbService.open(dbName);\n }\n const result = await this.db.runQuery(sql);\n this.resultTabs = this.resultTabs.map((t) =>\n t.id === id ? { ...t, result } : t\n );\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n this.resultTabs = this.resultTabs.map((t) =>\n t.id === id ? { ...t, result: { error } } : t\n );\n } finally {\n window.clearTimeout(timeoutId);\n this.running = false;\n this.activeResultId = id;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private clearRunningState(): void {\n if (this.running) {\n this.running = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private closeTab(id: string): void {\n const idx = this.resultTabs.findIndex((t) => t.id === id);\n if (idx < 0) return;\n const next = this.resultTabs.filter((t) => t.id !== id);\n this.resultTabs = next;\n if (this.activeResultId === id) {\n const prevIdx = Math.min(idx, next.length - 1);\n this.activeResultId = next[prevIdx]?.id ?? null;\n }\n this.requestUpdate();\n this.updateToolbar();\n }\n\n private renderResultPanel(tab: ResultTab) {\n if (\"error\" in tab.result) {\n return html`\n <div class=\"result-error\">\n <pre>${tab.result.error}</pre>\n </div>\n `;\n }\n const { columns, rows } = tab.result;\n if (columns.length === 0 && rows.length === 0) {\n return html`<div class=\"result-empty\">Query returned no rows.</div>`;\n }\n return html`\n <div class=\"result-table-wrap\">\n <table class=\"result-table\">\n <thead>\n <tr>\n ${columns.map((col) => html`<th>${col}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${rows.map(\n (row) => html`\n <tr>\n ${row.map((cell) => html`<td>${String(cell ?? \"\")}</td>`)}\n </tr>\n `\n )}\n </tbody>\n </table>\n </div>\n `;\n }\n\n private onDatabaseChange(e: Event) {\n const select = e.target as { value?: string };\n const value = select?.value ?? \"\";\n const next = value === \"\" ? null : value;\n if (this.selectedDbName === next) return;\n this.selectedDbName = next;\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n this.requestUpdate();\n }\n\n private async addNewDatabase(): Promise<void> {\n const raw = await promptDialog(\"New database name\", \"\");\n if (raw == null) return;\n const name = raw.trim();\n if (!name) {\n toastError(\"Name cannot be empty\");\n return;\n }\n if (!DB_NAME_REGEX.test(name)) {\n toastError(\"Name may only contain letters, numbers, and . _ -\");\n return;\n }\n if (this.availableDatabases.includes(name)) {\n toastError(`Database \"${name}\" already exists`);\n return;\n }\n try {\n const newDb = await duckdbService.open(name);\n await newDb.close();\n this.selectedDbName = name;\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n await this.refreshDatabaseList();\n toastInfo(`Database \"${name}\" created`);\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n }\n }\n\n private async deleteSelectedDatabase(): Promise<void> {\n const name = this.selectedDbName;\n const label = name === null ? \"In-memory\" : name;\n const ok = await confirmDialog(`Delete database \"${label}\"?`);\n if (!ok) return;\n if (name === null) {\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n } else {\n try {\n await duckdbService.delete(name);\n if (this.db?.name === name) this.db = null;\n this.selectedDbName = null;\n await this.refreshDatabaseList();\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n return;\n }\n }\n this.requestUpdate();\n this.updateToolbar();\n }\n\n protected renderToolbar() {\n const dbValue = this.selectedDbName ?? \"\";\n return html`\n <wa-select\n class=\"db-select\"\n size=\"small\"\n value=${dbValue}\n title=\"Database (OPFS)\"\n @change=${(e: Event) => this.onDatabaseChange(e)}\n >\n <wa-option value=\"\">In-memory</wa-option>\n ${this.availableDatabases.map(\n (name) => html`<wa-option value=${name}>${name}</wa-option>`\n )}\n </wa-select>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=\"New database\"\n @click=${() => this.addNewDatabase()}\n >\n <wa-icon name=\"plus\" label=\"New\"></wa-icon>\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=${this.selectedDbName === null ? \"Clear in-memory database\" : `Delete database \"${this.selectedDbName}\"`}\n @click=${() => this.deleteSelectedDatabase()}\n >\n <wa-icon name=\"trash\" label=\"Delete\"></wa-icon>\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=\"Manage DuckDB extensions\"\n @click=${() =>\n duckdbExtensionManagerService.showExtensionManager({\n db: this.db,\n databaseLabel: this.selectedDbName === null ? \"In-memory\" : this.selectedDbName,\n })}\n >\n <wa-icon name=\"puzzle-piece\" label=\"Extensions\"></wa-icon>\n Extensions\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${this.running}\n @click=${() => 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=${() => 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 updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n if (changedProperties.has(\"resultTabs\") || changedProperties.has(\"running\")) {\n this.updateToolbar();\n }\n const activeId = this.activeResultId ?? this.resultTabs[0]?.id ?? \"\";\n if (activeId && this.tabGroupRef.value && this.tabGroupRef.value.active !== activeId) {\n this.tabGroupRef.value.active = activeId;\n }\n }\n\n render() {\n if (this.initialContent === undefined) {\n return html`<div class=\"editor-placeholder\"></div>`;\n }\n\n const hasResults = this.resultTabs.length > 0;\n const activeId = this.activeResultId ?? this.resultTabs[0]?.id ?? \"\";\n\n return html`\n <wa-split-panel\n class=\"editor-split\"\n orientation=\"vertical\"\n position=\"60\"\n >\n <div slot=\"start\" 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 <div slot=\"end\" class=\"results-area\">\n ${hasResults\n ? html`\n <wa-tab-group\n class=\"result-tabs\"\n .active=${activeId}\n ${ref(this.tabGroupRef)}\n @wa-tab-show=${(e: CustomEvent<{ name: string }>) => {\n this.activeResultId = e.detail?.name ?? null;\n }}\n >\n ${this.resultTabs.flatMap((tab) => [\n html`<wa-tab panel=\"${tab.id}\">${tab.label}</wa-tab>`,\n html`<wa-button\n slot=\"nav\"\n tabindex=\"-1\"\n appearance=\"plain\"\n size=\"small\"\n class=\"tab-close\"\n title=\"Close tab\"\n @click=${() => this.closeTab(tab.id)}\n >\n <wa-icon name=\"xmark\" label=\"Close\"></wa-icon>\n </wa-button>`,\n html`<wa-tab-panel name=\"${tab.id}\">${this.renderResultPanel(tab)}</wa-tab-panel>`,\n ])}\n </wa-tab-group>\n `\n : html`\n <div class=\"results-empty\">\n Run a query to see results in a new tab.\n </div>\n `}\n </div>\n </wa-split-panel>\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 .db-select {\n max-width: 10rem;\n }\n .editor-split {\n flex: 1;\n min-height: 0;\n height: 100%;\n }\n .editor-area,\n .results-area {\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\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 .result-tabs {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n .result-tabs::part(body) {\n flex: 1;\n min-height: 0;\n overflow: auto;\n }\n .result-tabs .tab-close {\n margin-left: -0.25rem;\n padding: 0.2rem;\n }\n .results-empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--wa-color-neutral-500, #6b7280);\n font-size: 0.875rem;\n }\n .result-table-wrap {\n overflow: auto;\n padding: 0.75rem;\n }\n .result-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8125rem;\n }\n .result-table th,\n .result-table td {\n padding: 0.35rem 0.75rem;\n text-align: left;\n border-bottom: 1px solid var(--wa-color-neutral-200, #e5e7eb);\n }\n .result-table th {\n font-weight: 600;\n background: var(--wa-color-neutral-100, #f3f4f6);\n }\n .result-table tbody tr:hover {\n background: var(--wa-color-neutral-50, #f9fafb);\n }\n .result-error {\n padding: 0.75rem;\n color: var(--wa-color-red-60, #dc2626);\n font-family: ui-monospace, monospace;\n font-size: 0.8125rem;\n }\n .result-error pre {\n margin: 0;\n white-space: pre-wrap;\n }\n .result-empty {\n padding: 0.75rem;\n color: var(--wa-color-neutral-500, #6b7280);\n font-size: 0.875rem;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"lyra-duckdb-editor\": LyraDuckDBEditor;\n }\n}\n","import { rootContext, editorRegistry, File, type EditorInput } from '@eclipse-lyra/core';\nimport { html } from 'lit';\nimport { duckdbService } from './duckdb-service';\nimport './duckdb-editor';\nimport './duckdb-extension-manager';\n\nexport default function () {\n rootContext.put('duckdbService', duckdbService);\n\n editorRegistry.registerEditorInputHandler({\n editorId: 'system.duckdb-editor',\n label: 'DuckDB',\n icon: 'database',\n canHandle: (input: unknown) =>\n input instanceof File && input.getName().toLowerCase().endsWith('.sql'),\n ranking: 1000,\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 widgetFactory: () => null as any,\n };\n editorInput.widgetFactory = () =>\n html`<lyra-duckdb-editor .input=${editorInput}></lyra-duckdb-editor>`;\n return editorInput;\n },\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"duckdb-extension-BGjVlN0o.js","sources":["../src/duckdb-editor.ts","../src/duckdb-extension.ts"],"sourcesContent":["import { customElement, property, state } from \"lit/decorators.js\";\nimport { LyraPart } from \"@eclipse-lyra/core\";\nimport { css, html } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EditorInput, EditorContentProvider, toastError, toastInfo, promptDialog, confirmDialog, activePartSignal } from \"@eclipse-lyra/core\";\nimport { LyraMonacoWidget } from \"@eclipse-lyra/extension-monaco-editor\";\nimport { duckdbService, duckdbExtensionManagerService, type DuckDBDatabase, type DuckDBQueryResult } from \"./api\";\n\nconst MAX_TAB_LABEL = 28;\nconst DB_NAME_REGEX = /^[a-zA-Z0-9_.-]+$/;\n\ninterface ResultTab {\n id: string;\n label: string;\n sql: string;\n result: DuckDBQueryResult | { error: string };\n}\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-duckdb-editor\")\nexport class LyraDuckDBEditor 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 resultTabs: ResultTab[] = [];\n\n @state()\n private activeResultId: string | null = null;\n\n @state()\n private running = false;\n\n @state()\n private availableDatabases: string[] = [];\n\n @state()\n private selectedDbName: string | null = null;\n\n private widgetRef = createRef<LyraMonacoWidget>();\n private tabGroupRef = createRef<HTMLElement & { active: string }>();\n private tabIdCounter = 0;\n private db: DuckDBDatabase | null = null;\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.watch(activePartSignal, () => {\n if (activePartSignal.get() === this) this.refreshDatabaseList();\n });\n await this.refreshDatabaseList();\n this.requestUpdate();\n }\n\n private async refreshDatabaseList(): Promise<void> {\n try {\n this.availableDatabases = await duckdbService.listDatabases();\n } catch {\n this.availableDatabases = [];\n }\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 doClose() {\n this.widgetRef.value?.dispose();\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\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 this.running = true;\n const id = `result-${++this.tabIdCounter}`;\n const label = truncateLabel(sql);\n this.resultTabs = [...this.resultTabs, { id, label, sql, result: { columns: [], rows: [] } }];\n this.activeResultId = id;\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 dbName = this.selectedDbName ?? undefined;\n if (!this.db || this.db.name !== (dbName ?? null)) {\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n this.db = await duckdbService.open(dbName);\n }\n const result = await this.db.runQuery(sql);\n this.resultTabs = this.resultTabs.map((t) =>\n t.id === id ? { ...t, result } : t\n );\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n this.resultTabs = this.resultTabs.map((t) =>\n t.id === id ? { ...t, result: { error } } : t\n );\n } finally {\n window.clearTimeout(timeoutId);\n this.running = false;\n this.activeResultId = id;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private clearRunningState(): void {\n if (this.running) {\n this.running = false;\n this.requestUpdate();\n this.updateToolbar();\n }\n }\n\n private closeTab(id: string): void {\n const idx = this.resultTabs.findIndex((t) => t.id === id);\n if (idx < 0) return;\n const next = this.resultTabs.filter((t) => t.id !== id);\n this.resultTabs = next;\n if (this.activeResultId === id) {\n const prevIdx = Math.min(idx, next.length - 1);\n this.activeResultId = next[prevIdx]?.id ?? null;\n }\n this.requestUpdate();\n this.updateToolbar();\n }\n\n private renderResultPanel(tab: ResultTab) {\n if (\"error\" in tab.result) {\n return html`\n <div class=\"result-error\">\n <pre>${tab.result.error}</pre>\n </div>\n `;\n }\n const { columns, rows } = tab.result;\n if (columns.length === 0 && rows.length === 0) {\n return html`<div class=\"result-empty\">Query returned no rows.</div>`;\n }\n return html`\n <div class=\"result-table-wrap\">\n <table class=\"result-table\">\n <thead>\n <tr>\n ${columns.map((col) => html`<th>${col}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${rows.map(\n (row) => html`\n <tr>\n ${row.map((cell) => html`<td>${String(cell ?? \"\")}</td>`)}\n </tr>\n `\n )}\n </tbody>\n </table>\n </div>\n `;\n }\n\n private onDatabaseChange(e: Event) {\n const select = e.target as { value?: string };\n const value = select?.value ?? \"\";\n const next = value === \"\" ? null : value;\n if (this.selectedDbName === next) return;\n this.selectedDbName = next;\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n this.requestUpdate();\n }\n\n private async addNewDatabase(): Promise<void> {\n const raw = await promptDialog(\"New database name\", \"\");\n if (raw == null) return;\n const name = raw.trim();\n if (!name) {\n toastError(\"Name cannot be empty\");\n return;\n }\n if (!DB_NAME_REGEX.test(name)) {\n toastError(\"Name may only contain letters, numbers, and . _ -\");\n return;\n }\n if (this.availableDatabases.includes(name)) {\n toastError(`Database \"${name}\" already exists`);\n return;\n }\n try {\n const newDb = await duckdbService.open(name);\n await newDb.close();\n this.selectedDbName = name;\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n await this.refreshDatabaseList();\n toastInfo(`Database \"${name}\" created`);\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n }\n }\n\n private async deleteSelectedDatabase(): Promise<void> {\n const name = this.selectedDbName;\n const label = name === null ? \"In-memory\" : name;\n const ok = await confirmDialog(`Delete database \"${label}\"?`);\n if (!ok) return;\n if (name === null) {\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n } else {\n try {\n await duckdbService.delete(name);\n if (this.db?.name === name) this.db = null;\n this.selectedDbName = null;\n await this.refreshDatabaseList();\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n return;\n }\n }\n this.requestUpdate();\n this.updateToolbar();\n }\n\n protected renderToolbar() {\n const dbValue = this.selectedDbName ?? \"\";\n return html`\n <wa-select\n class=\"db-select\"\n size=\"small\"\n value=${dbValue}\n title=\"Database (OPFS)\"\n @change=${(e: Event) => this.onDatabaseChange(e)}\n >\n <wa-option value=\"\">In-memory</wa-option>\n ${this.availableDatabases.map(\n (name) => html`<wa-option value=${name}>${name}</wa-option>`\n )}\n </wa-select>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=\"New database\"\n @click=${() => this.addNewDatabase()}\n >\n <wa-icon name=\"plus\" label=\"New\"></wa-icon>\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=${this.selectedDbName === null ? \"Clear in-memory database\" : `Delete database \"${this.selectedDbName}\"`}\n @click=${() => this.deleteSelectedDatabase()}\n >\n <wa-icon name=\"trash\" label=\"Delete\"></wa-icon>\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n title=\"Manage DuckDB extensions\"\n @click=${() =>\n duckdbExtensionManagerService.showExtensionManager({\n db: this.db,\n databaseLabel: this.selectedDbName === null ? \"In-memory\" : this.selectedDbName,\n })}\n >\n <wa-icon name=\"puzzle-piece\" label=\"Extensions\"></wa-icon>\n Extensions\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${this.running}\n @click=${() => 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=${() => 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 updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n if (changedProperties.has(\"resultTabs\") || changedProperties.has(\"running\")) {\n this.updateToolbar();\n }\n const activeId = this.activeResultId ?? this.resultTabs[0]?.id ?? \"\";\n if (activeId && this.tabGroupRef.value && this.tabGroupRef.value.active !== activeId) {\n this.tabGroupRef.value.active = activeId;\n }\n }\n\n render() {\n if (this.initialContent === undefined) {\n return html`<div class=\"editor-placeholder\"></div>`;\n }\n\n const hasResults = this.resultTabs.length > 0;\n const activeId = this.activeResultId ?? this.resultTabs[0]?.id ?? \"\";\n\n return html`\n <wa-split-panel\n class=\"editor-split\"\n orientation=\"vertical\"\n position=\"60\"\n >\n <div slot=\"start\" 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 <div slot=\"end\" class=\"results-area\">\n ${hasResults\n ? html`\n <wa-tab-group\n class=\"result-tabs\"\n .active=${activeId}\n ${ref(this.tabGroupRef)}\n @wa-tab-show=${(e: CustomEvent<{ name: string }>) => {\n this.activeResultId = e.detail?.name ?? null;\n }}\n >\n ${this.resultTabs.flatMap((tab) => [\n html`<wa-tab panel=\"${tab.id}\">${tab.label}</wa-tab>`,\n html`<wa-button\n slot=\"nav\"\n tabindex=\"-1\"\n appearance=\"plain\"\n size=\"small\"\n class=\"tab-close\"\n title=\"Close tab\"\n @click=${() => this.closeTab(tab.id)}\n >\n <wa-icon name=\"xmark\" label=\"Close\"></wa-icon>\n </wa-button>`,\n html`<wa-tab-panel name=\"${tab.id}\">${this.renderResultPanel(tab)}</wa-tab-panel>`,\n ])}\n </wa-tab-group>\n `\n : html`\n <div class=\"results-empty\">\n Run a query to see results in a new tab.\n </div>\n `}\n </div>\n </wa-split-panel>\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 .db-select {\n max-width: 10rem;\n }\n .editor-split {\n flex: 1;\n min-height: 0;\n height: 100%;\n }\n .editor-area,\n .results-area {\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\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 .result-tabs {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n .result-tabs::part(body) {\n flex: 1;\n min-height: 0;\n overflow: auto;\n }\n .result-tabs .tab-close {\n margin-left: -0.25rem;\n padding: 0.2rem;\n }\n .results-empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--wa-color-neutral-500, #6b7280);\n font-size: 0.875rem;\n }\n .result-table-wrap {\n overflow: auto;\n padding: 0.75rem;\n }\n .result-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8125rem;\n }\n .result-table th,\n .result-table td {\n padding: 0.35rem 0.75rem;\n text-align: left;\n border-bottom: 1px solid var(--wa-color-neutral-200, #e5e7eb);\n }\n .result-table th {\n font-weight: 600;\n background: var(--wa-color-neutral-100, #f3f4f6);\n }\n .result-table tbody tr:hover {\n background: var(--wa-color-neutral-50, #f9fafb);\n }\n .result-error {\n padding: 0.75rem;\n color: var(--wa-color-red-60, #dc2626);\n font-family: ui-monospace, monospace;\n font-size: 0.8125rem;\n }\n .result-error pre {\n margin: 0;\n white-space: pre-wrap;\n }\n .result-empty {\n padding: 0.75rem;\n color: var(--wa-color-neutral-500, #6b7280);\n font-size: 0.875rem;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"lyra-duckdb-editor\": LyraDuckDBEditor;\n }\n}\n","import { rootContext, editorRegistry, File, type EditorInput } from '@eclipse-lyra/core';\nimport { html } from 'lit';\nimport { duckdbService } from './duckdb-service';\nimport './duckdb-editor';\nimport './duckdb-extension-manager';\n\nexport default function () {\n rootContext.put('duckdbService', duckdbService);\n\n editorRegistry.registerEditorInputHandler({\n editorId: 'system.duckdb-editor',\n label: 'DuckDB',\n icon: 'database',\n canHandle: (input: unknown) =>\n input instanceof File && input.getName().toLowerCase().endsWith('.sql'),\n ranking: 1000,\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-duckdb-editor .input=${editorInput}></lyra-duckdb-editor>`;\n return editorInput;\n },\n });\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ extensionRegistry.registerExtension({
|
|
|
14
14
|
id: pkg.name,
|
|
15
15
|
name: t("EXT_DUCKDB_NAME"),
|
|
16
16
|
description: t("EXT_DUCKDB_DESC"),
|
|
17
|
-
loader: () => import("./duckdb-extension-
|
|
17
|
+
loader: () => import("./duckdb-extension-BGjVlN0o.js"),
|
|
18
18
|
icon: "database",
|
|
19
19
|
dependencies: ["@eclipse-lyra/extension-monaco-editor"]
|
|
20
20
|
});
|